如何解决sklearn中Extra Trees Regressor传入含列表DataFrame的报错
解决Extra Trees Regressor输入嵌套列表的错误问题
问题根源
scikit-learn的模型要求特征矩阵是二维数值型结构(n_samples × n_features),而你的DataFrame每个单元格是长度为4的列表,属于嵌套序列,模型无法直接解析,因此抛出"setting an array element with a sequence"错误。之前调用tolist()出错是因为你直接对DataFrame对象调用该方法,正确的操作对象是DataFrame的values属性。
两种可行的转换方法
方法一:用Pandas展开嵌套列表
通过applymap将每个单元格的列表转为Series,再重新整理为二维DataFrame:
import pandas as pd from sklearn.ensemble import ExtraTreesRegressor # 展开嵌套列表为二维特征矩阵 X_expanded = X.applymap(lambda lst: pd.Series(lst)).stack(level=1).unstack(level=0).T # 训练模型 model = ExtraTreesRegressor() model.fit(X_expanded, Y)
方法二:用Numpy扁平化三维数组
先将DataFrame转为三维数组,再reshape为二维数组:
import numpy as np from sklearn.ensemble import ExtraTreesRegressor # 转为三维数组(样本数 × 原始列数 × 列表长度) X_3d = np.array(X.values.tolist()) # 摊平为二维数组(样本数 × 总特征数=27×4) X_2d = X_3d.reshape(X_3d.shape[0], -1) # 训练模型 model = ExtraTreesRegressor() model.fit(X_2d, Y)
验证转换结果
转换后检查特征矩阵的形状:
print(X_expanded.shape) # 应该输出 (47724, 108) # 或者 print(X_2d.shape) # 同样输出 (47724, 108)
内容的提问来源于stack exchange,提问作者Alwex
相关产品推荐
相关产品推荐

