회귀 논리(비망록)

9172 단어 Python
회귀 분석에 관한 비망록.(개인 노트)

논리 회귀와 논리 링크 함수


확률 분포에 이원 분포(Binomial Distribution)를 지정하고, 링크 함수에 논리 링크 함수를 지정하는 광의선형 모델(GLM)은 논리 회귀다.
이항식 분포 중 이벤트 발생 확률 $pi$p 지정 필요i$값의 범위 0≥$pi$≥1(확률 0~100%의 범위)을 나타내는 데 적합한 링크 함수는 논리적 링크 함수입니다.

논리 함수


논리 링크 함수는 논리 함수의 역함수다.논리 함수는 다음과 같은 공식으로 표시된다.
$z_i달러는 선형 예측기 $zi=α_1+β_1x_1+β_2x_2…$α:토막β_계수
$$ p_i=logistic(x_i)=\frac{1}{1+\exp(-z_i)} $$

논리 함수 그리기(동위원소 곡선)


상기 공식의 $z$-10이 변할 때의 곡선을 그려 보세요.
$z치가 어떻든 간에 0≥,-19019.;,-19889약;≥1이 적당하고 z=0p=0.5 주목!
# -6~6の間で等間隔に1000個の値を取得
x = np.linspace(-10,10,1000)
# 1/(1+np.exp(-x)) がロジスティック関数
plt.plot(x, ( 1/(1+np.exp(-x))) )

plt.axvline(x=0, color='red', linestyle='dotted')
plt.axhline(y=0.5, color='red', linestyle='dotted')
plt.ylabel("確率(p)")
plt.xlabel("確率変数(z)")
plt.show()
다음 도표를 그립니다.

논리 링크 함수


논리 함수를 $z로 설정하기i$=의 모양이 되면 다음과 같다.
$$\log\frac{p_i}{1-p_i}=z_i $$
※ 그나저나 $zi=α_1+β_1x_1+β_2x_2…$α:토막β_계수
이 왼쪽을 논리 함수라고 부른다.이것은 바로 아래의 뜻이다.
$$ α_1+β_1x_1+β_2x_2… =\log\frac{p_i}{1-p_i} $$

회귀 논리를 통해 매개 변수를 평가하다


회귀 논리를 통해 파라미터를 평가하다.
(선형 조합 방정식(선형 예측기)의 절편 또는 각 계수*의 추정)
유사함수와 대수 유사함수는
$$ L(\beta_j)=\prod_i{}_n\mathrm{C}_rp_i^{y_i}(1-p_i)^{N_i-y_i} $$
양쪽의 대수를 취하면...
$$\log L({\beta_j})=\sum_i (\log {}_n\mathrm{C} _r+y_i\log(p_i)+(N_i-y_i)\log(1-p_i)) $$

이루어지다


데이터를 적절히 준비하다.
# 説明変数となるデータを1項目用意
X_train_list = np.r_[np.random.normal(3 ,1, size=50), np.random.normal(-1,1,size=50)]
# 目的変数となるデータを用意
y_train_list = np.r_[np.ones(50),np.zeros(50)]

# データフレームに変換
df = pd.DataFrame(data=[X_train_list,y_train_list]).T
df.rename(columns={0:"X",1:"Y"}, inplace=True)

# 目的変数と説明変数を分ける
X_train = df[["X"]]
y_train = df[["Y"]]

display(X_train.head())
display(y_train.head())
X
0   5.207395
1   2.692299
2   1.560036
3   3.853632
4   4.804304

Y
0   1.0
1   1.0
2   1.0
3   1.0
4   1.0

sklearn.linear_model.LogiisticRegression의 경우


모형 제작

from sklearn.linear_model import LogisticRegression
# モデルのインスタンス化
model = LogisticRegression()
# 学習
model.fit(X_train,y_train)

예측 (플래그)

モデル名.predict(説明変数データ)
0과 1의 목록을 되돌려줍니다.기본적으로 임계값 0.5(=50%)를 초과하면 1로 설정하고 그렇지 않으면 0으로 설정합니다.
매개변수로 전송된 설명 변수 데이터가 DataFrame이 아니면 오류가 발생할 수 있습니다.만약 Seriese라면 틀렸을 거야.
model.predict(X_train)
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
       0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

예측(확률)

モデル名.predict_proba(説明変数データ)
아라이 형식으로 0으로 분류된 확률, 1로 분류된 확률의 각 확률을 되돌려준다.
model.predict_proba(X_train.iloc[0:10])
array([[2.63082246e-05, 9.99973692e-01],
       [1.51340331e-02, 9.84865967e-01],
       [2.12846522e-01, 7.87153478e-01],
       [8.10623998e-04, 9.99189376e-01],
       [7.30213967e-05, 9.99926979e-01],
       [1.51565245e-02, 9.84843475e-01],
       [6.95446239e-04, 9.99304554e-01],
       [7.48031608e-02, 9.25196839e-01],
       [1.88389023e-02, 9.81161098e-01],
       [5.45899840e-04, 9.99454100e-01]])
