본문 바로가기

CodeStates

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

  •  

목차

 

#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)
  • 로지스틱 회귀모델

 

#2

 


다중선형회귀: 

다중 선형 회귀 모델은 선형 회귀 모델에서 두개 이상의 Feature를 선택해 선형 회귀 모델링을 하는 것을 말한다.

기존의 단순 선형 회귀 모델의 식은 y = f(x) + e였지만 특성이 2개일 경우 y = f(x) + g(x) + e가 된다.


 

 

 

 


Scikit-learn을 이용한 선형회귀모델 - 다중선형회귀(Multiple Linear Regression)

1. Categorical한 데이터를 수치화 시키는 법 : One-HotEncoding:

 

머신러닝은 Numeric한 데이터를 가지고 학습을 한다. 그런데 Feature를 고를 때 내용이 위의 사진과 같이 Red, Yellow, Green 같이 Categorical한 데이터라면 어떻게 해야할까?

Red =0, Yellow=1, Green =2 이렇게 Label을 붙이는 ordinal encoding을 생각했다면 좋지 않은 방법이다. 색상에는 우선순위가 없는데 이러한 방법을 사용하게 된다면 색상의 수가 늘어날수록 숫자 또한 커져 데이터 대소관계가 발생하게 되고 이는 결과에 영향을 엉뚱한 끼칠수도 있기 때문이다.

 

그렇기에 이를 해결할 수 있는 One-HotEncoding을 소개하겠다.

One-HotEncoding이란 아래와 같이 일종의 진리표(?)를 만드는 것이다. 이렇게 하면 Red =0, Yellow=1, Green =2을 뒀을 때와 달리 Color의 크기가 다르지도 않고 구분이 가능하다. 

출처 : https://www.kaggle.com/dansbecker/using-categorical-data-with-one-hot-encoding

하지만 One-HotEncoding을 수행하게 되면 각 카테고리에 해당하는 변수들이 모두 차원에 더해지기 때문에 카테고리가 너무 많은 경우에는 사용하기 적합하지 않다.

One-HotEncoding은 범주형 데이터에만 수행되기때문에 예를들어 개체 종류 1, 2, 3 이런식으로 숫자로 구분되는 명목형 범주형 변수의 경우 Numeric한 데이터로  인식될 수 있기 때문에 이러한 경우 데이터를 직접 보고 신경 써줘야 한다.

사용예시

from category_encoders import OneHotEncoder
encoder = OneHotEncoder(use_cat_names = True)
df = encoder.fit_transform(df)

 

 

 

2. 하나의 데이터에서 Train/Test를 나누는 방법:

 

지난 시간에는 예시에서 Train데이터와 Test데이터를 따로 로드하여서 모델링을 하였다. 하지만 데이터가 분리되어 있지 않을때 Train데이터와 Test데이터를 구하기 위해서는 어떻게 해야할까?

 

일단 Train데이터와 Test데이터를 하나로 돌린다는 방법은 매우 좋지 않은 방법이다.

Train데이터에서 학습을하고 같은 데이터인 Test데이터에서 테스트를 진행한다면 매우 좋은 결과가 나오겠지만 이는 무의미하다. 마치 문제집을 풀고 시험장에서 문제집의 문제와 완전히 똑같은 문제가 나오기를 기도하는 것과 같은맥락이다. 문제집으로 학습을 하고 시험장에 가서 비슷한 유형의 문제를 푸는 경우는 있어도 완전히 똑같은 문제를 푸는 경우는 없지않은가 그렇기에 Train데이터에서 학습하는 내용이 Test데이터에 중복되지 않도록 분리를 해줘야한다.

 

데이터를 분리하는 방법은 두가지가 있다.

무작위로 데이터를 분리하는 방법 vs 시간순으로 데이터를 분리하는 방법

일단 기본적으로는 데이터를 무작위로 분리하는 것이 맞지만, 시간이 관련된 데이터를 분석할 경우 (시간 변화에 따른 ~~의 예측 결과)이때의 Train데이터는 Test데이터보다 과거의 시간대로 학습해야한다.

 

※ 시계열 데이터를 시간으로 변환하는 방법 

※ df['date'] = pd.to_datetime(df['date']) 을 사용하여 데이터의 형태를 datetime64형태로 바꿔줄 수 있다.

 

