第 3 章 / 共 8 章

第3章:机器学习基础

机器学习是人工智能的核心分支,它让计算机能够从数据中自动学习规律并做出预测或决策。本章将详细介绍机器学习的三大范式:监督学习、无监督学习和强化学习,以及模型评估的核心指标。

3.1 监督学习

监督学习是机器学习中最常用的范式,其核心思想是从标记数据中学习输入与输出之间的映射关系。就像有一位"老师"在指导,告诉模型每个输入对应的正确答案是什么。

关键概念:监督学习需要标签数据(Labeled Data),即每个训练样本都有对应的正确输出值。

3.1.1 分类与回归的区别

监督学习根据输出变量的类型,可以分为两大类:

特性 分类(Classification) 回归(Regression)
输出类型 离散类别(如:是/否、A/B/C) 连续数值(如:价格、温度、分数)
典型问题 邮件是否为垃圾邮件?图片是猫还是狗? 房价是多少?明天温度几度?
常见算法 逻辑回归、决策树、SVM、神经网络 线性回归、岭回归、Lasso、随机森林回归
评估指标 准确率、精确率、召回率、F1-score MSE、RMSE、MAE、R²

3.1.2 实例:房价预测(回归问题)

假设我们要预测某个城市的房价,已知房屋的特征包括:面积、卧室数量、房龄、距市中心距离等。

# 房价预测 - 线性回归示例
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# 模拟数据:面积(平米)、卧室数、房龄、距离(km)
X = np.array([
    [120, 3, 5, 2.5],
    [80, 2, 10, 5.0],
    [150, 4, 2, 1.0],
    [90, 2, 8, 4.0],
    [200, 5, 1, 0.5]
])
# 对应房价(万元)
y = np.array([350, 180, 520, 220, 800])

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建并训练模型
model = LinearRegression()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估
print(f"MSE: {mean_squared_error(y_test, y_pred):.2f}")
print(f"R² Score: {r2_score(y_test, y_pred):.4f}")
实践技巧:在实际项目中,房价预测还需要考虑更多特征,如学区、交通便利度、周边配套设施等,并需要进行特征工程和异常值处理。

3.1.3 实例:邮件分类(分类问题)

垃圾邮件过滤是最经典的分类问题之一。模型需要根据邮件内容判断其属于"垃圾邮件"还是"正常邮件"。

# 邮件分类 - 朴素贝叶斯示例
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline

# 示例邮件数据
emails = [
    "恭喜你中奖了!请立即领取奖金",
    "今晚的会议安排在3楼会议室",
    "免费赠送iPhone,点击链接领取",
    "项目进度报告请查收附件",
    "限时优惠!全场5折起"
]
labels = [1, 0, 1, 0, 1]  # 1=垃圾邮件, 0=正常邮件

# 构建文本分类管道
pipeline = Pipeline([
    ('tfidf', TfidfVectorizer()),
    ('classifier', MultinomialNB())
])

# 训练模型
pipeline.fit(emails, labels)

# 预测新邮件
new_email = ["紧急通知:您的账户需要验证"]
prediction = pipeline.predict(new_email)
print(f"预测结果: {'垃圾邮件' if prediction[0] == 1 else '正常邮件'}")

3.2 无监督学习

无监督学习与监督学习的最大区别在于不需要标签数据。模型需要自己发现数据中隐藏的结构和模式,就像让学生在没有老师指导的情况下自己探索知识。

3.2.1 主要任务类型

任务类型 核心思想 典型应用
聚类 (Clustering) 将相似的数据点分组到一起,组内相似度高,组间差异大 客户分群、文档分类、图像分割
降维 (Dimensionality Reduction) 减少数据特征的维度,同时尽可能保留重要信息 数据可视化、特征压缩、去噪
关联规则 (Association Rules) 发现数据项之间的关联关系(如"如果A则B") 购物篮分析、推荐系统

3.2.2 实例:客户分群(聚类)

电商平台经常需要根据客户的消费行为进行分群,以便制定精准的营销策略。

# 客户分群 - K-Means聚类示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# 客户数据:年消费金额、购买频次、平均客单价
customers = np.array([
    [5000, 12, 420],   # 高频低额
    [20000, 5, 4000],  # 低频高额
    [3000, 8, 375],    # 普通客户
    [15000, 20, 750],  # 高价值客户
    [2000, 3, 667],    # 低频客户
    [25000, 15, 1667], # VIP客户
])

# 数据标准化
scaler = StandardScaler()
customers_scaled = scaler.fit_transform(customers)

# K-Means聚类(分为3类)
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)
clusters = kmeans.fit_predict(customers_scaled)

