Я пробовал использовать dask DummyEncoder для OneHotEncoding
моих данных. Но результаты не такие, как ожидалось.
Пример DummyEncoder от dask:
from dask_ml.preprocessing import DummyEncoder
import pandas as pd
data = pd.DataFrame({
'B': ['a', 'a', 'a', 'b','c']
})
de = DummyEncoder()
de = de.fit(data)
testD = pd.DataFrame({'B': ['a','a']})
trans = de.transform(testD)
print(trans)
Выход:
B_a
0 1
1 1
Почему не отображаются B_b
, B_c
? Но когда я меняю testD
так:
testD = pd.DataFrame({'B': ['a','a', 'b', 'c']})
Результат:
B_a B_b B_c
0 1 0 0
1 1 0 0
2 0 1 0
3 0 0 1
Пример OneHotEncoder в sklearn (После LabelEncoding):
from sklearn.preprocessing import OneHotEncoder
import pandas as pd
data = pd.DataFrame({
'B': [1, 1, 1, 2, 3]
})
encoder = OneHotEncoder()
encoder = encoder.fit(data)
testdf = pd.DataFrame({'B': [2, 2]})
trans = encoder.transform(testdf).toarray()
pd.DataFrame(trans, columns=encoder.active_features_)
Выход:
1 2 3
0 0.0 1.0 0.0
1 0.0 1.0 0.0
Как добиться таких же результатов? Причина, по которой я хочу это сделать, потому что я буду кодировать подмножество столбцов, а затем объединить результирующий encoded_df с основным df вместе с этим удалением основного столбца из основного df.
Так что-то вроде ниже (основной df):
A B C
0 M 1 10
1 F 2 20
2 T 3 30
3 M 4 40
4 F 5 50
5 F 6 60
Ожидаемый результат:
A_F A_M A_T B C
0 0 1 0 1 10
1 1 0 0 2 20
2 0 0 1 3 30
3 0 1 0 4 40
4 1 0 0 5 50
5 1 0 0 6 60
Обновлено:
Поскольку dask внутренне использует панды, я считаю, что он использует get_dummies
. Так себя ведет DummyEncoder
. Мы также будем признательны, если кто-то сможет указать способ сделать то же самое в пандах.
Из документации dask для параметра DummyEncoder
columns
:
The columns to dummy encode. Must be categorical dtype.
Dummy encodes all categorical dtype columns by default.
Кроме того, здесь сообщает, что вы всегда должен используете Categorizer
перед использованием некоторых кодировщиков (включая DummyEncoder
).
Правильный способ сделать это:
from dask_ml.preprocessing import Categorizer, DummyEncoder
from sklearn.pipeline import make_pipeline
pipe = make_pipeline(
Categorizer(), DummyEncoder())
pipe.fit(data)
pipe.transform(testD)
Что выведет:
B_a B_b B_c
0 1 0 0
1 1 0 0
@Asif не нужно извиняться. Рад, что смог помочь!
Я пропустил это, не знаю как. Извинения.