【问题标题】:DataFrameMapper scikit-learn ValueError: all the input array dimensions except for the concatenation axis must match exactlyDataFrameMapper scikit-learn ValueError:除连接轴外的所有输入数组维度必须完全匹配
【发布时间】:2017-10-20 20:48:42
【问题描述】:

我一直在尝试使用 DataFrameMapper 将我的数据帧上的多个预处理转换添加到我的 scikit-learn 管道中。

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data"
names = ['Sex', 'Length', 'Diameter', 'Height', 'Whole weight', 'Schuked weight', 'Viscera weight', 'Shell weight', 'Rings']

df = pd.read_csv(url, names=names)

mapper = DataFrameMapper(
    [('Height', Normalizer()), ('Sex', LabelBinarizer())]
)

stages = []

stages += [("mapper", mapper)]

estimator = DecisionTreeClassifier()

stages += [("dtree", estimator)]

pipeline = Pipeline(stages)

labelCol = 'Rings'
target = df[labelCol]
data = df.drop(labelCol, axis=1)

train_data, test_data, train_target, expected = train_test_split(data, target, test_size=0.25, random_state=33)

model = pipeline.fit(train_data, train_target)

但是,我收到以下错误:

Traceback (most recent call last):
  File "app/experimenter/sklearn/transformations.py", line 65, in <module>
    model = pipeline.fit(train_data, train_target)
  File "/Library/Python/2.7/site-packages/sklearn/pipeline.py", line 268, in fit
    Xt, fit_params = self._fit(X, y, **fit_params)
  File "/Library/Python/2.7/site-packages/sklearn/pipeline.py", line 234, in _fit
    Xt = transform.fit_transform(Xt, y, **fit_params_steps[name])
  File "/Library/Python/2.7/site-packages/sklearn/base.py", line 497, in fit_transform
    return self.fit(X, y, **fit_params).transform(X)
  File "/Library/Python/2.7/site-packages/sklearn_pandas/dataframe_mapper.py", line 225, in transform
    stacked = np.hstack(extracted)
  File "/Library/Python/2.7/site-packages/numpy/core/shape_base.py", line 288, in hstack
    return _nx.concatenate(arrs, 1)
ValueError: all the input array dimensions except for the concatenation axis must match exactly

我错过了什么?

谢谢:)

【问题讨论】:

  • 这个错误发生在哪一行?请发布完整的堆栈跟踪。
  • @VivekKumar 更新了问题
  • 这个错误是由于使用了归一化器造成的。你期望它的输出是什么?我的意思是你为什么用它?标准化“高度”列的值?如果是这种情况,则应使用 StandardScaler,Normalizer 用于缩放样本(而不是您想要的列)。
  • 我看到你已经接受了一个答案。什么实际上对你有用?
  • 嗨@VivekKumar 实际上我在将列指定为字符串或列表之间产生了这种混淆,因此将其排序就可以了。在这种情况下,这只是一个示例(我需要概括代码以动态创建此数据帧映射器,因此它将取决于用户的输入),我并没有真正关注此数据集转换本身

标签: python pandas scikit-learn sklearn-pandas


【解决方案1】:

你将不得不改变DataFrameMapper的结构:

mapper = DataFrameMapper(
    [(['Height'], Normalizer()), ('Sex', LabelBinarizer())]
)

这是一个微妙的细节,可以在sklearn_pandas的文档中找到:

将列映射到转换

将列选择器指定为'column'(作为简单字符串)和['column'](作为具有一个元素的列表)之间的区别在于传递给转换器的数组的形状。在第一种情况下,将传递一个一维数组,而在第二种情况下,它将是一个具有一列的二维数组,即列向量。

[...]

请注意,有些转换器需要一维输入(面向标签的),而另一些(如 OneHotEncoderImputer)则需要二维输入,形状为 [n_samples, n_features]

【讨论】:

    猜你喜欢
    • 2018-07-08
    • 2021-05-09
    • 2017-11-26
    • 2020-02-19
    • 2019-05-16
    • 2020-07-25
    • 2020-02-03
    • 2020-08-02
    • 1970-01-01
    相关资源
    最近更新 更多