机器学习:04. 随机森林之RandomForestClassifier

1. 集成算法

1.1 集成算法是通过在数据上构建多个模型,集成所有模型的建模结果,包括随机森林,梯度提升树(GBDT),Xgboost等。
1.2 多个模型集成成为的模型叫做集成评估器(ensemble estimator),组成集成评估器的每个模型都叫做基评估器(base estimator)。通常来说,有三类集成算法:装袋法(Bagging),提升法(Boosting)和stacking。
1.3 装袋法的核心思想是构建多个相互独立的评估器,装袋法的代表模型就是随机森林
1.4 提升法的核心思想是结合弱评估器的力量一次次对难以评估的样本
进行预测
,从而构成一个强评估器。提升法的代表模型有Adaboost和梯度提升树

sklearn中的集成算法模块ensemble

2. RandomForestClassifier 随机森林分类

随机森林是非常具有代表性的Bagging集成算法,它的所有基评估器都是决策树,分类树组成的森林就叫做随机森林分类器,回归树所集成的森林就叫做随机森林回归器。

2.1 重要参数(n_estimators,random_state,boostrap和oob_score)

1. n_estimators

这是森林中树木的数量,即基评估器的数量。n_estimators越大,模型的效果往往越好。
一个随机森林和单个决策树效益的对比
1. 导入包

#1.导入包
#代表画图的时候,需要这个环境
%matplotlib inline 
from sklearn.tree import DecisionTreeClassifier #决策树
from sklearn.ensemble import RandomForestClassifier #集成学习中的随机森林

2. 导入数据集

#2 导入数据集
wine = load_wine()
wine.data
wine.target

3. sklearn建模的基本流程
1.实例化
2.训练集带入实例化后的模型进行训练,使用的接口是fit
3.使用其它接口将测试集导入我们训练好的模型,去获取我们希望获取的结果(score,y_test)

from sklearn.model_selection import train_test_split
Xtrain,Xtest,Ytrain,Ytest = train_test_split(wine.data,wine.target,test_size=0.3)

#复习:sklearn建模的基本流程
clf = DecisionTreeClassifier(random_state=0)
rfc = RandomForestClassifier(random_state=0)

clf = clf.fit(Xtrain,Ytrain)
rfc = rfc.fit(Xtrain,Ytrain)

score_c = clf.score(Xtest,Ytest) #是精确度
score_r = rfc.score(Xtest,Ytest)

print('Single Tree:{}'.format(score_c)
     ,'Random Forest:{}'.format(score_r)) #format是将分数转换放在{}中

4. 画出随机森林和决策树在一组交叉验证下的效果对比

#4. 画出随机森林和决策树在一组交叉验证下的效果对比
#交叉验证:是数据集划分为n分,依次取每一份做测试集,每n-1份做训练集,多次训练模型以观测模型稳定性的方法

from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt

rfc = RandomForestClassifier(n_estimators=25)
rfc_s = cross_val_score(rfc,wine.data,wine.target,cv=10)
clf = DecisionTreeClassifier()
clf_s = cross_val_score(clf,wine.data,wine.target,cv=10)

plt.plot(range(1,11),rfc_s,label = "RandomForest")
plt.plot(range(1,11),clf_s,label = "Decision Tree")
plt.legend()
plt.show()
可以看到随机森林的准确率高于决策树
#上述交叉验证更为简单的实现方式
# for循环两种交叉验证,先计算RandomForest,再计算DecisionTree
label = "RandomForest"
for model in [RandomForestClassifier(n_estimators=25),DecisionTreeClassifier()]:
    score = cross_val_score(model,wine.data,wine.target,cv=10)
    print("{}:".format(label)),print(score.mean()) #这边打印的是计算10次得到的acuraccy的平均值
    plt.plot(range(1,11),score,label = label)
    plt.legend()
    label = "DecisionTree"

5. 画出随机森林和决策树在十组交叉验证下的效果对比

