随机森林指的是利用多棵树对样本进行训练并预测的一种分类器
随机森林的原理
在机器学习中,随机森林是一个包含多个决策树的分类器 根据下列算法而建造每棵树: 用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 ] )