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

如何对异行数同列数的多组DataFrame实现监督分类交叉验证?

留一法交叉验证实现多数据集的训练测试组合评估

没问题,我来帮你搞定这个需求!你的思路完全靠谱——给每个DataFrame添加标识列后合并,再通过掩码区分训练/测试集的方案完全可行,下面是完整的示例代码,用scikit-learn的随机森林分类器来演示:

1. 准备模拟数据

首先我们先生成和你描述一致的4个DataFrame,方便你直接运行测试:

import pandas as pd
import numpy as np
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# 生成模拟分类数据,4个特征(对应4列)
def create_df(n_rows):
    X, y = make_classification(n_samples=n_rows, n_features=4, random_state=42)
    df = pd.DataFrame(X, columns=[f"feat_{i+1}" for i in range(4)])
    df["target"] = y
    return df

# 创建4个不同行数的DataFrame
df1 = create_df(200)
df2 = create_df(100)
df3 = create_df(300)
df4 = create_df(250)

2. 合并数据集并添加来源标识

给每个数据集添加一个source列,标记它来自哪个原始DataFrame,然后合并成一个大的数据集:

# 给每个df添加来源标识
df1["source"] = "df1"
df2["source"] = "df2"
df3["source"] = "df3"
df4["source"] = "df4"

# 合并所有数据集
combined_df = pd.concat([df1, df2, df3, df4], ignore_index=True)

3. 自动化留一法交叉验证

循环遍历每个数据源,将其作为测试集,其余三个作为训练集,训练模型并记录准确率:

# 初始化分类器(你可以替换成其他scikit-learn分类器,比如LogisticRegression、SVC等)
clf = RandomForestClassifier(random_state=42)

# 存储每个组合的准确率
accuracy_results = {}

# 遍历每个数据源作为测试集
for test_source in ["df1", "df2", "df3", "df4"]:
    # 拆分训练集和测试集:测试集是当前source的数据,训练集是其他所有数据
    train_data = combined_df[combined_df["source"] != test_source]
    test_data = combined_df[combined_df["source"] == test_source]
    
    # 提取特征和目标变量
    X_train, y_train = train_data.drop(["target", "source"], axis=1), train_data["target"]
    X_test, y_test = test_data.drop(["target", "source"], axis=1), test_data["target"]
    
    # 训练模型
    clf.fit(X_train, y_train)
    
    # 预测并计算准确率
    y_pred = clf.predict(X_test)
    acc = accuracy_score(y_test, y_pred)
    accuracy_results[test_source] = acc
    
    # 打印当前组合的结果
    print(f"以{test_source}为测试集的准确率: {acc:.4f}")

4. 找出最优组合

最后我们比较所有结果,找出准确率最高的那个组合:

# 找出准确率最高的测试集
best_test_source = max(accuracy_results, key=accuracy_results.get)
best_acc = accuracy_results[best_test_source]

print(f"\n最优组合:以{best_test_source}为测试集,其余为训练集,准确率为{best_acc:.4f}")

这样整个流程就完全自动化啦!你可以根据实际需求替换分类算法、调整评估指标(比如换成F1分数、AUC值),或者对数据做预处理(比如标准化、缺失值填充),只需要在拆分训练测试集之后添加对应的步骤即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:49:10