ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 선형회귀(LinearRegression) in python
    data-science-summary/summary 2020. 9. 17. 21:51
    반응형

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

    선형회귀(LinearRegression)

    한개이상의 독립변수와 종속변수와의 선형적인 상관관계를 모델링하는 회귀 분석 기법

    독립변수 개수에따라 하나면 단순 선형회귀, 두개 이상이면 다중 선형회귀라고함

    일반적으로 최소 제곱법(least square method) 을 사용회 선형 회귀 모델을 만듦

    sklearn, statsmodels 등의 패키지를 이용하여 회귀분석을 수행한다.

    # 선형 회귀 LinearRegression sklearn
    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)
    cols = train.columns
    from sklearn.linear_model import LinearRegression
    # 독립변수 == 설명 변수
    # 선형회귀 - 절편 있는 경우
    lr = LinearRegression()
    # 절편(intercept) 없는 경우
    # lr = LinearRegression(fit_intercept=False)
    lr.fit(train.iloc[:, :-1], train.y)
    
    pred = lr.predict(test.iloc[:, :-1])
    # print(pred)
    
    # 회귀 계수 구할떄
    lr.coef_
    
    # 영향력이 큰 또는 예측값이 큰 변수 구할떄 = 회귀계수 가장 큰값과 해당 변수명 구하기
    print(lr.coef_[lr.coef_.argmax()])
    print(cols[lr.coef_.argmax()])
    # 절편 구할떄
    lr.intercept_
    
    # [1,1,1,1,1,1,1,1,1,?] 이고 y = 100 일떄 ? 값
    arr = [1,1,1,1,1,1,1,1,1, '?']
    arr = arr[:-1]
    ans = (100 - lr.intercept_ - np.dot(arr, lr.coef_[:-1].reshape(-1, 1)))/lr.coef_[-1]
    print(ans)
    
    # 결정계수
    # 선형회귀분석에서 종속변수에 대한 설명변수들의 설명력을 알고자 할때 사용
    # 총변동중 회귀선에 의한 변동이 차지하는 비율 
    # r2 = 0.4 == 약 40% 설명
    from sklearn.metrics import r2_score
    
    # 결정 계수
    print(r2_score(test.y, pred))

     

    statsmodels 사용 (식 직접 적는법)

    # 선형 회귀 LinearRegression - statsmodel.formula.api 사용
    from statsmodels.formula.api import ols
    s = 'y ~ '
    for i, c in enumerate(cols[:-1]):
      if i==0:
        s = s + c
        continue
      s = s +'+'+ c 
    # 아래 summary에서 P>|t| 를 통해 유의미한 개수 확인 가능 => 0.05 보다 작은 경우 유의미함
    ols(s, df).fit().summary()

     

    statsmodels 사용 (바로 X, y 대입)

    # 선형 회귀 LinearRegression - statsmodel.api 사용
    from statsmodels.api import OLS, add_constant
    # const 칼럼 추가
    # add_constant 안하면 r2 score 구할떄에 uncentered 되어 조금 다르게 나옴
    train_data = add_constant(train)
    model = OLS(train_data.y, train_data.drop(columns='y')).fit()
    # 유의미한 변수 확인
    p_cols = model.pvalues.index[model.pvalues <=0.05]
    print(p_cols)
    # 유의미한 변수로 재학습
    train_data_x = train_data[list(p_cols)[1:] + ['y']]
    train_data_x = add_constant(train_data_x)
    train_data_x
    
    model = OLS(train_data_x.y, train_data_x.drop(columns='y')).fit()
    test_data_x = test[list(p_cols[1:]) + ['y']]
    test_data_x = add_constant(test_data_x)
    pred = model.predict(test_data_x.drop(columns='y'))
    # 모델 살펴보기
    print(model.summary())
    # 모델 coefficient 추출
    print(model.params)
    # 모델 p_valeus 추출
    print(model.pvalues)
    # 모델 t_values
    print(model.tvalues)
    # 결정계수
    print(model.rsquared)
    # 수정된 결정 계수
    print(model.rsquared_adj)
    반응형

    댓글

Designed by Tistory.