Линейная регрессия в Scikit-learn

scikit-learnBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы изучите основы построения модели машинного обучения с использованием одной из самых популярных библиотек Python — scikit-learn. Мы сосредоточимся на линейной регрессии (Linear Regression) — простом, но мощном алгоритме, используемом для прогнозирования непрерывного значения, такого как цена или температура.

Наша цель — построить модель, способную прогнозировать медианные цены на жилье в районах Калифорнии. Мы будем использовать набор данных о жилье в Калифорнии (California housing dataset), который удобно включен в scikit-learn.

В ходе этой лабораторной работы вы научитесь:

  • Загружать набор данных из scikit-learn.
  • Подготавливать и разделять данные для обучения и тестирования.
  • Создавать и обучать модель линейной регрессии.
  • Использовать обученную модель для выполнения прогнозов.

Все задачи вы будете выполнять в WebIDE. Приступим!

Загрузка набора данных California housing с помощью datasets.fetch_california_housing()

На этом этапе мы начнем с загрузки набора данных для нашей модели. scikit-learn поставляется с несколькими встроенными наборами данных, которые отлично подходят для обучения и практики. Мы будем использовать набор данных о жилье в Калифорнии.

Сначала нам нужно создать скрипт Python. Файл с именем main.py уже создан для вас в каталоге ~/project. Вы можете найти его в файловом проводнике слева в WebIDE.

Откройте main.py и добавьте следующий код. Этот код импортирует необходимые библиотеки (fetch_california_housing из sklearn.datasets и pandas) и загружает набор данных. Мы будем использовать pandas для преобразования данных в DataFrame — табличную структуру данных, которую легко просматривать и обрабатывать.

Добавьте следующий код в main.py:

import pandas as pd
from sklearn.datasets import fetch_california_housing

## Load the California housing dataset
california = fetch_california_housing()

## Create a DataFrame
california_df = pd.DataFrame(california.data, columns=california.feature_names)
california_df['MedHouseVal'] = california.target

## Print the first 5 rows of the DataFrame
print("California Housing Dataset:")
print(california_df.head())

Теперь давайте запустим скрипт, чтобы увидеть вывод. Откройте терминал в WebIDE (вы можете использовать меню "Terminal" -> "New Terminal") и выполните следующую команду:

python3 main.py

В консоли вы должны увидеть первые пять строк набора данных. Столбец MedHouseVal является нашей целевой переменной, представляющей медианную стоимость жилья для районов Калифорнии, выраженную в сотнях тысяч долларов ($100,000).

California Housing Dataset:
   MedInc  HouseAge  AveRooms  AveBedrms  Population  AveOccup  Latitude  Longitude  MedHouseVal
0  8.3252      41.0  6.984127   1.023810       322.0  2.555556     37.88    -122.23        4.526
1  8.3014      21.0  6.238137   0.971880      2401.0  2.109842     37.86    -122.22        3.585
2  7.2574      52.0  8.288136   1.073446       496.0  2.802260     37.85    -122.24        3.521
3  5.6431      52.0  5.817352   1.073059       558.0  2.547945     37.85    -122.25        3.413
4  3.8462      52.0  6.281853   1.081081       565.0  2.181467     37.85    -122.25        3.422

Разделение данных на обучающую и тестовую выборки с помощью train_test_split из sklearn.model_selection

На этом этапе мы подготовим наши данные для процесса обучения. Важнейшей частью машинного обучения является оценка модели на данных, которые она никогда раньше не видела. Для этого мы разделяем наш набор данных на две части: обучающую выборку (training set) и тестовую выборку (testing set). Модель будет обучаться на обучающей выборке, а тестовую выборку мы будем использовать для оценки ее производительности.

Сначала нам нужно отделить признаки (переменные ввода, X) от целевой переменной (значение, которое мы хотим предсказать, y). В нашем случае X будет содержать все столбцы, кроме MedHouseVal, а y будет столбцом MedHouseVal.

Затем мы будем использовать функцию train_test_split из sklearn.model_selection для выполнения разделения.

Добавьте следующий код в ваш файл main.py.

from sklearn.model_selection import train_test_split

## Prepare the data
X = california_df.drop('MedHouseVal', axis=1)  ## Features (input variables)
y = california_df['MedHouseVal']  ## Target variable (what we want to predict)

## Split the data into training and testing sets
## test_size=0.2: Reserve 20% of data for testing, 80% for training
## random_state=42: Ensures reproducible splits (same result every run)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

## Print the shapes of the new datasets to confirm the split
print("\n--- Data Split ---")
print("X_train shape:", X_train.shape)  ## Training features
print("X_test shape:", X_test.shape)    ## Test features
print("y_train shape:", y_train.shape)  ## Training target values
print("y_test shape:", y_test.shape)    ## Test target values

Теперь снова запустите скрипт из терминала:

python3 main.py

Ниже DataFrame вы увидите размеры новых созданных обучающей и тестовой выборок. Это подтверждает, что данные были разделены корректно.

--- Data Split ---
X_train shape: (16512, 8)
X_test shape: (4128, 8)
y_train shape: (16512,)
y_test shape: (4128,)

Инициализация модели LinearRegression из sklearn.linear_model

На этом шаге мы создадим нашу модель линейной регрессии. scikit-learn делает это невероятно простым. Нам нужно только импортировать класс LinearRegression из модуля sklearn.linear_model, а затем создать его экземпляр.

Этот экземпляр представляет собой объект, содержащий алгоритм линейной регрессии. Линейная регрессия находит наилучшую прямую, проходящую через точки данных, используя формулу: y = mx + b, где m — коэффициенты (веса) для каждой признака, а b — свободный член (intercept). Здесь мы используем параметры по умолчанию, которые хорошо работают в большинстве базовых случаев.

