跳转至

机器学习教程

概述

机器学习是人工智能的核心分支,本教程将介绍机器学习的基本概念、主要算法和实践方法。

机器学习算法分类

graph TB
    ML[机器学习]

    ML --> Supervised[监督学习]
    ML --> Unsupervised[无监督学习]
    ML --> Reinforcement[强化学习]

    Supervised --> Classification[分类]
    Supervised --> Regression[回归]

    Unsupervised --> Clustering[聚类]
    Unsupervised --> Dimensionality[降维]

    Classification --> LR[逻辑回归]
    Classification --> SVM[SVM]
    Classification --> RF[随机森林]
    Classification --> XGB[XGBoost]

    Regression --> Linear[线性回归]
    Regression --> Ridge[Ridge回归]
    Regression --> Lasso[Lasso回归]

    Clustering --> KMeans[K-Means]
    Clustering --> DBSCAN[DBSCAN]
    Clustering --> GMM[高斯混合模型]

    Dimensionality --> PCA[PCA]
    Dimensionality --> tSNE[t-SNE]
    Dimensionality --> UMAP[UMAP]

    style ML fill:#e1f5fe
    style Supervised fill:#e8f5e9
    style Unsupervised fill:#fff3e0
    style Reinforcement fill:#f3e5f5

机器学习工作流程

flowchart LR
    A[数据收集] --> B[数据清洗]
    B --> C[特征工程]
    C --> D[模型选择]
    D --> E[模型训练]
    E --> F[模型评估]
    F --> G{性能达标?}
    G -->|是| H[模型部署]
    G -->|否| I[调参优化]
    I --> E

    style A fill:#e3f2fd
    style F fill:#fff3e0
    style H fill:#e8f5e9

监督学习

线性回归

线性回归是最基础的机器学习算法,用于预测连续值。

数学原理:

y = w₁x₁ + w₂x₂ + ... + wₙxₙ + b

Python实现:

from sklearn.linear_model import LinearRegression
import numpy as np

# 准备数据
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([2, 4, 5, 4, 5])

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

# 预测
prediction = model.predict([[6]])
print(f"预测值: {prediction[0]}")

逻辑回归

逻辑回归用于二分类问题,输出概率值。

核心思想:

  • 使用Sigmoid函数将线性输出转换为概率
  • 概率大于0.5判定为正类,否则为负类
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载数据
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.2
)

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

# 评估
accuracy = model.score(X_test, y_test)
print(f"准确率: {accuracy:.2%}")

决策树

决策树通过一系列规则对数据进行分类。

优点:

  • 模型可解释性强
  • 不需要特征缩放
  • 能处理非线性关系
from sklearn.tree import DecisionTreeClassifier, plot_tree
import matplotlib.pyplot as plt

# 训练决策树
tree = DecisionTreeClassifier(max_depth=3)
tree.fit(X_train, y_train)

# 可视化
plt.figure(figsize=(12, 8))
plot_tree(tree, filled=True, feature_names=iris.feature_names)
plt.show()

随机森林

随机森林是多个决策树的集成,通过投票得出最终结果。

核心优势:

  • 减少过拟合
  • 提高准确率
  • 可以评估特征重要性
from sklearn.ensemble import RandomForestClassifier

# 训练随机森林
rf = RandomForestClassifier(n_estimators=100)
rf.fit(X_train, y_train)

# 特征重要性
importance = rf.feature_importances_
for name, imp in zip(iris.feature_names, importance):
    print(f"{name}: {imp:.3f}")

无监督学习

K-Means聚类

K-Means是最常用的聚类算法。

算法步骤:

  1. 随机初始化K个聚类中心
  2. 将每个样本分配到最近的聚类中心
  3. 重新计算每个聚类的中心
  4. 重复步骤2-3直到收敛
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 生成数据
from sklearn.datasets import make_blobs
X, y = make_blobs(n_samples=300, centers=4)

# K-Means聚类
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)

# 可视化
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], 
            kmeans.cluster_centers_[:, 1], 
            c='red', marker='x', s=200)
plt.title('K-Means Clustering')
plt.show()

主成分分析(PCA)

PCA是最常用的降维算法,用于数据压缩和可视化。

from sklearn.decomposition import PCA
from sklearn.datasets import load_digits

# 加载高维数据
digits = load_digits()
X = digits.data  # 64维

# 降到2维
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X)

# 可视化
plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=digits.target, cmap='tab10')
plt.colorbar()
plt.title('Digits Dataset - PCA Visualization')
plt.show()

模型评估与选择

交叉验证

from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC

# 5折交叉验证
scores = cross_val_score(SVC(), X, y, cv=5)
print(f"平均准确率: {scores.mean():.2%} (+/- {scores.std():.2%})")

超参数调优

from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {
    'n_estimators': [50, 100, 200],
    'max_depth': [3, 5, 10, None]
}

# 网格搜索
grid = GridSearchCV(RandomForestClassifier(), param_grid, cv=5)
grid.fit(X_train, y_train)

print(f"最佳参数: {grid.best_params_}")
print(f"最佳分数: {grid.best_score_:.2%}")

常见问题

如何选择算法?

数据类型 推荐算法
结构化数据(表格) 随机森林、XGBoost
图像数据 CNN
文本数据 Transformer、LSTM
时序数据 LSTM、Prophet

如何处理缺失值?

import pandas as pd
from sklearn.impute import SimpleImputer

# 方法1:删除
df.dropna()

# 方法2:填充均值
imputer = SimpleImputer(strategy='mean')
X_imputed = imputer.fit_transform(X)

# 方法3:填充中位数
imputer = SimpleImputer(strategy='median')

下一步学习

  1. 深度学习教程 - 深入神经网络
  2. Python机器学习实战 - 实战项目