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

使用保形预测模型时遇DataFrame列错误的技术求助

搞定保形预测中的列不匹配错误

嘿,咱们来解决你遇到的这个ValueError: A given column is not a column of the dataframe问题——核心原因是数据集赋值错误+目标变量提取方式不当,下面一步步帮你修正:

1. 核心错误定位

你看这段创建训练集的代码,明显搞混了数据集:

# Create Training Set (Split the Training set into features and target)
X_train = valid.drop(['expression'], axis = 1)
y_train = valid.drop(columns = ['new_host', 'split', 'sequence'])
  • 你把**验证集(valid)**错误当成训练集(train)来赋值给X_train和y_train了!
  • 目标变量y_train的提取方式也有问题:你应该直接取expression列作为预测目标,而不是通过drop其他列来间接获取(这种方式很容易因为列的变动导致维度不匹配)。

2. 修正后的完整解决方案

步骤1:正确拆分训练/验证集的特征与目标

先把训练集和验证集的特征、目标变量拆分清楚:

# 处理训练集:从train数据中提取特征和目标
X_train = train.drop(['expression'], axis=1)  # 去掉目标列,得到特征矩阵
y_train = train['expression']  # 直接提取目标列,得到一维Series(符合建模要求)

# 处理验证集(后续可用来评估模型性能)
X_valid = valid.drop(['expression'], axis=1)
y_valid = valid['expression']

步骤2:拆分训练集为训练+校准集

这一步你的逻辑是对的,但要基于修正后的X_train和y_train来拆分:

# 拆分训练集为子训练集+校准集,加random_state保证结果可复现
X_train, X_cal, y_train, y_cal = train_test_split(X_train, y_train, test_size=0.2, random_state=42)

步骤3:优化保形预测模型的初始化

你之前重复包装了RegressorAdapter,这是没必要的,简化一下:

# 初始化基础回归模型并适配为保形预测兼容格式
underlying_model = RegressorAdapter(DecisionTreeRegressor(min_samples_leaf=5))
# 定义非一致性度量函数
nc = RegressorNc(underlying_model, AbsErrorErrFunc())
# 创建归纳式保形回归器
icp = IcpRegressor(nc)

步骤4:提前校验数据一致性

在执行fit之前,加一行校验代码,提前发现样本数不匹配的问题:

# 校验特征和目标的样本数是否一致
assert X_train.shape[0] == y_train.shape[0], "X_train和y_train的样本数不匹配!"

3. 完整修正后的代码

from sklearn.tree import DecisionTreeRegressor
from nonconformist.cp import IcpRegressor
from nonconformist.base import RegressorAdapter
from nonconformist.nc import RegressorNc, AbsErrorErrFunc
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd

# 加载预处理后的数据
df = pd.read_csv("prepared_data.csv")

# 按split字段拆分训练集和验证集
train = df.loc[df['split'] == 'train']
valid = df.loc[df['split'] == 'valid']

# 正确提取特征与目标变量
X_train = train.drop(['expression'], axis=1)
y_train = train['expression']

X_valid = valid.drop(['expression'], axis=1)
y_valid = valid['expression']

# 将训练集拆分为子训练集和校准集
X_train, X_cal, y_train, y_cal = train_test_split(X_train, y_train, test_size=0.2, random_state=42)

# 初始化保形预测相关组件
underlying_model = RegressorAdapter(DecisionTreeRegressor(min_samples_leaf=5))
nc = RegressorNc(underlying_model, AbsErrorErrFunc())
icp = IcpRegressor(nc)

# 数据校验与信息打印
print(f'训练集:{y_train.size}个样本,{X_train.shape[1]}个特征')
assert X_train.shape[0] == y_train.shape[0], "X_train和y_train样本数不匹配"

# 训练保形回归器
icp.fit(X_train, y_train)

错误根源复盘

你之前的代码不仅搞混了训练集和验证集,还把y_train做成了DataFrame格式(而不是建模需要的一维Series),这两个问题叠加起来,导致sklearn在内部处理列索引时出现了不匹配的错误,修正后就能正常运行了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:57:47