Использовать get_dummies, чтобы превратить категориальные значения в числовые? - PullRequest
0 голосов
/ 29 октября 2019

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

Пример

Я хочу предсказать Ages на основе Location изorigin:

import pandas as pd

# create a simple dataset of people
data = {'Name': ["John", "Anna", "Peter", "Linda","John","John","John"],
        'Location' : ["Paris","Paris","Paris","Paris", "New York", "Berlin", "London"],
        'Age' : [24, 23, 21, 24,36,34,36]
       }

df = pd.DataFrame(data)

В этой части ниже есть проблема с названиями городов, поэтому я решил использовать фиктивные переменные, но строка с get_dummies не верна. Я думаю, что нужно преобразовать строки Name и Location в фиктивные переменные, и это то, что я пробовал, но как правильно?

from sklearn.model_selection import train_test_split
X = df.drop('Age', axis=1)
y = df['Age']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20)

from sklearn.svm import SVC
svclassifier = SVC(kernel='linear')
X_train = pd.get_dummies(df.columns)  #<---- here is the issue probably
svclassifier.fit(X_train, y_train)
y_pred = svclassifier.predict(X_test)

Ответы [ 2 ]

1 голос
/ 29 октября 2019

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

from sklearn.model_selection import train_test_split
#features
X = pd.get_dummies(df[['Name','Location']])

#Target
y = df['Age']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20)

from sklearn.svm import SVC

svclassifier = SVC(kernel='linear')
svclassifier.fit(X_train, y_train)
y_pred = svclassifier.predict(X_test)
1 голос
/ 29 октября 2019

svclassifier.fit(X_train, y_train) принимает массив в качестве входных данных, но вы передаете панду DataFrame. Попробуйте использовать sklearn.preprocessing.LabelEncoder istead из pd.get_dummies.

Редактировать: Пример с LabelEncoder и OneHotEncoder:

# create a simple dataset of people
data = {'Name': ["John", "Anna", "Peter", "Linda","John","John","John"],
        'Location' : ["Paris","Paris","Paris","Paris", "New York", "Berlin", "London"],
        'Age' : [24, 23, 21, 24,36,34,36]
       }

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.svm import SVC
import numpy as np

X = data['Location']
y = data['Age']

# Label
print("Label Encoded")
le = LabelEncoder()
le.fit(X)
X_enc = le.transform(X)

X_train, X_test, y_train, y_test = train_test_split(X_enc, y, test_size = 0.20, random_state=42)

svclassifier = SVC(kernel='linear')
svclassifier.fit(np.reshape(X_train,(X_train.shape[0],1)), y_train)
y_pred = svclassifier.predict(np.reshape(X_test, (X_test.shape[0],1)))
print(f"y_pred: {y_pred}, y_test: {y_test}")

# OneHot
print("OneHot Encoded")
ohe = OneHotEncoder()
ohe.fit(np.reshape(X,(len(X),1)))
X_oh = ohe.transform(np.reshape(X,(len(X),1)))

X_train, X_test, y_train, y_test = train_test_split(X_oh, y, test_size = 0.20, random_state=42)

svclassifier = SVC(kernel='linear')
svclassifier.fit(X_train, y_train)
y_pred = svclassifier.predict(X_test)
print(f"y_pred: {y_pred}, y_test: {y_test}")

Дает:

Label Encoded
y_pred: [24 24], y_test: [24, 23]
OneHot Encoded
y_pred: [24 24], y_test: [24, 23]

Не так уж плохо.

...