Вы не можете использовать категориальные переменные в линейной регрессии. Линейная регрессия рассматривает все переменные как числовые переменные. Следовательно, если вы закодируете Director1 как 1, а Director2 как 2, линейная регрессия попытается найти взаимосвязь на основе этой схемы кодирования. Предполагается, что Director2 в два раза больше, чем Director1. На самом деле эти цифры ничего не значат. Вы можете кодировать их как 143 и 9879, разницы быть не должно. Они не имеют никакого числового значения. Чтобы убедиться, что линейная регрессия обрабатывает их правильно, вам нужно использовать фиктивные переменные.
С фиктивными переменными у вас есть переменная для каждого уровня категории. Например, если у вас 3 директора, у вас будет 3 переменные: D1, D2 и D3. D1 будет иметь значение 1, если соответствующий фильм был снят Режиссером1, и 0 в противном случае; D2 будет иметь значение 1, если фильм был снят режиссером Director2, и 0 в противном случае... Таким образом, с набором значений D2 D1 D2 D3 D1 D2 ваши фиктивные переменные будут:
D1 D2 D3
D2 0 1 0
D1 1 0 0
D2 0 1 0
D3 0 0 1
D1 1 0 0
D2 0 1 0
В линейной регрессии, чтобы избежать мультиколлинеарности, мы используем только n-1
из этих переменных, где n
— это количество категорий (количество директоров в этом примере). Один из директоров будет выбран в качестве базового и будет представлен константой в регрессионной модели. Неважно, какой. Например, если вы исключите D3, вы узнаете, что фильм был снят Режиссером3, если D1=0
и D2=0
. Вам не нужно указывать D3=1
.
В scikit-learn это преобразование выполняется с помощью OneHotEncoder. Пример взят из документации scikit-learn:
У вас есть три категориальные переменные: Пол, Регион и Браузер. Пол имеет 2 уровня: ["male", "female"]
, регион имеет три уровня: ["from Europe", "from US", "from Asia"]
и браузер имеет четыре уровня: ["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"]
. Предположим, что они закодированы числами, начинающимися с нуля. Итак, [0, 1, 2]
означает мужчину из США, который использует Safari.
>>> enc = preprocessing.OneHotEncoder()
>>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
OneHotEncoder(categorical_features='all', dtype=<... 'float'>,
handle_unknown='error', n_values='auto', sparse=True)
>>> enc.transform([[0, 1, 3]]).toarray()
array([[ 1., 0., 0., 1., 0., 0., 0., 0., 1.]])
С помощью enc.fit
scikit-learn выводит количество уровней для каждой переменной. Для таких наблюдений, как [0, 1, 3], если вы вызовете enc.transform
, вы увидите их фиктивные переменные. Обратите внимание, что длина результирующего массива равна 2 + 3 + 4 = 9. Первые два для пола (если мужчина, первый равен 1), следующие три для региона и так далее.
person
ayhan
schedule
10.05.2016