Прогнозирование с использованием линейной регрессии, LassoCV, ElasticNet, RidgeCV и xgboost

Хотите создать достойный резюме проект машинного обучения с реальной реальной значимостью всего за пару часов? Вы новичок в этой области или не знаете, с чего начать? Вы находитесь в нужном месте. Читать дальше!

В последние несколько лет вокруг искусственного интеллекта и машинного обучения ведется много шума. Это неудивительно, учитывая, что наше существование полно шаблонов. Машинное обучение для меня - это просто распознавание образов на фундаментальном уровне.

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

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

Я предполагаю, что мой читатель - абсолютный новичок в этой области (и использует ПК с Windows). Итак, без дальнейших промедлений, приступим к созданию вашего первого проекта.

Шаг 1. Установите Anaconda Framework

  • Загрузите установку здесь. Выберите настройку в соответствии со спецификацией вашего ПК.
  • Установите это в свою систему. Также будут установлены Anaconda Prompt и Spyder IDE.
  • К ним можно просто получить доступ из строки поиска в Windows.
  • Мы будем использовать Spyder IDE для всего нашего программирования.

Шаг 2: Выберите домен приложения

  • Тремя основными областями прикладного машинного обучения являются Компьютерное зрение и Анализ изображений, Распознавание речи и Обработка естественного языка. и Анализ прогнозов.
  • В этом руководстве я рассмотрю классическую задачу прогнозирования.

Шаг 3. Выбор набора данных

  • Это один из самых важных шагов вашего проекта.
  • Каждому проекту машинного обучения потребуется набор данных для обучения и тестирования. Kaggle - отличное место для выбора набора данных.
  • Перейдите по указанной выше гиперссылке и найдите соответствующие наборы данных. Вы также можете искать наборы данных в другом месте.
  • Вы можете сначала выбрать свой набор данных, а затем решить, что с ним делать, если вы не знаете, какую проблему хотите решить.
  • Один из обнаруженных мною наборов данных - это » «Набор данных о продажах домов в Кинг-Стране, США, который я буду использовать для прогнозирования цены на дом. (Обсудим через минуту). В целях прогнозирования вы можете выбирать из множества наборов данных о продажах, наборов данных о ценах на продукты или наборов спортивных данных, чтобы предсказать, кто победит, и т. Д.
  • Вышеупомянутый выбор совершенно произвольный, и вы можете выбрать любой набор данных, который может вас заинтересовать.

Шаг 4. Изучение содержимого вашего набора данных

  • Извлеките загруженные zip-файлы и изучите содержимое выбранного набора данных. В моем случае это так:
  • В наборе данных о продажах домов есть различные характеристики (точнее 19) домов, а также указана их цена. Давайте возьмем все эти характеристики за X, а цену за Y, которые мы хотим спрогнозировать.
  • Теперь откройте Spyder IDE и создайте новый проект. Скопируйте файл набора данных в папку проекта.

Для любого проекта самым первым шагом будет импорт необходимых библиотек. Это делается следующим образом-

import numpy as np
import pandas as pd
import matplotlib as plt #and so on...

Таким образом можно импортировать все необходимые библиотеки. Если у вас нет предустановленной библиотеки, вы можете запустить «Anaconda Prompt» с панели инструментов поиска в меню «Пуск». С его помощью вы можете установить необходимую библиотеку с помощью простой команды pip.

pip install pandas #This command would automatically install pandas

Таким же образом вы можете установить любую библиотеку, если знаете ее имя. Библиотека Pandas обычно используется для чтения наборов данных.

Небольшой совет перед тем, как продолжить.. Всякий раз, когда вы используете Spyder для кодирования, используйте «# %%», чтобы разделить код на блоки. Вы можете выполнять отдельные фрагменты или блоки кода, используя "Ctrl + Enter". Такой подход сохранит код в чистоте, а также его будет легко отлаживать.

Шаг 5: Построение вашей модели - прогнозирование цены дома

  • Импорт базовых библиотек
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
  • Чтение нашего набора данных-
