线性回归:用直线拟合解决回归问题
线性回归是监督学习中最基础的回归算法——核心目标是找到一条“最优直线(或超平面)”,让预测值与真实值的误差最小。比如预测房价时,我们假设“房价=面积×系数+地段×系数+…+偏置项”,通过数据训练找出这些系数。

原理:从损失函数到最优解
线性回归的损失函数用最小二乘法计算:
$$ Loss = frac{1}{n}sum_{i=1}^n (y_i – hat{y}_i)^2 $$
其中$hat{y}_i = w cdot x_i + b$($w$是权重系数,$b$是偏置)。我们的目标是让Loss最小,数学上通过求导找极值——对$w$和$b$分别求导,令导数为0,解出最优的$w$和$b$。
实战:用Python预测加州房价
你可以用scikit-learn(sklearn)快速实现线性回归,以加州房价数据集(2025年仍常用的公开数据集)为例:
# 1. 导入库与数据
from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
# 加载数据(包含8个特征:收入、房屋年龄、房间数等)
data = fetch_california_housing()
X = data.data # 特征矩阵
y = data.target # 目标变量(房价,单位:万美元)
# 2. 拆分训练集与测试集(8:2)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42 # random_state固定拆分结果
)
# 3. 训练模型
model = LinearRegression()
model.fit(X_train, y_train) # 用训练数据拟合模型
# 4. 预测与评估
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred) # 均方误差(越小越好)
r2 = r2_score(y_test, y_pred) # 决定系数(越接近1越好)
print(f"测试集MSE:{mse:.2f}") # 输出示例:0.55
print(f"测试集R²:{r2:.2f}") # 输出示例:0.59
小技巧:用正则化避免过拟合
如果模型在训练集表现好、测试集差(过拟合),可以用Ridge(L2正则)或Lasso(L1正则)限制系数大小:
from sklearn.linear_model import RidgeCV # 带交叉验证的Ridge
# 自动选择最优正则化参数alpha
ridge_model = RidgeCV(alphas=[0.1, 1, 10])
ridge_model.fit(X_train, y_train)
print(f"最优alpha:{ridge_model.alpha_}")
print(f"R²得分:{ridge_model.score(X_test, y_test):.2f}")
决策树:用树形结构做“选择题”
决策树是监督学习中最直观的算法——像玩“20问游戏”:通过一系列“是/否”的问题(特征分裂),最终将样本分到某个类别(分类任务)或给出数值(回归任务)。比如判断“这朵花是不是鸢尾花”,会问“花瓣长度>5cm?”“花萼宽度<3cm?”,一步步缩小范围。
核心概念:熵与信息增益
决策树的分裂依据是信息增益——衡量“分裂后数据的混乱程度降低了多少”。混乱程度用熵(Entropy)计算:
$$ Entropy(S) = -sum_{i=1}^c p_i log_2 p_i $$
其中$p_i$是样本属于第$i$类的概率。熵越大,数据越混乱(比如一半是猫、一半是狗,熵=1;全是猫,熵=0)。
信息增益公式:
$$ IG(S, A) = Entropy(S) – sum_{v in Values(A)} frac{|S_v|}{|S|} Entropy(S_v) $$
$A$是特征,$S_v$是特征$A$取$v$值的样本子集。信息增益越大,说明该特征越能“区分样本”,优先作为分裂特征。
实战:用决策树分类鸢尾花
以鸢尾花数据集(3类花,4个特征:花瓣长度、花萼宽度等)为例,实现分类:
# 1. 导入库与数据
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
# 加载数据(特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度;类别:0=山鸢尾,1=变色鸢尾,2=维吉尼亚鸢尾)
iris = load_iris()
X = iris.data
y = iris.target
# 2. 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 3. 训练模型(限制树深度避免过拟合)
dt_model = DecisionTreeClassifier(
max_depth=3, # 树的最大深度(建议3-5,防止过拟合)
random_state=42
)
dt_model.fit(X_train, y_train)
# 4. 预测与评估
y_pred = dt_model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"决策树准确率:{accuracy:.2f}") # 输出示例:0.97(几乎完美分类)
# 5. 可视化决策树(直观看分裂逻辑)
plt.figure(figsize=(12, 8))
plot_tree(
dt_model,
feature_names=iris.feature_names, # 特征名称
class_names=iris.target_names, # 类别名称
filled=True, # 用颜色填充节点(越亮代表纯度越高)
rounded=True # 圆角矩形
)
plt.show()
运行代码后,你会看到一棵清晰的树:根节点是“花瓣长度≤2.45cm?”——这是信息增益最大的特征,直接把“山鸢尾”(0类)分了出来(因为山鸢尾的花瓣长度普遍很短)。
线性回归vs决策树:该选哪个?
很多初学者会问:“我该用线性回归还是决策树?”先看这张对比表:
维度 | 线性回归 | 决策树 |
---|---|---|
适用任务 | 回归(连续值预测,如房价) | 分类/回归(更擅长分类) |
特征要求 | 需处理异常值(误差会放大) | 不敏感(树会忽略异常值) |
归一化 | 可选(改善收敛速度) | 无需(树形结构不依赖尺度) |
过拟合风险 | 低(线性模型简单) | 高(需剪枝,如max_depth) |
可解释性 | 高(看系数:正系数=特征与目标正相关) | 极高(可视化树结构,能说清“为什么预测这个结果”) |
举个例子:
- 预测“用户下个月的消费金额”:用线性回归(连续值,特征与消费可能线性相关);
- 判断“用户会不会点击广告”:用决策树(分类任务,树能捕捉“年龄>30且浏览时长>5分钟”这样的组合特征);
- 如果特征与目标是非线性关系(比如“年龄增长到30岁后,消费金额下降”):用决策树(线性模型无法捕捉非线性)。
最后:从“跑通代码”到“理解本质”
学习监督学习的关键不是“记住代码”,而是理解算法的“决策逻辑”:
– 线性回归:用“加权求和”做预测,适合特征与目标线性相关的场景;
– 决策树:用“分而治之”做决策,适合捕捉特征间的非线性关系。
你可以试着修改代码中的参数(比如线性回归的正则化系数、决策树的max_depth),观察结果变化——比如把决策树的max_depth改成10,会发现测试集准确率下降(过拟合了),这就是“树太深导致记住了训练集噪音”。
下次遇到问题时,先问自己:“这是回归还是分类任务?特征与目标是线性还是非线性?”再选算法,比“随便试”更高效。
原创文章,作者:,如若转载,请注明出处:https://zube.cn/archives/211