在机器学习中,模型的参数调整是非常重要的一件事,如果能找到合适的参数,那么模型的泛化能力就会得到很大的提升。
但现实是,模型有很多参数,而且这些参数的取值范围也都很大。如果用人工手动去调整,既费时又费力。
好在,scikit-learn给我们提供了一个自动调参的解决方案——网格搜索。
划分验证集的必要性
在介绍网格搜索之前,我们先来回顾下模型调参的简单流程。
首先,我们建立一个模型,将数据集分成训练集和测试集;然后,我们用模型拟合训练集,用测试集来评价模型的精度;接着,我们更换模型的参数,再次拟合并测试精度;最后,我们选出精度最高时所对应的那个模型参数。
上面的过程看上去好像一气呵成,没什么问题。但实际上,我们在调整参数,反复用测试集测试精度时,测试集已经被“污染”了。换句话说,测试集中的数据在你不断调整参数的过程中已经泄露给了模型。这样模型面对的就不再是全新的数据集,我们也无法真正判断出模型的泛化能力到底如何。
那怎么解决这个问题呢?
我们只需要再额外划分出一块数据集,称之为“验证集”。我们在训练集上拟合模型,在验证集上对模型进行调参,最后再测试集上对模型进行泛化能力的评估。
带交叉验证的网格搜索
虽然我们上面介绍过,可以将数据分成训练集、验证集和测试集。但我们也可以通过交叉验证的方法来找到模型泛化能力最强时所对应的参数。
在scikit-learn中,我们可以用GridSearchCV模块来实现:
首先,加载我们的工具
我们还是使用之前的鸢尾花数据集,用SVC来对其分类
接下来,我们把SVC中需要调节的参数储存到一个字典中
然后,构建我们的分类器:
接下来,将鸢尾花数据集分成训练集和测试集
然后,对训练集进行拟合并进行交叉验证
GridSearchCV会自动生成一个新模型,该模型具有最佳的参数,我们看下模型的精度
同时,我们也可以查看模型选择的参数
而交叉验证的最佳精度保存在best_score_中
此外,我们还能查看最佳参数对应的模型
SVC模型对应的参数就详细的列出来了。
这就是今天的全部内容,喜欢就点个在看吧!
领取专属 10元无门槛券
私享最新 技术干货