机器学习基础理论

一、核心概念总览

机器学习

核心要素

数据 Data

特征 Feature

模型 Model

训练 Training

评估 Evaluation

三大范式

监督学习

无监督学习

强化学习

应用场景

分类

回归

聚类

降维


二、四大核心要素

输出

处理

输入

反馈调整

数据
Data

特征
Feature

模型
Model

训练
Training

预测
Prediction

评估
Evaluation

2.1 数据(Data)

理解:数据是机器学习的"燃料",就像数据库是后端应用的基础。

数据类型 说明 后端类比
结构化数据 表格数据(行+列) MySQL表
非结构化数据 文本、图片、音频 文件存储
半结构化数据 JSON、XML MongoDB文档

数据集划分

全部数据
├── 训练集 (70%) → 用于训练模型
├── 验证集 (15%) → 训练中调整参数
└── 测试集 (15%) → 最终评估模型

2.2 特征(Feature)

理解:特征是从原始数据中提取的有用信息,相当于SQL查询中的SELECT字段。

原始数据
(用户评论)

特征提取

特征1: 文本长度

特征2: 情感词数量

特征3: 标点符号

特征工程的关键步骤

  1. 特征提取:从原始数据中提取信息
  2. 特征清洗:处理缺失值、异常值
  3. 特征转换:归一化、标准化
  4. 特征选择:选择最有用的特征

2.3 模型(Model)

理解:模型就是一个复杂的数学函数,输入特征,输出预测结果。

预测结果 = 模型(特征)

后端类比

// 传统代码:硬编码规则
if (user.age > 18 && user.income > 5000) {
    approve = true;
}

// 机器学习:从数据中学习规则
approve = model.predict([age, income, credit_score, ...])

2.4 训练(Training)

理解:训练就是不断调整模型参数,让预测越来越准确。

优化器 损失函数 模型 数据 优化器 损失函数 模型 数据 loop [每个批次] 输入特征 输出预测 提供真实标签 计算误差 返回误差 调整参数

三、三大学习范式

强化学习 (Reinforcement Learning)

环境交互

奖励最大化

如: 游戏AI

无监督学习 (Unsupervised Learning)

无标签数据

聚类/降维

如: 用户分群

监督学习 (Supervised Learning)

有标签数据

分类/回归

如: 垃圾邮件识别

四、经典算法分类

机器学习算法

监督学习

无监督学习

强化学习

分类

回归

逻辑回归

决策树

SVM

随机森林

线性回归

岭回归

聚类

降维

K-Means

DBSCAN

PCA

t-SNE

Q-Learning

DQN

算法选择指南

场景 推荐算法 原因
快速原型 逻辑回归 简单、可解释
高精度需求 随机森林/XGBoost 集成学习效果好
数据量小 SVM 小样本表现好
需要解释性 决策树 规则清晰
数据分群 K-Means 简单高效

五、模型评估指标

5.1 分类指标

混淆矩阵

真阳性 TP

假阳性 FP

假阴性 FN

真阴性 TN

精确率 = TP/(TP+FP)

召回率 = TP/(TP+FN)

F1 = 2*P*R/(P+R)

指标理解

指标 公式 通俗理解 后端类比
准确率 正确数/总数 整体正确率 接口成功率
精确率 TP/(TP+FP) 预测为正的有多准 查询结果准确度
召回率 TP/(TP+FN) 真正为正的找回了多少 数据恢复率
F1值 精确率和召回率的调和平均 综合指标 综合评分

5.2 回归指标

指标 说明 后端类比
MAE 平均绝对误差 平均响应偏差
MSE 均方误差 误差的平方平均
RMSE 均方根误差 误差的标准差
决定系数 模型解释力度

六、机器学习工作流程

问题定义

数据收集

数据预处理

特征工程

模型选择

模型训练

模型评估

效果满意?

调优

模型部署

监控维护

各阶段详解

阶段 主要工作 后端类比
问题定义 明确要解决什么问题 需求分析
数据收集 获取相关数据 数据库设计
数据预处理 清洗、格式化 数据清洗ETL
特征工程 提取有用特征 API字段设计
模型选择 选择合适算法 技术选型
模型训练 训练模型 编码实现
模型评估 测试效果 单元测试
模型部署 上线运行 服务部署
监控维护 持续优化 运维监控

七、常见问题与解决方案

问题 症状 解决方案
过拟合 训练好、测试差 正则化、增加数据、简化模型
欠拟合 训练测试都差 增加特征、复杂模型、减少正则化
数据不平衡 某类样本太少 重采样、调整权重、数据增强
特征太多 训练慢、效果差 特征选择、降维
超参数难调 效果不稳定 网格搜索、随机搜索

