Differenza tra statsmodel OLS e regressione lineare di scikit


14

Ho una domanda su due metodi diversi da diverse librerie che sembra fare lo stesso lavoro. Sto cercando di creare un modello di regressione lineare.

Ecco il codice che utilizzo la libreria statsmodel con 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

Questo stampa GFT + Wiki / GT R-quadrato 0,981434611923

e il secondo è scikit learn library Metodo del modello lineare:

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)

Questa stampa GFT + Wiki / GT R al quadrato: 0,8543

Quindi la mia domanda è che entrambi i metodi stampano il nostro risultato R ^ 2 ma uno è 0,98 e l'altro è 0,85.

Da quanto ho capito, OLS funziona con il set di dati di training. Quindi le mie domande,

  • Esiste un modo che funzioni con i set di dati di test con OLS?
  • Il punteggio del set di dati di analisi ci dà qualche significato (in OLS non abbiamo utilizzato il set di dati di test)? Dalla mia conoscenza passata dobbiamo lavorare con i dati dei test.
  • Qual è la differenza tra regressione lineare OLS e scikit. Quale utilizziamo per calcolare il punteggio del modello?

Grazie per qualsiasi aiuto.

Risposte:


14

Primo in termini di utilizzo. Puoi ottenere la previsione in statsmodels in un modo molto simile a quello di scikit-learn, tranne per il fatto che utilizziamo l'istanza dei risultati restituita dafit

predictions = results.predict(X_test)

Date le previsioni, possiamo calcolare statistiche basate sull'errore di previsione

prediction_error = y_test - predictions

Esiste un elenco separato di funzioni per calcolare la bontà delle statistiche di predizione con esso, ma non è integrato nei modelli, né include R al quadrato. (Non ho mai sentito parlare di R al quadrato usato per dati fuori campione.) Il calcolo di questi richiede un po 'più di lavoro da parte dell'utente e statsmodels non ha lo stesso set di statistiche, specialmente per classificazione o modelli con una variabile di risposta binaria.

Ai tuoi altri due punti:

La regressione lineare è nella sua forma base la stessa in statsmodels e in scikit-learn. Tuttavia, l'implementazione differisce, il che potrebbe produrre risultati diversi in casi limite e scikit learn ha in generale un maggiore supporto per modelli più grandi. Ad esempio, statsmodels attualmente utilizza matrici sparse in pochissime parti.

La differenza più importante è nell'infrastruttura circostante e nei casi d'uso direttamente supportati.

I modelli statistici seguono in gran parte il modello tradizionale in cui vogliamo sapere in che misura un dato modello si adatta ai dati e quali variabili "spiegano" o influenzano il risultato o quale sia la dimensione dell'effetto. Scikit-learn segue la tradizione dell'apprendimento automatico in cui l'attività principale supportata è scegliere il modello "migliore" per la previsione.

Di conseguenza, l'enfasi nelle caratteristiche di supporto di statsmodels sta nell'analisi dei dati di addestramento che includono test di ipotesi e misure di bontà di adattamento, mentre l'enfasi nell'infrastruttura di supporto in scikit-learning è sulla selezione del modello per out-of- previsione del campione e quindi convalida incrociata su "dati di prova".

Questo sottolinea la distinzione, c'è ancora molta sovrapposizione anche nell'uso. statsmodels esegue anche previsioni e inoltre previsioni in un contesto di serie temporali. Ma quando vogliamo fare la convalida incrociata per la previsione in statsmodels è spesso ancora più facile riutilizzare l'impostazione di convalida incrociata di scikit-learn insieme ai modelli di stima di statsmodels.


Sto provando a usare un modello ARMA di statsmodels.tsa, ma l'interfaccia di predict è completamente diversa lì. Sai come fornire i dati dei test?
Efes,

1
Questa è una domanda diversa, e devi guardare la documentazione o gli esempi. La previsione nei modelli di serie temporali è piuttosto diversa a causa della struttura temporale sequenziale e la previsione è la previsione dei valori nei periodi di tempo successivi.
Josef,

Hai ragione, questa è un'altra domanda, tuttavia grazie per la spiegazione. Ho letto la documentazione e l'ho fatta funzionare in qualche modo. Ma ancora non capisco perché l'interfaccia sia diversa. Soprattutto perché non è possibile fornire vettori di funzioni e ottenere previsioni (previsioni).
Efes,

ARMA e SARIMAX consentono di includere variabili esplicative exognella stima e nella previsione.
Josef,

Questa domanda su Stackowerlow risolve la differenza nelle interfacce: stackoverflow.com/questions/41045752/…
David Dale,

1

Nel modello OLS si stanno utilizzando i dati di allenamento per adattarsi e prevedere.

Con il modello LinearRegression stai utilizzando i dati di allenamento per adattarli e testare i dati per prevedere, quindi risultati diversi nei punteggi R2.

Se si prendessero i dati di test nel modello OLS, si dovrebbero avere gli stessi risultati e un valore inferiore


0

Ho riscontrato un problema simile in cui l'OLS sta fornendo diversi valori Rsquared e Adjusted Rsquared rispetto al modello Sklearn LinearRegression.

Motivo: OLS non considera, per impostazione predefinita, il coefficiente di intercettazione e crea il modello senza di esso e Sklearn lo considera nella costruzione del modello.

Soluzione: aggiungi una colonna di 1 all'insieme di dati e adatta il modello con OLS e otterrai quasi lo stesso Rsquared e Adj. Valori rsquared per entrambi i modelli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.