正则化参数优化与模型性能

在机器学习中,模型的泛化能力是衡量其性能的重要指标之一。模型在训练数据上的表现并不总是等同于在测试数据上的表现。正则化是一种常用的技术,通过在损失函数中添加惩罚项来防止模型过拟合。随着正则化强度的增加,训练数据上的性能可能会降低,但在一定范围内,测试数据上的性能却能达到最优。本文以Elastic-Net回归模型为例,使用解释方差(R^2)来衡量模型性能,探讨了正则化参数的选择对训练和测试误差的影响。

生成样本数据

首先,使用sklearn库中的make_regression函数生成回归样本数据。这些数据将被分为训练集和测试集,其中训练集包含75个样本,测试集包含150个样本,每个样本有500个特征。设定信息性特征的数量为50,并设置噪声水平为1.0。

import numpy as np from sklearn import linear_model from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split n_samples_train, n_samples_test, n_features = 75, 150, 500 X, y, coef = make_regression(n_samples=n_samples_train + n_samples_test, n_features=n_features, n_informative=50, shuffle=False, noise=1.0, coef=True) X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=n_samples_train, test_size=n_samples_test, shuffle=False)

计算训练和测试误差

接下来,定义了一系列正则化参数的值,并使用Elastic-Net回归模型来训练这些模型。对于每个正则化参数值,都计算了训练误差和测试误差。通过比较这些误差,可以找到使测试误差最小的正则化参数值,即最优正则化参数。

alphas = np.logspace(-5, 1, 60) enet = linear_model.ElasticNet(l1_ratio=0.7, max_iter=10000) train_errors = list() test_errors = list() for alpha in alphas: enet.set_params(alpha=alpha) enet.fit(X_train, y_train) train_errors.append(enet.score(X_train, y_train)) test_errors.append(enet.score(X_test, y_test)) i_alpha_optim = np.argmax(test_errors) alpha_optim = alphas[i_alpha_optim] print("Optimal regularization parameter: %s" % alpha_optim)

在全数据集上估计最优正则化参数下的系数

确定了最优正则化参数后,使用该参数在全数据集上重新训练模型,并估计模型系数。这些系数将与真实系数进行比较,以评估模型的拟合效果。

enet.set_params(alpha=alpha_optim) coef_ = enet.fit(X, y).coef_

绘制结果函数

最后,使用matplotlib库来绘制正则化参数与训练误差和测试误差之间的关系图。此外,还绘制了真实系数与估计系数的对比图,以直观地展示模型的拟合效果。

import matplotlib.pyplot as plt plt.subplot(2, 1, 1) plt.semilogx(alphas, train_errors, label="Train") plt.semilogx(alphas, test_errors, label="Test") plt.vlines(alpha_optim, plt.ylim()[0], np.max(test_errors), color="k", linewidth=3, label="Optimum on test") plt.legend(loc="lower right") plt.ylim([0, 1.2]) plt.xlabel("Regularization parameter") plt.ylabel("Performance") # 显示估计的系数与真实系数 plt.subplot(2, 1, 2) plt.plot(coef, label="True coef") plt.plot(coef_, label="Estimated coef") plt.legend() plt.subplots_adjust(0.09, 0.04, 0.94, 0.94, 0.26, 0.26) plt.show()

脚本总运行时间

该脚本的总运行时间为6.513秒。

  • 糖尿病数据集上的交叉验证练习
  • 正交匹配追踪
  • 特征聚合与单变量选择的比较
  • L2正则化下的岭系数
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485