至于集成学习方法,我们之前学习了很多的基本理论知识,现在我们进入实战环节。
集成学习包含bagging的随机森林,包括boosting的Adaboost,GBDT,Xgboost等。
bagging方式下,单个学习器之间完全没有联系,都是独立的。
Boosting方式下,则是在前一个学习器的基础上进一步优化。
今天我们先来看看最常见的随机森林中的分类树的用法吧
代码如下,我们把单个决策树和随机森林放在一起运行比较。
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split, cross_val_score
import matplotlib.pyplot as plt
# 分类问题举例,加载自带的红酒数据集
wine = load_wine() # 178个数据,13个属性,三个分类种类。
print(wine.data.shape)
print(wine.target.shape)
print(wine.target_names) # 所有类别标签地名称
print(wine.feature_names) # 所有特征属性的名称
# 把红酒数据进行切分,切分成训练集和测试集合,切分比例一般是7:3
data_train, data_test, target_train, target_test = train_test_split(wine.data, wine.target, test_size=0.3)
print(data_train.shape)
print(target_train.shape)
print(data_test.shape)
print(target_test.shape)
# =========================第一组测试:划分训练集和测试集的验证
# 先实例化一颗决策树
clf = DecisionTreeClassifier(criterion='gini', random_state=10)
clf = clf.fit(data_train, target_train)
score = clf.score(data_test, target_test)
print('Signle Tree Score:{}'.format(score))
# 先实例化一个随机森林
tfc = RandomForestClassifier(criterion='gini', random_state=10, n_estimators=10)
tfc = tfc.fit(data_train, target_train)
score = tfc.score(data_test, target_test)
print('Random Forest Score:{}'.format(score)) # 一般性情况下,会比决策树大一些,或者相等.
看到这里,我们看到,代码流程是一样的。很简单就可以用起来了哈。
但是从效果来看呢,我们会发现,经过反复多次运行,发现随机森林的效果似乎要优于单个决策树,大部分情况下都是比决策树要高的。
为了进一步查看,我们使用交叉验证来测试
# ========================第二组测试:进行交叉验证
# 先实例化一颗决策树
clf = DecisionTreeClassifier(criterion='gini', random_state=10)
score_clf = cross_val_score(clf, wine.data, wine.target, cv=10)
print('Signle Tree Mean Score:{}'.format(score_clf.mean()))
# 先实例化一个随机森林
tfc = RandomForestClassifier(criterion='gini', random_state=10, n_estimators=10)
score_rfc = cross_val_score(tfc, wine.data, wine.target, cv=10)
print('Random Forest Mean Score:{}'.format(score_rfc.mean())) # 一般性情况下,会比决策树大一些,或者相等.
# 画图画出来展示下
plt.plot(range(1, 11), score_clf, label="DecisionTree")
plt.plot(range(1, 11), score_rfc, label="RandomForest")
plt.legend() # 显示图例
plt.show()
效果如下:
如果还觉得不够,那么我们继续多次交叉验证,看看平均水平。
# ========================第三组测试:类似地利用学习曲线来选择某个参数,我们不选择参数,进行十次交叉验证看看效果
# 先实例化一个随机森林
scores_clf = []
scores_rfc = []
for i in range(1, 11):
clf = DecisionTreeClassifier(criterion='gini')
score_clf = cross_val_score(clf, wine.data, wine.target, cv=10).mean()
scores_clf.append(score_clf)
rfc = RandomForestClassifier(criterion='gini', n_estimators=10)
score_tfc = cross_val_score(rfc, wine.data, wine.target, cv=10).mean()
scores_rfc.append(score_tfc)
# 画图画出来展示下
plt.plot(range(1, 11), scores_clf, label="DecisionTree")
plt.plot(range(1, 11), scores_rfc, label="RandomForest")
plt.legend() # 显示图例
plt.show()
效果如下:
总体看来,随机森林的在不经过参数调节的情况下,确实在平均水平上是比单个决策树要好的。
接下来我们看一下这个参数
采用学习曲线的方式来选择一个合适的参数
# ========================第四组测试:类似地利用学习曲线来选择某个参数,调节 n_estimators 参数
# 先实例化一个随机森林
scores_rfc = []
for i in range(1, 201):
rfc = RandomForestClassifier(criterion='gini', n_estimators=i)
score_tfc = cross_val_score(rfc, wine.data, wine.target, cv=10).mean()
scores_rfc.append(score_tfc)
# 画图画出来展示下
plt.plot(range(1, 201), scores_rfc, label="RandomForest")
plt.legend() # 显示图例
plt.show()
效果如下:
接着我们看看效果,发现随着学习器个数的增加,一开始效果是提升的,但是到了后面效果提升的效果就有了一个波动,稳定在某个值,因此,我们需要选择一个合适的学习器个数。