1.1 什么是机器学习

机器学习(Machine Learning, ML)是人工智能的一个分支,它使计算机能够在没有明确编程的情况下学习和改进。机器学习算法通过分析数据来识别模式,并使用这些模式对新数据进行预测或决策。

1.1.1 机器学习的定义

传统定义:机器学习是一种让计算机系统能够自动学习并改进性能的方法,而无需明确编程。

现代定义:机器学习是一种数据驱动的方法,通过算法从数据中学习模式,并使用这些模式对未见过的数据进行预测或分类。

1.1.2 机器学习 vs 传统编程

传统编程 机器学习
程序员编写规则 算法从数据中学习规则
输入数据 + 程序 = 输出 输入数据 + 输出 = 程序
逻辑明确 模式发现
适用于规则明确的问题 适用于复杂模式识别

1.1.3 机器学习的应用领域

  1. 计算机视觉:图像识别、人脸识别、医学影像分析
  2. 自然语言处理:机器翻译、情感分析、聊天机器人
  3. 推荐系统:电商推荐、内容推荐、广告投放
  4. 金融科技:风险评估、欺诈检测、算法交易
  5. 医疗健康:疾病诊断、药物发现、个性化治疗
  6. 自动驾驶:路径规划、障碍物检测、决策系统

1.2 机器学习的类型

1.2.1 监督学习(Supervised Learning)

监督学习使用标记的训练数据来学习输入和输出之间的映射关系。

特点: - 有标记的训练数据 - 目标是学习输入到输出的映射 - 可以评估模型性能

主要任务

分类(Classification)

预测离散的类别标签。

示例: - 邮件垃圾分类(垃圾邮件 vs 正常邮件) - 图像分类(猫 vs 狗) - 疾病诊断(患病 vs 健康)

常用算法: - 逻辑回归(Logistic Regression) - 决策树(Decision Tree) - 随机森林(Random Forest) - 支持向量机(SVM) - 神经网络(Neural Networks)

回归(Regression)

预测连续的数值。

示例: - 房价预测 - 股票价格预测 - 销售额预测

常用算法: - 线性回归(Linear Regression) - 多项式回归(Polynomial Regression) - 岭回归(Ridge Regression) - 支持向量回归(SVR)

1.2.2 无监督学习(Unsupervised Learning)

无监督学习从无标记的数据中发现隐藏的模式和结构。

特点: - 无标记的训练数据 - 目标是发现数据中的模式 - 难以直接评估性能

主要任务

聚类(Clustering)

将相似的数据点分组。

示例: - 客户细分 - 基因序列分析 - 图像分割

常用算法: - K-Means - 层次聚类(Hierarchical Clustering) - DBSCAN - 高斯混合模型(GMM)

降维(Dimensionality Reduction)

减少数据的特征数量,保留重要信息。

示例: - 数据可视化 - 特征选择 - 噪声去除

常用算法: - 主成分分析(PCA) - t-SNE - 线性判别分析(LDA)

关联规则学习(Association Rule Learning)

发现数据项之间的关联关系。

示例: - 购物篮分析 - 网页点击模式 - 基因关联分析

常用算法: - Apriori算法 - FP-Growth算法

1.2.3 强化学习(Reinforcement Learning)

强化学习通过与环境交互来学习最优行为策略。

特点: - 通过试错学习 - 有奖励信号 - 目标是最大化累积奖励

主要组件: - 智能体(Agent):学习者或决策者 - 环境(Environment):智能体交互的世界 - 状态(State):环境的当前情况 - 动作(Action):智能体可以执行的操作 - 奖励(Reward):环境给予的反馈

应用示例: - 游戏AI(AlphaGo、Dota 2) - 自动驾驶 - 机器人控制 - 推荐系统优化

常用算法: - Q-Learning - Deep Q-Network (DQN) - Policy Gradient - Actor-Critic

1.2.4 半监督学习(Semi-supervised Learning)

半监督学习结合了少量标记数据和大量无标记数据。

特点: - 部分数据有标记 - 利用无标记数据改进性能 - 适用于标记成本高的场景

应用场景: - 文本分类(少量标记文档) - 图像识别(少量标记图片) - 语音识别

1.3 机器学习的工作流程

1.3.1 典型的机器学习项目流程