# 5. 画出随机森林和决策树在十组交叉验证下的效果对比
rfc_l = []
clf_l = []
for i in range(10):
    rfc = RandomForestClassifier(n_estimators=25)
    rfc_s = cross_val_score(rfc,wine.data,wine.target,cv=10).mean()
    rfc_l.append(rfc_s)
    clf = DecisionTreeClassifier()
    clf_s = cross_val_score(clf,wine.data,wine.target,cv=10).mean()
    clf_l.append(clf_s)

plt.plot(range(1,11),rfc_l,label = "Random Forest")
plt.plot(range(1,11),clf_l,label = "Decision Tree")
plt.legend()
plt.show()

单个决策树的准确率越高,随机森林的准确率也会越高

6. n_estimators的学习曲线

#6. n_estimators的学习曲线
superpa = []
for i in range(200):
    rfc = RandomForestClassifier(n_estimators=i+1,n_jobs=-1) #这里就是进行了200次的随机森林计算,每次的n_estimator设置不一样
    rfc_s = cross_val_score(rfc,wine.data,wine.target,cv=10).mean()
    superpa.append(rfc_s)
print(max(superpa),superpa.index(max(superpa)))
plt.figure(figsize=[20,5])
plt.plot(range(1,201),superpa)
plt.show()
# list.index(object) >>>返回对象object在列表list中的索引 68是i值,但是n_estimators=i+1,所以最大准确率对应的n_estimators是69.
n_estimator在达到一定值后,准确率就会在一定范围波动,并不会一直上升而趋向于1。

2. random_state

在决策树中,一个random_state只控制生成一棵树,而随机森林中的random_state控制的是生成森林的模式。当random_state固定时,随机森林中生成是一组固定的树,但每棵树依然是不一致的。

rfc = RandomForestClassifier(n_estimators=25,random_state=2)
rfc = rfc.fit(Xtrain,Ytrain)
# #随机森林的重要属性之一:estimators,查看森林中树的状况
rfc.estimators_[0].random_state #就是查看第0棵树的randomstate是多少
#1872583848

#通过循环将随机森林中所有决策树的random_state导出
for i in range(len(rfc.estimators_)):
    print(rfc.estimators_[i].random_state)

3. bootstrap & oob_score

袋装法正是通过有放回的随机抽样技术来形成不同的训练数据,bootstrap就是用来控制抽样技术的参数。bootstrap参数默认True,代表采用这种有放回的随机抽样技术。
这种抽样方法会有约37%的训练数据被浪费掉,没有参与建模,这些数据被称为袋外数据(out of bag data,简写为oob)。在使用随机森林时,我们可以不划分测试集和训练集,只需要用袋外数据来测试我们的模型即可。oob_score_来查看我们的在袋外数据上测试的结果。

#无需划分训练集和测试集,用袋外数据来测试模型
rfc = RandomForestClassifier(n_estimators=25,oob_score=True) #oob_score默认是FALSE,bootstrap默认是TRUE.
rfc = rfc.fit(wine.data,wine.target) #用所有的数据来训练
#重要属性oob_score_
rfc.oob_score_  #查看袋外数据在模型上的测试结果
#0.9606741573033708

2.2 重要属性和接口

重要属性:.estimators_ .oob_score_ 和.feature_importances_

接口:apply, fit, predict, score和predict_proba

rfc = RandomForestClassifier(n_estimators=25)
rfc = rfc.fit(Xtrain, Ytrain) #fit接口是训练集用的
rfc.score(Xtest,Ytest)
rfc.feature_importances_ #得出所有特征的重要性数值
rfc.apply(Xtest) #返回测试集每个样本在所在树的叶子节点的索引
rfc.predict(Xtest) #返回对测试集的预测标签
rfc.predict_proba(Xtest) #每一个样本分配到每一个标签的概率

参数是用来实例化确定模型有哪些限制条件的,属性是模型训练集的一些信息;fit接口是用于训练集的,剩下的接口基本都是用于测试集的。

你可能感兴趣的:(机器学习:04. 随机森林之RandomForestClassifier)