Предсказание погоды с помощью машинного обучения (часть 2)

машинное обучение Python
Предсказание погоды с помощью машинного обучения (часть 2)

Обзор

В этой статье мы продолжаем предыдущую статью и используем данные, полученные с веб-сайта Weather Underground, чтобы продолжить изучение использования методов машинного обучения для прогнозирования погоды в Линкольне, штат Небраска.В предыдущей статье мы обсудили, как собирать, организовать, очистить данные. В этой статье мы будем использовать данные, обработанные в предыдущей статье, для построения модели линейной регрессии для прогнозирования погоды. Чтобы построить модель линейной регрессии, я буду использовать две очень важные библиотеки, связанные с машинным обучением в Python: Scikit-Learn и StatsModels.   В третьей статье мы будем использовать Google TensorFlow для построения модели нейронной сети и сравнения прогнозируемых результатов с результатами модели линейной регрессии.   В этой статье будет много математических понятий и терминов.Если вам трудно их понять, рекомендуется поискать в Google понятия, связанные с данными, чтобы иметь общее представление.

получить данные

на этоРепозиторий на гитхабе, есть файл Jupyter Notebook с именем Underground API.ipynb, в этом файле записаны этапы сбора и сортировки данных, которые мы будем использовать в этой и следующей статьях. Вы также найдете файл с именем end-part1_df.pkl. Если вы не обрабатывали данные самостоятельно, вы можете использовать этот файл напрямую, а затем использовать следующий код для преобразования данных в тип Pandas DataFrame.

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

Если вы запустите приведенный выше код и обнаружите ошибку:No module named 'pandas.indexes', то используемая вами версия библиотеки pandas несовместима с моей (v0.18.1).Чтобы избежать таких ошибок, я также подготовил файл csv, который вы можете получить из приведенного выше репозитория Github, а затем используйте следующее код для чтения входных данных.

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

Алгоритм линейной регрессии

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

ŷ = β0 + β1 * x1 + β2 * x2 + ... + β(p-n) x(p-n) + Ε

Подробное объяснение формулы см.Энциклопедия Baidu - Модель линейной регрессии

Выберите данные объекта для модели

Ключевое предположение, требуемое методом    линейной регрессии, заключается в том, что существует линейная связь между зависимой переменной и каждой независимой переменной. Для наших данных, то есть температуры и других переменных, рассчитайте коэффициент корреляции Пирсона. Коэффициент корреляции Пирсона (r) — это мера величины линейной корреляции между массивами равной длины выходных значений в диапазоне от -1 до 1. Значения корреляции от 0 до 1 указывают на все более сильные положительные корреляции. Это означает, что когда значения в одном ряду данных увеличиваются одновременно со значениями в другом, два ряда данных имеют положительную корреляцию, и поскольку они оба возрастают на все более равную величину, значение корреляции Пирсона будет подход 1. Значения корреляции от 0 до -1 считаются обратными или отрицательно коррелированными, так как при увеличении значения одного ряда на соответствующее значение противоположного ряда уменьшается, а при одинаковой величине изменения между рядами (в противоположных направлениях ), Значение корреляции будет близко к -1. Значения корреляции Пирсона, которые плотно охватывают ноль, подразумевают слабую линейную зависимость, которая становится слабее по мере приближения значения к нулю.   Среди статистиков и статистических книг существуют разные мнения об определении силы коэффициента корреляции. Тем не менее, я нашел общепринятый набор классификаций силы ассоциации следующим образом:Чтобы оценить корреляции в этих данных, я позвоню Pandas Метод corr() объекта DataFrame. Вызовом функции corr() я могу выбрать интересующие меня данные (meantempm), а затем вызвать функцию sort_values() для возвращаемого результата (объект Pandas Series), которая выведет корреляцию из самых отрицательных до наиболее положительного значения корреляции.

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

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

import matplotlib  
import matplotlib.pyplot as plt  
import numpy as np
# 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, я хотел бы изложить некоторые теоретические последствия и цели использования этого подхода.   Ключевым аспектом использования статистических методов, таких как линейная регрессия, в аналитическом проекте является создание и проверка тестов гипотез для проверки значимости предположений об изучаемых данных. Существует множество тестов гипотез, разработанных для проверки устойчивости моделей линейной регрессии к различным предположениям. Одним из таких тестов гипотез является оценка значимости каждого включенного предиктора. Формальное определение проверки гипотезы о значимости параметра   βj выглядит следующим образом:

  • H0: βj = 0, нулевая гипотеза указывает на то, что переменная-предиктор не влияет на значение переменной-результата.
  • Ha: βj ≠ 0, необязательная гипотеза состоит в том, что переменная-предиктор оказывает значительное влияние на значение переменной-результата.

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

Рабочий процесс обратного устранения    выглядит следующим образом:

  • Выбор важного этапа А может определить, могут ли данные пройти строительный тест.
  • Заполните модель данными прогноза
  • Оценить p-значение коэффициента βj и p-значение с наибольшим 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]  

# (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() выглядит следующим образом:

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

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

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

Это не значит, что другие значения в этом выводе бесполезны, наоборот, они включают в себя более эзотерические качества линейной регрессии, которые у нас просто нет времени сейчас рассматривать. Для их полного объяснения я обращусь к учебникам по продвинутой регрессии,Как прикладные модели линейной регрессии Катнера, пятое издание. и файл 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()  

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

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

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

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

   Мы начнем разбивать наш набор данных на тестовый и обучающий наборы, импортировав функцию train_test_split() из модуля sklearn.model_selection с помощью SciKit-Learn. Я разделю наборы обучающих и тестовых данных на 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 для выбора статистически значимых предикторов на основе надежных статистических методов. Затем я использую эту информацию, чтобы подобрать прогностическую модель, основанную на обучающем подмножестве класса LinearRegression Scikit-Learn. Затем, используя эту подобранную модель, я могу предсказать ожидаемое значение на основе входных данных тестового подмножества и оценить точность предсказания.

Статьи по Теме