机器学习基础理论
·
机器学习基础理论
一、核心概念总览
二、四大核心要素
2.1 数据(Data)
理解:数据是机器学习的"燃料",就像数据库是后端应用的基础。
| 数据类型 | 说明 | 后端类比 |
|---|---|---|
| 结构化数据 | 表格数据(行+列) | MySQL表 |
| 非结构化数据 | 文本、图片、音频 | 文件存储 |
| 半结构化数据 | JSON、XML | MongoDB文档 |
数据集划分:
全部数据
├── 训练集 (70%) → 用于训练模型
├── 验证集 (15%) → 训练中调整参数
└── 测试集 (15%) → 最终评估模型
2.2 特征(Feature)
理解:特征是从原始数据中提取的有用信息,相当于SQL查询中的SELECT字段。
特征工程的关键步骤:
- 特征提取:从原始数据中提取信息
- 特征清洗:处理缺失值、异常值
- 特征转换:归一化、标准化
- 特征选择:选择最有用的特征
2.3 模型(Model)
理解:模型就是一个复杂的数学函数,输入特征,输出预测结果。
预测结果 = 模型(特征)
后端类比:
// 传统代码:硬编码规则
if (user.age > 18 && user.income > 5000) {
approve = true;
}
// 机器学习:从数据中学习规则
approve = model.predict([age, income, credit_score, ...])
2.4 训练(Training)
理解:训练就是不断调整模型参数,让预测越来越准确。
三、三大学习范式
四、经典算法分类
算法选择指南
| 场景 | 推荐算法 | 原因 |
|---|---|---|
| 快速原型 | 逻辑回归 | 简单、可解释 |
| 高精度需求 | 随机森林/XGBoost | 集成学习效果好 |
| 数据量小 | SVM | 小样本表现好 |
| 需要解释性 | 决策树 | 规则清晰 |
| 数据分群 | K-Means | 简单高效 |
五、模型评估指标
5.1 分类指标
指标理解:
| 指标 | 公式 | 通俗理解 | 后端类比 |
|---|---|---|---|
| 准确率 | 正确数/总数 | 整体正确率 | 接口成功率 |
| 精确率 | TP/(TP+FP) | 预测为正的有多准 | 查询结果准确度 |
| 召回率 | TP/(TP+FN) | 真正为正的找回了多少 | 数据恢复率 |
| F1值 | 精确率和召回率的调和平均 | 综合指标 | 综合评分 |
5.2 回归指标
| 指标 | 说明 | 后端类比 |
|---|---|---|
| MAE | 平均绝对误差 | 平均响应偏差 |
| MSE | 均方误差 | 误差的平方平均 |
| RMSE | 均方根误差 | 误差的标准差 |
| R² | 决定系数 | 模型解释力度 |
六、机器学习工作流程
各阶段详解
| 阶段 | 主要工作 | 后端类比 |
|---|---|---|
| 问题定义 | 明确要解决什么问题 | 需求分析 |
| 数据收集 | 获取相关数据 | 数据库设计 |
| 数据预处理 | 清洗、格式化 | 数据清洗ETL |
| 特征工程 | 提取有用特征 | API字段设计 |
| 模型选择 | 选择合适算法 | 技术选型 |
| 模型训练 | 训练模型 | 编码实现 |
| 模型评估 | 测试效果 | 单元测试 |
| 模型部署 | 上线运行 | 服务部署 |
| 监控维护 | 持续优化 | 运维监控 |
七、常见问题与解决方案
| 问题 | 症状 | 解决方案 |
|---|---|---|
| 过拟合 | 训练好、测试差 | 正则化、增加数据、简化模型 |
| 欠拟合 | 训练测试都差 | 增加特征、复杂模型、减少正则化 |
| 数据不平衡 | 某类样本太少 | 重采样、调整权重、数据增强 |
| 特征太多 | 训练慢、效果差 | 特征选择、降维 |
| 超参数难调 | 效果不稳定 | 网格搜索、随机搜索 |
八、后端工程师实践建议
从后端到机器学习的思维转换
推荐学习工具
- Scikit-learn:Python机器学习库,API设计友好
- Jupyter Notebook:交互式编程环境
- 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等)
- 使用有意义的文件名,包含版本或日期
- 在生产环境中验证加载后的模型效果
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)