Przeczytałem o funkcjach strat teoretycznie, a także jak budować modele regresji oparte na nich w R.

Mogę zastosować wszystkie modele regresji oparte na różnych funkcjach strat w programowaniu R, z wyjątkiem funkcji utraty Log-CosH.

Na przykład, chciałbym zbudować model regresji liniowej na 5-krotnych podzbiorach , a następnie wyodrębnij współczynniki i obliczają jednostki i zagregowane wariancję w następujący sposób.

data = read.csv("train.csv") # "critical_temp" is the dependent variable. 
data_nom_df=as.data.frame(scale(data))#Normalization   
#Cross Validation
set.seed(12345)
k = 5 
folds <- createFolds(data_nom_df$critical_temp, k = k, list = TRUE, returnTrain = TRUE)
## Ordinary Least Square regression

#block A
lm = list()
for (i in 1:k) {
  lm[[i]] = lm(critical_temp~ ., 
               data = data_nom_df[folds[[i]],])
}

#block B
lm_coef = list()
lm_coef_var = list()
for(j in 1:(lm[[1]]$coefficients %>% length())){
  for(i in 1:k){
    lm_coef[[i]] = lm[[i]]$coefficients[j] 
    lm_coef_var[[j]] = lm_coef %>% unlist() %>% var()
  } 
}

#block C
lm_var = unlist(lm_coef_var)
lm_df = cbind(coefficients = lm[[1]]$coefficients %>% names() %>% as.data.frame()
              , variance = lm_var %>% as.data.frame()) 
colnames(lm_df) = c("coefficients", "variance_lm")
lm_df

#block D
lm_var_sum = sum(lm_var)
lm_var_sum

To samo dla reszty modeli regresji. Nie znajduję jednak żadnego kodu ani pakietu do zastosowania modelu regresji na podstawie funkcji utraty LOG-COSH w R.

Czy możesz poprowadzić mnie do dowolnego źródła, które pomogłoby mi rozwiązać ten problem.

1
jeza 28 listopad 2019, 15:48

1 odpowiedź

Najlepsza odpowiedź

Można to zrobić z pierwszych zasad. Zwróć również uwagę na istnienie funkcji logcosh w pakiecie Limma, który może być stosowany zamiast log(cosh(.)), jeśli masz trudności numeryczne.

f <- function(b) with(cars, sum(log(cosh(dist - b[1] - b[2] * speed))))
fm0 <- lm(dist ~ speed, cars)
res <- optim(coef(fm0), f, method = "BFGS")
str(res)
## List of 5
##  $ par        : Named num [1:2] -12.82 3.47
##   ..- attr(*, "names")= chr [1:2] "(Intercept)" "speed"
##  $ value      : num 532
##  $ counts     : Named int [1:2] 28 10
##   ..- attr(*, "names")= chr [1:2] "function" "gradient"
##  $ convergence: int 0
##  $ message    : NULL

Grafika

# the black line is the ordinary least squares regression line and 
# the red line is the log cosh regression line
plot(cars)
abline(fm0)
yfit <- res$par[1] + res$par[2] * cars$speed
lines(cars$speed, yfit, col = "red")

screenshot

DODANY

Należy pamiętać, że optymalizacja może być również zapisywana tak, która może być przydatna, jeśli masz wiele niezależnych zmiennych.

fm0 <- lm(dist ~ speed, cars)
X <- model.matrix(fm0)
f <- function(b) with(cars, sum(log(cosh(dist - X %*% b))))
res <- optim(coef(fm0), f, method = "BFGS")
res

Dający:

$par
(Intercept)       speed 
 -12.816190    3.469536 

$value
[1] 531.5872

$counts
function gradient 
      28       10 

$convergence
[1] 0

$message
NULL
3
G. Grothendieck 2 grudzień 2019, 14:13