实验二:使用随机森林算法对红酒数据集进行分类建模过程

实验要求:

1、分类对象:from sklearn.datasets import load_wine

2、实验步骤:参考随机森林章节中的实验5,编写第1-12步骤程序代码,最终给出最优的模型参数。

源码下载

步骤

  • 一、导入各种我们需要的模块或者数据集等(导入就不注释了,不懂的看实验一)
from sklearn.datasets import load_wine
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
import matplotlib.pyplot as plt
import numpy as np
  • 二、将数据实例化,评估

    这是最开始的分数,没经过调参的,random_state可以设为任意数

wine = load_wine()
rfc = RandomForestClassifier(random_state=0) #实例化
score_f=cross_val_score(rfc,wine.data,wine.target,cv=10).mean() #交叉验证10次的平均分
score_f
  • 三、画出n_estimators的学习曲线,找出最优的n_estimaters

    这段代码跑的比较久一点,n_job用来调用电脑的线程,可能会报错warnings.warn("Estimator fit failed. The score on this train-test",报错的可以注释掉

scorel = []    #定义一个列表,用来存放每次循环得到的score
for i in range(0,200,10):
    rfc = RandomForestClassifier(n_estimators=i+1,  #因为n_estimators不能为0,所以i要加1
                             #   n_jobs=-1,
                                 random_state=0)
    score = cross_val_score(rfc,wine.data,wine.target,cv=10).mean()
    scorel.append(score)
print(max(scorel),(scorel.index(max(scorel))*10)+1)  #打印出最好的score和他的索引
plt.figure(figsize=[20,5])
plt.plot(range(1,201,10),scorel)
plt.show()

因为我得出的结果索引是31,为了更精确的确定n_estimators,可以在更小的区间内再画曲线

scorel = []
for i in range(25,35):   #这个是更小的区间
    rfc = RandomForestClassifier(n_estimators=i,  #这里从25开始所以不用加1
                                # n_jobs=-1,
                                 random_state=0)
    score = cross_val_score(rfc,wine.data,wine.target,cv=10).mean()
    scorel.append(score)
print(max(scorel),([*range(25,35)][scorel.index(max(scorel))]))
plt.figure(figsize=[20,5])
plt.plot(range(25,35),scorel)
plt.show()

结果在n_estimators为29的时候分数是最高的


  • 四、用网格搜索找出其他的最优参数

1.首先找max_depth

#调整max_depth
param_grid = {'max_depth':np.arange(1, 14, 1)} #这里范围为1-14,步长为1是因为有13个特征,由wine.data.shape可查看
rfc = RandomForestClassifier(n_estimators=29 #这里记得加上刚刚调整出来的n_estimators
                             ,random_state=0
                            )
GS = GridSearchCV(rfc,param_grid,cv=10)#网格搜索
GS.fit(wine.data,wine.target)
GS.best_params_  #显示调整出来的最佳参数
GS.best_score_    #分数不变,说明max_depth不影响模型

2.调整max_features

#调整max_features
 
param_grid = {'max_features':np.arange(1,10,1)} 
 
rfc = RandomForestClassifier(n_estimators=29
                             ,random_state=0
                             #,max_depth=4  #如果我们加入了map_depth=4分数会更低,可以先加了再注释比较一下分数
                            )
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(wine.data,wine.target)
 
GS.best_params_
GS.best_score_

在我调整完这个参数之后,我发现后面的几个参数对模型的分数没有什么影响了,也可以试着调调看

3.调整min_samples_leaf

改一下参数,其他的不便

param_grid={'min_samples_leaf':np.arange(1, 1+10, 1)}
rfc = RandomForestClassifier(n_estimators=29
                             ,random_state=0
                             ,max_features=1
                            )
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(wine.data,wine.target)
 
GS.best_params_
GS.best_score_

4.调整min_samples_split

param_grid={'min_samples_split':np.arange(2, 2+20, 1)}
rfc = RandomForestClassifier(n_estimators=29
                             ,random_state=0
                             ,max_features=1
                            )
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(wine.data,wine.target)
 
GS.best_params_
GS.best_score_

5.调整min_samples_split

#调整Criterion
 
param_grid = {'criterion':['gini', 'entropy']}
 
rfc = RandomForestClassifier(n_estimators=29
                             ,random_state=0
                            )
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)
 
GS.best_params_
GS.best_score_
  • 五、总结

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