Шаг 120.
Введение в машинное обучение с использованием Python. Типы данных и конструирование признаков. Взаимодействия и полиномы

    На этом шаге мы рассмотрим правила конструирования признаков.

    Еще один способ обогатить пространство признаков, в частности, для линейных моделей, заключается в добавлении взаимодействии признаков (interaction features) и полиномиальных признаков (polynomial features). Конструирование признаков подобного рода получило распространение в статистическом моделировании, а также широко используется во многих практических сферах применения машинного обучения.

    Для начала снова посмотрите на рисунок 2 предыдущего шага. Для каждой категории признака линейная модель предсказывает одно и то же значение. Однако мы знаем, что линейные модели могут вычислить не только значения сдвига, но и значения наклона. Один из способов добавить наклон в линейную модель, построенную на основе категоризированных данных, заключается в том, чтобы добавить обратно исходный признак (ось х на графике). Это приведет к получению 11-мерного массива данных, как показано на рисунке 1:

[In 17]:
X_combined = np.hstack([X, X_binned])
print(X_combined.shape)

(100, 11)
[In 18]:
reg = LinearRegression().fit(X_combined, y)
line_combined = np.hstack([line, line_binned])
plt.plot(line, reg.predict(line_combined), 
         label='линейная регрессия после комбинирования')
for bin in  bins:
    plt.plot([bin, bin], [-3, 3], ':', c='k')

plt.legend(loc="best")
plt.ylabel("Выход регрессии")
plt.xlabel("Входной признак")
plt.plot(X[:, 0], y, 'o', c='k')


Рис.1. Линейная регрессия с использованием категоризированных признаков и одним глобальным наклоном

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

[In 19]:
X_product = np.hstack([X_binned, X * X_binned])
print(X_product.shape)

(100, 20)

    Теперь набор данных содержит 20 признаков: в него записывается индикатор категории, в которой находится точка данных, а также произведение исходного признака и индикатора категории. Произведение признаков можно представить как отдельную копию признака, отложенного по оси х, для каждой категории. Оно соответствует исходному признаку, попадающему в данную категорию, или нулю во всех остальных случаях. На рисунке 2 показан результат линейной модели для этого нового пространства признаков:

[In 20]:
reg = LinearRegression().fit(X_product, y)

line_product = np.hstack([line_binned, line * line_binned])
plt.plot(line, reg.predict(line_product), 
         label='линейная регрессия произведение')

for bin in bins:
    plt.plot([bin, bin], [-3, 3], ':', c='k')

plt.plot(X[:, 0], y, 'o', c='k')
plt.ylabel("Выход регрессии")
plt.xlabel("Входной признак")
plt.legend(loc="best")


Рис.2. Линейная регрессия с отдельным наклоном для каждой категории

    Видно, что теперь каждая категория имеет свое собственное значение сдвига и свое собственное значение наклона.

    На следующем шаге мы продолжим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг