如何在scikit-learn的MLPClassifier中使用列表形式的shape特征
解决MLPClassifier中使用列表形式shape特征的问题
嘿,我完全懂你的困扰!sklearn的MLPClassifier(其实大部分sklearn模型都是如此)要求输入的特征矩阵必须是二维数值数组,每个样本的特征都得是单个数值,不能嵌套列表——这就是你碰到TypeError: float() argument must be a string or a number, not 'list'的核心原因。不过别担心,我们完全可以保留shape的完整维度信息,不用转成标量,只要把列表特征展开成多个独立的特征列就行。
具体解决方案
方法1:用Pandas展开列表特征
这是最直观的方式,适合用DataFrame处理数据的场景:
import pandas as pd from sklearn.neural_network import MLPClassifier # 你的原始数据 data=[{'forniture':1,'color':3, 'shape':[0.2,0.5,1.1]}, {'forniture':2,'color':0, 'shape':[0.2,0.7,0.9]}, {'forniture':2,'color':1, 'shape':[1.2,1.5,1.0]}] df = pd.DataFrame(data) # 将shape列的列表展开为多个独立特征列 shape_features = df['shape'].apply(pd.Series) # 给新特征列命名,方便识别 shape_features.columns = ['shape_dim1', 'shape_dim2', 'shape_dim3'] # 合并原有的forniture、color特征和展开后的shape特征 X = pd.concat([df[['forniture', 'color']], shape_features], axis=1) # 假设你有对应的标签数据(这里举个示例) y = [0, 1, 0] # 现在可以正常训练MLP了 clf = MLPClassifier() clf.fit(X, y)
方法2:用Numpy直接处理数组
如果数据量较大,用Numpy的方式会更高效:
import pandas as pd import numpy as np from sklearn.neural_network import MLPClassifier data=[{'forniture':1,'color':3, 'shape':[0.2,0.5,1.1]}, {'forniture':2,'color':0, 'shape':[0.2,0.7,0.9]}, {'forniture':2,'color':1, 'shape':[1.2,1.5,1.0]}] df = pd.DataFrame(data) # 提取标量特征的数组 scalar_features = df[['forniture', 'color']].values # 将shape列的列表转换成二维数组 shape_array = np.array(df['shape'].tolist()) # 拼接两个数组得到完整的特征矩阵 X = np.hstack([scalar_features, shape_array]) # 训练模型 y = [0, 1, 0] clf = MLPClassifier() clf.fit(X, y)
关键说明
- 展开后的每个shape维度都会作为独立的输入特征,MLP这类神经网络天然支持高维特征输入,完全保留了原始shape的所有信息,不需要合并成体积这类标量。
- 注意:必须保证所有样本的shape列表长度一致,如果存在长度不一的情况,需要先做预处理(比如填充缺失维度、过滤异常样本),否则展开时会报错。
内容的提问来源于stack exchange,提问作者Rulo Ramiro
相关产品推荐
相关产品推荐

