在机器学习中,过拟合是一个严重的模型问题,它会导致模型在训练集上学得“太好”,以至于在测试集或新数据上表现不佳。模型不仅学习了训练数据的细节,还学习了其中的噪声,这限制了模型对新数据的处理能力。为了避免过拟合,可以采用多种方法,如K折交叉验证、重采样、减少特征数量等。其中,正则化是一种有效的技术,它通过惩罚系数来防止模型过拟合,而不是丢弃模型的特征。
正则化通过向线性方程的成本函数添加惩罚项来实现。在过拟合模型中,系数通常会膨胀,正则化通过增加惩罚项来避免系数过大。如果系数膨胀,成本函数将增加,线性回归模型将尝试优化系数以最小化成本函数。
正则化技术主要有两种:L1正则化(也称为LASSO)和L2正则化(也称为Ridge)。L1正则化通过绝对值的和作为惩罚项,可以减少系数至0,从而在正则化的同时进行特征选择。而L2正则化通过系数平方值的和作为惩罚项,可以减少系数值接近0但不会完全为0,Ridge将系数值分布在所有特征上。
Lasso回归是一个应用L1或LASSO惩罚项的线性模型。以下是如何在Python中构建Lasso回归模型的步骤:
import numpy as np
import pandas as pd
from sklearn import metrics
from sklearn.linear_model import Lasso
# 导入数据集
df_train = pd.read_csv('train.csv')
df_test = pd.read_csv('test.csv')
# 去除重复项
df_train = df_train.dropna()
df_test = df_test.dropna()
# 指定x_train, x_test, y_train, y_test变量
x_train = df_train['x'].values.reshape(-1,1)
y_train = df_train['y'].values.reshape(-1,1)
x_test = df_test['x'].values.reshape(-1,1)
y_test = df_test['y'].values.reshape(-1,1)
# 构建Lasso回归模型
lasso = Lasso()
# 拟合模型
lasso.fit(x_train, y_train)
# 计算训练集和测试集的RMSE
print("Lasso Train RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_train, lasso.predict(x_train))), 5))
print("Lasso Test RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_test, lasso.predict(x_test))), 5))
执行上述代码后,可以通过调整Lasso模型的超参数来找到合适的alpha值,使用LassoCV或GridSearchCV进行调整。
Ridge回归是一个应用L2或Ridge惩罚项的线性模型。以下是如何在Python中构建Ridge回归模型的步骤:
import numpy as np
import pandas as pd
from sklearn import metrics
from sklearn.linear_model import Ridge
# 导入数据集
df_train = pd.read_csv('train.csv')
df_test = pd.read_csv('test.csv')
# 去除重复项
df_train = df_train.dropna()
df_test = df_test.dropna()
# 指定x_train, x_test, y_train, y_test变量
x_train = df_train['x'].values.reshape(-1,1)
y_train = df_train['y'].values.reshape(-1,1)
x_test = df_test['x'].values.reshape(-1,1)
y_test = df_test['y'].values.reshape(-1,1)
# 构建Ridge回归模型
ridge = Ridge()
# 拟合模型
ridge.fit(x_train, y_train)
# 计算训练集和测试集的RMSE
print("Ridge Train RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_train, ridge.predict(x_train))), 5))
print("Ridge Test RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_test, ridge.predict(x_test))), 5))
执行上述代码后,可以通过调整Ridge模型的超参数来找到合适的alpha值,使用RidgeCV或GridSearchCV进行调整。
import numpy as np
import pandas as pd
from sklearn import metrics
from sklearn.linear_model import ElasticNet
# 导入数据集
df_train = pd.read_csv('train.csv')
df_test = pd.read_csv('test.csv')
# 去除重复项
df_train = df_train.dropna()
df_test = df_test.dropna()
# 指定x_train, x_test, y_train, y_test变量
x_train = df_train['x'].values.reshape(-1,1)
y_train = df_train['y'].values.reshape(-1,1)
x_test = df_test['x'].values.reshape(-1,1)
y_test = df_test['y'].values.reshape(-1,1)
# 构建ElasticNet回归模型
enet = ElasticNet()
# 拟合模型
enet.fit(x_train, y_train)
# 计算训练集和测试集的RMSE
print("ElasticNet Train RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_train, enet.predict(x_train))), 5))
print("ElasticNet Test RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_test, enet.predict(x_test))), 5))