Scikit-Узнайте, что OneHotEncoder не будет работать так, как должно быть?

#python #pandas #scikit-learn

Вопрос:

У меня есть список данных, который выглядит следующим образом:

 [['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
 
 

который не может быть принят классом train_test_split..

Мне нужен такой результат, как этот

 [1.0 0.0 0.0 2017]
 

Как я могу заставить его работать, чтобы дать мне результат, как описано выше. Или что-то не так с моим кодом или набором данных?

Ответ №1:

OneHotEncoder по умолчанию возвращает разреженную матрицу, поэтому, когда вы переносите возвращаемое значение np.array , вы получаете нежелательное представление. У вас есть два варианта:

  • Переход sparse=False к OneHotEncoder i.e,
 ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(sparse=False), [0])], remainder='passthrough')
 
  • или преобразуйте результат в массив numpy с toarray помощью , т. е.,
 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