Зависит ли количество подтвержденных случаев COVID от тестирования?

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

Концепция

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

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

Регрессия: вывод - это непрерывная переменная.
Классификация: вывод - это категориальная переменная.
Кластеризация: без вывода.

Регрессия и классификация относятся к обучению с учителем, а кластеризация - к обучению без учителя.

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

Линейная регрессия (LR)

По самому термину вы можете догадаться, что модель функционирует по прямой линии, где y можно вычислить из линейной комбинации входных переменных x. Функцию гипотезы линейной регрессии можно сформулировать как:

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

Метод с одной входной и выходной переменной называется простой линейной регрессией, а с несколькими входами / функциями - множественной линейной регрессией. Для обоих наша цель - найти наиболее подходящую линию, которая минимизирует сумму квадратов ошибок (SSE) или среднеквадратичную ошибку (MSE) между нашей целевой переменной (y) и нашим прогнозируемым результатом для всех выборок.

Чтобы продолжить, нам нужно найти параметры / коэффициенты для этой наиболее подходящей линии. Существуют различные методы для получения геометрического уравнения для прямой, такие как наименьшие абсолютные отклонения (минимизация суммы абсолютных значений невязок) и оценка Тейла – Сена (которая находит линию, наклон которой является средним углом наклона, определяемым парами точек выборки), однако статистики обычно используют метод наименьших квадратов (OLS). OLS - это не что иное, как метод минимизации расстояний между линией и фактическими выходами. Если вы хотите рассчитать линию регрессии вручную, она использует немного пугающую формулу, чтобы найти наклон ‘θ1’ и точку пересечения линии ‘θ0’.

Существует 2 подхода / решения, которые используют метод наименьших квадратов для реализации модели линейной регрессии:

  • Решение в закрытой форме - нормальное уравнение
  • Алгоритм оптимизации (градиентный спуск, метод Ньютона и т. Д.)

Нормальное уравнение

Важно понимать, что θ может сломать или разрушить модель. Наша цель состоит в том, чтобы в основном искать θ, который помогает достичь наименьшей стоимости модели.

Выбор функции цели / стоимости J (θ) может сильно варьироваться в зависимости от решаемой задачи. В общем, среднеквадратичная ошибка лучше всего подходит для регрессии, а перекрестная энтропия - для классификации. Итак, возвращаясь к нормальному уравнению, он использует аналитический подход для нахождения параметров уравнения. Мне потребовалось некоторое время, чтобы понять, почему все происходит так, как есть. Надеюсь, это краткое доказательство поможет вам понять ваши концепции.

Если мы возьмем вектор остатка как e = Xθ - y, то функция стоимости / сумма квадратов остатков в векторной форме будет:

Для тех, кто плохо знаком с линейной алгеброй, обратите внимание, что мы не можем просто возвести в квадрат Xθ - y. Свойство умножения вектора утверждает, что квадрат вектора / матрицы не равен квадрату каждого из его значений. Итак, чтобы получить значение в квадрате, мы умножаем вектор на его транспонирование.

Теперь, чтобы найти θ, которое минимизирует сумму квадратов остатков, нам нужно взять производную функции стоимости, указанной выше, по θ.

Это все, что предлагает нормальное уравнение. Очень прямой и элегантный подход к нахождению точных параметров θ, которые творит чудеса, чтобы соответствовать вашим данным! Однако здесь есть одна загвоздка. Матричная обратная функция не будет работать с большими наборами данных (большое значение X) или наборами данных, где обратная функция может не существовать (матрица необратима или сингулярна). Даже самый эффективный обратный алгоритм, который существует сегодня, дает нам кубическую временную сложность. Решение нормального уравнения может быть предпочтительным для «меньших» наборов данных - если вычисление «дорогостоящей» обратной матрицы не является проблемой, но для реальных наборов данных предпочтительны такие подходы, как градиентный спуск или SGD.

Градиентный спуск

Цель здесь аналогична той, что была у нас для нормального уравнения. Алгоритм градиентного спуска вычисляет функцию минимальных затрат, применяя различные параметры для тета 0 и тета 1, пока он не достигнет сходимости. Считается одним из лучших алгоритмов итеративной оптимизации для минимизации остаточных ошибок.

Интуиция

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

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

