Методические указания к лр 1




I. Оценка корреляции зависимой и независимой переменных
#Оценка корреляции зависимой и независимой переменной на dataset House Sale Price Dataset.csv
Data_HousePrice <-read.csv("Dataset/House Sale Price Dataset.csv",header=TRUE);
#Построение векторов Y-зависимая, X-независимая
y <-Data_HousePrice$HousePrice;
x<-Data_HousePrice$StoreArea;
#Построение Scatter Plot
plot(x,y, main="Scatterplot HousePrice vs StoreArea", xlab="StoreArea(sqft)", ylab="HousePrice($)", pch=19,cex=0.3,col="red")
#Добавление линии подгонки для демонстрации тренда отношения
abline(lm(y~x)) # regression line (y~x)
#построение модели линейной регрессии - функция lm
lines(lowess(x,y), col="green") # lowess line (x,y)
cat("The correlation among HousePrice and StoreArea is ",cor(x,y));
The correlation among HousePrice and StoreArea is 0.62.

Выводы по визуализации:
1.
Корреляция имеет положительное направление, поэтому в среднем
цена дома увеличивается с размером магазина. Следовательно, чем больше места
магазина, тем лучше дом, что означает, что он дороже.
2. Корреляция составляет 0,62. Это умеренно прочные отношения.
3. Изогнутая линия - это LOWESS (Locally Weighted Scatterplot Smoothing). График показывает, что характер визуализации близок к линейной регрессии. Следовательно, линейные отношения мождно принять для этой модели.
4. На визуализации присутствует вертикальная линия для Storearea = 0. Что говорит о том, что цены варьируются для дома, где нет зоны магазина. Нужно найти другие факторы, которые влияют на цену на дом.
Линейная регрессия
Линейная регрессия - это процесс подбора линейной функции-предиктора для оценки неизвестных параметров на основе исходных данных. В общем случае модель предсказывает условное среднее значение Y при заданном X, которое является аффинной функцией от X.
Модель линейной регрессии позволяет выполнить:
• прогнозирование
• количественную оценку взаимосвязи между переменными (например, параметры и p-значения)
Математически, простая линейная зависимость выглядит следующим образом:

где y - прогнозируемый отклик (или установленное значение) a - промежуточное значение, т.е. среднее значение отклика, если независимая переменная равна нулю, а β - параметр для x, т.е. изменение y на единицу изменения x.
Далее, в качестве функции потерь будем использовать метод наименьших квадратов (OLS).
В OLS алгоритм минимизирует ошибку квадратов. Задачу минимизации можно сформулировать следующим образом:

Поскольку это параметрический метод, мы можем получить решение в замкнутой форме для этой
оптимизации. Решение в замкнутой форме для оценки коэффициентов (или параметров) заключается в использовании следующих уравнений:


дисперсия х
Существует теорема Гаусса- Теорема Маркова, которая гласит, что при выполнении следующих условий:
• Математическое ожидание (среднее значение) остатков равно нулю (нормальность остатков).
• Остатки не коррелируют и (автокорреляция отсутствует)
• Остатки имеют одинаковую дисперсию (гомоскедастичность - свойство, означающее постоянство условной дисперсии вектора или последовательности случайных величин.)
тогда обычная оценка методом наименьших квадратов дает наилучшую линейную несмещенную оценку коэффициентов (или оценок параметров). Существуют ключевые понятия, которые составляют наилучшую оценку:
- искажение (bias) — это разница между ожиданием оцениваемой величины и ее значением;,
- согласованность (consistent). В области статистики термин “согласованный” относится к свойству оценщика, при котором по мере увеличения размера выборки оценки с вероятностью приближаются к истинному значению параметра. Эта концепция имеет решающее значение для обеспечения того, чтобы статистические методы давали надежные результаты по мере сбора большего количества данных. Согласованная оценка обеспечивает основу для составления выводов о совокупности на основе выборочных данных
- эффективность. Эффекти́вная оце́нка в математической статистике — наилучшая оценка в среднеквадратичном смысле.
Простая линейная регрессия (функция lm() в R)
Теперь мы можем перейти к оценке линейных моделей с использованием метода OLS. lm() - функция из пакета на языке R, предоставляет возможность запускать OLS для линейных регрессий. lm() может использоваться для проведения регрессионного анализа, одноуровневого дисперсионного анализа и анализа ковариации. Она является частью пакета base stats() в R.
II. Построение модели линейной регрессии в R
Построим простую линейную регрессию чтобы понять, как интерпретировать
выходные данные lm() для этого простого случая. Здесь мы применяем модель линейной регрессии с использованием метода OLS к:
- Зависимой переменной: Цена дома (HousePrice)
- Независимой переменной: Площадь магазина (x - StoreArea).
Корреляционный анализ показал, что эти две переменные имеют положительную
линейную связь, и, следовательно, можно ожидать положительного знака для оценочных параметров StoreAra.
# построение модели
fitted_Model <-lm(y~x)
# вывод статистики по модели
summary(fitted_Model)
Call:
lm(formula = y ~ x)
Residuals:
Min 1Q Median 3Q Max
-280115 -33717 -4689 24611 490698
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 70677.227 4261.027 16.59 <2e-16 ***
x 232.723 8.147 28.57 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 63490 on 1298 degrees of freedom
Multiple R-squared: 0.386, Adjusted R-squared: 0.3855
F-statistic: 816 on 1 and 1298 DF, p-value: < 2.2e-16
Получаем уравнение
модели:
y - HousePrice
x - StoreArea.
Значение 232.723 говорит о том, что на каждую единицу StoreАrea, HomeРrice увеличивается на 232,72 долл. США.
Значение 70677.227, при отсутствии StoreArea означает, что 70677.227 можно рассматривать, как первоначальный взнос.
Рассмотрим статистику lm (), чтобы лучше понять модель.
- Call: Выводит уравнение модели, полученное функцией lm
- Residuals(остатки): Выводит диапазон остатков, Min, Max, медиану остатков. Отрицательная медиана означает, что по крайней мере половина остатков отрицательна, т.е. прогнозируемые значения превышают фактические более чем на 50%.
- Coefficients (коэффициенты): Это таблица, в которой приведены оценки параметров модели (или коэффициенты), стандартная ошибка, t-значение и p-значение t-критерия Стьюдента.
- Diagnostics (Диагностика): остаточная стандартная ошибка, а также множественные и скорректированные R-квадрат и F-статистика для тестирования дисперсии.
После оценки модели в целом и значимость каждого предиктора, мы перейдем к рассмотрению того, насколько модель соответствует фактическим значениям. Это делается путем сопоставления фактических значений с прогнозируемыми:
res<-stack(data.frame(Observed = y, Predicted =fitted(fitted_Model)))
res <-cbind(res, x =rep(x, 2))
#график строится через библиотеку lattice, xyplot(function)
install.packages("lattice")
library("lattice")
xyplot(values ~x, data = res, group = ind, auto.key =TRUE)
Визуализация показывает, что тренды прогнозируемых и фактических значений совпадают.
В этой модели использовалась только одна независимая переменная (площадь магазина), но доступны и другие переменные, которые показывают значительную взаимосвязь с ценами на жилье. Можно добавлять в регрессионный анализ несколько независимых переменных. - множественная линейная регрессия
III. Построение модели мультилинейной регрессии в R
Идеи простой линейной регрессии могут быть распространены на множество независимых переменных.