1. 问题定义 → 2. 数据收集 → 3. 数据预处理 → 4. 特征工程 → 
5. 模型选择 → 6. 模型训练 → 7. 模型评估 → 8. 模型优化 → 
9. 模型部署 → 10. 监控维护

1.3.2 详细步骤说明

1. 问题定义

  • 明确业务目标
  • 确定问题类型(分类、回归、聚类等)
  • 定义成功指标
  • 评估可行性

2. 数据收集

  • 确定数据源
  • 收集相关数据
  • 评估数据质量
  • 考虑数据隐私和合规性

3. 数据预处理

  • 数据清洗(处理缺失值、异常值)
  • 数据格式统一
  • 数据类型转换
  • 数据集成

4. 特征工程

  • 特征选择
  • 特征创建
  • 特征变换
  • 特征缩放

5. 模型选择

  • 选择合适的算法
  • 考虑数据特点
  • 平衡性能和复杂度
  • 设置基线模型

6. 模型训练

  • 划分训练集和测试集
  • 训练模型
  • 调整超参数
  • 交叉验证

7. 模型评估

  • 选择评估指标
  • 在测试集上评估
  • 分析模型性能
  • 识别改进空间

8. 模型优化

  • 超参数调优
  • 特征工程优化
  • 模型集成
  • 算法改进

9. 模型部署

  • 选择部署平台
  • 模型打包
  • API开发
  • 性能监控

10. 监控维护

  • 性能监控
  • 数据漂移检测
  • 模型更新
  • 持续改进

1.4 机器学习的核心概念

1.4.1 训练集、验证集和测试集

训练集(Training Set)

  • 用途:训练模型参数
  • 比例:通常占总数据的60-80%
  • 特点:模型直接学习的数据

验证集(Validation Set)

  • 用途:调整超参数,选择模型
  • 比例:通常占总数据的10-20%
  • 特点:用于模型选择,不参与训练

测试集(Test Set)

  • 用途:评估最终模型性能
  • 比例:通常占总数据的10-20%
  • 特点:模型从未见过的数据,用于最终评估
# 数据集划分示例
from sklearn.model_selection import train_test_split

# 首先分离出测试集
X_temp, X_test, y_temp, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 再从剩余数据中分离训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(
    X_temp, y_temp, test_size=0.25, random_state=42  # 0.25 * 0.8 = 0.2
)

print(f"训练集大小: {len(X_train)}")
print(f"验证集大小: {len(X_val)}")
print(f"测试集大小: {len(X_test)}")

1.4.2 过拟合和欠拟合

过拟合(Overfitting)

模型在训练数据上表现很好,但在新数据上表现较差。

特征: - 训练误差很小 - 验证误差较大 - 训练误差和验证误差差距很大

原因: - 模型过于复杂 - 训练数据不足 - 训练时间过长

解决方法: - 增加训练数据 - 简化模型 - 正则化 - 早停(Early Stopping) - Dropout(神经网络)

欠拟合(Underfitting)

模型过于简单,无法捕捉数据中的模式。

特征: - 训练误差较大 - 验证误差也较大 - 训练误差和验证误差都很高

原因: - 模型过于简单 - 特征不足 - 训练不充分

解决方法: - 增加模型复杂度 - 增加特征 - 减少正则化 - 增加训练时间

偏差-方差权衡(Bias-Variance Tradeoff)

偏差(Bias): - 模型预测值与真实值的差异 - 高偏差导致欠拟合 - 简单模型通常有高偏差

方差(Variance): - 模型对训练数据变化的敏感性 - 高方差导致过拟合 - 复杂模型通常有高方差

权衡: - 降低偏差通常会增加方差 - 降低方差通常会增加偏差 - 目标是找到最佳平衡点

1.4.3 交叉验证(Cross-Validation)

交叉验证是一种评估模型性能的技术,通过多次划分数据来获得更可靠的性能估计。

K折交叉验证(K-Fold Cross-Validation)

from sklearn.model_selection import cross_val_score, KFold
from sklearn.linear_model import LogisticRegression

# 创建模型
model = LogisticRegression()

# 5折交叉验证
kfold = KFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=kfold, scoring='accuracy')

