Sklearn 乳腺癌数据调参

第一次训练

from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

data=load_breast_cancer()

scorel = []
for i in range(0, 200, 10):
    rfc = RandomForestClassifier(n_estimators=i + 1
                                 , n_jobs = -1
                                 , random_state = 90)
    score = cross_val_score(rfc, data.data, data.target, cv=10).mean()
    scorel.append(score)
print(max(scorel), (scorel.index(max(scorel)) * 10) + 1)
plt.figure(figsize=[20, 5])
plt.plot(range(1, 201, 10), scorel)
plt.show()

在这里插入图片描述
所以在上面的训练过程中,我们得到了在41左右,精确率最高。但是这只是0-200之中,步长为10的训练结果,并不能确定41就是那个精度最高的点,所以我们继续在35-45之间,继续训练,得到最高准确率的n_estimators点。

0.9684480598046841 41

第二次训练

from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

data=load_breast_cancer()

scorel = []
for i in range(35, 45, 1):
    rfc = RandomForestClassifier(n_estimators=i + 1
                                 , n_jobs = -1
                                 , random_state = 90)
    score = cross_val_score(rfc, data.data, data.target, cv=10).mean()
    scorel.append(score)
print(max(scorel),([*range(35,45)][scorel.index(max(scorel))]))
plt.figure(figsize=[20,5])
plt.plot(range(35,45),scorel)
plt.show()

在这里插入图片描述
此处即确认了我们的最高精度位置,准确率提高了不少。

0.9719568317345088 38

调参顺序:
在这里插入图片描述
1、根据数据的大小来进行一个试探,乳腺癌数据很小,所以可以采用110,或者120这样的试探

2、但对于像digit recognition那样的大型数据来说,我们应该尝试30~50层深度(或许还不足够

3、更应该画出学习曲线,来观察深度对模型的影响

第三次训练

下面调整max_depth的参数,调参数徐都是从影响度大的向小的进行调整。

from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

data=load_breast_cancer()
param_grid = {'max_depth': np.arange(1, 20, 1)} # 以字典形式,左边是调整的参数,右边是范围

rfc = RandomForestClassifier(n_estimators=38 #使用刚刚训练出的结果
                            ,random_state = 90 
                            )
                            
GS = GridSearchCV(rfc,param_grid,cv=10) 
GS.fit(data.data, data.target)
print(GS.best_params_)
print(GS.best_score_)

训练结果,确定最大深度

{'max_depth': 11}
0.9718804920913884

利用外置循环法,与上面的方法所得到的结果相同

score=[]

for i in range(1,20,1):
    rfc=RandomForestClassifier(n_estimators=39
                              ,random_state = 90
                              ,n_jobs=-1
                              ,max_depth=i
                              )
    score_c=cross_val_score(rfc, data.data, data.target, cv=10).mean()
    score.append(score_c)

print(max(score),([*range(1,20)][score.index(max(score))]))
plt.figure(figsize=[20,5])
plt.plot(range(1,20,1),score)
plt.show()

在这里插入图片描述

0.9719568317345088 11

为了精确度较高,通常使用第二种绘制图像最后判断精确度最高的位置

第四次训练

本次训练的参数是 max_features
max_features是唯一一个即能够将模型往左(低方差高偏差)推,也能够将模型往右(高方差低偏差)推的参数。我们需要根据调参前,模型所在的位置(在泛化误差最低点的左边还是右边)来决定我们要将max_features往哪边调。 现在模型位于图像左侧,我们需要的是更高的复杂度,因此我们应该把max_features往更大的方向调整,可用的特征 越多,模型才会越复杂。max_features的默认最小值是sqrt(n_features),因此我们使用这个值作为调参范围的最小值。

from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

data=load_breast_cancer()

param_grid = {'max_features': np.arange(5, 30, 1)}

rfc = RandomForestClassifier(n_estimators=38,random_state = 90)
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data, data.target)

print(GS.best_params_)
print(GS.best_score_)

最后得到max_features的最合适位置

{'max_features': 6}
0.968365553602812

精度都在下降,所以不如不调,实际应用中需要敏锐的判断最合适的位置,是否需要过多的调整参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值