机器学习 - 网格搜索
在本页面,W3schools.com 与 纽约数据科学学院 合作,为我们的学生提供数字培训内容。
网格搜索
大多数机器学习模型包含可以调整的参数,以改变模型的学习方式。例如,来自 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))
为了评估模型,我们运行评分方法。
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
` 的默认值为 `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
` 进一步增加并不能提高模型的精度。
关于最佳实践的说明
我们使用与用于训练模型相同的数据来评估我们的逻辑回归模型。如果模型与该数据过于匹配,它可能不擅长预测未见数据。这种统计误差被称为**过拟合**。
为了避免被训练数据的得分误导,我们可以留出一部分数据,专门用于测试模型。参考有关训练/测试拆分的讲座,以避免被误导和过拟合。