机器学习 - 网格搜索
网格搜索
大多数机器学习模型都包含可以调整的参数,以改变模型的学习方式。例如,来自 sklearn
的逻辑回归模型有一个参数 C
,它控制正则化,这会影响模型的复杂度。
我们如何选择 C
的最佳值?最佳值取决于用于训练模型的数据。
它是如何工作的?
一种方法是尝试不同的值,然后选择给出最佳得分的值。这种技术被称为网格搜索。如果我们需要为两个或更多参数选择值,我们将评估值集的所有组合,从而形成值的网格。
在进入实例之前,了解我们正在更改的参数的作用是有益的。C
的较高值告诉模型,训练数据类似于现实世界的信息,对训练数据赋予更大的权重。而 C
的较低值则相反。
使用默认参数
首先,让我们看看仅使用基本参数而不进行网格搜索可以生成什么样的结果。
为了开始,我们必须首先加载我们将要处理的数据集。
from sklearn import datasets iris = datasets.load_iris()
接下来,为了创建模型,我们必须有一组自变量 X 和一个因变量 y。
X = iris['data'] y = iris['target']
现在,我们将加载逻辑回归模型来对鸢尾花进行分类。
from sklearn.linear_model import LogisticRegression
创建模型,将 max_iter 设置为较高的值以确保模型找到结果。
请注意,逻辑回归模型中 C
的默认值为 1
,我们稍后会进行比较。
在下面的示例中,我们查看鸢尾花数据集,并尝试使用逻辑回归中 C
的不同值来训练模型。
logit = LogisticRegression(max_iter = 10000)
创建模型后,我们必须将模型拟合到数据上。
print(logit.fit(X,y))
为了评估模型,我们运行 score 方法。
print(logit.score(X,y))
实例
from sklearn import datasets from sklearn.linear_model import LogisticRegression iris = datasets.load_iris() X = iris['data'] y = iris['target'] logit = LogisticRegression(max_iter = 10000) print(logit.fit(X,y)) print(logit.score(X,y))
使用 C=1
的默认设置,我们得到了 0.973 的得分。
让我们通过实现网格搜索并使用不同的 C 值来看看是否可以做得更好。
实现网格搜索
我们将遵循与之前相同的步骤,但这次我们将为 C
设置一系列值。
知道要为搜索的参数设置哪些值将需要结合领域知识和实践。
由于 C
的默认值为 1
,我们将围绕它设置一系列值。
C = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]
接下来,我们将创建一个 for 循环来更改 C
的值,并评估每次更改后的模型。
首先,我们将创建一个空列表来存储得分。
scores = []
要更改 C
的值,我们必须遍历值范围并在每次更新参数。
for choice in C: logit.set_params(C=choice) logit.fit(X, y) scores.append(logit.score(X, y))
将得分存储在列表中后,我们可以评估 C
的最佳选择是什么。
print(scores)
实例
from sklearn import datasets from sklearn.linear_model import LogisticRegression iris = datasets.load_iris() X = iris['data'] y = iris['target'] logit = LogisticRegression(max_iter = 10000) C = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] scores = [] for choice in C: logit.set_params(C=choice) logit.fit(X, y) scores.append(logit.score(X, y)) print(scores)
结果解释
我们可以看到,C
的较低值的表现比基础参数 1
更差。但是,随着我们将 C
的值增加到 1.75
,模型的准确度有所提高。
似乎增加超过这个量的 C
值并不能帮助提高模型准确度。
最佳实践说明
我们通过使用与训练模型相同的数据来评估逻辑回归模型的得分。如果模型与该数据过于接近,它可能不擅长预测未见过的数据。这种统计错误被称为过拟合 (over fitting)。
为了避免被训练数据的得分误导,我们可以留出部分数据专门用于测试模型。请参考关于训练/测试分割的讲座,以避免被误导和过拟合。