Python

Linear regression на Python: простой пример

Линейная регрессия ищет прямую, которая приближает зависимость между признаками и числовым результатом. В первом примере удобно взять scikit-learn: подготовить X, подготовить y, обучить LinearRegression, сделать прогноз и посмотреть коэффициенты

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

Установка

pip install scikit-learn

Если вы работаете в Jupyter Notebook, установку можно выполнить в отдельной ячейке

Первый пример

from sklearn.linear_model import LinearRegression

X = [[1], [2], [3], [4], [5]]
y = [2, 4, 6, 8, 10]

model = LinearRegression()
model.fit(X, y)

prediction = model.predict([[6]])

print(prediction[0])

Результат:

12.0

Здесь модель увидела зависимость: если X увеличивается на 1, y увеличивается примерно на 2. Поэтому для 6 прогноз равен 12

Почему X — список списков

В scikit-learn X должен быть таблицей признаков. Даже если признак один, его передают как список списков

Правильно:

X = [[1], [2], [3]]

Неправильно:

X = [1, 2, 3]

Каждая внутренняя строка — один объект. В примере [[1], [2], [3]] есть три объекта и один признак

y — это целевые значения, которые модель должна научиться предсказывать

y = [2, 4, 6]

Пример: прогноз цены по площади

Возьмем учебные данные по площади квартиры и цене

from sklearn.linear_model import LinearRegression

areas = [[30], [40], [50], [60], [70]]
prices = [3_000_000, 4_100_000, 5_000_000, 6_200_000, 7_100_000]

model = LinearRegression()
model.fit(areas, prices)

predicted_price = model.predict([[45]])[0]

print(round(predicted_price))

Такой код прогнозирует цену для площади 45 квадратных метров. Результат будет приблизительным, потому что данные маленькие и искусственные

По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы

По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы

Коэффициент и intercept

После обучения можно посмотреть параметры модели

print(model.coef_)
print(model.intercept_)

coef_ показывает наклон линии: насколько примерно меняется прогноз при увеличении признака на единицу

intercept_ показывает значение, где линия пересекает ось y, если признак равен нулю

Для учебного примера с ценой коэффициент можно читать как примерную прибавку цены за один квадратный метр, но в реальном рынке так грубо считать нельзя без дополнительных признаков

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

У объекта может быть несколько признаков. Например, площадь и количество комнат

from sklearn.linear_model import LinearRegression

X = [
    [30, 1],
    [45, 2],
    [60, 2],
    [75, 3],
]
y = [3_000_000, 4_700_000, 6_000_000, 7_800_000]

model = LinearRegression()
model.fit(X, y)

print(model.predict([[50, 2]])[0])

Теперь каждая строка X содержит два значения. При прогнозе тоже нужно передать два значения в том же порядке

Проверка на тестовых данных

Для настоящей проверки данные делят на обучение и тест

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error

X = [[30], [40], [50], [60], [70], [80], [90], [100]]
y = [3_000_000, 4_100_000, 5_000_000, 6_200_000, 7_100_000, 8_300_000, 9_000_000, 10_200_000]

X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.25,
    random_state=42,
)

model = LinearRegression()
model.fit(X_train, y_train)

predictions = model.predict(X_test)
error = mean_absolute_error(y_test, predictions)

print(round(error))

mean_absolute_error показывает среднюю абсолютную ошибку прогноза в тех же единицах, что и y. Если y — цена в рублях, ошибка тоже будет в рублях

На маленьком наборе метрика нестабильна, но сам принцип важен: модель нужно проверять на данных, которые она не видела при обучении

Частые ошибки

Передавать X как одномерный список вместо списка списков

Делать выводы по пяти строкам данных

Считать прогноз точной истиной, а не приближением

Не отделять обучающие данные от проверочных

Забывать, что линейная регрессия ищет линейную зависимость и плохо описывает сложные нелинейные процессы

Путать признаки X и целевое значение y

Практические задачи

Поменяйте значение [[6]] в первом примере и посмотрите прогноз

Посмотрите model.coef_ и model.intercept_

Добавьте одну точку с шумом и сравните прогноз

Сделайте пример с двумя признаками

Разделите данные через train_test_split

Посчитайте mean_absolute_error

Простой пример linear regression на Python состоит из четырех шагов: подготовить X и y, создать LinearRegression, вызвать fit(), сделать прогноз через predict()

Самые важные детали для новичка: X передается как таблица, даже если признак один, прогноз является приближением, а качество модели нужно проверять на отдельных данных

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x