You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Scikit-learn对52个CSV文件执行留一交叉验证?

嘿,我刚好处理过类似的场景——用52个CSV文件做留一交叉验证,核心是把每个文件当作一个独立样本对吧?我来一步步给你讲清楚怎么实现,顺便修正你代码里的小问题~

核心思路

你的需求是文件级别的留一交叉验证:每次把1个CSV文件作为测试集,剩下51个作为训练集,循环52次后得到整体的模型评估结果。首先得把每个CSV转换成模型能识别的「样本特征」和「标签」,再用Scikit-learn的LeaveOneOut来实现分割。

完整实现步骤

1. 导入正确的库

注意:你原来用的sklearn.cross_validation已经被废弃了,现在官方推荐用sklearn.model_selection里的工具:

import glob
import numpy as np
import pandas as pd
from sklearn.model_selection import LeaveOneOut
# 下面是示例模型和评估指标,你可以换成自己需要的
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

2. 加载并预处理所有CSV文件

这一步是关键:你需要把每个CSV转换成一个「样本」,也就是提取该文件对应的特征向量和标签。这里给两种常见场景的示例:

# 替换成你的实际文件夹路径
path = r'...................\Data\New design process data'
# 获取所有CSV文件的路径
filelist = glob.glob(path + "/*.csv")

# 初始化存储特征和标签的列表
X = []  # 每个元素是一个样本的特征向量
y = []  # 每个元素是对应样本的标签

for file_path in filelist:
    # 读取CSV文件
    df = pd.read_csv(file_path)
    
    # --------------------------
    # 场景1:每个CSV是某个样本的多组观测数据(比如一个产品的多次检测记录)
    # 提取统计特征作为该样本的代表(比如均值、标准差、最大值等)
    # 假设你的特征列是除了标签列之外的所有列,替换成你的实际列名
    feature_cols = [col for col in df.columns if col != 'label']
    sample_features = df[feature_cols].agg(['mean', 'std', 'max', 'min']).values.flatten()
    
    # 场景2:每个CSV本身就是一个样本的特征向量(比如只有一行数据)
    # sample_features = df.drop('label', axis=1).values.flatten()
    
    # --------------------------
    # 提取样本标签:两种方式选其一
    # 方式1:从文件名提取(比如文件名是"sample_0_class_A.csv")
    # label = file_path.split('_')[-1].split('.')[0]
    
    # 方式2:从文件内的标签列提取(假设每个文件的标签都在同一列)
    label = df['label'].iloc[0]  # 取第一行的标签值
    
    # 添加到列表
    X.append(sample_features)
    y.append(label)

# 转换成NumPy数组,方便Scikit-learn处理
X = np.array(X)
y = np.array(y)

3. 执行留一交叉验证

现在用LeaveOneOut来自动生成训练/测试分割,循环训练并评估模型:

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

# 存储每次的测试得分
scores = []

# 遍历每个分割
for train_idx, test_idx in loo.split(X):
    # 分割训练集和测试集
    X_train, X_test = X[train_idx], X[test_idx]
    y_train, y_test = y[train_idx], y[test_idx]
    
    # 初始化模型(替换成你需要的模型,比如回归模型用RandomForestRegressor)
    model = RandomForestClassifier(random_state=42)
    
    # 训练模型
    model.fit(X_train, y_train)
    
    # 预测并计算得分
    y_pred = model.predict(X_test)
    score = accuracy_score(y_test, y_pred)
    scores.append(score)
    
    # 可选:打印当前轮次的结果
    print(f"第{test_idx[0]+1}轮测试,得分:{score:.4f}")

# 输出最终的平均得分
print(f"\n留一交叉验证平均得分:{np.mean(scores):.4f}")
关键注意事项
  • 样本定义要准确:如果你的「样本」不是文件级别的,而是每个CSV里的行,那只需要把所有CSV的行合并成一个大数据集,再用LeaveOneOut分割行即可——但根据你的描述,应该是文件作为样本。
  • 特征提取要贴合任务:如果是时序数据,你可能需要提取时域/频域特征(比如小波变换、ARIMA系数);如果是图像数据(CSV存像素值),直接用像素向量即可。
  • 模型和评估指标可替换:分类任务用accuracy_score、f1_score,回归任务用mean_absolute_error、r2_score,模型换成对应的分类/回归器就行。

内容的提问来源于stack exchange,提问作者Lzz0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:50:09