Diferença entre o modelo estatístico OLS e a regressão linear scikit


14

Eu tenho uma pergunta sobre dois métodos diferentes de bibliotecas diferentes, que parece estar fazendo o mesmo trabalho. Eu estou tentando fazer o modelo de regressão linear.

Aqui está o código que eu estou usando na biblioteca statsmodel com o 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

Esta impressão GFT + Wiki / GT R-quadrado 0,981434611923

e o segundo é o método de modelo Linear da biblioteca de aprendizado do scikit:

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)

Imprima GFT + Wiki / GT R-quadrado: 0,8543

Portanto, minha pergunta é: o método de ambos imprime nosso resultado R ^ 2, mas um é impresso 0,98 e o outro é 0,85.

Pelo meu entendimento, o OLS trabalha com o conjunto de dados de treinamento. Então, minhas perguntas,

  • Existe uma maneira de trabalhar com o conjunto de dados de teste com o OLS?
  • A pontuação do conjunto de dados traning nos dá algum significado (no OLS não usamos o conjunto de dados de teste)? Pelo meu conhecimento passado, temos que trabalhar com dados de teste.
  • Qual é a diferença entre OLS e regressão linear scikit. Qual deles usamos para calcular a pontuação do modelo?

Obrigado por qualquer ajuda.

Respostas:


14

Primeiro em termos de uso. Você pode obter a previsão nos modelos de estatísticas de maneira muito semelhante à do scikit-learn, exceto pelo fato de usarmos a instância de resultados retornada porfit

predictions = results.predict(X_test)

Dadas as previsões, podemos calcular estatísticas baseadas no erro de previsão

prediction_error = y_test - predictions

Há uma lista separada de funções para calcular as estatísticas de previsão de qualidade, mas não é integrada aos modelos, nem inclui R ao quadrado. (Nunca ouvi falar de R ao quadrado usado para dados fora da amostra.) O cálculo desses requer um pouco mais de trabalho do usuário e dos modelos de estatísticas não possui o mesmo conjunto de estatísticas, especialmente para classificação ou modelos com uma variável de resposta binária.

Para seus outros dois pontos:

A regressão linear é, na sua forma básica, a mesma nos modelos de estatísticas e no scikit-learn. No entanto, a implementação difere, o que pode produzir resultados diferentes em casos extremos, e o scikit learn geralmente oferece mais suporte para modelos maiores. Por exemplo, o statsmodels atualmente usa matrizes esparsas em muito poucas partes.

A diferença mais importante está na infraestrutura circundante e nos casos de uso diretamente suportados.

O Statsmodels segue amplamente o modelo tradicional, no qual queremos saber quão bem um determinado modelo se ajusta aos dados, e quais variáveis ​​"explicam" ou afetam o resultado ou qual é o tamanho do efeito. O Scikit-learn segue a tradição de aprendizado de máquina, onde a principal tarefa suportada é escolher o "melhor" modelo de previsão.

Como conseqüência, a ênfase nos recursos de suporte dos modelos de estatísticas está na análise dos dados de treinamento, que incluem testes de hipóteses e medidas de qualidade de ajuste, enquanto a ênfase na infraestrutura de suporte no scikit-learn está na seleção de modelos para previsão de amostra e, portanto, validação cruzada em "dados de teste".

Isso indica a distinção, ainda há muita sobreposição no uso. O statsmodels também faz previsões e previsões adicionais em um contexto de séries temporais. Porém, quando queremos fazer a validação cruzada para previsão nos modelos estatísticos, atualmente ainda é mais fácil reutilizar a configuração de validação cruzada do scikit-learn juntamente com os modelos de estimativa dos modelos estatísticos.


Hmm, estou tentando usar um modelo ARMA do statsmodels.tsa, mas a interface do Forecast é completamente diferente lá. Você sabe como alimentar dados de teste?
Efes

1
Essa é uma pergunta diferente e você precisa examinar a documentação ou os exemplos. A previsão nos modelos de séries temporais é bem diferente devido à estrutura de tempo sequencial e a previsão é da previsão dos valores nos próximos períodos.
Josef

Você está certo, isso é outra pergunta, no entanto, obrigado pela explicação. Eu li a documentação e a fiz funcionar de alguma forma. Mas ainda não entendo por que a interface é diferente. Especialmente porque não é possível fornecer vetores de recursos e obter previsões (previsões).
Efes

ARMA e SARIMAX permitem que variáveis ​​explicativas exogsejam incluídas nas estimativas e previsões.
Josef

Esta pergunta sobre Stackowerlow Endereços a diferença de interfaces: stackoverflow.com/questions/41045752/...
David Dale

1

No modelo OLS, você está usando os dados de treinamento para ajustar e prever.

Com o modelo LinearRegression, você está usando dados de treinamento para ajustar e testar dados para prever, portanto, resultados diferentes nas pontuações R2.

Se você coletar dados de teste no modelo OLS, deverá ter os mesmos resultados e menor valor


0

Eu encontrei um problema semelhante em que o OLS está fornecendo valores diferentes de Rsquared e Rsquared ajustado em comparação com o modelo de regressão linear Sklearn.

Razão para isso: o OLS não considera, por padrão, o coeficiente de interceptação e constrói o modelo sem ele, e o Sklearn considera na construção do modelo.

Solução: adicione uma coluna de 1s ao conjunto de dados e ajuste o modelo com o OLS e você obterá quase o mesmo Rsquared e Adj. Rsquared valores para ambos os modelos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.