선형회귀모델 Simple Regression

Ja L·2022년 12월 14일
0

Machine Learning

목록 보기
1/2

선형회귀(Linear Regression)

  • 선형회귀모델을 이해합니다.
  • 지도학습(Supervised Learning)을 이해합니다.
  • 회귀모델에 기준모델을 설정할 수 있습니다.
  • Scikit-learn을 이용해 선형 회귀 모델을 만들어 사용하고 해석할 수 있습니다.

  • 지도학습(Supervised Learning)에는 두 가지 방식이 있다
    1. 회귀(Regression)

    2. 분류(Classification)

      cf)

import matplotlib.pyplot as plt
import seaborn as sns

## SalePrice의 확률밀도함수를 그려보겠습니다
sns.displot(df['SalePrice'], kde=True)

## 평균과, 중간값으로 수직선을 그려보겠습니다.
plt.axvline(df['SalePrice'].mean(), color='blue')
plt.axvline(df['SalePrice'].median(), color='red');

기준 모델 (Baseline Model)

예측 모델을 구체적으로 만들기 전에 가장 간단하면서도 직관적이면서 최소한의 성능을 나타내는 기준이 되는 모델을 기준모델이라고 한다.

의미 :

최소한의 노력으로 만들어낸 모델인만큼 우리가 만들어야 할 예측모델은 이 모델보다는 좋아야한다.

Error=(priceguess)Error = (price - guess)
mae=(1n)i=1npriceiguessimae = (\frac{1}{n})\sum_{i=1}^{n}\left | price_{i} - guess_{i} \right |
    ## predict: 우리가 정한 기준모델인 평균으로 예측을 합니다
    predict = df['SalePrice'].mean()
    
    ## 평균값으로 예측할 때 샘플 별 평균값과의 차이(error)를 저장합니다
    errors = predict - df['SalePrice']
    
    ## mean_absolute_error(MAE), error에 절대값을 취한 후 평균을 계산합니다.
    mean_absolute_error = errors.abs().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');

예측모델(Predictive Model)

scatterplot에 가장 잘 맞는(best fit) 직선을 그려주면 그것이 회귀 예측모델이 된다.

회귀선은 잔차 제곱들의 합인 RSS(residual sum of squares)를 최소화 하는 직선이다. RSS는 SSE(Sum of Square Error)라고도 말하며 이 값이 회귀모델의 비용함수(Cost function)가 됩니다. 머신러닝에서는 이렇게 비용함수를 최소화 하는 모델을 찾는 과정을 학습이라고 한다.

RSS=i=1n(εi)2=i=1n(yif(xi))2=i=1n(yi(αxi+β))2{\displaystyle \operatorname {RSS} =\sum _{i=1}^{n}(\varepsilon _{i})^{2}=\sum _{i=1}^{n}(y_{i}-f(x_{i}))^{2}=\sum _{i=1}^{n}(y_{i}-(\alpha x_{i} + \beta))^{2}}

잔차 : 잔차(residual)는 예측값과 관측값 차이다.

오차 : 오차(error)는 모집단에서의 예측값과 관측값 차이를 말한다.

여기서 계수 α 와 β 는 RSS를 최소화 하는 값으로 모델 학습을 통해서 얻어지는 값이다. 이렇게 잔차제곱합을 최소화하는 방법을 최소제곱회귀 혹은 Ordinary least squares(OLS)라고 부른다.

보간(interpolate) :

데이터의 최솟값, 최댓값 사이의 값 중 데이터가 없는 값을 예측

외삽(extrapolate) :

데이터의 최솟값, 최댓값 밖의 값을 예측

선형회귀 직선은 독립변수(independent variable, x)와 종속변수(dependent variable, y) 간의 관계를 요약해 준다.

  • 종속변수는 반응(Response)변수, 레이블(Label), 타겟(Target)등으로 불린다.

  • 독립변수는 예측(Predictor)변수, 설명(Explanatory), 특성(feature) 등으로 불린다.


scikit-learn을 사용해서 선형회귀모델을 만들어보자

  • 특성 데이터와 타겟 데이터를 나누어 줍니다.
  • 특성행렬은 주로 X 로 표현하고 보통 2-차원 행렬입니다([n_samples, n_features]). 주로 NumPy 행령이나 Pandas 데이터프레임으로 표현합니다.
  • 타겟배열은 주로 y로 표현하고 보통 1차원 형태(n_samples) 입니다. 주로 Numpy 배열이나 Pandas Series로 표현합니다.
  • fit() 메소드를 사용하여 모델을 학습합니다.
  • 'predict()' 메소드를 사용하여 새로운 데이터를 예측합니다.
    ## Scikit-Learn 라이브러리에서 사용할 예측모델 클래스를 Import 합니다
    from sklearn.linear_model import LinearRegression
    
    ## 예측모델 인스턴스를 만듭니다
    model = LinearRegression()
    
    ## X 특성들의 테이블과, y 타겟 벡터를 만듭니다
    feature = ['GrLivArea']
    target = ['SalePrice']
    X_train = df[feature]
    y_train = df[target]
    
    ## 모델을 학습(fit)합니다
    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)} 입니다.')
    
    ## 전체 테스트 데이터를 모델을 통해 예측해 봅니다.
    X_test = [[x] for x in df_t['GrLivArea']]
    y_pred = model.predict(X_test)
    
    ## 전체 예측값 입니다.
    y_pred
    
    ## train 데이터에 대한 그래프를 그려보겠습니다.
    plt.scatter(X_train, y_train, color='black', linewidth=1)
    
    ## test 데이터에 대한 예측을 파란색 점으로 나타내 보겠습니다.
    plt.scatter(X_test, y_pred, color='blue', linewidth=1);

선형회귀모델의 계수(Coefficients)

모델이 주택의 크기와 가격 사이에서 어떤 관계를 학습했을까?

이 질문에 대한 답을 하기 위해 LinearRegression 객체의 coef_intercept_ 속성을 확인해 보자.

```python
## 계수(coefficient)
model.coef_

## 절편(intercept)
model.intercept_

#예측함수를 만들어 새로운 데이터를 반복해서 예측하고 coefficient의 영향을 설명해 본다.
def explain_prediction(sqft):
    y_pred = model.predict([[sqft]])
    pred = f"{int(sqft)} sqft 주택 가격 예측: ${int(y_pred[0])} (1 sqft당 추가금: ${int(model.coef_[0])})"

    return pred

## square_feet = 4000 인 테스트 데이터로 예측
print(explain_prediction(4000))
```

ipywidgets를 사용해서 sqft를 바꾸어 가며 예측해 보자.

 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
 ```
profile
DB Engineer

0개의 댓글