ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [n211] Simple Regression
    AI 부트캠프 2021. 10. 18. 15:10

    Classification & Regression

    지도 학습 (Supervised classification)은 크게 분류, 회귀로 나뉜다. 하지만 회귀는 다른 지도 학습과는 조금 다른 면이 있다.

    Property Supervised Classification Regression
    Output type 이산값 (category 값) 연속값 (숫자값)
    What are you trying to find Decision boundary "Best fit line"
    Evaluation Accuracy "Sum of Squared error" or R^2

     

     

     

    기준 모델 (Baseline Model)

    최소한의 성능을 나타내는 기준이 되는 모델로, 모델 성능을 판단할 때 기준이 되는 모델을 뜻한다. 예를 들어, 평균값을 기준으로 사용하면 평균 기준 모델이라 부른다. 

    • 분류 문제에서는 타켓에서 가장 자주 나온 클래스 (최빈 클래스) 
    • 회귀 문제에서는 타겟의 평균값(mean)
    • 시계열 회귀 문제에서는 이전 타임 스탬프의 값
    x = df['GrLivArea']
    y = df['SalePrice']
    
    predict = df['SalePrice'].mean()
    errors = predict - df['SalePrice']
    mean_absolute_error = errors.abs().mean()
    
    sns.lineplot(x=x, y=predict, color='red')
    sns.scatterplot(x=x, y=y, color='blue');

     

     

    회귀 평가 지표

    MSE (Mean Squared Error) 

    실제값과 예측 값의 차이를 제곱해 평균. 

     

    MAE (Mean Absolute Error)

    평균 절대 오차. 예측 error의 절대값 평균을 의미한다.

    # predict: 우리가 정한 기준모델인 평균으로 예측을 합니다
    predict = df['SalePrice'].mean()
    
    # 평균값으로 예측할 때 샘플 별 평균값과의 차이(error)를 저장합니다
    errors = predict - df['SalePrice']
    
    mean_absolute_error = errors.abs().mean()

     

    RMSE (Root Mean Squared Error)

    오류의 제곱을 구하므로 실제 오류 평균보다 더 커지는 특성 때문에 MSE에 루트를 씌운 것. 
    사이킷런에서 제공하지 않음.

     

    R^2

    분산 기반으로 예측 성능을 평가하는 지표이다. 결정 계수라고도 하며 0~1사이의 값을 가진다. 회귀 분석에서 모델이 얼마나 훈련 데이터를 잘 설명하는지를 의미한다. 1에 가까울수록 독립변수 x에 의해 설명되는 것이 많은 모델이라고 할 수 있다. 하지만, R sqaure는 회귀선의 설명만 보여주는 지표이기 때문에 그 값이 낮다고 해서 회귀 분석에 대한 결과를 믿을 수 없다는 것은 아니다. 즉, 비선형 관계에서는 0에 가까운 값이 나올수 있다.

     

     

    회귀 (Regression)

    회귀 분석은 데이터 값이 평균과 같은 일정한 값으로 돌아가려는 경향을 이용한 통계학 기법이다. 회귀는 한 개의 종속 변수와 여러 개의 독립 변수 간의 상관 관계를 모델링하는 기법이다. 예를 들어, 주택 가격을 구할 때, 집의 크기, 주변 시설, 방 개수 등과 같은 독립 변수에 따라 종속 변수인 주택 가격이 결정된다. 

    • 종속변수는 반응(Response)변수, 레이블(Label), 타겟(Target)등으로 불린다.
    • 독립변수는 예측(Predictor)변수, 설명(Explanatory), 특성(feature) 등으로 불린다.

     

    위의 경우, 주택 가격은 Y, 집의 크기, 주변 시설, 방 개수는 X1, X2, X3 이다. W1, W2,.. , Wn은 독립 변수의 값에 영향을 미치는 회귀 계수 (Regression Coefficient)이다. 머신러닝 회귀 예측의 핵심은 최적의 회귀 계수를 찾는 것이다! 회귀에서 가장 중요한 것은 회귀 계수!

    회귀 계수가 선형이면 선형 회귀, 비선형이면 비선형 회귀로 나뉜다. 또한 독립 변수가 한 개이면 단일 회귀, 여러개 이면 다중 회귀로 분류된다. 

     

    선형 회귀 예측 모델

    회귀 분석에서 예측값과 잔차(residual, 오차와 비슷한 개념)이 중요하다. 여기서 잔차는 예측값 - 관측값의 차이로 오차와 비슷한 개념이다. RSS(Residual sum of squares)는 잔차 제곱들의 합이다. 이 RSS를 최소화 하는 직선을 회귀선이라고 한다. 

    RSS(Residual Sum of Squares) = SSE(Sum of Sqaure Error)
    = Cost Function (회귀 모델의 비용함수) 

    즉, 머신러닝이 학습한다는 것은 이 Cost Function을 최소화하는 모델을 찾는 과정이다. 

    계수 α와 β는 RSS를 최소화 하는 값으로 모델 학습을 통해 얻을 수 있다. 이런식으로 잔차제곱합을 최소화 하는 방법을 최소 제곱 회귀, Ordinary Least Squares (OLS)라 한다. OLS 기반의 회귀 계수 계산을 할 때, 특성의 독립성이 많은 영향을 끼친다.

    피처 간 서로 영향을 많이 끼치는 경우, 즉 상관 관계가 높은 경우 그만큼 오류에 민감해진다. 이 문제를 다중 공산성(multi-collinearity)라고 한다. 이 다중 공산성 문제를 해결 하기 위해 상관관계가 높은 피처가 많을 때는 중요한 피처 외는 규제(regulation)를 한다. 혹은 PCA를 통해 차원 축소를 하여 문제 해결 할 수 있다. 사이킷런에서는 LinearRegression 클래스가 RSS를 최소화해 OLS 추정 방식으로 구현한 클래스이다.

    규제는 일반적인 선형 회귀의 과적합 문제를 해결하기 위해서 회귀 계수에 페널티 값을 적용하는 것을 뜻한다. 규제 방법에 따라 다시 유형이 나뉜다. 

    • 일반 선형 회귀
    • 릿지 (Ridge)
    • 라쏘 (Lasso)
    • 엘라스틱넷 (ElasticNet)
    • 로지스틱 회귀 (Logistic Regression)

     

     

    Scikit-learn을 사용하여 단순 선형 회귀 모델 구현

    단순 선형 회귀 모델은 독립 변수도 하나, 종속 변수도 하나인 선형 회귀이다. 

    scikit-learn에는 구현되어 있는 많은 머신러닝 모델은 대부분 다음과 같은 프로세스로 동작한다. 

    • 현재 해결해야 하는 문제에 적합한 모델을 선택한다.
    • 해당 데이터를 준비한다.
    • fit() 메소드를 사용하여 모델 학습을 한다.
    • predict() 메소드를 사용하여 예측 값을 확인한다.
    from sklearn.linear_model import LinearRegression
    
    model = LinearRegression()
    
    feature = ['sqft_living']
    target = ['price']
    X_train = df[feature]
    y_train = df[target]
    
    model.fit(X_train, y_train)
    
    X_test = [[4000]]
    y_pred = model.predict(X_test)
    
    print(f'{X_test[0][0]} sqft GrLivArea를 가지는 주택의 예상 가격은 ${int(y_pred)} 입니다.')

    4000 sqft GrLivArea를 가지는 주택의 예상 가격은 $1078913 입니다.

    # 계수(coefficient)
    
    round(model.coef_[0][0])
    # 절편 (intercept)
    
    round(model.intercept_[0])

     

     

    ipywidgets를 사용해서 interactive 하게 예측

    from ipywidgets import interact
    
    # 데코레이터 interact를 추가합니다.
    @interact
    def explain_prediction(sqft=(500,10000)):
        y_pred = model.predict([[sqft]])
        pred = f"{int(sqft)} sqft 주택 가격 예측: ${int(y_pred[0])} (1 sqft당 추가금: ${int(model.coef_[0])})"
    
        return pred

     

    [코드스테이츠 렉처 노트를 바탕으로 작성되었습니다. ]

    'AI 부트캠프' 카테고리의 다른 글

    [n214] Logistic Regression  (0) 2021.10.21
    [n213] Ridge Regression  (0) 2021.10.20
    [프로젝트] 게임 설계를 위한 데이터 분석  (0) 2021.10.13
    [n134] Clustering  (0) 2021.10.01
    [n133] 고유벡터/고유값/PCA  (0) 2021.09.30

    댓글