线性模型与网格搜索

机器学习领域,选择合适的模型参数是一项至关重要的任务。本文将介绍如何使用网格搜索(GridSearchCV)来优化线性模型的参数。网格搜索是一种通过遍历预定义的参数值网格来寻找最佳参数组合的方法。将以Lasso回归模型为例,展示如何使用GridSearchCV来寻找最佳的正则化参数alpha。

加载数据集并应用GridSearchCV

首先,需要加载一个数据集,并对其进行预处理。在本例中,将使用sklearn库中的糖尿病数据集。然后,将数据集的前150个样本作为训练数据。接着,将创建一个Lasso回归模型,并定义一个alpha值的候选列表。这个列表将用于网格搜索,以找到最佳的alpha值。

import matplotlib.pyplot as plt import numpy as np from sklearn import datasets from sklearn.linear_model import Lasso from sklearn.model_selection import GridSearchCV X, y = datasets.load_diabetes(return_X_y=True) X = X[:150] y = y[:150] lasso = Lasso(random_state=0, max_iter=10000) alphas = np.logspace(-4, -0.5, 30) tuned_parameters = [{"alpha": alphas}] n_folds = 5 clf = GridSearchCV(lasso, tuned_parameters, cv=n_folds, refit=False) clf.fit(X, y)

在上述代码中,首先导入了必要的库,然后加载了糖尿病数据集,并将其前150个样本作为训练数据。接着,创建了一个Lasso回归模型,并定义了一个alpha值的候选列表。这个列表将用于网格搜索,以找到最佳的alpha值。最后,使用GridSearchCV来执行网格搜索,并使用交叉验证来评估每个alpha值的性能。

绘制误差线图

为了更好地理解不同alpha值对模型性能的影响,可以绘制一个误差线图。这个图将显示每个alpha值的平均测试分数及其标准误差。通过这个图,可以直观地看到哪个alpha值能够带来最佳的模型性能。

plt.figure().set_size_inches(8, 6) plt.semilogx(alphas, scores) std_error = scores_std / np.sqrt(n_folds) plt.semilogx(alphas, scores + std_error, "b--") plt.semilogx(alphas, scores - std_error, "b--") plt.fill_between(alphas, scores + std_error, scores - std_error, alpha=0.2) plt.ylabel("CV score +/- std error") plt.xlabel("alpha") plt.axhline(np.max(scores), linestyle="--", color=".5") plt.xlim([alphas[0], alphas[-1]])

在上述代码中,首先设置了图表的大小,然后使用semilogx函数绘制了alpha值与平均测试分数的关系。接着,计算了每个alpha值的标准误差,并将其添加到图表中。最后,使用fill_between函数填充了误差线之间的区域,以便更清晰地显示误差范围。

为了回答这个问题,可以使用LassoCV对象,它会自动从数据中选择最佳的alpha值。然后,可以使用外部交叉验证来评估不同数据子集上自动获得的alpha值的差异。

from sklearn.linear_model import LassoCV from sklearn.model_selection import KFold lasso_cv = LassoCV(alphas=alphas, random_state=0, max_iter=10000) k_fold = KFold(3) print("Answer to the bonus question: how much can you trust the selection of alpha?") print() print("Alpha parameters maximising the generalization score on different") print("subsets of the data:") for k, (train, test) in enumerate(k_fold.split(X, y)): lasso_cv.fit(X[train], y[train]) print("[fold {0}] alpha: {1:.5f}, score: {2:.5f}".format(k, lasso_cv.alpha_, lasso_cv.score(X[test], y[test]))) print() print("Answer: Not very much since we obtained different alphas for different") print("subsets of the data and moreover, the scores for these alphas differ") print("quite substantially.") plt.show()

在上述代码中,首先导入了LassoCV和KFold类。然后,创建了一个LassoCV对象,并定义了一个alpha值的候选列表。接着,使用KFold来分割数据集,并在每个数据子集上训练LassoCV模型。最后,打印了每个数据子集上获得的alpha值和对应的测试分数。通过这个结果,可以看到不同数据子集上获得的alpha值和测试分数存在较大的差异,因此不能过于依赖自动选择的alpha值。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485