나는이 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 회귀 (또는 더 일반적으로 기계 학습 알고리즘)를 실행하는 가장 비단뱀적인 방법은 무엇입니까?
답변
버전 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.
답변
참고 : 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
함수에서 내부적으로 사용 합니다.
답변
이것이 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])
답변
이로 인해 데이터를 목록 내부의 목록으로 다시 형식화해야하는데, 이는 처음에 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
답변
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