随机森林
1.概述
1.1 集成算法概述
集成学习通过在数据上构建多个模型,集成所有模型的建模结果,汇总之后得到一个综合的结果,以此来获取比单个模型更好的回归或分类表现。
多个模型集成成为的模型叫做“集成评估器”,组成集成评估器的每个单个的模型叫做“基评估器”。
1.2 集成算法分类
装袋法(Bagging):装袋法的核心是构建多个相互独立的基评估器,然后对各个基评估器的预测结果进行平均或按照少数服从多数的方式来决定集成评估器的结果,装代法的代表就是随机森林
提升法(Boosting):在提升法中,基评估器是按顺序——构建的,其核心思想是结合弱评估器的力量一次次对难以评估的样本进行预测,从而得到一个强评估器。提升法的代表模型有Adaboost和梯度提升树。
2.随机森林搭建
2.1 随机森林分类器(RandomForestClassifier)
sklearn.ensemble.RandomForestClassifier
(n_estimators=‘10’,criterion=‘gini’,max_depth=None,min_samples_split=2,min_samples_leaf=1,min_features,min_impurity_decrease)
2.1.1 重要参数解读
参数 | 含义 |
---|---|
criterion |
不纯度的衡量指标,有基尼系数和信息熵两种选择 |
max_depth |
数的最大深度,超过最大深度的树枝都会被剪掉 |
min_samples_leaf |
一个节点在分支后的每个子节点都必须包含至少min_samples_leaf 个训练样本,否则就不会被分支 |
min_samples_split |
一个节点必须要包含至少min_samples_split 个训练样本,这个节点才允许被分枝,否则就不会发生 |
max_features |
max_features 随机森林允许单个决策树使用特征的最大数量,超过限制个数的特征都会被舍弃,默认值为总特征个数开平方 |
min_impurity_decrease |
限制信息增益的大小,信息增益小于设定数值的分枝就不会发生 |
2.1.2 搭建随机森林分类器
(1)导入相关的库
%matplotlib inline
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import cross_val_score
from matplotlib.pyplot as plt
(2)导入需要的数据集
wine = load_wine()
wine.data # 查看 wine 的特征值
wine.target # 查看 wine 的标签值
(3)建立决策树和随机森林模型
from sklearn.model_selection import train_test_split
X_train,Xtest,ytrain,ytest = train_test_split(wine.data,wine.target,test_size=0.3)
clf = DecisionTreeClassifier(random_state=0)
rfc = RandomForestClassifier(random_state=0)
clf = clf.fit(X_train,ytrain)
rfc = rfc.fit(X_train,ytrain)
score_c = clf.score(Xtest,ytest)
score_r = rfc.score(Xtest,ytest)
print('Single tree:{}'.format(score_c)
,'Random Forest:{}'.format(score_r))
Single tree:0.9074074074074074 Random Forest:0.9444444444444444
(4)画出随机森林和决策树在一组交叉验证下的效果对比
label = 'RandomForest'
for model in [RandomForestClassifier(n_estimators=25),DecisionTreeClassifier()]:
score = cross_val_score(model,wine.data,wine.target,cv=10)
print('{}:'.format(label)),print(score.mean())
plt.plot(range(1,11),score,label=label)
plt.legend()
label = 'DecisionTree'
RandomForest:
0.9783625730994153
DecisionTree:
0.9058135534915721
(5)画出随机森林和决策树在十组交叉验证下的效果对比
rfc_1 = []
clf_1 = []
for i in range(10):
rfc = RandomForestClassifier(n_estimators=25)
rfc_s = cross_val_score(rfc,wine.data,wine.target,cv=10).mean()
rfc_1.append(rfc_s)
clf = DecisionTreeClassifier()
clf_s = cross_val_score(clf,wine.data,wine.target,cv=10).mean()
clf_1.append(clf_s)
plt.plot(range(1,11),rfc_1,label='Random Forest')
plt.plot(range(1,11),clf_1,label='Decision Tree')
plt.legend()
plt.show()
从4,5两步不难看出,单个决策树的波动轨迹和随机森林在大体上是保持一致的,单个决策树的准确率越高,随机森林的准确率也就越高
(6)n_estimators 的学习曲线
superpa = []
for i in range(1,201):
rfc = RandomForestClassifier(n_estimators=i)
rfc_s = cross_val_score(rfc,wine.data,wine.target,cv=10