使用Dask-ML处理MNIST数据时train_test_split报类型错误求助
解决Dask-ML train_test_split抛出的TypeError问题
我之前确实碰到过一模一样的问题!这个错误看着有点摸不着头脑,但其实是Dask DataFrame和train_test_split交互时的一个常见小坑,和你数据里有没有空值关系不大。
问题根源
这个TypeError: unsupported operand type(s) for +: 'int' and 'NoneType',本质上是Dask在处理单独的Series(也就是你代码里的y)时,元数据推断出了问题——拆分过程中需要计算样本的索引偏移,但某个步骤里出现了None值,导致和整数相加时报错。哪怕你的实际数据没有空值,Dask的分区元数据也可能出现这类不确定的情况。
两种可行的解决方案
方案一:合并X和y后再整体拆分
把特征和标签放回同一个DataFrame里拆分,之后再分开X和y,这样Dask能更好地维护整体的分区和元数据一致性:
import dask.dataframe as dd from dask_ml.model_selection import train_test_split # 加载训练数据 train = dd.read_csv(r'train.csv') # 先整体拆分数据集 train_df, test_df = train_test_split(train) # 再分别提取特征和标签 x_train = train_df.drop('label', axis=1) y_train = train_df['label'] x_test = test_df.drop('label', axis=1) y_test = test_df['label']
方案二:统一分区数并指定random_state
有时候X和y的分区数不一致,或者随机拆分时没有固定种子导致元数据不稳定,试试这两步:
import dask.dataframe as dd from dask_ml.model_selection import train_test_split # 加载数据并拆分X、y train = dd.read_csv(r'train.csv') X = train.drop('label', axis=1) y = train['label'] # 检查并统一X和y的分区数 if X.npartitions != y.npartitions: y = y.repartition(npartitions=X.npartitions) # 指定random_state后再拆分 x_train, x_test, y_train, y_test = train_test_split(X, y, random_state=42)
这两种方法我都试过,基本都能解决这个报错,你可以先试试方案一,操作起来更简单。
内容的提问来源于stack exchange,提问作者ArielSzabo
相关产品推荐
相关产品推荐