# 输出结果
labels = ['普通客户', '高价值客户', 'VIP客户']
for i, customer in enumerate(customers):
    print(f"客户{i+1}: {labels[clusters[i]]}")
分群结果解读:
  • 普通客户:消费金额低,频次适中,需要培养消费习惯
  • 高价值客户:消费金额高但频次低,需要提高复购率
  • VIP客户:消费金额和频次都高,需要重点维护

3.2.3 实例:数据可视化(降维)

高维数据难以直观理解,通过降维技术可以将其投影到2D或3D空间进行可视化。

# 降维可视化 - t-SNE示例
from sklearn.datasets import load_iris
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt

# 加载鸢尾花数据集(4维特征)
iris = load_iris()
X, y = iris.data, iris.target

# 使用t-SNE降至2维
tsne = TSNE(n_components=2, random_state=42)
X_2d = tsne.fit_transform(X)

# 可视化
plt.figure(figsize=(8, 6))
for i, target_name in enumerate(iris.target_names):
    plt.scatter(X_2d[y == i, 0], X_2d[y == i, 1], 
                label=target_name, alpha=0.7)
plt.legend()
plt.title('鸢尾花数据集 t-SNE 可视化')
plt.xlabel('t-SNE 维度1')
plt.ylabel('t-SNE 维度2')
plt.show()

3.3 强化学习

强化学习是一种通过与环境交互来学习最优行为策略的机器学习方法。智能体(Agent)在环境中执行动作,根据获得的奖励信号来调整策略,目标是最大化长期累积奖励。

3.3.1 核心概念

概念 说明
智能体 (Agent) 执行决策的实体,可以是游戏中的角色、机器人或交易程序
环境 (Environment) 智能体所处的外部世界,智能体与之交互并从中获取状态信息
状态 (State) 环境在某一时刻的完整描述,智能体根据状态做出决策
动作 (Action) 智能体可以执行的操作,如移动、交易、选择等
奖励 (Reward) 环境对智能体动作的即时反馈,正奖励表示鼓励,负奖励表示惩罚
策略 (Policy) 从状态到动作的映射,即智能体的"行为准则"
强化学习 vs 监督学习:监督学习需要正确答案来训练,而强化学习只需要奖励信号;监督学习是"开卷考试",强化学习是"试错学习"。

3.3.2 实例:AlphaGo

AlphaGo是强化学习最著名的成功案例,它在2016年击败了世界围棋冠军李世石。

AlphaGo的学习过程:

  1. 监督学习阶段:使用大量人类棋谱训练策略网络,学习人类棋手的走法
  2. 强化学习阶段:通过自我对弈不断优化策略,使用策略梯度方法更新网络
  3. 蒙特卡洛树搜索:结合策略网络和价值网络进行搜索,选择最优落子
# 简化版强化学习示例 - Q-Learning
import numpy as np

# 定义环境:3x3网格世界,目标是到达右下角
# 状态编号:0-8 (从左到右,从上到下)
# 动作:0=上, 1=右, 2=下, 3=左

n_states = 9
n_actions = 4

# 初始化Q表
Q = np.zeros((n_states, n_actions))

# 超参数
alpha = 0.1   # 学习率
gamma = 0.9   # 折扣因子
epsilon = 0.1 # 探索率

# 训练循环(简化版)
for episode in range(1000):
    state = 0  # 从左上角开始
    
    while state != 8:  # 未到达目标
        # ε-贪心策略
        if np.random.random() < epsilon:
            action = np.random.randint(n_actions)
        else:
            action = np.argmax(Q[state])
        
        # 执行动作,获得新状态和奖励(简化)
        # 实际实现需要定义状态转移逻辑
        next_state = state  # 占位
        reward = -1 if next_state != 8 else 10
        
        # Q值更新
        Q[state, action] += alpha * (reward + gamma * np.max(Q[next_state]) - Q[state, action])
        state = next_state

print("Q表训练完成")

3.3.3 实例:游戏AI

强化学习在游戏领域取得了巨大成功,从Atari游戏到Dota2、星际争霸等复杂游戏都有出色表现。

强化学习的优势场景:
  • 决策序列优化(需要长远规划)
  • 环境动态变化(需要自适应)
  • 难以定义明确正确答案的问题
  • 可以通过模拟快速试错的问题

3.4 模型评估

模型评估是机器学习项目中至关重要的一环。选择合适的评估指标,能够准确衡量模型性能,指导模型优化方向。

3.4.1 分类问题评估指标

