使用保形预测模型时遇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
相关产品推荐
相关产品推荐

