集成学习

集成学习

Voting Classifier

每个算法的最终预测的结果都不同,评分也不同。那么哪个算法算是最合理呢?集成学习就是统计每个算法预测结果,选择多数算法预测出相同的结果。

scikit-learn

from sklearn.ensemble import VotingClassifier

#estimators要做决策的算法  voting='hard'少数服从多数
voting_clf = VotingClassifier(estimators=[
    ('log_clf', LogisticRegression()), 
    ('svm_clf', SVC()),
    ('dt_clf', DecisionTreeClassifier(random_state=666))],
                             voting='hard')

voting_clf.fit(X_train, y_train)
voting_clf.score(X_test, y_test)

Soft Voting Classifer

和上面集成学习算法类似,但是最终决策不是由少数服从多数来决定。而是由每个算法得出的概率相加除以算法个数得出概率值。

scikit-learn

voting_clf2 = VotingClassifier(estimators=[
    ('log_clf', LogisticRegression()), 
    ('svm_clf', SVC(probability=True)),#SVM算法本身不支持概率,使用probability会间接计算出概率
    ('dt_clf', DecisionTreeClassifier(random_state=666))],
                             voting='soft')

voting_clf2.fit(X_train, y_train)
voting_clf2.score(X_test, y_test)

Bagging 使用更多个模型投票

虽然有很多机器学习算法可以用来投票,但是仍然不够,我们需要更多的模型来进行投票,但是每个模型都必须不同。可以用算法创建多个子模型,每个子模型只用样本数据或特征的一部分来训练,这样训练出来的模型保证了会存在差异性。

取样分为

  1. 放回取样 Bagging

     from sklearn.tree import DecisionTreeClassifier
     from sklearn.ensemble import BaggingClassifier
     # n_estimators 集成几个模型  max_samples每个模型用多少样本训练 bootstrap是否放回样本
     bagging_clf = BaggingClassifier(DecisionTreeClassifier(),
                                n_estimators=500, max_samples=100,
                                bootstrap=True)
     bagging_clf.fit(X_train, y_train)
     bagging_clf.score(X_test, y_test)
    
  2. 不放回取样 Pasting

     from sklearn.tree import DecisionTreeClassifier
     from sklearn.ensemble import BaggingClassifier
     
     bagging_clf = BaggingClassifier(DecisionTreeClassifier(),
                                n_estimators=5000, max_samples=100,
                                bootstrap=True)
     bagging_clf.fit(X_train, y_train)
     bagging_clf.score(X_test, y_test)
    

OOB

使用放回取样时,有可能有一部分会随机获取从来没使用过。这类数据就是OOB,我们可以把这类数据用来做测试数据。

scikit-learn

使用多核,特征随机以及OOB的案例

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
# oob_score 使用OOB  max_features随机特征数,bootstrap_features是否使用随机特征 n_jobs使用核
bagging_clf = BaggingClassifier(DecisionTreeClassifier(),
                               n_estimators=500, max_samples=100,
                               bootstrap=True, oob_score=True,
                               max_features=1, bootstrap_features=True,n_jobs=-1)
bagging_clf.fit(X, y)

bagging_clf.oob_score_

随机森林

使用决策树算法,随机样本和随机特诊生成多个小的模型,构建出随机森林

scikit-learn

from sklearn.ensemble import RandomForestClassifier

rf_clf = RandomForestClassifier(n_estimators=500, oob_score=True,  max_leaf_nodes=16,random_state=666, n_jobs=-1)
rf_clf.fit(X, y)

随机森林拥有决策树和BaggingClassifier的所有参数

Extra-Trees

决策树在节点划分上,使用随机的特征和随机的阈值

scikit-learn

from sklearn.ensemble import ExtraTreesClassifier

et_clf = ExtraTreesClassifier(n_estimators=500, bootstrap=True, oob_score=True, random_state=666, n_jobs=-1)
et_clf.fit(X, y)

et_clf.oob_score_

回归问题

from sklearn.ensemble import BaggingRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import ExtraTreesRegressor

AdaBoosting

将样本数据增加权重进行训练,训练完成后,得出再对训练效果不好的数据增加权重再次进行训练,如此循环。每个模型都在尝试增强(Boosting)整体的效果。

scikit-learn

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier

ada_clf = AdaBoostClassifier(
    DecisionTreeClassifier(max_depth=2), n_estimators=500)
ada_clf.fit(X_train, y_train)

ada_clf.score(X_test, y_test)

Gradient Boosting

训练一个模型m1,产生错误e1,针对e1训练第二个模型m2,产生错误e2。针对e2训练第三个模型m3,产生错误e3,最终结果为m1+m2+m3....

scikit-learn

from sklearn.ensemble import GradientBoostingClassifier

gb_clf = GradientBoostingClassifier(max_depth=2, n_estimators=30)
gb_clf.fit(X_train, y_train)

Boosting解决回归问题

from sklearn.ensemble import AdaBoostRegressor
from sklearn.ensemble import GradientBoostingRegressor

Stacking

类似神经网络,将多模型计算出来的结果再次进行建模

你可能感兴趣的:(集成学习)