2-1. 데이터를 분류하는 방법 1 : Sample을 이용한 무작위 분류 :

##DataFrame은 42515rows x 9columns를 가지고 있다고 가정한다.

##결측치가 없다고 가정한다.

##Train : Test = 8 : 2 의 비율로 설정한다

from category_encoders import OneHotEncoder

#OneHotEncoder 설정
encoder = OneHotEncoder(use_cat_names = True)

#Data을 OneHotEncoding
df = encoder.fit_transform(df)

#DataFrame의 80%를 Train데이터로 분류
Train = df.sample(frac = 0.8, random_state = 2) 
#Train index 만큼을 drop해 Test데이터로 분류
Test = df.drop(Train.index)

#Feature 및 Target설정
features = ['특성1', '특성2']
target = '타겟'

#Train데이터 설정
X_train = train[features]
y_train = train[target]

#Test데이터 설정
X_test = test[features]
y_test = test[target]


X_train.shape, X_test.shape, y_train.shape, y_test.shape, df.shape

##결과 (예시)

((34012, 54), (8503, 54), (34012,), (8503,), (42515, 55))

 

2-2. 데이터를 분류하는 방법 2 : train_test_split을 이용한 무작위 분류 :

##DataFrmae은 42515rows x 9columns를 가지고 있다고 가정한다.

##결측치가 없다고 가정한다.

##Train : Test = 8 : 2 의 비율로 설정한다

from category_encoders import OneHotEncoder
from sklearn.model_selection import train_test_split
##OneHotEncoder 설정
encoder = OneHotEncoder(use_cat_names = True)

##Data을 OneHotEncoding
df = encoder.fit_transform(df)

##Feature 및 Target설정
features = ['특성1', '특성2']
target = '타겟'

##X = Feature, y = Target
x = df[features]
y = df[target]

##Train_test_slipt을 통한 Data Split
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size= 0.2, train_size= 0.8, random_state=2)

X_train.shape, X_test.shape, y_train.shape, y_test.shape, df.shape

##결과 (예시)

((34012, 54), (8503, 54), (34012,), (8503,), (42515, 55))

 

 

2-3. 다중선형회귀 모델링 :

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, r2_score

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

##모델 훈련
model.fit(X_train,y_train)

##Train 예측값
y_predict_train = model.predict(X_train)

##Test 예측값
y_predict_test = model.predict(X_test)

##생성된 모델의 회귀계수와 절편을 구함.
b0 = model_intercept_
b1,b2 = model.coef_

##회귀계수와 절편으로 관계식을 도출.
print(f'y = {b0} + {b1} x\u2081 + {b2} x\u2082')
print(f"'특성1' 회귀계수 : {b1}\'특성2' 회귀계수 : {b2}")


##생성된 모델의 Train 예측값과 Train Target값의 MAE를 계산
mae_train = mean_absolute_error(y_train, y_predict_train)
##생성된 모델의 Test 예측값과 Test Target값의 MAE를 계산
mae_test = mean_absolute_error(y_test, y_predict_test)

##생성된 모델의 Train 예측값과 Test Target값의 R2를 계산
r2_train = r2_score(y_train, y_predict_train)
##생성된 모델의 Test 예측값과 Test Target값의 R2를 계산
r2_test = r2_score(y_test, y_predict_test)


print(f'트레이닝 에러 :{mae_train},테스트 에러 :{mae_test}')
print(f'트레이닝 R2 :{r2_train}, 테스트 R2 :{r2_test}')

##결과 (예시)

y = -40243 + -4158.925 x₁ + 186.137 x₂
'특성 1' 회귀계수 : -4158.925 '특성 2' 회귀계수 : 186.137

 

 

 

2-4. 회귀계수 해석 :

생성된 회귀모델을 평가하는 지표는 MAE, MSE, RMSE, R2가 있고 그 뜻은 다음과 같다.

from sklearn.metrics import mean_absolute_error, r2_score

##생성된 모델의 Train 예측값과 Train Target값의 MAE를 계산
mae_train = mean_absolute_error(y_train, y_predict_train)
##생성된 모델의 Test 예측값과 Test Target값의 MAE를 계산
mae_test = mean_absolute_error(y_test, y_predict_test)

