Как мне обрабатывать несколько непорядковых категориальных переменных?

#python #machine-learning #scikit-learn #linear-regression

Вопрос:

Я нашел в Интернете набор данных, содержащий данные об игроках НБА в этом году. Я пытаюсь запустить линейную регрессию в наборе данных, чтобы увидеть, сколько очков может набрать данный игрок в среднем, учитывая особенности: Имя команды, Должность, Возраст, Минуты, сыгранные за игру. Но я не могу понять, как обращаться с первыми двумя столбцами, которые являются моими категориальными переменными. Я только что начал курс информатики по Udemy, и инструктор на самом деле не объяснил, что делать в этом сценарии, поскольку его примеры OneHotEncoding применимы только к наборам данных с одной категориальной переменной.

Мой Код:

 #Import Libraries

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#Import Dataset

dataset = pd.read_csv('nba_clean.csv')
X = dataset.iloc[:, 1:-1].values
y = dataset.iloc[:, -1].values

#Encode Dataset

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers = [('encoder', OneHotEncoder(), [0, 1])], remainder = 'passthrough')
X = np.array(ct.fit_transform(X))

#Splitting the Dataset into Training set and Test Set

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state = 0)

#Perform Multiple Linear Regression on Training set
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)

#Compare predicted values to true values
y_pred = regressor.predict(X_test)
np.set_printoptions(precision = 2)
new_y_pred = y_pred.reshape(len(y_pred), 1)
new_y_test = y_test.reshape(len(y_test), 1)
print(np.concatenate((new_y_pred, new_y_test), 1))
 

Ответ №1:

Ваш преобразователь столбцов должен обрабатывать все различные типы столбцов: вы должны заменить

  ct = ColumnTransformer(transformers = [('encoder', OneHotEncoder(), [0, 1])], remainder = 'passthrough')
 

Со следующим типом кода:

Сначала определите списки типов столбцов:

 num_f  = ['age', 'points', ...]
ord_f  = ['bbb', 'ccc', ...]
cat_f  = ['aaa', 'ddd', ...]
drop_f = []
 

Затем создайте трансформатор для каждого типа значения

 # create a transformer for the categorical values
cat_tr = Pipeline(steps=[
    ('onehot', OneHotEncoder())])

# create a transformer for the categorical ordinal values
ord_tr = Pipeline(steps=[
    ('ordinal', OrdinalEncoder())])

# create a transformed for the numerical values
num_tr = Pipeline(steps=[
    ('scaler', StandardScaler())])

ct = ColumnTransformer(transformers=[
    ("drop",'drop' ,drop_f)
    ,("cat", cat_tr, cat_f)
    ,("ord", ord_tr, ord_f)
    ,("num", num_tr, num_f)
    ],remainder='passthrough')
 

Комментарии:

1. Спасибо! Вы знаете, как отобразить все столбцы? Я получаю это [[ 1. 0. 0. … 0. 23.11 34.3 ] [ 1. 0. 0. … 0. 30.62 14.1 ] [ 0. 0. 0. … 1. 26.64 34. ] … [ 0. 0. 0. … 0. 25.6 14.8 ] [ 1. 0. 0. … 0. 35.01 12.5 ] [ 0. 0. 0. … 0. 25.68 29.9 ]]

2. @NoobAtDataScience, добавьте pd.set_option('display.max_columns', None) в свой код

Ответ №2:

Вы можете преобразовать определенные столбцы в один-горячий, используя функцию pandas:

 pandas.get_dummies(data, column=["TeamName", "Position"])
 

Подобный этому:

 df = pd.DataFrame({
        "Player": ['player1', 'player2', 'player3'],
        "TeamName": ['Lakers', 'Spurs', 'Lakers'],
        "Position":['point guard', 'center', 'forward']
        })
    
df
           Player TeamName     Position
       0  player1   Lakers  point guard
       1  player2    Spurs       center
       2  player3   Lakers      forward


pd.get_dummies(df, columns=['TeamName', 'Position'], prefix='', prefix_sep='')

    Player   Lakers   Spurs   center   forward   point guard
0  player1        1       0        0         0             1
1  player2        0       1        1         0             0
2  player3        1       0        0         1             0
 

Комментарии:

1. Святые! Ты даже не представляешь, как сильно я в этом нуждался! Большое вам спасибо!