Porównaj R-kwadrat z dwóch różnych modeli Lasu Losowego

10

Używam pakietu randomForest w R do opracowania losowego modelu lasu w celu wyjaśnienia ciągłego wyniku w „szerokim” zestawie danych z większą liczbą predyktorów niż próbek.

W szczególności dopasowuję jeden model RF, umożliwiając procedurze wybranie zestawu ~ 75 zmiennych predykcyjnych, które moim zdaniem są ważne.

Testuję, jak dobrze ten model przewiduje rzeczywisty wynik dla zarezerwowanego zestawu testowego, wykorzystując podejście opisane tutaj wcześniej , a mianowicie:

... lub w R:

1 - sum((y-predicted)^2)/sum((y-mean(y))^2)

Ale teraz mam dodatkowe ~ 25 zmiennych predykcyjnych, które mogę dodać. Przy użyciu zestawu ~ 100 predyktorów, R² jest wyższy. Chcę to przetestować statystycznie, innymi słowy, używając zestawu ~ 100 predyktorów, czy model testuje znacznie lepiej w testowaniu danych niż dopasowanie modelu przy użyciu ~ 75 predyktorów. To znaczy, że R² od testowania dopasowania modelu RF w pełnym zbiorze danych jest znacznie wyższy niż R² od przetestowania modelu RF w zredukowanym zbiorze danych.

Jest to dla mnie ważne, aby to przetestować, ponieważ są to dane pilotażowe, a zdobycie dodatkowych 25 predyktorów było kosztowne i muszę wiedzieć, czy powinienem zapłacić za pomiar tych predyktorów w większym badaniu uzupełniającym.

Próbuję wymyślić jakieś podejście do ponownego próbkowania / permutacji, ale nic nie przychodzi mi do głowy.

Stephen Turner
źródło

Odpowiedzi:

8

Walidacja krzyżowa! Użyj funkcji pociągu w karetce, aby dopasować 2 modele. Użyj jednej wartości mtry (taka sama dla obu modeli). Caret zwróci ponownie oszacowane wartości RMSE i .R2

Patrz strona 3 winiety karetki (również w pełnej instrukcji obsługi )

Zach
źródło
Zgadzam się, z wyjątkiem twojego pominięcia, że ​​OP powinien używać skorygowanego kwadratu R, ponieważ do tego jest przeznaczony. Modele mają takie same Y, ale różne zestawy predyktorów, dlatego konieczne jest dostosowanie do kwadratu R, aby karać za różnicę w wydanych stopniach swobody / złożoności modelu. Innym problemem, który widzę, jest potencjalnie problem z wielkością próbki; OP wymagałoby MASYWNEJ wielkości próbki, aby mieć jakąkolwiek prawdziwą nadzieję, że to nie jest po prostu zbyt duże, nawet w przypadku CV.
LSC
@LSC Powiedziałbym, że gdyby zawierał dodatkowy zestaw danych (nieużywany do selekcji), mogliby używać R2 bez korekty, ponieważ jest to po prostu znormalizowany RMSE. Zgadzam się, że potrzebowaliby do tego dość dużego zestawu danych.
Zach
nowe dane lub stare, wszystkie pozostałe stałe, stawianie 100 terminów w modelu względem 25 będzie miało wyższy nieskorygowany kwadrat R w porównaniu do kwadratu R z modelu predykcyjnego 25. Jest to łatwo widoczne przy obliczaniu sumy błędów kwadratowych między nimi (więcej warunków to niższe SSE, wszystkie pozostałe są takie same). Myślę, że ludzie często zapominają, że więcej terminów nigdy nie zmniejszy kwadratu R, ale jeśli śmierdzą w stosunku do swojej wartości, mogą zmniejszyć skorygowany R-kwadrat, co jest lepszym miernikiem, którego można użyć, aby spojrzeć na huk za złotówkę.
LSC
„więcej terminów nigdy nie zmniejszy kwadratu R” <- To stwierdzenie jest fałszywe, gdy oblicza R2 z próbki.
Zach
Jak wspomniałem, zwracam na to uwagę, ponieważ wiele osób zadających te pytania nie pamięta tego pomysłu. Myślę, że zrozumienie, dlaczego dzieje się tak w próbce i może nie zawierać nowych danych, jest ważne, aby zrozumieć, co i jak zoptymalizować coś w pierwotnym równaniu.
LSC
4

Zgadzam się z Zachem, że najlepszym pomysłem jest walidacja krzyżowa obu modeli, a następnie porównanie , na przykład poprzez zebranie wartości z każdej fałdy i porównanie powstałych wektorów z testem Wilcoxona (sparowany dla k-krotnie, niesparowany dla losowego CV).R2

Opcja boczna polega na wybraniu wszystkich odpowiednich funkcji, co powiedziałoby, które atrybuty mają szansę być bardzo przydatne w klasyfikacji - a zatem te drogie atrybuty są warte swojej ceny. Można to zrobić na przykład za pomocą owijarki RF Boruta .

Społeczność
źródło
dla sparowanego testu zakładam, że 2 modele pasują do tych samych fałd? Czy więc k wierszy macierzy to fałdy, a dwie kolumny to model 1 i model 2?
B_Miner
@B_Miner Dokładnie.
1

