Использование машинного обучения для прогнозирования погоды: часть 2

Эта статья является продолжением предыдущей статьи из серии из трех частей, посвященных использованию машинного обучения в Python для прогнозирования погодных температур в городе Линкольн, штат Небраска, США, на основе данных, собранных из служб API Weather Underground. В первой статье этой серии, Использование машинного обучения для прогнозирования погоды: часть 1 [/ using-machine-learning-to-pred-the-weather-part-1 /], я описал, как извлекать данные из Weather Underground. , проанализируйте его и очистите. F

Эта статья является продолжением предыдущей статьи из серии из трех частей, посвященных использованию машинного обучения в Python для прогнозирования погодных температур в городе Линкольн, штат Небраска, США, на основе данных, собранных из служб API Weather Underground.

В первой статье серии « Использование машинного обучения для прогнозирования погоды: часть 1» я описал, как извлечь данные из Weather Underground, проанализировать их и очистить. Краткое изложение тем для каждой из статей, представленных в этой серии, можно найти во введении к предыдущей статье.

Основное внимание в этой статье будет уделяться описанию процессов и шагов, необходимых для построения строгой модели линейной регрессии для прогнозирования будущих значений среднесуточной температуры на основе набора данных, созданного в предыдущей статье. Чтобы построить модель линейной регрессии, я продемонстрирую использование двух важных библиотек Python в индустрии машинного обучения: Scikit-Learn и StatsModels .

В третьей статье этой серии, Использование машинного обучения для прогнозирования погоды: часть 3 , я описываю, как процессы и шаги, необходимые для построения нейронной сети с использованием Google TensorFlow, для прогнозирования средней дневной температуры в будущем. Используя этот метод, я могу затем сравнить результаты с моделью линейной регрессии.

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

В этом репозитории GitHub вы найдете блокнот Jupyter с именем файла Weather Underground API.ipynb, который описывает пошаговые действия, необходимые для сбора набора данных, с которым мы будем работать в этой и последней статьях. Кроме того, в этом репозитории вы найдете обработанный файл Pandas DataFrame с именем end-part1_df.pkl . Итак, если вы хотите продолжить, не проходя через несколько болезненный опыт сбора, обработки и очистки данных, описанных в предыдущей статье, откройте файл pickle и используйте следующий код для десериализации данных обратно в Pandas DataFrame. для использования в этом разделе.

 import pickle 
 with open('end-part1_df.pkl', 'rb') as fp: 
 df = pickle.load(fp) 

Если вы получаете сообщение об ошибке « Нет модуля с именем pandas.indexes», это связано с тем, что вы, вероятно, используете более новую версию pandas, чем та, которую я использовал на момент написания этой статьи (v0.18.1).

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

 import pandas as pd 
 df = pd.read_csv('end-part2_df.csv').set_index('date') 

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

Линейная регрессия направлена на применение набора допущений, в первую очередь касающихся линейных отношений и численных методов для прогнозирования результата (Y, также известного как зависимая переменная) на основе одного или нескольких предикторов (независимых переменных X) с конечной целью создания модели (математической формула) для прогнозирования результатов с учетом только значений предиктора с некоторой степенью неопределенности.

Обобщенная формула модели линейной регрессии:

 ŷ = β 0 + β 1 * x 1 + β 2 * x 2 + ... + β (pn) x (pn) + Ε 

где:

  • Å· - переменная прогнозируемого результата (зависимая переменная)
  • x j - переменные-предикторы (независимые переменные) для параметров j = 1,2, ..., p-1.
  • β 0 - это β 0 Å· когда каждый x j равен нулю
  • β j - изменение Å· на основе изменения одной единицы в одном из соответствующих x j
  • Ε - случайная ошибка, связанная с разницей между прогнозируемым значением Å· i и фактическим значением y i

Последний член в уравнении линейной регрессии очень важен. Самая основная форма построения модели линейной регрессии основана на алгоритме, известном как обыкновенные наименьшие квадраты, который находит комбинацию значений β j , которые минимизируют член Ε

Выбор функций для нашей модели

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

Коэффициент корреляции Пирсона (r) - это измерение степени линейной корреляции между массивами одинаковой длины, которая выводит значение в диапазоне от -1 до 1. Значения корреляции в диапазоне от 0 до 1 представляют все более сильную положительную корреляцию. Под этим я подразумеваю, что две серии данных имеют положительную корреляцию, когда значения в одной серии данных увеличиваются одновременно со значениями в другой серии, и, когда они оба растут с одинаковой величиной, значение корреляции Пирсона приближается к 1.

