본문 바로가기

CodeStates

[머신러닝 - 선형모델]#1

  •  

목차

 

#1

 

  • 선형회귀(Linear Regression)
  • 기준 모델(Baseline Model)
  • 예측 모델(Predictive Model)
  • Scikit-learn을 이용한 선형회귀모델 - 단순 선형 회귀(Simple Linear Regression)
  • 선형 회귀 모델 계수, 회귀계수 (Coeeficients)

 

#2

  • 다중선형회귀(Multiple Linear Regression)
  • Scikit-learn을 이용한 선형회귀모델 - 다중선형회귀(Multiple Linear Regression) 
    1)Categorical한 데이터를 수치화 시키는법
    2)하나의 데이터에서 Train/Test를 나누는 방법
    3)다중선형회귀 모델링
    4)회귀계수 해석
  • Overfitting과 Underfitting
  • 다항회귀모델

 

 

 

 

#3

  • 릿지회귀 (Ridge Regression)
  • Feature Engineering - 특성 선택 (Feature Selection)
    1)SelectKBest이용
  • Ridge Regression 모델링
    -Cross Validation

 

#4

  • 훈련/검증 /테스트
  • 분류(Classification)
  • 로지스틱 회귀모델

 

#1

 

 

선형 회귀: 

먼저 선형 모델은 연속적인 데이터 Y와 이 Y의 원인이라고 추정되는 X간의 관계를 추정하기 위한 관계식으로

Y = f(x)

와 같은 관계식이 구성되지만 실제 데이터에는 측정의 한계나 여러 원인으로 인한 데이터 잡음, 유실이 발생해 정확한 관계식을 만들 수 없어 확률 변수인 오차항을 두게 된다.

Y = f(x) + e

 

회귀 모델에서의 회귀란 데이터가 회귀 모델이 제시한 추세선으로 회귀하는 것이라고 할 수 있다.

즉 회귀 모델이란, 데이터의 실측치와 모델의 추정치의 사이의 잔차가 I.I.D (Independent and identically distributed

 random variables) (독립적이고 동일하게 분포 된 랜덤 변수) 성질을 만족하면서, 오차의 합이 최소가 되도록 만드는 작업이다.

 

실제로 선형회귀를 모델링하면 주어진 데이터 집합에 대해, 종속변수 y와 설명번수 x사이의 선형관계를 모델링한다.

독립변수1개와 종속변수1개를 가진 선형 회귀 예시 [출처 : 위키 백과]

 

 

기준 모델(Baseline Model):

기준 모델이란 예측 모델을 만들기 전에, 가장 간단하고 직관적이며 최소한의 성능을 가지고 있는 기준이 되는 모델을 뜻한다. 이번에 설명할 기준 모델은 Mean값을 이용한 방법 중 MAE, MSE, RMSE 중 MAE 를 구해서 이를 기준으로 삼는 모델이다.

 

※문제별로 기준모델은 보통 다음과 같이 설정한다.

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

MAE(평균 절대 오차) = |실데이터 - 평균값| / 개수

실데이터와 평균값의 차이의 절대값의 합을 개수로 나눈것.

빨간선은 MAE값, 파랑선은 실 데이터를 뜻한다.

 

 

예측 모델(Baseline Model):

Scatterplot에 가장 알맞는(best fit) 직선을 그려주면 그것이 회귀 예측모델이 된다. 이때의 직선을 회귀선이라고 부른다. 

회귀선은 잔차 제곱들의 합인 RSS를 최소화 하는 직선으로 RSS(residual sum of squares)는 SSE(Sum of Square Error)라고도 부르고 회귀모델의 비용함수가 된다.

즉 머신러닝에서의 학습은 비용함수를 최소화 하는 모델을 찾는 것이다.

 

잔차란 예측값과 관측값의 차이를 뜻하는 것으로 아래의 그림에서 빨간선이 예측값 파란 점이 관측값이다. 그리고 이 사이의 거리(차이)가 잔차를 뜻한다.

 

 

Scikit-learn을 이용한 선형회귀모델 - 단순 선형 회귀(Simple Linear Regression):

scikitlearn은 머신러닝 모델을 만드는 라이브러리다.

 

머신러닝 모델을 만들기 위해서는 먼저 종속변수 데이터와 독립변수 데이터를 나눠줘야한다.

 

독립변수는 예측(Predictor), 설명(Explanatory), 특성(feature)이라고 부르며 보통 x축에 위치하고,

종속변수는 반응(Response), 레이블(Label), 타겟(Target)이라고 부르며 보통 y축에 위치한다.

 

