Różnica między statsmodel OLS a regresją liniową scikit

16

Mam pytanie dotyczące dwóch różnych metod z różnych bibliotek, które wydają się wykonywać tę samą pracę. Próbuję stworzyć model regresji liniowej.

Oto kod, który używam biblioteki statsmodel z OLS:

X_train, X_test, y_train, y_test = cross_validation.train_test_split(x, y, test_size=0.3, random_state=1)

x_train = sm.add_constant(X_train)
model = sm.OLS(y_train, x_train)
results = model.fit()

print "GFT + Wiki / GT  R-squared", results.rsquared

Ten wydruk GFT + Wiki / GT R-kwadrat 0.981434611923

a drugi to scikit learn library Metoda modelu liniowego:

model = LinearRegression()
model.fit(X_train, y_train)

predictions = model.predict(X_test)

print 'GFT + Wiki / GT R-squared: %.4f' % model.score(X_test, y_test)

Ten wydruk GFT + Wiki / GT R-kwadrat: 0,8543

Moje pytanie brzmi: obie metody wypisują nasz wynik R ^ 2, ale jedna wypisuje 0,98, a druga 0,85.

Z mojego zrozumienia, OLS działa z zestawem danych szkoleniowych. Więc moje pytania

  • Czy istnieje sposób, który działa z zestawem danych testowych z OLS?
  • Czy wynik zestawienia danych tranzytowych ma jakieś znaczenie (w OLS nie korzystaliśmy z zestawu danych testowych)? Z mojej dotychczasowej wiedzy musimy korzystać z danych testowych.
  • Jaka jest różnica między OLS a regresją liniową scikit. Którego używamy do obliczania wyniku modelu?

Dziękuję za wszelką pomoc.

Batuhan Bardak
źródło

Odpowiedzi:

15

Po pierwsze pod względem użytkowania. Prognozę można uzyskać w statsmodels w bardzo podobny sposób jak w scikit-learn, z tym wyjątkiem, że używamy instancji wyników zwróconej przezfit

predictions = results.predict(X_test)

Biorąc pod uwagę prognozy, możemy obliczyć statystyki oparte na błędzie prognozy

prediction_error = y_test - predictions

Istnieje osobna lista funkcji do obliczania poprawności statystyk predykcyjnych, ale nie jest ona zintegrowana z modelami, ani nie obejmuje R do kwadratu. (Nigdy nie słyszałem o R podniesionym do kwadratu używanym dla danych poza próbką). Obliczenie ich wymaga nieco więcej pracy użytkownika, a statsmodels nie ma tego samego zestawu statystyk, szczególnie nie dla klasyfikacji lub modeli ze zmienną binarną.

Do twoich pozostałych dwóch punktów:

Regresja liniowa jest w swojej podstawowej formie taka sama w statsmodels i scikit-learn. Jednak implementacja jest różna, co może dawać różne wyniki w przypadkach skrajnych, a scikit learn ma ogólnie większe wsparcie dla większych modeli. Na przykład statsmodels używa obecnie rzadkich macierzy w bardzo niewielu częściach.

Najważniejszą różnicą jest otaczająca infrastruktura i przypadki użycia, które są bezpośrednio obsługiwane.

Statsmodels podąża w dużej mierze za tradycyjnym modelem, w którym chcemy wiedzieć, jak dobrze dany model pasuje do danych i jakie zmienne „wyjaśniają” lub wpływają na wynik lub jaka jest wielkość efektu. Scikit-learn postępuje zgodnie z tradycją uczenia maszynowego, w której głównym obsługiwanym zadaniem jest wybranie „najlepszego” modelu predykcji.

W związku z tym nacisk na funkcje wspierające statsmodels polega na analizie danych treningowych, które obejmują testy hipotez i miary dopasowania, podczas gdy nacisk na infrastrukturę wspierającą w scikit-learn jest na wybór modelu w przypadku braku zgodności prognozowanie próbek, a zatem walidacja krzyżowa „danych testowych”.

Wskazuje to na rozróżnienie, ponieważ nadal istnieje spore nakładanie się również w użyciu. statsmodels wykonuje również prognozy i dodatkowo prognozuje w kontekście szeregów czasowych. Ale kiedy chcemy przeprowadzić cross-validation dla predykcji w statsmodels, obecnie nadal często łatwiej jest ponownie użyć konfiguracji cross-validation scikit-learn wraz z modelami estymacji statsmodels.

Josef
źródło
Hmm, próbuję użyć modelu ARMA ze statsmodels.tsa, ale interfejs przewidywania jest tam zupełnie inny. Czy wiesz jak karmić to dane testowe?
Ef.
1
To inne pytanie i musisz spojrzeć na dokumentację lub przykłady. Prognozowanie w modelach szeregów czasowych jest całkiem inne ze względu na sekwencyjną strukturę czasu, a prognozowanie jest prognozowaniem wartości w kolejnych przedziałach czasowych.
Josef
Masz rację, to kolejne pytanie, ale dzięki za wyjaśnienie. Przeczytałem dokumentację i jakoś ją uruchomiłem. Ale nadal nie rozumiem, dlaczego interfejs jest inny. Zwłaszcza, dlaczego nie można zapewnić wektorów cech i uzyskać prognoz (prognoz).
Ef.
ARMA i SARIMAX umożliwiają uwzględnienie zmiennych objaśniających exogw szacowaniu i prognozowaniu.
Josef
To pytanie na Stackowerlow dotyczy różnicy w interfejsach: stackoverflow.com/questions/41045752/...
David Dale
1

W modelu OLS używasz danych treningowych do dopasowania i przewidywania.

W modelu LinearRegression używasz danych treningowych do dopasowania i testowania danych w celu przewidywania, dlatego różne wyniki w wynikach R2.

Jeśli weźmiesz dane testowe w modelu OLS, powinieneś mieć takie same wyniki i niższą wartość

Vitali Mueller
źródło
1

Napotkałem podobny problem, w którym OLS podaje różne wartości Rsquared i Skorygowane Rsquared w porównaniu z modelem regresji liniowej Sklearn.

Powód: OLS nie bierze pod uwagę, domyślnie, współczynnika przechwytywania i buduje model bez niego, a Sklearn bierze to pod uwagę przy budowaniu modelu.

Rozwiązanie: Dodaj kolumnę 1 do zestawu danych i dopasuj model do OLS, a otrzymasz prawie takie same Rsquared i Adj. Wartości Rsquared dla obu modeli.

Praveen
źródło