机器学习基础理论

机器学习基础理论

一、核心概念总览

机器学习
核心要素
数据 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

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

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等)
  • 使用有意义的文件名,包含版本或日期
  • 在生产环境中验证加载后的模型效果

相关推荐
有为少年17 小时前
告别“唯语料论”:用合成抽象数据为大模型开智
人工智能·深度学习·神经网络·算法·机器学习·大模型·预训练
AI医影跨模态组学17 小时前
J Transl Med(IF=7.5)苏州大学附属第一医院秦颂兵教授等团队:基于机器学习影像组学的食管鳞癌预后评估列线图
人工智能·深度学习·机器学习·ct·医学·医学影像
春日见19 小时前
自驾算法的日常工作?如何提升模型性能?
linux·人工智能·机器学习·计算机视觉·自动驾驶
*JOKER20 小时前
Flow Matching&生成算法
人工智能·深度学习·机器学习·大模型·生成模型·flow matching
red1giant_star21 小时前
浅析XSS原理与分类——含payload合集和检测与防护思路
安全·机器学习
霖大侠1 天前
Wavelet Meets Adam: Compressing Gradients forMemory-Efficient Training
人工智能·深度学习·算法·机器学习·transformer
源码之家1 天前
计算机毕业设计:基于Python的美食推荐分析系统 Django框架 爬虫 协同过滤推荐算法 可视化 推荐系统 数据分析 大数据(建议收藏)✅
爬虫·python·机器学习·django·flask·课程设计·美食
badhope1 天前
概率论如何让机器学习不再玄学
人工智能·深度学习·机器学习·数据挖掘·github
阿钱真强道1 天前
02 从 MLP 到 LeNet:数据、标签和任务:机器学习到底在解决什么问题?
人工智能·深度学习·机器学习·cnn·分类算法·lenet