【机器学习】掌握交叉验证,机器学习还有什么问题无法解决的呢?

1、引言

小云:鱼哥,机器学习遇到问题,如何解决?
小鱼:这… 范围有些大哦
小屌丝:这还不简单, 修改代码解决呗。
小云:你可以去乘凉了。
小屌丝:我说的也没错啊
小鱼:确实,这说了,跟没说一样。
小云:鱼哥,能不能给点建议
小鱼:嗯, 一般机器学习项目中遇到问题,交叉验证可以试一下。
小屌丝:啊,对对对, 我知道交叉验证
小鱼:要不,你来讲一讲
小屌丝:讲就讲,终于可以露脸了。
在这里插入图片描述

2、交叉验证

2.1 交叉验证

2.1.1 定义

交叉检验是构建机器学习模型过程中的一个步骤,它可以帮助我们确保模型准确拟合数据,同时确保我们不会过拟合。

在这里插入图片描述

2.1.2 重要性

交叉验证的重要性

  • 减少过拟合:通过在不同的数据子集上训练和测试模型,交叉验证有助于减少模型对训练数据的过度拟合,从而提高模型在未见过数据上的性能。
  • 性能评估:交叉验证提供了一个客观的评估框架,能够更准确地估计模型的性能,而不是仅仅依赖于单一的训练-测试分割。
  • 鲁棒性:由于交叉验证涉及多次训练和测试迭代,因此它提供了对模型性能的更鲁棒估计,减少了单次分割的随机性影响。

2.1.3 类型

交叉验证的类型

  • k折交叉检验
  • 分层k折交叉检验
  • 暂留交叉检验
  • 留一交叉检验
  • 分组k折交叉检验

2.2 k折交叉检验

2.2.1 解析

K折交叉验证将数据集分为K个大小相等的子集(或“折”),然后依次使用K-1个子集作为训练集,剩下的一个子集作为测试集。

这个过程重复K次,每次选择一个不同的子集作为测试集。

2.2.2 示例

# -*- coding:utf-8 -*-
# @Time   : 2024-05-05
# @Author : Carl_DJ

# 导入KFold模块用于数据分割  
from sklearn.model_selection import KFold    
# 导入Iris数据集,这是一个经典的多分类问题数据集  
from sklearn.datasets import load_iris    
# 导入SVC类,这是支持向量机的一种,用于分类  
from sklearn.svm import SVC    
# 导入accuracy_score函数,用于计算分类准确率  
from sklearn.metrics import accuracy_score    
  
# 加载Iris数据集  
iris = load_iris()    
# 提取特征集X和目标集y  
X, y = iris.data, iris.target    
  
# 创建一个KFold对象,设置将数据分为5份,并在分割前打乱数据,设置随机种子为42  
kf = KFold(n_splits=5, shuffle=True, random_state=42)    
# 创建一个SVC分类器实例,使用线性核函数,C=1,并设置随机种子为42  
svm = SVC(kernel='linear', C=1, random_state=42)    
  
# 初始化一个列表用于存储每次迭代的准确率  
accuracies = []    
  
# 对KFold对象进行迭代,每次迭代都会返回训练集和测试集的索引  
for train_index, test_index in kf.split(X):    
    # 使用索引从原始数据集中分割出训练集和测试集  
    X_train, X_test = X[train_index], X[test_index]    
    y_train, y_test = y[train_index], y[test_index]    
      
    # 使用训练集训练SVM分类器  
    svm.fit(X_train, y_train)    
      
    # 使用测试集预测目标值  
    y_pred = svm.predict(X_test)    
      
    # 计算预测准确率,并将结果添加到accuracies列表中  
    accuracies.append(accuracy_score(y_test, y_pred))    
  
# 计算平均准确率并打印结果  
print("Average accuracy:", sum(accuracies) / len(accuracies))


2.3 分层k折交叉检验

2.3.1 解析

分层K折交叉验证(Stratified K-Fold Cross-Validation)是一种交叉验证方法,特别适用于处理不平衡数据集,即某些类别的样本数量远多于其他类别。

与标准的K折交叉验证不同,分层K折交叉验证在每次分割数据时,会保持原始数据集中各个类别的样本比例,从而确保训练集和测试集在类别分布上的一致性。

2.3.2 示例

# -*- coding:utf-8 -*-
# @Time   : 2024-05-05
# @Author : Carl_DJ

from sklearn.model_selection import StratifiedKFold
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import numpy as np

# 加载数据集,以鸢尾花数据集为例
X, y = load_iris(return_X_y=True)

# 初始化分层K折交叉验证,这里以5折为例
stratified_kfold = StratifiedKFold(n_splits=5)

# 初始化一个线性模型,这里以逻辑回归为例
model = LogisticRegression(max_iter=200)

# 存储每次迭代的准确率
scores = []