八、后端工程师实践建议

从后端到机器学习的思维转换

ML思维

后端思维

确定性逻辑

规则驱动

调试友好

概率性预测

数据驱动

实验驱动

推荐学习工具

  1. Scikit-learn:Python机器学习库,API设计友好
  2. Jupyter Notebook:交互式编程环境
  3. Kaggle:练习平台和数据集

九、代码实践

9.1 K近邻算法示例

💻 对应脚本:1.1.knn_classification.py

"""
K近邻算法完整示例
================
使用scikit-learn实现鸢尾花分类任务,涵盖:
- 数据集加载与划分
- 特征标准化
- 模型训练与超参数调优
- 模型评估

依赖安装: pip install scikit-learn numpy pandas
运行: python knn_classification.py
"""

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix


def simple():
    # 2. 准备数据集(测试集 和 训练集)
    # train: 训练集
    # test: 测试集
    # neighbors: 最近邻的邻居数
    x_train = [[0], [1], [2], [3]]  # 训练集的特征数据, 因为特征可以有多个特征, 所以是一个二维数组
    y_train = [0, 1, 1, 1]  # 训练集的标签数据, 因为标签是离散的, 所以是一个一维数组
    x_test = [[6]]  # 测试集的特征数据

    # 3. 创建(KNN 分类模型)模型对象.
    # estimator: 估计器, 模型对象, 也可以用变量名 model做接收.
    estimator = KNeighborsClassifier(n_neighbors=3)

    # 4. 模型训练
    # 传入: 训练集的特征数据, 训练集的标签数据
    estimator.fit(x_train, y_train)

    # 5. 模型预测.
    # 传入: 测试集的特征数据, 获取到: 预测结果(测试集的标签, y_test)
    y_pre = estimator.predict(x_test)

    # 6. 打印预测结果.
    print(f'预测值为: {y_pre}')

def main():
    # 1. 加载数据集(以鸢尾花数据集为例)
    iris = load_iris()
    X = iris.data  # 特征: 花萼长度、花萼宽度、花瓣长度、花瓣宽度

    Xd = pd.DataFrame(
        iris.data,
        columns=['花萼长度', '花萼宽度', '花瓣长度', '花瓣宽度']  # 给特征列命名,更直观
    )
    print(Xd.head(3))
    y = iris.target  # 标签: 0-山鸢尾, 1-变色鸢尾, 2-维吉尼亚鸢尾

    print(f"数据集形状: {X.shape}, 标签数量: {len(np.unique(y))}")

    # 2. 数据集划分 (70% 训练, 35% 验证测试)
    x_train, x_test, y_train, y_test = train_test_split(
        X, y, test_size=0.3, random_state=42, stratify=y
    )

    print(f"训练集: {len(x_train)}, 验证测试集: {len(y_train)}")

    # 3. 特征工程(提取, 预处理...) 特征标准化(重要!KNN对特征尺度敏感)
    scaler = StandardScaler()
    x_train = scaler.fit_transform(x_train)
    x_test = scaler.transform(x_test)

    # 4. 训练KNN模型
    knn = KNeighborsClassifier(n_neighbors=3)  # k=3
    knn.fit(x_train, y_train)

    # 5. 模型预测
    y_pre = knn.predict(x_test)       # x_test: 测试集的特征数据
    # 5.2 打印预测结果.
    print(f'预测值为: {y_pre}')

    # 7. 评估结果
    print("\n=== 测试集评估结果 ===")
    print(f'正确率(准确率): {knn.score(x_test, y_test)}')  # 0.9111111111111111

    # 方式2: 基于 测试集的标签 和 预测结果 进行评分.
    print(f'正确率(准确率): {accuracy_score(y_test, y_pre)}')  # 0.9111111111111111


if __name__ == "__main__":
    #simple()
    main()



"""
输出示例:
=========
数据集形状: (150, 4), 标签数量: 3
训练集: 105, 验证集: 22, 测试集: 23
最佳k值: 3, 验证集准确率: 1.0000

=== 测试集评估结果 ===
准确率: 0.9565

分类报告:
                 precision    recall  f1-score   support
    setosa       1.00      1.00      1.00         8
versicolor       1.00      0.86      0.92         7
 virginica       0.89      1.00      0.94         8

混淆矩阵:
[[8 0 0]
 [0 6 1]
 [0 0 8]]

新样本预测: setosa
"""

使用scikit-learn实现一个完整的分类任务,涵盖数据集划分、训练、预测、评估全流程。

