OneHotEncoder : ValueError: Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()

Posted

技术标签:

【中文标题】OneHotEncoder : ValueError: Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()【英文标题】:OneHotEncoder : ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all() 【发布时间】:2020-09-28 14:33:43 【问题描述】:
from sklearn.preprocessing import OneHotEncoder

df.LotFrontage = df.LotFrontage.fillna(value = 0)
categorical_mask = (df.dtypes == "object")
categorical_columns = df.columns[categorical_mask].tolist()
ohe = OneHotEncoder(categories = categorical_mask, sparse = False)
df_encoded = ohe.fit_transform(df)
print(df_encoded[:5, :])

错误:

我可以知道我的代码有什么问题吗?

这是数据的sn-p:

[2

【问题讨论】:

您能否将df.head() 的结果添加到您的问题中? 从您的代码看来,categorical_mask 是一个功能名称列表,但文档说 "list : categories[i] 包含第 i 列中预期的类别。" 即它应该是一个列表列表,其中每个内部列表包含每列的实际类别级别(即唯一值)。你得到一个维度不匹配,因为你告诉它每列只有一个唯一值。 如果您尝试仅将 OHE 应用于分类列,我建议您改用 ColumnTransformer。看看例子here。然后不要在OHE中指定类别级别,让sklearn推断它们 【参考方案1】:

OneHotEncoder 中的 categories 参数无法选择要编码的特征,因此您需要 ColumnTransformer。试试这个:

df.LotFrontage = df.LotFrontage.fillna(value = 0)
categorical_features = df.select_dtypes("object").columns

column_trans = ColumnTransformer(
    [
        ("onehot_categorical", OneHotEncoder(), categorical_features),
    ],
    remainder="passthrough",  # or drop if you don't want the non-categoricals at all...
)
df_encoded = column_trans.fit_transform(df)

注意,根据the docs,categories 参数是

categories'auto' 或类似数组的列表,default='auto'

Categories (unique values) per feature:

    ‘auto’ : Determine categories automatically from the training data.

    list : categories[i] holds the categories expected in the ith column. The passed categories should not mix strings and numeric

单个特征中的值,并且应该排序以防万一 数值。

因此它应该包含每个分类特征的每个可能的类别或级别。您可能会使用它,因为您知道所有可能的级别集,但怀疑您的训练数据可能会遗漏一些。在你的情况下,我认为你不需要它,所以'auto',即默认值,应该没问题。

【讨论】:

以上是关于OneHotEncoder : ValueError: Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()的主要内容,如果未能解决你的问题,请参考以下文章

在 OneHotEncoder 之后取消转换

sklearn中的LabelEncoder和OneHotEncoder的区别

OneHotEncoder 多列

如何在 sklearn 中使用 OneHotEncoder 的输出?

scikit-learn 中 OneHotEncoder 解析

OneHotEncoder ValueError:发现未知类别