Простое исследование того, как проверить статистическую точность регрессионной модели.

Модели регрессии очень полезны и широко используются в машинном обучении. Однако при оценке качества обученной модели у них могут возникнуть некоторые проблемы. Хотя у классификационных моделей есть некоторые стандартные инструменты, которые можно использовать для оценки их эффективности (например, площадь под кривой ROC, матрица путаницы, оценка F-1 и т. Д.), Эффективность регрессионных моделей можно измерить во многих различные пути. В этой статье я покажу вам некоторые методы, которые я использовал в своей работе в качестве специалиста по данным.

Пример в R

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

Сначала мы загрузим набор данных радужной оболочки и разделим его на обучение и задержку.

data(iris)
set.seed(1)
training_idx = sample(1:nrow(iris),nrow(iris)*0.8,replace=FALSE)
holdout_idx = setdiff(1:nrow(iris),training_idx)
training = iris[training_idx,]
holdout = iris[holdout_idx,]

Затем мы можем выполнить простую линейную регрессию, чтобы описать переменную Sepal.Length как линейную функцию других. Это модель, которую мы хотим проверить.

m = lm(Sepal.Length ~ .,training)

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

training_res = training$Sepal.Length - predict(m,training)
holdout_res = holdout$Sepal.Length - predict(m,holdout)

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

А теперь проведем статистические проверки.

t-тест

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

t.test(holdout_res,mu=0)

Как мы видим, p-значение больше 5%, поэтому мы не можем отклонить нулевую гипотезу и можем сказать, что среднее значение удерживаемых остатков статистически похоже на 0.

Затем мы можем проверить, имеют ли остаточные остатки такое же среднее, что и обучающие. Это называется t-тест Велча.

t.test(training_res,holdout_res)

Опять же, значение p выше 5% может заставить нас сказать, что нет достаточных оснований предполагать, что средние значения отличаются.

F-тест

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

Хорошим тестом для проверки того, больше ли одно отклонение, чем другое, является F-тест, но он работает только с нормально распределенными остатками. Если распределение не является нормальным, тест может дать неверные результаты.

Итак, если мы действительно хотим использовать этот тест, мы должны проверить нормальность остатков, используя (например) тест Шапиро-Уилка.

Оба значения p превышают 5%, поэтому можно сказать, что оба набора показывают нормально распределенные остатки. Мы можем спокойно продолжать выполнение F-теста.

var.test(training_res,holdout_res)

Значение p составляет 72%, что больше 5% и позволяет нам сказать, что два набора имеют одинаковую дисперсию.

Тест Колмогорова-Смирнова

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

ks.test(training_res,holdout_res)

Опять же, большое значение p может заставить нас сказать, что эти два распределения одинаковы.

участок

Мой профессор в университете обычно говорил: «вы должны смотреть на данные своими глазами». В машинном обучении это определенно верно.

Лучший способ взглянуть на данные регрессии - это построить прогнозируемые значения против реальных значений в наборе удержания. В идеальном состоянии мы ожидаем, что точки лежат на линии под углом 45 градусов, проходящей через начало координат (y = x - это уравнение). Чем ближе точки к этой линии, тем лучше регрессия. Если наши данные образуют бесформенный шарик в декартовой плоскости, определенно что-то не так.

plot(holdout$Sepal.Length,predict(m,holdout))
abline(0,1)

Что ж, могло быть и лучше, но это не совсем так. Точки примерно лежат на прямой.

t-тест на графике

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

Помните определение переменной t с n-1 степенями свободы:

Когда мы используем функцию суммировать для R в линейной модели, она дает нам оценки параметров и их стандартные ошибки (то есть полный знаменатель определения t).

Для точки пересечения mu = 0, а для наклона mu = 1.

test_model = lm(real ~ predicted, data.frame(real=holdout$Sepal.Length,predicted=predict(m,holdout)))
s = summary(test_model)
intercept =  s$coefficients["(Intercept)","Estimate"]
intercept_error = s$coefficients["(Intercept)","Std. Error"]
slope = s$coefficients["predicted","Estimate"]
slope_error = s$coefficients["predicted","Std. Error"]
t_intercept = intercept/intercept_error
t_slope = (slope-1)/slope_error

Теперь у нас есть значения t, поэтому мы можем выполнить двусторонний t-тест, чтобы вычислить p-значения.

Они больше 5%, но не слишком высоки по абсолютной величине.

Какой метод самый лучший?

Как обычно, это зависит от проблемы. Если остатки нормально распределены, достаточно t-теста и F-теста. Если это не так, возможно, первый график поможет нам обнаружить макроскопическое смещение перед использованием теста Колмогорова-Смирнова.

Однако ненормально распределенные остатки всегда должны вызывать тревогу в нашей голове и заставлять искать какое-то скрытое явление, которое мы еще не рассмотрели.

Выводы

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