Numpy 正则化线性回归
在本文中,我们将介绍如何使用Numpy实现正则化(L2正则化)的线性回归。我们将解释其中的数学原理,并提供示例代码。
阅读更多:Numpy 教程
线性回归
在机器学习中,线性回归是一种用于建模的简单而广泛使用的方法。它假设目标变量和特征变量之间存在线性关系,并使用最小二乘法确定最佳拟合直线。
在一个简单的情况下,我们假设输出变量y是输入变量x的线性组合。也就是说,有一个权重向量w,使得y = w * x + b,其中b是偏置(bias)。
我们可以通过最小化平方误差来确定最佳权重向量w和偏置b。这个问题可以用以下的损失函数来表示:
其中,n是样本数,xi是第i个样本的特征向量,yi是该样本的实际输出值。我们需要找到w和b,最小化该方程。
使用梯度下降(Gradient Descent)算法,可以找到最小的w和b值。 迭代的方式是,通过计算损失函数关于每个参数的偏导数来逐步更新参数,直到收敛为止。
正则化线性回归
在现实场景中,模型往往是过度拟合了。过度拟合指的是模型过于复杂,完美地适应训练数据,但是不能很好地泛化到新的测试数据上。这通常是由于模型关注输入中的噪声而不是信号,从而导致我们在一组新数据上拟合得很差。
为了避免过度拟合问题,我们可以在损失函数中添加一个正则化项,来限制参数w的大小。这将确保在模型建立时考虑了模型的过度复杂性。通常我们使用L2正则化。
L2正则化通过向损失函数中添加正则化项,惩罚权重的平方和。这可以通过如下公式表示:
其中,λ是正则化系数,控制正则化的力度。较大的λ值意味着更强的正则化,这将使权重更快地收缩到零。
示例
接下来,让我们通过一个例子来理解如何实现正则化线性回归。
我们将使用Scikit-learn中的波士顿房价数据集。该数据集包含许多用于预测波士顿地区房价中位数的特征,其中的一些特征包括城镇犯罪率,当地房产税,房间数量等。我们将使用这些特征来训练一个正则化的线性回归模型。
首先,我们导入必要的库和数据:
import numpy as np
from sklearn.datasets import load_boston
boston = load_boston()
X = boston.data
y = boston.target
接下来,我们将数据划分为训练集和测试集:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
然后,我们实现正则化线性回归。我们将使用梯度下降算法来最小化损失函数,同时在每次更新权重时添加正则化项。
class RegularizedLinearRegression:
def __init__(self, learning_rate, lambda_value):
self.learning_rate = learning_rate
self.lambda_value = lambda_value
def fit(self, X, y, epochs=100):
ones = np.ones((X.shape[0], 1))
X = np.concatenate((ones, X), axis=1)
self.w = np.zeros(X.shape[1])
self.losses = []
for i in range(epochs):
y_pred = np.dot(X, self.w)
error = y_pred - y
regularization = self.lambda_value * self.w
regularization[0] = 0 # Don't regularize the bias term
grad = (1/X.shape[0]) * np.dot(X.T, error) + (2/X.shape[0]) * regularization
self.w -= self.learning_rate * grad
loss = np.mean(error**2) + self.lambda_value * np.sum(self.w**2)
self.losses.append(loss)
print("Epoch %d : Loss %0.4f" % (i, loss))
def predict(self, X):
ones = np.ones((X.shape[0], 1))
X = np.concatenate((ones, X), axis=1)
return np.dot(X, self.w)
我们将梯度下降算法迭代100次,并打印每个epoch的损失。
现在让我们使用训练集来训练模型,并使用测试集计算性能指标(例如均方误差和R2分数)。
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error, r2_score
regression = RegularizedLinearRegression(learning_rate=0.01, lambda_value=0.1)
regression.fit(X_train, y_train, epochs=100)
y_pred = regression.predict(X_test)
print("Mean Squared Error:", mean_squared_error(y_test, y_pred))
print("R2 Score:", r2_score(y_test, y_pred))
plt.plot(regression.losses)
plt.title("Loss over epochs")
plt.xlabel("Epoch")
plt.ylabel("Loss")
plt.show()
最后,我们通过绘制损失函数随时间变化的图表来检查模型的训练情况。
总结
正则化线性回归是一种有效的方法,可以避免模型过度拟合数据,同时提高性能和可靠性。在本文中,我们介绍了使用Numpy实现正则化线性回归的方法,并提供了示例代码。我们使用波士顿房价数据集作为实例进行了说明,同时在最后评估了模型性能。希望这篇文章能够帮助你更好地理解正则化线性回归和如何使用Numpy来实现它。