机器学习监督学习入门:线性回归与决策树实战指南

线性回归:用直线拟合解决回归问题

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

机器学习监督学习入门:线性回归与决策树实战指南

原理:从损失函数到最优解

线性回归的损失函数用最小二乘法计算:
$$ 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

(0)

相关推荐