Как реализовать кодирование One-Hot? - PullRequest
0 голосов
/ 22 марта 2019

Я выполнял некоторые упражнения по машинному обучению, некоторые данные имеют качественные переменные, такие как пол: мужской, женский.

При построении модели мы знаем, что качественные переменные должны быть установлены в числа, например, из мужского в 1и женский до 0.

Но этого недостаточно, потому что модель всегда рассматривает числа как непрерывные числа, однако факторы не являются непрерывными, они дискретны.Как и 1> 0, это не означает «мужской> женский».

Таким образом, мы устанавливаем «мужской» на 01, женский - на 10, используя кодирование «одна горячая».

Например, код изофициальный сайт scikit-learn:

>>> from sklearn.preprocessing import OneHotEncoder
>>> enc = OneHotEncoder(handle_unknown='ignore')
>>> X = [['Male', 1], ['Female', 3], ['Female', 2]]
>>> enc.fit(X)
... 
OneHotEncoder(categorical_features=None, categories=None,
       dtype=<... 'numpy.float64'>, handle_unknown='ignore',
       n_values=None, sparse=True)

>>> enc.categories_
[array(['Female', 'Male'], dtype=object), array([1, 2, 3], dtype=object)]
>>> enc.transform([['Female', 1], ['Male', 4]]).toarray()
array([[1., 0., 1., 0., 0.],
       [0., 1., 0., 0., 0.]])
>>> enc.inverse_transform([[0, 1, 1, 0, 0], [0, 0, 0, 1, 0]])
array([['Male', 1],
       [None, 2]], dtype=object)
>>> enc.get_feature_names()
array(['x0_Female', 'x0_Male', 'x1_1', 'x1_2', 'x1_3'], dtype=object)

В соответствии с этим кодом, скажем, исходный кадр данных Pandas (tran_data2) может выглядеть так:

      Sex  ProductID  Age  Result
0    male          1   25       1
1  female          2   21       0
2  female          3   23       1

Теперь мы знаем, что:

Sex

male:01

female:10

ProductID

1:100

2:010

3:001

Так, например, ['Female', 1] = [1., 0., 1., 0., 0.].Но как использовать эти кодированные коды?Означает ли это, что я должен перевести исходный Dataframe в формат, подобный (tran_data1):

   x0_Female  x0_Male  x1_1  x1_2  x1_3  Age  Result
0          0        1     1     0     0   25       1
1          1        0     0     1     0   21       0
2          1        0     0     0     1   23       1

Затем начать строить модель с использованием нового Dataframe?

Например,

from sklearn import tree
features1=['x0_Female', 'x0_Male', 'x1_1', 'x1_2', 'x1_3', 'Age']
features2=['Sex', 'ProductID', 'Age']
y_pred=list()
clf=tree.DecisionTreeClassifier(criterion='entropy')
clf.fit(tran_data1[features1],tran_data1['Result'])
#clf.fit(tran_data2[features2],tran_data2['Result'])
y_pred=clf.predict(test_data[features1])

Означает ли это, что я должен использовать функции1 вместо функций2?

...