利用sklearn.StratifiedKFold函数实现K折交叉验证

本文详细介绍了K折交叉验证的概念,强调了StratifiedKFold在确保验证集各类别比例一致的重要性。通过实例展示了如何使用sklearn库中的StratifiedKFold函数进行数据划分,并解释了其参数意义,如n_splits、shuffle和random_state。最后,讨论了选择K值时需考虑的因素,以确保正确划分测试集和训练集。
摘要由CSDN通过智能技术生成

定义

所谓K折交叉验证就是将数据集分为K份,先拿其中的K-1份当作训练集,另外一份当作测试集,依次进行K次(让每份数据轮流当测试集)。将K次实验的结果取平均值就是最终的结果。

StratifiedKFold函数是从sklearn模块中导出的函数,StratifiedKFold函数采用分层划分的方法(分层随机抽样思想),验证集中不同类别占比与原始样本的比例保持一致,故StratifiedKFold在做划分的时候需要传入标签特征。

参数

StratifiedKFold函数共有三个参数:

n_splits:默认为3,表示将数据划分为多少份,即k折交叉验证中的k;

shuffle:默认为False,表示是否需要打乱顺序,这个参数在很多的函数中都会涉及,如果设置为True,则会先打乱顺序再做划分,如果为False,会直接按照顺序做划分;

random_state:默认为None,表示随机数的种子,只有当shuffle设置为True的时候才会生效。当设定某个值时,模型的训练集和测试集就固定了,方便复现结果。

举例

import numpy as np
rs = np.random.randint(0,1000,1)[0]  # 在0-999中随机取一个数
from sklearn.model_selection import StratifiedKFold
X = np.array([[1,2],[3,4],[1,2],[3,4],[5,9],[1,5],[3,9],[5,8],[1,1],[1,4]])
y = np.array([0, 1, 1, 1, 0, 0, 1, 0, 1, 0])  

# print('X:',X)
# print('y:',y)

kf = StratifiedKFold(n_splits=5,shuffle=True,random_state=1111)  # 五折交叉验证,随机种子取为1111
print(kf)
#做split时既要传入数据,也要传入标签
for train_index, test_index in kf.split(X,y):
    print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    

在用StratifiedKFold函数时,因为在split时,分的测试集和训练集中的正样本、负样本比例和原数据集中的正样本、负样本比例要相同,所以在选择K的时候要考虑能否正确的划分测试集、训练集!!!

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`sklearn.model_selection`是Scikit-learn库中用于模型选择和评估的模块。它提供了一系列用于交叉验证、参数调优、数据集划分等常用的工具函数和类,使得我们能够更加方便地进行模型选择和评估。具体包括以下内容: 1. `train_test_split`: 数据集划分函数,用于将数据集划分为训练集和测试集。 2. `KFold`: K折交叉验证生成器,用于将数据集划分为K份,每次使用其中K-1份作为训练集,1份作为验证集,进行K次交叉验证。 3. `StratifiedKFold`: 分层K折交叉验证生成器,用于解决数据集中类别不平衡问题。 4. `GridSearchCV`: 网格搜索与交叉验证结合的参数调优器,用于寻找最优超参数组合。 5. `RandomizedSearchCV`: 随机搜索与交叉验证结合的参数调优器,可以在参数空间中随机采样一定数量的超参数组合进行训练和评估。 6. `cross_val_score`: 交叉验证评估函数,用于对模型进行K折交叉验证,并返回K次验证的评分结果。 7. `learning_curve`: 学习曲线生成器,用于分析模型在不同大小的训练集上的表现。 8. `validation_curve`: 验证曲线生成器,用于分析模型在不同超参数取值下的表现。 优化前的代码如下: ```python from sklearn.model_selection import train_test_split from sklearn.model_selection import GridSearchCV from sklearn.svm import SVC X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) params = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']} svc = SVC() clf = GridSearchCV(svc, params) clf.fit(X_train, y_train) print(clf.score(X_test, y_test)) ``` 这段代码的问题在于没有使用交叉验证来评估模型性能,只是将数据集简单地划分为训练集和测试集进行评估。这种方式容易造成模型性能估计不准确的问题。 针对这个问题,我们可以使用`cross_val_score`函数来进行交叉验证评估。同时,还可以使用`Pipeline`类将数据预处理和模型训练过程结合起来,方便实现一系列数据预处理和特征工程操作。 优化后的代码如下: ```python from sklearn.model_selection import cross_val_score from sklearn.model_selection import GridSearchCV from sklearn.pipeline import Pipeline from sklearn.svm import SVC from sklearn.preprocessing import StandardScaler pipe = Pipeline([('scaler', StandardScaler()), ('svc', SVC())]) params = {'svc__C': [0.1, 1, 10], 'svc__kernel': ['linear', 'rbf']} clf = GridSearchCV(pipe, params, cv=5) scores = cross_val_score(clf, X, y, cv=5) print('Accuracy: %0.3f (+/- %0.3f)' % (scores.mean(), scores.std() * 2)) ``` 优化说明: 1. 使用`Pipeline`类将数据预处理和模型训练过程结合起来,方便实现一系列数据预处理和特征工程操作。 2. 使用`cross_val_score`函数进行交叉验证评估,避免了模型性能估计不准确的问题。 3. 指定了`GridSearchCV`中的交叉验证折数为5,使得模型可以更加准确地评估性能。 4. 在`GridSearchCV`中指定了`svc__C`和`svc__kernel`参数,表示需要对SVM的惩罚参数C和核函数类型进行调优。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值