机器学习的模型都是参数化的,可以通过调参来提高模型的准确度。模型有很多参数,如何找到最佳的参数组合,可以把它当作一个查询问题来处理,但调整参数到何时为止呢?应该遵循偏差和方差协调的原则。
1 机器学习算法调参
调整算法参数是采用机器学习解决问题的最后一个步骤,有时也被称为超参数优化。学会调参是进行机器学习的前提。参数可以分为两种:一种是影响模型在训练集上的准确度或防止过拟合能力的参数;另一种是不影响这两者的参数。模型在样本总体上的准确度由其在训练集上的准确度及其防止过拟合的能力共同决定,所以在调参时主要针对第一种参数进行调整,最终达到的效果是:模型在训练集上的准确度和防止过拟合能力的大和谐。
1.1 网格搜索优化参数
网格搜索优化参数是一种算法参数优化1的方法。它是通过遍历已定义参数的列表,来评估算法的参数,从而找到最优参数。在scikit-learn中使用GridSearchCV来实现对参数的跟踪、调整与评估,从而找到最优参数。网格搜索优化参数适用于三四个的超参数(当超参数的数量增加时,网格搜索的计算复杂度会呈现指数型增长,这时要换用随机搜索),由用户列出一个较小的超参数值域,这些超参数值域的笛卡尔集(排列组合)为一组超参数。网格搜索算法使用每组超参数训练模型,并挑选验证集误差最小的超参数组合。
from pandas import read_csv
from sklearn.linear_model import Ridge
from sklearn.model_selection import GridSearchCV
# 导入数据
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
# 将数据分为输入数据和输出结果
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
# 算法实例化
model = Ridge()
# 设置要遍历的参数
param_grid = {'alpha': [1, 0.1, 0.01, 0.001, 0]}
# 通过网格搜索查询最优参数
grid = GridSearchCV(estimator=model, param_grid=param_grid)
grid.fit(X, Y)
# 搜索结果
print('最高得分:%.3f' % grid.best_score_)
print('最优参数:%s' % grid.best_estimator_.alpha)
1.2 随机搜索优化参数
随机搜索优化参数是另一种对算法参数优化的方法。随机搜索优化参数通过固定次数的迭代,采用随机采样分布的方式搜索合适的参数。与网格搜索优化参数相比,随机搜索优化参数提供了一种更高效的解决方法,随机搜索优化参数为每一个参数定义了一个分布函数,并在该空间中进行采样。
from pandas import read_csv
from sklearn.linear_model import Ridge
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform
# 导入数据
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
# 将数据分为输入数据和输出结果
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
# 算法实例化
model = Ridge()
# 设置要遍历的参数
param_grid = {'alpha': uniform()}
# 通过网格搜索查询最优参数
grid = RandomizedSearchCV(estimator=model, param_distributions=param_grid, n_iter=100, random_state=7)
grid.fit(X, Y)
# 搜索结果
print('最高得分:%.3f' % grid.best_score_)
print('最优参数:%s' % grid.best_estimator_.alpha)
注::调参是算法模型生成之前很重要的一步,如果算法的参数少于三个,推荐使用网格搜索优化参数;如果需要优化的参数超过三个,推荐使用随机搜索优化参数。
参考资料
[1] 魏贞原.2018.机器学习:Python实践[M].北京:电子工业出版社