print(f"交叉验证分数: {scores}")
print(f"平均分数: {scores.mean():.3f}")
print(f"标准差: {scores.std():.3f}")

分层交叉验证(Stratified Cross-Validation)

保持每折中各类别的比例与原数据集相同。

from sklearn.model_selection import StratifiedKFold

# 分层5折交叉验证
skfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=skfold, scoring='accuracy')

print(f"分层交叉验证分数: {scores}")
print(f"平均分数: {scores.mean():.3f}")

留一交叉验证(Leave-One-Out Cross-Validation)

每次只留一个样本作为验证集。

from sklearn.model_selection import LeaveOneOut

# 留一交叉验证
loo = LeaveOneOut()
scores = cross_val_score(model, X, y, cv=loo, scoring='accuracy')

print(f"留一交叉验证平均分数: {scores.mean():.3f}")

1.5 机器学习的数学基础

1.5.1 线性代数基础

向量(Vector)

向量是具有大小和方向的量,在机器学习中用于表示特征。

import numpy as np

# 创建向量
v1 = np.array([1, 2, 3])
v2 = np.array([4, 5, 6])

# 向量运算
print(f"向量加法: {v1 + v2}")
print(f"向量点积: {np.dot(v1, v2)}")
print(f"向量长度: {np.linalg.norm(v1)}")

矩阵(Matrix)

矩阵用于表示数据集和模型参数。

# 创建矩阵
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

# 矩阵运算
print(f"矩阵乘法:\n{np.dot(A, B)}")
print(f"矩阵转置:\n{A.T}")
print(f"矩阵逆:\n{np.linalg.inv(A)}")

1.5.2 概率与统计

概率基础

  • 概率:事件发生的可能性,取值范围[0, 1]
  • 条件概率:P(A|B) = P(A∩B) / P(B)
  • 贝叶斯定理:P(A|B) = P(B|A) × P(A) / P(B)

常用分布

import matplotlib.pyplot as plt
from scipy import stats

# 正态分布
x = np.linspace(-4, 4, 100)
y_normal = stats.norm.pdf(x, 0, 1)

# 绘制正态分布
plt.figure(figsize=(10, 6))
plt.plot(x, y_normal, label='正态分布 N(0,1)')
plt.xlabel('x')
plt.ylabel('概率密度')
plt.title('正态分布')
plt.legend()
plt.grid(True)
plt.show()

1.5.3 微积分基础

导数

导数表示函数的变化率,在机器学习中用于优化。

# 数值求导示例
def f(x):
    return x**2 + 2*x + 1

def numerical_derivative(f, x, h=1e-5):
    return (f(x + h) - f(x - h)) / (2 * h)

# 计算导数
x = 2
derivative = numerical_derivative(f, x)
print(f"f'({x}) ≈ {derivative}")

梯度下降

梯度下降是机器学习中最重要的优化算法。

def gradient_descent(f, df, x0, learning_rate=0.01, max_iterations=1000):
    """
    梯度下降算法
    
    参数:
    f: 目标函数
    df: 目标函数的导数
    x0: 初始点
    learning_rate: 学习率
    max_iterations: 最大迭代次数
    """
    x = x0
    history = [x]
    
    for i in range(max_iterations):
        gradient = df(x)
        x = x - learning_rate * gradient
        history.append(x)
        
        # 收敛检查
        if abs(gradient) < 1e-6:
            break
    
    return x, history

# 示例:最小化 f(x) = x^2
def f(x):
    return x**2

def df(x):
    return 2*x

# 运行梯度下降
result, history = gradient_descent(f, df, x0=5, learning_rate=0.1)
print(f"最优解: {result}")
print(f"迭代次数: {len(history)}")

1.6 Python机器学习生态系统

1.6.1 核心库介绍

NumPy

数值计算基础库,提供多维数组和数学函数。

import numpy as np

# 创建数组
arr = np.array([1, 2, 3, 4, 5])
matrix = np.array([[1, 2], [3, 4]])

# 数组操作
print(f"数组形状: {arr.shape}")
print(f"矩阵形状: {matrix.shape}")
print(f"数组求和: {np.sum(arr)}")
print(f"矩阵转置:\n{matrix.T}")

Pandas

数据处理和分析库,提供DataFrame数据结构。

import pandas as pd

