【Python数据科学实战之路】第10章 | 机器学习基础:从理论到实践的完整入门

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 学习路径建议

  1. 基础阶段:掌握Scikit-learn核心API,完成3-5个完整项目
  2. 进阶阶段:学习特征工程、超参数调优、模型集成
  3. 前沿阶段:探索AutoML工具、XAI解释方法、MLOps实践

10.3 推荐资源

  • Scikit-learn官方文档:https://scikit-learn.org/stable/
  • Kaggle入门竞赛:Titanic、House Prices
  • 书籍:《Python机器学习基础教程》《Hands-On Machine Learning》

学习建议:机器学习是实践性极强的领域,建议读者在理解本章概念后,立即动手完成鸢尾花分类项目。尝试修改参数、换用不同模型、添加新的评估指标,在实践中加深理解。有任何问题欢迎在评论区交流讨论。

相关推荐
王夏奇2 小时前
Python-对excel文件操作-pandas库
python·excel·pandas
无风听海2 小时前
Python之TypeVar深入解析
开发语言·python·typevar
独断万古他化2 小时前
Python 接口测试之 requests 库核心用法
python·pytest·接口测试·requests
东离与糖宝2 小时前
告别Python!Spring Boot 3集成GPT-5.4,Java后端10分钟接入原生计算机操作
java·人工智能
林洛2 小时前
多 Agent 系统的三个隐形工程问题,以及一个基于 MCP 的解法
人工智能
白中白121382 小时前
杂七杂八补充系列
开发语言·前端·javascript
E_ICEBLUE2 小时前
Excel 删除空白行的 5 种方法 【手动管理与 Python 自动化】
python·自动化·excel
佩奇大王2 小时前
P8 单词分析
java·开发语言
AI大法师2 小时前
品牌IP工程化落地:9步流程+6类线上故障排查
人工智能