机器学习入门
机器学习入门第一课:用线性回归预测房价
很多人刚开始学机器学习的时候,容易被各种名词吓到:监督学习、损失函数、梯度下降、模型训练……
其实,机器学习最核心的一件事,就是:
根据已有数据,找到输入和输出之间的规律,然后用这个规律去预测新的结果。
这篇文章我们就从最经典的算法开始:线性回归(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. 结尾
如果你是第一次接触机器学习,我建议你不要急着往后冲。
先把线性回归真正理解透,尤其是下面这几个问题:
- 为什么模型需要训练
- 为什么要有损失函数
- 为什么模型可以预测新数据
- 一个特征和多个特征的区别是什么
当这些问题你都能自己解释清楚的时候,再去学逻辑回归、分类问题、梯度下降,进步会快很多。
下一篇我大概率会继续写:逻辑回归到底是不是回归?为什么它能做分类?
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)