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