Сделайте регрессионную модель с категориальными данными с помощью Scikit-Learn - PullRequest
1 голос
/ 30 сентября 2019

У меня есть файл CSV с более чем 10 столбцами, некоторые из этих столбцов содержат категориальные данные, некоторые категориальные столбцы имеют только значения yes и no, некоторые столбцы имеют цвета (green, blue, red ...) и некоторые столбцы имеют другие строковые значения.

Есть ли способ создать модель регрессии со всеми столбцами?

Я знаю, что значения yes и noможет быть представлен как 1 и 0, но я читал, что нехорошо представлять названия цветов или городов с номерами. Есть ли лучший / правильный способ сделать это?

Это простой код с фиктивными данными:

import pandas as pd
from sklearn.linear_model import LinearRegression

df = pd.DataFrame({'par1':[1,3,5,7,9, 11,13],
                   'par2':[0.2, 0.4, 0.5, 0.7, 1, 1.2, 1.45],
                   'par3':['yes', 'no', 'no', 'yes', 'no', 'yes', 'no'],
                   'par4':['blue', 'red', 'red', 'blue', 'green', 'green', 'blue'],
                   'output':[103, 310, 522, 711, 921, 1241, 1451]})

print(df)

features = df.iloc[:,:-1]
result = df.iloc[:,-1]

reg = LinearRegression()
model = reg.fit(features, result)

prediction = model.predict([[2, 0.33, 'no', 'red']])

reg_score = reg.score(features, result)

print(prediction, reg_score)

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

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Вы задаете общий вопрос о регрессии, а не только о SciKit, поэтому я постараюсь ответить в общих чертах.

Вы правы относительно переменных да / нет, вы можете кодировать их как двоичные переменные, 0 и 1. Но тот же принцип действует для цветов и других категориальных переменных:

Вы создаете n-1 фиктивных двоичных переменных, n - количество категорий. Каждая из фиктивных переменных в основном говорит, попадает ли ваше наблюдение в соответствующую категорию. Вы объявляете один из них, например синий, категорией по умолчанию, и кодируете ее, устанавливая все фиктивные переменные в ноль. Т.е. если это не красный, ни зеленый, ни какой-либо другой доступный цвет, он должен быть синим.

Другие категории кодируются путем установки соответствующей фиктивной переменной на 1 и оставления всех остальных на нуле. Таким образом, для red вы можете установить dummy1 = 1, для green dummy2 = 1 и т. Д.

Двоичные переменные - это просто особый случай этой кодировки, где у вас есть две категории, которые вы кодируете с помощью 1 (= 2-1) переменная.

1 голос
/ 30 сентября 2019

Обычно вы бы " one-hot encode " категориальные переменные. Это также называется " добавление фиктивных переменных ".

Вы также захотите " стандартизировать " числовые переменные.

Scikit-learn делаетэто просто:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

t = ColumnTransformer(transformers=[
    ('onehot', OneHotEncoder(), ['par3', 'par4']),
    ('scale', StandardScaler(), ['par1', 'par2'])
], remainder='passthrough') # Default is to drop untransformed columns

t.fit_transform(df)

Наконец, вам необходимо преобразовать свой вход таким же образом, прежде чем запускать его через модель.

Собрав все вместе, вы получите:

import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler


df = pd.DataFrame({'par1':[1,3,5,7,9, 11,13],
                   'par2':[0.2, 0.4, 0.5, 0.7, 1, 1.2, 1.45],
                   'par3':['yes', 'no', 'no', 'yes', 'no', 'yes', 'no'],
                   'par4':['blue', 'red', 'red', 'blue', 'green', 'green', 'blue'],
                   'output':[103, 310, 522, 711, 921, 1241, 1451]})

t = ColumnTransformer(transformers=[
    ('onehot', OneHotEncoder(), ['par3', 'par4']),
    ('scale', StandardScaler(), ['par1', 'par2'])
], remainder='passthrough')

# Transform the features
features = t.fit_transform(df.iloc[:,:-1])
result = df.iloc[:,-1]

# Train the linear regression model
reg = LinearRegression()
model = reg.fit(features, result)

# Generate a prediction
example = t.transform(pd.DataFrame([{
    'par1': 2, 'par2': 0.33, 'par3': 'no', 'par4': 'red'
}]))
prediction = model.predict(example)
reg_score = reg.score(features, result)
print(prediction, reg_score)
...