数据建模调参
1、模型性能验证:
交叉验证方法
贴一张原理图(以10折交叉验证为例)
k折交叉验证步骤:
Step 1:使用不重复抽样将原始数据随机分为k份;
Step 2:其中k-1份数据用于模型训练,剩下的那1份数据用于测试模型;
Step 3:重复Step 2 k次,得到k个模型和他的评估结果。
Step 4:计算k折交叉验证结果的平均值作为参数/模型的性能评估。
曲线验证模型效果
模型准确率反馈了模型的效果,大家看下图
1)左上角子的模型偏差很高。它的训练集和验证集准确率都很低,很可能是欠拟合。解决欠拟合的方法就是增加模型参数,比如,构建更多的特征,减小正则项。
2)右上角子的模型方差很高,表现就是训练集和验证集准确率相差太多。解决过拟合的方法有增大训练集或者降低模型复杂度,比如增大正则项,或者通过特征选择减少特征数。
3)右下角的模型就很好。
2、模型调参:
模型可调参数及范围选取的参考:
贪心调参方法
拿当前对模型影响最大的参数调优,直到最优化;再拿下一个影响最大的参数调优,如此下去,直到所有的参数调整完毕。这个方法的缺点就是可能会调到局部最优而不是全局最优,但是省时间省力。
网格调参方法
网格搜索(grid search),作为调参很常用的方法,在我们的机器学习算法中,有一类参数,需要人工进行设定,我们称之为“超参”,也就是算法中的参数,比如学习率、正则项系数或者决策树的深度等。网格搜索就是要找到一个最优的参数,从而使得模型的效果最佳,而它实现的原理其实就是暴力搜索;即我们事先为每个参数设定一组值,然后穷举各种参数组合,找到最好的那一组。
网格搜索的结果获得了指定的最优参数值,c为1GridSearchCV中param_grid参数是字典构成的列表。对于线性SVM,我们只评估参数C;对于RBF核SVM,我们评估C和gamma。最后, 我们通过best_parmas_得到最优参数组合。
网格搜索虽然不错,但是穷举过于耗时,sklearn中还实现了随机搜索,使用 RandomizedSearchCV类,随机采样出不同的参数组合
贝叶斯调参方法
贝叶斯优化用于机器学习调参,主要思想是,给定优化的目标函数(广义的函数,只需指定输入和输出即可,无需知道内部结构以及数学性质),通过不断地添加样本点来更新目标函数的后验分布(高斯过程,直到后验分布基本贴合于真实分布。简单的说,就是考虑了上一次参数的信息,从而更好的调整当前的参数。
与常规的网格搜索或者随机搜索的区别是:
- 贝叶斯调参采用高斯过程,考虑之前的参数信息,不断地更新先验;网格搜索未考虑之前的参- - 数信息
- 贝叶斯调参迭代次数少,速度快;网格搜索速度慢,参数多时易导致维度爆炸
- 贝叶斯调参针对非凸问题依然稳健;网格搜索针对非凸问题易得到局部最优
使用方法:
- 定义优化函数(rf_cv, 在里面把优化的参数传入,然后建立模型, 返回要优化的分数指标)
- 定义优化参数
- 开始优化(最大化分数还是最小化分数等)
- 得到优化结果