集成学习
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 使用更多个模型投票
虽然有很多机器学习算法可以用来投票,但是仍然不够,我们需要更多的模型来进行投票,但是每个模型都必须不同。可以用算法创建多个子模型,每个子模型只用样本数据或特征的一部分来训练,这样训练出来的模型保证了会存在差异性。
取样分为
-
放回取样 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)
-
不放回取样 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
类似神经网络,将多模型计算出来的结果再次进行建模