机器学习:线性回归

机器学习:线性回归算法,让数据“说话”的艺术

大家好!今天我们来聊聊机器学习中的一位“老大哥”——线性回归算法。它不仅是机器学习的基础,还是我们理解监督学习流程的绝佳起点。所以,让我们从最简单的线性关系开始吧!


线性关系:数据中的“直来直去”

线性关系,顾名思义,就是两个变量之间的关系可以用一条直线来表示。比如,你每多吃一块巧克力,体重就会增加0.5公斤(别担心,这只是假设!)。这种关系可以用一个简单的数学公式表示:

$y = a x + b $

这里:

  • $ y $ 是因变量(比如体重),
  • $ x $ 是自变量(比如巧克力数量),
  • $ b $ 是截距(当 $ x = 0 $ 时 $ y $) 的值),
  • $ a $ 是斜率($ x $ 每增加一个单位,$ y $ 的变化量)。

线性关系的三大特征

  1. 直线关系:在图上画出来就是一条直线,简单明了。
  2. 固定比例变化:$ x $ 的变化会导致 $ y $ 以固定的比例变化,比如每多吃一块巧克力,体重增加0.5公斤。
  3. 可加性:多个自变量的线性关系可以叠加,比如房价不仅受面积影响,还受地段影响。

线性关系在统计学、经济学、机器学习等领域都有广泛应用。比如:

  • 回归分析:通过线性回归模型预测房价。
  • 趋势分析:分析时间序列数据中的线性趋势。
  • 优化问题:在运筹学中,线性规划问题通常基于线性关系。

单变量线性回归:从“面积”预测“房价”

让我们以房价预测为例,看看线性回归是如何工作的。假设我们有一组数据,记录了房屋面积和对应的价格:

面积(平方米) 价格(万元)
25 153
48 281
35 209
60 477
72 433
78 469
82 499
93 555
103 620

我们的目标是找到一个函数,能根据面积预测房价。这个过程叫做数据拟合,就是用数学函数去近似表示数据点的趋势。

用Python实现单变量线性回归

我们可以用Python的scikit-learn库来完成这个任务。以下是代码示例:

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

# 假设数据已经加载到DataFrame中
data = pd.DataFrame({
    '面积': [25, 48, 35, 60, 72, 78, 82, 93, 103],
    '价格': [153, 281, 209, 487, 453, 469, 499, 555, 700]
})

# 特征和标签
X = data[['面积']]
y = data['价格']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=42)

# 训练线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 输出模型参数
print(f"模型截距: {model.intercept_}")
print(f"模型系数: {model.coef_}")

# 防止乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 可视化
plt.scatter(X_test, y_test, color='blue', label='实际价格')
plt.plot(X_test, y_pred, color='red', label='预测价格')
plt.xlabel('面积 (平方米)')
plt.ylabel('价格 (万元)')
plt.title('房价预测')
plt.legend()
plt.show()

训练过程图解

graph LR A[训练集(TrainingSet)] --> B[机器学习算法(LearningAlgorithm)] B --> C[h(假设)]

通过这个模型,我们只需要知道房屋面积,就可以预测房价。是不是很简单?你已经掌握了单变量线性回归的基本操作,成为一名合格的“调包侠”了!


多变量线性回归:考虑更多因素

显然,房价不仅仅受面积影响,还可能受其他因素影响,比如距离地铁站的距离。这时,我们就需要用到多变量线性回归。模型的形式为:

$ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \beta_3 x_3 + ... + \beta_n x_n + \epsilon $

其中:

  • $ y $ 是因变量(如房价),
  • $ x_1, x_2, \dots, x_n $ 是自变量(如面积、地铁站距离等),
  • $ \beta_0 $ 是截距,
  • $ \beta_1, \beta_2, \dots, \beta_n $ 是回归系数,
  • $ \epsilon $ 是误差项。

用Python实现多变量线性回归

以下是代码示例:

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt

# 生成示例数据
np.random.seed(42)
n_samples = 100

# 生成房屋面积 (平方米)
area = np.random.randint(50, 200, size=n_samples)

# 生成距离地铁站的距离 (米)
distance_to_subway = np.random.randint(100, 2000, size=n_samples)

# 生成房价 (万元)
price = 2.5 * area - 0.02 * distance_to_subway + np.random.normal(0, 50, size=n_samples)

# 创建DataFrame
data = pd.DataFrame({
    'area': area,
    'distance_to_subway': distance_to_subway,
    'price': price
})

# 分割数据集为训练集和测试集
X = data[['area', 'distance_to_subway']]
y = data['price']
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)

# 评估模型
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"均方误差 (MSE): {mse}")
print(f"决定系数 (R^2): {r2}")

# 输出模型参数
print(f"截距 (Intercept): {model.intercept_}")
print(f"系数 (Coefficients): {model.coef_}")

# 示例预测
example = pd.DataFrame({'area': [100], 'distance_to_subway': [500]})
predicted_price = model.predict(example)
print(f"预测房价: {predicted_price[0]} 万元")

决定系数 $ R^2 $:模型的“成绩单”

决定系数($ R^2 $)是评估模型性能的重要指标:

  • 解释能力:$ R^2 $ 表示模型能够解释目标变量变化的百分比。比如 $ R^2 = 0.8 $ 表示模型能解释80%的变化。
  • 取值范围\(R^2\) 的取值范围是[0,1]:
    • $ R^2 = 1$:模型完美拟合数据。
    • $ R^2 = 0 $:模型无法解释目标变量的变化。
    • $ R^2 < 0 $:模型的表现比直接使用均值预测更差(通常表明模型有问题)。

扩展

学会调包足以应付工作,但应付不了面试,也不能拿来装B,所以了解其背后原理也不无坏处:《机器数学:最小二乘法》。

总结

通过今天的探索,我们学习了线性回归的基本概念和实现方法。无论是单变量还是多变量线性回归,它们都是机器学习中最基础也最重要的工具。掌握了这些,你就迈出了成为数据科学家的第一步!

下次再见,我们继续探索更多有趣的机器学习算法!🚀

posted @ 2025-03-24 16:22  古法编程  阅读(60)  评论(0)    收藏  举报