# 创建DataFrame
data = {
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [25, 30, 35],
    'salary': [50000, 60000, 70000]
}
df = pd.DataFrame(data)

# 数据操作
print(df.head())
print(f"平均年龄: {df['age'].mean()}")
print(f"数据描述:\n{df.describe()}")

Matplotlib

数据可视化库。

import matplotlib.pyplot as plt

# 创建图表
x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.figure(figsize=(10, 6))
plt.plot(x, y, label='sin(x)')
plt.xlabel('x')
plt.ylabel('y')
plt.title('正弦函数')
plt.legend()
plt.grid(True)
plt.show()

Scikit-learn

机器学习算法库。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

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

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 训练模型
model = LogisticRegression()
model.fit(X_train, y_train)

# 预测和评估
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率: {accuracy:.3f}")

1.6.2 环境配置

使用Anaconda

# 创建虚拟环境
conda create -n ml_env python=3.8

# 激活环境
conda activate ml_env

# 安装常用包
conda install numpy pandas matplotlib scikit-learn jupyter

# 安装深度学习框架
conda install tensorflow pytorch

使用pip

# 创建虚拟环境
python -m venv ml_env

# 激活环境(Windows)
ml_env\Scripts\activate

# 激活环境(Linux/Mac)
source ml_env/bin/activate

# 安装包
pip install numpy pandas matplotlib scikit-learn jupyter
pip install tensorflow torch

1.7 第一个机器学习项目

1.7.1 项目:鸢尾花分类

我们将使用著名的鸢尾花数据集来构建第一个机器学习模型。

# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import seaborn as sns

# 1. 加载数据
iris = load_iris()
X = iris.data  # 特征
y = iris.target  # 标签
feature_names = iris.feature_names
target_names = iris.target_names

print(f"数据集形状: {X.shape}")
print(f"特征名称: {feature_names}")
print(f"类别名称: {target_names}")

# 2. 数据探索
# 创建DataFrame便于分析
df = pd.DataFrame(X, columns=feature_names)
df['target'] = y
df['species'] = df['target'].map({0: 'setosa', 1: 'versicolor', 2: 'virginica'})

print("\n数据前5行:")
print(df.head())

print("\n数据统计信息:")
print(df.describe())

print("\n各类别数量:")
print(df['species'].value_counts())

# 3. 数据可视化
plt.figure(figsize=(15, 10))

# 特征分布
for i, feature in enumerate(feature_names):
    plt.subplot(2, 3, i+1)
    for species in target_names:
        data = df[df['species'] == species][feature]
        plt.hist(data, alpha=0.7, label=species, bins=20)
    plt.xlabel(feature)
    plt.ylabel('频率')
    plt.title(f'{feature} 分布')
    plt.legend()

# 特征散点图
plt.subplot(2, 3, 5)
for i, species in enumerate(target_names):
    data = df[df['species'] == species]
    plt.scatter(data['sepal length (cm)'], data['sepal width (cm)'], 
               label=species, alpha=0.7)
plt.xlabel('花萼长度 (cm)')
plt.ylabel('花萼宽度 (cm)')
plt.title('花萼长度 vs 宽度')
plt.legend()

plt.subplot(2, 3, 6)
for i, species in enumerate(target_names):
    data = df[df['species'] == species]
    plt.scatter(data['petal length (cm)'], data['petal width (cm)'], 
               label=species, alpha=0.7)
plt.xlabel('花瓣长度 (cm)')
plt.ylabel('花瓣宽度 (cm)')
plt.title('花瓣长度 vs 宽度')
plt.legend()

plt.tight_layout()
plt.show()

# 4. 数据预处理
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

print(f"\n训练集大小: {X_train.shape}")
print(f"测试集大小: {X_test.shape}")

# 5. 模型训练
model = LogisticRegression(random_state=42)
model.fit(X_train, y_train)

# 6. 模型预测
y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)

# 7. 模型评估
train_accuracy = accuracy_score(y_train, y_train_pred)
test_accuracy = accuracy_score(y_test, y_test_pred)

print(f"\n训练集准确率: {train_accuracy:.3f}")
print(f"测试集准确率: {test_accuracy:.3f}")

# 详细分类报告
print("\n分类报告:")
print(classification_report(y_test, y_test_pred, target_names=target_names))

