线性回归与逻辑回归的5折交叉验证
陈拓 2026/7/31-2026/8/1
1. 5折交叉验证核心原理
5折交叉验证(5-fold Cross Validation)是机器学习中用于稳定评估模型泛化能力的核心方法,有效解决单次数据集划分带来的偶然性问题,核心规则如下:
- 将全部数据集随机切分成 5 份互不重叠 的子集(称为 fold);
- 循环执行 5 轮训练与验证:每一轮选取1 份作为验证集 ,剩下 4 份合并作为训练集;
- 每一轮独立训练模型、评估模型性能,最终得到 5 组验证分数;
- 取 5 个验证分数的平均值,作为模型最终的整体泛化性能指标。
1.1 优缺点总结
优点:充分利用全部数据参与训练和验证,彻底减少单次 train_test_split 划分带来的运气偏差,评估结果更客观、稳定。
缺点:需要循环训练5次,训练计算成本约为普通单次划分的5倍。
2. 5折交叉验证原理示意
数据集整体:【Fold1|Fold2|Fold3|Fold4|Fold5】
第1 轮:训练集(Fold2、Fold3、Fold4、Fold5),验证集(Fold1)
第2 轮:训练集(Fold1、Fold3、Fold4、Fold5),验证集(Fold2)
第3 轮:训练集(Fold1、Fold2、Fold4、Fold5),验证集(Fold3)
第4 轮:训练集(Fold1、Fold2、Fold3、Fold5),验证集(Fold4)
第5 轮:训练集(Fold1、Fold2、Fold3、Fold4),验证集(Fold5)
2.1 核心要点
每一轮验证集互不重叠,所有样本都有且仅有一次充当验证数据,数据利用率最大化。
2.2 一句话极简概括
轮流选1份数据做验证集,剩余4份做训练集,循环5次,取平均分评估模型。
3. 回归任务示例(线性回归)
基于模拟回归数据集,使用5折交叉验证评估线性回归模型,输出每折训练、验证分数及平均分。
下面的代码用来评估sklearn的内置模型LinearRegression的泛化能力。
3.1 回归任务代码
Linear_Regression.py
python
import numpy as np
from sklearn.datasets import make_regression
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_validate
# 1. 生成数据集:创建1000条无噪声标准线性回归数据,固定随机种子保证结果可复现
# 数据特征与标签呈严格线性关系,无冗余、无噪声,适合模型拟合测试
X, y = make_regression(n_samples=1000, random_state=0)
# 2. 初始化线性回归模型,无额外参数限制,使用默认拟合规则
lr = LinearRegression()
# 3. 核心执行:5折交叉验证
# cv=5:将数据集自动划分为5份,轮流训练、验证
# return_train_score=True:不仅返回验证集分数,同时输出训练集分数,用于过拟合判断
# 自动循环5轮:4份训练、1份验证,完成全部折数评估
result = cross_validate(lr, X, y, cv=5, return_train_score=True)
# 4. 输出结果:打印每折验证集得分、平均得分、每折训练集得分
print("每折验证集R²得分:", result["test_score"])
print("5折平均验证R²得分:", np.mean(result["test_score"]))
print("每折训练集R²得分:", result["train_score"])
3.2 回归代码运行结果
3.2.1 运行流程图示(极简流程)
数据源(1000条纯净数据) → 初始化模型 → 自动5折拆分数据 → 5轮循环训练+验证 → 保存训练/验证分数 → 计算平均分 → 输出结果
3.2.2 核心运行说明
-
- 自动拆分:无需手动划分训练集、验证集,cross_validate自动完成5折数据拆分与轮换训练
- 批量评估:一次性完成5次模型训练与评估,输出每一轮独立分数,规避单次划分的随机性
- 双向评分:同时获取训练集、验证集分数,可直接对比判断模型是否过拟合、欠拟合
3.2.3 结果
该模拟数据集无噪声、规律清晰,模型拟合效果极佳,所有折数得分趋近于1,无过拟合现象。
每折验证集R²得分: 1. 1. 1. 1. 1.
5折平均验证R²得分: 1.0
每折训练集R²得分: 1. 1. 1. 1. 1.
结果详细说明 :R²取值范围为(-∞,1],分数越接近1代表模型拟合效果越好。本次实验基于 make_regression 生成的纯净无噪声数据集,数据特征与标签存在严格的线性对应关系。因此无论是训练集还是5轮不同的验证集,模型拟合精度均达到满分1.0。训练集分数与验证集分数完全持平,无分数差距,说明模型无过拟合、无欠拟合,泛化性能优异,5折交叉验证结果稳定、可信度极高。
3.3 R²(决定系数)标准解释
R²(R-squared,决定系数/拟合优度)是回归任务专属核心评价指标,用于衡量模型对数据规律的解释能力,反映模型拟合效果的优劣。
- 取值范围通俗解释:(-\\infty, 1\],数学含义为「小于或等于1的所有实数」。中括号代表可以取到最大值1(满分),小括号代表无下限、可以无限变小;永远不会出现大于1的分数。
- 数值含义:R² 越接近 1,代表模型拟合效果越好,模型可以精准解释数据的变化规律;R² 等于 0,代表模型拟合效果等价于直接取数据平均值,未学习到任何特征规律;R² 小于 0,代表模型拟合效果极差,比均值预测效果更差。
- 实验对应关系:本次实验所有折数的训练、验证R²均为1.0,代表模型完全拟合数据线性规律,拟合效果达到最优。
R²(R-squared,决定系数/拟合优度)是回归任务专属核心评价指标,用于衡量模型对数据规律的解释能力,反映模型拟合效果的优劣。
- 取值范围:(-\\infty, 1\]
- 数值含义:R² 越接近 1,代表模型拟合效果越好,模型可以精准解释数据的变化规律;R² 等于 0,代表模型拟合效果等价于直接取数据平均值,未学习到任何特征规律;R² 小于 0,代表模型拟合效果极差,比均值预测效果更差。
- 实验对应关系:本次实验所有折数的训练、验证R²均为1.0,代表模型完全拟合数据线性规律,拟合效果达到最优。
4. 分类任务示例(鸢尾花+逻辑回归)
基于经典鸢尾花数据集,完成分类任务的5折交叉验证,默认评估指标为准确率(accuracy)。下面先展示鸢尾花数据集完整信息查看代码,直观理解实验数据结构。
4.0 鸢尾花数据集可视化与信息查看
鸢尾花(Iris)是机器学习经典多分类数据集,用于区分3种鸢尾花品种,包含4个特征、150条样本,数据均衡、无缺失,非常适合分类模型测试。
4.0.1 代码
Iris_data.py
python
from sklearn.datasets import load_iris
# 加载数据集
iris = load_iris()
X, y = load_iris(return_X_y=True)
# 打印数据集基本信息
print("特征数据 X shape:", X.shape) # 样本数、特征数
print("标签数据 y shape:", y.shape) # 样本标签
print("特征名称:", iris.feature_names)
print("类别名称:", iris.target_names)
print("前5行特征数据:")
print(X[:5])
print("前5个标签:", y[:5])
4.0.2 数据集运行输出结果
特征数据 X shape: (150, 4)
标签数据 y shape: (150,)
特征名称: 'sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'
(花萼长度(厘米)、花萼宽度(厘米)、花瓣长度(厘米)、花瓣宽度(厘米))
类别名称: 'setosa' 'versicolor' 'virginica'
(山鸢尾 变色鸢尾 弗吉尼亚鸢尾)
前5行特征数据:
\[5.1 3.5 1.4 0.2
4.9 3. 1.4 0.2
4.7 3.2 1.3 0.2
4.6 3.1 1.5 0.2
5. 3.6 1.4 0.2\]
前5个标签: 0 0 0 0 0
数据集运行输出结果说明前 5 行特征数据的标签为 0,也就是前 5 行特征数据被标注为 setosa(山鸢尾)。
4.0.3 数据集核心信息解读
- 数据规模:共150条样本,4维特征,1维分类标签,数据集结构规整、无缺失值。
- 分类任务:3分类任务,标签0/1/2分别对应三种鸢尾花品种
- 数据特点:样本均衡、数据干净、特征区分度高,因此逻辑回归5折准确率极高、泛化效果稳定
- 标签与品种严格对应关系:鸢尾花数据集为规整有序数据集,标签与花卉品种一一映射,是模型分类学习的核心依据:
- 标签 0 → setosa(山鸢尾)
- 标签 1 → versicolor(变色鸢尾)
- 标签 2 → virginica(维吉尼亚鸢尾)
- 样本分布规律:数据集样本有序排列,0--49号样本为setosa、50--99号样本为versicolor、100--149号样本为virginica,三类样本数量均衡。
- 数据特点:样本均衡、数据干净、不同品种特征区分度高,因此逻辑回归模型训练效果好,5折交叉验证准确率极高、泛化效果稳定。
4.1 分类任务代码
下面的代码用来评估sklearn的内置模型LogisticRegression的泛化能力。
Logistic_Regression.py
python
import numpy as np
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_validate
# 加载鸢尾花分类数据集
X, y = load_iris(return_X_y=True)
# 初始化逻辑回归模型,增大迭代次数保证模型收敛
clf = LogisticRegression(max_iter=200, random_state=0)
# 5折交叉验证,同时返回训练集、验证集评分
res = cross_validate(clf, X, y, cv=5, return_train_score=True)
# 打印分类任务准确率结果
print("5折验证集准确率:", res["test_score"])
print("5折平均准确率:", np.mean(res["test_score"]))
4.2 分类代码运行结果示例
鸢尾花数据集分类难度低,模型泛化能力优秀,5折交叉验证准确率稳定且数值较高。
5折验证集准确率: 0.96666667 1. 0.93333333 0.96666667 1.
5折平均准确率: 0.9733333333333334
5. 核心API说明(cross_validate)
5.1 函数原型
cross_validate(estimator, X, y, cv=5)
5.2 关键参数
-
- cv=5:指定5折交叉验证,支持传入整数、自定义数据分割器
5.3 返回字典常用键值
-
- test_score:每一轮验证集的评估分数(核心参考指标)
- train_score:每一轮训练集的评估分数,用于判断过拟合
- fit_time:每一轮模型训练耗时
- score_time:每一轮模型评估耗时
6. 基于5折结果的过拟合判断规则
- 泛化效果良好:训练集分数 ≈ 验证集分数,模型无明显过拟合、欠拟合
- 存在过拟合:训练集分数远高于验证集分数,模型在训练数据表现极好、未知数据表现差
7. 核心概念区分
7.1 train_test_split单次划分 VS 5折交叉验证
- train_test_split:仅单次划分训练集、测试集,代码简单、速度快,但评估结果存在随机性,容易受数据划分运气影响
- 5 折交叉验证:多次划分、循环评估,结果稳定可靠、客观性强,但计算量更大、训练耗时更长
8. 全文总结
5折交叉验证通过将数据集均分为5份,轮流轮换训练集与验证集,充分利用全部数据,规避单次划分的偶然性,通过多轮评分均值稳定评估模型的泛化能力,是机器学习模型评估、超参数优选的基础核心方法。
9. 线性回归与逻辑回归的核心对比
本文档分别使用了线性回归(回归任务) 、**逻辑回归(分类任务)**配合5折交叉验证完成模型评估,二者极易混淆,下面做标准区分:
9.1 核心用途区别
- 线性回归(LinearRegression ) :用于回归任务 ,预测连续数值。
- 示例:房价预测、温度预测、数据趋势拟合。
- 逻辑回归(LogisticRegression ) :用于二分类 / 多分类任务 ,预测离散类别。
- 示例:花朵分类、是否违约、正负样本判别。
9.2 预测输出区别
- 线性回归:输出实数,范围 (-\\infty,+\\infty),可以是任意连续数值。
- 逻辑回归:输出概率值(0~1之间),最终映射为离散类别 0/1。
9.3 评价指标区别(对应本文实验)
- 线性回归(回归) :使用 R² 决定系数
- 衡量模型拟合程度,越接近1拟合效果越好。
- 逻辑回归(分类) :使用 准确率 accuracy
- 衡量分类正确样本的占比,越接近1精度越高。
9.4 模型公式与拟合目标
- 线性回归:直接拟合直线 y=wx+b,最小化预测值与真实值的误差。
- 逻辑回归:在线性基础上增加sigmoid映射,将结果压缩至0~1,用于概率分类。
9.5 结合5折交叉验证的统一特点
无论是线性回归还是逻辑回归,都可以直接放入 cross_validate 进行5折交叉验证:
- 自动规避单次划分的随机性;
- 统一使用「训练分数&验证分数」对比判断过拟合;
- 取多轮均值,模型评估结果更稳定、可信。
9.6 极简一句话区分
线性回归:预测数字(连续);逻辑回归:预测类别(离散)。