Cross-validation 交叉验证与训练集测试集划分

本文介绍了如何使用sklearn进行交叉验证和数据集划分,包括训练集和测试集的创建、交叉验证指标计算、随机排列交叉验证、分层交叉验证、分组数据的交叉验证以及时间序列数据的交叉验证。详细步骤和代码示例可参考官方文档。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于代码比较简单,直接看代码生成的结果更容易理解代码的功能和作用,所以没有添加更多的说明。
参考官方文档地址:http://scikit-learn.org/stable/modules/cross_validation.html#cross-validation-evaluating-estimator-performance

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn import svm

划分训练集和测试集(train_set,test_set)

iris=datasets.load_iris()
iris.data.shape,iris.target.shape
((150, 4), (150,))
X_train,X_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.4,random_state=0)
X_train.shape,y_train.shape
((90, 4), (90,))
X_test.shape,y_test.shape
((60, 4), (60,))
clf=svm.SVC(kernel='linear',C=1).fit(X_train,y_train)
clf.score(X_test,y_test)
0.96666666666666667

计算交叉验证的指标

from sklearn.model_selection import cross_val_score
clf=svm.SVC(kernel='linear',C=1)
scores=cross_val_score(clf,iris.data,iris.target,cv=5)#5折交叉验证
scores
array([ 0.96666667,  1.        ,  0.96666667,  0.96666667,  1.        ])
#平均值和95%的置信区间可以计算得出
print("Accuary: %0.2f(+/-%0.2f)" % (scores.mean(),scores.std()*2))
Accuary: 0.98(+/-0.03)
#默认情况下,每次CV迭代计算score是估计量的得分方法。可以通过使用评分参数来改变其评分参数:
from sklearn import metrics
scores=cross_val_score(clf,iris.data,iris.target,cv=5,scoring='f1_macro')
scores
array([ 0.96658312,  1.        ,  0.96658312,  0.96658312,  1.        ])
#由于水仙花数据集中的正负样本个数是均衡的,所以准确率和F1值的得分很相似
#也可以通过传递交叉验证迭代器参数,使用其他交叉验证策略,例如:
from sklearn.model_selection import ShuffleSplit
n_samples=iris.data.shape[0]
cv=ShuffleSplit(n_splits=
<think>嗯,用户想了解时间序列走前交叉验证的方法或实现。首先,我需要回忆一下时间序列交叉验证和普通交叉验证的区别。时间序列数据有严格的时间顺序,所以不能像普通数据那样随机划分,否则会导致数据泄漏。走前交叉验证应该是一种逐步扩展训练集,用后续的数据做验证的方法。 然后,我需要确定时间序列交叉验证的常见方法。比如,TimeSeriesSplit在scikit-learn中的实现,或者更复杂的滚动窗口方法。可能需要解释基本概念,比如训练集逐步增加,测试集紧随其后,每次移动一个时间步或者多个。 接下来,用户可能需要具体的步骤或实现代码。比如用Python的sklearn库的TimeSeriesSplit,或者自己手动实现一个walk-forward的交叉验证。要注意时间序列的次序,确保测试集总是在训练集之后。 另外,用户可能想知道为什么需要这种方法,即时间序列数据的时间依赖性导致传统交叉验证不适用。需要强调防止未来信息泄漏到训练集中的重要性。 可能还需要提到一些优化方法,比如调整窗口大小,是否使用滚动窗口还是扩展窗口。或者如何处理长时间序列中的季节性因素。 然后,检查是否有相关的引用资料。用户提供的引用中,引用[1]提到训练集和验证集的指标差异,这可能和交叉验证中不同划分导致的性能波动有关,可以联系起来。引用[2]关于Android Things的应用可能不相关,但需要确认是否有相关内容。 最后,生成相关问题,比如其他交叉验证方法的对比,参数调整,实际应用案例等。确保问题覆盖用户可能进一步想了解的内容。 现在,组织回答结构:先介绍基本概念,然后步骤,代码示例,注意事项,引用相关文献,最后生成相关问题。确保使用正确的中文术语,LaTeX格式的数学表达式,代码块正确标注,引用标识自然添加。</think>### 时间序列走前交叉验证(Walk-Forward Cross-Validation) #### 基本概念 时间序列数据具有严格的时间依赖性,传统交叉验证(如k-fold)会破坏时间顺序,导致未来信息泄漏到训练集中[^1]。走前交叉验证通过**逐步扩展训练集**、**固定或滚动时间窗口**的方式解决这一问题,确保模型仅在历史数据上训练,并在未来数据上验证。 #### 实现步骤 1. **初始化窗口**:设定初始训练集大小(如前$t$个时间点)。 2. **迭代验证**: - 每次用当前训练集训练模型。 - 预测下一个时间点(或下一组时间点)作为验证集。 - 将验证集数据加入训练集,进入下一轮迭代。 3. **性能评估**:汇总所有验证结果计算平均指标(如MAE、RMSE)。 #### Python实现示例(使用`sklearn`) ```python from sklearn.model_selection import TimeSeriesSplit from sklearn.metrics import mean_squared_error import numpy as np # 生成示例时间序列数据 X = np.array([[i] for i in range(10)]) y = np.arange(10) # 定义走前交叉验证(3次分割) tscv = TimeSeriesSplit(n_splits=3) for train_index, test_index in tscv.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) print(f"MSE: {mean_squared_error(y_test, y_pred)}") ``` #### 关键参数 - `n_splits`:验证轮数 - `max_train_size`:训练集最大长度 - `test_size`:单次验证集长度 #### 注意事项 1. **窗口类型**: - **扩展窗口**:训练集逐步扩大(保留所有历史数据) - **滚动窗口**:固定训练集长度(仅保留最近$N$期数据) 2. **数据平稳性**:非平稳时间序列需先进行差分或变换 3. **计算效率**:滚动窗口更适合长序列,减少计算负担
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值