Линейный регрессионный анализ со строковыми / категориальными признаками (переменными)?

алгоритмы регрессии, похоже, работают с функциями, представленными в виде чисел. Например:

enter image description here

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


но теперь я хочу сделать регрессионный анализ данных, которые содержат категориальные функции:

enter image description here

есть 5 характеристики: District, Condition, Material, Security, Type


как я могу сделать регрессию по этим данным? Должен ли я преобразовать все эти строковые/категориальные данные в числа вручную? Я имею в виду, если мне нужно создать некоторые правила кодирования и в соответствии с этими правилами преобразовать все данные в числовые значения. Есть ли простой способ преобразовать строковые данные в числа без необходимости создавать собственные правила кодирования вручную? Может быть, есть некоторые библиотеки в Python что можно использовать для этого? Есть ли какие-то риски, что регрессионная модель будет как-то неправильной из-за "плохой кодировки"?

2 ответов


да, вам придется перевести все в цифры. Это требует размышлений о том, что представляют собой эти атрибуты.

обычно есть три варианта:

  1. один-горячая кодировка для категориальных данных
  2. произвольные числа для порядковых данных
  3. Используйте что-то вроде групповых средств для категориальных данных (e. г. средние цены по городским округам).

вы должны быть осторожны, чтобы не влить информацию, которую вы не в случае применения.

одна горячая кодировка

если у вас есть категорийные данные, вы можете создать фиктивные переменные со значениями 0/1 для каждого возможного значения.

Э. Г.

idx color
0   blue
1   green
2   green
3   red

to

idx blue green red
0   1    0     0
1   0    1     0
2   0    1     0
3   0    0     1

это можно легко сделать с пандами:

import pandas as pd

data = pd.DataFrame({'color': ['blue', 'green', 'green', 'red']})
print(pd.get_dummies(data))

в результате:

   color_blue  color_green  color_red
0           1            0          0
1           0            1          0
2           0            1          0
3           0            0          1

номера для порядковых данных

создайте отображение ваших сортируемых категорий, e. г. старый

это также возможно с пандами:

data = pd.DataFrame({'q': ['old', 'new', 'new', 'ren']})
data['q'] = data['q'].astype('category')
data['q'] = data['q'].cat.reorder_categories(['old', 'ren', 'new'], ordered=True)
data['q'] = data['q'].cat.codes
print(data['q'])

результат:

0    0
1    2
2    2
3    1
Name: q, dtype: int8

использование категориальных данных для операций groupby

вы можете использовать среднее значение для каждой категории за прошлые (известные события).

скажем, у вас есть фрейм данных с последними известными средними ценами для городов:

prices = pd.DataFrame({
    'city': ['A', 'A', 'A', 'B', 'B', 'C'],
    'price': [1, 1, 1, 2, 2, 3],
})
mean_price = prices.groupby('city').mean()
data = pd.DataFrame({'city': ['A', 'B', 'C', 'A', 'B', 'A']})

print(data.merge(mean_price, on='city', how='left'))

результат:

  city  price
0    A      1
1    B      2
2    C      3
3    A      1
4    B      2
5    A      1

в этом случае вы можете использовать "фиктивное кодирование". Есть библиотеки Python для фиктивного кодирования, у вас есть несколько вариантов.

вы можете использовать библиотеку scikit-learn. Взгляните на здесь.

или, если вы работаете с пандами, он имеет встроенную функцию для создания фиктивных переменных. Проверка этой.

пример с пандами ниже:

import pandas as pd

sample_data = [[1,2,'a'],[3,4,'b'],[5,6,'c'],[7,8,'b']]
df = pd.DataFrame(sample_data, columns=['numeric1','numeric2','categorical'])
dummies = pd.get_dummies(df.categorical)
df.join(dummies)