欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Scikit-learn实现随机森林算法

程序员文章站 2023-01-23 07:56:14
随机森林指的是利用多棵树对样本进行训练并预测的一种分类器随机森林的原理在机器学习中,随机森林是一个包含多个决策树的分类器根据下列算法而建造每棵树:用N来表示训练用例(样本)的个数,M表示特征数目。输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M。从N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。对于每一个节点,随机选择m个特征,决策树上每个节点的决定都是基于这些特征确定的。根据这m...

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

随机森林的原理

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

Scikit-learn实现随机森林算法

  • 随机森林模型的属性.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])

本文地址:https://blog.csdn.net/qq_44971458/article/details/107093476