Możesz myśleć w kategoriach znaczenia praktycznego, a nie statystycznego (lub obu). Przy wystarczającej ilości danych można znaleźć rzeczy znaczące statystycznie, które nie będą miały rzeczywistego wpływu na wykorzystanie. Pamiętam, jak analizowałem kiedyś model, w którym interakcje 5-kierunkowe były istotne statystycznie, ale kiedy prognozy z modelu obejmujące wszystko aż do 5-drogowych interakcji zostały porównane z prognozami z modelu obejmującymi tylko interakcje 2-drogowe i główne efekty , największa różnica wynosiła mniej niż 1 osoba (odpowiedzią była liczba osób, a wszystkie interesujące wartości były od 0). Tak więc dodatkowa złożoność nie była tego warta. Spójrz więc na różnice w swoich prognozach, aby zobaczyć, czy różnice są wystarczające, aby uzasadnić dodatkowy koszt, jeśli nie, to po co w ogóle szukać znaczenia statystycznego? Jeśli różnice są wystarczająco duże, aby uzasadnić koszt, jeśli są rzeczywiste, to popieram pozostałe sugestie dotyczące stosowania weryfikacji krzyżowej.

Greg Snow
źródło
1

Jedną z opcji byłoby utworzenie przedziału ufności dla średniego błędu kwadratu. Użyłbym średniego błędu kwadratu zamiast ponieważ mianownik jest taki sam dla obu modeli. Artykuł Dudoita i van der Laana ( artykuł i artykuł roboczy ) zawiera ogólne twierdzenie o konstrukcji przedziału ufności dla dowolnego estymatora ryzyka. Korzystając z przykładu z danych tęczówki, oto trochę kodu R tworzącego 95% przedział ufności przy użyciu metody:R2

library(randomForest)
data(iris)
set.seed(42)

# split the data into training and testing sets
index <- 1:nrow(iris)
trainindex <- sample(index, trunc(length(index)/2))
trainset <- iris[trainindex, ]
testset <- iris[-trainindex, ]

# with species
model1 <- randomForest(Sepal.Length ~ Sepal.Width + Petal.Length +
   Petal.Width + Species, data = trainset)
# without species
model2 <- randomForest(Sepal.Length ~ Sepal.Width + Petal.Length + 
   Petal.Width, data = trainset)

pred1 <- predict(model1, testset[, -1])
pred2 <- predict(model2, testset[, -1])

y <- testset[, 1]
n <- length(y)

# psi is the mean squared prediction error (MSPE) estimate
# sigma2 is the estimate of the variance of the MSPE
psi1 <- mean((y - pred1)^2)
sigma21 <- 1/n * var((y - pred1)^2) 
# 95% CI:
c(psi1 - 1.96 * sqrt(sigma21), psi1, psi1 + 1.96 * sqrt(sigma21))

psi2 <- mean((y - pred2)^2)
sigma22 <- 1/n * var((y - pred2)^2) 
# 95% CI:
c(psi2 - 1.96 * sqrt(sigma22), psi2, psi2 + 1.96 * sqrt(sigma22))

Metodę można również rozszerzyć, aby działała w ramach walidacji krzyżowej (nie tylko podział próby jak pokazano powyżej).

Eric
źródło
0

Ponieważ używasz już randomForestpo weryfikacji krzyżowej, możesz wyemitować obliczenia wybranego dopasowania dopasowania wartości ważności predyktora.

> require(randomForest)
> rf.fit = randomForest(Species~.,data=iris,importance=TRUE)
> rf.fit$importance
                  setosa   versicolor   virginica MeanDecreaseAccuracy MeanDecreaseGini
Sepal.Length 0.036340893  0.021013369 0.032345037          0.030708732         9.444598
Sepal.Width  0.005399468 -0.002131412 0.007499143          0.003577089         2.046650
Petal.Length 0.319872296  0.297426025 0.290278930          0.299795555        42.494972
Petal.Width  0.343995456  0.309455331 0.277644128          0.307843300        45.286720
mrbcuda
źródło
0

Widzę, że to pytanie zostało zadane dawno temu; jednak żadna odpowiedź nie wskazuje na znaczące niedociągnięcia i nieporozumienia w tym pytaniu.

Proszę zanotować:

  1. Oświadczasz, że R ^ 2 = ESS / TSS = 1 - RSS / TSS. Jest to prawdą tylko w kontekście liniowym. Równość TSS = RSS + ESS jest prawdziwa tylko w regresji liniowej z przechwytywaniem. Dlatego nie można zamiennie używać tych definicji dla losowych lasów. Dlatego RMSE i podobne są bardziej typowymi funkcjami strat.

  2. Co ważniejsze dla celów statystycznych: R ^ 2 ma nieznany rozkład (także w ustawieniu liniowym). Oznacza to, że testowanie hipotezy o znaczeniu statystycznym przy użyciu R ^ 2 nie jest tak proste. Cross-Validation, jak wspomniał Zach , jest dobrym wyborem.

Jeśli chodzi o odpowiedź użytkownika88: Poprawna weryfikacja za pomocą testu Wilcoxona jest poprawnym podejściem. Niedawny artykuł wykorzystuje test rang podpisanych przez Wilcoxona i testy Friedmana do porównywania różnych metod i algorytmów.

tobiaspk1
źródło