机器学习中调参的基本思想:
1)非常正确的调参思路和方法
2)对模型评估指标有深入理解
3)对数据的感觉和经验
随机森林指的是利用多棵树对样本进行训练并预测的一种分类器。在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。
利用python自带的乳腺癌数据进行预测。跟之前的方法一样,首先是导入相关的库,导入数据集。实例化模型,利用测试数据训练模型,最后利用测试数据得出模型预测的精确度,这里是未调整参数之前的精确度。
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split,cross_val_score,GridSearchCV
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
from sklearn.datasets import load_wine,load_breast_cancer #红酒数据集,乳腺癌数据相对简单
from sklearn.impute import SimpleImputer #数据处理 填补缺失值
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import sklearn
data = load_breast_cancer()
rm = RandomForestClassifier(random_state=90, n_estimators=100) #实例化随机森林
score = cross_val_score(rm, data.data, data.target, cv=10).mean()
print("未调参之前的随机森林预测精度为:",score)
随机森林调参的第一步,先来调n_estimators,并且画出它的学习曲线,方便看变化趋势。
#调参 #画图展示学习曲线
score_list = []
for i in range(0, 200, 10):
rm = RandomForestClassifier(n_estimators=i+1
, random_state=90
, n_jobs=1)
#交叉验证
score = cross_val_score(rm, data.data, data.target, cv=10).mean()
score_list.append(score) #记录每个n_estimators下的精确度
print((max(score_list), (score_list.index(max(score_list))*10)+1)) #输出最大的n_estimators以及它的下标
plt.figure(figsize=[20,5]) #展示画布的大小
plt.plot(range(1, 201, 10), score_list, color="r", label="random predict")
plt.legend() #展示图例
plt.show()
可以看出n_estimators参数在31-41之间。我们在把它具体。
#具体调模型的n_estimators参数
score_list2 = []
for i in range(35,45):
rfc = RandomForestClassifier(n_estimators=i
,n_jobs=-1
,random_state=90)
score = cross_val_score(rfc,data.data,data.target,cv=10).mean()
score_list2.append(score)
print(max(score_list2),score_list2.index(max(score_list2))+35)
plt.figure(figsize=[20,5])
plt.plot(range(35,45),score_list2)
plt.show()
#可以看见n_estimators最优是取到39
#利用网格搜索,继续调整max_depth
param_grid = {
"max_depth": np.arange(5,30)
}
rm_new = RandomForestClassifier(n_estimators=39
, random_state=90
, n_jobs=1
)
GV = GridSearchCV(rm_new, param_grid=param_grid, cv=10)
GV.fit(data.data, data.target)
然后输出最优的参数,#输出最优参数时模型的精确度。相对未调参之前的精确度高了一点。
n_estimators控制基评估器的数量,通常都是越大越好,但是受困于计算量的限制。默认值为10或者100,一般我们取0到200。
当模型在未知数据上表现糟糕时,我们说模型的泛化程度不够,泛化误差大。
通过上图我们发现模型的复杂度会影响泛化误差:模型太简单和太复杂都会使得泛化误差变大分别是欠拟合和过拟合,树模型是天生的的复杂模型,对于树模型来说非常容易过拟合,同样的,对于以树模型作为基础的随机森林来讲,我们的调参目标就是减少模型的复杂度来降低泛化误差。
一般调参数是为了模型更加精确,而在实际数据中,调参其实是一个很费时间的事。如果能理解随机森林参数的原理,在调整参数时,可能会好一些。