机器学习入门第一课:用线性回归预测房价

很多人刚开始学机器学习的时候,容易被各种名词吓到:监督学习、损失函数、梯度下降、模型训练……

其实,机器学习最核心的一件事,就是:

根据已有数据,找到输入和输出之间的规律,然后用这个规律去预测新的结果。

这篇文章我们就从最经典的算法开始:线性回归(Linear Regression)


1. 什么是线性回归

先看一个简单问题:

假设我们有一批房子的数据,知道它们的面积和价格,比如:

房屋面积(平方米) 房价(万元)
50 100
60 120
70 140
80 160

我们很容易发现,这些数据大致符合一个规律:

面积越大,房价越高。

如果把这个关系画成图,它大概会接近一条直线。
线性回归做的事情,就是找到这样一条最合适的直线,用它来描述输入和输出之间的关系。

它的表达式通常写成:

[
y = wx + b
]

这里:

  • (x) 表示输入,比如房屋面积
  • (y) 表示输出,比如房价
  • (w) 表示斜率,也就是面积每增加 1 平方米,价格大约增加多少
  • (b) 表示截距,也就是当面积为 0 时,模型给出的基础值

你可以先不用纠结公式,只要记住一句话:

线性回归就是用一条直线去拟合数据。


2. 机器学习里的“特征”和“标签”

在机器学习里,有两个词会经常出现:

特征(Feature):模型用来做判断的输入信息
标签(Label):模型想要预测的目标结果

在房价预测这个例子里:

  • 特征:房屋面积
  • 标签:房价

如果以后你做更复杂的任务,比如预测学生成绩,那么:

  • 特征可以是:学习时长、作业完成率、出勤率
  • 标签可以是:考试成绩

所以,机器学习其实就是:

让模型从“特征”和“标签”的对应关系中学习规律。


3. 模型是怎么“学会”的

既然我们想要一条直线:

[
y = wx + b
]

那问题来了:
这个 (w) 和 (b) 到底取多少才合适?

这就需要“训练”。

训练的本质就是不断调整参数 (w) 和 (b),让模型预测出来的结果,尽量接近真实值。

比如:

  • 真实房价是 140 万
  • 模型预测成了 125 万

那说明模型还不够准,需要继续调整。

为了衡量模型到底准不准,我们需要一个标准,这个标准就叫做:损失函数(Loss Function)

在线性回归里,最常见的损失函数是均方误差(Mean Squared Error, MSE)

[
MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2
]

不用被公式吓到,它表达的意思就是:

真实值和预测值差得越远,损失越大;差得越近,损失越小。

训练模型的目标,就是让这个损失尽可能小。


4. 用 Python 实现一个线性回归

下面我们直接上代码,用 scikit-learn 来实现一个简单的线性回归模型。

import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

# 1. 准备数据
# 房屋面积(平方米)
X = np.array([50, 60, 70, 80, 90]).reshape(-1, 1)

# 房价(万元)
y = np.array([100, 120, 140, 160, 180])

# 2. 创建模型
model = LinearRegression()

# 3. 训练模型
model.fit(X, y)

# 4. 查看训练好的参数
w = model.coef_[0]
b = model.intercept_

print("斜率 w =", w)
print("截距 b =", b)

# 5. 做预测
area = np.array([[75]])
pred_price = model.predict(area)

print("75 平方米房屋的预测价格 =", pred_price[0], "万元")

# 6. 可视化结果
plt.scatter(X, y, label="真实数据")
plt.plot(X, model.predict(X), label="拟合直线")
plt.xlabel("Area")
plt.ylabel("Price")
plt.legend()
plt.show()

5. 代码在做什么

这段代码其实只做了几件事。

第一步:准备数据

X = np.array([50, 60, 70, 80, 90]).reshape(-1, 1)
y = np.array([100, 120, 140, 160, 180])

这里的 X 是输入,也就是房屋面积。
y 是输出,也就是房价。

注意 reshape(-1, 1) 这一步,它的作用是把一维数组变成二维数组,因为 scikit-learn 规定输入特征必须是二维结构。


第二步:创建模型

model = LinearRegression()

这一步就是告诉程序:
我要使用线性回归模型。


第三步:训练模型

model.fit(X, y)

这是最关键的一步。