Говорят, что значения корреляции от 0 до -1 имеют обратную или отрицательную корреляцию в том смысле, что, когда значения одной серии увеличиваются, соответствующие значения в противоположной серии уменьшаются, но по мере того, как изменения в величине между сериями становятся равными (с противоположным направлением) значение корреляции приблизится к -1. Значения корреляции Пирсона, которые близко расположены по обе стороны от нуля, наводят на мысль о слабой линейной зависимости, которая становится слабее по мере приближения значения к нулю.

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

Значение корреляции Интерпретация


0,8 - 1,0 Очень сильный 0,6 - 0,8 Сильный 0,4 - 0,6 Умеренный 0,2 - 0,4 Слабый 0,0 - 0,2 Очень слаб

Для оценки корреляции в этих данных я буду называть corr() метод объекта Пандас DataFrame. Прикованный к этому corr() вызов метода можно затем выбрать столбец интереса ( «meantempm») и снова приковать другой метод вызова sort_values() на полученном объекте Панды Series. Это выведет значения корреляции от наиболее отрицательно коррелированных до наиболее положительно коррелированных.

 df.corr()[['meantempm']].sort_values('meantempm') 

                    среднее время

maxpressurem_1 -0,519699 maxpressurem_2 -0,425666 maxpressurem_3 -0,408902 среднее давлениеm_1 -0,365682 среднее давлениеm_2 -0,269896 среднее давлениеm_3 -0,263008 minpressurem_1 -0.201003 minhumidity_1 -0,148602 minhumidity_2 -0,143211 minhumidity_3 -0,118564 minpressurem_2 -0,104455 minpressurem_3 -0,102955 осадка_2 0,084394 осадка_1 0,086617 осадка_3 0,098684 maxhumidity_1 0,132466 maxhumidity_2 0,151358 maxhumidity_3 0,167035 maxdewptm_3 0,829230 maxtempm_3 0,832974 mindewptm_3 0,833546 meandewptm_3 0,834251 mintempm_3 0,836340 maxdewptm_2 0,839893 meandewptm_2 0,848907 mindewptm_2 0,852760 mintempm_2 0,854320 meantempm_3 0,855662 maxtempm_2 0,863906 meantempm_2 0,881221 maxdewptm_1 0,887235 meandewptm_1 0,896681 mindewptm_1 0,899000 mintempm_1 0,905423 maxtempm_1 0,923787 meantempm_1 0,937563 mintempm 0,973122 maxtempm 0,976328 среднее время 1,000000

При выборе функций для включения в эту модель линейной регрессии я хотел бы сделать ошибку в том смысле, что буду немного менее терпимым при включении переменных с умеренными или более низкими коэффициентами корреляции. Поэтому я буду удалять функции, значения корреляции которых меньше абсолютного значения 0,6. Кроме того, поскольку переменные mintempm и maxtempm относятся к тому же дню, что и переменная прогноза «meantempm», я буду удалять и их (т. Е. Если я уже знаю минимальную и максимальную температуры, то у меня уже есть ответ на свой прогноз).

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

 predictors = ['meantempm_1', 'meantempm_2', 'meantempm_3', 
 'mintempm_1', 'mintempm_2', 'mintempm_3', 
 'meandewptm_1', 'meandewptm_2', 'meandewptm_3', 
 'maxdewptm_1', 'maxdewptm_2', 'maxdewptm_3', 
 'mindewptm_1', 'mindewptm_2', 'mindewptm_3', 
 'maxtempm_1', 'maxtempm_2', 'maxtempm_3'] 
 df2 = df[['meantempm'] + predictors] 

Визуализация отношений

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