Это очень простой процесс. Процедура GD начинается с инициализации некоторых случайных значений θ. Мы рассчитываем стоимость, подставляя эти значения в функцию стоимости. Производная функции стоимости даст нам наклон в этой точке, чтобы мы знали, в каком направлении двигаться дальше, чтобы получить дальнейшие более низкие затраты. Как это случилось? Мы используем это производное значение для обновления всех коэффициентов θ на каждом шаге, пока мы не достигнем самого низкого уровня и больше не будет снижения затрат. ПРОСТО! Не правда ли?

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

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

При пробе различных значений eta η следует помнить о нескольких вещах. Если скорость обучения слишком низкая, для достижения оптимального значения может потребоваться неопределенное время. Однако, если держать его высоко, он может подпрыгнуть на другую сторону и бесконечно долго колебаться. Итак, η следует хранить где-то посередине. Чтобы найти хорошую скорость обучения, мы можем применить поиск по сетке. Таким образом, мы пытаемся протестировать различные значения η, сохраняя ограничение на количество итераций. Тот, который сходится быстрее, будет хорошей скоростью изучения проблемы. Этот метод называется Пакетный градиентный спуск, поскольку он выполняет вычисления по всему обучающему набору X.

Есть еще два типа градиентного спуска без особой разницы:

Стохастический градиентный спуск

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

Тем не менее, этот алгоритм не используется регулярно, так как он принимает экземпляры случайным образом, что заставляет функцию стоимости многократно переходить от высокого к низкому уровню. Даже если он приближается к оптимальному, он будет продолжать подпрыгивать. Кроме того, он часто выбирает экземпляры более одного раза, поэтому рекомендуется продолжать перемешивать данные.
СОВЕТ:
Итак, лучше сначала иметь более высокую скорость обучения, а затем уменьшайте это медленно.

Мини-пакетный градиентный спуск

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

РЕЗЮМЕ

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

Пакетный градиентный спуск займет больше времени с большими наборами данных. Stochastic и Mini Batch достигли бы минимума быстрее, если бы мы знали, как изменить скорость обучения.

Пример модели линейной регрессии - COVID

Давайте сначала пройдемся по набору данных Чикаго о COVID-19. Вы можете скачать набор данных здесь.

80% наборов данных COVID, доступных в Интернете, представлены в формате временных рядов, отображающих количество случаев на ежедневной основе. Итак, имея только количество смертей и тестов, я мог только визуализировать, достиг ли пик, или он все еще растет, и так далее. Но для прогнозирования я хотел иметь функции, от которых может зависеть количество обращений. Мы также знаем, что во многих странах проводится неадекватное тестирование, что свидетельствует о меньшем количестве случаев. Таким образом, я сосредоточился на наборах данных, где я могу получить тесты и особенности кейсов, чтобы выяснить, существует ли огромная корреляция между ними.

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

Как видите, здесь независимой переменной является Тесты (x), а зависимой - Случаи (y). У нас есть еще несколько функций в наборе данных, дающих подсчет людей старше 30 лет и младше, а также тех, кто говорит на латыни, и т. Д. Я лично не мог понять, что мы могли бы проанализировать с помощью таких функций. Вы можете попробовать дать ему шанс и сообщить мне, если мы сможем что-нибудь сделать.

Приступим к кодированию :)

  • Импортируйте все необходимые библиотеки
    - pandas & numPy для выполнения научных операций
    - Линейная регрессия и полиномиальные функции для построения моделей
    - train_test_split для разделения набора данных на поезд и тестовые подмножества
    - метрики MSE и r2_score для анализа производительности модели
    - seaborn и pyplot для визуализации графиков
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score
import seaborn as sns
import matplotlib.pyplot as plt
  • Импортируйте набор данных CSV с помощью pandas. Он выводит фрейм данных, двумерную структуру данных.
    data.head () отображает 5 верхних строк в наборе данных. чтобы дать нам представление о том, содержит ли объект данные нужного типа.
data = pd.read_csv("COVID-19_Daily_Testing.csv")
data.head()
  • Чтобы получить краткое резюме набора данных.
    Info () метод печатает информацию о DataFrame, такую ​​как тип данных индекса и типы данных столбца, ненулевые значения и использование памяти.
print(data.info())
  • Пришло время для очистки данных!
    Количество случаев и тестов в строковом формате, из-за чего у нас есть запятая в тысячах значений (например, 1,468)
    pd.to_numeric () преобразует тип из строки в int32.
data['Cases'] = data['Cases'].str.replace(',', '')
data['Tests'] = data['Tests'].str.replace(',', '')
data['Cases'] = pd.to_numeric(data['Cases'])     
data['Tests'] = pd.to_numeric(data['Tests'])
  • Часто в реальных наборах данных есть много функций, и трудно проверить, какая пара функций показывает хорошую корреляцию. Кроме того, чтобы проверить, есть ли проблема с полилинейностью. Приведенный ниже код в основном отображает парные отношения в наборе данных, так что каждая переменная будет совместно использоваться как по оси x, так и по оси y.
