Категориальные И Числовые Функции-Категориальная Цель - Scikit Learn-Python
у меня есть набор данных, содержащий как категориальные и числовые столбцы и колонки тоже категоричен. Я использую библиотеку Scikit в Python34. Я знаю, что Scikit нуждается во всех категориальных значениях для преобразования в числовые значения перед выполнением любого подхода машинного обучения.
как мне преобразовать мои категориальные столбцы в числовые значения? Я пробовал много чего, но я получаю разные ошибки, такие как объект" str "не имеет "numpy".объект ndarray не имеет атрибут "элементы".
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 и поэтому иметь мои полные входные значения (x).
затем мне нужно преобразовать мою целевую функцию в числовое значение и сделать это в качестве моего конечного целевого столбца (y).
тогда я хочу сделать случайный лес используя эти два полных набора как:
rf = RF(n_estimators=n_trees,max_features=max_features,verbose =verbose, n_jobs =n_jobs)
rf.fit( x_train, y_train )
Спасибо за вашу помощь!
2 ответов
для цели, вы можете использовать sklearn это LabelEncoder. Это даст вам конвертер из строковых меток в числовые (а также обратное отображение). Пример в ссылке.
Что касается функций, алгоритмы обучения в целом ожидают (или лучше всего работают с) порядковыми данными. Поэтому лучший вариант-использовать OneHotEncoder для преобразования категориальных признаков. Это создаст новую двоичную функцию для каждой категории, обозначающую включение/выключение для каждой категории. Снова, пример использования в ссылке.
Это было из-за того, как я перечисляю данные. Если я распечатаю данные (используя другой образец), вы увидите:
>>> 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']