ScikitLearn OneHotEncoder不能正常工作?

2024-06-13 15:56:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个如下所示的数据列表:

[['ocak' 2017]
 ['subat' 2017]
 ['mart' 2017]
 ['nisan' 2017]
 ['mayis' 2017]
 ['haziran' 2017]
 ['temuz' 2017]
 ['agustos' 2017]
 ['eylul' 2017]
 ['ekim' 2017]
 ['kasim' 2017]
 ['aralik' 2017]
 ['ocak' 2018]
 ['subat' 2018]
 ['mart' 2018]
 ['nisan' 2018]]

我想使用OneHotEncoder对列表的字符串部分('subat','mart'等…)进行编码,以便在我的回归模型中使用它

我使用的代码如下:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])], remainder='passthrough')
X = np.array(ct.fit_transform(X))

但我的输出是这样的:

(0, 9)  1.0
  (0, 13)   2017.0
  (1, 10)   1.0
  (1, 13)   2017.0
  (2, 6)    1.0
  (2, 13)   2017.0
  (3, 8)    1.0
  (3, 13)   2017.0
  (4, 7)    1.0
  (4, 13)   2017.0
  (5, 4)    1.0
  (5, 13)   2017.0
  (6, 12)   1.0
  (6, 13)   2017.0
  (7, 0)    1.0
  (7, 13)   2017.0
  (8, 3)    1.0
 

列车试验分班不能接受的

我需要这样的输出

[1.0 0.0 0.0 2017]

我如何才能让它工作,给我的输出如上所述。或者我的代码或数据集有问题吗


Tags: 数据代码fromimport列表sklearnctonehotencoder
1条回答
网友
1楼 · 发布于 2024-06-13 15:56:45

OneHotEncoder默认情况下返回一个稀疏矩阵,因此当使用np.array包装返回值时,会得到一个不需要的表示形式。您有两个选择:

  • sparse=False传递给OneHotEncoder,即
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(sparse=False), [0])], remainder='passthrough')
  • 或者使用toarray将结果转换为numpy数组,即
X = ct.fit_transform(X).toarray()

要使用第二种方法(我将其包装到pd.DataFrame中以便于检查结果):

>>> pd.DataFrame(X)

     0    1    2    3    4    5    6    7    8    9    10   11      12
0   0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  2017.0
1   0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  2017.0
2   0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  2017.0
3   0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  2017.0
4   0.0  0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  2017.0
5   0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  2017.0
6   0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  1.0  2017.0
7   1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  2017.0
8   0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  2017.0
9   0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  2017.0
10  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0  2017.0
11  0.0  1.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  2017.0
12  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  2018.0
13  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  2018.0
14  0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  0.0  0.0  2018.0
15  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  1.0  0.0  0.0  0.0  2018.0

相关问题 更多 >