data_numeric = data.select_dtypes(include=['float64', 'int64'])
plt.figure(figsize=(20, 10))
sns.pairplot(data_numeric)
plt.show()

Практически все они показывают линейный узор, которого не должно быть! Это приводит к известной проблеме полилинейности.

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

Для диагностики мультиколлинеарности , мы используем показатель, называемый коэффициент инфляции дисперсии (VIF). Коэффициенты инфляции дисперсии (VIF) измеряют, насколько раздувается дисперсия оцененных коэффициентов регрессии по сравнению с тем, когда переменные-предикторы не связаны линейно. Практическое правило: если у нас есть VIF ›10, модель имеет высокую полилинейность.

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

  • Масштабирование набора данных
    Значения функций могут иметь разные масштабы. Поэтому всегда рекомендуется преобразовывать их в одном масштабе для лучшего анализа и прогнозирования.
X = data['Tests'].values.reshape(-1,1)
y = data['Cases'].values.reshape(-1,1)
  • Применение линейной регрессии
reg = LinearRegression()
reg.fit(X, y)
predictions = reg.predict(X)
print("The linear model is: Y = {:.5} + {:.5}X".format(reg.intercept_[0], reg.coef_[0][0]))
plt.figure(figsize=(16, 8))
plt.scatter(
    X,
    y,
    c='black'
)
plt.plot(
    X,
    predictions,
    c='blue',
    linewidth=2
)
plt.xlabel("Tests")
plt.ylabel("Cases")
plt.show()

Получаем эту линейную линию Y = 97,777 + 0,18572X.

Среднеквадратичная ошибка для линейной регрессии = ›171,8

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

Полиномиальная регрессия

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

poly = PolynomialFeatures(degree =4) 
X_poly = poly.fit_transform(X) 
  
poly.fit(X_poly, y) 
lin2 = LinearRegression() 
lin2.fit(X_poly, y) 
pred = lin2.predict(X_poly)
new_X, new_y = zip(*sorted(zip(X, pred)))
plt.figure(figsize=(16, 8))
plt.scatter(
    X,
    y,
    c='black'
)
plt.plot(
    new_X, new_y,
    c='blue'
)
plt.xlabel("Tests")
plt.ylabel("Cases")
plt.show()

Класс Scikit learn PolynomialFeatures состоит из параметра степени, который мы можем добавить как максимальную мощность, применяемую к данным. Вам нужно попробовать и проверить, какие степени минимизируют RMSE в наибольшей степени. Попробовав разные значения степени, я обнаружил, что степень 4 дает мне лучшее решение.

Среднеквадратичная ошибка для полиномиальной регрессии = ›131,08.
Обратите внимание, насколько этот график идеально соответствует данным, по крайней мере, лучше, чем линейная регрессия. Кроме того, RMSE значительно снизился, что является еще одним доказательством его достоинства. Существует гораздо больше концепций, необходимых для получения производительности модели, например, переоснащение или неполное соответствие, компромисс смещения / дисперсии. Мы обязательно расскажем об этом в следующем блоге!

Метрики оценки

RMSE, равное 0, означает, что ваша модель является идеальным предсказателем результатов (но этого почти никогда не произойдет).

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

Еще одна имеющаяся у нас метрика - R в квадрате (R2), которая дает относительную меру общей процедуры подбора модели для линии регрессии, используемой для прогнозирования. Его значение находится в диапазоне от 0 до 1. Чем выше значение, тем лучше модель. R² можно представить как процент отклонения, объясняемый моделью. У него есть лучшая версия под названием Скорректированный R в квадрате, которая даже учитывает, добавлены или удалены функции. R в квадрате либо остается постоянным при изменениях, либо увеличивается. Скорректированный R Squared принимает во внимание изменения, поэтому этот показатель более надежен, когда у вас есть много функций, с которыми можно поэкспериментировать.

На этом пока все.

Надеюсь, вы хорошо разбираетесь в том, как найти идеально подобранную линию в реальном мире! Регресс случается везде, пора это замечать! Если у вас есть какие-либо вопросы / мысли, не стесняйтесь оставлять свои отзывы в разделе комментариев ниже или вы можете связаться со мной в Linkedin. А пока ждите следующего поста! : D

использованная литература