【机器学习学习笔记】线性回归实现与应用

发布于:2025-09-05 ⋅ 阅读:(20) ⋅ 点赞:(0)

零基础学线性回归:从原理到实战

对于零基础的同学来说,“线性回归” 听起来可能很复杂,但其实它是机器学习里最基础、最容易理解的方法之一,核心就是用一条直线(或平面)去 “贴合” 数据,帮我们做预测。下面我们用 “卖房子” 这个生活场景,一步步把线性回归的知识拆明白。

一、先搞懂:线性回归能解决什么问题?

首先要明确:线性回归是用来解决 “预测连续值” 的问题。
比如:根据房屋面积预测房价(房价是连续的,不是 “涨 / 跌” 这种二选一的结果)、根据身高预测体重、根据广告投入预测销售额等。

我们从最常见的 “房屋面积→房价” 例子入手,先看一组真实的对应数据(10 套房子):

房屋面积(平方米) 56 72 69 88 102 86 76 79 94 74
房价(万元) 92 102 86 110 130 99 96 102 105 92

如果把这些数据画在图上(横坐标是面积,纵坐标是房价),会看到 10 个 “散点”—— 这就是我们的原始数据。现在的问题是:如果我有一套 150 平米的房子要卖,怎么根据这些数据预估价格?

二、核心思想:找一条 “最贴合” 数据的直线

线性回归的核心,就是在这些散点中画一条直线,让这条直线尽可能 “靠近” 所有点 —— 这条直线就是 “拟合直线”,用它来做预测最准确。

1. 这条直线怎么表示?

我们上学时学过 “一元一次方程”:y = w₀ + w₁×x,这里的直线就是这个形式:

  • x:自变量(比如房屋面积,是我们已知的)
  • y:因变量(比如房价,是我们要预测的)
  • w₀:截距(直线与 y 轴的交点,不用纠结含义,是计算出来的参数)
  • w₁:斜率(表示 x 每增加 1,y 平均增加多少。比如 w₁=0.8,就是面积每多 1 平米,房价平均多 0.8 万元)

2. 为什么是这条直线,不是别的?

比如下图里,红色直线和两条绿色虚线都能 “大概贴合” 数据,但红色直线是 “最好” 的 —— 怎么判断 “最好”?

答案是:让所有点到直线的 “误差总和最小”
每个点到直线的距离(其实是 “真实房价 - 直线预测的房价”)就是 “误差”,但直接加误差会有正有负(比如有的点在直线上方,误差为正;有的在下方,误差为负),会抵消。所以我们用 “误差的平方和” 来计算(平方后所有误差都是正数,不会抵消)—— 这个 “误差平方和” 就是 “损失函数”,我们要找的就是让这个损失函数最小的直线。

三、怎么算出直线的参数(w₀和 w₁)?

要找 “损失最小” 的直线,本质是计算出 w₀和 w₁的具体数值。这里有两种方法,我们不用纠结复杂公式,重点理解逻辑。

方法 1:最小二乘法(手动计算思路)

“最小二乘” 就是 “最小化误差平方和” 的意思,数学家已经推导出直接计算 w₀和 w₁的公式(不用自己推,直接用):

  • 先算 w₁(斜率):用所有 x、y 的总和、x×y 的总和等代入公式(代码里会自动算)
  • 再算 w₀(截距):用 w₁和 x、y 的平均值代入公式

比如用我们的 10 套房子数据,代入公式后能算出:
w₀≈51.9(截距),w₁≈0.68(斜率)
所以拟合直线就是:房价 = 51.9 + 0.68×面积

方法 2:用代码自动算(不用手动算公式)

实际中我们不会手动算公式,而是用 Python 代码调用工具包,3 步就能出结果:

  1. 导入工具(numpy 用于计算,matplotlib 用于画图)
  2. 输入数据(x 是面积,y 是房价)
  3. 调用函数计算 w₀和 w₁

代码示例(不用纠结细节,知道能出结果就行):

import numpy as np

# 1. 输入数据(房屋面积x,房价y)
x = np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74])
y = np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])

# 2. 定义计算w0和w1的函数(背后就是最小二乘公式)
def calculate_w(x, y):
    n = len(x)  # 数据总数(10套房子)
    w1 = (n*sum(x*y) - sum(x)*sum(y)) / (n*sum(x*x) - sum(x)*sum(x))
    w0 = (sum(x*x)*sum(y) - sum(x)*sum(x*y)) / (n*sum(x*x) - sum(x)*sum(x))
    return w0, w1

# 3. 计算并输出结果
w0, w1 = calculate_w(x, y)
print("w0(截距):", w0)  # 输出约51.9
print("w1(斜率):", w1)  # 输出约0.68

四、用直线做预测:150 平米的房子值多少钱?

有了拟合直线房价 = 51.9 + 0.68×面积,预测就很简单了 —— 把 “150 平米” 代入 x:
房价 = 51.9 + 0.68×150 ≈ 154万元

代码里也能直接算:

# 定义直线公式(预测函数)
def predict_price(area, w0, w1):
    return w0 + w1 * area

