Как автоматически преобразовать огромный набор категориальных данных из строки в числовые значения? - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь построить регрессию дерева решений для прогнозирования значений MSRP (рекомендуемая производителем розничная цена) для автомобилей. Однако у меня возникают проблемы с преобразованием категориальных значений в числовые значения.

Моя проблема: У меня есть 8 столбцов категориальных функций, некоторые столбцы имеют до 40 различных типов уникальных значений и 20 000 экземпляров. Какой метод я должен использовать для преобразования категориальных данных, чтобы использовать для регрессии дерева решений? И есть ли способ автоматически ввести уникальное значение вместо того, чтобы вводить его вручную?

Я пытался использовать LabelEncoder для преобразования категориальных значений, но по какой-то причине массив для df.values ​​(BMW, Acura ...) в первом столбце не изменился даже после того, как я его преобразовал.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline 
df = pd.read_excel(r'C:\Users\user\Desktop\data.xlsx')
from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder()
df.values[:, 0] = labelencoder.fit_transform(df.values[:, 0])

Вот результат, который я получил:

array([['BMW', '1 Series M', 2011, ..., 19, 3916, 46135],
       ['BMW', '1 Series', 2011, ..., 19, 3916, 40650],
       ['BMW', '1 Series', 2011, ..., 20, 3916, 36350],
       ...,
       ['Acura', 'ZDX', 2012, ..., 16, 204, 50620],
       ['Acura', 'ZDX', 2013, ..., 16, 204, 50920],
       ['Lincoln', 'Zephyr', 2006, ..., 17, 61, 28995]], dtype=object)

Я хочу, чтобы первый столбец имел числовые значения, которые будут использоваться для регрессии DT. Кто-нибудь может помочь? Я делаю это в моем FYP, и это первый раз, когда я подхожу к машинному обучению.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Существует несколько способов преобразования категориальных данных в числовые с использованием панд и sklearn:

  1. pandas.get_dummies () (одна горячая кодировка)
    Пример:
import numpy as np
import pandas as pd

df = pd.DataFrame([['BMW', '1 Series M', 2011, 19, 3916, 46135],
       ['BMW', '1 Series', 2011,19, 3916, 40650],
       ['BMW', '1 Series', 2011,20, 3916, 36350],
       ['Acura', 'ZDX', 2012, 16, 204, 50620],
       ['Acura', 'ZDX', 2013, 16, 204, 50920],
       ['Lincoln', 'Zephyr', 2006, 17, 61, 28995]]) #Sample dataframe

pd.get_dummies(df, columns = [0,1,2]) #Dummies of 1st,2nd and 3rd column

выход
Output

2. LabelEncoder
* +1025 * Пример

import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder

df = pd.DataFrame([['BMW', '1 Series M', 2011, 19, 3916, 46135],
       ['BMW', '1 Series', 2011,19, 3916, 40650],
       ['BMW', '1 Series', 2011,20, 3916, 36350],
       ['Acura', 'ZDX', 2012, 16, 204, 50620],
       ['Acura', 'ZDX', 2013, 16, 204, 50920],
       ['Lincoln', 'Zephyr', 2006, 17, 61, 28995]]) #Sample dataframe

df[[0,1,2]].apply(LabelEncoder().fit_transform)

output (он даст только преобразованные столбцы, которые необходимо объединить с исходным кадром данных) enter image description here

df.loc[0:,0:2] = df[[0,1,2]].apply(LabelEncoder().fit_transform) 
#puts column back into dataframe

Выход enter image description here

0 голосов
/ 11 января 2019

На самом деле, вы назначаете данные неверным образом df.values ​​[:, 0] , попробуйте только df [:, 0]

import numpy as np
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()

data = [['BMW', '1 Series M', 19, 3916, 46135],
           ['BMW', '1 Series', 19, 3916, 40650],
           ['BMW', '1 Series', 20, 3916, 36350],
           ['Acura', 'ZDX', 16, 204, 50620],
           ['Acura', 'ZDX', 16, 204, 50920]]

data = np.array(data, dtype="object")
data[:,0] = le.fit_transform(data[:,0])
data

array([[1, '1 Series M', '19', '3916', '46135'],
   [1, '1 Series', '19', '3916', '40650'],
   [1, '1 Series', '20', '3916', '36350'],
   [0, 'ZDX', '16', '204', '50620'],
   [0, 'ZDX', '16', '204', '50920']], dtype=object)
...