Автор оригинала: 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 значим за пределами простой случайной случайности при выбранном пороге Α
, мы можем быть более строгими в выборе переменных для включения, что приведет к более надежной модели.
Однако во многих наборах данных могут происходить взаимодействия между переменными, которые могут привести к ложным интерпретациям этих простых тестов гипотез. Для проверки влияния взаимодействий на значимость какой-либо одной переменной в модели линейной регрессии часто применяется метод, известный как пошаговая регрессия. Используя пошаговую регрессию, вы добавляете или удаляете переменные из модели и оцениваете статистическую значимость каждой переменной в результирующей модели.
В этой статье я буду использовать метод, известный как обратное исключение , где я начну с полностью загруженной общей модели, которая включает в себя все интересующие меня переменные.
Обратное устранение работает следующим образом:
- Выберите уровень значимости
Α
, для которого вы проверяете свою гипотезу, чтобы определить, должна ли переменная оставаться в модели - Подгонка модели со всеми предикторными переменными
- Оцените p-значения коэффициентов
β
j и для того, у кого наибольшее p-значение, если p-значение >Α
переходите к шагу 4, если у вас нет окончательной модели - Удалите предиктор, указанный на шаге 3
- Установите модель снова, но на этот раз без удаленной переменной, и вернитесь к шагу 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 значениях:
- P>|t| – это p-значение, о котором я упоминал выше, которое я буду использовать для оценки теста гипотезы. Это значение мы будем использовать, чтобы определить, следует ли исключать переменную в этом методе пошагового обратного исключения.
- R-квадрат – мера, указывающая, какую часть общей дисперсии результата может объяснить наша модель
- 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
. Используя эту подобранную модель, я мог бы затем предсказать ожидаемые значения на основе входных данных из тестового подмножества и оценить точность предсказания, что указывает на разумную степень точности.
Я хотел бы поблагодарить вас за чтение моей статьи и надеюсь, что вы с нетерпением ждете предстоящей заключительной статьи в этой серии машинного обучения, где я опишу, как построить нейронную сеть для прогнозирования температуры погоды.