#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