机器学习的起点:线性回归LinearRegression
- 人工智能
- 2025-09-16 00:42:02

机器学习的起点:线性回归Linear Regression
作为机器学习的起点,线性回归是理解算法逻辑的绝佳入口。我们从定义、评估方法、应用场景到局限性,用生活化的案例和数学直觉为你构建知识框架。
回归算法
一、线性回归的定义与核心原理
定义:线性回归是一种通过线性方程(如Y = AX + B)建立自变量(X)与因变量(Y)关系的统计方法。
数学表达:简单线性回归的公式为
y = β 0 + β 1 x + ϵ y = \beta_0 + \beta_1 x + \epsilon y=β0+β1x+ϵ 其中:
β 0 \beta_0 β0是截距(当X=0时Y的起点) β 1 \beta_1 β1是斜率(X每增加1单位,Y的平均变化量) ϵ \epsilon ϵ是误差项(代表无法用线性关系解释的随机波动)直观理解:想象在散点图上找一条“最佳直线”,让所有数据点到这条直线的垂直距离之和最小。这条直线代表了变量间的整体趋势,例如身高与体重的关系、学习时间与考试成绩的关联等。
二、如何评估模型训练效果?
线性回归的目标是找到最优的 β 0 \beta_0 β0和 β 1 \beta_1 β1,使得预测值与真实值的误差最小
常用的评估指标是平方残差和(Residual Sum of Squares, RSS)或均方误差(MSE): RSS = ∑ i = 1 n ( y i − y ^ i ) 2 \text{RSS} = \sum_{i=1}^n (y_i - \hat{y}_i)^2 RSS=i=1∑n(yi−y^i)2
MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \text{MSE} = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2 MSE=n1i=1∑n(yi−y^i)2
为什么用平方?
避免正负误差相互抵消(如+3和-3的总误差为0,但平方和为18)。对大误差更敏感,模型会更努力减少明显偏离的点(但这也意味着对异常值敏感)。延伸指标:
R²(决定系数):衡量模型解释数据变动的能力,范围0~1,越接近1拟合越好。 例如,若R²=0.8,说明模型能解释80%的Y值变化。三、线性回归的应用场景
线性回归的预测能力在多个领域大放异彩,以下是典型应用案例:
排队问题
场景:预测新加入者的排队位置。逻辑:假设排队时间与人数呈线性关系,若当前排队人数为X,每人的平均处理时间为斜率β₁,则可预测新人的等待时间Y。身高与体重的关系
场景:已知某人身高(X),预测其体重(Y)。模型:通过大量样本数据拟合Y = β₀ + β₁X,例如β₁=0.7表示身高每增加1cm,体重平均增加0.7kg。人口与GDP预测
场景:分析某地区人口(X)与经济规模(Y)的关系。扩展:若数据包含多个变量(如教育水平、资源储量),可升级为多元线性回归: Y = β 0 + β 1 X 1 + β 2 X 2 + ⋯ + β n X n Y = \beta_0 + \beta_1X_1 + \beta_2X_2 + \cdots + \beta_nX_n Y=β0+β1X1+β2X2+⋯+βnXn 例如,GDP可能同时与人口、工业产值相关。四、线性回归的局限性
尽管简单高效,线性回归并非万能,其核心问题包括:
无法捕捉非线性关系
例子:若数据呈现抛物线分布(如温度与冰淇淋销量的关系),强行用直线拟合会导致预测偏差。解决方案:引入多项式回归(如 Y = β 0 + β 1 X + β 2 X 2 Y = \beta_0 + \beta_1X + \beta_2X^2 Y=β0+β1X+β2X2)或使用决策树等非线性模型。对异常值敏感
例子:若数据中存在极端值(如身高2.5米的人),会显著拉偏拟合直线的斜率。解决方案:清洗数据或使用鲁棒回归(如Huber损失函数)。多重共线性问题
场景:在多元回归中,若自变量高度相关(如“房间数”和“房屋面积”),会导致模型参数不稳定。解决方案:剔除冗余变量或使用正则化技术(如岭回归)。 五、案例通过 scikit-learn 练习线性回归是一个绝佳的实践方式!
以下是分步指南,涵盖数据生成、模型训练、评估、可视化以及应对局限性的解决方案:
1. 环境准备确保安装以下库:
pip install numpy matplotlib scikit-learn
2. 基础线性回归(单变量) 生成模拟数据 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 生成数据:y = 2x + 5 + 噪声 np.random.seed(42) X = np.random.rand(100, 1) * 10 # 生成0~10之间的100个随机数 y = 2 * X + 5 + np.random.randn(100, 1) * 2 # 添加高斯噪声 # 可视化数据 plt.scatter(X, y, alpha=0.7, label='真实数据') plt.xlabel("X (自变量)") plt.ylabel("y (因变量)") plt.title("线性回归示例数据") plt.show() 训练模型并预测 # 创建模型并训练 model = LinearRegression() model.fit(X, y) # 查看参数 print(f"截距 (β0): {model.intercept_[0]:.2f}") print(f"斜率 (β1): {model.coef_[0][0]:.2f}") # 预测新数据 X_new = np.array([[2.5], [7.0]]) # 预测X=2.5和X=7.0时的y值 y_pred = model.predict(X_new) print(f"预测值: {y_pred.flatten()}") 评估与可视化 # 计算评估指标 y_pred_all = model.predict(X) mse = mean_squared_error(y, y_pred_all) r2 = r2_score(y, y_pred_all) print(f"MSE: {mse:.2f}, R²: {r2:.2f}") # 可视化拟合直线 plt.scatter(X, y, alpha=0.7, label='真实数据') plt.plot(X, y_pred_all, color='red', label='拟合直线') plt.xlabel("X") plt.ylabel("y") plt.legend() plt.title("线性回归拟合结果") plt.show() 输出结果: 线性回归示例数据: 线性回归拟合结果控制台输出结果
截距 (β0): 5.43 斜率 (β1): 1.91 预测值: [10.2003057 18.7865098] MSE: 3.23, R²: 0.91 3. 多元线性回归(多变量) import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 支持中文 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 from sklearn.datasets import fetch_california_housing from sklearn.model_selection import train_test_split # 加载数据集(这里以加州房价为例) data = fetch_california_housing() X = data.data # 多个特征(如收入、房龄等) y = data.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 训练模型 model = LinearRegression() model.fit(X_train, y_train) # 评估测试集 y_pred = model.predict(X_test) print(f"MSE: {mean_squared_error(y_test, y_pred):.2f}") print(f"R²: {r2_score(y_test, y_pred):.2f}") # 查看特征重要性(系数) feature_names = data.feature_names for name, coef in zip(feature_names, model.coef_): print(f"{name}: {coef:.2f}") 4. 应对线性回归的局限性 问题1:非线性关系 → 多项式回归 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 支持中文 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 from sklearn.preprocessing import PolynomialFeatures # 生成非线性数据(抛物线) np.random.seed(42) X = np.linspace(-3, 3, 100).reshape(-1, 1) y = 0.5 * X**2 + X + 2 + np.random.randn(100, 1) * 0.5 # 将特征转换为多项式(如X²) poly = PolynomialFeatures(degree=2, include_bias=False) X_poly = poly.fit_transform(X) # 训练多项式回归模型 model = LinearRegression() model.fit(X_poly, y) # 预测并可视化 X_test = np.linspace(-3, 3, 100).reshape(-1, 1) X_test_poly = poly.transform(X_test) y_pred = model.predict(X_test_poly) plt.scatter(X, y, alpha=0.7, label='真实数据') plt.plot(X_test, y_pred, color='red', label='多项式回归') plt.legend() plt.show() 输出结果: 问题2:异常值 → 鲁棒回归(Huber损失) # 异常值 → 鲁棒回归(Huber损失) import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 支持中文 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 from sklearn.linear_model import HuberRegressor # 生成带异常值的数据 X = np.random.rand(50, 1) * 10 y = 3 * X + 5 + np.random.randn(50, 1) * 2 y[45:] += 30 # 添加异常值 # 对比普通线性回归和Huber回归 model_linear = LinearRegression() model_linear.fit(X, y) model_huber = HuberRegressor() model_huber.fit(X, y.ravel()) # HuberRegressor需要y为一维数组 # 可视化对比 X_test = np.linspace(0, 10, 100).reshape(-1, 1) y_pred_linear = model_linear.predict(X_test) y_pred_huber = model_huber.predict(X_test) plt.scatter(X, y, alpha=0.7, label='数据(含异常值)') plt.plot(X_test, y_pred_linear, color='red', label='普通线性回归') plt.plot(X_test, y_pred_huber, color='green', label='Huber回归') plt.legend() plt.show() 输出结果: 问题3:多重共线性 → 岭回归 from sklearn.linear_model import Ridge from sklearn.preprocessing import StandardScaler # 生成高共线性数据(两个强相关特征) np.random.seed(42) X1 = np.random.rand(100, 1) * 10 X2 = X1 + np.random.randn(100, 1) * 0.1 # X2与X1高度相关 X = np.hstack([X1, X2]) y = 2 * X1 + 3 * X2 + 5 + np.random.randn(100, 1) * 2 # 标准化数据(岭回归对尺度敏感) scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 对比普通线性回归和岭回归 model_linear = LinearRegression() model_linear.fit(X_scaled, y) model_ridge = Ridge(alpha=10) # alpha是正则化强度 model_ridge.fit(X_scaled, y) print("普通线性回归系数:", model_linear.coef_) print("岭回归系数:", model_ridge.coef_) 输出结果:参考文献视频:点击跳转
机器学习的起点:线性回归LinearRegression由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“机器学习的起点:线性回归LinearRegression”