集成学习(ensemble learning)是时下非常流行的机器学习算法,它本身不是一个单独的机器学习算法,而是通过在数据上构建多个横型,集成所有模型的建模结果,基本上所有的机器学习领域都可以看到集成学习的身影,在现实中集成学习也有相当大的作用,它可以用来做市场营销模拟的建模,统计客户来源,保留和流失,也可用来预测疾病的风险和病患者的易感性。在现在的各种算法竞赛中,随机森林(入门级别容易上手),梯度提升树(GBDT) , Xgboost等集成算法的身影也随处可见,可见其效果之好,应用之广.
多个模型集成后的模型叫做集成评估器,集成评估器中的每一个模型叫做基评估器,通常来说有三类集成算法:Bagging、Boosting、Stacking
随机森林是Bagging的代表模型, 他所有的基评估器都是决策树。Bagging法中每一个基评估器是平行的,最后的结果采用平均值或者少数服从多数的原则
集成算法会考虑多个评估器的建模结果,汇总之后得到一个综合结果,以此来获取比单个模型更好的回归或分类表现
随机森林在sklearn中ensemble模块下
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import RandomForestRegressor
参数 | 作用 |
---|---|
criterion | 不纯度的衡量指标,有基尼系数和信息增益两种 |
max_depth | 树的最大深度 |
min_samples_leaf | 一个节点分支后,子节点必须最少包含的样本数,如果不能满足条件将不能发生分支 |
min_samples_split | 一个节点如果要发生分支操作,必须要包含的最小样本数,不满足则不能分支 |
max_features | 限制分支时考虑的特征个数 |
min_impurity_decrease | 限制信息增益的减小,信息增益小于限定值时不发生分支 |
通过红酒数据集来测试随机森林模型,并比较随机森林和决策树在这个数据集下的表现。
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score # 交叉检验
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_wine
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
加载数据集并分割训练集测试集
# 加载数据集
wine = load_wine()
X = wine['data']
y = wine['target']
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
建立随机森林分类器模型和分类决策树,比较两个模型在的表现
# 训练随机森林,决策树模型,比较两种模型
# 建立随机森林分类器模型,并获得得分
rfc = RandomForestClassifier(random_state=1)
rfc.fit(X_train, y_train)
r_score = rfc.score(X_test, y_test)
# 建立分类决策树模型,并获得得分
dtc = DecisionTreeClassifier(random_state=1)
dtc.fit(X_train, y_train)
d_score = dtc.score(X_test, y_test)
print("Decision Tree:{}\nRandom Forest: {}".format(d_score, r_score))
# Decision Tree:0.8703703703703703
# Random Forest: 0.9259259259259259
# 多次交叉检验比较两个模型
r_scores = []
d_scores = []
for i in range(10) :
rfc = RandomForestClassifier(n_estimators=25)
# 每一次交叉检验取平均值
r_scores.append(cross_val_score(rfc, X, y, cv=10).mean())
dtc = DecisionTreeClassifier()
d_scores.append(cross_val_score(dtc, X, y, cv=10).mean())
plt.plot(range(1, 11), r_scores, label='Random Forest')
plt.plot(range(1, 11), d_scores, label='Decision Tree')
plt.legend(loc='best')
plt.show()
# 很明显的看到随机森林得分一直保持在0.96以上,比决策树优秀很多
# 随机森林学习曲线
scores = []
for i in range(1, 201) :
rfc = RandomForestClassifier(n_estimators=i, n_jobs=-1)
scores.append(cross_val_score(rfc, X, y, cv=10).mean())
plt.plot(range(1, 201), scores)
plt.show()
print(max(scores), scores.index(max(scores)))
# 当森林中有17课树的时候,取得的结果最好
# 0.9888888888888889 17
随机森林的本质是一种装袋集成算法----Bagging,装袋集成算法是对基评估器的结果进行取平均或这多数表决的原则来决定最终模型的结果的。在上面的例子中,我们的模型中有25棵决策树。在平均或多数表决的原则下,只有13棵以上的决策树预测错误,最终结果才会显示错误。假设单一棵决策树准确率80%,则失误率为0.2.在刚才的模型中有13棵树判错的概率为:
e r r _ p r o b i l i t y = ∑ i = 13 25 C 25 i 0. 2 i ( 1 − 0.2 ) 25 − i = 0.000369 err\_probility = \sum _{i=13} ^{25} C_{25} ^i 0.2 ^i (1-0.2) ^{25-i} = 0.000369 err_probility=i=13∑25C25i0.2i(1−0.2)25−i=0.000369
可以很明显的看出,随机森林的错误率远低于决策树。
# 建立随机森林分类器模型
rfc = RandomForestClassifier(random_state=1)
rfc.fit(X_train, y_train)
rfc.estimators_[0]
# DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
# max_features='auto', max_leaf_nodes=None,
# min_impurity_decrease=0.0, min_impurity_split=None,
# min_samples_leaf=1, min_samples_split=2,
# min_weight_fraction_leaf=0.0, presort=False,
# random_state=1791095845, splitter='best')
rfc.estimators_[0].random_state # 查看单个参数的取值
# 1791095845
# 建立随机森林分类器模型,通过袋外数据来测试模型,测试的数据集不需要分割
rfc = RandomForestClassifier(random_state=1, oob_score=True)
rfc.fit(X, y)
rfc.oob_score_
# 0.9325842696629213
基本上参数与随机森林分类器一致,不同的是criterion的取值,回归器的取值与回归决策树一致,criterion参数取值看(决策树)。
rom sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score # 交叉检验
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
# 导入数据集并划分训练测试集
boston = load_boston()
X = boston['data']
y = boston['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
# 训练随机森林模型
rfr = RandomForestRegressor(n_estimators=25)
rfr.fit(X_train, y_train)
r_score = rfr.score(X_test, y_test)
print("Random Forest : ", r_score)
# 训练决策树模型
dtr = DecisionTreeRegressor()
dtr.fit(X_train, y_train)
d_score = dtr.score(X_test, y_test)
print("Decision Tree : ", d_score)
# Random Forest : 0.815438704699724
# Decision Tree : 0.7151073089920836
# 明显随机森林比决策树优秀
r_scores = []
d_scores = []
for i in range(10) :
rfr = RandomForestRegressor(n_estimators=25)
r_scores.append(cross_val_score(rfr, X, y, cv=10).mean())
dtr = DecisionTreeRegressor()
d_scores.append(cross_val_score(dtr, X, y, cv=10).mean())
plt.plot(range(1, 11), r_scores, label='Random Forest')
plt.plot(range(1, 11), d_scores, label='Decision Tree')
plt.xticks(range(1, 11))
plt.legend(loc='best')
plt.show()