</>
Тема 1 из 6

Первая модель: fit и predict

scikit-learn (импортируется как sklearn) — главная библиотека классического машинного обучения в Python. В ней десятки моделей, и все устроены одинаково: научившись работать с одной, легко перейти к любой другой.

Что такое машинное обучение

Обычная программа получает правила от программиста. Модель машинного обучения находит правило сама — по примерам, где известен правильный ответ.

  • Объект — то, о чём делается предсказание: квартира, письмо, пациент.
  • Признаки — числа, описывающие объект: площадь, этаж, число комнат.
  • Ответ (целевая переменная) — то, что нужно предсказать: цена квартиры.

Набор примеров с известными ответами называют обучающей выборкой. Модель учится на ней, а затем предсказывает ответы для новых объектов.

Данные в scikit-learn

  • X — таблица признаков: строки — объекты, столбцы — признаки. Форма (объектов, признаков). Это может быть список списков, массив numpy или DataFrame.
  • y — ответы: по одному на объект, одномерный список или Series.
X = [[30], [45], [60], [80]]     # площадь — один признак, но X всё равно таблица
y = [3.1, 4.4, 6.0, 7.9]         # цена, млн

Частая ошибка — передать X одним списком [30, 45, 60, 80]: scikit-learn выдаст ошибку Expected 2D array. Из одного столбца DataFrame таблица получается двойными скобками: df[["area"]], а из массива — x.reshape(-1, 1).

Линейная регрессия

Самая простая модель — линейная регрессия: ответ считается как взвешенная сумма признаков плюс константа:

y = a + b1 x1 + b2 x2 + …

Модель подбирает a и b так, чтобы предсказания на обучающей выборке были как можно ближе к правильным ответам (минимизирует сумму квадратов ошибок).

from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(X, y)                       # обучение
print(model.predict([[50], [100]]))   # предсказания для новых квартир

Три шага любой модели

  1. Создать модель: model = LinearRegression() — здесь задаются настройки (гиперпараметры).
  2. Обучить: model.fit(X, y) — модель подбирает свои параметры по данным.
  3. Предсказать: model.predict(X_new) — ответы для новых объектов (столько же признаков, в том же порядке!).

fit возвращает саму модель, поэтому можно писать коротко: LinearRegression().fit(X, y).

Что выучила модель

После обучения параметры доступны в атрибутах с подчёркиванием на конце:

print(model.intercept_)   # свободный член a
print(model.coef_)        # коэффициенты b — по одному на признак

Для одного признака coef_[0] — это наклон прямой: на сколько в среднем растёт ответ при увеличении признака на 1.

Если известно, что прямая должна проходить через ноль, свободный член отключают: LinearRegression(fit_intercept=False).

Несколько признаков

import pandas as pd

flats = pd.DataFrame({
    "area":  [30, 50, 70, 45],
    "rooms": [1, 2, 3, 1],
    "price": [3.0, 5.2, 7.1, 4.6],
})
model = LinearRegression().fit(flats[["area", "rooms"]], flats["price"])
print(model.coef_)   # вклад площади и вклад комнат

Новые объекты для predict должны содержать те же признаки в том же порядке.

Итог

  • объекты, признаки (X — таблица) и ответы (y);
  • LinearRegression() — линейная модель: y = a + b·x;
  • fit(X, y) — обучение, predict(X_new) — предсказание;
  • intercept_ и coef_ — выученные параметры;
  • X всегда двумерный: df[["столбец"]], reshape(-1, 1).