Рубрики
Без рубрики

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

Автор оригинала: Adam McQuistan.

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

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

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

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

Знакомство с набором данных

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

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 * x1 + β2 * x2 + ... + β(p-n) x(p-n) + Ε
    

где:

  • ŷ – прогнозируемая переменная результата (зависимая переменная)
  • x j – предикторные переменные (независимые переменные) для параметров, 2,…, p-1
  • β 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() объекта Pandas DataFrame. Прикованный к этому вызову метода core() я могу затем выбрать интересующий столбец (“meantempm”) и снова приковать другой вызов метода sort_values() к результирующему объекту серии Pandas. Это выведет значения корреляции от наиболее отрицательно коррелированных до наиболее положительно коррелированных.

df.corr()[['meantempm']].sort_values('meantempm')
-0.519699 максимальное давление_1
-0.425666 максимальное давление_2
-0.408902 максимальное давление_3
-0.365682 среднее давление m_1
-0.269896 среднее давление m_2
-0.263008 среднее давление m_3
-0.201003 минимальное давление_1
-0.148602 min humidity_1
-0.143211 min humidity_2
-0.118564 min humidity_3
-0.104455 минимальное давление_2
-0.102955 минимальное давление_3
0.084394 precip_2
0.086617 precip_1
0.098684 precip_3
0.132466 max humidity_1
0.151358 max humidity_2
0.167035 max humidity_3
0.829230 maxdepth_3
0.832974 макс. темп_3
0.833546 mindewptm_3
0.834251 meandewptm_3
0.836340 min temp_3
0.839893 maxdepth_2
0.848907 meandewptm_2
0.852760 mindepth_2
0.854320 min temp_2
0.855662 среднее значение temp_3
0.863906 макс. темп_2
0.881221 среднее значение temp_2
0.887235 maxdepth_1
0.896681 meandewptm_1
0.899000 mindepth_1
0.905423 min temp_1
0.923787 макс. темп_1
0.937563 среднее значение temp_1
0.973122 минтемп
0.976328 maxtemp
1.000000 средняя температура

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

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

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]

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

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

Для этого графика я хотел бы, чтобы зависимая переменная “meantempm” была согласованной осью y вдоль всех 18 графиков предикторных переменных. Один из способов сделать это-создать сетку графиков. Панды действительно поставляются с полезной функцией построения графиков , называемой 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”). Кроме того, стоит также отметить, что все отношения выглядят равномерно случайным образом распределенными. Под этим я подразумеваю, что, по-видимому, существует относительно равное изменение в разбросе значений, лишенных какой-либо веерной или конусообразной формы. Равномерное случайное распределение разброса по точкам также является еще одним важным предположением линейной регрессии с использованием алгоритма Обычных наименьших квадратов .

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

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

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

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

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

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

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

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

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

  1. Выберите уровень значимости Α , для которого вы проверяете свою гипотезу, чтобы определить, должна ли переменная оставаться в модели
  2. Подгонка модели со всеми предикторными переменными
  3. Оцените p-значения коэффициентов β j и для того, у кого наибольшее p-значение, если p-значение > Α переходите к шагу 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]
2015-01-04 1.0 -13.0 -4.0 -6.0 -6.0
2015-01-05 1.0 -18.0 -14.0 -4.0 -6.0
2015-01-06 1.0 -14.0 -9.0 -14.0 -4.0
2015-01-07 1.0 -14.0 -10.0 -9.0 -14.0
2015-01-08 1.0 -19.0 -16.0 -10.0 -9.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() вызовет следующие данные в вашем блокноте Jupiter:

Dep. Переменная: средняя температура R-квадрат: 0.895
Модель: OLS Adj. R-квадрат: 0.893
Метод: Наименьшие квадраты F-статистика: 462.7
Дата: Чт, 16 ноября 2017 г. Prob (F-статистика): 0.00
Время: 20:55:25 Логарифмическая вероятность: -2679.2
Нет. : 997 AIC: 5396.
Остатки Df: 978 БИК: 5490.
Модель Df: 18
Тип ковариации: не робастный

коэф stderr t P>|t| [0.025 0.975]
const 1.0769 0.526 2.049 0.041 0.046 2.108
среднее значение temp_1 0.1047 0.287 0.364 0.716 -0.459 0.669
среднее значение temp_2 0.3512 0.287 1.225 0.221 -0.211 0.914
среднее значение temp_3 -0.1084 0.286 -0.379 0.705 -0.669 0.453
min temp_1 0.0805 0.149 0.539 0.590 -0.213 0.373
min temp_2 -0.2371 0.149 -1.587 0.113 -0.530 0.056
min temp_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
maxdepth_1 -0.1592 0.091 -1.756 0.079 -0.337 0.019
maxdepth_2 -0.0113 0.091 -0.125 0.900 -0.189 0.166
maxdepth_3 0.1326 0.089 1.492 0.136 -0.042 0.307
mindepth_1 0.3638 0.084 4.346 0.000 0.200 0.528
mindepth_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
макс. темп_1 0.5042 0.147 3.438 0.001 0.216 0.792
макс. темп_2 -0.2154 0.147 -1.464 0.143 -0.504 0.073
макс. темп_3 0.0809 0.146 0.555 0.579 -0.205 0.367

