如何对异行数同列数的多组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
相关产品推荐
相关产品推荐