输出示例

数据集形状: (150, 4), 标签数量: 3
训练集: 105, 验证集: 22, 测试集: 23
最佳k值: 3, 验证集准确率: 1.0000

=== 测试集评估结果 ===
准确率: 0.9565

分类报告:
                 precision    recall  f1-score   support
    setosa       1.00      1.00      1.00         8
versicolor       1.00      0.86      0.92         7
 virginica       0.89      1.00      0.94         8

混淆矩阵:
[[8 0 0]
 [0 6 1]
 [0 0 8]]

新样本预测: setosa

9.2 模型保存与加载

💻 对应脚本:1.2.model_save_load_sklearn.py

"""
sklearn模型保存与加载示例
========================
演示如何使用joblib保存和加载训练好的sklearn模型

依赖安装: pip install joblib scikit-learn pandas numpy
运行: python model_save_load_sklearn.py
"""
import pandas as pd
import joblib
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score  # 新增:评估模型准确率


def main():
    # === 模型训练 ===
    # 1. 加载数据集(以鸢尾花数据集为例)
    iris = load_iris()
    X = iris.data  # 特征: 花萼长度、花萼宽度、花瓣长度、花瓣宽度
    Xd = pd.DataFrame(iris.data, columns=['花萼长度', '花萼宽度', '花瓣长度', '花瓣宽度'])
    print("前3行特征数据:")
    print(Xd.head(3))

    y = iris.target  # 标签: 0-山鸢尾, 1-变色鸢尾, 2-维吉尼亚鸢尾
    print(f"\n数据集形状: {X.shape}, 类别数量: {len(np.unique(y))}")

    # 2. 数据集划分 (70% 训练, 30% 测试) 修复注释错误(35%→30%)
    x_train, x_test, y_train, y_test = train_test_split(
        X, y, test_size=0.3, random_state=42, stratify=y
    )
    print(f"训练集大小: {len(x_train)}, 测试集大小: {len(x_test)}")

    # 3. 特征标准化(KNN对特征尺度敏感,必须做!)
    scaler = StandardScaler()
    x_train_scaled = scaler.fit_transform(x_train)  # 训练集:fit+transform
    x_test_scaled = scaler.transform(x_test)        # 测试集:仅transform(避免数据泄露)

    # 4. 训练KNN模型
    knn = KNeighborsClassifier(n_neighbors=3)
    knn.fit(x_train_scaled, y_train)

    # 5. 模型评估(新增:查看测试集准确率)
    y_pred = knn.predict(x_test_scaled)
    accuracy = accuracy_score(y_test, y_pred)
    print(f"\n测试集准确率: {accuracy:.4f}")
    print(f"测试集预测结果(前10个): {y_pred[:10]}")

    # === 保存模型和预处理器 ===
    # 建议指定完整路径,避免路径混乱(和你FastAPI接口的路径一致) pt bin
    model_path = "C:\\Users\\Administrator\\Desktop\\nice\\codes\\knn_model.pkl"
    scaler_path = "C:\\Users\\Administrator\\Desktop\\nice\\codes\\scaler.pkl"

    joblib.dump(knn, model_path)      # 保存模型
    joblib.dump(scaler, scaler_path)  # 保存标准化器(预测时必须用!)
    print(f"\n模型已保存到:")
    print(f"- 模型: {model_path}")
    print(f"- 标准化器: {scaler_path}")

    # === 加载模型验证 ===
    loaded_knn = joblib.load(model_path)
    loaded_scaler = joblib.load(scaler_path)

    # 测试新样本预测(必须先标准化!)
    new_sample = np.array([[5.1, 3.5, 1.4, 0.2]])  # 山鸢尾样本
    new_sample_scaled = loaded_scaler.transform(new_sample)
    prediction = loaded_knn.predict(new_sample_scaled)
    prediction_proba = loaded_knn.predict_proba(new_sample_scaled)

    print(f"\n新样本预测结果:")
    print(f"- 类别索引: {prediction[0]}")
    print(f"- 类别名称: {iris.target_names[prediction[0]]}")
    print(f"- 类别概率: {prediction_proba[0].round(4)}")


if __name__ == "__main__":
    main()

使用joblib保存训练好的sklearn模型,方便后续加载使用。

输出示例

模型已保存到 knn_model.joblib 和 scaler.joblib
加载模型预测结果: setosa

最佳实践

  • 同时保存模型和预处理器(scaler、encoder等)
  • 使用有意义的文件名,包含版本或日期
  • 在生产环境中验证加载后的模型效果

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