本文主要讲解关于【机器学习】掌握交叉验证,机器学习还有什么问题无法解决的呢?相关内容,让我们来一起学习下吧!
交叉验证
- 1、引言
- 2、交叉验证
-
- 2.1 交叉验证
-
- 2.1.1 定义
- 2.1.2 重要性
- 2.1.3 类型
- 2.2 k折交叉检验
-
- 2.2.1 解析
- 2.2.2 示例
- 2.3 分层k折交叉检验
-
- 2.3.1 解析
- 2.3.2 示例
- 2.4 暂留交叉检验
-
- 2.4.1 解析
- 2.4.2 示例
- 2.5 留一交叉检验
-
- 2.5.1 解析
- 2.5.2 示例
- 2.6 分组k折交叉检验
-
- 2.6.1 解析
- 2.6.2 示例
- 3、总结
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博客专家;
- 企业认证金牌面试官;
- 多个名企认证&特邀讲师等;
- 名企签约职场面试培训、职场规划师;
- 多个国内主流技术社区的认证专家博主;
- 多款主流产品(阿里云等)测评一、二等奖获得者;
关注小鱼,学习【机器学习】&【深度学习】领域的知识。
以上就是关于【机器学习】掌握交叉验证,机器学习还有什么问题无法解决的呢?相关的全部内容,希望对你有帮助。欢迎持续关注程序员导航网,学习愉快哦!