随机森林指的是利用多棵树对样本进行训练并预测的一种分类器

随机森林的原理

  • 在机器学习中,随机森林是一个包含多个决策树的分类器
  • 根据下列算法而建造每棵树:
    用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])