Я думаю, что вы можете делать именно то, что считали идеальным, используя пакет statsmodels , который был одной из pandas
«необязательных зависимостей до pandas
» версии 0.20.0 (он использовался для некоторых вещей в pandas.stats
.)
>>> import pandas as pd
>>> import statsmodels.formula.api as sm
>>> df = pd.DataFrame({"A": [10,20,30,40,50], "B": [20, 30, 10, 40, 50], "C": [32, 234, 23, 23, 42523]})
>>> result = sm.ols(formula="A ~ B + C", data=df).fit()
>>> print(result.params)
Intercept 14.952480
B 0.401182
C 0.000352
dtype: float64
>>> print(result.summary())
OLS Regression Results
==============================================================================
Dep. Variable: A R-squared: 0.579
Model: OLS Adj. R-squared: 0.158
Method: Least Squares F-statistic: 1.375
Date: Thu, 14 Nov 2013 Prob (F-statistic): 0.421
Time: 20:04:30 Log-Likelihood: -18.178
No. Observations: 5 AIC: 42.36
Df Residuals: 2 BIC: 41.19
Df Model: 2
==============================================================================
coef std err t P>|t| [95.0% Conf. Int.]
------------------------------------------------------------------------------
Intercept 14.9525 17.764 0.842 0.489 -61.481 91.386
B 0.4012 0.650 0.617 0.600 -2.394 3.197
C 0.0004 0.001 0.650 0.583 -0.002 0.003
==============================================================================
Omnibus: nan Durbin-Watson: 1.061
Prob(Omnibus): nan Jarque-Bera (JB): 0.498
Skew: -0.123 Prob(JB): 0.780
Kurtosis: 1.474 Cond. No. 5.21e+04
==============================================================================
Warnings:
[1] The condition number is large, 5.21e+04. This might indicate that there are
strong multicollinearity or other numerical problems.
formula
я случайно набралformulas
вместо него и получил странную ошибку:TypeError: from_formula() takes at least 3 arguments (2 given)
print(result.params)
иprint(result.summary())
formula()
подход вызывает ошибку типа TypeError: __init __ () отсутствует 1 обязательный позиционный аргумент: 'endog', поэтому я предполагаю, что он устарел. также,ols
сейчасOLS
Примечание:
pandas.stats
было удалено с версии 0.20.0Это можно сделать с помощью
pandas.stats.ols
:Обратите внимание, что вам необходимо установить
statsmodels
пакет, он используется внутриpandas.stats.ols
функции.источник
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
. Разработчик эквивалентногоR
пакета вносит коррективы, удаляя поправку для среднего: stats.stackexchange.com/a/36068/64552 . . Другие предложения:you can use sm.add_constant to add an intercept to the exog array
и используйтеreg = ols("y ~ x", data=dict(y=y,x=x)).fit()
pandas.stats
💔Я не знаю, является ли это новым в
sklearn
илиpandas
, но я могу передать фрейм данных напрямую,sklearn
без преобразования фрейма данных в массив numpy или любые другие типы данных.источник
.values.reshape(-1, 1)
в столбцы фрейма данных. Например:x_data = df['x_data'].values.reshape(-1, 1)
и передачаx_data
(и созданных аналогичным образомy_data
) массивов np в.fit()
метод.Нет, просто преобразуйте в массив NumPy:
Это занимает постоянное время, потому что это просто создает представление о ваших данных. Затем скармливаем его scikit-learn:
источник
np.matrix( np.asarray( df ) )
, потому что sklearn ожидал вертикальный вектор, тогда как массивы numpy, как только вы их вырезаете, действуют как горизонтальные векторы, что в большинстве случаев отлично..values
атрибут. Т.е.,reg.fit(df[['B', 'C']].values, df['A'].values)
.Statsmodels может построить модель OLS со ссылками на столбцы непосредственно на фреймворк pandas.
Коротко и мило:
model = sm.OLS(df[y], df[x]).fit()
Детали кода и сводка регрессии:
Вывод:
Как напрямую получить R-квадрат, коэффициенты и p-значение:
источник