A Comprehensive Guide To Ensemble Learning (With Python Codes) PDF
A Comprehensive Guide To Ensemble Learning (With Python Codes) PDF
HOME
BLOG ARCHIVE
TRAININGS
DISCUSS
DATAHACK
JOBS
o p q x
i LOGIN / REGISTER
CORPORATE
LEARN l
ENGAGE l
COMPETE l
GET HIRED l
COURSES l
CONTACT
2
Introduction
When you want to purchase a new car, will you walk up to the first car
JOIN THE NEXTGEN
shop and purchase one based on the advice of the dealer? It’s highly
DATA SCIENCE
unlikely.
ECOSYSTEM
Download Resource
You would likely browser a few web portals where people have posted
their reviews and compare different car models, checking for their -Get access to free
features and prices. You will also probably ask your friends and courses on Analytics
colleagues for their opinion. In short, you wouldn’t directly reach a Vidhya
conclusion, but will instead make a decision considering the opinions
-Get free downloadable
of other people as well.
resource from Analytics
Vidhya
-Save your articles
-Participate in
hackathons and win
prizes
Join
Join now
now
Table of Contents
diversified since now you have people with different sets of skills. And
as it turns out – this is a better approach to get honest ratings than the
previous cases we saw.
With these examples, you can infer that a diverse group of people are
likely to make better decisions as compared to individuals. Similar is
true for a diverse set of models in comparison to single models. This
diversification in Machine Learning is achieved by a technique called
Ensemble Learning.
RECENT POSTS
Now that you have got a gist of what ensemble learning is – let us look
at the various techniques in ensemble learning along with their 8 Awesome Data Science
implementations. Capstone Projects from
Praxis Business School
APRIL 29, 2019
1. Max Voting
How I Built Animated Plots
2. Averaging in R to Analyze my Fitness
3. Weighted Averaging Data (and you can too!)
APRIL 26, 2019
2.1 Max Voting
DataHack Radio #22:
The max voting method is generally used for classification problems. Exploring Computer Vision
In this technique, multiple models are used to make predictions for and Data Engineering with
each data point. The predictions by each model are considered as a Dat Tran
‘vote’. The predictions which we get from the majority of the models APRIL 25, 2019
are used as the final prediction.
For example, when you asked 5 of your colleagues to rate your movie
(out of 5); we’ll assume three of them rated it as 4 while two of them
gave it a 5. Since the majority gave a rating of 4, the final rating will be
taken as 4. You can consider this as taking the mode of all the
predictions.
5 4 5 4 4 4
Sample Code:
model1 = tree.DecisionTreeClassifier()
model2 = KNeighborsClassifier()
model3= LogisticRegression()
model1.fit(x_train,y_train)
model2.fit(x_train,y_train)
model3.fit(x_train,y_train)
pred1=model1.predict(x_test)
pred2=model2.predict(x_test)
pred3=model3.predict(x_test)
final_pred = np.array([])
for i in range(0,len(x_test)):
], pred3[i]]))
model1 = LogisticRegression(random_state=1)
model2 = tree.DecisionTreeClassifier(random_state=1)
del2)], voting='hard')
model.fit(x_train,y_train)
model.score(x_test,y_test)
2.2 Averaging
Similar to the max voting technique, multiple predictions are made for
each data point in averaging. In this method, we take an average of
predictions from all the models and use it to make the final prediction.
Averaging can be used for making predictions in regression problems
or while calculating probabilities for classification problems.
For example, in the below case, the averaging method would take the
average of all the values.
5 4 5 4 4 4.4
Sample Code:
model1 = tree.DecisionTreeClassifier()
model2 = KNeighborsClassifier()
model3= LogisticRegression()
model1.fit(x_train,y_train)
model2.fit(x_train,y_train)
model3.fit(x_train,y_train)
pred1=model1.predict_proba(x_test)
pred2=model2.predict_proba(x_test)
pred3=model3.predict_proba(x_test)
finalpred=(pred1+pred2+pred3)/3
rating 5 4 5 4 4 4.41
Sample Code:
model1 = tree.DecisionTreeClassifier()
model2 = KNeighborsClassifier()
model3= LogisticRegression()
model1.fit(x_train,y_train)
model2.fit(x_train,y_train)
model3.fit(x_train,y_train)
pred1=model1.predict_proba(x_test)
pred2=model2.predict_proba(x_test)
pred3=model3.predict_proba(x_test)
finalpred=(pred1*0.3+pred2*0.3+pred3*0.4)
Now that we have covered the basic ensemble techniques, let’s move
on to understanding the advanced techniques.
3.1 Stacking
3. The base model (in this case, decision tree) is then fitted on the
whole train dataset.
4. Using this model, predictions are made on the test set.
6. The predictions from the train set are used as features to build a
new model.
Sample code:
def Stacking(model,train,y,test,n_fold):
folds=StratifiedKFold(n_splits=n_fold,random_state=1)
test_pred=np.empty((test.shape[0],1),float)
train_pred=np.empty((0,1),float)
):
x_train,x_val=train.iloc[train_indices],train.iloc[val_i
ndices]
y_train,y_val=y.iloc[train_indices],y.iloc[val_indices]
model.fit(X=x_train,y=y_train)
train_pred=np.append(train_pred,model.predict(x_val))
test_pred=np.append(test_pred,model.predict(test))
return test_pred.reshape(-1,1),train_pred
Now we’ll create two base models – decision tree and knn.
model1 = tree.DecisionTreeClassifier(random_state=1)
=x_train,test=x_test,y=y_train)
train_pred1=pd.DataFrame(train_pred1)
test_pred1=pd.DataFrame(test_pred1)
model2 = KNeighborsClassifier()
test_pred2 ,train_pred2=Stacking(model=model2,n_fold=10,train=
x_train,test=x_test,y=y_train)
train_pred2=pd.DataFrame(train_pred2)
test_pred2=pd.DataFrame(test_pred2)
model = LogisticRegression(random_state=1)
model.fit(df,y_train)
model.score(df_test, y_test)
3.2 Blending
Sample Code:
We’ll build two models, decision tree and knn, on the train set in order
to make predictions on the validation set.
model1 = tree.DecisionTreeClassifier()
model1.fit(x_train, y_train)
val_pred1=model1.predict(x_val)
test_pred1=model1.predict(x_test)
val_pred1=pd.DataFrame(val_pred1)
test_pred1=pd.DataFrame(test_pred1)
model2 = KNeighborsClassifier()
model2.fit(x_train,y_train)
val_pred2=model2.predict(x_val)
test_pred2=model2.predict(x_test)
val_pred2=pd.DataFrame(val_pred2)
test_pred2=pd.DataFrame(test_pred2)
df_val=pd.concat([x_val, val_pred1,val_pred2],axis=1)
df_test=pd.concat([x_test, test_pred1,test_pred2],axis=1)
model = LogisticRegression()
model.fit(df_val,y_val)
model.score(df_test,y_test)
3.3 Bagging
3.4 Boosting
Bagging and Boosting are two of the most commonly used techniques
in machine learning. In this section, we will look at them in detail.
Following are the algorithms we will be focusing on:
Bagging algorithms:
Bagging meta-estimator
Random forest
Boosting algorithms:
AdaBoost
GBM
XGBM
Light GBM
CatBoost
For all the algorithms discussed in this section, we will follow this
procedure:
For this article, I have used the Loan Prediction Problem. You can
download the dataset from here. Please note that a few code lines
(reading the data, splitting into train-test sets, etc.) will be the same
for each algorithm. In order to avoid repetition, I have written the code
for the same below, and further discussed only the code for the
algorithm.
import pandas as pd
import numpy as np
df=pd.read_csv("/home/user/Desktop/train.csv")
df['Gender'].fillna('Male', inplace=True)
Similarly, fill values for all the columns. EDA, missing values and
outlier treatment has been skipped for the purposes of this article. To
understand these topics, you can go through this article: Ultimate
guide for Data Exploration in Python using NumPy, Matplotlib
and Pandas.
=0)
x_train=train.drop('Loan_Status',axis=1)
y_train=train['Loan_Status']
x_test=test.drop('Loan_Status',axis=1)
y_test=test['Loan_Status']
#create dummies
x_train=pd.get_dummies(x_train)
x_test=pd.get_dummies(x_test)
to make predictions. Following are the steps for the bagging meta-
estimator algorithm:
Code:
model = BaggingClassifier(tree.DecisionTreeClassifier(random_s
tate=1))
model.fit(x_train, y_train)
model.score(x_test,y_test)
0.75135135135135134
model = BaggingRegressor(tree.DecisionTreeRegressor(random_sta
te=1))
model.fit(x_train, y_train)
model.score(x_test,y_test)
base_estimator:
It defines the base estimator to fit on random subsets of
the dataset.
When nothing is specified, the base estimator is a decision
tree.
n_estimators:
It is the number of base estimators to be created.
The number of estimators should be carefully tuned as a
large number would take a very long time to run, while a
very small number might not provide the best results.
max_samples:
This parameter controls the size of the subsets.
It is the maximum number of samples to train each base
estimator.
max_features:
Controls the number of features to draw from the whole
dataset.
It defines the maximum number of features required to
train each base estimator.
n_jobs:
The number of jobs to run in parallel.
Set this value equal to the cores in your system.
If -1, the number of jobs is set to the number of cores.
random_state:
It specifies the method of random split. When random
state value is same for two models, the random selection
is same for both models.
This parameter is useful when you want to compare
different models.
To sum up, Random forest randomly selects data points and features,
and builds multiple trees (Forest) .
Code:
model= RandomForestClassifier(random_state=1)
model.fit(x_train, y_train)
model.score(x_test,y_test)
0.77297297297297296
ces_)):
print(i, j)
ApplicantIncome 0.180924483743
CoapplicantIncome 0.135979758733
Credit_History 0.186436670523
Property_Area_Urban 0.0167025290557
Self_Employed_No 0.0165385567137
Self_Employed_Yes 0.0134763695267
model= RandomForestRegressor()
model.fit(x_train, y_train)
model.score(x_test,y_test)
Parameters
n_estimators:
It defines the number of decision trees to be created in a
random forest.
Generally, a higher number makes the predictions
stronger and more stable, but a very large number can
result in higher training time.
criterion:
It defines the function that is to be used for splitting.
The function measures the quality of a split for each
feature and chooses the best split.
max_features :
It defines the maximum number of features allowed for the
split in each decision tree.
Increasing max features usually improve performance but
a very high number can decrease the diversity of each
tree.
max_depth:
Random forest has multiple decision trees. This parameter
defines the maximum depth of the trees.
min_samples_split:
Used to define the minimum number of samples required
in a leaf node before a split is attempted.
If the number of samples is less than the required number,
the node is not split.
min_samples_leaf:
This defines the minimum number of samples required to
be at a leaf node.
Smaller leaf size makes the model more prone to
capturing noise in train data.
max_leaf_nodes:
This parameter specifies the maximum number of leaf
n_jobs:
This indicates the number of jobs to run in parallel.
Set value to -1 if you want it to run on all cores in the
system.
random_state:
This parameter is used to define the random selection.
It is used for comparison between various models.
4.3 AdaBoost
Code:
model = AdaBoostClassifier(random_state=1)
model.fit(x_train, y_train)
model.score(x_test,y_test)
0.81081081081081086
model = AdaBoostRegressor()
model.fit(x_train, y_train)
model.score(x_test,y_test)
Parameters
base_estimators:
It helps to specify the type of base estimator, that is, the
machine learning algorithm to be used as base learner.
n_estimators:
It defines the number of base estimators.
The default value is 10, but you should keep a higher
value to get better performance.
learning_rate:
This parameter controls the contribution of the estimators
in the final combination.
There is a trade-off between learning_rate and
n_estimators.
max_depth:
Defines the maximum depth of the individual estimator.
Tune this parameter for best performance.
n_jobs
Specifies the number of processors it is allowed to use.
Set value to -1 for maximum processors allowed.
random_state :
An integer value to specify the random data split.
A definite value of random_state will always produce same
results if given with same parameters and training data.
Code:
model= GradientBoostingClassifier(learning_rate=0.01,random_st
ate=1)
model.fit(x_train, y_train)
model.score(x_test,y_test)
0.81621621621621621
model= GradientBoostingRegressor()
model.fit(x_train, y_train)
model.score(x_test,y_test)
Parameters
min_samples_split
Defines the minimum number of samples (or observations)
which are required in a node to be considered for splitting.
Used to control over-fitting. Higher values prevent a model
from learning relations which might be highly specific to
the particular sample selected for a tree.
min_samples_leaf
Defines the minimum samples required in a terminal or
leaf node.
Generally, lower values should be chosen for imbalanced
class problems because the regions in which the minority
class will be in the majority will be very small.
min_weight_fraction_leaf
Similar to min_samples_leaf but defined as a fraction of
the total number of observations instead of an integer.
max_depth
The maximum depth of a tree.
Used to control over-fitting as higher depth will allow the
model to learn relations very specific to a particular
sample.
Should be tuned using CV.
max_leaf_nodes
The maximum number of terminal nodes or leaves in a
tree.
Can be defined in place of max_depth. Since binary trees
are created, a depth of ‘n’ would produce a maximum of
2^n leaves.
If this is defined, GBM will ignore max_depth.
max_features
The number of features to consider while searching for the
best split. These will be randomly selected.
As a thumb-rule, the square root of the total number of
features works great but we should check up to 30-40% of
the total number of features.
Higher values can lead to over-fitting but it generally
depends on a case to case scenario.
4.5 XGBoost
1. Regularization:
Standard GBM implementation has no regularisation like
XGBoost.
Thus XGBoost also helps to reduce overfitting.
2. Parallel Processing:
XGBoost implements parallel processing and is faster than
GBM .
XGBoost also supports implementation on Hadoop.
3. High Flexibility:
XGBoost allows users to define custom optimization
objectives and evaluation criteria adding a whole new
dimension to the model.
5. Tree Pruning:
XGBoost makes splits up to the max_depth specified and
then starts pruning the tree backwards and removes splits
beyond which there is no positive gain.
6. Built-in Cross-Validation:
XGBoost allows a user to run a cross-validation at each
iteration of the boosting process and thus it is easy to get
the exact optimum number of boosting iterations in a
single run.
Code:
Since XGBoost takes care of the missing values itself, you do not have
to impute the missing values. You can skip the step for missing value
imputation from the code mentioned above. Follow the remaining
steps as always and then apply xgboost as below.
model=xgb.XGBClassifier(random_state=1,learning_rate=0.01)
model.fit(x_train, y_train)
model.score(x_test,y_test)
0.82702702702702702
model=xgb.XGBRegressor()
model.fit(x_train, y_train)
model.score(x_test,y_test)
Parameters
nthread
This is used for parallel processing and the number of
cores in the system should be entered..
If you wish to run on all cores, do not input this value. The
algorithm will detect it automatically.
eta
Analogous to learning rate in GBM.
Makes the model more robust by shrinking the weights on
each step.
min_child_weight
Defines the minimum sum of weights of all observations
required in a child.
Used to control over-fitting. Higher values prevent a model
from learning relations which might be highly specific to
the particular sample selected for a tree.
max_depth
It is used to define the maximum depth.
Higher depth will allow the model to learn relations very
max_leaf_nodes
The maximum number of terminal nodes or leaves in a
tree.
Can be defined in place of max_depth. Since binary trees
are created, a depth of ‘n’ would produce a maximum of
2^n leaves.
If this is defined, GBM will ignore max_depth.
gamma
A node is split only when the resulting split gives a positive
reduction in the loss function. Gamma specifies the
minimum loss reduction required to make a split.
Makes the algorithm conservative. The values can vary
depending on the loss function and should be tuned.
subsample
Same as the subsample of GBM. Denotes the fraction of
observations to be randomly sampled for each tree.
Lower values make the algorithm more conservative and
prevent overfitting but values that are too small might lead
to under-fitting.
colsample_bytree
It is similar to max_features in GBM.
Denotes the fraction of columns to be randomly sampled
for each tree.
Before discussing how Light GBM works, let’s first understand why we
need this algorithm when we have so many others (like the ones we
have seen above). Light GBM beats all the other algorithms when
the dataset is extremely large. Compared to the other algorithms,
Light GBM takes lesser time to run on a huge dataset.
Code:
train_data=lgb.Dataset(x_train,label=y_train)
#define parameters
params = {'learning_rate':0.001}
y_pred=model.predict(x_test)
for i in range(0,185):
if y_pred[i]>=0.5:
y_pred[i]=1
else:
y_pred[i]=0
0.81621621621621621
train_data=lgb.Dataset(x_train,label=y_train)
params = {'learning_rate':0.001}
rmse=mean_squared_error(y_pred,y_test)**0.5
Parameters
num_iterations:
It defines the number of boosting iterations to be
performed.
num_leaves :
This parameter is used to set the number of leaves to be
formed in a tree.
In case of Light GBM, since splitting takes place leaf-wise
rather than depth-wise, num_leaves must be smaller than
2^(max_depth), otherwise, it may lead to overfitting.
min_data_in_leaf :
A very small value may cause overfitting.
It is also one of the most important parameters in dealing
with overfitting.
max_depth:
It specifies the maximum depth or level up to which a tree
can grow.
A very high value for this parameter can cause overfitting.
bagging_fraction:
It is used to specify the fraction of data to be used for each
iteration.
This parameter is generally used to speed up the training.
max_bin :
Defines the max number of bins that feature values will be
bucketed in.
A smaller value of max_bin can save a lot of time as it
buckets the feature values in discrete bins which is
computationally inexpensive.
4.7 CatBoost
Code:
model=CatBoostClassifier()
[0]
,eval_set=(x_test, y_test))
model.score(x_test,y_test)
0.80540540540540539
model=CatBoostRegressor()
[0]
,eval_set=(x_test, y_test))
model.score(x_test,y_test)
Parameters
loss_function:
iterations:
The maximum number of trees that can be built.
The final number of trees may be less than or equal to this
number.
learning_rate:
Defines the learning rate.
Used for reducing the gradient step.
border_count:
It specifies the number of splits for numerical features.
It is similar to the max_bin parameter.
depth:
Defines the depth of the trees.
random_seed:
This parameter is similar to the ‘random_state’ parameter
we have seen previously.
It is an integer value to define the random seed for
training.
End Notes
This article will have given you a solid understanding of this topic. If
you have any suggestions or questions, do share in the comment
section below. Also, I encourage you to implement these algorithms at
your end and share your results with us!
You can also read this article on Analytics Vidhya's Android APP
Share this:
Like this:
Loading...
Related Articles
30 Top Videos,
Tutorials & Courses
11 most read Machine on Machine Learning
Learning articles from & Artificial Intelligence
Analytics Vidhya in from 2016
2017 How to build December 21, 2016
December 22, 2017 Ensemble Models in In "Machine Learning"
In "Analytics Vidhya" machine learning?
(with code in R)
February 15, 2017
In "Machine Learning"
LEARNING, GBM, LIGHT GBM, MAX VOTING, RANDOM FOREST, STACKING, WEIGHTED
AVERAGING, XGB
Aishwarya Singh
This article is quite old and you might not get a prompt response
from the author. We request you to post this comment on
Analytics Vidhya's Discussion portal to get your queries
resolved
55 COMMENTS
JOAQUIN Reply
June 18, 2018 at 1:07 pm
Really nice article! And just when I needed the most. Could you please
upload the dataset you used? Im having an error regarding the shapes
when implementing the Stacking Ensemble.
Thank you!
Hi Joaquin,
Glad you found this useful. You can download the dataset
from this link.
Hi Suraj,
AHMED Reply
September 5, 2018 at
11:31 pm
AISHW
Reply
SINGH
Septemb
6, 2018
at 11:04
am
Ideally df_test
should have 268
rows.
CHRIS
Reply
PALME
October
11, 2018
at 4:57
pm
Yeah, bad
formatting in the
method. The line
before the return
statement should
be on the same
level as return
statement:
test_pred=np.appe
so it gets run
once, at the
moment it gets
run for each fold.
Also, so set up
the empty array it
should be
test_pred=np.emp
VARSH
Reply
October
26, 2018
at 11:33
pm
Same problem
here. with Pima
Indian Diabetes
dataset
Shape of df_test:
(847, 2)
Shape of y_test:
(77, )
ADITYA Reply
June 18, 2018 at 1:49 pm
Thanks Aditya
Thank you. This is great content. Been following it from the beginning.
2 issues:
For beginners like me, will need a little more detail to follow the full
notebook.
Hi Sanjoy,
The codes for voting and averaging can be used with any
dataset, and hence no particular dataset is attached to that
section. You can try implementing the codes on loan
prediction dataset and if you face any issues do let me
know.
SANJOY Reply
DATTA
June 19, 2018 at 7:15
pm
It changes as we change to
20% – to
511 for train and 143 for
test.
ValueError: Number of
features of the model must
match the input. Model
n_features is 449 and input
n_features is 205.
If I remove Loan_ID as
input, I get model score 1.0.
AISHW
Reply
SINGH
June 19,
2018 at
7:24 pm
Remove the
Loan_ID before
creating
dummies.
Generally ID is
unique for every
data point and
hence should not
be used for
training the data.
After removing
the loan ID, fit the
model on the
remaining
features and test
on the validation
set.
UMAR L U Reply
June 18, 2018 at 7:45 pm
Wonderful article
Thank you
Hi, In section 3.3 bagging at one point you mentioned that “The size of
the subsets is the same as the size of the original set.” when you are
explaining bootstraping and in the next paragraph you are saying “The
size of subsets created for bagging may be less than the original set.”
Please make it clear. Nice Article !!
Hi Abhinav,
MEHARUNNISA Reply
June 24, 2018 at 12:37 am
Hi meharunnisa,
ISHIT Reply
June 29, 2018 at 4:23 pm
Can you please explain how did you calculate the Prediction 2 in
gradient boosting?
Hi Ishit,
AJAY Reply
July 1, 2018 at 12:25 am
Hi Ajay,
RAM Reply
July 2, 2018 at 12:03 pm
Can you please explain how did you calculate the Prediction 2 in
gradient boosting?
For Prediction 1 you use following method
mean age =combine all age / number of person age
Residual 1 = age – mean age
Hi,
Thank you for a very informative article. Just one issue: When fitting
the BaggingRegressor to the training data, I get the following error:
ValueError: could not convert string to float: ‘Y’
Am I correct?
Thanks much
Jorge
Hi Jorge,
HRUSHIKESH Reply
July 16, 2018 at 1:25 pm
Thank you
CHIRANJIT Reply
July 18, 2018 at 12:48 pm
AYMEN Reply
July 22, 2018 at 1:36 pm
A nice article
Hi Aymen,
If you see the code for bagging classifier, you will observe
that we can provide the classifier we wish to use. As an
example, I have used decision tree, you can use random
forest or logistic regression.
MANOJ Reply
August 27, 2018 at 12:16 pm
later in the same function , you are appending the predicted values of
“test” dataset to the already existing “test_pred”.,
1) if “test_pred” is the predictions of the “test” dataset that we pass in
the funciton, they should have same number of rows, but in the way it
was coded, the number of rows will be twice the number of rows of
“test” dataset, since “test_pred” was already initiated with some
random numbers(the empty commad generates) of rows equal to rows
in “test”, and then adding the equal number of additional predictions to
those already existing rows(while appending the predicitons of test),
need some clarification…
ex: in example show, the shape of “test_pred” should be (154,1) since
“test” dataset passed was of shape(154,8)., but the shape the function
“test_pred” the function is returning is twice ie., (308,1)
2) And any particular reason, why “test_pred” was not initiated like
“train_pred” with empty array shape (0,1), instead of shape
(test.shape[0],1) ?
Hi manoj,
Hello Manoj,
I think `test_pred=np.append(test_pred,model.predict(test))`
should be placed outside the for loop.
SHIVA Reply
October 17, 2018 at 5:05 am
Thanks for this awesome post. Do you hav any posts explaining
stacked ensemble of pretrained Deep Learning models with image
inputs? Can you point to any resources otherwise?
Hi Shiva,
ROSA Reply
October 22, 2018 at 7:25 pm
Hey thanks very much for your help. I am trying to run the stacking
method and I got this error AttributeError: ‘numpy.ndarray’ object has
no attribute ‘values’. Can you please explain me why. Pd. I am new on
programming Thanks in advance
Hi,
Thanks a lot!
SADIQ Reply
December 27, 2018 at 7:45 pm
Hi Sadiq,
The dataset you train and the daatset on which you want to
predict should have the same number of features. df should
have 20 features or you will have to drop the remaining 18
features from x_test. Which part of the code in the article (or
uder which section) did you face the error?
SARWOJOWO Reply
January 30, 2019 at 2:02 pm
HUSEYIN Reply
January 2, 2019 at 11:27 am
I have a question:
What do you think about their usage in real life. Although there are
powerful boosting algoritms( like “XGBoost”), do we still need stacking,
blending or voting based learning?
Thank you
Hi,
SHUKRITY SI Reply
January 4, 2019 at 11:20 pm
Hi shukrity, Please check the type of the data you are using.
is it a dataframe?
Nice article. However, I am looking for ensemble for Keras model. Can
you share your knowledge please?
SHUKRITY SI Reply
January 13, 2019 at 4:15 am
Could you share the notebook with me? Or the code so that
I can copy paste and check at my end.
SHAMEER Reply
February 9, 2019 at 2:37 pm
DATA SCIENTISTS
COMPANIES
JOIN OUR
Don't have an account? Sign up here. COMMUNITY :