본문 바로가기

머신러닝

[Machine Learning] 지도학습 - 선형회귀(Linear Regression)

종속변수 y 와 한개 이상의 독립변수 X와의 선형 상관관계를 모델링 하는 회기분석(예측) 기법.
오류를 최소화 하거나 가능한 작게 만드는것

종속변수 y = Response 변수, Label, Target

독립변수 X = Predictor, Explanatory, feature (주로 Matrix라서 대문자 X)

선형회귀를 사용하는 목적 

  • Data값 예측
    선형 회귀를 사용해 데이터에 적합한 예측 모형을 개발한다. 개발한 선형 회귀식을 사용해 y가 없는 x값에 대해 y를 예측하기 위해 사용할 수 있다.
  • Data간의 관계 예측
    종속 변수 y와 이것과 연관된 독립 변수 X1, ..., Xp가 존재하는 경우에, 선형 회귀 분석을 사용해 Xj와 y의 관계를 정량화할 수 있다. Xj는 y와 전혀 관계가 없을 수도 있고, 추가적인 정보를 제공하는 변수일 수도 있다.

기준모델 (Baseline Model)

예측모델을 만들기전 간단하면서 직과적으로 최소한의 성능을 나타내는 기준이 되는 모델
(주로 평균값을 이용해 기준모델을 만들어서 이를 평균기준 모델이라고 한다.)

일반적으로 최소자승법(least square method)을 사용해 선형 회귀 모델을 세운다. 따라서 문제별로 그에 맞는 기준모델을 설정한다. 

  • 분류문제: 타겟의 최빈 클래스 (mode)
  • 회귀문제: 타겟의 평균값 (mean)
  • 시계열회귀문제: 이전 타임스탬프의 값 

Scikit-learn에서 선형회귀 process 순서

  1. 문제를 풀기에 적합한 모델 선택. 데이터프레임의 클래스, 속성, 하이퍼파라미터를 확인
  2. 데이터 준비
  3. fit()메소드 이용 모델 학습 시키기 (scikit-learn)
  4. predict() 메소드를 이용 새로운 데이터를 예측

회귀의 유형조건

  1. 독립 변수가 하나: 단순 선형 회귀 (simple linear regression):
  2. 독립 변수가 둘 이상: 다중 선형 회귀 (multiple linear regression)
  3. 독립 변수와 종속 변수가 선형 관계가 아닌 경우: Polynomial regression, Generalized Additive Model (GAM)
  4. 오차항의 확률분포가 정규분포가 아닌 경우: Generalized Linear Model (GLM)
  5. 오차항에 자기 상관성이 있는 경우: Auto-regression
  6. 데이터에 아웃라이어가 있는 경우: Robust regression, Quantile regression
  7. 독립변수 간에 상관성이 있는 경우(다중공선성): Ridge regression, Lasso regression, Elastic Net regression, Principal Component Regression (PCR), Partial Least Square (PLS) regression
- 일변량(Univariate) - 오직 하나의 양적 독립변수(설명변수)
- 다변량(Multivariate) - 두 개 이상의 양적 독립변수(설명변수)
- 단순(Simple) - 오직 하나의 종속변수(반응변수)
- 다중(Multiple) - 두 개 이상의 종속변수(반응변수)
- 선형(Linear) - 데이터에 대하여 가능한 변환을 취한 후, 모든 계수들이 방정식에 선형적으로 삽입되어 있음.
- 비선형(Nonlinear) - 종속변수(반응변수)와 일부 독립변수들의 관계가 비선형이거나 일부 계수들이 비선형적으로 나타남. 계수들을 선형적으로 나타나게 하는 어떤 변환도 가능하지 않음.
- 분산분석(ANOVA) - 모든 독립변수들이 질적 변수임.
- 공분산분석(ANCOVA) - 어떤 독립변수들은 양적변수이고 다른 독립변수들은 질적변수임.
- 로지스틱(Logistic) - 종속변수(반응변수)가 질적변수임.

 


단순선형회귀 (Simple linear regression)

단순선형 회귀모델을 만들기 위한 좋은 특성을 선택하기 위해 아래와 같은 사항들을 만족 해야한다.
1. 선형성 : 예측하고자 하는 종속변수y와 독립변수X 사이의 선형성을 만족해야하다. (만약 선형하지 않은 변수로 선형호귀분석을 시도할 경우 유의하지 않은 pvalue가 나온다.)
2. 잔차의 등분산성 : 잔차가 등분산성을 만족하지 않은경우, 매우 주요한 변수가 데이터에 추가되지 않고 빠져있다고 해석할 수 있다.잔차의
3. 정규성 : 이는 곧 잔차가 정규분포를 띄는지 여부를 의미하며 이는 유의하지 않은 데이터가 된다.
  1. scikit-learn 라이브러리에서 사용할 예측 모델 클래스 import.
    from sklearn.linear_model import LinearRegression​
  2. 예측모델 인스턴스를 생성
    model = LinearRegression()​
  3. X feature의 table과 y target 벡터 생성
    feature = ['독립변수X로예측의재료가되는col']
    target = ['종속변수y로예측하고싶은col']
  4. train / test 로 나누기
    X_train = df[feature]
    y_train = df[target]
  5. Model 학습(fit())
    model.fit(X_train, y_train)​
  6. 모델학습완료
  7. 새로운데이터로 학습한 모델을 통해 예측
    X_test = [[예측하고싶은int]]
    # 전체컬럼을 선택하고 싶을때 X_test = [[X] for x in df['예측재료']]
    
    y_pred = model.predict(X_test)​
  8. scatter plot으로 시각화 하여 확인
    # X, y train의 산점도
    plt.scatter(X_train, y_train)
    
    # 학습된 X_test의 산점도
    plt.scatter (X_test, y_pred)​