Linear Regression Formula
Рисунок 1: Формула линейной регрессии y = mx + b, где m — наклон, а b — свободный член

Добавьте следующий код в ваш файл main.py. Это импортирует класс LinearRegression и создаст объект модели.

from sklearn.linear_model import LinearRegression

## Инициализация модели линейной регрессии
model = LinearRegression()

## Вывод модели для подтверждения ее создания
print("\n--- Model Initialized ---")
print(model)

Снова запустите ваш скрипт main.py из терминала:

python3 main.py

Вывод теперь будет включать строку, показывающую объект LinearRegression. Это подтверждает, что модель была успешно инициализирована.

--- Model Initialized ---
LinearRegression()

Обучение модели с помощью model.fit(X_train, y_train)

На этом этапе мы обучим нашу модель. Этот процесс часто называют "подгонкой" (fitting) модели под данные. Во время подгонки модель изучает взаимосвязи между признаками (X_train) и целевой переменной (y_train). Для линейной регрессии это означает нахождение оптимальных коэффициентов для каждого признака, чтобы наилучшим образом предсказывать целевое значение.

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

Добавьте следующий код в ваш файл main.py.

## Fit (train) the model on the training data
## The fit() method learns the relationship between features (X_train) and target (y_train)
## It calculates optimal coefficients for each feature and the intercept using least squares optimization
model.fit(X_train, y_train)

## After fitting, the model has learned the coefficients and intercept.
## The intercept represents the predicted value when all features are zero
print("\n--- Model Trained ---")
print("Intercept:", model.intercept_)

Теперь выполните скрипт из терминала:

python3 main.py

После выполнения скрипта вы увидите новый раздел в выводе, показывающий свободный член (intercept) модели линейной регрессии. Свободный член — это значение предсказания, когда все значения признаков равны нулю. Наличие числового значения здесь подтверждает, что модель была успешно обучена на данных.

--- Model Trained ---
Intercept: -37.023277706064185

Предсказание на тестовых данных с помощью model.predict(X_test)

На этом заключительном этапе мы будем использовать нашу обученную модель для создания предсказаний. Это конечная цель построения предиктивной модели. Мы будем использовать тестовые данные (X_test), которые модель не видела во время обучения, для оценки ее производительности.

Мы будем использовать метод predict() нашего обученного объекта модели, передавая в качестве аргумента тестовые признаки (X_test). Метод вернет массив предсказанных значений для целевой переменной.

Добавьте следующий код в ваш файл main.py.

## Make predictions on the test data
## The predict() method uses the learned coefficients and intercept to calculate predictions
## Formula: prediction = intercept + (coeff1 * feature1) + (coeff2 * feature2) + ...
predictions = model.predict(X_test)

## Print the first 5 predictions (values are in $100,000 units)
print("\n--- Predictions ---")
print(predictions[:5])

Теперь запустите полный скрипт в последний раз из терминала:

python3 main.py

Вывод теперь будет включать первые пять предсказанных цен на жилье для тестового набора. Эти значения — то, что, по мнению нашей модели, должны быть медианными значениями стоимости жилья, основанными на признаках в X_test. Вы можете концептуально сравнить эти предсказания с фактическими значениями в y_test, чтобы оценить точность модели.

--- Predictions ---
[0.71912284 1.76401657 2.70965883 2.83892593 2.60465725]

Поздравляем! Вы успешно создали, обучили и использовали модель линейной регрессии с помощью scikit-learn.

Резюме

В этой лабораторной работе вы завершили полный цикл создания базовой модели машинного обучения с использованием scikit-learn.

Вы начали с загрузки набора данных California housing и его подготовки с помощью pandas. Затем вы узнали о важности разделения данных на обучающий и тестовый наборы и выполнили разделение с помощью train_test_split.

После этого вы инициализировали модель LinearRegression, обучили ее на ваших обучающих данных с помощью метода fit(), и, наконец, использовали обученную модель для создания предсказаний на невиданных ранее тестовых данных с помощью метода predict().

Эта лабораторная работа закладывает прочную основу для работы с scikit-learn. Отсюда вы можете изучить более продвинутые темы, такие как:

  • Оценка модели: Расчет метрик, таких как среднеквадратичная ошибка (MSE) или коэффициент детерминации (R-squared), для измерения точности модели.
  • Масштабирование признаков: Стандартизация или нормализация признаков для улучшения производительности.
  • Регуляризация: Использование регрессии Ridge или Lasso для предотвращения переобучения.
  • Кросс-валидация: Более надежная оценка с использованием k-блочной кросс-валидации.
  • Другие алгоритмы: Попробуйте Random Forest, Support Vector Machines или нейронные сети.

Summary

In this lab, you have completed the entire workflow for building a basic machine learning model using scikit-learn.

You started by loading the California housing dataset and preparing it using pandas. Then, you learned the importance of splitting your data into training and testing sets and performed the split using train_test_split.

Following that, you initialized a LinearRegression model, trained it on your training data using the fit() method, used the trained model to make predictions on unseen test data with the predict() method, and finally visualized the results to understand your model's performance.

This lab provides a solid foundation in scikit-learn. From here, you can explore more advanced topics such as:

  • Model evaluation: Calculate metrics like Mean Squared Error (MSE) or R-squared to measure model accuracy
  • Data visualization: Create more advanced plots like residual plots, feature importance charts, or correlation matrices
  • Feature scaling: Standardize or normalize features for better performance
  • Regularization: Use Ridge or Lasso regression to prevent overfitting
  • Cross-validation: More robust evaluation using k-fold cross-validation
  • Other algorithms: Try Random Forest, Support Vector Machines, or Neural Networks