一、集成学习的思想
- 集成学习的思路:一个问题(如分类问题),让多种算法参与预测(如下图中的算法都可以解决分类问题),在多个预测结果中,选择出现最多的预测类别做为该样本的最终预测类别;
- 生活中的集成思维:
- 选择电影:10 个人中,如果有8个人觉得这个电影值得看,那么很多人就会跟进这个现象选择看这部电影;
二、scikit-learn 中的集成分类器
- scikit-learn 中封装的集成分类器:VotingClassifier
1)模拟集成学习操作
-
模拟数据集
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets # n_samples=500:表示生成 500 个样本;默认自动生成 100 个样本; X, y = datasets.make_moons(n_samples=500, noise=0.3, random_state=42) from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
- datasets.make_moons(n_samples=500):表示生成 500 个样本;默认自动生成 100 个样本;
-
使用逻辑回归算法分类器
from sklearn.linear_model import LogisticRegression log_clf = LogisticRegression() log_clf.fit(X_train, y_train) log_clf.score(X_test, y_test) # 准确率:0.864
-
使用 SVM 算法分类器
from sklearn.svm import SVC svm_clf = SVC() svm_clf.fit(X_train, y_train) svm_clf.score(X_test, y_test) # 准确率:0.888
-
使用决策树算法分类器
from sklearn.tree import DecisionTreeClassifier dt_clf = DecisionTreeClassifier() dt_clf.fit(X_train, y_train) dt_clf.score(X_test, y_test) # 准确率:0.84
- 对各个算法预测结果投票
y_predict1 = log_clf.predict(X_test) y_predict2 = svm_clf.predict(X_test) y_predict3 = dt_clf.predict(X_test) y_predict = np.array((y_predict1 + y_predict2 + y_predict3) >= 2, dtype=\'int\')
- 投票方式:
- (y_predict1 + y_predict2 + y_predict3) >= 2
- 三种算法的预测结果中,只有当 2 个或 3 个的预测结果为 1 时,最终的预测结果才为 1;
- 查看投票结果的准确率
from sklearn.metrics import accuracy_score accuracy_score(y_test, y_predict) # 准确率:0.896
- 采用集成学习思路得到的准确率比其它 3 中算法得到的准确率高;
二、scikit-learn 中的集成分类器
1)代码
-
from sklearn.ensemble import VotingClassifier # 集成分类器 VotingClassifier 的参数: # 1)estimators=[]:传入需要使用的算法,放在列表中,使用方式类似管道 Pipeline; # 2)voting=\'hard\':表示选择最终预测结果的方式,以出现最多的分类结果作为最终的预测结果; # 正常情况下,需要对所选择的算法进行调参; voting_clf = VotingClassifier(estimators=[ (\'log_clf\', LogisticRegression()), (\'svm_clf\', SVC()), (\'dt_clf\', DecisionTreeClassifier()) ], voting=\'hard\') voting_clf.fit(X_train, y_train) voting_clf.score(X_test, y_test) # 准确率:0.896
- 注意
- 使用方式如以上红色代码;
- 参数 estimators=[ ]:传入需要使用的算法,放在列表中,使用方式类似管道 Pipeline;
- 参数 voting=\'hard\':表示选择最终预测结果的方式,以出现最多的分类结果作为最终的预测结果;
- 正常情况下,需要对所选择的算法进行调参;