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 передается как таблица, даже если признак один, прогноз является приближением, а качество модели нужно проверять на отдельных данных