Для этого графика я хотел бы, чтобы зависимая переменная "meantempm" была согласованной осью Y вдоль всех 18 графиков переменных-предикторов. Один из способов добиться этого - создать сетку графиков. В Pandas есть полезная функция построения графиков, называемая scatter_plot() , но я обычно использую ее только тогда, когда есть только до 5 переменных, потому что она превращает график в матрицу N x N (18 x 18 в нашем случае), которая становится трудно увидеть детали в данных. Вместо этого я создам структуру сетки с шестью строками по три столбца, чтобы не жертвовать ясностью графиков.

 import matplotlib 
 import matplotlib.pyplot as plt 
 import numpy as np 

 %matplotlib inline 
 
 # manually set the parameters of the figure to and appropriate size 
 plt.rcParams['figure.figsize'] = [16, 22] 
 
 # call subplots specifying the grid structure we desire and that 
 # the y axes should be shared 
 fig, axes = plt.subplots(nrows=6, ncols=3, sharey=True) 
 
 # Since it would be nice to loop through the features in to build this plot 
 # let us rearrange our data into a 2D array of 6 rows and 3 columns 
 arr = np.array(predictors).reshape(6, 3) 
 
 # use enumerate to loop over the arr 2D array of rows and columns 
 # and create scatter plots of each meantempm vs each feature 
 for row, col_arr in enumerate(arr): 
 for col, feature in enumerate(col_arr): 
 axes[row, col].scatter(df2[feature], df2['meantempm']) 
 if col == 0: 
 axes[row, col].set(xlabel=feature, ylabel='meantempm') 
 else: 
 axes[row, col].set(xlabel=feature) 
 plt.show() 

график разбросаmeantempm{.ezlazyload .img-responsive}

Из графиков выше видно, что все оставшиеся переменные-предикторы показывают хорошую линейную связь с переменной отклика ("meantempm"). Кроме того, стоит также отметить, что все отношения выглядят равномерно распределенными случайным образом. Под этим я подразумеваю, что существует относительно одинаковая вариация в разбросе значений, лишенная какой-либо веерной или конической формы. Равномерное случайное распределение разброса по точкам также является еще одним важным предположением линейной регрессии с использованием алгоритма обыкновенных наименьших квадратов.

Использование пошаговой регрессии для построения надежной модели

Надежная модель линейной регрессии должна использовать статистические тесты для выбора значимых, статистически значимых предикторов для включения. Чтобы выбрать статистически значимые функции, я буду использовать библиотеку statsmodels Однако, прежде чем я statsmodels я хотел бы сделать шаг назад и объяснить некоторые теоретические значения и цель использования этого подхода.

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

Формальное определение проверки гипотезы значимости β j выглядит следующим образом:

  • H 0 : β j = 0 , нулевая гипотеза утверждает, что предиктор не влияет на значение выходной переменной.
  • H a : β j ≠0 , альтернативная гипотеза состоит в том, что предиктор оказывает существенное влияние на значение переменной результата

Используя тесты вероятности для оценки вероятности того, что каждый β j является значимым, помимо простой случайной случайности при выбранном пороге Î' мы можем быть более строгими при выборе переменных для включения, что приведет к более надежной модели.

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

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

Обратное исключение работает следующим образом:

  1. Выберите уровень значимости Î' для которого вы проверяете свою гипотезу, чтобы определить, должна ли переменная оставаться в модели.
  2. Подобрать модель со всеми переменными-предикторами
  3. Оцените p-значения β j и для коэффициента с наибольшим p-значением, если p-value> Î' переходите к шагу 4, если у вас нет окончательной модели.
  4. Удалите предиктор, указанный на шаге 3
  5. Снова установите модель, но на этот раз без удаленной переменной и вернитесь к шагу 3.

Итак, без дальнейших промедлений давайте построим эту полностью загруженную обобщенную модель с использованием statsmodels выполнив описанные выше шаги.

 # import the relevant module 
 import statsmodels.api as sm 
 
 # separate our my predictor variables (X) from my outcome variable y 
 X = df2[predictors] 
 y = df2['meantempm'] 
 
 # Add a constant to the predictor variable set to represent the Bo intercept 
 X = sm.add_constant(X) 
 X.ix[:5, :5] 

           const   meantempm_1   meantempm_2   meantempm_3   mintempm_1

Дата
2015-01-04 1.0 -4,0 -6,0 -6,0 -13,0 2015-01-05 1.0 -14,0 -4,0 -6,0 -18,0 2015-01-06 1.0 -9,0 -14,0 -4,0 -14,0 2015-01-07 1.0 -10,0 -9,0 -14,0 -14,0 2015-01-08 1.0 -16,0 -10,0 -9,0 -19,0

 # (1) select a significance value 
 alpha = 0.05 
 
 # (2) Fit the model 
 model = sm.OLS(y, X).fit() 
 
 # (3) evaluate the coefficients' p-values 
 model.summary() 

