使用两个数据集训练测试决策树:报错排查及结果导出求助
错误原因排查与解决
核心错误原因
你遇到的ValueError本质是混淆矩阵计算时输入的真实标签和预测标签样本数不匹配:
y_test是通过train_test_split从训练集拆分出的内部测试集,样本数为1500*0.3=450y_predict是用外部的data_test.csv(917个样本)预测得到的结果,样本数为917
两者长度不一致,无法计算混淆矩阵。
另外,预测时直接传入test_data也存在问题:test_data包含107列(含目标列),而训练时模型接收的是106列特征,虽然这一步没直接报错,但不符合模型输入要求,应该提取前106列特征作为预测输入。
修正后的代码示例
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import classification_report,confusion_matrix # 读取并预处理数据 test_data = pd.read_csv("data_test.csv") Data = pd.read_csv("data.csv") Data = Data.fillna(0) test_data = test_data.fillna(0) # 处理训练集 X = Data.iloc[:, 0:106] y = Data["Target (Col 107)"] X_train, X_test_internal, y_train, y_test_internal = train_test_split(X, y, test_size=.30, random_state=1) # 训练模型 dTreeR = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=1) dTreeR.fit(X_train, y_train) # 评估内部测试集 print("内部测试集得分:", dTreeR.score(X_test_internal, y_test_internal)) # 处理外部测试集:提取特征和真实标签 X_test_external = test_data.iloc[:, 0:106] y_test_external = test_data["Target (Col 107)"] # 外部测试集预测 y_predict = dTreeR.predict(X_test_external) # 计算外部测试集的混淆矩阵和分类报告 cm = confusion_matrix(y_test_external, y_predict, labels=[0, 1]) print("外部测试集混淆矩阵:\n", cm) print("外部测试集分类报告:\n", classification_report(y_test_external, y_predict))
导出决策树预测结果到CSV
你可以将预测结果转换为pandas.DataFrame,然后使用to_csv方法导出,提供两种常用方式:
方法1:仅导出预测结果
# 将预测结果转为DataFrame predict_df = pd.DataFrame(y_predict, columns=["Predicted_Target"]) # 导出到CSV,不保留索引 predict_df.to_csv("prediction_results.csv", index=False)
方法2:导出预测结果+外部测试集的真实标签(可选)
# 合并真实标签和预测结果 result_df = pd.DataFrame({ "True_Target": y_test_external, "Predicted_Target": y_predict }) # 导出到CSV,不保留索引 result_df.to_csv("prediction_with_true_labels.csv", index=False)
内容的提问来源于stack exchange,提问作者Revanth Kumar Perla
相关产品推荐
相关产品推荐

