Python机器学习算法详解:线性回归(Linear Regression)实战指南

目录

⭐️引言

⭐️理论

1、 简单线性回归

2、 多元线性回归

3、最佳拟合

⭐️结语


⭐️引言

        线性回归(Linear Regression)是一种基本的预测分析方法,它通过拟合数据点来建立因变量(目标变量)与一个或多个自变量之间的关系模型。线性回归假设这种关系是线性的,并试图找到一条直线(简单线性回归)或超平面(多元线性回归),使得这条直线或超平面与实际数据点之间的误差最小化。

⭐️理论

        为了实现线性回归(Linear Regression)主要使用Scikit-learn提供了丰富的线性回归工具,其中包括基本的LinearRegression(使用普通最小二乘法)、Ridge回归(通过L2正则化解决多重共线性问题)、Lasso回归(通过L1正则化实现特征选择)、ElasticNet(结合L1和L2正则化)以及SGDRegressor(使用随机梯度下降法)等库解决线性回归的一系列问题

1、 简单线性回归

        简单线性回归(Simple Linear Regression, SLR)是一种基本的统计方法,主要用来分析两

个变量间的关系,其中一个变量是因变量(或响应变量),另一个是自变量(或预测变量)。

        简单线性回归模型假定因变量 ( y ) 与自变量 ( x ) 之间存在线性关系,模型可表示为:

                                                y = \beta_0 + \beta_1 x + \epsilon

        其中:

        ( y ) 是因变量。

        ( x ) 是自变量。

        ( \beta_0 ) 是模型的截距(当 ( x=0 ) 时 ( y ) 的预期值)。

        ( \beta_1 ) 是斜率,表示自变量 ( x ) 每增加一个单位时因变量 ( y ) 的平均变化量。

        ( \epsilon ) 是误差项,代表模型未能捕捉的影响 ( y ) 的其他因素。

import numpy as np
import matplotlib.pyplot as plt

# 设置随机种子以确保结果可重复
np.random.seed(42)

# 生成模拟数据
n_samples = 100
X = np.random.rand(n_samples, 1) * 10  # 自变量
y = 2 * X + 3 + np.random.randn(n_samples, 1)  # 因变量,添加一些噪声

# 可视化原始数据
plt.scatter(X, y, color='blue', label='Data Points')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

        通过求解最小二乘法,可以获得参数 ( \beta_0 ) 和 ( \beta_1 ) 的估计值。具体的参数估计公式如下:

        截距 (\hat{\beta_0}) 的估计值为: 

                                                \hat{\beta_0} = \bar{y} - \hat{\beta_1} \bar{x}
        斜率 (\hat{\beta_1} ) 的估计值为:

                                              ​​​​​ \hat{\beta_1} = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sum_{i=1}^{n}(x_i - \bar{x})^2}

         其中 (\bar{x} ) 和 ( \bar{y} ) 分别是 ( x ) 和 ( y ) 的平均值。

def simple_linear_regression(X, y):
    # 计算均值
    mean_x = np.mean(X)
    mean_y = np.mean(y)
    
    # 计算斜率
    numerator = np.sum((X - mean_x) * (y - mean_y))
    denominator = np.sum((X - mean_x) ** 2)
    beta_1 = numerator / denominator
    
    # 计算截距
    beta_0 = mean_y - beta_1 * mean_x
    
    return beta_0, beta_1

# 训练模型
beta_0, beta_1 = simple_linear_regression(X, y)
print(f"截距 (beta_0): {beta_0}")
print(f"斜率 (beta_1): {beta_1}")


# 预测
y_pred = beta_0 + beta_1 * X

# 可视化结果
plt.scatter(X, y, color='blue', label='Data Points')
plt.plot(X, y_pred, color='red', label='Regression Line')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

        评估简单线性回归模型的好坏可以通过以下指标:

        决定系数 ( R^2 ):衡量模型解释了因变量变异性的比例。( R^2 ) 的值介于 0 到 1 之间,值越

接近 1 表示模型拟合效果越好。

        标准误差:衡量预测值与实际值之间的平均差异。

        t 检验:用于检验回归系数是否显著不同于零。

        F 检验:用于检验整个回归模型是否具有统计显著性。

2、 多元线性回归

        多元线性回归(Multiple Linear Regression, MLR)是一种扩展的线性回归模型,它考虑了一

个因变量与多个自变量之间的线性关系。

        多元线性回归模型可以表示为:  

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \cdots + \beta_n x_n + \epsilon

        其中:

        ( y ) 是因变量。

        ( x_1, x_2, \ldots, x_n ) 是自变量。

        ( \beta_0 ) 是截距项。

        ( \beta_1, \beta_2, \ldots, \beta_n ) 是回归系数。

        ( \epsilon ) 是误差项。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 设置随机种子以确保结果可重复
np.random.seed(42)

# 生成模拟数据
n_samples = 100
X = np.random.rand(n_samples, 2) * 10  # 两个自变量
y = 2 * X[:, 0] + 3 * X[:, 1] + 5 + np.random.randn(n_samples)  # 因变量,添加一些噪声

# 将数据转换为 DataFrame 方便操作
data = pd.DataFrame({'x1': X[:, 0], 'x2': X[:, 1], 'y': y})

