【问题标题】:I'm facing an issue with OnehotEncoder我遇到了 OnehotEncoder 的问题
【发布时间】:2019-04-02 02:10:32
【问题描述】:

代码如下:

import numpy as np
import pandas as pd


dataset = pd.read_csv('googleplaystore.csv')

X = dataset.iloc[:, :3].values

from sklearn.preprocessing import LabelEncoder, OneHotEncoder


labelencoder = LabelEncoder()


X[:, 1] = labelencoder.fit_transform(X[:, 1])


onehotencoder = OneHotEncoder(categorical_features = [1])


X = onehotencoder.fit_transform(X).toarray()

ValueError:无法将字符串转换为浮点数:'iHoroscope - 2018 每日星座运势和占星术'

这里是 csv 文件的链接:https://drive.google.com/file/d/1Z3uT_tU9QsdE8QSBd8husItHeh36ztZa/view?usp=drivesdk

【问题讨论】:

  • 也许您可以发布几行数据文件,因为它只有 3 列。在标签编码器步骤之前和之后查看可能会有所帮助。 (我无法在工作中访问 Google Drive)
  • 你在做onehotencoder.fit_transform(X) 你的X 会有一些字符串值导致这个错误。你确定使用X而不是X[:, 1]不是错字吗?
  • 如果我尝试 onehotencoder.fit_transform(X[:, 1]),会得到以下结果: ValueError: Expected 2D array, got 1D array instead: array=[ 1. 1. 1. ... 21. 4. 19.]。如果您的数据具有单个特征,则使用 array.reshape(-1, 1) 重塑您的数据,如果它包含单个样本,则使用 array.reshape(1, -1)。
  • 您可以使用pd.get_dummies(dataset['col'])pd.get_dummies(dataset.iloc[ : , : 3) 获得与来自sklearn 的OneHotEncoder 相同的结果

标签: python scikit-learn


【解决方案1】:

按照以下答案尝试使用 DictVectorizer:https://stackoverflow.com/a/33010943/10548514。至于直接处理涉及OneHotEncoder的问题:

在运行您的代码时,它没有使用正确的列进行一次性编码(categorical_features 已弃用),因此在您的标签编码之后,一个快速而肮脏的解决方法是将转换专门应用于该列你想要(重塑是必要的):

onehotencoder = OneHotEncoder(categories='auto')
y = onehotencoder.fit_transform(X[:, 1].reshape(-1, 1))

【讨论】:

  • 代码中的 'X[:, 1] = labelencoder.fit_transform(X[:, 1])' 不做这项工作吗?
  • onehotencoder = OneHotEncoder(); y = onehotencoder.fit_transform(X[:, 1].reshape(-1, 1)) 为我工作。
  • 另外,您应该考虑在读取 .csv 文件后从数据集中删除 nans
【解决方案2】:

由于 categorical_features 自 0.20 版起已弃用(并将在 0.22 中删除),scikit-learn 建议您改用 ColumnTransformer

这只是将不同的转换器应用于不同的列的一种便捷方式。

以下是如何使用 ColumnTransformer 对列进行一次性编码:

from sklearn.compose import ColumnTransformer

#Specify what you want to do, and provide column index
ct = ColumnTransformer([('ohe', OneHotEncoder(), [1])])

ohe_category = ct.fit_transform(X)  

这为您提供了一个单热编码的稀疏矩阵。您可以将其转换为dense

ohe_category.todense()

也就是说,我建议您继续使用pd.get_dummies(正如@JonasCristens 所提到的),因为它使用起来要简单得多:

pd.get_dummies(dataset['Category'])

【讨论】:

    猜你喜欢
    • 2011-04-17
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多