# 预测150平米的房价
price = predict_price(150, w0, w1)
print("150平米房价预估:", price)  # 输出约154万元

五、更简单的方式:用现成工具包(scikit-learn)

上面是 “手动实现” 线性回归,实际工作中我们会用成熟的工具包(比如 scikit-learn,简称 sklearn),代码更简单,还能处理更复杂的数据(比如多个特征)。

用 sklearn 做线性回归的 3 步:

  1. 导入 sklearn 的线性回归工具
  2. 准备数据(注意:sklearn 要求 x 是 “二维数据”,比如把 [56,72,...] 变成 [[56],[72],...])
  3. 训练模型→得到 w0 和 w1→做预测

代码示例:

from sklearn.linear_model import LinearRegression
import numpy as np

# 1. 准备数据(x要改成二维)
x = np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74]).reshape(-1, 1)  # 改成10行1列
y = np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])

# 2. 训练模型
model = LinearRegression()  # 初始化模型
model.fit(x, y)  # 用数据训练模型(找w0和w1)

# 3. 查看参数和预测
print("w0(截距):", model.intercept_)  # 输出约51.9(和之前一致)
print("w1(斜率):", model.coef_[0])   # 输出约0.68(和之前一致)
print("150平米预估房价:", model.predict([[150]]))  # 输出约154万元

六、进阶:用多个特征预测(比如不止看面积)

前面只用到 “房屋面积” 一个特征(叫 “一元线性回归”),但实际预测房价时,还会看 “犯罪率”“平均房间数”“低收入人群比例” 等多个特征(叫 “多元线性回归”)。

比如用 “波士顿房价数据集”(真实的房价数据,包含 13 个特征),我们选 3 个关键特征:

  • CRIM:城镇犯罪率
  • RM:住宅平均房间数
  • LSTAT:低收入人群比例

多元线性回归的步骤:

  1. 加载真实数据集
  2. 拆分数据:70% 用于 “训练模型”(让模型学规律),30% 用于 “测试模型”(看模型准不准)
  3. 用 sklearn 训练模型→预测→评估准确性
关键:怎么评估模型准不准?

用两个常用指标(值越小,模型越准):

  • MAE(平均绝对误差):所有预测值和真实值的 “绝对差值” 的平均值(比如 MAE=2,就是平均每次预测差 2 万元)
  • MSE(均方误差):所有预测值和真实值的 “差值平方” 的平均值(对大误差更敏感,比如差 10 万比差 5 万的影响大很多)

代码示例(核心部分):

import pandas as pd
from sklearn.linear_model import LinearRegression
import numpy as np

# 1. 加载波士顿房价数据集
df = pd.read_csv("https://labfile.oss.aliyuncs.com/courses/1081/course-5-boston.csv")

# 2. 选3个特征和目标值(房价)
features = df[['crim', 'rm', 'lstat']]  # 3个特征
target = df['medv']  # 目标值(房价)

# 3. 拆分训练集(70%)和测试集(30%)
split_num = int(len(features)*0.7)  # 70%的位置
X_train = features[:split_num]  # 训练集特征
y_train = target[:split_num]    # 训练集房价(真实值)
X_test = features[split_num:]   # 测试集特征
y_test = target[split_num:]     # 测试集房价(真实值)

# 4. 训练模型并预测
model = LinearRegression()
model.fit(X_train, y_train)  # 用训练集学习
preds = model.predict(X_test)  # 用测试集预测

# 5. 计算MAE和MSE(评估模型)
def mae(y_true, y_pred):
    return sum(np.abs(y_true - y_pred))/len(y_true)

def mse(y_true, y_pred):
    return sum(np.square(y_true - y_pred))/len(y_true)

print("MAE(平均绝对误差):", mae(y_test, preds))  # 比如输出13(平均差13万元)
print("MSE(均方误差):", mse(y_test, preds))     # 比如输出300

这里 MAE=13 看起来有点大,是因为我们没对数据做预处理(比如去除异常值、统一数据范围),但这不影响我们理解线性回归的核心 ——用多个特征的线性组合来预测连续值

七、总结:线性回归的核心逻辑

  1. 问题类型:预测连续值(如房价、销售额)
  2. 核心思想:找一条直线(或平面,对应多个特征),让所有数据点到直线的 “误差平方和最小”
  3. 关键步骤
    • 准备数据(特征 x 和目标值 y)
    • 用最小二乘法(或工具包)计算直线参数(w₀、w₁...)
    • 用直线做预测
    • 用 MAE/MSE 评估模型准确性
  4. 工具:简单场景用 numpy 手动实现,复杂场景用 sklearn

通过 “卖房子” 这个例子,我们从 “找直线” 到 “用工具包”,一步步理解了线性回归。它是机器学习的入门基础,学会了它,再学其他算法(比如决策树、神经网络)会更容易 —— 因为很多算法的核心逻辑(定义损失函数、找最优解)和线性回归是相通的。


网站公告

今日签到

点亮在社区的每一天
去签到