##생성된 모델의 Train 예측값과 Test Target값의 R2를 계산
r2_train = r2_score(y_train, y_predict_train)
##생성된 모델의 Test 예측값과 Test Target값의 R2를 계산
r2_test = r2_score(y_test, y_predict_test)


print(f'트레이닝 에러 :{mae_train},테스트 에러 :{mae_test}')
print(f'트레이닝 R2 :{r2_train}, 테스트 R2 :{r2_test}')

트레이닝 에러 :100777.3421,테스트 에러 :109252.5259

트레이닝 R2 : 0.50, 테스트 R2 : 0.45

 

 

 


 

 

 

 

 

 


3. Overfitting과 Underfitting :

 

생성된 모델이 Test데이터에서 만들어내는 오차를 일반화(generalization)오차라고 부른다.

Train데이터와 Test데이터에서 좋은 성능을 내는 모델은 일반화가 잘 된 모델이라고한다.

Train데이터에서는 오차가 작아 성능이 좋았지만 Test에서는 오차가 큰것을 과적합(Overfitting)이라고한다.

Train데이터에서 오차가 크고 Test에서도 오차가 큰것을 과소적합(Underrfitting)이라고한다.

 

Bias(편향)와 Variance(분산)

생성된 모델이 Train데이터에서 Feature와 Target의 변수 관계를 잘 파악하지 못할 경우 Bias(편향)이 높고 이를 과소적합이라고 한다.

 

생성된 모델이 Train데이터의 노이즈 데이터에 민감하게 적응해 Test데이터에서 일반화를 잘 못하는 경우  Variance(분산)이 높고 하고 과적합이라고 한다.

 

Underfitting의 경우 Feature와 Target의 관계를 파악하지 못하고 잔차값이 매우 큰 것을 볼 수 있다.

※ 편향이 높을 경우 특성 및 타겟 관계 파악 못함 = 과소적합

해결방법 1)T파라미터가 많은 복잡한 Data추가 2)과대접이 되기 전까지 학습

※ 너무 많은 하이퍼 파라미터를 높일 경우 과소접합문제 발생 가능성 높음

 

Goodfitting의 경우 Feature와 Target의 관계를 잘파악해 잔차값이 적은 것을 볼 수 있다.

 

Overfitting의 경우 Feature와 Target의 관계를 매우 잘파악해 잔차값이 적은 것을 볼 수 있다. 하지만 이러한 경우에 너무 Fit해서 새로운 데이터가 들어오면 잔차값이 커질 가능성이 높다.

※ 분산이 높을 경우 데이터에 따른 노이즈에 민감함 = 과적합

해결방법 1)Test Data 확보 2)정규화를 통한 복잡한 Test Data 제거 3)오류 및 이상치 Data 제거

예시) n차 이상의 Data를 2~3차원의 Data로 변경하여 성능은 전보다 떨어질 수 있지만 필요 이상의 복잡한 Data 학습하지 않는다.

     

출처 : https://medium.com/analytics-vidhya/the-dangers-of-under-fitting-and-over-fitting-495f9efa1847

 

 

 

 


4. 다항회귀모델 :

Feature와 Target의 비선형 관계를 학습할 수 있는 모델로. degree(차수)를 조정해 회귀 곡선을 만들 수 있다.

차원수가 높아지면 모델의 복잡성이 늘어난다. 모델이 복잡해질 수록 Train성능은 계속해서 증가하는데 Test성능은 증가세를 보이다가 어느 순간 낮아지는 과적합 지점이 나타난다.

 

from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures
import matplotlib.pyplot as plt

##모델 인스턴스 degree = 4
model = PolynomialRegression(4)

##모델을 Train으로 학습    
model.fit(X_train, y_train)


train_r2 = model.score(X_train, y_train)
test_r2 = model.score(X_test, y_test)

print(f'train R2 {train_r2:.2f}')
print(f'test R2 {test_r2:.2f}')

plt.scatter(X_train, y_train, color='blue', alpha=0.5)
plt.scatter(X_test, y_test, color='red', alpha=0.5)
    

x_domain = np.linspace(X.min(), X.max())
curve = model.predict(x_domain)
plt.plot(x_domain, curve, color='blue')
#plt.axis([-2., 2.0, -0.5, 0.5])
plt.show()

    
train_r2s.append(train_r2)
test_r2s.append(test_r2)

 

'CodeStates' 카테고리의 다른 글

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