Омнибус: 13.252 Дурбин-Уотсон: 2.015000
Prob(Омнибус): 0.001 Jarque-Bera (JB): 17.097000
Скос: -0.163 Prob(JB): 0.000194
Эксцесс: 3.552 Конд. Нет. 291.000000

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

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

Это не означает, что другие значения в этом выводе не имеют достоинств, совсем наоборот. Однако они затрагивают более эзотерические особенности линейной регрессии, на которые у нас просто нет времени. Для полного объяснения их я отсылаю вас к продвинутому учебнику регрессии, такому как Kutner Applied Linear Regression Models, 5th Ed. а также 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()
Dep. Переменная: средняя температура R-квадрат: 0.895
Модель: OLS Adj. R-квадрат: 0.893
Метод: Наименьшие квадраты F-статистика: 490.4
Дата: Чт, 16 ноября 2017 г. Prob (F-статистика): 0.00
Время: 20:55:41 Логарифмическая вероятность: -2679.2
Нет. : 997 AIC: 5394.
Остатки Df: 979 БИК: 5483.
Модель Df: 17
Тип ковариации: не робастный

коэф stderr t P>|t| [0.025 0.975]
const 1.0771 0.525 2.051 0.041 0.046 2.108
среднее значение temp_1 0.1040 0.287 0.363 0.717 -0.459 0.667
среднее значение temp_2 0.3513 0.286 1.226 0.220 -0.211 0.913
среднее значение temp_3 -0.1082 0.286 -0.379 0.705 -0.669 0.452
min temp_1 0.0809 0.149 0.543 0.587 -0.211 0.373
min temp_2 -0.2371 0.149 -1.588 0.113 -0.530 0.056
min temp_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
maxdepth_1 -0.1592 0.091 -1.757 0.079 -0.337 0.019
maxdepth_2 -0.0115 0.090 -0.127 0.899 -0.189 0.166
maxdepth_3 0.1293 0.048 2.705 0.007 0.036 0.223
mindepth_1 0.3638 0.084 4.349 0.000 0.200 0.528
mindepth_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
макс. темп_1 0.5046 0.146 3.448 0.001 0.217 0.792
макс. темп_2 -0.2154 0.147 -1.465 0.143 -0.504 0.073
макс. темп_3 0.0809 0.146 0.556 0.579 -0.205 0.367

Омнибус: 13.254 Дурбин-Уотсон: 2.015000
Prob(Омнибус): 0.001 Jarque-Bera (JB): 17.105000
Скос: -0.163 Prob(JB): 0.000193
Эксцесс: 3.553 Конд. Нет. 286.000000

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

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

model = sm.OLS(y, X).fit()
model.summary()
Dep. Переменная: средняя температура R-квадрат: 0.894
Модель: OLS Adj. R-квадрат: 0.894
Метод: Наименьшие квадраты F-статистика: 1196.
Дата: Чт, 16 ноября 2017 г. Prob (F-статистика): 0.00
Время: 20:55:47 Логарифмическая вероятность: -2681.7
Нет. : 997 AIC: 5379.
Остатки Df: 989 БИК: 5419.
Модель Df: 7
Тип ковариации: не робастный

коэф stderr t P>|t| [0.025 0.975]
const 1.1534 0.411 2.804 0.005 0.346 1.961
min temp_1 0.1310 0.053 2.458 0.014 0.026 0.236
min temp_2 -0.0964 0.037 -2.620 0.009 -0.169 -0.024
min temp_3 0.0886 0.041 2.183 0.029 0.009 0.168
maxdepth_1 -0.1939 0.047 -4.117 0.000 -0.286 -0.101
maxdepth_3 0.1269 0.040 3.191 0.001 0.049 0.205
mindepth_1 0.3352 0.051 6.605 0.000 0.236 0.435
макс. темп_1 0.5506 0.024 22.507 0.000 0.503 0.599

Омнибус: 13.123 Дурбин-Уотсон: 1.969000
Prob(Омнибус): 0.001 Jarque-Bera (JB): 16.871000
Скос: -0.163 Prob(JB): 0.000217
Эксцесс: 3.548 Конд. Нет. 134.000000

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

Теперь, когда мы прошли через этапы выбора статистически значимых предикторов (признаков), мы можем использовать 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 набирает основные бонусные баллы юзабилити, реализуя общий API 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 . Используя эту подобранную модель, я мог бы затем предсказать ожидаемые значения на основе входных данных из тестового подмножества и оценить точность предсказания, что указывает на разумную степень точности.

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