ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 결정 계수 in python
    data-science-summary/summary 2020. 9. 17. 23:01
    반응형

    <엔지니어는 구현을 못하면 모르는것이다>

    결정 계수

    0~1 사이의 값을 가지고 1에 가까울수록 설명력(회귀분석모델이 얼마나 데이터를 잘 설명해주는지)이 높음

    결정계수와 상관계수 차이

    인자가 하나일떄는 상관계수의 제곱값이 결정계수값

    보통결정계수를 상관계수의 제곱으로 구하긴 하지만 정확히는 결정계수는 상관계수와는 달리 여러 독립변수들이 종속변수를 설명하는지를 나타낸 수치라 다중 회귀분석에서는 다름

    회귀분석에서 사용하는 수치임.

    따라서 독립변수가 여러개일떄는 제곱으로 정확하게 일치하지는 않음

    수정된 결정계수 Adj. R-squared

    결정계수는 독립변수 개수가 많아질수록 그 값이 커짐. 따라서 표본크기와 독립변수의 수를 고려하여 계산하는데 이것이 수정된 결정계수

    독립변수 2개 이상이거나 표본 200개 미만이면 수정 결정계수를 보고서에 기술할것

    from statsmodels.api import OLS, add_constant
    from sklearn import datasets
    from sklearn.model_selection import train_test_split
    import numpy as np
    import pandas as pd
    datas = datasets.load_diabetes()
    datas.target
    df = pd.DataFrame(datas.data, columns = datas.feature_names)
    y = pd.DataFrame(datas.target, columns = ['y'])
    df = pd.concat([df, y], axis=1)
    train, test = train_test_split(df, test_size=0.3, random_state=123)
    # 독립변수 1개일떄
    train_x = add_constant(train.age)
    model = OLS(train.y, train_x).fit()
    print(model.summary())
    # 오차는 실제값 - 예측값 => Regression 예측력
    # 편차는 실제값 - 평균값 => 그냥 평균잡았을때 예측력
    
    # RSS(Regression sum of squares) = ESS(explained sum of squares) : 회귀식과 평균값의 차이 => 이정도는 설명했다는 의미
    RSS = np.sum((model.predict(train_x) - train.y.mean())**2)
    print(RSS, ' / ' ,model.ess)
    # 잔차(오차) 제곱 합
    # SSE(Sum of squared errors) = RSS(residual sum of squares) : 회귀식과 실제값의 차이(회귀식에서 구한 값(예측치)과 실제값의 차이) => 예측해도 차이나는 에러 
    SSE = np.sum((train.y-model.predict(train_x))**2)
    print(SSE, ' / ', model.ssr)
    
    # TSS(Total sum of squares) : 편차 제곱합
    # TSS = RSS + SSE 
    TSS = np.sum((train.y - train.y.mean())**2)
    print(TSS, ' / ', model.centered_tss)
    # r2 = RSS / TSS : 이정도는 설명 했다.
    r2 = RSS / TSS
    print(r2, model.rsquared)
    
    print('\n~~~~~~~~~~~~~~~~~~~~\n')
    # 독립변수 2개 이상일때
    train_x = add_constant(train[['age','bmi', 'bp']])
    model = OLS(train.y, train_x).fit()
    print(model.summary())
    # RSS(Regression sum of squares) = ESS(explained sum of squares) : 회귀식과 평균값의 차이 => 이정도는 설명했다는 의미
    RSS = np.sum((model.predict(train_x) - train.y.mean())**2)
    print(RSS, ' / ' , model.ess)
    # 잔차 제곱 합
    # SSE(Sum of squared errors) = RSS(residual sum of squares) : 회귀식과 실제값의 차이(회귀식에서 구한 값(예측치)과 실제값의 차이) => 예측해도 차이나는 에러 
    SSE = np.sum((train.y-model.predict(train_x))**2)
    print(SSE, ' / ', model.ssr)
    
    # TSS(Total sum of squares) : 편차 제곱합
    # TSS = RSS + SSE 
    TSS = np.sum((train.y - train.y.mean())**2)
    print(TSS, ' / ', model.centered_tss)
    # r2 = RSS / TSS : 이정도는 설명 했다.
    r2 = RSS / TSS
    print(r2, model.rsquared)
    
    # 수정된 결정 계수 => 결정계수는 독립변수 개수가 많아질수록 그 값이 커지게 됨 => 보정한것이 수정된 결정 계수
    # 즉 표본의 크기와 독립변수의 수를 고려하여 계산하는것(n: 전체 샘플 개수, p: 설명변수 개수)
    # adjusted r2 = 1 - ((n-1)**(1-r2))/(n-p-1)
    n = len(train_x)
    p = len(train_x.columns)-1
    print(n, p)
    adjusted_r2 = 1 - ((n-1)*(1-r2))/(n-p-1)
    print(adjusted_r2 , '/', model.rsquared_adj)

     

    반응형

    댓글

Designed by Tistory.