机器学习教程¶
概述¶
机器学习是人工智能的核心分支,本教程将介绍机器学习的基本概念、主要算法和实践方法。
机器学习算法分类¶
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 监督学习¶
线性回归¶
线性回归是最基础的机器学习算法,用于预测连续值。
数学原理:
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是最常用的聚类算法。
算法步骤:
- 随机初始化K个聚类中心
- 将每个样本分配到最近的聚类中心
- 重新计算每个聚类的中心
- 重复步骤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')
下一步学习¶
- 深度学习教程 - 深入神经网络
- Python机器学习实战 - 实战项目