首先需要理解混淆矩阵(Confusion Matrix)的四个基本元素:

  • TP(真正例):预测为正类,实际也为正类
  • TN(真负例):预测为负类,实际也为负类
  • FP(假正例):预测为正类,但实际为负类(误报)
  • FN(假负例):预测为负类,但实际为正类(漏报)
指标 公式 说明
准确率
(Accuracy)
Accuracy = (TP + TN) / (TP + TN + FP + FN) 预测正确的比例。类别不平衡时可能产生误导
精确率
(Precision)
Precision = TP / (TP + FP) 预测为正类的样本中真正为正类的比例。关注"误报"
召回率
(Recall)
Recall = TP / (TP + FN) 实际为正类的样本中被正确预测的比例。关注"漏报"
F1-Score F1 = 2 × (Precision × Recall) / (Precision + Recall) 精确率和召回率的调和平均,综合评估模型性能

3.4.2 ROC与AUC

ROC曲线(Receiver Operating Characteristic)通过绘制真正例率(TPR)假正例率(FPR)的关系,展示模型在不同阈值下的性能。

  • TPR(真正例率/召回率):TPR = TP / (TP + FN)
  • FPR(假正例率):FPR = FP / (FP + TN)
  • AUC(Area Under Curve):ROC曲线下面积,取值0-1,越接近1表示模型性能越好
# 分类模型评估指标示例
from sklearn.metrics import (
    accuracy_score, precision_score, recall_score, f1_score,
    roc_auc_score, confusion_matrix, classification_report
)
import numpy as np

# 模拟真实标签和预测结果
y_true = np.array([0, 1, 1, 0, 1, 1, 0, 0, 1, 0])
y_pred = np.array([0, 1, 0, 0, 1, 1, 0, 1, 1, 0])
y_pred_proba = np.array([0.1, 0.9, 0.4, 0.2, 0.8, 0.95, 0.3, 0.6, 0.85, 0.15])

# 计算各项指标
print("=== 基础指标 ===")
print(f"准确率 (Accuracy): {accuracy_score(y_true, y_pred):.4f}")
print(f"精确率 (Precision): {precision_score(y_true, y_pred):.4f}")
print(f"召回率 (Recall): {recall_score(y_true, y_pred):.4f}")
print(f"F1-Score: {f1_score(y_true, y_pred):.4f}")

print("\n=== ROC-AUC ===")
print(f"AUC: {roc_auc_score(y_true, y_pred_proba):.4f}")

print("\n=== 混淆矩阵 ===")
print(confusion_matrix(y_true, y_pred))
# 输出: [[TN, FP], [FN, TP]]

print("\n=== 完整报告 ===")
print(classification_report(y_true, y_pred, target_names=['负类', '正类']))

3.4.3 交叉验证

交叉验证(Cross-Validation)是评估模型泛化能力的可靠方法,能够更充分利用数据并减少随机划分带来的偏差。

K折交叉验证流程:

  1. 将数据集平均分成K份(通常K=5或10)
  2. 轮流使用其中K-1份作为训练集,剩余1份作为验证集
  3. 重复K次,确保每份都作为验证集一次
  4. 计算K次验证结果的平均值作为最终评估指标
# K折交叉验证示例
from sklearn.model_selection import cross_val_score, KFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris

# 加载数据
iris = load_iris()
X, y = iris.data, iris.target

# 创建模型
model = RandomForestClassifier(n_estimators=100, random_state=42)

# 5折交叉验证
cv_scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')

print(f"每折得分: {cv_scores}")
print(f"平均准确率: {cv_scores.mean():.4f}")
print(f"标准差: {cv_scores.std():.4f}")

# 使用分层K折(保持类别比例)
from sklearn.model_selection import StratifiedKFold

skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
cv_scores_stratified = cross_val_score(model, X, y, cv=skf, scoring='accuracy')
print(f"\n分层K折平均准确率: {cv_scores_stratified.mean():.4f}")
注意事项:
  • 类别不平衡时,准确率可能不可靠,应关注F1-score或AUC
  • 医疗诊断等场景,通常更关注召回率(减少漏诊)
  • 垃圾邮件过滤等场景,通常更关注精确率(减少误杀)
  • 交叉验证结果比单次划分更稳定,但计算成本更高
选择评估指标的建议:
  • 类别平衡:Accuracy、F1、AUC均可
  • 类别不平衡:优先使用F1-score或AUC
  • 需要概率输出:使用对数损失(Log Loss)
  • 多分类问题:使用macro/micro/weighted平均

本章介绍了机器学习的三大范式及其评估方法。理解这些基础概念后,我们将在下一章深入学习具体的经典算法实现。