Python版本 :Python 3.12+
开发工具 :PyCharm 或 VS Code
操作系统 :Windows / macOS / Linux (通用)
Scikit-learn版本:1.5+
摘要:本章系统讲解机器学习的核心概念与基础算法,涵盖2025-2026年最新趋势(AutoML、XAI、MLOps)。通过Scikit-learn 1.5+实战,掌握从数据预处理到模型部署的完整流程,建立正确的机器学习认知框架。
学习目标
完成本章学习后,你将能够:
- 理解机器学习的本质,用通俗类比向他人解释
- 区分监督学习、无监督学习、强化学习的应用场景
- 掌握Scikit-learn 1.5+的新特性与核心API
- 独立完成数据预处理、特征工程、模型训练与评估
- 理解AutoML和XAI的基本概念与工具
- 构建一个完整的机器学习项目
1. 机器学习是什么
1.1 一句话定义
机器学习 = 让计算机从数据中自动学习规律,并用规律预测未知数据的技术
1.2 通俗类比
| 类比场景 | 传统编程 | 机器学习 |
|---|---|---|
| 做菜 | 按菜谱一步步操作 | 学徒观察大厨,自己总结规律 |
| 识猫 | 程序员写规则:有毛、有四条腿、会喵叫 | 给机器看10000张猫图,自己学会识别 |
| 垃圾邮件 | 关键词匹配规则 | 学习历史邮件特征,自动判断 |
补充:Python之父Guido van Rossum的设计哲学是"优雅、明确、简单"。机器学习同样追求用简洁的模型捕捉数据本质。
1.3 核心公式
预测结果 = 模型(输入数据 + 训练过程)
2. 机器学习的三大类型
2.1 类型对比表
| 类型 | 数据特点 | 学习目标 | 典型应用 | 代表算法 |
|---|---|---|---|---|
| 监督学习 | 有标签(正确答案) | 学习输入到输出的映射 | 房价预测、疾病诊断 | 线性回归、随机森林、SVM |
| 无监督学习 | 无标签 | 发现数据内在结构 | 客户分群、异常检测 | K-Means、PCA、DBSCAN |
| 强化学习 | 环境反馈(奖励/惩罚) | 学习最优决策策略 | 游戏AI、自动驾驶 | Q-Learning、DQN、PPO |
2.2 监督学习详解
python
# 监督学习示例:用房价数据预测新房价格
from sklearn.linear_model import LinearRegression
import numpy as np
# 训练数据:面积(平米) -> 房价(万元)
X_train = np.array([[50], [80], [100], [120], [150]]) # 特征
y_train = np.array([200, 320, 400, 480, 600]) # 标签
# 训练模型
model = LinearRegression()
model.fit(X_train, y_train)
# 预测新房价格
new_house = np.array([[90]])
predicted_price = model.predict(new_house)
print(f"90平米房子预测价格: {predicted_price[0]:.2f}万元")
2.3 无监督学习详解
python
# 无监督学习示例:客户分群
from sklearn.cluster import KMeans
import numpy as np
# 客户数据:年收入(万元), 消费频次(次/月)
X = np.array([
[10, 2], [12, 3], [50, 15], [55, 18], # 低收入低消费 vs 高收入高消费
[11, 2], [48, 16], [52, 14], [15, 4]
])
# 自动分成2类
kmeans = KMeans(n_clusters=2, random_state=42, n_init='auto')
labels = kmeans.fit_predict(X)
print("客户分群结果:")
for i, (income, freq) in enumerate(X):
group = "高价值客户" if labels[i] == 1 else "普通客户"
print(f" 客户{i+1}: 年收入{income}万, 消费{freq}次 -> {group}")
3. 2025-2026机器学习前沿趋势
3.1 四大趋势概览
| 趋势 | 核心概念 | 解决的问题 | Python工具 |
|---|---|---|---|
| AutoML | 自动化机器学习流程 | 降低技术门槛,加速模型开发 | Auto-sklearn, TPOT, H2O |
| XAI | 可解释人工智能 | 打开"黑箱",增强信任 | SHAP, LIME, Yellowbrick |
| MLOps | 机器学习运维 | 模型部署、监控、迭代 | MLflow, Kubeflow, DVC |
| 联邦学习 | 分布式隐私保护学习 | 数据不出域,联合建模 | PySyft, TensorFlow Federated |
3.2 AutoML:让AI开发自动化
python
# AutoML示例:自动选择最佳模型和参数
# 安装: pip install auto-sklearn
import autosklearn.classification
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 加载数据
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# AutoML自动搜索最佳模型(耗时较长,仅演示)
automl = autosklearn.classification.AutoSklearnClassifier(
time_left_for_this_task=120, # 2分钟
per_run_time_limit=30
)
automl.fit(X_train, y_train)
# 查看自动选择的模型
print(f"最佳模型: {automl.leaderboard()}")
print(f"测试集准确率: {automl.score(X_test, y_test):.4f}")
3.3 XAI:解释模型决策
python
# SHAP可解释性分析
# 安装: pip install shap
import shap
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
# 训练模型
X, y = load_iris(return_X_y=True)
feature_names = load_iris().feature_names
model = RandomForestClassifier(random_state=42)
model.fit(X, y)
# SHAP解释
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)
# 可视化特征重要性
shap.summary_plot(shap_values, X, feature_names=feature_names)
4. Scikit-learn 1.5+ 新特性
4.1 版本检查与核心改进
python
import sklearn
print(f"当前Scikit-learn版本: {sklearn.__version__}")
# 1.5+ 重要更新:
# - KMeans默认算法改为'lloyd',n_init默认为'auto'
# - 新增HGBT(直方图梯度提升树)的缺失值自动处理
# - 改进的交叉验证和超参数搜索
4.2 新特性速览表
| 特性 | 版本 | 说明 | 代码示例 |
|---|---|---|---|
n_init='auto' |
1.4+ | KMeans自动选择初始化次数 | KMeans(n_init='auto') |
| HGBT缺失值处理 | 1.3+ | 直方图梯度提升自动处理缺失值 | 无需预处理 |
PairwiseTransformer |
1.5+ | 成对距离计算优化 | 用于大规模数据 |
改进的 HalvingSearch |
1.5+ | 逐次减半搜索更稳定 | 超参数优化 |
4.3 安装与配置
python
# 基础安装
# pip install scikit-learn==1.5.2
# 完整环境(推荐)
# pip install numpy pandas matplotlib seaborn scikit-learn==1.5.2
# 验证安装
import sklearn
import numpy as np
import pandas as pd
print(f"Scikit-learn: {sklearn.__version__}")
print(f"NumPy: {np.__version__}")
print(f"Pandas: {pd.__version__}")
5. 数据预处理完整流程
5.1 为什么预处理很重要
数据和特征决定了机器学习的上限,模型和算法只是逼近这个上限。
5.2 标准化 vs 归一化
| 方法 | 公式 | 适用场景 | 对异常值敏感度 |
|---|---|---|---|
| 标准化 (StandardScaler) | z = (x - mean) / std | 数据近似正态分布 | 低 |
| 归一化 (MinMaxScaler) | x' = (x - min) / (max - min) | 需要固定范围[0,1] | 高 |
| 稳健标准化 (RobustScaler) | x' = (x - median) / IQR | 存在大量异常值 | 极低 |
python
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
import numpy as np
# 示例数据
X = np.array([[1, 2], [2, 3], [3, 4], [100, 200]]) # 包含异常值
# 三种缩放方法对比
scalers = {
'标准化': StandardScaler(),
'归一化': MinMaxScaler(),
'稳健标准化': RobustScaler()
}
for name, scaler in scalers.items():
X_scaled = scaler.fit_transform(X)
print(f"\n{name}:")
print(f" 结果:\n{X_scaled}")
5.3 类别特征编码
python
from sklearn.preprocessing import LabelEncoder, OneHotEncoder, OrdinalEncoder
import numpy as np
# 1. 标签编码 - 适用于有序类别
le = LabelEncoder()
sizes = ['小', '中', '大', '中', '小']
encoded = le.fit_transform(sizes)
print(f"标签编码: {dict(zip(le.classes_, le.transform(le.classes_)))}")
# 2. 独热编码 - 适用于无序类别
categories = np.array([['红'], ['绿'], ['蓝'], ['红']])
ohe = OneHotEncoder(sparse_output=False, drop='first') # 1.2+ 使用sparse_output
coded = ohe.fit_transform(categories)
print(f"\n独热编码结果:\n{coded}")
# 3. 有序编码 - 明确指定顺序
oe = OrdinalEncoder(categories=[['低', '中', '高']])
levels = np.array([['中'], ['高'], ['低']])
print(f"\n有序编码: {oe.fit_transform(levels).flatten()}")
5.4 缺失值处理
python
from sklearn.impute import SimpleImputer, KNNImputer
import numpy as np
# 含缺失值的数据
X = np.array([[1, 2], [np.nan, 3], [7, np.nan], [4, 5]])
# 方法1: 均值填充
imputer_mean = SimpleImputer(strategy='mean')
X_mean = imputer_mean.fit_transform(X)
print(f"均值填充:\n{X_mean}")
# 方法2: KNN填充(利用相似样本)
imputer_knn = KNNImputer(n_neighbors=2)
X_knn = imputer_knn.fit_transform(X)
print(f"\nKNN填充:\n{X_knn}")
5.5 特征选择
python
from sklearn.feature_selection import VarianceThreshold, SelectKBest, f_classif
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
# 方法1: 方差阈值(移除变化小的特征)
selector_var = VarianceThreshold(threshold=0.2)
X_var = selector_var.fit_transform(X)
print(f"方差选择后特征数: {X_var.shape[1]}")
# 方法2: 统计检验选择
selector_kbest = SelectKBest(score_func=f_classif, k=2)
X_kbest = selector_kbest.fit_transform(X, y)
print(f"\nSelectKBest选择后特征数: {X_kbest.shape[1]}")
print(f"特征得分: {selector_kbest.scores_}")
# 方法3: 基于模型重要性
model = RandomForestClassifier(random_state=42)
model.fit(X, y)
importances = model.feature_importances_
print(f"\n随机森林特征重要性: {importances}")
6. 模型评估指标详解
6.1 分类模型评估
python
from sklearn.metrics import (
accuracy_score, precision_score, recall_score, f1_score,
confusion_matrix, classification_report, roc_auc_score
)
# 假设的预测结果
y_true = [0, 1, 0, 0, 1, 1, 0, 1, 1, 1]
y_pred = [0, 1, 0, 1, 1, 0, 0, 1, 1, 1]
# 计算各项指标
metrics = {
'准确率': accuracy_score(y_true, y_pred),
'精确率': precision_score(y_true, y_pred),
'召回率': recall_score(y_true, y_pred),
'F1分数': f1_score(y_true, y_pred)
}
print("分类指标:")
for name, value in metrics.items():
print(f" {name}: {value:.4f}")
# 混淆矩阵
cm = confusion_matrix(y_true, y_pred)
print(f"\n混淆矩阵:\n{cm}")
6.2 分类指标速查表
| 指标 | 公式 | 适用场景 |
|---|---|---|
| 准确率 | (TP+TN)/(TP+TN+FP+FN) | 类别平衡时 |
| 精确率 | TP/(TP+FP) | 避免误报(垃圾邮件) |
| 召回率 | TP/(TP+FN) | 避免漏报(疾病诊断) |
| F1分数 | 2*(P*R)/(P+R) | 综合考虑精确率和召回率 |
| AUC | ROC曲线下面积 | 评估模型整体区分能力 |
6.3 回归模型评估
python
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import numpy as np
# 假设的房价预测
y_true = np.array([300, 450, 500, 600, 800])
y_pred = np.array([320, 430, 520, 580, 850])
# 计算指标
mse = mean_squared_error(y_true, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_true, y_pred)
r2 = r2_score(y_true, y_pred)
print(f"MSE (均方误差): {mse:.2f}")
print(f"RMSE (均方根误差): {rmse:.2f}")
print(f"MAE (平均绝对误差): {mae:.2f}")
print(f"R2 (决定系数): {r2:.4f}")
6.4 回归指标对比
| 指标 | 特点 | 适用场景 |
|---|---|---|
| MSE | 对大误差惩罚重 | 需要避免大偏差 |
| MAE | 对异常值鲁棒 | 数据有离群点 |
| R2 | 解释数据变异比例 | 评估模型拟合度 |
| RMSE | 与原始数据同量纲 | 直观理解误差大小 |
7. 交叉验证技术
7.1 为什么需要交叉验证
单次划分训练集/测试集存在随机性,交叉验证通过多次评估获得更稳定的性能估计。
7.2 交叉验证方法对比
| 方法 | 适用场景 | 特点 |
|---|---|---|
| K折交叉验证 | 通用场景 | K=5或10最常用 |
| 分层K折 | 类别不平衡 | 保持每折类别比例 |
| 留一法 | 小样本(N<100) | 计算成本高 |
| 时间序列分割 | 时序数据 | 避免数据泄露 |
python
from sklearn.model_selection import (
cross_val_score, KFold, StratifiedKFold,
LeaveOneOut, TimeSeriesSplit
)
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
model = RandomForestClassifier(random_state=42)
# 1. K折交叉验证
kf = KFold(n_splits=5, shuffle=True, random_state=42)
scores_kf = cross_val_score(model, X, y, cv=kf)
print(f"K折交叉验证: {scores_kf.mean():.4f} (+/- {scores_kf.std():.4f})")
# 2. 分层K折(推荐用于分类)
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores_skf = cross_val_score(model, X, y, cv=skf)
print(f"分层K折交叉验证: {scores_skf.mean():.4f} (+/- {scores_skf.std():.4f})")
# 3. 留一法
loo = LeaveOneOut()
scores_loo = cross_val_score(model, X, y, cv=loo)
print(f"留一法交叉验证: {scores_loo.mean():.4f}")
8. 完整实战项目:鸢尾花分类
8.1 项目流程图
原始数据 -> 数据探索 -> 预处理 -> 特征工程 -> 模型训练 -> 评估优化 -> 部署
8.2 完整代码实现
python
"""
鸢尾花分类完整项目
使用Scikit-learn 1.5+ 最佳实践
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, StratifiedKFold, cross_val_score, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import warnings
warnings.filterwarnings('ignore')
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
print("=" * 60)
print("鸢尾花分类项目 - 完整机器学习流程")
print("=" * 60)
# ==================== 1. 数据加载与探索 ====================
print("\n【步骤1】数据加载与探索")
print("-" * 40)
iris = load_iris()
X, y = iris.data, iris.target
feature_names = iris.feature_names
target_names = iris.target_names
# 创建DataFrame便于探索
df = pd.DataFrame(X, columns=feature_names)
df['species'] = [target_names[i] for i in y]
print(f"样本数量: {X.shape[0]}")
print(f"特征数量: {X.shape[1]}")
print(f"类别数量: {len(target_names)}")
print(f"类别分布:\n{pd.Series(y).value_counts().sort_index()}")
print(f"\n特征统计:\n{df[feature_names].describe().round(2)}")
# ==================== 2. 数据可视化 ====================
print("\n【步骤2】数据可视化")
print("-" * 40)
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 特征分布箱线图
df_melted = df.melt(id_vars=['species'], var_name='feature', value_name='value')
sns.boxplot(data=df_melted, x='feature', y='value', hue='species', ax=axes[0])
axes[0].set_title('特征分布按类别')
axes[0].tick_params(axis='x', rotation=45)
# 特征相关性热力图
corr_matrix = df[feature_names].corr()
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0, ax=axes[1])
axes[1].set_title('特征相关性矩阵')
plt.tight_layout()
plt.savefig('iris_exploration.png', dpi=150, bbox_inches='tight')
print("可视化已保存为 iris_exploration.png")
# ==================== 3. 数据划分与预处理 ====================
print("\n【步骤3】数据划分与预处理")
print("-" * 40)
# 划分训练集和测试集(分层采样)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
print(f"训练集大小: {X_train.shape[0]} ({X_train.shape[0]/len(X)*100:.0f}%)")
print(f"测试集大小: {X_test.shape[0]} ({X_test.shape[0]/len(X)*100:.0f}%)")
# 标准化(重要:只fit训练集,transform两者)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
print(f"训练集均值: {X_train_scaled.mean(axis=0).round(3)}")
print(f"训练集标准差: {X_train_scaled.std(axis=0).round(3)}")
# ==================== 4. 模型训练与比较 ====================
print("\n【步骤4】多模型训练与比较")
print("-" * 40)
models = {
'逻辑回归': LogisticRegression(random_state=42, max_iter=200),
'随机森林': RandomForestClassifier(random_state=42, n_estimators=100),
'支持向量机': SVC(random_state=42, probability=True)
}
results = []
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
for name, model in models.items():
# 交叉验证
cv_scores = cross_val_score(model, X_train_scaled, y_train, cv=skf)
# 训练并评估
model.fit(X_train_scaled, y_train)
train_score = model.score(X_train_scaled, y_train)
test_score = model.score(X_test_scaled, y_test)
results.append({
'模型': name,
'CV均值': cv_scores.mean(),
'CV标准差': cv_scores.std(),
'训练集分数': train_score,
'测试集分数': test_score
})
print(f"{name}:")
print(f" CV: {cv_scores.mean():.4f} (+/- {cv_scores.std():.4f})")
print(f" 训练集: {train_score:.4f}, 测试集: {test_score:.4f}")
# 结果对比表
results_df = pd.DataFrame(results)
print(f"\n模型对比:\n{results_df.round(4)}")
# ==================== 5. 超参数调优 ====================
print("\n【步骤5】超参数调优(以随机森林为例)")
print("-" * 40)
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [3, 5, 7, None],
'min_samples_split': [2, 5, 10]
}
grid_search = GridSearchCV(
RandomForestClassifier(random_state=42),
param_grid,
cv=skf,
scoring='accuracy',
n_jobs=-1
)
grid_search.fit(X_train_scaled, y_train)
print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳CV分数: {grid_search.best_score_:.4f}")
# 使用最佳模型
best_model = grid_search.best_estimator_
# ==================== 6. 最终评估 ====================
print("\n【步骤6】最终模型评估")
print("-" * 40)
y_pred = best_model.predict(X_test_scaled)
print(f"测试集准确率: {accuracy_score(y_test, y_pred):.4f}")
print(f"\n分类报告:\n{classification_report(y_test, y_pred, target_names=target_names)}")
# 混淆矩阵
plt.figure(figsize=(8, 6))
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
xticklabels=target_names, yticklabels=target_names)
plt.title('混淆矩阵')
plt.xlabel('预测标签')
plt.ylabel('真实标签')
plt.tight_layout()
plt.savefig('confusion_matrix.png', dpi=150, bbox_inches='tight')
print("混淆矩阵已保存为 confusion_matrix.png")
# ==================== 7. 特征重要性分析 ====================
print("\n【步骤7】特征重要性分析")
print("-" * 40)
importance_df = pd.DataFrame({
'特征': feature_names,
'重要性': best_model.feature_importances_
}).sort_values('重要性', ascending=False)
print(importance_df.round(4))
# 可视化
plt.figure(figsize=(8, 5))
sns.barplot(data=importance_df, x='重要性', y='特征', palette='viridis')
plt.title('特征重要性排名')
plt.tight_layout()
plt.savefig('feature_importance.png', dpi=150, bbox_inches='tight')
print("特征重要性图已保存为 feature_importance.png")
# ==================== 8. 模型保存与加载 ====================
print("\n【步骤8】模型保存")
print("-" * 40)
import joblib
# 保存模型和预处理器
joblib.dump(best_model, 'iris_model.pkl')
joblib.dump(scaler, 'iris_scaler.pkl')
print("模型已保存为 iris_model.pkl")
print("预处理器已保存为 iris_scaler.pkl")
# 加载并使用
loaded_model = joblib.load('iris_model.pkl')
loaded_scaler = joblib.load('iris_scaler.pkl')
# 预测新样本
new_sample = np.array([[5.1, 3.5, 1.4, 0.2]]) # 一朵新花
new_sample_scaled = loaded_scaler.transform(new_sample)
prediction = loaded_model.predict(new_sample_scaled)
proba = loaded_model.predict_proba(new_sample_scaled)
print(f"\n新样本预测:")
print(f" 特征: {new_sample[0]}")
print(f" 预测类别: {target_names[prediction[0]]}")
print(f" 预测概率: {dict(zip(target_names, proba[0].round(4)))}")
print("\n" + "=" * 60)
print("项目完成!")
print("=" * 60)
8.3 预期输出
============================================================
鸢尾花分类项目 - 完整机器学习流程
============================================================
【步骤1】数据加载与探索
----------------------------------------
样本数量: 150
特征数量: 4
类别数量: 3
类别分布:
0 50
1 50
2 50
【步骤4】多模型训练与比较
----------------------------------------
逻辑回归:
CV: 0.9667 (+/- 0.0422)
随机森林:
CV: 0.9583 (+/- 0.0527)
支持向量机:
CV: 0.9750 (+/- 0.0316)
【步骤6】最终模型评估
----------------------------------------
测试集准确率: 1.0000
分类报告:
precision recall f1-score support
setosa 1.00 1.00 1.00 10
versicolor 1.00 1.00 1.00 10
virginica 1.00 1.00 1.00 10
9. 避坑小贴士
9.1 数据泄露问题
错误做法:先对整个数据集预处理,再划分训练/测试集
正确做法:
python
# 正确流程:先划分,再分别处理
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train) # 只在训练集上fit
X_test_scaled = scaler.transform(X_test) # 测试集只transform
9.2 类别不平衡处理
当正负样本比例悬殊时,准确率可能具有误导性。
解决方案:
- 使用F1分数、AUC等更全面的指标
- 采用分层采样(stratify=y)
- 考虑类别权重(class_weight='balanced')
9.3 过拟合与欠拟合
| 现象 | 表现 | 解决方案 |
|---|---|---|
| 过拟合 | 训练集好,测试集差 | 增加数据、减少特征、正则化、简化模型 |
| 欠拟合 | 训练集和测试集都差 | 增加特征、使用更复杂模型、减少正则化 |
9.4 随机种子设置
python
# 为实验可复现,务必设置随机种子
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
# 数据划分
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42 # 固定种子
)
# 模型训练
model = RandomForestClassifier(random_state=42) # 固定种子
model.fit(X_train, y_train)
10. 本章小结
10.1 核心知识点回顾
| 主题 | 关键要点 |
|---|---|
| 机器学习本质 | 从数据中学习规律,预测未知 |
| 三大类型 | 监督学习(有标签)、无监督学习(无标签)、强化学习(环境反馈) |
| 2025-2026趋势 | AutoML自动化、XAI可解释性、MLOps工程化、联邦学习隐私保护 |
| Scikit-learn 1.5+ | KMeans改进、HGBT缺失值处理、更稳定的搜索算法 |
| 数据预处理 | 标准化/归一化、编码、缺失值处理、特征选择 |
| 模型评估 | 分类(准确率、精确率、召回率、F1、AUC)、回归(MSE、MAE、R2) |
| 交叉验证 | K折、分层K折、留一法,获得稳定性能估计 |
10.2 学习路径建议
- 基础阶段:掌握Scikit-learn核心API,完成3-5个完整项目
- 进阶阶段:学习特征工程、超参数调优、模型集成
- 前沿阶段:探索AutoML工具、XAI解释方法、MLOps实践
10.3 推荐资源
- Scikit-learn官方文档:https://scikit-learn.org/stable/
- Kaggle入门竞赛:Titanic、House Prices
- 书籍:《Python机器学习基础教程》《Hands-On Machine Learning》
学习建议:机器学习是实践性极强的领域,建议读者在理解本章概念后,立即动手完成鸢尾花分类项目。尝试修改参数、换用不同模型、添加新的评估指标,在实践中加深理解。有任何问题欢迎在评论区交流讨论。