集成学习:
综合各方意见,做出决策
集成学习获得较好泛化性能,一般集成学习会通过重采样获得一定数量的样本,然后训练多个弱学习器(分类精度稍大于50%),采用投票法,即“少数服从多数”原则来选择分类结果,当少数学习器出现错误时,也可以通过多数学习器来纠正结果。
1.Voting 模型-------Voting Classifier、VotingRegressor
使用scikit-learn的集成分类器Voting Classifier构建模型,并进行投票预测,Voting Classifier里面用参数voting来做决策
from sklearn.ensemble import VotingClassifier
voting_clf = VotingClassifier(estimators=[
('log_clf', LogisticRegression()),
('knn_clf', KNeighborsClassifier(n_neighbors=5)),
('dt_clf', DecisionTreeClassifier(random_state=666))],
voting='hard')
voting_clf.fit(X_train, y_train)
voting_clf.score(X_test, y_test) # 计算模型得分
#estimators传入要集成的算法列表,列表的每一项都是一个元组,元组包括两个元素:(estimator名字,estimator实例)
1)voting = ‘hard’:表示最终决策方式为 Hard Voting Classifier:根据少数服从多数来定最终结果;
2)voting = ‘soft’:表示最终决策方式为 Soft Voting Classifier:
• 将所有模型预测样本为某一类别的概率的平均值作为标准,概率最高的对应的类型为最终的预测结果;
• Soft Voting 的决策方式,要求集合的每一个模型都能估计概率;
Voting:虽然有很多机器学习算法,但从投票的角度看,模型数量依然有限,需要创建更多的子模型,集成更多子模型的意见
例子:假如每个子模型的准确率为51%
解释:三个子模型的集成模型,只要有大于等于2个预测准确,说明这个模型就预测准确了,则如下:
通过这种集成学习方法,每一个子模型不需要太高的准确率,而整体就可以得到非常高的准确率,即用多个弱学习器实现强学习器的效果,Bagging模型
2.Bagging模型-----BaggingClassifier、BaggingRegressor
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
#以决策树为基学习器,创建具有100个基学习器的Bagging模型
bagging_clf = BaggingClassifier(DecisionTreeClassifier(random_state=666),
n_estimators=100,
max_samples = 100,
random_state=42,
bootstrap = True,
max_features = 1,
bootstrap_features = True
)
bagging_clf.fit(X_train, y_train)
bagging_clf.score(X_test, y_test)
#设置bootstrap = True,表示有放回取样
#max_features:对特征进行取样的个数;
#max_samples:int或float,可选(默认值= 1.0)从X抽取以训练每个基本估计量的样本数。
#bootstrap_features:对特征是否进行有放回取样
为了让集成学习学习更强,会先设定:子模型之间不能一致,要有差异性
如何让子模型具有差异性?
每个子模型只学习样本数据的一部分
例如:一共有1000个样本;每个子模型只学习100个样本数据
取样max_samples:每个子模型只学习样本数据的一部分
两种取样方式: 1)有放回取样; 2)无放回取样
样本什么时候被放回?-----在构建一个子模型的过程中,样本被抽取后立刻放回
放回取样导致一部分样本很可能没有被取到,平均大约有37%的样本没有被取到,这些数据叫包外数据,Out-Of-Bag(OOB),不用使用测试集,而使用这些包外数据进行模型测试
%%time
bagging_clf = BaggingClassifier(DecisionTreeClassifier(random_state=666),
n_estimators=5000,
max_samples = 100,
random_state=42,
bootstrap = True,
oob_score=True,
n_jobs=1)
#在训练的时候传入所有数据
bagging_clf.fit(X, y)
#设置oob_score = True,表示需要用包外数据进行模型评估,这时候训练样本的时候就直接传入所有数据
Bagging这样的思路极易进行并行化,因为Bagging 的基学习器之间是相互独立,没有依赖关系的,所以可以做并行化,通过设置参数n_jobs来实现并行化。
#设置n_jobs = 1,表示只使用1个内核进行计算
#n_jobs = -1:使用所有的核
随机森林:
1.随机森林
------------RandomForestClassifier、RandomForestRegressor
其实随机森林可表示为:Bagging模型 + 基学习器为决策树时
随机森林是Bagging模型的改进:
普通决策树:会在结点上所有的n个样本特征中选择一个最优的特征进行划分
扩展之处:从结点的特征集合中随机选择一个包含 k个属性的子集,再从这个子集中选择一个最优划分,进一步扩大了基学习器的差异性,提升模型泛化性能
from sklearn.datasets import load_wine
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
wine = load_wine()
X = wine.data
y = wine.target
#设置基学习器决策树数量为100
rdf_clf = RandomForestClassifier(n_estimators = 100,
random_state = 6,
oob_score=True)
rdf_clf.fit(X, y) #训练
rdf_clf.oob_score_ # 计算模型得分
# 在RandomForest里bootstrap是默认是True的,所以不需要手动的去指定
#因为随机森林就是bagging模型的改进,随机森林拥有决策树和BaggingClassifier的所有参数
# 具体改进:普通决策树----会在结点上所有的n个样本特征中选择一个最优的特征进行划分
# 从结点的特征集合中随机选择一个包含 k个属性的子集,再从这个子集中选择一个最优的特征划分
2.ExtraTrees(极限随机树)
也是一个森林,只是比random forest里更随机
随机森林:从结点的特征集合中随机选择一个包含 k个属性的子集,再从这个子集中选择一个最优划分
ExtraTrees:从k个属性的子集中,每个属性上随机选择一个阈值,再选一个最优划分
ExtraTrees相比较随机森林提供额外的随机性,进一步增强模型的泛化能力,加快训练速度
from sklearn.ensemble import ExtraTreesClassifier
et_clf = ExtraTreesClassifier(n_estimators=100,
oob_score=True,
bootstrap=True,
random_state=666)
et_clf.fit(X, y)
et_clf.oob_score_
#设置bootstrap = True,表示有放回取样
# 在ExtraTrees里bootstrap是默认是False的,所以需要手动的去指定