Категориальные и числовые характеристики - Категориальная цель - Scikit Learn - Python

У меня есть набор данных, содержащий как категориальные, так и числовые столбцы, и мой целевой столбец также категориальный. Я использую библиотеку Scikit в Python34. Я знаю, что Scikit необходимо преобразовать все категориальные значения в числовые, прежде чем применять какой-либо подход к машинному обучению.

Как мне преобразовать категориальные столбцы в числовые значения? Я много чего пробовал, но получаю разные ошибки, например, у объекта «str» нет объекта «numpy.ndarray» нет атрибута «items».

Here is an example of my data:
 UserID  LocationID   AmountPaid    ServiceID   Target
 29876      IS345       23.9876      FRDG        JFD
 29877      IS712       135.98       WERS        KOI

Мой набор данных сохранен в файле CSV, вот небольшой код, который я написал, чтобы дать вам представление о том, что я хочу сделать:

#reading my csv file
data_dir = 'C:/Users/davtalab/Desktop/data/'
train_file = data_dir + 'train.csv'
train = pd.read_csv( train_file )

#numeric columns:
x_numeric_cols = train['AmountPaid']

#Categrical columns:
categorical_cols = ['UserID' + 'LocationID' + 'ServiceID']
x_cat_cols = train[categorical_cols].as_matrix() 


y_target = train['Target'].as_matrix() 

Мне нужно преобразовать x_cat_cols в числовые значения и добавить их в x_numeric_cols, чтобы получить мои полные значения input (x).

Затем мне нужно преобразовать мою целевую функцию в числовое значение и сделать это столбцом конечной цели (y).

Затем я хочу создать случайный лес, используя эти два полных набора как:

rf = RF(n_estimators=n_trees,max_features=max_features,verbose =verbose, n_jobs =n_jobs)
rf.fit( x_train, y_train )

Спасибо за вашу помощь!


person USC.Trojan    schedule 16.05.2015    source источник


Ответы (2)


В качестве цели вы можете использовать LabelEncoder sklearn. Это даст вам преобразователь строковых меток в числовые (а также обратное отображение). Пример по ссылке.

Что касается функций, алгоритмы обучения обычно ожидают (или лучше всего работают с) порядковыми данными. Поэтому лучший вариант - использовать OneHotEncoder для преобразования категориальные особенности. Это создаст новую двоичную функцию для каждой категории, обозначающую включение / выключение для каждой категории. Опять же, пример использования в ссылке.

person Ando Saabas    schedule 17.05.2015
comment
Для цели классификации вам фактически не нужно использовать какое-либо преобразование. Все классификаторы могут работать с произвольными метками. - person Andreas Mueller; 18.05.2015

Это произошло из-за того, как я перечисляю данные. Если я распечатаю данные (используя другой образец), вы увидите:

>>> import pandas as pd
>>> train = pd.DataFrame({'a' : ['a', 'b', 'a'], 'd' : ['e', 'e', 'f'],
...                       'b' : [0, 1, 1], 'c' : ['b', 'c', 'b']})
>>> samples = [dict(enumerate(sample)) for sample in train]
>>> samples
[{0: 'a'}, {0: 'b'}, {0: 'c'}, {0: 'd'}]

Это список диктовок. Вместо этого мы должны сделать это:

    >>> train_as_dicts = [dict(r.iteritems()) for _, r in train.iterrows()]
    >>> train_as_dicts
    [{'a': 'a', 'c': 'b', 'b': 0, 'd': 'e'},
     {'a': 'b', 'c': 'c', 'b': 1, 'd': 'e'},
     {'a': 'a', 'c': 'b', 'b': 1, 'd': 'f'}]
Now we need to vectorize the dicts:

>>> from sklearn.feature_extraction import DictVectorizer

>>> vectorizer = DictVectorizer()
>>> vectorized_sparse = vectorizer.fit_transform(train_as_dicts)
>>> vectorized_sparse
<3x7 sparse matrix of type '<type 'numpy.float64'>'
    with 12 stored elements in Compressed Sparse Row format>

>>> vectorized_array = vectorized_sparse.toarray()
>>> vectorized_array
array([[ 1.,  0.,  0.,  1.,  0.,  1.,  0.],
       [ 0.,  1.,  1.,  0.,  1.,  1.,  0.],
       [ 1.,  0.,  1.,  1.,  0.,  0.,  1.]])
To get the meaning of each column, ask the vectorizer:

>>> vectorizer.get_feature_names()
['a=a', 'a=b', 'b', 'c=b', 'c=c', 'd=e', 'd=f']
person USC.Trojan    schedule 14.06.2017