Python 机器学习中,梯度下降法是一种用于优化线性回归模型(以及其他机器学习算法)的损失函数的通用算法。目的是通过迭代地调整模型的参数(权重和截距),以最小化损失函数,例如均方误差(MSE)。梯度下降的基本思想是计算损失函数相对于每个参数的梯度(即偏导数),然后朝着减少损失的方向调整参数。这个过程重复进行,直到损失函数收敛到最小值或达到预定的迭代次数。

1、线性回归

线性回归是一种监督学习算法,用于模型化特征和目标变量之间的线性关系。它试图找到一条直线(在二维空间中)或一个超平面(在多维空间中),以便最好地拟合给定数据点。线性回归的目标是最小化预测值和实际值之间的差异,通常使用均方误差(MSE)作为损失函数来衡量这种差异。

参考文档Python 机器学习 线性回归算法

2、损失函数

为了训练机器学习模型,需要一个评价标准来衡量模型的性能。损失函数提供了这样一个标准,通过最小化损失函数来优化模型参数。损失函数(有时称为成本函数)衡量模型预测值与实际值之间的差异。对于线性回归,常用的损失函数是均方误差(MSE)。公式代码如下,

import numpy as np

# 假设 X 是输入特征矩阵,y 是目标值向量
X = np.array([[1, 2], [1, 3], [1, 4], [1, 5]]) # 添加了一列1作为x0,以便处理截距项
y = np.array([5, 7, 9, 11])

# 初始化模型参数,theta0为截距,theta1, theta2为斜率
theta = np.array([0.1, 0.2])

# 线性回归模型的预测函数
def predict(X, theta):
    return X.dot(theta)

# 计算损失函数(MSE)
def compute_loss(X, y, theta):
    m = len(y)
    y_pred = predict(X, theta)
    loss = (1 / (2 * m)) * np.sum(np.square(y_pred - y))
    return loss

# 计算损失值
loss = compute_loss(X, y, theta)
print(f"Loss: {loss}")

参考文档:Python 机器学习 线性回归算法

3、梯度下降

梯度下降法是一种用来优化线性回归模型中损失函数的算法。它通过不断迭代模型的参数(权重和截距),以减少损失函数的值,从而找到损失函数的最小值。这一过程是通过计算损失函数对每个参数的梯度(偏导数)并根据这些梯度更新参数来实现的。对于线性回归,通常使用均方误差(MSE)作为损失函数。公式代码如下,

import numpy as np

# 模拟数据
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

# 添加截距项到X
X_b = np.c_[np.ones((100, 1)), X]  # 添加x0 = 1到每个实例

# 梯度下降参数
learning_rate = 0.01
n_iterations = 1000
m = len(X_b)

# 随机初始化参数
theta = np.random.randn(2, 1)

# 梯度下降
for iteration in range(n_iterations):
    gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)
    theta -= learning_rate * gradients

print("模型参数:", theta)

predictions = X_b.dot(theta)
mse = (1/m) * np.sum((predictions - y) ** 2)
print("MSE:", mse)

SGDRegressor是scikit-learn库中用于解决回归问题的一个类,使用随机梯度下降(SGD)算法。这种方法特别适合大规模数据集,因为它每次更新模型参数时只使用数据集中的一个样本,从而减少了计算资源的需求。常用参数如下,

参数

描述

loss

损失函数,默认是'squared_loss'。

其他可选项包括'huber'、'epsilon_insensitive'

或者'quantile'等。

penalty

正则化项,默认是'l2'。

也可以设置为'l1'或'elasticnet'。

alpha

正则化项的系数,默认是0.0001。

learning_rate

学习率的调整方式,默认是'invscaling'。

其他选项包括'constant'、'optimal'和'adaptive'。

max_iter

最大迭代次数,默认是1000。

tol

停止标准。当一次迭代中损失的改善小于这个值时,

算法会停止,默认值为1e-3。

eta0

当学习率设置为'constant'

或'adaptive'时的初始学习率。

使用示例:

from sklearn.linear_model import SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler
import numpy as np

# 生成模拟数据
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X[:, 0] + np.random.randn(100)

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 数据标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 创建SGDRegressor模型
sgd_reg = SGDRegressor(max_iter=1000, tol=1e-3, penalty='l2', alpha=0.0001, learning_rate='invscaling', eta0=0.01)

# 训练模型
sgd_reg.fit(X_train_scaled, y_train)

# 预测
y_pred = sgd_reg.predict(X_test_scaled)

# 计算模型性能
mse = mean_squared_error(y_test, y_pred)
print("模型系数:", sgd_reg.coef_)
print("模型截距:", sgd_reg.intercept_)
print("测试集的均方误差(MSE):", mse)

推荐文档