随机森林指的是利用多棵树对样本进行训练并预测的一种分类器
随机森林的原理
- 在机器学习中,随机森林是一个包含多个决策树的分类器
- 根据下列算法而建造每棵树:
用N来表示训练用例(样本)的个数,M表示特征数目。
输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M。
从N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。
对于每一个节点,随机选择m个特征,决策树上每个节点的决定都是基于这些特征确定的。根据这m个特征,计算其最佳的分裂方式。
每棵树都会完整成长而不会剪枝,这有可能在建完一棵正常树状分类器后会被采用)。
Scikit-learn实现随机森林和调参
- 随机森林在Scikit-learn的ensemble模块中,首先导入相应的模块
from sklearn import ensemble
from sklearn import tree
from sklearn import datasets
from sklearn.model_selection import train_test_split
- 这里我们利用Scikit-learn中的红酒数据集,这个数据集非常适用于机器学习中的树类模型
wine = datasets.load_wine()
X_data = wine.data
y_data = wine.target
- 随机森林常用的参数和重要属性说明
- 1 .min_samples_leaf=10,剪掉样本数少于10个的叶节点,或者把样本数少于10个的叶节点分到10个
2 .n_estimators(默认为10),就是随机森林中树的个数
3 .min_impurity_split=30,中间节点样本个数少于30的不在分化
4 .min_impurity_decrease=0.3,中间节点的信息增益低于0.3不再分化
5 .max_features=2 #限制分支时考虑的特征个数 - 随机森林的属性和接口:
1 .estimators_返回建的森林的列表,每棵树的情况
2 .oob_score 袋外得分,随机森林采用bootstrap有放回的抽样可能有一些从未抽取到的数据,这些数据可以用来做测试
四个接口:fit,predict,score,apply
接口 predict_prob返回每一个样本对应的被分到每一类标签的概率,少数服从多数去选择预测的标签 - 下面构建模型
X_train,X_test,y_train,y_test = train_test_split(X_data,y_data,test_size = 0.3)
clf = tree.DecisionTreeClassifier(criterion='gini')
rfc = ensemble.RandomForestClassifier(random_state=10) # 随机森林中树的棵数
clf = clf.fit(X_train,y_train)
rfc = rfc.fit(X_train,y_train)
- 查看决策树和随机森林的模型得分,可以看到随机森林比决策树效果好一些
score1 = clf.score(X_test,y_test)
score2 = rfc.score(X_test,y_test)
print('Decision tree model score: {}'.format(score1))
print('RandomForest model score: {}'.format(score2))
>> Decision tree model score: 0.9074074074074074
RandomForest model score: 0.9629629629629629
- 通过交叉验证验证一下模型的情况,并用matplotlib画图工具展示出来
### 多次交叉验证
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
rfc_l = []
clf_l = []
for i in range(10):
rfc = ensemble.RandomForestClassifier(n_estimators=25)
rfc_s = cross_val_score(rfc,X_train,y_train,cv = 10).mean()
rfc_l.append(rfc_s)
clf = tree.DecisionTreeClassifier(criterion='entropy')
clf_s = cross_val_score(clf,X_train,y_train,cv = 10).mean()
clf_l.append(clf_s)
plt.plot(range(1,11),rfc_l,label='RandomForest')
plt.plot(range(1,11),clf_l,label = "DecisionTree")
plt.legend()
plt.show()
- 随机森林模型的属性.feature_importances_可以查看每个特征的重要性的比例
rfc.feature_importances_
>> array([0.22856109, 0.03452478, 0.01369924, 0.00668104, 0.01473769,
0.09992003, 0.08866531, 0.00509946, 0.02717142, 0.14646766,
0.07152866, 0.13577966, 0.12716396])
- apple 属性返回每个测试样本所在的叶子节点的索引
clf.apply(X_test)
>> array([[ 9, 10, 2, ..., 6, 17, 10],
[14, 18, 10, ..., 10, 23, 16],
[14, 18, 10, ..., 10, 23, 16],
...,
[ 5, 14, 7, ..., 9, 24, 5],
[ 9, 16, 5, ..., 6, 16, 10],
[14, 18, 10, ..., 10, 23, 16]], dtype=int64)
- predice属性返回每个测试样本的预测结果,可以对比一下预测样本的真实标签 y_test。
rfc.predict(X_test)
>> array([0.22856109, 0.03452478, 0.01369924, 0.00668104, 0.01473769,
0.09992003, 0.08866531, 0.00509946, 0.02717142, 0.14646766,
0.07152866, 0.13577966, 0.12716396])
y_test
>> array([2, 0, 0, 1, 1, 2, 1, 2, 2, 1, 2, 2, 0, 1, 1, 2, 0, 2, 1, 0, 2, 1,
1, 0, 1, 0, 0, 2, 2, 0, 0, 1, 0, 2, 0, 0, 2, 1, 1, 1, 1, 2, 0, 1,
0, 1, 1, 0, 2, 1, 1, 1, 2, 0])