fit 的意思就是:
把数据喂给模型,让模型自己去找最合适的 (w) 和 (b)。

训练完成之后,模型就已经“学会”了面积和房价之间的大致关系。


第四步:查看参数

w = model.coef_[0]
b = model.intercept_

这里可以把模型学到的直线参数打印出来。

如果输出结果大致是:

斜率 w = 2.0
截距 b = 0.0

那就说明模型学到的关系接近:

[
y = 2x
]

也就是面积每增加 1 平方米,房价增加 2 万元。


第五步:预测新数据

area = np.array([[75]])
pred_price = model.predict(area)

这一步是让模型预测一个新房子的价格,比如 75 平方米。

这也是机器学习最核心的价值所在:

不是记住已有数据,而是对没见过的新数据做预测。


6. 为什么这就是“机器学习”

有人会问:
这不就是拟合一条直线吗,为什么叫机器学习?

因为它符合机器学习最基本的流程:

先给模型一批历史数据,让它自动从中找到规律,再拿这个规律去处理新问题。

完整流程就是:

数据 → 训练 → 得到模型 → 预测新样本

所以不要一开始就把机器学习想得太神秘。
它本质上就是:

让机器从数据中自动总结规律。

线性回归只是最简单的一种形式,但很多更复杂的算法,本质上也是沿着这个思路发展出来的。


7. 一个更真实一点的例子

现实中,房价通常不只和面积有关,还可能和很多因素有关,比如:

  • 地段
  • 楼层
  • 房龄
  • 是否靠近地铁
  • 是否学区房

这时候,线性回归就不再是一个变量,而是多个变量:

[
y = w_1x_1 + w_2x_2 + w_3x_3 + \cdots + b
]

比如:

  • (x_1):面积
  • (x_2):房龄
  • (x_3):距离地铁的距离

模型会自动学习每个因素对房价的影响程度。

这就是多元线性回归

代码写法其实也差不多,只是输入特征从一列变成多列。

import numpy as np
from sklearn.linear_model import LinearRegression

# 每一行代表一套房子
# [面积, 房龄, 距离地铁距离]
X = np.array([
    [80, 5, 1.0],
    [90, 3, 0.5],
    [70, 10, 2.0],
    [100, 2, 0.3],
    [85, 6, 1.2]
])

# 房价(万元)
y = np.array([200, 250, 180, 280, 210])

model = LinearRegression()
model.fit(X, y)

# 预测一套新房
# 面积=88, 房龄=4, 距离地铁=0.8
new_house = np.array([[88, 4, 0.8]])
pred_price = model.predict(new_house)

print("预测房价为:", pred_price[0], "万元")

这段代码说明了一件很重要的事:

机器学习并不局限于“一个输入对应一个输出”,而是可以同时处理多个影响因素。


8. 学线性回归时最容易忽略的一点

很多初学者学完线性回归之后,会觉得它太简单了,好像没什么“智能”。

但恰恰相反,线性回归是理解整个机器学习体系的最佳入口。

因为通过它,你可以真正理解:

  • 模型到底是什么
  • 训练到底在做什么
  • 预测到底是怎么来的
  • 损失函数为什么重要
  • 参数是如何影响结果的

如果这些基础概念没有建立起来,后面学逻辑回归、决策树、随机森林、神经网络,都会容易停留在“会调用库”的层面。

而线性回归最大的价值,就是帮你从一开始就建立正确的机器学习思维。


9. 一个简化版总结

学完这篇文章,至少应该记住下面这几句话:

线性回归的目标,是用一条直线去拟合数据。

机器学习的核心,是从已有数据中学习规律,再对新数据做预测。

特征是输入,标签是输出。

训练模型,本质上是在寻找一组最合适的参数,让预测误差尽可能小。

线性回归虽然简单,但它是理解整个机器学习世界的重要起点。


10. 结尾

如果你是第一次接触机器学习,我建议你不要急着往后冲。
先把线性回归真正理解透,尤其是下面这几个问题:

  • 为什么模型需要训练
  • 为什么要有损失函数
  • 为什么模型可以预测新数据
  • 一个特征和多个特征的区别是什么

当这些问题你都能自己解释清楚的时候,再去学逻辑回归、分类问题、梯度下降,进步会快很多。

下一篇我大概率会继续写:逻辑回归到底是不是回归?为什么它能做分类?

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