Линейный регрессионный анализ со строковыми / категориальными признаками (переменными)?
алгоритмы регрессии, похоже, работают с функциями, представленными в виде чисел. Например:
этот набор данных не содержит категоричных функций/переменных. Вполне понятно, как делать регрессию по этим данным и прогнозировать цену.
но теперь я хочу сделать регрессионный анализ данных, которые содержат категориальные функции:
есть 5 характеристики: District
, Condition
, Material
, Security
, Type
как я могу сделать регрессию по этим данным? Должен ли я преобразовать все эти строковые/категориальные данные в числа вручную? Я имею в виду, если мне нужно создать некоторые правила кодирования и в соответствии с этими правилами преобразовать все данные в числовые значения. Есть ли простой способ преобразовать строковые данные в числа без необходимости создавать собственные правила кодирования вручную? Может быть, есть некоторые библиотеки в Python что можно использовать для этого? Есть ли какие-то риски, что регрессионная модель будет как-то неправильной из-за "плохой кодировки"?
2 ответов
да, вам придется перевести все в цифры. Это требует размышлений о том, что представляют собой эти атрибуты.
обычно есть три варианта:
- один-горячая кодировка для категориальных данных
- произвольные числа для порядковых данных
- Используйте что-то вроде групповых средств для категориальных данных (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)