다중선형회귀 (Multiple linear Regression)

단순선형회귀와 달리 feature(특성)이 2개 이사이고, 테스트 MAE값(오류값)이 적어진다. 다만 과소적합이 잘 일어난다.

 

  1. scikit-learn 라이브러리에서 사용할 예측 모델 클래스 import.
    from sklearn.linear_model import LinearRegression​
  2. test / train 데이터로 나눈다.
    train = df.sample(frac=0.75,random_state=1)
    test = df.drop(train.index)​
  3. 타겟의 평균을 확인 - 타겟인 SalePrice의 평균을 기준모델로 사용
    train['SalePrice'].mean()​
    # SalePrice 평균값으로 예측(기준모델)
    predict = y_train.mean()
  4. train/test Label 정의 하기
    target = 'SalePrice'
    features = ['GrLivArea', 'OverallQual']
    y_train = train[target]
    y_test = test[target]
    X_train = train[features]
    X_test = test[features]
    
  5. Baseline(기준모델) 만들기 (train data의 평균값)
    model.fit(X_train, y_train)
    y_pred = model.predict(X_train)
  6. Baseline(기준모델)로 train data의 error 계산 (MAE)
    from sklearn.metrics import mean_absolute_error
    
    mae = mean_absolute_error(y_train, y_pred)
    print(f'훈련 에러: {mae:.2f}')​​
  7. Baseline(기준모델)로 Test data의 error 계산 (MAE)
    y_pred = [predict] * len(y_test)
    ​
    mae = mean_absolute_error(y_test, y_pred)
    print(f'테스트 에러: {mae:.2f}')
  8. train data로 모델 만들기
    model.fit(X_train, y_train)
  9. train data로만든 모델로 예측 진행하고 MAE확인
    y_pred = model.predict(X_train)
    
    mae = mean_absolute_error(y_train, y_pred)
    print(f'훈련 에러: {mae:.2f}')
  10. Test data로 모델 적용하여 예측 진행하고 MAE 확인
    # 테스트 데이터에 적용
    y_pred = model.predict(X_test)
    mae = mean_absolute_error(y_test, y_pred)
    print(f'테스트 에러: {mae:.2f}')​

    {분석단계}
  11.  회기계수 확인(절편/계수)
    medel.intercept_ (절편)
    model.coef_ (계수들)​
  12. 회기식 만들어 전체 확인
    ## 회귀식
    b0 = model.intercept_
    b1, b2 = model.coef_
    
    print(f'y = {b0:.0f} + {b1:.0f}x\u2081 + {b2:.0f}x\u2082')​
    y = -102743 + 54x₁ + 33059x₂
    --> B1과 B2모두 양수입니다. 이것은 x₁, x₂이 증가할 때마다 y도 증가한다는 뜻입니다. 만약 음수인 경우에는 y가 감소한다는 뜻

 


회귀모델의 계수

회귀모델의 계수를 확인하고 모델이 어떤 feature(특성)에 큰 영향을 받는지 그 feature들이 어떤 방향으로 target값에 영향을 주는지 알 수 있다. 

reg plot을 이용하여 확인 할 수 있다. 

회귀모델을 평가하는 평가지표들(evaluation metrics)

  • MSE (Mean Squared Error) =np.mean(np.square((y_true - y_pred))) 
  • MAE (Mean absolute error) =np.mean(np.abs((y_true - y_pred))) 
  • RMSE (Root Mean Squared Error) =np.sqrt(MSE(y_true, y_pred)) 
  • R-squared (Coefficient of determination) = 
  • 참고
    • SSE(Sum of Squares Error, 관측치와 예측치 차이): 
    • SSR(Sum of Squares due to Regression, 예측치와 평균 차이): 
    • SST(Sum of Squares Total, 관측치와 평균 차이): 
                                                                                       , SSE + SSR

자세한것은 다음 포스팅에

2021.06.28 - [머신러닝] - [Machine Learning] 회귀모델의 평가지표 - MSE, MAE, RMSE, R2, OLS (최소자승법; Ordinary Least Squares)