# 分层K折交叉验证
for train_index, test_index in stratified_kfold.split(X, y):
    # 根据索引生成训练数据和测试数据
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    # 训练模型
    model.fit(X_train, y_train)
    
    # 预测测试集
    y_pred = model.predict(X_test)
    
    # 计算并存储准确率
    score = accuracy_score(y_test, y_pred)
    scores.append(score)

# 输出每次迭代的准确率以及平均准确率
print("每次迭代的准确率:", scores)
print("平均准确率:", np.mean(scores))


2.4 暂留交叉检验

2.4.1 解析

暂留交叉验证将数据集分为两个子集:一个训练集一个测试集

这种方法简单但可能不够稳定,因为只使用一次测试集。

2.4.2 示例

# -*- coding:utf-8 -*-
# @Time   : 2024-05-05
# @Author : Carl_DJ

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 加载数据
X, y = load_iris(return_X_y=True)

# 分割数据集为训练集和测试集,这里使用70%的数据作为训练集,30%作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 初始化模型,这里使用逻辑回归作为示例
model = LogisticRegression(max_iter=200)

# 训练模型
model.fit(X_train, y_train)

# 预测测试集
y_pred = model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)

# 打印准确率
print(f"模型准确率: {accuracy}")


2.5 留一交叉检验

2.5.1 解析

留一交叉验证是K折交叉验证的一个极端情况,其中K等于数据集的大小。

这意味着每次迭代都会留下一个样本作为测试集,其余样本作为训练集。

这种方法非常耗时,但可以提供对模型性能的非常准确的估计。

2.5.2 示例

# -*- coding:utf-8 -*-
# @Time   : 2024-05-05
# @Author : Carl_DJ

from sklearn.model_selection import LeaveOneOut
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import numpy as np

# 加载数据集,这里以鸢尾花数据集为例
X, y = load_iris(return_X_y=True)

# 初始化留一交叉验证
loo = LeaveOneOut()

# 初始化模型,这里以逻辑回归为例
model = LogisticRegression(max_iter=200)

# 用于存储每个测试样本的预测正确与否
correct_predictions = 0

# 留一交叉验证
for train_index, test_index in loo.split(X):
    # 生成训练数据和测试数据
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    # 训练模型
    model.fit(X_train, y_train)
    
    # 预测测试集
    y_pred = model.predict(X_test)
    
    # 累加预测正确的次数
    correct_predictions += (y_pred == y_test)

# 计算总的准确率
accuracy = correct_predictions / len(y)

# 打印准确率
print(f"留一交叉验证的准确率为: {accuracy}")


2.6 分组k折交叉检验

2.6.1 解析

分组K折交叉验证在处理具有依赖关系的样本时非常有用,例如时间序列数据或来自同一患者的多个样本。

它确保在训练和测试集中不会混合来自同一组的样本。

2.6.2 示例

# -*- coding:utf-8 -*-
# @Time   : 2024-05-05
# @Author : Carl_DJ

from sklearn.model_selection import GroupKFold
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import numpy as np

# 创建一个模拟的分类数据集
X, y = make_classification(n_samples=100, n_features=10, n_informative=5, n_redundant=5, random_state=42)

# 为了演示分组效果,我们人为创建一些组
# 假设数据集中有10个组,每个组有10个样本
groups = np.array([i // 10 for i in range(100)])

# 初始化分组K折交叉验证对象,这里设置为5折
gkf = GroupKFold(n_splits=5)

# 初始化模型,这里使用逻辑回归
model = LogisticRegression(max_iter=200)

# 用于存储每次迭代的准确率
scores = []

# 分组K折交叉验证
for train_index, test_index in gkf.split(X, y, groups=groups):
    # 生成训练数据和测试数据
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    # 训练模型
    model.fit(X_train, y_train)
    
    # 预测测试集
    y_pred = model.predict(X_test)
    
    # 计算并存储准确率
    score = accuracy_score(y_test, y_pred)
    scores.append(score)

# 输出每次迭代的准确率以及平均准确率
print("每次迭代的准确率:", scores)
print("平均准确率:", np.mean(scores))


在这里插入图片描述

3、总结

交叉验证是一种强大的模型评估技术,能够提供对机器学习模型性能的可靠估计。

通过选择合适的交叉验证策略(如K折交叉验证、分层K折交叉验证等),并根据数据集的特点和问题的需求进行调整,可以更准确地评估模型的性能,并选择最佳的模型配置。

在机器学习的实践中,交叉验证是不可或缺的步骤之一。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 企业认证金牌面试官
  • 多个名企认证&特邀讲师等
  • 名企签约职场面试培训、职场规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)测评一、二等奖获得者

关注小鱼,学习【机器学习】&【深度学习】领域的知识。

  • 30
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Carl_奕然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值