summary() создаст следующие данные в вашей записной книжке Jupyter:


Деп. Переменная: среднее время R-квадрат: 0,895 Модель: OLS Прил. R-квадрат: 0,893 Метод: Наименьших квадратов F-статистика: 462,7 Дата: Чт, 16 ноя 2017 Вероятность (F-статистика): 0,00 Время: 20:55:25 Лог-вероятность: -2679,2 № Наблюдения: 997 AIC: 5396. Остатки Df: 978 БИК: 5490. Модель Df: 18
Тип ковариации: негрубый


: Результаты регрессии OLS

Â


             Coef      std err   т        P\> \| t \|   \[0,025   0,975\]

const 1,0769 0,526 2,049 0,041 0,046 2,108 meantempm_1 0,1047 0,287 0,364 0,716 -0,459 0,669 meantempm_2 0,3512 0,287 1,225 0,221 -0,211 0,914 meantempm_3 -0,1084 0,286 -0,379 0,705 -0,669 0,453 mintempm_1 0,0805 0,149 0,539 0,590 -0,213 0,373 mintempm_2 -0,2371 0,149 -1,587 0,113 -0,530 0,056 mintempm_3 0,1521 0,148 1.028 0,304 -0,138 0,443 meandewptm_1 -0,0418 0,138 -0,304 0,761 -0,312 0,228 meandewptm_2 -0,0121 0,138 -0,088 0,930 -0,282 0,258 meandewptm_3 -0,0060 0,137 -0,044 0,965 -0,275 0,263 maxdewptm_1 -0,1592 0,091 -1,756 0,079 -0,337 0,019 maxdewptm_2 -0,0113 0,091 -0,125 0,900 -0,189 0,166 maxdewptm_3 0,1326 0,089 1,492 0,136 -0,042 0,307 mindewptm_1 0,3638 0,084 4,346 0,000 0.200 0,528 mindewptm_2 -0,0119 0,088 -0,136 0,892 -0,184 0,160 mindewptm_3 -0,0239 0,086 -0,279 0,780 -0,192 0,144 maxtempm_1 0,5042 0,147 3,438 0,001 0,216 0,792 maxtempm_2 -0,2154 0,147 -1,464 0,143 -0,504 0,073 maxtempm_3 0,0809 0,146 0,555 0,579 -0,205 0,367


Â


Омнибус: 13,252 Дурбин-Ватсон: 2,015 Вероятность (Омнибус): 0,001 Ярке-Бера (Джей Би): 17.097 Перекос: -0,163 Вероятность (JB): 0,000194 Эксцесс: 3,552 Cond. Нет. 291.


Хорошо, я понимаю, что вызов функции summary() просто выводит на экран много информации. Не расстраивайтесь! В этой статье мы сосредоточимся только на 2-3 значениях:

  1. P> | t | - это p-значение, о котором я упоминал выше, которое я буду использовать для оценки проверки гипотезы. Это значение, которое мы собираемся использовать, чтобы определить, следует ли исключать переменную в этом пошаговом методе обратного исключения.
  2. R-квадрат - мера, которая указывает, какую часть общей дисперсии результата наша модель может объяснить.
  3. Прил. R-квадрат - то же самое, что R-квадрат, но для множественной линейной регрессии к этому значению применяется штраф, основанный на количестве переменных, включенных для объяснения уровня переобучения.

Это не означает, что другие значения в этом выпуске не заслуживают внимания, как раз наоборот. Однако они касаются более эзотерических особенностей линейной регрессии, в которые у нас просто нет времени сейчас разбираться. Для их полного объяснения я отсылаю вас к более продвинутому учебнику регрессии, например к « Прикладным моделям линейной регрессии» Катнера, 5-е изд.{.amazon-link} Â а также документацию statsmodels

 # (3) cont. - Identify the predictor with the greatest p-value and assess if its > our selected alpha. 
 # based off the table it is clear that meandewptm_3 has the greatest p-value and that it is 
 # greater than our alpha of 0.05 
 
 # (4) - Use pandas drop function to remove this column from X 
 X = X.drop('meandewptm_3', axis=1) 
 
 # (5) Fit the model 
 model = sm.OLS(y, X).fit() 
 
 model.summary() 