data = pd.read_csv('kc_house_data.csv')
  • Очистка данных - давайте удалим все нежелательные или нерелевантные данные из нашего набора данных. Это может быть основано на вашей интуиции. В качестве примера я удаляю несколько столбцов. Синтаксис будет выглядеть примерно так. Следующая строка удалит столбцы «дата» и «почтовый индекс» из набора данных.
data = data.drop(['date', 'zipcode'], axis = 1)
  • Наша проблема имеет множество известных характеристик (X) (например, количество спален, жилой площади и т. Д.) , на основании которых цена (Y) зависит от. Теперь нам нужно построить корреляционную матрицу, чтобы понять, какие из характеристик сильно влияют на цену дома. Это визуализируется с помощью библиотеки seaborn. Этот шаг может быть выполнен для лучшего понимания наших данных.
corr = data.corr()
mask = np.zeros_like(corr, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
f, ax = plt.subplots(figsize=(12, 9))
cmap = sns.diverging_palette(220, 10, as_cmap=True)
sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0, square=True, linewidths=.5, cbar_kws={"shrink": .5})

  • Выбор алгоритма. Всякий раз, когда у нас возникает ситуация, когда «Y» зависит от нескольких «X», мы можем подойти к ней с помощью линейной регрессии, где мы попробуйте установить линейную связь между Y и всеми X, например Y = a1X1 + a2X2 +… и так далее . Итак, учитывая X1, X2,…, мы можем предсказать значение Y, если нам известны значения a1, a2,… и так далее. Именно это мы и пытаемся сделать здесь, выясняя наиболее приближенные значения для a1, a2 и т. Д. Как правило, набор данных делится на 70% данных обучения и 30% данных тестирования, на которых обучаемая модель тестируется для измерения производительности.
features = ['bedrooms', 'bathrooms', 'sqft_living', 'sqft_lot', 'floors', 'waterfront', 'view', 'grade', 'sqft_above', 'sqft_basement', 'condition', 'yr_built', 'yr_renovated', 'lat', 'long', 'sqft_living15', 'sqft_lot15']
X = data[features]
y = data.price
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=0)
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)
y_pred = regressor.predict(X_test)
  • Наша модель обучена и протестирована. Мы можем использовать некоторые стандартные метрики, чтобы измерить, насколько хорошо работает наша модель.
df = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred})
from sklearn import metrics 
 
print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))  
print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))  
print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
df.head()
#Results
Mean Absolute Error: 125002.07442244422
Mean Squared Error: 43690646677.93878
Root Mean Squared Error: 209023.07690285967
#First 5 Predictions of our model
Actual     Predicted
297000.0   3.872015e+05
1578000.0  1.502715e+06
562100.0   5.274534e+05
631500.0   5.779358e+05
780000.0   9.993390e+05
  • Давайте теперь визуализируем наши прогнозы с фактическими ценами для лучшего понимания. Прямая линия с уклоном в 45 градусов указала бы на идеальную модель.
plt.scatter(y_test, y_pred)
plt.xlabel("Prices")
plt.ylabel("Predicted prices")

  • Может показаться, что у нас много ошибок. Конечно, производительность оставляет желать лучшего, но в некоторой степени модель смогла дать оценку стоимости. Как видно из первых пяти прогнозов, например, наша модель предсказывала, что цена дома будет 1 502 715, но фактическая цена дома составила 1 578 000. Это относительно нормально, чтобы дать очень приблизительную оценку, но есть огромные возможности для улучшения.
  • Улучшение нашей модели: обратите внимание на среднеквадратичную ошибку: 209023.07690285967 для нашей модели. Посмотрим, сможем ли мы уменьшить эту ошибку. Вот несколько бонусных приемов, которые вы можете попробовать.
  • Я буду реализовывать три продвинутых метода, а именно: LassoCV, ElasticNet и RidgeCV. Это несколько хороших моделей прогнозирования, которые устраняют недостатки линейной регрессии. А пока вы можете просто ознакомиться с этими методами и посмотреть, как они реализуются на практике. Освоив линейную регрессию, вам обязательно стоит изучить основы работы с этими моделями. Здесь CV означает перекрестная проверка. Обратите внимание, как мы не используем X_test или y_test при обучении этих моделей. Это потому, что мы используем весь набор данных для обучения и тестирования. Это осуществляется путем повторения процесса обучения с использованием разных точек данных в наборе данных в качестве тестовых данных, а остальные данные - для обучения. В конечном итоге из всех итераций выбирается лучшая модель.
