Numpy 正则化线性回归

Numpy 正则化线性回归

在本文中,我们将介绍如何使用Numpy实现正则化(L2正则化)的线性回归。我们将解释其中的数学原理,并提供示例代码。

阅读更多:Numpy 教程

线性回归

在机器学习中,线性回归是一种用于建模的简单而广泛使用的方法。它假设目标变量和特征变量之间存在线性关系,并使用最小二乘法确定最佳拟合直线。

在一个简单的情况下,我们假设输出变量y是输入变量x的线性组合。也就是说,有一个权重向量w,使得y = w * x + b,其中b是偏置(bias)。

我们可以通过最小化平方误差来确定最佳权重向量w和偏置b。这个问题可以用以下的损失函数来表示:

Numpy 正则化线性回归

其中,n是样本数,xi是第i个样本的特征向量,yi是该样本的实际输出值。我们需要找到w和b,最小化该方程。

使用梯度下降(Gradient Descent)算法,可以找到最小的w和b值。 迭代的方式是,通过计算损失函数关于每个参数的偏导数来逐步更新参数,直到收敛为止。

正则化线性回归

在现实场景中,模型往往是过度拟合了。过度拟合指的是模型过于复杂,完美地适应训练数据,但是不能很好地泛化到新的测试数据上。这通常是由于模型关注输入中的噪声而不是信号,从而导致我们在一组新数据上拟合得很差。

为了避免过度拟合问题,我们可以在损失函数中添加一个正则化项,来限制参数w的大小。这将确保在模型建立时考虑了模型的过度复杂性。通常我们使用L2正则化。

L2正则化通过向损失函数中添加正则化项,惩罚权重的平方和。这可以通过如下公式表示:

Numpy 正则化线性回归

其中,λ是正则化系数,控制正则化的力度。较大的λ值意味着更强的正则化,这将使权重更快地收缩到零。

示例

接下来,让我们通过一个例子来理解如何实现正则化线性回归。

我们将使用Scikit-learn中的波士顿房价数据集。该数据集包含许多用于预测波士顿地区房价中位数的特征,其中的一些特征包括城镇犯罪率,当地房产税,房间数量等。我们将使用这些特征来训练一个正则化的线性回归模型。

首先,我们导入必要的库和数据:

import numpy as np
from sklearn.datasets import load_boston

boston = load_boston()
X = boston.data
y = boston.target
Python

接下来,我们将数据划分为训练集和测试集:

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)
Python

然后,我们实现正则化线性回归。我们将使用梯度下降算法来最小化损失函数,同时在每次更新权重时添加正则化项。

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)
Python

我们将梯度下降算法迭代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()
Python

最后,我们通过绘制损失函数随时间变化的图表来检查模型的训练情况。

总结

正则化线性回归是一种有效的方法,可以避免模型过度拟合数据,同时提高性能和可靠性。在本文中,我们介绍了使用Numpy实现正则化线性回归的方法,并提供了示例代码。我们使用波士顿房价数据集作为实例进行了说明,同时在最后评估了模型性能。希望这篇文章能够帮助你更好地理解正则化线性回归和如何使用Numpy来实现它。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册