在机器学习领域,正则化是一种减少模型过拟合现象的基本技术,尤其在回归问题中尤为重要。过拟合的模型在训练集和测试集的均方根误差(RMSE)之间会有较大的差异。正则化回归模型相较于经典回归模型,往往在训练集和测试集RMSE之间的差异最小。
正则化技术通过惩罚线性回归方程中的系数来防止模型过拟合。在过拟合模型中,系数往往被过度放大或赋予过高的权重。因此,对这些参数施加惩罚可以防止它们过度膨胀。过拟合模型在训练数据上表现良好,但在测试或新数据上表现不佳,导致构建的模型没有实际用途。通过在回归模型的成本函数中添加系数,即均方误差(残差平方和除以自由度),从而增加成本。优化器会尝试最小化系数以降低成本函数。在正则化中,除了截距外,所有参数都会受到惩罚。
有两种正则化技术可以用来防止过拟合:L1正则化(LASSO)和L2正则化(Ridge)。L1正则化将系数的绝对值作为惩罚项添加到成本函数中,而L2正则化将系数平方值的和作为惩罚项添加到成本函数中。α值表示想要对系数施加多大的惩罚。
在本节中,将构建一个经典多元线性回归模型,并计算训练集和测试集的RMSE,然后与正则化回归模型进行比较。
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn import metrics
import warnings
warnings.filterwarnings('ignore')
df = pd.read_csv('Fish.csv')
print(df.head())
数据集来自Kaggle,任务是基于多个特征预测鱼类的重量,因此“重量”是目标特征。对于x变量,取除了目标变量“重量”之外的所有特征;对于y变量,只取目标“重量”。
x = df.drop('Weight', axis = 1)
y = df['Weight']
y = y.values.reshape(-1,1)
x = pd.get_dummies(x, drop_first = True)
由于数据集包含分类特征,将使用pandas的.get_dummies()方法为分类特征的唯一类别创建虚拟变量。将drop_first参数值设置为True,以避免陷入虚拟变量陷阱。
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 66)
使用train_test_split模块为x和y变量创建训练和测试集。
linreg = LinearRegression()
linreg.fit(x_train, y_train)
print("Train RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_train, linreg.predict(x_train))), 5))
print("Test RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_test, linreg.predict(x_test))), 5))
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn import metrics
import warnings
warnings.filterwarnings('ignore')
df = pd.read_csv('Fish.csv')
x = df.drop('Weight', axis = 1)
y = df['Weight']
y = y.values.reshape(-1,1)
x = pd.get_dummies(x, drop_first = True)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 66)
linreg = LinearRegression()
linreg.fit(x_train, y_train)
print("Train RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_train, linreg.predict(x_train))), 5))
print("Test RMSE:", np.round(np.sqrt(metrics.mean_squared_error(y_test, linreg.predict(x_test))), 5))