Первая модель: 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]])) # предсказания для новых квартир
Три шага любой модели
- Создать модель:
model = LinearRegression()— здесь задаются настройки (гиперпараметры). - Обучить:
model.fit(X, y)— модель подбирает свои параметры по данным. - Предсказать:
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).