라이브러리를 사용해서 모델을 만들기 위해

Feature(독립변수)는 Matrix의 자료형을 가져야하고 Target(종속변수)는 Vector형태의 데이터 구조를 가져야한다. 이때 Feature Matrix는 보통 2차원 행렬이며 대문자 X로 표현을 한다. 주로 Numpy행렬이나 DataFrame 형태를 가진다.Label Vector는 보통 1차원 형태이며 소문자 y로 표현을 한다. 주로 Numpy배열이나 Seires 형태를 가진다.

 

아래는 머신러닝의 모델을 만드는 예시이다. 위의 MAE를 사용한 기준 모델과 다른 회귀선이 나타난 것을 확인 할 수 있다.

 

 

##Trian Data을 df_train로 로드하였다고 가정한다.
##Test Data을 df_test로 로드하였다고 가정한다.
##하나의 Data를 가지고 Train, Test를 나눠야 할 때도 있는데 이는 추후에 설명 하겠다.

## Scikit-Learn 라이브러리에서 사용할 예측모델인 LinearReression 클래스를 Import
from sklearn.linear_model import LinearRegression

## 선형회귀모델 인스턴스.
model = LinearRegression()

## Train 데이터를 생성 
## X에는 사용할 특성인 Feature Matrix, y에는 사용할 타겟인 Target Vector를 만든다.
## 이때 X는 Matrix y는 Vector의 데이터 구조여야한다.

feature = ['특성1']
target = ['타겟']
X_train = df_train[feature]
y_train = df_train[target]


## fit을 사용해 모델을 학습한다.
model.fit(X_train, y_train)

##Test 데이터를 모델을 통해 예측.
X_test = [[x] for x in df_test['특성1']]
y_pred = model.predict(X_test)


##Train 데이터와 Test 데이터를 그림.
plt.scatter(X_train, y_train, color='blue', linewidth=1)
plt.scatter(X_test, y_pred, color='red', linewidth=1)

 

선형 회귀 모델 계수, 회귀계수 (Coeeficients):

위의 그림과 같은 경우, 빨간선은 회귀선을 뜻하며 이 선의 기울기는 회귀계수를 뜻한다.

회귀계수란 Feature가 증가함에 따라 Target이 나타나는 정도를 예측한 것이다.

 

##생성된 모델의 회귀계수를 구하는 방법이다.
##모델명.coef_를 사용하여 모델의 회귀계수인 coefficient를 구할 수 있다.
##이는 빨간색 직선의 기울기를 뜻한다.
##모델명.intercept_를 사용하여 모델의 절편 또한 구할 수 있다.

print(f'기울기 {model.coef_}\n절편 {model.intercept_}')

 

기울기 [[24242.56245838]]
절편 [-1042555.97700977]

 

위와 같이 특성을 선택해서 선형회귀모델을 만들었을때 어떤 특성이 더 좋은 모델을 생성했을까를 비교하려면 어떻게 해야할까?

 

### Scale이 다른 특성 두개를 가지고 모델링을 진행했다고 가정한다.
### y_predict_1은 '특성1', y_predict_2은 '특성2'를 가지고 모델링을 진행했다.
### 두 모델을 비교했을때 특성1의 회귀계수는 24242 특성2의 회귀계수는 250 이다.
### 둘의 모델의 회귀계수(coefficient) 즉, 기울기의 크기는 특성1이 더 크다.
### 하지만 '특성1'과 '특성2'의 scale이 다르기 때문에 Target의 결과를 모델만을 가지고는 비교하기는 힘들다.
### 그래서 이를 비교하기 위해 MAE를 사용해 2개의 예측 값(위의 사진에는 나와있지 않지만 그려진 직선 또한 2개)과 타겟값의 차이를 비교한다.

from sklearn.metrics import mean_absolute_error

print(mean_absolute_error(df_test['타겟'], y_predict_1), mean_absolute_error(df_test['타겟'], y_predict_2))


### 결과 : y_predict_1의 MAE = 175179.0251031181 y_predict_2의 MAE = 173688.2733595311
#MAE의 차이가 적은 '특성2'가 더 좋은 모델임

 

'CodeStates' 카테고리의 다른 글

[머신러닝 - 선형모델]#3  (0) 2021.04.08
[머신러닝 - 선형모델]#2  (0) 2021.04.08
[선형대수학]#2  (0) 2021.03.22
[선형대수학] #1  (0) 2021.03.21
[통계] #3  (0) 2021.03.15