from sklearn.linear_model import LassoCV, RidgeCV, ElasticNet
from sklearn.model_selection import cross_val_score
#Implementation of LassoCV
lasso = LassoCV(alphas=[0.0001, 0.001, 0.01, 0.1, 1, 10, 100])
print("Root Mean Squared Error (Lasso): ", np.sqrt(-cross_val_score(lasso, X, y, cv=10, scoring='neg_mean_squared_error')).mean())
#Implementation of ElasticNet
elastic = ElasticNet(alpha=0.001)
print("Root Mean Squared Error (ElasticNet): ", np.sqrt(-cross_val_score(elastic, X, y, cv=10, scoring='neg_mean_squared_error')).mean())
#Implementation of RidgeCV
ridge = RidgeCV(alphas=[0.0001, 0.001, 0.01, 0.1, 1, 10, 100])
print("Root Mean Squared Error (Ridge): ", np.sqrt(-cross_val_score(ridge, X, y, cv=10, scoring='neg_mean_squared_error')).mean())
#Results
Root Mean Squared Error (Lasso):       203421.22072610114
Root Mean Squared Error (ElasticNet):  203442.40673916895
Root Mean Squared Error (Ridge):       203411.816202574
  • Как видите, лучшее, что мы можем уменьшить до 203 411, - это использовать RidgeCV. Все еще не так уж и впечатляюще. Теперь позвольте мне попробовать другой метод, известный как xgboost, и посмотреть, как он работает.
#Implementation of xgboost
import xgboost as xgb
regr = xgb.XGBRegressor(colsample_bytree=0.2, gamma=0.0, learning_rate=0.01, max_depth=4, min_child_weight=1.5, n_estimators=7200,                                                                 reg_alpha=0.9, reg_lambda=0.6, subsample=0.2, seed=42, silent=1)
regr.fit(X_train, y_train)
y_pred = regr.predict(X_test)
print("Root Mean Squared Error (Xgboost): ", np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
plt.scatter(y_test, y_pred)
plt.xlabel("Prices")
plt.ylabel("Predicted prices")
plt.title("xgboost")
#Result
Root Mean Squared Error (Xgboost):  122692.65863401273

  • И вот так! Это значительное улучшение по сравнению с нашими предыдущими моделями. Пока что xgboost оказался лучшей моделью для решения этой проблемы. xgboost - это быстрая и более надежная библиотека, которая может обеспечить высокую производительность в задачах прогнозирования. Также обратите внимание, что в зависимости от размера и характера выбранного вами набора данных производительность ваших моделей может быть намного лучше, чем то, что у меня здесь.
  • Давайте проверим, насколько хорошо наша модель работает в каждом конкретном случае, проверив первые пять прогнозов.
df = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred})
df.head()
#Result with xgboost
Actual     Predicted
297000.0   2.918043e+05
1578000.0  1.695336e+06
562100.0   5.116367e+05
631500.0   5.994548e+05
780000.0   6.963796e+05

Это намного лучше, чем линейная регрессия. Например, проверьте четвертый прогноз. Фактическая цена была 631 500, а наша модель максимально приблизилась к 599 454.

На этом мы можем завершить наш первый проект по предсказанию! Теперь вы можете напрямую использовать обученную модель для оценки стоимости реального дома, учитывая, что у вас есть все функции «X», взятые из набора данных, просто используя эту строку кода.

Predicted_price = model_name.predict(X)

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

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

Ознакомьтесь с другими статьями этой серии здесь (если вы еще не сделали этого):

  1. Прикладное машинное обучение: часть 2 (сверточные нейронные сети для распознавания изображений)
  2. Прикладное машинное обучение: часть 3 (Классификация с использованием наивного байесовского метода, линейной SVM, логистической регрессии и случайного леса)

Хлопайте и поделитесь, если вы нашли это полезным и подписались на "The Research Nest", чтобы получить более информативный контент.