Подходящая модель дает NULL - PullRequest
       90

Подходящая модель дает NULL

0 голосов
/ 31 декабря 2018

Я хочу тренировать модели, используя разные алгоритмы.Например, эта работа:

dd=read.arff("china.arff")
model=lm(Effort~ ., data=dd)
fitted(model)

Но следующий код дает NULL для того же набора данных

install.packages("neuralnet")
library(neuralnet)
model=neuralnet(Effort~N_effort+Duration, data=dd, 
                   hidden=1,err.fct="ce", linear.output=FALSE)
fitted(model)

// Дает NULL

Аналогичный результат показан с randomForestмодель

Не возможно, чтобы в этих моделях не было ошибок, так в чем же проблема?

structure(list(Output = c(150, 98, 27, 60, 69, 19, 14, 17, 64, 
60, 27, 17, 41, 40, 12, 38, 57, 20, 66, 112, 28, 68, 15, 15), 
    Inquiry = c(75, 70, 0, 20, 1, 0, 0, 15, 14, 20, 29, 8, 16, 
    20, 13, 24, 12, 24, 13, 21, 4, 0, 6, 0), RawFPcounts = c(1750, 
    1902, 535, 660, 478.89, 377.33, 256.25, 262.73, 715.79, 690.43, 
    465.45, 298.67, 490.59, 802.35, 220, 487.62, 550.91, 363.64, 
    1073.91, 1310, 476.19, 694, 189.52, 273.68), AdjFP = c(1750, 
    1902, 428, 759, 431, 283, 205, 289, 680, 794, 512, 224, 417, 
    682, 209, 512, 606, 400, 1235, 1572, 500, 694, 199, 260), 
    Effort = c(102.4, 105.2, 11.1, 21.1, 28.8, 10, 8, 4.9, 12.9, 
    19, 10.8, 2.9, 7.5, 12, 4.1, 15.8, 18.3, 8.9, 38.1, 61.2, 
    3.6, 11.8, 0.5, 6.1)), class = "data.frame", row.names = c(NA, 
-24L))

1 Ответ

0 голосов
/ 03 января 2019

Насколько я знаю, fitted не широко используется в R (за исключением, возможно, в контексте моделей GLM);честно говоря, я никогда не слышал о функции раньше (и я программирую на R уже ~ 7 лет).

Так что, не должно быть сюрпризом, что вне контекста (обобщенный) в линейных моделях, т. е. в таких моделях, как нейронные сети или случайные леса, метод фактически не реализован, и он просто возвращает значение NULL.

Хорошая новость заключается в том, что вы спрашиваете себя , почему именно вы хотели быиспользовать fitted?Потому что, на практике и в широком смысле, fitted примерно эквивалентно predict, по крайней мере для простых линейных моделей:

df <- data.frame(income=c(5,3,47,8,6,5),
               won=c(0,0,1,1,1,0),
               age=c(18,18,23,50,19,39),
               home=c(0,0,1,0,0,1))

md1 <- lm(income ~ age + home, data=df) # linear model



fitted(md1)
        1         2         3         4         5         6 
 7.893273  7.893273 28.320749 -1.389725  7.603179 23.679251 

predict(md1)
        1         2         3         4         5         6 
 7.893273  7.893273 28.320749 -1.389725  7.603179 23.679251 

, тогда как в случае GLM вам просто нужно указать type='response', когдапрогнозируя, чтобы две функции снова возвращали практически идентичные результаты:

md2 <- glm(factor(won) ~ age + home, data=df, family=binomial(link="logit")) #glm

fitted(md2)
        1         2         3         4         5         6 
0.4208590 0.4208590 0.4193888 0.7274819 0.4308001 0.5806112 

predict(md2)
         1          2          3          4          5          6 
-0.3192480 -0.3192480 -0.3252830  0.9818840 -0.2785876  0.3252830 

predict(md2, type='response')
        1         2         3         4         5         6 
0.4208590 0.4208590 0.4193888 0.7274819 0.4308001 0.5806112 

Итак, в то время как fitted для модели случайного леса дает действительно NULL:

library(randomForest)
rf <- randomForest(income ~ age + home, data=df)
fitted(rf)
NULL

вы можетевозможно получить требуемые результаты просто с помощью predict:

predict(rf)
        1         2         3         4         5         6 
 9.748170 11.463800  5.186755 13.905696  8.791710 29.000931 

Следующие потоки также могут быть полезны:

Есть ли разница между функциями R fit () и Foret()?

Нахождение подогнанных и прогнозируемых значений для статистической модели

...