是否有函数可计算时间序列交叉验证全程的总得分?
解决方案
scikit-learn中没有直接返回时间序列交叉验证全程总得分的函数,但可以通过两种方式手动实现,核心思路是收集所有测试折的预测结果,再用完整的测试样本标签和预测结果计算一次得分:
方法1:使用cross_val_predict(简洁版)
cross_val_predict会按照你定义的tscv划分规则,依次对每个测试折做预测,最终返回所有测试样本的预测值数组(保持原始数据顺序),直接用这个数组和真实标签计算总得分即可:
from sklearn.model_selection import cross_val_predict from sklearn.metrics import precision_score from sklearn.svm import SVC # 获取所有测试样本的预测结果 y_pred = cross_val_predict( SVC(), X, y, cv=tscv, n_jobs=-1 ) # 计算全程总精度得分(和你之前用的scorer参数一致) total_precision = precision_score(y, y_pred, zero_division=1)
方法2:手动遍历交叉验证折(灵活版)
如果需要更灵活的控制(比如记录每折的训练细节),可以手动遍历tscv的划分索引,收集所有测试集的真实标签和预测结果:
from sklearn.base import clone from sklearn.metrics import precision_score from sklearn.svm import SVC model = SVC() y_true_all = [] y_pred_all = [] # 遍历每个交叉验证折 for train_idx, test_idx in tscv.split(X): # 划分训练/测试集 X_train, X_test = X[train_idx], X[test_idx] y_train, y_test = y[train_idx], y[test_idx] # 克隆模型,避免不同折之间的参数干扰 clf = clone(model) clf.fit(X_train, y_train) # 预测并收集结果 y_pred = clf.predict(X_test) y_true_all.extend(y_test) y_pred_all.extend(y_pred) # 计算全程总得分 total_precision = precision_score(y_true_all, y_pred_all, zero_division=1)
注意事项
- 两种方法都严格遵循时间序列交叉验证的规则:训练集始终在测试集的时间区间之前,不会出现数据泄露问题。
- 计算总得分时的参数(比如
zero_division=1)要和你之前make_scorer里的设置保持一致,确保得分标准统一。
内容的提问来源于stack exchange,提问作者OldChi
相关产品推荐
相关产品推荐

