一、参数与超参数
什么是模型参数?
模型参数是模型内部的配置变量,其值可以根据数据进行估计。
- 它们的值定义了可使用的模型
- 模型在进行预测时需要它们。
- 他们是从数据估计或获悉的。
- 它们通常不由编程者手动设置。
- 他们通常被保存为学习模型的一部分。
- 参数是机器学习算法的关键。它们通常由过去的训练数据中总结得出。
什么是模型超参数?
-
模型超参数是模型外部的配置,其值无法从数据中估计。
-
它们通常用于帮助估计模型参数。
-
它们通常由人工指定。
-
他们通常可以使用启发式设置。
-
他们经常被调整为给定的预测建模问题。
二、网格搜索GridSearchCV
GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数。但是这个方法适合于小数据集,一旦数据的量级上去了,很难得出结果。这个时候就是需要动脑筋了。数据量比较大的时候可以使用一个快速调优的方法——坐标下降。它其实是一种贪心算法:拿当前对模型影响最大的参数调优,直到最优化;再拿下一个影响最大的参数调优,如此下去,直到所有的参数调整完毕。这个方法的缺点就是可能会调到局部最优而不是全局最优,但是省时间省力,巨大的优势面前,还是试一试吧,后续可以再拿bagging再优化。
所以网格搜索适用于三四个(或者更少)的超参数(当超参数的数量增长时,网格搜索的计算复杂度会呈现指数增长,这时候则使用随机搜索),用户列出一个较小的超参数值域,这些超参数至于的笛卡尔积(排列组合)为一组组超参数。网格搜索算法使用每组超参数训练模型并挑选验证集误差最小的超参数组合。
代码例子如下:
import lightgbm as lgb
from sklearn.model_selection import GridSearchCV
def GridSearch(clf, params, X, y):
cscv = GridSearchCV(clf, params, scoring='neg_mean_squared_error', n_jobs=1, cv=5)
cscv.fit(X, y)
print(cscv.cv_results_)
print(cscv.best_params_)
if __name__ == '__main__':
train_X, train_y = get_data()
param = {
'objective': 'regression',
'n_estimators': 275,
'max_depth': 6,
'min_child_samples': 20,
'reg_lambd': 0.1,
'reg_alpha': 0.1,
'metric': 'rmse',
'colsample_bytree': 1,
'subsample': 0.8,
'num_leaves' : 40,
'random_state': 2018
}
regr = lgb.LGBMRegressor(**param)
adj_params = {'n_estimators': range(100, 400, 10),
'min_child_weight': range(3, 20, 2),
'colsample_bytree': np.arange(0.4, 1.0),
'max_depth': range(5, 15, 2),
'subsample': np.arange(0.5, 1.0, 0.1),
'reg_lambda': np.arange(0.1, 1.0, 0.2),
'reg_alpha': np.arange(0.1, 1.0, 0.2),
'min_child_samples': range(10, 30)}
GridSearch(regr , adj_params , train_X, train_y)
三、随机搜索 RandomizedSearchCV
当探索相对较少的组合时,就像前面的例子,网格搜索还可以。但是当超参数的搜索空间很大时,最好使用RandomizedSearchCV 。这个类的使用方法和类 GridSearchCV 很相似,但它不是尝试所有可能的组合,而是通过选择每个超参数的一个随机值的特定数量的随机组合。如果你让随机搜索运行,比如 1000 次,它会探索每个超参数的 1000 个不同的值(而不是像网格搜索那样,只搜索每个超参数的几个值)。你可以方便地通过设定搜索次数,控制超参数搜索的计算量。
网格搜索相当于暴力地从参数空间中每个都尝试一遍,然后选择最优的那组参数,这样的方法显然是不够高效的,因为随着参数类别个数的增加,需要尝试的次数呈指数级增长。有没有一种更加高效的调优方式呢?那就是使用随机搜索的方式,这种方式不仅仅高校,而且实验证明,随机搜索法结果比稀疏化网格法稍好(有时候也会极差,需要权衡)。参数的随机搜索中的每个参数都是从可能的参数值的分布中采样的。与网格搜索相比,这有两个主要优点:
- 可以独立于参数数量和可能的值来选择计算成本。
- 添加不影响性能的参数不会降低效率。
种调参手段,使用穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一个可能性,找到表现最好的参数就是在最终模型中使用的参数值。
有两部分组成:GridSearch 网络搜索和CV 交叉验证。
网络搜索:搜索的是参数,在指定的参数范围内,按步长一次调整参数,利用调整的参数训练学习器,从所有的参数中找到在验证集上精度最高的参数。
适用场景:三四个以下的超参数,以上则使用随机搜索(什么是随机搜索),
缺点:
- 需要遍历所有可能参数的组合,在面对大数据集和多参数的情况下,非常耗时。