# 可视化原始数据
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(X[:, 0], y, color='blue', label='Data Points')
ax.set_xlabel('X1')
ax.set_ylabel('Y')
ax.legend()
plt.show()

        通过求解最小二乘法,可以获得参数的估计值。

        具体的参数估计公式如下:\mathbf{b} = (X^T X)^{-1} X^T y 其中:

        ( \mathbf{b} ) 是参数向量 ( \beta ) 的估计值。

        ( X ) 是自变量矩阵,每一行为一个样本的自变量值。

        ( y ) 是因变量向量。

def multiple_linear_regression(X, y):
    # 添加一列全为 1 的截距项
    X = np.hstack((np.ones((n_samples, 1)), X))
    
    # 计算参数估计值
    b = np.linalg.inv(X.T @ X) @ X.T @ y
    return b

# 训练模型
b = multiple_linear_regression(X, y)
print(f"截距 (beta_0): {b[0]}")
print(f"斜率 (beta_1): {b[1]}")
print(f"斜率 (beta_2): {b[2]}")

# 预测
y_pred = b[0] + b[1] * X[:, 0] + b[2] * X[:, 1]

# 可视化结果
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(X[:, 0], y, color='blue', label='Data Points')
ax.plot(X[:, 0], y_pred, color='red', label='Regression Line')
ax.set_xlabel('X1')
ax.set_ylabel('Y')
ax.legend()
plt.show()

模型评估
        评估多元线性回归模型的好坏可以通过以下指标:

        决定系数 ( R^2 ):衡量模型解释了因变量变异性的比例。( R^2 ) 的值介于 0 到 1 之间,值越接近 1 表示模型拟合效果越好。

        调整后的 ( R^2 ):考虑了模型复杂度对 ( R^2 ) 的影

        t 检验:用于检验每个回归系数是否显著不同于零。

        F 检验:用于检验整个回归模型是否具有统计显著性。
假设检验
        多元线性回归模型通常需要满足以下假设:

        线性关系:因变量与自变量之间存在线性关系。

        独立性:误差项 ( \epsilon ) 之间相互独立。

        正态性:误差项 ( \epsilon ) 服从正态分布。

        同方差性:误差项 ( \epsilon ) 的方差在不同自变量取值下保持不变。

        无多重共线性:自变量之间不存在高度相关性。

3、最佳拟合

        最小化上述损失函数的过程就是寻找最佳拟合直线或超平面的过程。可以通过解析解(如正

规方程 Normal Equation)或数值优化方法(如梯度下降 Gradient Descent)来求解。

        正规方程

正规方程可以直接求解 ( \mathbf{w} ):

                                                 \mathbf{w} = (X^T X)^{-1} X^T y ]

其中:

        ( X ) 是样本特征矩阵。

        ( y ) 是样本标签向量。

​​​​​​​        数值优化方法

目标函数为:
        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        J(\mathbf{w}) = \frac{1}{2n} \sum_{i=1}^{n} (y_i - \mathbf{w}^T \mathbf{x}_i)^2
目标函数的梯度为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \nabla J(\mathbf{w}) = \frac{1}{n} \sum_{i=1}^{n} -(\mathbf{x}_i (y_i - \mathbf{w}^T \mathbf{x}_i))
梯度下降的更新规则为:其中,( \alpha ) 是学习率。

                                                  \mathbf{w}_{k+1} = \mathbf{w}_k - \alpha \nabla J(\mathbf{w}_k)

def gradient_descent(X, y, learning_rate=0.01, max_iters=1000, tol=1e-6):
    # 初始化参数
    n_features = X.shape[1]
    w = np.zeros(n_features + 1)  # 包括截距项
    X = np.hstack((np.ones((n_samples, 1)), X))  # 添加截距项
    
    # 计算目标函数
    def cost_function(w, X, y):
        predictions = X @ w
        errors = predictions - y
        return (1 / (2 * n_samples)) * np.sum(errors ** 2)
    
    # 计算梯度
    def gradient(w, X, y):
        predictions = X @ w
        errors = predictions - y
        return (1 / n_samples) * (X.T @ errors)
    
    # 梯度下降迭代
    prev_cost = float('inf')
    for _ in range(max_iters):
        grad = gradient(w, X, y)
        w -= learning_rate * grad
        
        current_cost = cost_function(w, X, y)
        if abs(prev_cost - current_cost) < tol:
            break
        prev_cost = current_cost
    
    return w

# 训练模型
w = gradient_descent(X, y)
print(f"截距 (beta_0): {w[0]}")
print(f"斜率 (beta_1): {w[1]}")
print(f"斜率 (beta_2): {w[2]}")

⭐️结语

        线性回归是一种简单而强大的统计学习方法,广泛应用于数据分析和机器学习领域,通过建立因变量与一个或多个自变量之间的线性关系,帮助我们理解和预测数据中的趋势。无论是简单线性回归还是多元线性回归,都可以通过最小二乘法或梯度下降法求解参数,从而最小化残差平方和(RSS)。模型训练过程中,我们可以使用闭式解 (\mathbf{b} = (X^T X)^{-1} X^T y) 或者通过迭代优化求解参数。模型评估时,通过决定系数 ( R^2 )、调整后的 ( R^2 )、标准误差、t 检验和 F 检验等多种指标来衡量模型的性能。总之,线性回归不仅理论基础扎实,而且在实际应用中表现出色,是解决回归问题的重要工具。

作者:弥十一

物联沃分享整理
物联沃-IOTWORD物联网 » Python机器学习算法详解:线性回归(Linear Regression)实战指南

发表回复