Pandas Data Frame을 사용하여 OLS 회귀 분석 실행
저는.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
데이터를 열 대신 행 목록과 함께 모형에 공급하는 것으로 보입니다.이렇게 되면 데이터를 목록 내의 목록으로 다시 포맷해야 하는데, 이는 애초에 판다를 사용하려는 목적을 저버리는 것처럼 보입니다.팬더 데이터 프레임의 데이터에 대해 OLS 회귀(또는 일반적으로 모든 기계 학습 알고리즘)를 실행하는 가장 피톤적인 방법은 무엇입니까?
나는 당신이 이상적일 것이라고 생각했던 것을 당신이 거의 할 수 있다고 생각합니다, 그 중의 하나였던 stats models 패키지를 사용하면.pandas
' 이전의 선택적 종속성pandas
' version 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.
참고: pandas.stats
0.20.0으로 제거되었습니다.
이것은 가능합니다.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])
이렇게 되면 데이터를 목록 내의 목록으로 다시 포맷해야 하는데, 이는 애초에 판다를 사용하려는 목적을 저버리는 것처럼 보입니다.
그렇지 않습니다. NumPy 배열로 변환하면 됩니다.
>>> data = np.asarray(df)
이 작업은 데이터에 대한 보기만 생성하기 때문에 일정한 시간이 걸립니다.그 다음에 그것을 콩깍지에 먹여라-학습:
>>> 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
통계분석 모형은 팬더 데이터 프레임에 직접 열 참조를 사용하여 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
B는 통계적으로 유의하지 않습니다.데이터에서 추론을 끌어낼 수 없습니다.C가 B 확률에 영향을 줍니다.
df = pd.DataFrame({"A": [10,20,30,40,50], "B": [20, 30, 10, 40, 50], "C": [32, 234, 23, 23, 42523]})
avg_c=df['C'].mean()
sumC=df['C'].apply(lambda x: x if x<avg_c else 0).sum()
countC=df['C'].apply(lambda x: 1 if x<avg_c else None).count()
avg_c2=sumC/countC
df['C']=df['C'].apply(lambda x: avg_c2 if x >avg_c else x)
print(df)
model_ols = smf.ols("A ~ B+C",data=df).fit()
print(model_ols.summary())
df[['B','C']].plot()
plt.show()
df2=pd.DataFrame()
df2['B']=np.linspace(10,50,10)
df2['C']=30
df3=pd.DataFrame()
df3['B']=np.linspace(10,50,10)
df3['C']=100
predB=model_ols.predict(df2)
predC=model_ols.predict(df3)
plt.plot(df2['B'],predB,label='predict B C=30')
plt.plot(df3['B'],predC,label='predict B C=100')
plt.legend()
plt.show()
print("A change in the probability of C affects the probability of B")
intercept=model_ols.params.loc['Intercept']
B_slope=model_ols.params.loc['B']
C_slope=model_ols.params.loc['C']
#Intercept 11.874252
#B 0.760859
#C -0.060257
print("Intercept {}\n B slope{}\n C slope{}\n".format(intercept,B_slope,C_slope))
#lower_conf,upper_conf=np.exp(model_ols.conf_int())
#print(lower_conf,upper_conf)
#print((1-(lower_conf/upper_conf))*100)
model_cov=model_ols.cov_params()
std_errorB = np.sqrt(model_cov.loc['B', 'B'])
std_errorC = np.sqrt(model_cov.loc['C', 'C'])
print('SE: ', round(std_errorB, 4),round(std_errorC, 4))
#check for statistically significant
print("B z value {} C z value {}".format((B_slope/std_errorB),(C_slope/std_errorC)))
print("B feature is more statistically significant than C")
Output:
A change in the probability of C affects the probability of B
Intercept 11.874251554067563
B slope0.7608594144571961
C slope-0.060256845997223814
Standard Error: 0.4519 0.0793
B z value 1.683510336937001 C z value -0.7601036314930376
B feature is more statistically significant than C
z>2 is statistically significant
언급URL : https://stackoverflow.com/questions/19991445/run-an-ols-regression-with-pandas-data-frame
'source' 카테고리의 다른 글
최고의 자바스크립트 압축기 (0) | 2023.10.26 |
---|---|
JQuery에서 선택한 옵션이 이미 있는지 확인하려면 어떻게 해야 합니까? (0) | 2023.10.26 |
MySQL 및 NoSQL: 올바른 것을 선택할 수 있도록 도와줍니다. (0) | 2023.10.26 |
Pandas Dataframe / Numpy 배열 "축" 정의의 모호성 (0) | 2023.10.21 |
PowerShell 개체에서 멤버를 제거하시겠습니까? (0) | 2023.10.21 |