Pandy / Statsmodel / Scikit-learn

41
  1. Czy Pandy, Statsmodels i Scikit-learning uczą się różnych wdrożeń uczenia maszynowego / operacji statystycznych, czy też wzajemnie się uzupełniają?

  2. Który z nich ma najbardziej kompleksową funkcjonalność?

  3. Który jest aktywnie rozwijany i / lub wspierany?

  4. Muszę wdrożyć regresję logistyczną. Wszelkie sugestie, które z nich powinienem zastosować?

Nik
źródło

Odpowiedzi:

33
  1. Scikit-learn (sklearn) to najlepszy wybór do uczenia maszynowego, spośród trzech wymienionych. Chociaż Pandy i Statsmodele zawierają pewne algorytmy uczenia predykcyjnego, są one ukryte / jeszcze nie są gotowe do produkcji. Często, ponieważ autorzy będą pracować nad różnymi projektami, biblioteki są komplementarne. Na przykład ostatnio Ramki danych Pandas zostały zintegrowane z Statsmodels. Związek między sklearn a Pandami nie jest (jeszcze) obecny.

  2. Zdefiniuj funkcjonalność. Wszystkie biegną. Jeśli masz na myśli to, co jest najbardziej przydatne, zależy to od twojej aplikacji. Na pewno dałbym Pandas +1 tutaj, ponieważ dodało świetną nową strukturę danych do Pythona (ramki danych). Pandy prawdopodobnie mają również najlepsze API.

  3. Wszystkie są aktywnie wspierane, choć powiedziałbym, że Pandas ma najlepszą bazę kodu. Sklearn i Pandy są bardziej aktywne niż Statsmodels.

  4. Oczywistym wyborem jest Sklearn. Jest to łatwe i jasne, jak to zrobić.

    from sklearn.linear_models import LogisticRegression as LR
    logr = LR()
    logr.fit( X, Y )
    results = logr.predict( test_data)
    
Cam.Davidson.Pilon
źródło
5
Przeczytaj dłuższe wyjaśnienie poniżej!
dartdog
4
Ta odpowiedź pomija wyjaśnienie, że Pandy służą głównie do manipulacji danymi (np. Indeksowanie, wybieranie, agregowanie), podczas gdy pozostałe dwa służą do budowania modeli (np. Do przewidywania lub wnioskowania).
Nathan Gould
Używam sklearn od ponad roku i było świetnie, teraz, gdy projekt się rozwija, czuję potrzebę korzystania z doskonałych struktur danych Pandas, więc myślę, że uzupełniają się one w dłuższej perspektywie.
dashy
Być może ostatnio się to zmieniło, ale w instrukcji import powinno być linear_model(pojedyncze), a nie linear_models.
Vishal,
75

Chciałbym zakwalifikować i nieco wyjaśnić przyjętą odpowiedź.

Te trzy pakiety wzajemnie się uzupełniają, ponieważ obejmują różne obszary, mają różne główne cele lub podkreślają różne obszary uczenia maszynowego / statystyki.

  • pandy to głównie pakiet do obsługi i obsługi danych bezpośrednio.
  • scikit-learn to uczenie maszynowe z naciskiem na modelowanie predykcyjne z często dużymi i rzadkimi danymi
  • statsmodels wykonuje „tradycyjne” statystyki i ekonometrię, ze znacznie większym naciskiem na estymację parametrów i testy (statystyczne).

statsmodels ma zależność pand, pandas opcjonalnie używa statsmodels do niektórych statystyk. statsmodels patsyzapewnia interfejs podobny do modeli jak R.

Modele między scikit-learn i statsmodels pokrywają się, ale z różnymi celami. patrz na przykład Dwie kultury: statystyki czy uczenie maszynowe?

trochę więcej o statsmodels

statsmodels ma najniższą aktywność rozwojową i najdłuższy cykl uwalniania spośród wszystkich trzech. statsmodels ma wielu współpracowników, ale niestety wciąż tylko dwóch „opiekunów” (jestem jednym z nich).

Rdzeń statsmodels jest „gotowy do produkcji”: modele liniowe, solidne modele liniowe, uogólnione modele liniowe i modele dyskretne istnieją już od kilku lat i są weryfikowane względem Staty, a R. statsmodels ma również część analizy szeregów czasowych obejmującą AR, ARMA i Regresja VAR (wektorowa autoregresja), które nie są dostępne w żadnym innym pakiecie Pythona.

Kilka przykładów pokazujących pewne specyficzne różnice między podejściem uczenia maszynowego w scikit-learn a podejściem statystycznym i ekonometrycznym w statsmodels:

Prosta regresja liniowa OLS, ma dużą liczbę analiz po oszacowaniu http://statsmodels.sourceforge.net/devel/generated/statsmodels.regression.linear_model.OLSResults.html w tym testy parametrów, wartości odstających i testy specyfikacji http: / /statsmodels.sourceforge.net/devel/stats.html#residual-diagnostics-and-specification-tests

Regresję logistyczną można wykonać w modelach statystycznych jako Logitmodel dyskretny lub jako rodzina w uogólnionym modelu liniowym ( GLM). http://statsmodels.sourceforge.net/devel/glm.html#module-reference

GLMobejmuje zwykłe rodziny, dyskretne modele zawiera oprócz Logittakże Probit, wielomianu i liczyć regresji.

Logit

Korzystanie Logitjest tak proste, jak to http://statsmodels.sourceforge.net/devel/examples/generated/example_discrete.html

>>> import statsmodels.api as sm
>>> x = sm.add_constant(data.exog, prepend=False)
>>> y = data.endog

>>> res1 = sm.Logit(y, x).fit()
Optimization terminated successfully.
         Current function value: 0.402801
         Iterations 7
>>> print res1.summary()
                           Logit Regression Results                           
==============================================================================
Dep. Variable:                      y   No. Observations:                   32
Model:                          Logit   Df Residuals:                       28
Method:                           MLE   Df Model:                            3
Date:                Sat, 26 Jan 2013   Pseudo R-squ.:                  0.3740
Time:                        07:34:59   Log-Likelihood:                -12.890
converged:                       True   LL-Null:                       -20.592
                                        LLR p-value:                  0.001502
==============================================================================
                 coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
x1             2.8261      1.263      2.238      0.025         0.351     5.301
x2             0.0952      0.142      0.672      0.501        -0.182     0.373
x3             2.3787      1.065      2.234      0.025         0.292     4.465
const        -13.0213      4.931     -2.641      0.008       -22.687    -3.356
==============================================================================
>>> dir(res1)
...
>>> res1.predict(x.mean(0))
0.25282026208742708
Josef
źródło