class sklearn.ensemble.RandomForestClassifier(n_estimators='100', criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='sqrt', max_leaf_nodes=None, min_impurity_decrease=0.0, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None, cpp_alpha=0.0, max_samples=None)
随机森林是非常具有代表性的Bagging集成算法,它的所有基评估器都是决策树,分类树组成的森林就叫做随机森林分类器,回归树所集成的森林就叫做随机森林回归器。
单个决策树的准确率越高,随机森林的准确率也会越高,因为装袋法是依赖于平均值或者少数服从多数原则来决定集成的结果的。
重要参数
控制基评估器的参数
参数 | 含义 |
---|---|
criterion | 不纯度的衡量指标,有基尼系数和信息熵两种选择 |
max_depth | 树的最大深度,超过最大深度的树枝都会被剪掉 |
min_samples_leaf | 一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生 |
min_samples_split | 一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生 |
max_features | max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,默认值为总特征个数开平方取整 |
min_impurity_decrease | 限制信息增益的大小,信息增益小于设定数值的分枝不会发生 |
n_estimators
n_estimators是森林中树木的数量,即基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators越大,模型的效果往往越好。但是任何模型都有决策边界,n_estimators达到一定程度时,随机森林的精确性往往不再上升或开始浮动。且n_estimators越大,需要的计算量和内存也越大,训练的时间也越长。对于此参数,希望在训练难度和模型效果之间取得平衡。
上代码
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
wine = load_wine()
Xtrain, 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(Xtrain, Ytrain)
rfc = rfc.fit(Xtrain, Ytrain)
# 将预测集导入训练好的模型,获取希望获取的结果(score, y_test)
score_c = clf.score(Xtest, Ytest)
score_r = rfc.score(Xtest, Ytest)
print("Single Tree:{}".format(score_c),
"Random Forest:{}".format(score_r))
# # 显示随机森林中每棵树的信息
# # 每棵树的信息只有random_state不同
# print(rfc.estimators_)
#
# # 获取第一棵树的相关参数信息
# print(rfc.estimators_[0].random_state)
# print(rfc.estimators_[0].max_depth)
# # 获取所有树的random_state信息
# # 由于数据类型的原因只能用for循环获取
# for i in range(len(rfc.estimators_)):
# print(rfc.estimators_[i].random_state)
# 获取每个特征的重要程度
print(rfc.feature_importances_)
为了验证模型的稳定性,可以使用交叉验证来完成
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
rfc = RandomForestClassifier(n_estimators=25)
rfc_s = cross_val_score(rfc, wine.data, wine.target, cv=10) # 十折交叉验证
clf = DecisionTreeClassifier()
clf_s = cross_val_score(clf, wine.data, wine.target, cv=10)
plt.plot(range(1, 11), rfc_s, label="RandomForest")
plt.plot(range(1, 11), clf_s , label="DecisionTree")
plt.legend()
plt.show()
画出随机森林与决策树在十组交叉验证下的效果对比
rf = []
cl = []
for i in range(10):
print(i)
rfc = RandomForestClassifier(n_estimators=25)
rfc_s = cross_val_score(rfc, X, y, cv=10).mean()
rf.append(rfc_s)
clf = DecisionTreeClassifier()
clf_s = cross_val_score(clf, X, y, cv=10).mean()
cl.append(clf_s)
plt.plot(range(1, 11), rf, label='RandomForest')
plt.plot(range(1, 11), cl, label='DecisionTree')
plt.legend()
plt.show()
画出n_estimators的学习曲线,选取最佳的n_estimators取值
superpa = []
for i in range(200):
print(i)
rfc = RandomForestClassifier(n_estimators=i+1, n_jobs=-1)
rfc_s = cross_val_score(rfc, X, y, cv=10).mean()
superpa.append(rfc_s)
# list.index(object) # 对象object在list当中的索引
print(max(superpa), superpa.index(max(superpa))+1)
plt.figure(figsize=[20, 5])
plt.plot(range(1, 201), superpa)
plt.show()
由于随机森林的本质是一种装袋集成算法(bagging),袋装集成算法是对基评估器的预测结果进行平均或多数表决原则来决定集成评估的结果。上述的红酒例子中,建立了25棵树,当且仅当有13棵以上的树判断错误的时候,随机森林才有可能判错。故随机森林会比决策树效果好。
随机森林的random_state参数控制的是生成森林的模式,而非让一个森林中只有一颗树。
bootstrap参数默认True,代表采用这种有放回的随机抽样技术。通常,这个参数不会被我们设置为False.
有放回的随机抽样技术会有这样的问题:一些样本可能在同一个自助集中出现多次,而有的却可能被忽略。一般来说,自主集大约平均会包含63%的原始数据,而有约37%的训练数据被浪费掉,没有参与建模,这些数据被称为袋外数据(out of bag data, oob)。故除了最开始划分好测试集外,这些数据也可被用来作为集成算法的测试集。
即,通常情况来说,使用随机森林时,可以不划分训练集和测试集,只需要用袋外数据来测试模型。如果希望用袋外数据来测试,需要在实例化时将oob_score这个参数调整为True,训练结束后可以用oob_score_查看在袋外数据上测试的结果。
rfc = RandomForestClassifier(n_estimators=25, oob_score=True)
rfc = rfc.fit(X, y)
print(rfc.oob_score_)