ValueError:一个系列的真值在一个热编码错误中不明确

Posted

技术标签:

【中文标题】ValueError:一个系列的真值在一个热编码错误中不明确【英文标题】:ValueError: The truth value of a Series is ambiguous in one hot encoding error 【发布时间】:2020-11-21 12:06:27 【问题描述】:

我在下面的一段代码中尝试使用一个热编码器。但我得到了errorValueError:一个系列的真值是模棱两可的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

 from sklearn.preprocessing import LabelEncoder, OneHotEncoder
 import pandas as pd

 target=train_features_df['y']
 train_features_df=train_features_df.drop(['y'], axis=1)

 # Categorical boolean mask this is done to find all categorical dfeature
 categorical_feature_mask = train_features_df.dtypes==object
 # filter categorical columns using mask and turn it into a list
 categorical_cols = train_features_df.columns[categorical_feature_mask].tolist()

 # instantiate labelencoder object
 le = LabelEncoder()
 # apply le on categorical feature columns
 train_features_df[categorical_cols] = train_features_df[categorical_cols].apply(lambda col: 
 le.fit_transform(col))
 train_features_df[categorical_cols].head(10)

 # instantiate OneHotEncoder
 ohe = OneHotEncoder(categories = categorical_feature_mask, sparse=False ) 
 # categorical_features = boolean mask for categorical columns
 # sparse = False output an array not sparse matrix

 # apply OneHotEncoder on categorical feature columns
 ohe.fit_transform(train_features_df)

我在最后一行收到此错误“ValueError:系列的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all ().上线ohe.fit_transform(train_features_df)

请求的完整回溯消息如下:-

   ---------------------------------------------------------------------------
   ValueError                                Traceback (most recent call last)
   <ipython-input-12-72e45bd93f15> in <module>
        23 
        24 # apply OneHotEncoder on categorical feature columns
   ---> 25 ohe.fit_transform(train_features_df)
        26 #train_encoded_df=pd.DataFrame(data = ohe.fit_transform(train_features_df)) # It returns an numpy array
   
   ~\Anaconda3\lib\site-packages\sklearn\preprocessing\_encoders.py in fit_transform(self, X, y)
       408         """
       409         self._validate_keywords()
   --> 410         return super().fit_transform(X, y)
       411 
       412     def transform(self, X):
   
   ~\Anaconda3\lib\site-packages\sklearn\base.py in fit_transform(self, X, y, **fit_params)
       688         if y is None:
       689             # fit method of arity 1 (unsupervised transformation)
   --> 690             return self.fit(X, **fit_params).transform(X)
       691         else:
       692             # fit method of arity 2 (supervised transformation)
   
   ~\Anaconda3\lib\site-packages\sklearn\preprocessing\_encoders.py in fit(self, X, y)
       383         """
       384         self._validate_keywords()
   --> 385         self._fit(X, handle_unknown=self.handle_unknown)
       386         self.drop_idx_ = self._compute_drop_idx()
       387         return self
   
   ~\Anaconda3\lib\site-packages\sklearn\preprocessing\_encoders.py in _fit(self, X, handle_unknown)
        74         X_list, n_samples, n_features = self._check_X(X)
        75 
   ---> 76         if self.categories != 'auto':
        77             if len(self.categories) != n_features:
        78                 raise ValueError("Shape mismatch: if categories is an array,"
   
   ~\Anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
      1477     def __nonzero__(self):
      1478         raise ValueError(
   -> 1479             f"The truth value of a type(self).__name__ is ambiguous. "
      1480             "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
      1481         )
   
   ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

【问题讨论】:

您可以编辑并发布完整的回溯消息吗? 带有完整追溯的已编辑问题。谢谢 【参考方案1】:

不败,

该错误是由于您传入categories 参数而导致的,这是编码器函数不期望的。 如果您只想使用选择来选择分类列,请执行以下操作:

ohe = OneHotEncoder(categories = 'auto', sparse=False ) 
selection = train_features_df[train_features_df.columns[categorical_feature_mask]]
encoded = ohe.fit_transform(selection)

然后将编码结果与非分类列合并

如果您想使用 categories 参数来传递类别值 - 使用来自 here 的示例

更优雅的方法是使用 Pandas 函数进行 one-hot 编码:

pd.get_dummies(data=train_features_df, columns=train_features_df.columns[categorical_feature_mask])

【讨论】:

如果我使用 get_dummies 并且我有单独的数据帧进行测试和训练,那么我如何确保应用于 train_features_df 的编码完全应用于 test_features_df ?有什么办法可以保证吗? 通常编码是在训练测试拆分之前完成的。如果这是不可能的 - 使用 OneHotEncoder 并每次传递相同的类别值列表。顺便说一句 - 这里不需要标签编码器。它会破坏测试集和训练集之间的一致性。 好的,对我来说,测试中缺少标签列,所以我应该从训练数据中提取除标签之一之外的所有内容,然后合并它们,然后基本上应用 ohe,然后再次分离它们并在这种情况下将标签列添加回训练数据集。你怎么看? 它可能有效。但我的偏好是堆叠数据帧,应用 pd.get_dummies,然后拆分训练和测试。请注意,ohe 会给您一个 numpy.array,因此您需要小心地将标签添加到生成的编码列。 concat_train_test 的形状是:(8418, 364),在 364 中我只有 8 列是分类的。当我在ohe = OneHotEncoder(categories = 'auto', sparse=False ) selection = train_features_df[train_features_df.columns[categorical_feature_mask]] encoded = ohe.fit_transform(selection) 下方申请时,我看到编码形状为 (8418, 211) 看起来像这 8 列中唯一值的总数?在与非分类数据合并期间,我是否需要在应用 PCA 和 Xgboost 之前命名所有这些列

以上是关于ValueError:一个系列的真值在一个热编码错误中不明确的主要内容,如果未能解决你的问题,请参考以下文章

DataFrame 列比较引发 ValueError:Series 的真值不明确。 [复制]

将 Pandas 列传递给函数时出现“ValueError:Series 的真值不明确”

ValueError: Series 的真值不明确(API NaN 处理)

ValueError:在将 lambda 与 loc 一起使用时,Series 的真值不明确 [重复]

一种热编码分类特征 - 仅稀疏形式

NLP/TF-IDF: ValueError: 具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()