我面临OnehotEncoder的问题

时间:2019-04-01 09:44:49

标签: python scikit-learn

代码如下:

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:无法将字符串转换为float:'iHoroscope-2018   每日星座与占星术”

以下是指向csv文件的链接:https://drive.google.com/file/d/1Z3uT_tU9QsdE8QSBd8husItHeh36ztZa/view?usp=drivesdk

2 个答案:

答案 0 :(得分:0)

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

在运行代码时,它没有使用正确的列进行一键编码(不推荐使用categorical_features),因此在进行标签编码后,一种快速而肮脏的解决方案是将转换专门应用于所需的列(需要重塑):

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

答案 1 :(得分:0)

由于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'])