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)