第一次训练
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
精度都在下降,所以不如不调,实际应用中需要敏锐的判断最合适的位置,是否需要过多的调整参数
来源:CSDN
作者:学习不易
链接:https://blog.csdn.net/qq_43656233/article/details/103434217