Для множественной регрессии очень популярно матричное представление, поскольку оно упрощает объяснение концепций матричных вычислений. Тогда линейная зависимость при множественной линейной регрессии становится
Ранее использовалась только одна переменная для объяснения зависимой переменной -StoreAria. В множественной линейной регрессии мы будем использовать StoreArea, StreetHouseFront, BasementArea, LawnArea, Rating, and SaleType в качестве независимых переменных для оценки линейной зависимости от HousePrice.
Функция оценки методом наименьших квадратов остается прежней, за исключением того, что в качестве предикторов будут использоваться новые переменные.
Чтобы выполнить анализ по нескольким переменным, мы вводим еще один шаг очистки данных - идентификацию пропущенного значения. Можно либо ввести пропущенное значение указав конкретное или не учитывать его в анализе. Если не учитывать, то используем функцию na.omit(). Следующий код сначала находит пропущенные случаи, а затем удаляет их.
# использование lm для создания мультилинейной регрессии
Data_lm_Model <-Data_HousePrice[,c("HOUSE_ID","HousePrice","StoreArea","Str
eetHouseFront","BasementArea","LawnArea","Rating","SaleType")];
# below function we display number of missing values in each of the variables in data
sapply(Data_lm_Model, function(x) sum(is.na(x)))
HOUSE_ID HousePrice StoreArea StreetHouseFront
0 0 0 231
BasementArea LawnArea Rating SaleType
0 0 0 0
# 231 случай ошибочных значений в StreetHouseFront. Функция Na.omit исправит их.
Data_lm_Model <-na.omit(Data_lm_Model)
rownames(Data_lm_Model) <-NULL
#категориальные переменные должны стать факторами
Data_lm_Model$Rating <-factor(Data_lm_Model$Rating)
Data_lm_Model$SaleType <-factor(Data_lm_Model$SaleType)
fitted_Model_multiple <-lm(HousePrice ~StoreArea +StreetHouseFront
+BasementArea +LawnArea +Rating +SaleType,data=Data_lm_Model)
summary(fitted_Model_multiple)
Call:
lm(formula = HousePrice ~ StoreArea + StreetHouseFront + BasementArea +
LawnArea + Rating + SaleType, data = Data_lm_Model)
Residuals:
Min 1Q Median 3Q Max
-485976 -19682 -2244 15690 321737
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.507e+04 4.827e+04 0.519 0.60352
StoreArea 5.462e+01 7.550e+00 7.234 9.06e-13 ***
StreetHouseFront 1.353e+02 6.042e+01 2.240 0.02529 *
BasementArea 2.145e+01 3.004e+00 7.140 1.74e-12 ***
LawnArea 1.026e+00 1.721e-01 5.963 3.39e-09 ***
Rating2 -8.385e+02 4.816e+04 -0.017 0.98611
Rating3 2.495e+04 4.302e+04 0.580 0.56198
Rating4 3.948e+04 4.197e+04 0.940 0.34718
Rating5 5.576e+04 4.183e+04 1.333 0.18286
Rating6 7.911e+04 4.186e+04 1.890 0.05905 .
Rating7 1.187e+05 4.193e+04 2.830 0.00474 **
Rating8 1.750e+05 4.214e+04 4.153 3.54e-05 ***
Rating9 2.482e+05 4.261e+04 5.825 7.61e-09 ***
Rating10 2.930e+05 4.369e+04 6.708 3.23e-11 ***
SaleTypeFirstResale 2.146e+04 2.470e+04 0.869 0.38512
SaleTypeFourthResale 6.725e+03 2.791e+04 0.241 0.80964
SaleTypeNewHouse 2.329e+03 2.424e+04 0.096 0.92347
SaleTypeSecondResale -5.524e+03 2.465e+04 -0.224 0.82273
SaleTypeThirdResale -1.479e+04 2.613e+04 -0.566 0.57160
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 41660 on 1050 degrees of freedom
Multiple R-squared: 0.7644, Adjusted R-squared: 0.7604
F-statistic: 189.3 on 18 and 1050 DF, p-value: < 2.2e-16
Оценочная модель содержит шесть независимых переменных, из которых четыре непрерывные
("StoreArea","StreetHouseFront","BasementArea","LawnArea") и две категориальные переменные ("Rating","SaleType"). Из результатов функции lm() видно, что "StoreArea","StreetHouseFront","BasementArea","LawnArea" являются значимыми при уровне достоверности 95%, т.е. статистически отличающимися от нуля. В то время как все SaleType незначимы, статистически они равны нулю. Из модели следует исключить SaleType и провести переоценку, чтобы сохранить только значимые переменные.
Следует сравнить фактические и прогнозируемые значения для этой модели, построив их после упорядочения рядов по ценам на жилье.
#Get the fitted values and create a data frame of actual and predicted get predicted values
actual_predicted <-as.data.frame(cbind(as.numeric(Data_lm_Model$HOUSE_
ID),as.numeric(Data_lm_Model$HousePrice),as.numeric(fitted(fitted_Model_
multiple))))
names(actual_predicted) <-c("HOUSE_ID","Actual","Predicted")
#Ordered the house by increasing Actual house price
actual_predicted <-actual_predicted[order(actual_predicted$Actual),]
#Find the absolute residual and then take mean of that
install.packages("ggplot2")
library(ggplot2)
#Plot Actual vs Predicted values for Test Cases
ggplot(actual_predicted,aes(x =1:nrow(Data_lm_Model),color=Series)) +
geom_line(data = actual_predicted, aes(x =1:nrow(Data_lm_Model),
y = Actual, color ="Actual")) +
geom_line(data = actual_predicted, aes(x =1:nrow(Data_lm_Model),
y = Predicted, color ="Predicted")) +xlab('House Number') +ylab('House
Sale Price')
График на рисунке показывает фактические и прогнозируемые значения для упорядоченной стоимости. График также показывает линейную зависимость, предсказанную нашей моделью, в сочетании с точечной диаграммой оригинала.

Цены на жилье расположены в порядке возрастания, чтобы увидеть меньший разброс между фактическими и прогнозируемыми ценами. График показывает, что наша модель точно соответствует фактическим ценам.
Есть несколько случаев повышенных значений, которые модель не в состоянии предсказать, и это нормально, поскольку на нашу модель не влияют выбросы.
IV. Диагностика модели
Диагностика модели является важным этапом в процессе выбора модели. Существует разница между оценкой производительности модели, рассмотренной ранее, и процессом выбора модели. При оценке модели мы проверяем, как модель работает на неизвестных данных (тестовых данных), но при выборе модели мы видим, как сама модель соответствует нашим данным. Это включает в себя проверку значимости p-значений оценок параметров, нормальности, автокорреляции, гомоскедастичности, точек влияния/выбросов и мультиколлинеарности. Существуют и другие тесты, позволяющие определить, насколько хорошо модель следует статистическим допускам, строгой экзогенности, таблицам дисперсии и т.д. В линейной регрессии экстремальные значения могут создавать проблемы в процессе оценки. Несколько больших значений вносят искажение в оценках и создают другие аберрации в остатках. Так что важно определить влиятельные точки в данных. Если влиятельные точки кажутся слишком экстремальными, мы должны отказаться от них в процессе анализа, как от выбросов. Рассмотрим конкретную статистическая меру-расстояние Кука.
Расстояние Кука
Этот метод используется для поиска влиятельных точек в данных. Расстояние Кука измеряет эффект удаления данного наблюдения.
Таким образом, если удаление какого-либо наблюдения приводит к значительным изменениям, это означает, что эти точки влияют на регрессионную модель. Этим точкам присваивается большое значение Расстояния Кука и они рассматриваются для дальнейшего изучения.
Граничное значение для этой статистики может быть принято как Di > 4 / n, где n - количество наблюдений. Если сделаеть поправку на количество параметров в модели, то предельное значение можно принять равным Di>4/ n-k-1, где k - количество переменных в модели.
install.packages("car")
library(car);
# график расстояний Кука
# identify D values > 4/(n-k-1)
cutoff <-4/((nrow(Data_lm_Model)-length(fitted_Model_
multiple$coefficients)-2))
plot(fitted_Model_multiple, which=4, cook.levels=cutoff)

На графике на рис. выделены номера наблюдений с большим расстоянием Кука. Эти наблюдения требуют дальнейшего изучения.
# Influence Plot
influencePlot(fitted_Model_multiple, id.method="identify",
main="Influence Plot", sub="Circle size is proportional to Cook's
Distance",id.location =FALSE)

График на рис. 6-17 показывает другое представление расстояния Кука. Размер круга пропорционален этому расстоянию.
Кроме того, здесь показаны результаты теста на выбросы:
#обнаружение выбросов
outlier.test(fitted_Model_multiple)
rstudent unadjusted p-value Bonferonni p
621 -14.285067 1.9651e-42 2.0987e-39
229 8.259067 4.3857e-16 4.6839e-13
564 -7.985171 3.6674e-15 3.9168e-12
1023 7.902970 6.8545e-15 7.3206e-12
718 5.040489 5.4665e-07 5.8382e-04
799 4.925227 9.7837e-07 1.0449e-03
235 4.916172 1.0236e-06 1.0932e-03
487 4.673321 3.3491e-06 3.5768e-03
530 4.479709 8.2943e-06 8.8583e-03
Номера — 342,621 и 102, как показано на рисунке
(соответствуют номерам домов 412, 759 и 1242) - это три основные точки влияния.
Можно рассмотреть эти записи, чтобы посмотреть, какими значениями они обладают.
#Pull the records with highest leverage
Debug <-Data_lm_Model[c(342,621,1023),]
[1] " The observed values for three high leverage points"
Debug
HOUSE_ID HousePrice StoreArea StreetHouseFront BasementArea LawnArea
342 412 375000 513 150 1236 215245
621 759 160000 1418 313 5644 63887
1023 1242 745000 813 160 2096 15623
Rating SaleType
342 7 NewHouse
621 10 FirstResale
1023 10 SecondResale
print("Model fitted values for these high leverage points");
[1] "Model fitted values for these high leverage points"
fitted_Model_multiple$fitted.values[c(342,621,1023)]
342 621 1023
441743.2 645975.9 439634.3
print("Summary of Observed values");
[1] "Summary of Observed values"
summary(Debug)
HOUSE_ID HousePrice StoreArea StreetHouseFront
Min. : 412.0 Min. :160000 Min. : 513.0 Min. :150.0
1st Qu.: 585.5 1st Qu.:267500 1st Qu.: 663.0 1st Qu.:155.0
Median : 759.0 Median :375000 Median : 813.0 Median :160.0
Mean : 804.3 Mean :426667 Mean : 914.7 Mean :207.7
3rd Qu.:1000.5 3rd Qu.:560000 3rd Qu.:1115.5 3rd Qu.:236.5
Max. :1242.0 Max. :745000 Max. :1418.0 Max. :313.0
BasementArea LawnArea Rating SaleType
Min. :1236 Min. : 15623 10 :2 FifthResale :0
1st Qu.:1666 1st Qu.: 39755 7 :1 FirstResale :1
Median :2096 Median : 63887 1 :0 FourthResale:0
Mean :2992 Mean : 98252 2 :0 NewHouse :1
3rd Qu.:3870 3rd Qu.:139566 3 :0 SecondResale:1
Max. :5644 Max. :215245 4 :0 ThirdResale :0
(Other):0
Цены на жилье для этих трех точек влияния далеки от среднего значения или высокой плотности. Цена на жилье для двух наблюдений соответствует самой высокой и самой низкой в наборе данных. Также интересно то, что третье наблюдение, соответствующее средней цене дома, имеет очень большую площадь газона, что, безусловно, оказывает влияние. Основываясь на этом анализе, мы можем либо вернуться назад, чтобы проверить, являются ли эти данные ошибками, либо проигнорировать их в нашем анализе.
Проверка нормальности остатков (тесты)
Остатки являются основой для диагностики регрессионных моделей. Нормальность остатков является важным условием для того, чтобы модель была корректной моделью линейной регрессии. Нормальность подразумевает, что ошибки/остатки являются случайным шумом, и наша модель отражает всю информацию в данных. Модель линейной регрессии дает нам условные ожидания функции y для заданных значений х. Однако в подобранном уравнении есть некоторый остаток. Нам нужно, чтобы математическое ожидание остатка было нормально распределено со средним значением 0 или приводимым к 0. A нормальная остаточная величина означает, что вывод модели (доверительный интервал,значимость предикторов модели) верен. Распределение стьюдентизированных остатков (их можно рассматривать как нормализованное значение) -хороший способ определить, выполняется ли предположение о нормальности или нет. Формально проверить остатки можно с помощью тестов на нормальность, таких как тесты KS, тесты Шапиро-Уилка, Андерсона, Тесты Дарлинга и т.д.
Вывод графика на стьюдентизированных остатках для нормального распределения, которое образует кривую колокола.
install.packages("stats")
library(stats)
install.packages("IDPmisc")
library(IDPmisc)
Loading required package: grid
install.packages("MASS")
library(MASS)
sresid <-studres(fitted_Model_multiple)
#очистка некорректных значений (NAN/Inf/NAs)
sresid <-NaRV.omit(sresid)
hist(sresid, freq=FALSE,
main="Distribution of Studentized Residuals",breaks=25)
xfit<-seq(min(sresid),max(sresid),length=40)
yfit<-dnorm(xfit)
lines(xfit, yfit)
График на рис. создан с использованием детализированных остатков. В предыдущем коде остатки были детализированы с помощью функции studres() в R.

Рисунок. Распределение стьюдентизированных остатков
График остаточных значений близок к нормальному, поскольку распределение образует колоколообразную кривую.
Проведем формальную проверку на нормальность.
Тест Колмогорова-Смирнова (тест KS) и другие тесты
Статистика Колмогорова–Смирнова для данной кумулятивной функция распределения F(x) равна

где sup x - максимальное значение из набора расстояний.
Статистика KS показывает наибольшую разницу между эмпирическим распределением
остаточных значений и нормальным распределением. Если наибольшее значение (supremum) превышает критическое значение, то распределение не является нормальным (используя p-значение тестовой статистики). Ниже приведены три теста на соответствие результатов:
# test on normality
#1. KS one sample test
ks.test(fitted_Model_multiple$residuals,pnorm,alternative="two.sided")
One-sample Kolmogorov-Smirnov test
data: fitted_Model_multiple$residuals
D = 0.54443, p-value < 2.2e-16
alternative hypothesis: two-sided
#2. Shapiro Wilk Test
shapiro.test(fitted_Model_multiple$residuals)
Shapiro-Wilk normality test
data: fitted_Model_multiple$residuals
W = 0.80444, p-value < 2.2e-16
#3. ADarling-Darling Test
install.packages("nortest")
library(nortest)
ad.test(fitted_Model_multiple$residuals)
Anderson-Darling normality test
data: fitted_Model_multiple$residuals
A = 29.325, p-value < 2.2e-16
Ни один из этих трех тестов не предполагает, что остатки распределены нормально. Значения p меньше 0,05, и, следовательно, мы можем отклонить нулевую гипотезу о
нормальном распределении. Это означает, что мы должны вернуться к нашей модели и посмотреть, что может быть причиной необычного поведения, исключить какую-то переменную или добавить какую-то переменную, важные моменты и другие проблемы.
Мультиколлинеарность
Мультиколлиниарность в основном является проблемой слишком большой информации в паре независимых переменных. Это явление, когда две или более переменных сильно коррелированы, и, следовательно, вызывают увеличение стандартные ошибки в модели. Для тестирования этого явления можно использовать корреляционную матрицу и посмотреть, имеются ли отношения с достойной точностью. Если да, добавление одной переменной достаточно для подачи информации, необходимой для объяснения зависимой переменной. В этом разделе мы будем использовать коэффициент увеличения дисперсии для определения степени многопрофильности независимых переменных. Еще одним популярным методом определения мультиколлинеарности является индекс Колина (Condition Index).
Коэффициент увеличения дисперсии (VIF) для мультиколлинеарности определяется следующим образом:

где R2 - коэффициент детерминации регрессии экспланатора (переменная, которая предсказывает или объясняет изменение другой переменной; объясняющая переменная.) j объясняющей все
остальные экспланаторы. Как правило, пороговыми значениями для определения наличия мультиколлинеарности на основе показателей являются:
• Допуск менее 0,20
• Значение VIF, равное 5 и более, указывает на проблему мультиколлинеарности
Простым решением этой проблемы является исключение переменной из этих пороговых значений в процессе построения модели.
library(car)
# calculate the vif factor
# Evaluate Collinearity
print(" Variance inflation factors are ");
[1] " Variance inflation factors are "
vif(fitted_Model_multiple);
# variance inflation factors
GVIF Df GVIF^(1/(2*Df))
StoreArea 1.767064 1 1.329309
StreetHouseFront 1.359812 1 1.166110
BasementArea 1.245537 1 1.116036
LawnArea 1.254520 1 1.120054
Rating 1.931826 9 1.037259
SaleType 1.259122 5 1.023309
print("Tolerance factors are ");
[1] "Tolerance factors are "
1/vif(fitted_Model_multiple)
GVIF Df GVIF^(1/(2*Df))
StoreArea 0.5659106 1.0000000 0.7522703
StreetHouseFront 0.7353955 1.0000000 0.8575521
BasementArea 0.8028664 1.0000000 0.8960281
LawnArea 0.7971175 1.0000000 0.8928143
Rating 0.5176450 0.1111111 0.9640796
SaleType 0.7942043 0.2000000 0.9772220
Теперь есть значения VIF и допуска, указанные в предыдущих таблицах. Применим ограничения для VIF и допуска.
# Apply the cut-off to VIF
print("Apply the cut-off of 4 for vif")
[1] "Apply the cut-off of 4 for vif"
vif(fitted_Model_multiple) >4
GVIF Df GVIF^(1/(2*Df))
StoreArea FALSE FALSE FALSE
StreetHouseFront FALSE FALSE FALSE
BasementArea FALSE FALSE FALSE
LawnArea FALSE FALSE FALSE
Rating FALSE TRUE FALSE
SaleType FALSE TRUE FALSE
# Apply the cut-off to Tolerance
print("Apply the cut-off of 0.2 for vif")
[1] "Apply the cut-off of 0.2 for vif"
(1/vif(fitted_Model_multiple)) <0.2
GVIF Df GVIF^(1/(2*Df))
StoreArea FALSE FALSE FALSE
StreetHouseFront FALSE FALSE FALSE
BasementArea FALSE FALSE FALSE
LawnArea FALSE FALSE FALSE
Rating FALSE TRUE FALSE
SaleType FALSE FALSE FALSE
Столбец GVIF имеет значение false для значений, которые установлены для мультиколлинеарности. Следовательно, можно с уверенностью сказать, что в модели нет проблемы мультиколлинеарности. И, следовательно, стандартные ошибки не завышены, так что можно провести проверку гипотез.
Автокорреляция остатков
Корреляция определяется между двумя различными переменными, в то время как автокорреляция, также известная, как последовательная корреляция, представляет собой корреляцию переменной самой с собой в разные моменты времени или в ряде. Этот тип взаимосвязи очень важен и довольно часто используется при моделировании временных рядов. Автокорреляция имеет больше смысла, когда есть определенный порядок в наблюдениях, например, индекс по времени, ключу и т.д. Если остаток показывает, что он имеет
определенную связь с предыдущими остатками, т.е. автокоррелирован, то шум возникает не случайно, а это означает, что все еще есть дополнительная информация, которую можно извлечь и ввести в модель. Для проверки автокорреляции используем самый популярный метод -
тест Дурбина Уотсона. Учитывая, что в процессе были определены среднее значение и дисперсия, статистика автокорреляции теста Дурбина Уотсона может быть определена следующим образом:

Это может быть переписано для нашей остаточной автокорреляции как статистика теста d-Durbin Watson:
где et - остаточная величина, связанная с наблюдением в момент времени t.
Для интерпретации статистических данных можно следовать правилам, описанным на рис.

# Test for Autocorrelated Errors
durbinWatsonTest(fitted_Model_multiple)
lag Autocorrelation D-W Statistic p-value
1 -0.03814535 2.076011 0.192
Alternative hypothesis: rho != 0
#ACF Plots
plot(acf(fitted_Model_multiple$residuals))

График на рис. называется графиком автокорреляционной функции (ACF) для различных лагов. Этот график популярен при анализе временных рядов, поскольку данные являются временными индексами. Статистика Дурбина Уотсона не показывает автокорреляции между остатками, при этом d равно 2,07. Также на графиках ACF не видно всплесков. Следовательно, можно сказать, что остатки не подвержены автокорреляции.
Гомоскедастичность
Гомоскедастичность означает, все случайные переменные в последовательности или векторе имеют конечную и постоянную дисперсию. Это также называется однородностью дисперсии. В рамках линейной регрессии гомоскедастичные ошибки / остатки будут означать, что дисперсия ошибок не зависит от значений X. Это означает, что распределение вероятности имеет одинаковое стандартное отклонение независимо от X. Существует несколько статистических испытаний для проверки предположения гомоскедастичности, например, Тест Бреша-Пагана, тест арки, тест Бартлетта. Рассмотрим тест Бартлетта, разработанному в 1989 году Снедекором и Кокраном. Для выполнения теста Бартлетта, сначала создаем подгруппы в данных выборки. Например, три группы популяционных данных с 400, 400 и 269 наблюдениями в каждой группе. Можно создать три группы в данных, чтобы увидеть, варьируется ли дисперсия по этим трех группам GP <-NUMERIC () 294
gp<-numeric()
for( i in 1:1069)
{
if(i<=400){
gp[i] <-1;
}else if(i<=800){
gp[i] <-2;
}else{
gp[i] <-3;
}
}
Теперь мы определяем гипотезу, которую будем проверять с помощью теста Бартлетта:
H0(нулевая гипотеза): Все три дисперсии в популяции одинаковы.
HА(альтернативная гипотеза): По крайней мере, две из них отличаются друг от друга.
Здесь мы выполняем тест Бартлетта с помощью функцииBartlett.test():
Data_lm_Model$gp <-factor(gp)
bartlett.test(fitted_Model_multiple$fitted.values,Data_lm_Model$gp)
Bartlett test of homogeneity of variances
data: fitted_Model_multiple$fitted.values and Data_lm_Model$gp
Bartlett's K-squared = 1.3052, df = 2, p-value = 0.5207
Критерий Бартлетта имеет значение p, превышающее 0,05, что означает, что мы не можем отвергнуть нулевую гипотезу. Подгруппы имеют одинаковую дисперсию, и, следовательно, дисперсия гомоскедастична.
Приведем еще несколько тестов для проверки дисперсий.
# 1. Breush-Pagan Test
# non-constant error. variance test - breush pagan test
ncvTest(fitted_Model_multiple)
Non-constant Variance Score Test
Variance formula: ~ fitted.values
Chisquare = 2322.866 Df = 1 p = 0
# 2. ARCH Test
#also show ARCH test - More relevant for a time series model
Install.packages("FinTS")
library(FinTS)
ArchTest(fitted_Model_multiple$residuals)
ARCH LM-test; Null hypothesis: no ARCH effects
data: fitted_Model_multiple$residuals
Chi-squared = 4.2168, df = 12, p-value = 0.9792
Результаты теста Бартлетта и теста Arch ясно показывают, что остатки гомоскедастичны. График на рисунке представляет собой зависимость остатков от установленных значений. Это точечный график отклонений по оси x и подобранных значений (оценочных откликов) по оси y.
График используется для выявления нелинейности, неравномерных отклонений ошибок и выбросов.
# plot residuals vs. fitted values
plot(fitted_Model_multiple$residuals,fitted_Model_multiple$fitted.values)

Оценка модели - самый важный шаг в разработке любого решения для машинного обучения. На этом этапе разработки модели мы оцениваем производительность модели и решаем, продолжать ли работу с моделью или вернуться ко всем нашим предыдущим шагам в процессе машинного обучения. Во многих случаях мы можем даже отказаться от полной модели, основанной на показателях производительности. Основная идея оценки модели заключается в минимизации ошибок в тестовых данных, где ошибку можно определить по-разному. В самом понятном смысле ошибка - это разница между фактическим значением переменной-предиктора в данных и значением , которое предсказывает ML-модель. Показатели ошибок не всегда универсальны, и для решения некоторых специфических задач требуются креативные показатели ошибок, соответствующие задаче и знаниям предметной области. Здесь важно подчеркнуть, что показатель ошибок, используемый для обучения модели, может отличаться от показателя ошибок оценки. Например, для модели классификации можно использовать метрику ошибок LogLoss, но для оценки модели можно также вывести коэффициент классификации с использованием матрицы путаницы.
Выведем типы переменных исходного набора данных (цена на дом)
install.packages ("data.table")
library(data.table)
Data_House_Price <-fread("Dataset/House Sale Price Dataset.csv",header=T,
verbose =FALSE, showProgress =FALSE)
str(Data_House_Price)
Classes 'data.table' and 'data.frame': 1300 obs. of 14 variables:
$ HOUSE_ID : chr "0001" "0002" "0003" "0004" ...
$ HousePrice : int 163000 102000 265979 181900 252000 180000 115000
176000 192000 132500 ...
$ StoreArea : int 433 396 864 572 1043 440 336 486 430 264 ...
$ BasementArea : int 662 836 0 594 0 570 0 552 24 588 ...
$ LawnArea : int 9120 8877 11700 14585 10574 10335 21750 9900
3182 7758 ...
$ StreetHouseFront: int 76 67 65 NA 85 78 100 NA 43 NA ...
$ Location : chr "RK Puram" "Jama Masjid" "Burari" "RK Puram" ...
$ ConnectivityType: chr "Byway" "Byway" "Byway" "Byway" ...
$ BuildingType : chr "IndividualHouse" "IndividualHouse"
"IndividualHouse" "IndividualHouse" ...
$ ConstructionYear: int 1958 1951 1880 1960 2005 1968 1960 1968 2004 1962
...
$ EstateType : chr "Other" "Other" "Other" "Other" ...
$ SellingYear : int 2008 2006 2009 2007 2009 2006 2009 2008 2010 2007
...
$ Rating : int 6 4 7 6 8 5 5 7 8 5 ...
$ SaleType : chr "NewHouse" "NewHouse" "NewHouse" "NewHouse" ...
- attr(*, ".internal.selfref")=<externalptr>
Далее представлена сводная информация о цене продажи дома. Это
наша зависимая переменная.
dim(Data_House_Price)
[1] 1300 14
Проверка распределения зависимой переменной ( House Price). Вывод гистограммы
hist(Data_House_Price$HousePrice/1000000, breaks=20, col="blue", xlab="House
Sale Price(Million)",
main="Distribution of House Sale Price")
Здесь мы вызываем функцию summary(), чтобы просмотреть основные свойства данных о ценах на жилье. На
выходе мы получаем минимум, первый квартиль, медиану, среднее значение, третий квартиль и максимум.
summary(Data_House_Price$HousePrice)
Min. 1st Qu. Median Mean 3rd Qu. Max.
34900 129800 163000 181500 214000 755000
#Pulling out relevant columns and assigning required fields in the dataset
Data_House_Price <-Data_House_Price[,.(HOUSE_ID,HousePrice,StoreArea,StreetHouseFront,BasementArea,LawnArea,Rating,SaleType)]
Следующий фрагмент кода удаляет недостающие значения из набора данных. Этоважно для обеспечения согласованности всех данных.
#Omit Any missing value
Data_House_Price <-na.omit(Data_House_Price)
Data_House_Price$HOUSE_ID <-as.character(Data_House_Price$HOUSE_ID)
V. Оценка производительности модели
Оценка производительности выполняются, после того, как модель разработана и необходимо понять, как модель работает на тестовых/валидационных данных. Перед началом разработки модели данные обычно делятся на три категории:
1. Training Data (данные для обучения): Этот набор данных используется для обучения модели / машины. На этом этапе фокус алгоритма обучения сосредоточен на том, чтобы оптимизировать некоторую четко определенную метрику, отражающую суть модели. Например, в QLS, используются данные для обучения модели линейной регрессии путем минимизации квадратичных ошибок.
2. Testing Data (тестовые данные): Тестовый набор данных содержит точки данных, которые алгоритм ML не видел ранее. Мы применяем этот набор данных, чтобы увидеть, как модель выполняет новых данных. Большая часть оценки производительности модели рассчитываются на этом этапе. Здесь принимается решение об улучшениях модели и внесении в нее изменений.
3. Validation dats: ( проверочные данные) : цель этого набора данных состоит в том, чтобы проверить переобучение модели и оценить необходимость калибровки. Если не удасться откалибровать модель, то весь процесс начнется заново.
Для достаточно больших данных, которые можно использовать в соотношении 60:20:20 для обучения, тестирования и валидации. Модель производительности измеряется с помощью тестовых данных, и разработчик решает, какие пороговые значения приемлемы для подгонки модели. Метрики производительности в целом генерируются с использованием основных критериев подгонки модели и результаты несколько отличаются от фактического вы-ода модели. Эта ошибка между фактическими и предсказанными данными должна быть минимизирована для хорошей производительности. Часто используемые показатели производительности и оценки применяются для двух типов переменных выхода модели (предикторов):
- Непрерывный вывод: модель или серия моделей, которые дают непрерывное предсказанное значение для непрерывной зависимой переменной в модели. Например, HousePrices является непрерывной и, при использовании для прогнозирования модели, будет давать непрерывные прогнозируемые значения.
- Дискретный выход: модель или серия моделей, которые дают дискретное предсказанное значение для дискретной зависимой переменной в модели. Например, для приложения кредитной карты, класс риска заемщика при использовании в прогностической модели для классификации приведет к дискретной предсказанной цене (прогнозируемый класс риска).
Можно классифицировать параметры оценки модели следующим образом:
Точность: Точность модели отражает долю правильных прогнозов - в непрерывном случае, ее минимальный остаток, и в дискретных, правильность прогноза класса, минимальный остаток в непрерывных случаях или несколько неверных классификаций в дискретных случаях подразумевает более высокую точность и лучшую модель.
Выигрыши: статистика получения дает нам представление о производительности самой модели. Сравнивается модель вывода с результатом, который получен без использования модели (или с помощью случайной модели). Таким образом можно сравнить модель с случайной моделью, которая дает случайный исход. При сравнении двух моделей предпочтение отдается модели с более высокой статистикой прироста в определенном процентиле.
Аккредитация: Аккредитация модели отражает достоверность модели для фактического использования. Этот подход гарантирует, что данные, на которых применяется модель, аналогична данным для обучения. Индекс устойчивости выборки является одной из мер для обеспечения аккредитации перед использованием модели. Индекс устойчивости выборки - это мера, чтобы выяснить, будет ли набор данных по модельной подготовке относительно данных, когда используется модель, или выборка стабильны относительно функций, используемых в модели. Значение индекса варьируется от 0 до 1, с высокими значениями, указывающими на большее сходство между предикторами в двух наборах. Стабильная популяция подтверждает использование модели для прогнозирования.
Стабильность выборки редко игнорируется при тестировании производительности модели на различных наборах данных. Идея состоит в том, чтобы гарантировать, что набор данных тестирования совпадает с набором данных обучения. Если это так, то модель производительности дает представление о том, насколько хорошо выполнена модель. В противном случае полученные результаты производительности модели бесполезны
Разделим данные выборки на две части, скажем, Set 1 и Set 2. 1 - в качестве данных для обучения 2 - в качестве данных для тестирования.
#Create set 1 and set 2 : 2/3 данных на set 1 и остальные 1/3 на set 2
summary(Data_House_Price$HousePrice)
Min. 1st Qu. Median Mean 3rd Qu. Max.
34900 127500 159000 181300 213200 755000
set_1 <-Data_House_Price[1:floor(nrow(Data_House_Price)*(2/3)),]$HousePrice
summary(set_1)
Min. 1st Qu. Median Mean 3rd Qu. Max.
34900 128800 160000 180800 208900 755000
set_2 <-Data_House_Price[floor(nrow(Data_House_Price)*(2/3) +1):nrow(Data_
House_Price),]$HousePrice
summary(set_2)
Min. 1st Qu. Median Mean 3rd Qu. Max.
52500 127000 155000 182200 221000 745000
Для непрерывного случая мы можем проверить устойчивость, используя двух параметрический тест KS (непараметрический тест для сравнения совокупного распределения двух образцов).
Статистика KS дает наибольшее значение разницы между эмпирическим сравнением распространения двух образцов и, если оно высоко, то мы говорим, что два образца различны. С точки зрения стабильности выборки, тест сообщает, что модель производительности не может быть измерена на новых образцах, а базовый образец не из того же распределения, на котором была обучена модель.
Определим функцию ks_test (), которая строит Empirical Cumulative Distribution Function (ECDF) и отображает результат теста KS.
#Defining a function to give ks test result and ECDF plots on log scale
install.packages("rgr")
library(rgr)
ks_test <-function (xx1, xx2, xlab ="House Price", x1lab=deparse(substitute(xx1)), x2lab =deparse(substitute(xx2)), ylab ="Empirical
Cumulative Distribution Function",log =TRUE, main ="Empirical EDF Plots -
K-S Test", pch1 =3, col1 =2, pch2 =4, col2 =4, cex =0.8, cexp =0.9, ...)
{
temp.x <-remove.na(xx1)
x1 <-sort(temp.x$x[1:temp.x$n])
nx1 <-temp.x$n
y1 <-((1:nx1) -0.5)/nx1
temp.x <-remove.na(xx2)
x2 <-sort(temp.x$x[1:temp.x$n])
nx2 <-temp.x$n
y2 <-((1:nx2) -0.5)/nx2
xlim <-range(c(x1, x2))
if (log) {
logx <- "x"
if (xlim[1] <=0)
stop("\n Values cannot be .le. zero for a log plot\n")
}
else logx <- ""
plot(x1, y1, log = logx, xlim = xlim, xlab = xlab, ylab = ylab,
main = main, type ="n", ...)
points(x1, y1, pch = pch1, col = col1, cex = cexp)
points(x2, y2, pch = pch2, col = col2, cex = cexp)
temp <-ks.test(x1, x2)
print(temp)}
Здесь выполняется KS test на set_1 and set_2 и выводится ECDF.
#Perform K-S test on set_1 and set_2 and also display Empirical Cumulative
Distribution Plots
ks_test(set_1,set_2)
Здесь показаны результаты проверки гипотезы для теста KS. Это тест Колмогорова-Смирнова для проверки гипотезы о том, что оба распределения были получены из одного и того же базового распределения.
Two-sample Kolmogorov-Smirnov test
data: x1 and x2
D = 0.050684, p-value = 0.5744
alternative hypothesis: two-sided
Тест Колмогорова - Смирнова для гипотезы, которую оба распределения были привлечены из того же основного распределения.
Тестовые данные: x1 и x2 d = 0,050684, p-значение = 0,050684, p-значение = 0.5744
Альтернативная гипотеза: двусторонняя. Значение p составляет более 0,05, и мы не отказываемся от нулевой гипотезы. Таким образом, мы далее нужно тестировать модель производительности на тестовых данныех. Глядя на график эмпирической кумулятивной функции распределения (ECDF), можно видеть, что ECDF для обоих образцов одинаково, и, следовательно, они происходят из одного и того же распределения выборки.
Как выглядит результат, когда выборка нестабильна? Пусть набор 2 был подвержен изменениям, где дома были обложены дополнительным налогам местным органом и, следовательно, цены выросли. Может ли существующая модель все еще хорошо работать на этом новом наборе?
#Manipulate the set 2
set_2_new <-set_2*exp(set_2/100000)
#Снова проведем k-s тест
ks_test(set_1,set_2_new)
Теперь построим ECDF для набора 1 и набора 2 и сравним с предыдущим результатом.
Двухвыборочный Kolmogorov-Smirnov test
data: x1 and x2
D = 0.79957, p-value < 2.2e-16
alternative hypothesis: two-sided
P-значение KS теста составляет менее 0,05, и, следовательно, тест отвергает нулевую гипотезу: оба образца относятся к одной и той же выборке.
Визуально графики ECDF отличаются друг от друга. Следовательно, модель не может быть использована на новом наборе данных. .
Оценка модели для получения непрерывного результата
Распределение зависимых переменных является важным соображением при выборе методов для оценки моделей. Интуитивно, мы в конечном итоге сравниваем остаточное распределение (фактическое значение прогнозируемого значения) с нормальным распределением (то есть, случайным шумом) или каким-либо другим распределением на основе метрик, которые мы выбираем.
Рассчитаем некоторые основные метрики. Метрики имеют собственные достоинства и недостатки.
Установим модель линейной регрессии с переменными, доступными для прогноза цен дома.
# Create a model on Set 1 = Train data
linear_reg_model <-lm(HousePrice ~StoreArea +StreetHouseFront +BasementArea
+LawnArea +Rating +SaleType ,data=Data_House_Price[1:floor(nrow(Data_
House_Price)*(2/3)),])
summary(linear_reg_model)
Call:
lm(formula = HousePrice ~ StoreArea + StreetHouseFront + BasementArea + LawnArea + Rating + SaleType, data = Data_House_
Price[1:floor(nrow(Data_House_Price) * (2/3)), ])
Residuals:
Min 1Q Median 3Q Max
-432276 - 22901 -3239 17285 380300
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -8.003e+04 3.262e+04 -2.454 0.014387 *
StoreArea 5.817e+01 9.851e+00 5.905 5.48e-09 ***
StreetHouseFront 1.370e+02 8.083e+01 1.695 0.090578 .
BasementArea 2.362e+01 3.722e+00 6.346 3.96e-10 ***
LawnArea 7.746e-01 1.987e-01 3.897 0.000107 ***
Rating 3.540e+04 1.519e+03 23.300 < 2e-16 ***
SaleTypeFirstResale 1.012e+04 3.250e+04 0.311 0.755651
SaleTypeFourthResale -3.221e+04 3.678e+04 -0.876 0.381511
SaleTypeNewHouse -1.298e+04 3.190e+04 -0.407 0.684268
SaleTypeSecondResale -2.456e+04 3.248e+04 -0.756 0.449750
SaleTypeThirdResale -2.256e+04 3.485e+04 -0.647 0.517536
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error : 44860 on 701 degrees of freedom
Multiple R-squared: 0.7155, Adjusted R-squared: 0.7115
F-statistic: 176.3 on 10 and 701 DF, p-value: < 2.2e-16
Краткое описание модели показывает несколько особенностей:
• R-square для подогнанной модели составляет 71,5%, что является хорошей подгонкой модели.
• Переменная SaleType незначительна на всех уровнях (но мы сохранили ее в модели, поскольку считаем, что она является важным элементом цены на жилье).
• Значение p для F-теста общего критерия значимости меньше, чем 0,05, поэтому мы можем отвергнуть нулевую гипотезу и заключить, что данная модель обеспечивает лучшее соответствие, чем модель, основанная только на перехвате.
Теперь перейдем к показателям эффективности для непрерывной зависимой переменной.
1. Средняя абсолютная погрешность (MAE)
Средняя абсолютная погрешность или MAE - это один из самых основных показателей погрешности, используемых для оценки
модели. Это средний показатель/среднее значение абсолютной погрешности.
В статистике средняя абсолютная погрешность - это среднее значение абсолютных ошибок:

где fi - это прогноз, а yi - истинное значение.
#Создание тестовых данных (set 2)
test <-Data_House_Price[floor(nrow(Data_House_Price)*(2/3) +1):nrow(Data_House_Price),]
#Fit the linear regression model on this and get predicted values
predicted_lm <-predict(linear_reg_model,test, type="response")
actual_predicted <-as.data.frame(cbind(as.numeric(test$HOUSE_ID),as.
numeric(test$HousePrice),as.numeric(predicted_lm)))
names(actual_predicted) <-c("HOUSE_ID","Actual","Predicted")
#Find the absolute residual and then take mean of that
library(ggplot2)
#Plot Actual vs Predicted values for Test Cases
ggplot(actual_predicted,aes(x = actual_predicted$HOUSE_ID,color=Series)) +
geom_line(data = actual_predicted, aes(x = actual_predicted$HOUSE_ID,
y =Actual, color ="Actual")) +
geom_line(data = actual_predicted, aes(x = actual_predicted$HOUSE_ID, y =
Predicted, color ="Predicted")) +xlab('HOUSE_ID') +ylab('House Sale Price')
Из графика на рисунке видно, что фактическое значение очень близко к прогнозируемому.
#Remove NA from test, as we have not done any treatment for NA
actual_predicted <-na.omit(actual_predicted)
#First take Actual - Predicted, then take mean of absolute errors(residual)
mae <-sum(abs(actual_predicted$Actual -actual_predicted$Predicted))/nrow(ac
tual_predicted)
cat("Mean Absolute Error for the test case is ", mae)
Mean Absolute Error for the test case is 29570.3
По данным MAE, в среднем погрешность составляет 29, 570 долларов. Это эквивалентно тому, что в долларовом выражении
ожидается погрешность в 17% при среднем значении в 180, 921 доллар.
2. Среднеквадратичная ошибка или RMSE.Среднеквадратичная ошибка или RMSE - один из самых популярных показателей, используемых для оценки
моделей с непрерывными ошибками. Как следует из названия, это квадратный корень из среднеквадратичной
ошибки. Наиболее важной особенностью этой метрики является то, что ошибки взвешиваются путем
возведения их в квадрат. Среднее значение прогнозируемых значений для моментов времени t зависимой переменной регрессии yt и
вычисляется для n различных прогнозов как квадратный корень из среднего значения квадратов отклонений:
Важно понимать, как операции с метрикой изменяют интерпретацию
показателя. Предположим, что нашей зависимой переменной является цена на жилье, которая выражается в долларах.
Давайте посмотрим, как изменяются параметры метрики для интерпретации показателя.
Прогнозируемое и фактическое значения выражены в долларах, поэтому их разница равна ошибке, опять же в долларах.
Затем вы возводите ошибку в квадрат, и измерение преобразуется в доллар в квадрате. Мы не можем сравнить
значение в долларах в квадрате со значением в долларах. Извлекаем квадратный корень из этого значения, чтобы вернуть измерение к
долларов и теперь можем интерпретировать RMSE в долларовом выражении.
#As we have already have actual and predicted value we can directly calculate the RMSE value
rmse <-sqrt(sum((actual_predicted$Actualactual_predicted$Predicted)^2)/nrow(actual_predicted))
cat("Root Mean Square Error for the test case is ", rmse)
Root Mean Square Error for the test case is 44459.42
Теперь вы можете видеть, что ошибка увеличилась до 44 459 долларов. Это связано с тем, что мы
наказываем модель за далеко идущие прогнозы путем возведения ошибок в квадрат.
Как упоминалось ранее, если вы хотите использовать метрику для сравнения наборов данных или
моделей с разными масштабами, вам необходимо нормализовать ее. Мы
можем сделать то же самое с RMSE, нормализовав ее. Наиболее распространенным способом является деление
RMSE на диапазон или среднее значение:
Это значение называется нормализованным среднеквадратичным отклонением или ошибкой
(NRMSD или NRMSE) и обычно выражается в процентах. Низкое значение указывает на меньшую
остаточную дисперсию и, следовательно, является хорошей моделью.
3. R-Square
R-Square - популярный показатель, используемый в методах, основанных на линейной регрессии.
Статистики используют для определения R-квадрата подходящую терминологию - коэффициент детерминации.
Коэффициент детерминации дает представление о взаимосвязи между зависимой переменной (y) и набором независимых переменных (x). В
математической форме это отношение остаточной суммы квадратов к общей сумме квадратов.
Этот показатель также основан на остатке (метрике ошибки) с использованием фактических
и прогнозируемых значений.
#Model training data ( we will show our analysis on this dataset)
train <-Data_House_Price[1:floor(nrow(Data_House_Price)*(2/3)),.(HousePrice,StoreArea,StreetHouseFront,BasementArea,LawnArea,StreetHouseFront,LawnArea
,Rating,SaleType)];
#Omitting the NA from dataset
train <-na.omit(train)
# Get a linear regression model
linear_reg_model <-lm(HousePrice ~StoreArea +StreetHouseFront +BasementArea+LawnArea +StreetHouseFront +LawnArea +Rating +SaleType ,data=train)
# Show the function call to identify what model we will be working on
print(linear_reg_model$call)
lm(formula = HousePrice ~ StoreArea + StreetHouseFront + BasementArea +LawnArea + StreetHouseFront + LawnArea + Rating + SaleType,
data = train)
#System generated Square value
cat("The system generated R square value is " , summary(linear_reg_model)$r.squared)
The system generated R square value is 0.7155461
Текущая линейная модель имеет R-square, равный 0,72. Это может быть истолковано как то, что 72% процентный
разброс в цене дома “объясняется” изменениями предикторов StoreArea, Street House Front, Basement Area, Lawn Area, Street House Front, Lawn Area, Rating, и
Sale Type.
Вычислим R-square
#calculate Total Sum of Squares
SST <-sum((train$HousePrice -mean(train$HousePrice))^2);
#Calculate Regression Sum of Squares
SSR <-sum((linear_reg_model$fitted.values -mean(train$HousePrice))^2);
#Calculate residual(Error) Sum of Squares
SSE <-sum((train$HousePrice -linear_reg_model$fitted.values)^2);
Одним из важных соотношений, которые объединяют эти три суммы квадратов, является
SST = SSR + SSE
Вычисленный R-квадрат совпадает с выводом функции lm().SST = SSR + SSE
Будем использовать эти значения и получим R-square
Оценка модели: R-square для модели:
#calculate R-squared
R_Sqr <-1-(SSE/SST)
#Display the calculated R-Sqr
cat("The calculated R Square is ", R_Sqr)
The calculated R Square is 0.7155461
Можно видеть, что вычисленный R-square совпадает с выводом функции lm().
VI. Вероятностные методы оценки производительности модели
Рассмотрим два метода, соответствующие двум основным группам вероятностных инструментов, которыми располагают специалисты по обработке данных, оба метода основаны на ресемплинге:
• На основе моделирования: K-fold кросс-валидация (перекрестная проверка)
• На основе семплинга: Bootstrap-семплирование
Перекрестная проверка является одним из наиболее часто используемых методов оценки моделей и в последнее время стала признаваться более эффективным методом, чем показатели, основанные на остатках. Проблема с методами, основанными на остаточных данных, заключается в том, что нужно сохранить набор тестов. И этого набора недостаточно, чтобы сообщить, как модель будет вести себя с неизвестными данными. Таким образом, хотя методы обучения, тестирования и валидации хороши, вероятностное моделирование и выборка предоставляют нам больше возможностей для проверки модели.
Перекрестная валидация популярна в сообществе машинного обучения. Чем больше количество кластеров, тем лучше интерпретация
Шаги для выполнения перекрестной проверки:
Шаг 1: Разделите набор данных на k подмножеств.
Шаг 2: Обучите модель на k-1 подмножествах.
Шаг 3: Протестируйте модель на оставшемся подмножестве и вычислите
ошибку.
Шаг 4: Повторяйте шаги 1-3, пока все подмножества не будут использованы для
тестирования ровно по одному разу.
Шаг 5: Усредните ошибки, чтобы получить ошибку перекрестной проверки.
Преимущество этого метода заключается в том, что метод, с помощью которого вы создадите K-подмножеств не так важен по сравнению с ситуацией, когда вы делаете это и на train/test . Кроме того, этот метод гарантирует, что каждая точка данных попадет в тестовыйнабор ровно один раз и в обучающий набор k-1 раз. Дисперсия результирующейоценки уменьшается по мере увеличения k.
Недостатком этого метода является то, что модель должна быть рассчитана k раз, а затем для k-кратного повторения проводится тестирование, что означает более высокую стоимость вычислений (стоимость вычислений пропорциональна количеству к). В одном варианте данные разбиваются случайным образом и контролируетсяр азмер каждого сгиба. Преимущество этого заключается в том, что вы можете самостоятельно выбирать, насколько большим будет каждый набор тестов и сколько испытаний вы пройдете в среднем.
install.packages("caret")
library(caret)
install.packages("randomForest")
library(randomForest)
set.seed(917);
#Данные для обучения модели ( анализ основан на этом наборе данных)
train <-Data_House_Price[1:floor(nrow(Data_House_Price)*(2/3)),.(HousePrice,StoreArea,StreetHouseFront,BasementArea,LawnArea,StreetHouseFront,LawnArea
,Rating,SaleType)];
#Создание тестовых данных(set 2)
test <-Data_House_Price[floor(nrow(Data_House_Price)*(2/3) +1):nrow(Data_
House_Price),.(HousePrice,StoreArea,StreetHouseFront,BasementArea,LawnArea,S
treetHouseFront,LawnArea,Rating,SaleType)]
#Перемещение NA из dataset
train <-na.omit(train)
test <-na.omit(test)
k_10_fold <-trainControl(method ="repeatedcv", number =10, savePredictions=TRUE)
#Подогонка модель по folds, rmse используется в качестве метрики для подгонки модели
model_fitted <-train(HousePrice ~StoreArea +StreetHouseFront +BasementArea+LawnArea +StreetHouseFront +LawnArea +Rating +SaleType, data=train, family
= identity,trControl = k_10_fold, tuneLength =5)
#Вывод статистики по кросс-валидации
model_fitted
Random Forest
712 samples
6 predictor
No pre-processing
Resampling: Cross-Validated (10 fold, repeated 1 times)
Summary of sample sizes: 642, 640, 640, 641, 640, 641, ...
Resampling results across tuning parameters:
mtry RMSE Rsquared
2 40235.04 0.7891003
4 37938.62 0.7961153
6 38049.31 0.7927441
8 38132.67 0.7914360
10 38697.45 0.7858166
RMSE was used to select the optimal model using the smallest value.
The final value used for the model was mtry = 4.
Можно видеть, что модель, выбранная путем перекрестной проверки, имеет более высокий R2, чем та, которую мы создали ранее. Новый R-квадрат равен 80%, а старый был 72%. Также обратите внимание, что по умолчанию для выбора наилучшей модели используется показатель RMSE.
Bootstrap Sampling
Основываясь на случайных выборках из наших данных, мы попытаемся оценить модель и посмотреть, сможем ли мы уменьшить ошибку и получить высокопроизводительную модель. Когда мы используем эти методы в качестве метода оценки производительности, можно заметить, что мы уже настроили модель, т.е. предикторы, и пытаемся определить, что дает наилучшую производительность и в какой степени.
Чтобы показать пример bootstrap, расширим то, что было продемонстрировано для перекрестной проверки.
Возьмем образцы в количестве 10 (т.е. загруженные 10 образцов).
boot_10s <-trainControl(method ="boot", number =10, savePredictions =TRUE)
Fit the model on bootstraps and use rmse as metric to fit the model
model_fitted <-train(HousePrice ~StoreArea +StreetHouseFront +BasementArea
+LawnArea +StreetHouseFront +LawnArea +Rating +SaleType, data=train,
family = identity,trControl = boot_10s, tuneLength =5)
Вывод статистики boost raped model
model_fitted
Random Forest
712 samples
6 predictor
No pre-processing
Resampling: Bootstrapped (10 reps)
Summary of sample sizes: 712, 712, 712, 712, 712, 712, ...
Resampling results across tuning parameters:
mtry RMSE Rsquared
2 40865.52 0.7778754
4 38474.68 0.7871019
6 38818.70 0.7819608
8 39540.90 0.7742633
10 40130.45 0.7681462
RMSE использовался для выбора оптимальной модели через наименьшее значение.
Конечным значением для модели, было mtry = 4.
В случае с bootstrap можно видеть, что наилучшая модель имеет R2, равный 79%, что выше, чем 72% в предыдущем случае, но меньше, чем при 10-кратной перекрестной проверке. Важно отметить, что выборки bootstrap запускаются снова и снова для оценки модели, но перекрестная проверка сохраняет исключительность подмножеств в каждом запуске. Вероятностные методы сложны и их трудно понять. Рекомендуется, чтобы ими пользовался только опытный специалист по обработке данных, поскольку для проведения этих экспериментов требуется глубокое понимание алгоритма машинного обучения и умение правильно интерпретировать их.