Pandas 데이터 프레임으로 OLS 회귀 실행


111

나는이 pandas데이터 프레임을 내가 여기에 열 B와 C의 값에서 열 A의 값을 예측할 수에 싶습니다 장난감 예입니다 :

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]})

이상적으로는 다음과 같은 ols(A ~ B + C, data = df)것이 있지만 알고리즘 라이브러리 의 예제 를 보면 scikit-learn열 대신 행 목록을 사용하여 모델에 데이터를 공급하는 것처럼 보입니다. 이로 인해 데이터를 목록 내부의 목록으로 다시 형식화해야하는데, 이는 처음에 pandas 사용 목적을 무너 뜨리는 것처럼 보입니다. Pandas 데이터 프레임의 데이터에 대해 OLS 회귀 (또는 더 일반적으로 기계 학습 알고리즘)를 실행하는 가장 비단뱀적인 방법은 무엇입니까?

답변:


152

버전 0.20.0pandas 이전 의 '선택적 종속성' 중 하나 였던 statsmodels 패키지를 사용하면 이상적이라고 생각한 것을 거의 정확하게 수행 할 수 있다고 생각합니다 pandas( 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.

2
올바른 키워드는입니다 formula. 실수로 formulas대신 입력 하고 이상한 오류가 발생했습니다.TypeError: from_formula() takes at least 3 arguments (2 given)
denfromufa

@DSM 파이썬에 매우 익숙합니다. 동일한 코드를 실행하고 두 인쇄 메시지에서 오류가 발생했습니다. print result.summary () ^ SyntaxError : 잘못된 구문 >>> print result.parmas 파일 "<stdin>", 줄 1 print result.parmas ^ SyntaxError : 괄호 누락 '인쇄'호출 ... 패키지를 잘못로드했을 수 있습니까 ?? "인쇄"를 넣지 않으면 작동하는 것 같습니다. 감사.
a.powell

2
@ a.powell OP의 코드는 Python 2입니다. 제가 생각하는 유일한 변경 사항은 인쇄 할 인수를 괄호로 묶는 것입니다. print(result.params)그리고print(result.summary())
Paul Moore

:이 봐이 있고 감사 할 수 있다면 나는 감사하겠습니다 stackoverflow.com/questions/44923808/...
DESTA Haileselassie Hagos을

formula()접근 방식 을 사용하려고 시도 하면 유형 오류 TypeError : __init __ () missing 1 required positional argument : 'endog', 그래서 더 이상 사용되지 않는 것 같습니다. 또한, ols현재OLS
3pitt

68

참고 : 0.20.0 pandas.stats 에서 제거되었습니다 .


다음을 사용하여이 작업을 수행 할 수 있습니다 pandas.stats.ols.

>>> from pandas.stats.api import ols
>>> df = pd.DataFrame({"A": [10,20,30,40,50], "B": [20, 30, 10, 40, 50], "C": [32, 234, 23, 23, 42523]})
>>> res = ols(y=df['A'], x=df[['B','C']])
>>> res
-------------------------Summary of Regression Analysis-------------------------

Formula: Y ~ <B> + <C> + <intercept>

Number of Observations:         5
Number of Degrees of Freedom:   3

R-squared:         0.5789
Adj R-squared:     0.1577

Rmse:             14.5108

F-stat (2, 2):     1.3746, p-value:     0.4211

Degrees of Freedom: model 2, resid 2

-----------------------Summary of Estimated Coefficients------------------------
      Variable       Coef    Std Err     t-stat    p-value    CI 2.5%   CI 97.5%
--------------------------------------------------------------------------------
             B     0.4012     0.6497       0.62     0.5999    -0.8723     1.6746
             C     0.0004     0.0005       0.65     0.5826    -0.0007     0.0014
     intercept    14.9525    17.7643       0.84     0.4886   -19.8655    49.7705
---------------------------------End of Summary---------------------------------

statsmodels패키지를 설치 해야 하며 pandas.stats.ols함수에서 내부적으로 사용 합니다.


13
이것은 판다의 향후 버전에서 더 이상 사용되지 않을 것입니다!
denfromufa

4
왜 그럴까요? 이 기능이 살아남기를 간절히 바랍니다! 정말 유용하고 빠릅니다!
FaCoffee

2
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
javadba

2
@DestaHaileselassieHagos 이 문제는 missing intercepts. 동등한 R패키지 의 설계자 는 평균 조정을 제거하여 조정합니다. stats.stackexchange.com/a/36068/64552 . . 다른 제안 : you can use sm.add_constant to add an intercept to the exog array그리고 dict를 사용하십시오 : reg = ols("y ~ x", data=dict(y=y,x=x)).fit()
javadba

2
그들은 제거 할 때 그것은 슬픈 날이었다 pandas.stats💔
3kstc

31

이것이 sklearn또는 pandas에서 새로운 sklearn것인지는 모르겠지만 데이터 프레임을 numpy 배열이나 다른 데이터 유형으로 변환하지 않고 데이터 프레임을 직접 전달할 수 있습니다.

from sklearn import linear_model

reg = linear_model.LinearRegression()
reg.fit(df[['B', 'C']], df['A'])

>>> reg.coef_
array([  4.01182386e-01,   3.51587361e-04])

2
OP에서 약간의 전환-그러나 .values.reshape(-1, 1)데이터 프레임 열에 추가 한 후이 특정 답변이 매우 유용하다는 것을 알았습니다 . 예를 들면 다음 x_data = df['x_data'].values.reshape(-1, 1)과 전달 x_data(및 유사하게 만들어 y_dataNP로 배열) .fit()방법.
S3DEV

16

이로 인해 데이터를 목록 내부의 목록으로 다시 형식화해야하는데, 이는 처음에 pandas 사용 목적을 무너 뜨리는 것처럼 보입니다.

아니요, 그냥 NumPy 배열로 변환합니다.

>>> data = np.asarray(df)

데이터에 대한 를 생성하기 때문에 일정한 시간이 걸립니다 . 그런 다음 scikit-learn에 제공합니다.

>>> from sklearn.linear_model import LinearRegression
>>> lr = LinearRegression()
>>> X, y = data[:, 1:], data[:, 0]
>>> lr.fit(X, y)
LinearRegression(copy_X=True, fit_intercept=True, normalize=False)
>>> lr.coef_
array([  4.01182386e-01,   3.51587361e-04])
>>> lr.intercept_
14.952479503953672

3
나는 np.matrix( np.asarray( df ) )sklearn이 수직 벡터를 예상했기 때문에해야만했지만, numpy 배열은 일단 배열에서 슬라이스하면 수평 벡터처럼 작동하는데, 대부분의 시간이 좋습니다.
cjohnson318 2014 년

간단한 방법은 그러나,이 경로와 계수의 테스트를 할 수 없습니다
MichaelChirico

2
Pandas DataFrame으로 Scikit-Learn을 직접 공급하는 방법이 없습니까?
Femto Trader 2015

다른 sklearn 모듈 (의사 결정 트리 등)의 경우 df [ 'colname']. values를 사용했지만 작동하지 않았습니다.
szeitlin

1
.values속성을 사용할 수도 있습니다 . 즉, reg.fit(df[['B', 'C']].values, df['A'].values).
3novak

6

Statsmodels는 Pandas 데이터 프레임에 대한 열 참조를 사용하여 OLS 모델 을 빌드합니다 .

짧고 달다:

model = sm.OLS(df[y], df[x]).fit()


코드 세부 정보 및 회귀 요약 :

# imports
import pandas as pd
import statsmodels.api as sm
import numpy as np

# data
np.random.seed(123)
df = pd.DataFrame(np.random.randint(0,100,size=(100, 3)), columns=list('ABC'))

# assign dependent and independent / explanatory variables
variables = list(df.columns)
y = 'A'
x = [var for var in variables if var not in y ]

# Ordinary least squares regression
model_Simple = sm.OLS(df[y], df[x]).fit()

# Add a constant term like so:
model = sm.OLS(df[y], sm.add_constant(df[x])).fit()

model.summary()

산출:

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      A   R-squared:                       0.019
Model:                            OLS   Adj. R-squared:                 -0.001
Method:                 Least Squares   F-statistic:                    0.9409
Date:                Thu, 14 Feb 2019   Prob (F-statistic):              0.394
Time:                        08:35:04   Log-Likelihood:                -484.49
No. Observations:                 100   AIC:                             975.0
Df Residuals:                      97   BIC:                             982.8
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         43.4801      8.809      4.936      0.000      25.996      60.964
B              0.1241      0.105      1.188      0.238      -0.083       0.332
C             -0.0752      0.110     -0.681      0.497      -0.294       0.144
==============================================================================
Omnibus:                       50.990   Durbin-Watson:                   2.013
Prob(Omnibus):                  0.000   Jarque-Bera (JB):                6.905
Skew:                           0.032   Prob(JB):                       0.0317
Kurtosis:                       1.714   Cond. No.                         231.
==============================================================================

R- 제곱, 계수 및 p- 값을 직접 얻는 방법 :

# commands:
model.params
model.pvalues
model.rsquared

# demo:
In[1]: 
model.params
Out[1]:
const    43.480106
B         0.124130
C        -0.075156
dtype: float64

In[2]: 
model.pvalues
Out[2]: 
const    0.000003
B        0.237924
C        0.497400
dtype: float64

Out[3]:
model.rsquared
Out[2]:
0.0190
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.