机器学习: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接口是用于训练集的,剩下的接口基本都是用于测试集的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容