在 sklearn 和命名列中对多个列进行 One-hot-encoding

Posted

技术标签:

【中文标题】在 sklearn 和命名列中对多个列进行 One-hot-encoding【英文标题】:One-hot-encoding multiple columns in sklearn and naming columns 【发布时间】:2019-08-09 06:57:23 【问题描述】:

我有以下代码可以对我拥有的 2 列进行一次热编码。

# encode city labels using one-hot encoding scheme
city_ohe = OneHotEncoder(categories='auto')
city_feature_arr = city_ohe.fit_transform(df[['city']]).toarray()
city_feature_labels = city_ohe.categories_
city_features = pd.DataFrame(city_feature_arr, columns=city_feature_labels)

phone_ohe = OneHotEncoder(categories='auto')
phone_feature_arr = phone_ohe.fit_transform(df[['phone']]).toarray()
phone_feature_labels = phone_ohe.categories_
phone_features = pd.DataFrame(phone_feature_arr, columns=phone_feature_labels)

我想知道的是如何在 4 行中执行此操作,同时在输出中获得正确命名的列。也就是说,我可以通过在fit_transform 中包含两个列名来创建一个正确的单热编码数组,但是当我尝试命名结果数据框的列时,它告诉我索引的形状不匹配:

ValueError: Shape of passed values is (6, 50000), indices imply (3, 50000)

对于背景,电话和城市都有 3 个值。

    city    phone
0   CityA   iPhone
1   CityB android
2   CityB iPhone
3   CityA   iPhone
4   CityC   Android

【问题讨论】:

【参考方案1】:
cat_features = [
    "gender", "cholesterol", "gluc", "smoke", "alco"
]

data = pd.get_dummies(data, columns = cat_features)

【讨论】:

【参考方案2】:

你快到了...就像你说的那样,你可以直接在fit_transform 中添加你想要编码的所有列。

ohe = OneHotEncoder(categories='auto')
feature_arr = ohe.fit_transform(df[['phone','city']]).toarray()
feature_labels = ohe.categories_

然后您只需要执行以下操作:

feature_labels = np.array(feature_labels).ravel()

这使您可以根据需要命名列:

features = pd.DataFrame(feature_arr, columns=feature_labels)

【讨论】:

谢谢!我应该已经找到了 ravel() 函数。非常有帮助。 @MaximeKan 我在使用具有多个功能的数据框创建时遇到问题,它返回一个错误传递值的形状是 (10692, 7),索引暗示 (10692, 2) ,我不得不手动做特征标签,我该如何解决这个问题 @VitorGonçalves 发生这种情况是因为来自fit_transform 的返回数据集在转换后有 7 列,因此 Pandas 期望 feature_labels 数组中的 7 个对应标签与数据集匹配,但它只有 2 个元素.要修复此错误,请将 feature_labels = ohe.categories_ 替换为 feature_labels = ohe.get_feature_names()【参考方案3】:

你为什么不看看pd.get_dummies? 编码方式如下:

df['city'] = df['city'].astype('category')
df['phone'] = df['phone'].astype('category')
df = pd.get_dummies(df)

【讨论】:

谢谢 panktijk。我最终这样做了,但我想知道是否可以在 sklearn 中完成。

以上是关于在 sklearn 和命名列中对多个列进行 One-hot-encoding的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sklearn Logistic Regression 的 one-vs-rest 方案中对概率进行归一化?

如何在一个列上对 sql server 进行透视,但重命名为动态列

如何使用 sklearn Pipeline 和 FeatureUnion 选择多个(数字和文本)列进行文本分类?

Pandas sklearn one-hot 编码数据帧或 numpy?

如何在 sklearn 中一次在多个列上应用预处理方法

powerbi中如何快速选择需要的字段列