OneHotEncoder 只能对一个字符串特征进行编码。

4

我希望将我的功能中的仅有一个特征转换为单独的二进制特征:

df["pattern_id"]
Out[202]: 
0       3
1       3
...
7440    2
7441    2
7442    3
Name: pattern_id, Length: 7443, dtype: int64 
df["pattern_id"]
Out[202]: 
0       0 0 1
1       0 0 1
...
7440    0 1 0
7441    0 1 0
7442    0 0 1
Name: pattern_id, Length: 7443, dtype: int64 

我想使用OneHotEncoder,数据是整数,所以不需要进行编码:

onehotencoder = OneHotEncoder(categorical_features=["pattern_id"])
df = onehotencoder.fit_transform(df).toarray()

ValueError: could not convert string to float: 'http://www.zaragoza.es/sedeelectronica/'

有趣的是我收到了一个错误... sklearn 尝试对另一列进行编码,而不是我想要的那一列。

我们必须将 pattern_id 编码为整数值。

我使用了这个链接:Issue with OneHotEncoder for categorical features

#transform the pattern_id feature to int
encoding_feature = ["pattern_id"]
enc = LabelEncoder()
enc.fit(encoding_feature)
working_feature = enc.transform(encoding_feature)
working_feature = working_feature.reshape(-1, 1)
ohe = OneHotEncoder(sparse=False)


#convert the pattern_id feature to separate binary features
onehotencoder = OneHotEncoder(categorical_features=working_feature, sparse=False)
df = onehotencoder.fit_transform(df).toarray()

我也遇到了同样的错误。我做错了什么?

编辑

源代码: https://github.com/martin-varbanov96/scraper/blob/master/logo_scrape/logo_scrape/analysis.py

df
Out[259]: 
      found_img  is_http                                           link_img  \
0          True        0                                  img/aahoteles.svg   
//www.zaragoza.es/cont/paginas/img/sede/logo_e...   

      pattern_id                                       current_link  site_id  \
0              3             https://www.aa-hoteles.com/es/reservas        3   
6              3      https://www.aa-hoteles.com/es/ofertas-hoteles        3   
7              2           http://about.pressreader.com/contact-us/        4   
8              3           http://about.pressreader.com/contact-us/        4   

      status                                   link_id  
0        200               https://www.aa-hoteles.com/  
1        200               https://www.365travel.asia/  
2        200               https://www.365travel.asia/  
3        200               https://www.365travel.asia/  
4        200               https://www.aa-hoteles.com/  
5        200               https://www.aa-hoteles.com/  
6        200               https://www.aa-hoteles.com/  
7        200              http://about.pressreader.com  
8        200              http://about.pressreader.com  
9        200               https://www.365travel.asia/  
10       200               https://www.365travel.asia/  
11       200               https://www.365travel.asia/  
12       200               https://www.365travel.asia/  
13       200               https://www.365travel.asia/  
14       200               https://www.365travel.asia/  
15       200               https://www.365travel.asia/  
16       200               https://www.365travel.asia/  
17       200               https://www.365travel.asia/  
18       200              http://about.pressreade 

[7443 rows x 8 columns]
3个回答

2
如果您查看OneHotEncoder文档,您会发现categorical_features参数期望的是“all”或索引数组或掩码,而不是字符串。您可以通过更改以下行使代码正常工作。
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
# Create a dataframe of random ints
df = pd.DataFrame(np.random.randint(0, 4, size=(100, 4)),
                  columns=['pattern_id', 'B', 'C', 'D'])
onehotencoder = OneHotEncoder(categorical_features=[df.columns.tolist().index('pattern_id')])
df = onehotencoder.fit_transform(df)

然而,df将不再是一个DataFrame,我建议直接使用numpy数组进行操作。


我负担不起更改数据类型的代价,顺便说一下,它仍然无法工作。 - Hartun
你使用的sklearn版本是什么?在我发布答案之前,我测试了代码并且它可以正常工作。我将用完整的测试来扩展我的答案。你说你负担不起更改数据类型是什么意思?数据已经在pandas的后端中以numpy数组的形式存在。 - piman314
我有除了pattern之外的其他列,我会发布并更新。 - Hartun
对话变得很长,我可以移步到 SO 聊天室 短暂讨论。 - piman314

2
你可以像这样做。
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
onehotenc = OneHotEncoder()
X = onehotenc.fit_transform(df.required_column.values.reshape(-1, 1)).toarray()

我们需要重塑列,因为fit_transform需要一个二维数组。然后你可以向这个numpy数组添加列,再将其与你的DataFrame合并。
这里查看。

0

处理不同列类型的推荐方法在这里的sklearn文档中有详细说明。

代表性示例:

numeric_features = ['age', 'fare']
numeric_transformer = Pipeline(steps=[('scaler', StandardScaler())])

categorical_features = ['embarked', 'sex', 'pclass']
categorical_transformer = OneHotEncoder(handle_unknown='ignore')

preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接