2016-12-17 16 views
2

Я пытаюсь выполнить некоторые алгоритмы выбора функций в наборе данных для взрослых UCI, и у меня возникает проблема с выбором функции Univaraite. Я делаю однократную кодировку для всех категориальных данных, чтобы изменить их на числовые, но это дает мне много результатов.Уменьшение разрешенности набора с одним горячим кодированием

Как я могу избежать этого? Что я должен сделать, чтобы сделать этот код лучше?

# Encode 
adult['Gender'] = adult['sex'].map({'Female': 0, 'Male': 1}).astype(int) 
adult = adult.drop(['sex'], axis=1) 

adult['Earnings'] = adult['income'].map({'<=50K': 0, '>50K': 1}).astype(int) 
adult = adult.drop(['income'], axis=1) 

#OneHot Encode 
adult = pd.get_dummies(adult, columns=["race"]) 

target = adult["Earnings"] 
data = adult.drop(["Earnings"], axis=1) 

selector = SelectKBest(f_classif, k=5) 
selector.fit_transform(data, target) 

for n,s in zip(data.head(0), selector.scores_): 
    print "F Score ", s,"for feature ", n 

EDIT:
Частичные результаты текущего кода:
F Оценка 26.1375747945 для особенность race_Amer-индийско-эскимосов
F оценка 3.91592196913 для функция race_Asian-Pac-Islander
F Оценка 237.173133254 для функции race_Black
F Оценка 31.117798305 для характеристики race_Other
F Оценка 218.117092671 для характеристики race_White

Ожидаемые результаты:
F Score «f_score» для функции «гонки»

Делая один горячий кодирования функция в выше разделяется на множество суб-функций, где я хотел бы обобщить это просто гонки (см. ожидаемые результаты), если это возможно.

+0

Пожалуйста, сократите код до минимально необходимого и включите данные образца и желаемые результаты. Общие рекомендации по заданию вопросов: http://stackoverflow.com/help/mcve Спецификация Pandas: http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples – JohnE

+0

@Username Могу ли я предложите изменить название этого вопроса, более подробно описывая актуальную проблему. Может быть, по строкам «Сокращение количества категорически закодированных функций для выбора функции?» или «Уменьшение разрешенности набора с одним горячим кодированием». – josh

+0

@JohnE и josh, Спасибо за ваши комментарии! Я внес некоторые изменения в вопрос – Username

ответ

2

Один из способов, позволяющих уменьшить количество функций, в то же время кодируя свои категории в некотором порядке, заключается в использовании двоичного кодирования. Однострочное кодирование имеет линейную скорость роста n, где n - это количество категорий в категориальной функции. Бинарное кодирование имеет log_2(n) темп роста. Другими словами, удвоение количества категорий добавляет один столбец для двоичного кодирования, где, поскольку он удваивает количество столбцов для однострунной кодировки.

Двоичное кодирование может быть легко реализовано в python с помощью пакета categorical_encoding. Пакет поставляется с возможностью установки и бесшовно работает с sklearn и pandas. Ниже приведен пример

import pandas as pd 
import category_encoders as ce 

df = pd.DataFrame({'cat1':['A','N','K','P'], 'cat2':['C','S','T','B']}) 

enc_bin = ce.binary_encoding.BinaryEncoding(cols=['cat1']) # cols=None, all string columns encoded 

df_trans = enc_bin.fit_transform(df) 
print(df_trans) 


Out[1]: 
      cat1_0 cat1_1 cat2 
    0  1  1  C 
    1  0  1  S 
    2  1  0  T 
    3  0  0  B 

Вот код из предыдущего answer мною, используя те же переменные, как описано выше, но с одной горячей кодирования. Давайте посмотрим, как выглядят два разных выхода.

import pandas as pd 
import category_encoders as ce 

df = pd.DataFrame({'cat1':['A','N','K','P'], 'cat2':['C','S','T','B']}) 
enc_ohe = ce.one_hot.OneHotEncoder(cols=['cat1']) # cols=None, all string columns encoded 

df_trans = enc_ohe.fit_transform(df) 
print(df_trans) 


Out[2]: 
     cat1_0 cat1_1 cat1_2 cat1_3 cat2 
    0  0  0  1  0 C 
    1  0  0  0  1 S 
    2  1  0  0  0 T 
    3  0  1  0  0 B 

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

+0

Спасибо за хорошо объясненный ответ! Я думаю, что это будет трюк :). – Username

 Смежные вопросы

  • Нет связанных вопросов^_^