Ich habe einen pandas
Datenrahmen und möchte die Werte von Spalte A aus den Werten in den Spalten B und C vorhersagen können. Hier ein Spielzeugbeispiel:
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]})
Im Idealfall hätte ich so etwas wie, ols(A ~ B + C, data = df)
aber wenn ich mir die Beispiele aus Algorithmusbibliotheken ansehe scikit-learn
, scheinen die Daten dem Modell mit einer Liste von Zeilen anstelle von Spalten zuzuführen. Dies würde erfordern, dass ich die Daten in Listen innerhalb von Listen umformatiere, was den Zweck der Verwendung von Pandas in erster Linie zu vereiteln scheint. Was ist die pythonischste Methode, um eine OLS-Regression (oder einen Algorithmus für maschinelles Lernen im Allgemeinen) für Daten in einem Pandas-Datenrahmen auszuführen?
quelle
formula
: Ich habeformulas
stattdessen versehentlich getippt und einen seltsamen Fehler erhalten:TypeError: from_formula() takes at least 3 arguments (2 given)
print(result.params)
undprint(result.summary())
formula()
Wenn Sie versuchen, diesen Ansatz zu verwenden, wird der Typfehler TypeError: __init __ () ausgelöst. Es fehlt ein erforderliches Positionsargument: 'endog'. Ich denke, es ist veraltet. auchols
ist jetztOLS
Hinweis:
pandas.stats
wurde mit 0.20.0 entferntDies ist möglich mit
pandas.stats.ols
:Beachten Sie, dass das
statsmodels
Paket installiert sein muss. Es wird intern von derpandas.stats.ols
Funktion verwendet.quelle
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
. Der Designer des entsprechendenR
Pakets passt sich an, indem er die Anpassung für den Mittelwert entfernt: stats.stackexchange.com/a/36068/64552 . . Andere Vorschläge:you can use sm.add_constant to add an intercept to the exog array
und verwenden Sie ein Diktat:reg = ols("y ~ x", data=dict(y=y,x=x)).fit()
pandas.stats
💔Ich weiß nicht, ob dies neu in
sklearn
oder istpandas
, aber ich kann densklearn
Datenrahmen direkt an übergeben, ohne den Datenrahmen in ein Numpy-Array oder einen anderen Datentyp zu konvertieren.quelle
.values.reshape(-1, 1)
an die Datenrahmenspalten angehängt hatte. Zum Beispiel:x_data = df['x_data'].values.reshape(-1, 1)
und Übergeben derx_data
(und eines ähnlich erstellteny_data
) np-Arrays an die.fit()
Methode.Nein, nicht in ein NumPy-Array konvertieren:
Dies nimmt eine konstante Zeit in Anspruch, da nur eine Ansicht Ihrer Daten erstellt wird. Dann füttere es an scikit-learn:
quelle
np.matrix( np.asarray( df ) )
, weil sklearn einen vertikalen Vektor erwartete, während numpy Arrays, sobald Sie sie von einem Array abschneiden, wie horizontale Vecotrs wirken, was die meiste Zeit großartig ist..values
Attribut verwenden. Dhreg.fit(df[['B', 'C']].values, df['A'].values)
.Statistikmodelle können ein OLS-Modell mit Spaltenverweisen direkt auf einen Pandas-Datenrahmen erstellen.
Kurz und bündig:
model = sm.OLS(df[y], df[x]).fit()
Codedetails und Regressionszusammenfassung:
Ausgabe:
So erhalten Sie direkt R-Quadrat, Koeffizienten und p-Wert:
quelle