# 混淆矩阵
cm = confusion_matrix(y_test, y_test_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', 
            xticklabels=target_names, yticklabels=target_names)
plt.title('混淆矩阵')
plt.xlabel('预测标签')
plt.ylabel('真实标签')
plt.show()

# 8. 特征重要性
feature_importance = abs(model.coef_[0])
plt.figure(figsize=(10, 6))
plt.bar(feature_names, feature_importance)
plt.title('特征重要性')
plt.xlabel('特征')
plt.ylabel('重要性')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

# 9. 预测新样本
new_sample = np.array([[5.1, 3.5, 1.4, 0.2]])  # 新的鸢尾花样本
prediction = model.predict(new_sample)
probability = model.predict_proba(new_sample)

print(f"\n新样本预测:")
print(f"特征值: {new_sample[0]}")
print(f"预测类别: {target_names[prediction[0]]}")
print(f"预测概率: {dict(zip(target_names, probability[0]))}")

1.7.2 项目总结

通过这个简单的项目,我们学习了:

  1. 数据加载:使用sklearn加载内置数据集
  2. 数据探索:查看数据形状、统计信息、类别分布
  3. 数据可视化:使用matplotlib和seaborn创建图表
  4. 数据预处理:划分训练集和测试集
  5. 模型训练:使用逻辑回归算法
  6. 模型评估:计算准确率、查看分类报告和混淆矩阵
  7. 结果解释:分析特征重要性
  8. 模型应用:对新样本进行预测

1.8 本章小结

本章介绍了机器学习的基础概念,包括:

核心概念

  • 机器学习定义:让计算机从数据中学习模式的方法
  • 学习类型:监督学习、无监督学习、强化学习、半监督学习
  • 主要任务:分类、回归、聚类、降维、关联规则学习

重要原理

  • 训练流程:从问题定义到模型部署的完整流程
  • 数据划分:训练集、验证集、测试集的作用和划分方法
  • 模型评估:过拟合、欠拟合、偏差-方差权衡
  • 交叉验证:获得更可靠的性能评估

技术基础

  • 数学基础:线性代数、概率统计、微积分
  • Python生态:NumPy、Pandas、Matplotlib、Scikit-learn
  • 实践项目:鸢尾花分类的完整实现

下一章预告

下一章我们将深入学习数据预处理与特征工程,包括: - 数据清洗技术 - 缺失值处理 - 异常值检测 - 特征选择和创建 - 数据标准化和归一化 - 类别变量编码

1.9 练习题

基础练习

  1. 概念理解

    • 解释监督学习和无监督学习的区别
    • 举例说明分类和回归问题的不同
    • 什么是过拟合?如何避免?
  2. 数据集划分

    # 给定1000个样本,按照6:2:2的比例划分训练集、验证集、测试集
    # 请编写代码实现
    
    1. 交叉验证

      # 使用5折交叉验证评估逻辑回归模型在鸢尾花数据集上的性能
      # 计算平均准确率和标准差
      

进阶练习

  1. 数据探索

    • 加载波士顿房价数据集
    • 分析特征分布和相关性
    • 创建可视化图表
  2. 模型比较

    # 在鸢尾花数据集上比较以下算法的性能:
    # - 逻辑回归
    # - 决策树
    # - 随机森林
    # - 支持向量机
    
    1. 特征工程
    • 创建新特征(如花萼面积、花瓣面积)

    • 比较添加新特征前后的模型性能

      项目练习

    1. 完整项目 选择一个数据集(如红酒质量、泰坦尼克号乘客生存等),完成以下任务:
    • 数据加载和探索
    • 数据预处理
    • 模型训练和评估
    • 结果可视化
    • 撰写项目报告
    1. 模型优化
    • 使用网格搜索优化超参数

    • 实现模型集成

    • 分析特征重要性

      思考题

    1. 实际应用
    • 思考机器学习在你感兴趣的领域中的应用
    • 设计一个机器学习解决方案
    • 考虑可能遇到的挑战和解决方案
    1. 伦理考虑
    • 讨论机器学习中的偏见问题
    • 如何确保模型的公平性?
    • 数据隐私保护的重要性 这些练习将帮助你巩固本章学到的知识,为后续章节的学习打下坚实基础。