참고로 출력만 1로 분류될 확률은
モデル名.predict_proba(評価用の説明変数データ)[:, 1]

statsmodels.api의 상황


모형 제작


포인트는 sm입니다.add_constant(변수 데이터 설명)을 하지 않으면 회귀식의 절단이 나오지 않는 곳.
import statsmodels.api as sm

# 定数項(切片)のために行う
X_train = sm.add_constant(X_train)

glm_binom = sm.GLM( y_train, X_train, family=sm.families.Binomial())
res = glm_binom.fit()
print(res.summary())
                 Generalized Linear Model Regression Results                  
==============================================================================
Dep. Variable:                      Y   No. Observations:                  100
Model:                            GLM   Df Residuals:                       98
Model Family:                Binomial   Df Model:                            1
Link Function:                  logit   Scale:                          1.0000
Method:                          IRLS   Log-Likelihood:                -8.8540
Date:                Thu, 25 Mar 2021   Deviance:                       17.708
Time:                        10:54:26   Pearson chi2:                     48.1
No. Iterations:                     8                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const         -3.1340      1.046     -2.995      0.003      -5.185      -1.083
X              3.3071      0.952      3.476      0.001       1.442       5.172
==============================================================================

예측


1로 분류될 확률을 되돌려줍니다.
preddict 이전에 매개 변수가 전달하는 설명 변수는 sm이다.add_constant (변수 데이터 설명) 를 하지 않으면 오류가 발생할 수 있습니다.
モデル.predict(説明変数データ)
res.predict(X_train)
0     0.527843
1     0.999978
2     0.999281
3     0.997063
4     0.995389
        ...   
95    0.001322
96    0.000229
97    0.004302
98    0.000940
99    0.000040

AIC의 출력

res.aic

statsmodels.formula.api의 상황


statsmodels.api보다 더 세밀하게 지정할 수 있습니까

모형 제작


formura에서 열거한 변수와 설명 변수
R처럼 "전체적으로 이 열과 이 열을 뽑아라!"이렇게 지목하면 안 돼요?
import statsmodels.formula.api as smf
# 線形予測子を定義 「1+」は切片
formula = "Y~1+X"

# リンク関数を選択
link = sm.genmod.families.links.logit

# 誤差構造(損失関数)を選択
family = sm.families.Binomial(link=link)

mod = smf.glm(formula=formula, data=df, family=family )
result = mod.fit() 
print(result.summary())
                 Generalized Linear Model Regression Results                  
==============================================================================
Dep. Variable:                      Y   No. Observations:                  100
Model:                            GLM   Df Residuals:                       98
Model Family:                Binomial   Df Model:                            1
Link Function:                  logit   Scale:                          1.0000
Method:                          IRLS   Log-Likelihood:                -8.8540
Date:                Thu, 25 Mar 2021   Deviance:                       17.708
Time:                        11:11:39   Pearson chi2:                     48.1
No. Iterations:                     8                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept     -3.1340      1.046     -2.995      0.003      -5.185      -1.083
X              3.3071      0.952      3.476      0.001       1.442       5.172
==============================================================================

예측


1로 분류될 확률을 되돌려줍니다.
preddict 이전에 매개 변수가 전달하는 설명 변수는 sm이다.add_constant (변수 데이터 설명) 를 하지 않으면 오류가 발생할 수 있습니다.
モデル.predict(説明変数データ)
result.predict(X_train)
0     0.527843
1     0.999978
2     0.999281
3     0.997063
4     0.995389
        ...   
95    0.001322
96    0.000229
97    0.004302
98    0.000940
99    0.000040

AIC의 출력

result.aic

해석하다


논리 함수의 선형 예측기를 얻은 계수 값으로 바꾸면 다음과 같은 공식이 된다.
예: 슬라이스 - 19.54달러β_1달러를 1.95달러로 환전하다β_2달러가 2.02면
$$\frac{p_i}{1-p_i}=\exp(\alpha+\beta_1x_i+\beta_2f_i)=\exp(\alpha)+\exp(\beta_1x_i)+\exp(\beta_2f_i)=\exp(-19.54)+\exp(1.95x_i)+\exp(2.02f_i) $$
왼쪽은 (사건 발생 확률)/(사건 발생 확률) 의 소머리입니다. 예를 들어 $x$1이 증가하면 소머리는 $exp(1.95)=7.06달러의 배입니다.결국 아저씨의 7.06배에 주의해야 해!


예측 결과 표시
깜찍하고 깜찍한 라인을 그렸네요!
plt.scatter(df["X"],df["Y"])
plt.plot(df["X"],result.predict(df["X"]),"-o",linestyle='None',color="red")
plt.show()

모델에 대한 평가, 그리고.
끝맺다

좋은 웹페이지 즐겨찾기