Деп. Переменная: среднее время R-квадрат: 0,895 Модель: OLS Прил. R-квадрат: 0,893 Метод: Наименьших квадратов F-статистика: 490,4 Дата: Чт, 16 ноя 2017 Вероятность (F-статистика): 0,00 Время: 20:55:41 Лог-вероятность: -2679,2 № Наблюдения: 997 AIC: 5394. Остатки Df: 979 БИК: 5483. Модель Df: 17
Тип ковариации: негрубый


: Результаты регрессии OLS

Â


             Coef      std err   т        P\> \| t \|   \[0,025   0,975\]

const 1,0771 0,525 2,051 0,041 0,046 2,108 meantempm_1 0,1040 0,287 0,363 0,717 -0,459 0,667 meantempm_2 0,3513 0,286 1,226 0,220 -0,211 0,913 meantempm_3 -0,1082 0,286 -0,379 0,705 -0,669 0,452 mintempm_1 0,0809 0,149 0,543 0,587 -0,211 0,373 mintempm_2 -0,2371 0,149 -1,588 0,113 -0,530 0,056 mintempm_3 0,1520 0,148 1.028 0,304 -0,138 0,442 meandewptm_1 -0,0419 0,137 -0,305 0,761 -0,312 0,228 meandewptm_2 -0,0121 0,138 -0,088 0,930 -0,282 0,258 maxdewptm_1 -0,1592 0,091 -1,757 0,079 -0,337 0,019 maxdewptm_2 -0,0115 0,090 -0,127 0,899 -0,189 0,166 maxdewptm_3 0,1293 0,048 2,705 0,007 0,036 0,223 mindewptm_1 0,3638 0,084 4,349 0,000 0.200 0,528 mindewptm_2 -0,0119 0,088 -0,135 0,892 -0,184 0,160 mindewptm_3 -0,0266 0,058 -0,456 0,648 -0,141 0,088 maxtempm_1 0,5046 0,146 3,448 0,001 0,217 0,792 maxtempm_2 -0,2154 0,147 -1,465 0,143 -0,504 0,073 maxtempm_3 0,0809 0,146 0,556 0,579 -0,205 0,367


Â


Омнибус: 13,254 Дурбин-Ватсон: 2,015 Вероятность (Омнибус): 0,001 Ярке-Бера (Джей Би): 17,105 Перекос: -0,163 Вероятность (JB): 0,000193 Эксцесс: 3,553 Cond. Нет. 286.


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

Ниже вы найдете результат окончательной модели, к которой я пришел после применения техники обратного исключения. Вы можете видеть из выходных данных, что все оставшиеся предикторы имеют p-значения значительно ниже нашего Î' 0,05. Еще одна вещь, заслуживающая некоторого внимания, - это значения R-квадрата в окончательном выводе. Здесь следует отметить две вещи: (1) R-квадрат и Adj. Оба значения R-квадрат равны, что говорит о минимальном риске того, что наша модель переоценена чрезмерными переменными, и (2) значение 0,894 интерпретируется так, что наша окончательная модель объясняет около 90% наблюдаемых вариаций в переменной результата. , "meantempm".

 model = sm.OLS(y, X).fit() 
 model.summary() 

Деп. Переменная: среднее время R-квадрат: 0,894 Модель: OLS Прил. R-квадрат: 0,894 Метод: Наименьших квадратов F-статистика: 1196. Дата: Чт, 16 ноя 2017 Вероятность (F-статистика): 0,00 Время: 20:55:47 Лог-вероятность: -2681,7 № Наблюдения: 997 AIC: 5379. Остатки Df: 989 БИК: 5419. Модель Df: 7
Тип ковариации: негрубый


: Результаты регрессии OLS

Â


            Coef      std err   т        P\> \| t \|   \[0,025   0,975\]

const 1,1534 0,411 2,804 0,005 0,346 1,961 mintempm_1 0,1310 0,053 2,458 0,014 0,026 0,236 mintempm_2 -0,0964 0,037 -2,620 0,009 -0,169 -0,024 mintempm_3 0,0886 0,041 2,183 0,029 0,009 0,168 maxdewptm_1 -0,1939 0,047 -4,117 0,000 -0,286 -0,101 maxdewptm_3 0,1269 0,040 3,191 0,001 0,049 0,205 mindewptm_1 0,3352 0,051 6,605 0,000 0,236 0,435 maxtempm_1 0,5506 0,024 22,507 0,000 0,503 0,599


Â


