Tenho um pandas
quadro de dados e gostaria de prever os valores da coluna A a partir dos valores das colunas B e C. Aqui está um exemplo de brinquedo:
import pandas as pd
df = pd.DataFrame({"A": [10,20,30,40,50],
"B": [20, 30, 10, 40, 50],
"C": [32, 234, 23, 23, 42523]})
Idealmente, eu teria algo como, ols(A ~ B + C, data = df)
mas quando vejo os exemplos das bibliotecas de algoritmos scikit-learn
, parece que ele alimenta os dados para o modelo com uma lista de linhas em vez de colunas. Isso exigiria que eu reformatasse os dados em listas dentro de listas, o que parece anular o propósito de usar os pandas em primeiro lugar. Qual é a maneira mais pítônica de executar uma regressão OLS (ou qualquer algoritmo de aprendizado de máquina de forma mais geral) em dados em um quadro de dados do pandas?
fonte
formula
, eu acidentalmente digiteiformulas
e recebi um erro estranho:TypeError: from_formula() takes at least 3 arguments (2 given)
print(result.params)
eprint(result.summary())
formula()
abordagem gera o erro de tipo TypeError: __init __ () faltando 1 argumento posicional obrigatório: 'endog', então acho que está obsoleto. também,ols
é agoraOLS
Nota:
pandas.stats
foi removido com 0,20.0É possível fazer isso com
pandas.stats.ols
:Observe que você precisa ter o
statsmodels
pacote instalado, ele é usado internamente pelapandas.stats.ols
função.fonte
The pandas.stats.ols module is deprecated and will be removed in a future version. We refer to external packages like statsmodels, see some examples here: http://www.statsmodels.org/stable/regression.html
missing intercepts
. O designer doR
pacote equivalente ajusta removendo o ajuste para a média: stats.stackexchange.com/a/36068/64552 . . Outras sugestões:you can use sm.add_constant to add an intercept to the exog array
e use um dict:reg = ols("y ~ x", data=dict(y=y,x=x)).fit()
pandas.stats
💔Não sei se isso é novo em
sklearn
oupandas
, mas sou capaz de passar o quadro de dados diretamente para,sklearn
sem converter o quadro de dados em uma matriz numpy ou qualquer outro tipo de dados.fonte
.values.reshape(-1, 1)
às colunas do dataframe. Por exemplo:x_data = df['x_data'].values.reshape(-1, 1)
e passando os arrays npx_data
(e criados de forma semelhantey_data
) para o.fit()
método.Não, não precisa, basta converter em uma matriz NumPy:
Isso leva um tempo constante porque apenas cria uma visualização dos seus dados. Em seguida, alimente-o para o scikit-learn:
fonte
np.matrix( np.asarray( df ) )
, porque sklearn esperava um vetor vertical, enquanto matrizes numpy, uma vez que você os corta de uma matriz, agem como vecotrs horizontais, o que é ótimo na maioria das vezes..values
atributo. Iereg.fit(df[['B', 'C']].values, df['A'].values)
,.Statsmodels podem construir um modelo OLS com referências de coluna diretamente para um dataframe do pandas.
Curto e grosso:
model = sm.OLS(df[y], df[x]).fit()
Detalhes do código e resumo da regressão:
Resultado:
Como obter diretamente R ao quadrado, coeficientes e valor p:
fonte