在 RandomForestClassifier()函数的参数中,下列 3 个参数应该仔细调整寻找最优值,因为它们对模型的预测能力有很大影响。
- 增加 max_features 一般能提高每棵树的分类能力,因为在每个节点上有更多的特征可供选择。但同时也会使森林中任意两棵树的相关性增大,导致分类错误率增大,并且增加 max_features 还会降低算法的速度。因此,应当选择一个折中的max_features。
- n_estimators 决定子树的数量,较多的子树可以让模型有更好的性能,但同时会让程序变慢。应该在计算能力允许的范围内选择尽可能高的值,这会使预测结果更好、更稳定。
- min_samples_leaf:叶是决策树的末端节点,较小的叶子使模型更容易捕捉训练数据中的噪声。一般来说,应该偏向于将最小叶子节点数目的设置大于 50,以防止过拟合。也可以尽量尝试多种叶子大小种类,以找到最优的那一个。
# 导入必要的库
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split # 数据分割模块
from sklearn.model_selection import cross_val_score # 交叉验证模块
from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets
X, y = datasets.make_classification(n_samples=1000,n_features=30,
n_informative=15,flip_y=.5, weights=[.1, .9])
X_train,X_test,Y_train,Y_test=train_test_split(X,y,test_size=0.1)
mf_range = range(2, 28)
k_error = [] # 保存预测错误率
for k in mf_range: # 循环,k 取值为 2~27,查看 RF 分类的预测准确率
rf=RandomForestClassifier(n_estimators=29,min_samples_leaf=5,
max_features=k,n_jobs=2)
# cv 参数决定数据集划分比例,这里按照 9:1 的比例来划分训练集和测试集
scores = cross_val_score(rf, X, y, cv=9, scoring='accuracy')
k_error.append(1 - scores.mean()) # 把每次的错误率添加到数组中
# 绘制结果
plt.plot(mf_range, k_error)
plt.xlabel('max_features for RF')
plt.ylabel('Error')
plt.show()