Омнибус: 13,123 Дурбин-Ватсон: 1,969 Вероятность (Омнибус): 0,001 Ярке-Бера (Джей Би): 16,871 Перекос: -0,163 Вероятность (JB): 0,000217 Эксцесс: 3,548 Cond. Нет. 134.


Использование модуля SciKit-Learn LinearRegression для прогнозирования погоды

Теперь, когда мы выполнили шаги по выбору статистически значимых предикторов (функций), мы можем использовать SciKit-Learn для создания модели прогнозирования и проверки ее способности прогнозировать среднюю температуру. SciKit-Learn - это хорошо зарекомендовавшая себя библиотека машинного обучения, которая широко используется как в промышленности, так и в академических кругах. Одна вещь, которая очень впечатляет в SciKit-Learn, заключается в том, что он поддерживает очень последовательный API «подгонки», «прогнозирования» и «тестирования» для многих численных методов и алгоритмов, что делает его использование очень простым. В дополнение к этому согласованному дизайну API SciKit-Learn также поставляется с несколькими полезными инструментами для обработки данных, общих для многих проектов машинного обучения.

Мы начнем с использования SciKit-Learn, чтобы разделить наш набор данных на наборы для тестирования и обучения, импортировав train_test_split() из модуля sklearn.model_selection Я разделю наборы данных для обучения и тестирования на 80% для обучения и 20% для тестирования и random_state 12, чтобы гарантировать, что вы получите такой же случайный выбор данных, как и я. Этот random_state очень полезен для воспроизводимости результатов.

 from sklearn.model_selection import train_test_split 

 # first remove the const column because unlike statsmodels, SciKit-Learn will add that in for us 
 X = X.drop('const', axis=1) 
 
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=12) 

Следующее действие, которое необходимо предпринять, - построить регрессионную модель с использованием обучающего набора данных. Для этого я импортирую и использую класс LinearRegression из модуля sklearn.linear_model Как упоминалось ранее, scikit-learn набирает основные баллы за удобство использования за счет реализации общего fit() и predict() в своих многочисленных численных методах, что делает использование библиотеки очень удобным для пользователя.

 from sklearn.linear_model import LinearRegression 

 # instantiate the regressor class 
 regressor = LinearRegression() 
 
 # fit the build the model by fitting the regressor to the training data 
 regressor.fit(X_train, y_train) 
 
 # make a prediction set using the test set 
 prediction = regressor.predict(X_test) 
 
 # Evaluate the prediction accuracy of the model 
 from sklearn.metrics import mean_absolute_error, median_absolute_error 
 print("The Explained Variance: %.2f" % regressor.score(X_test, y_test)) 
 print("The Mean Absolute Error: %.2f degrees celsius" % mean_absolute_error(y_test, prediction)) 
 print("The Median Absolute Error: %.2f degrees celsius" % median_absolute_error(y_test, prediction)) 

 The Explained Variance: 0.90 
 The Mean Absolute Error: 2.69 degrees celsius 
 The Median Absolute Error: 2.17 degrees celsius 

Как вы можете видеть в нескольких строках кода выше, использовать scikit-learn для построения модели прогнозирования линейной регрессии довольно просто. Именно здесь библиотека проявляет себя в своей способности легко подбирать модель и делать прогнозы относительно интересующего результата.

Чтобы получить интерпретативное понимание валидности модели, я использовал score() модели регрессора, чтобы определить, что модель способна объяснить около 90% дисперсии, наблюдаемой в переменной результата, средней температуре. Кроме того, я использовал mean_absolute_error() и median_absolute_error() sklearn.metrics чтобы определить, что в среднем прогнозируемое значение отклоняется примерно на 3 градуса Цельсия, а в половине случаев - примерно на 2 градуса Цельсия.

Ресурсы

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

Заключение

В этой статье я продемонстрировал, как использовать алгоритм машинного обучения линейной регрессии для прогнозирования будущих средних погодных температур на основе данных, собранных в предыдущей статье . Я продемонстрировал, как использовать statsmodels для выбора статистически значимых предикторов на основе надежных статистических методов. Затем я использовал эту информацию , чтобы соответствовать модели прогнозирования на основе от обучения с использованием подмножества Scikit-Learn - х LinearRegression класса. Используя эту подобранную модель, я мог затем предсказать ожидаемые значения на основе входных данных от тестового подмножества и оценить точность прогноза, которая указывает на разумную степень точности.

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

comments powered by Disqus