ML

과적합 방지 기법, 알고리즘 평가 지표

recordmastd 2024. 11. 25. 07:01

K-fold 교차 검증

 

X, y = load_boston(return_X_y = True)

- return_X_y=True는 변수를 X, y로 분리해서 저장하기 위해 작성

더보기
import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression

# sklearn의 KFold 모듈 불러오기
from sklearn.model_selection import KFold

"""
1. 사이킷런에 존재하는 데이터를 불러오고,
   불러온 데이터를 학습용 데이터와 테스트용 데이터로
   분리하여 반환하는 함수를 구현합니다.
   
   Step01. 사이킷런에 존재하는 boston 데이터를
           (X, y)의 형태로 불러옵니다.
   
   Step02. 불러온 데이터를
           학습용 데이터와 테스트용 데이터로
           분리합니다.
           
           학습용 데이터로 전체 데이터의 80%를,
           테스트용 데이터로 나머지 20%를 사용합니다.
           
           동일한 결과 확인을 위하여 random_state를
           100으로 설정합니다.
"""
def load_data():
   
    X, y = load_boston(return_X_y = True)
   
    train_X, test_X, train_y, test_y = train_test_split(X, y, test_size = 0.2, random_state = 100)
   
    return train_X, test_X, train_y, test_y
   

"""
2. K-fold 교차 검증을 통한
   모델 학습 및 예측 수행을 진행할 함수를 구현합니다.
   
   Step01. 전체 데이터를 5개로 분리할 수 있도록
           KFold 객체를 정의합니다.
           
   Step02. 정의한 kFold 객체와 .split() 함수를 이용하여
           학습용 데이터 내에서 다시
           학습용(Train) 데이터와 검증용(Validation)
           데이터를 나누고
           각각 X_train, X_val, y_train, y_val에
           저장합니다.
           
           train_idx 와 val_idx는 분리된 데이터들의
           인덱스입니다.
           
   Step03. 분리한 학습용 데이터로 모델을 학습시키고,
           검증용 데이터로 모델을 평가하여
           각 데이터에 대한 모델 평가 점수를 score
           변수에 저장합니다.
"""
def kfold_regression(train_X, train_y):
   
    # 반복문 내에서 횟수를 표시하기 위한 변수 설정하기
    n_iter = 0
   
    # 각 fold 마다 모델 검증 점수를 저장하기 위한 빈 리스트 생성하기
    model_scores = []
   
    kfold = KFold(n_splits = 5)
   
    for train_idx, val_idx in kfold.split(train_X):
       
        X_train, X_val = train_X[train_idx], train_X[val_idx]
        y_train, y_val = train_y[train_idx], train_y[val_idx]
       
        # 동일한 가중치 사용을 위해 각 fold 마다 모델 초기화 하기
        model = LinearRegression()
       
        # k-fold를 이용하여 분리한 데이터만 학습
        model.fit(X_train, y_train)
       
        # 각 Iter 별 모델 평가 점수 측정
        score = model.score(X_val, y_val)
       
        # 학습용 데이터의 크기를 저장합니다.
        train_size = X_train.shape[0]
        val_size = X_val.shape[0]
   
        print("Iter : {0} Cross-Validation Accuracy : {1}, Train Data 크기 : {2}, Validation Data 크기 : {3}"
              .format(n_iter, score, train_size, val_size))
   
        n_iter += 1
       
        # 전체 모델 점수를 저장하는 리스트에 추가하기
        model_scores.append(score)
       
    return kfold, model, model_scores
       
       
def main():
   
    # 학습용 데이터와 테스트 데이터 불러오기
    train_X, test_X, train_y, test_y = load_data()
   
    # KFold 교차 검증을 통한 학습 결과와 회귀 모델을 반환하는 함수 호출하기
    kfold, model, model_scores = kfold_regression(train_X, train_y)
   
    # 전체 성능 점수의 평균 점수 출력
    print("\n> 평균 검증 모델 점수 : ", np.mean(model_scores))
   

   
if __name__ == "__main__":
    main()

 

Ridge(L2 Regularzation): 중요하지 않은 beta를 0에 가깝게 만드는 회귀,

Rasso(L1 Regularzation): 중요하지 않은 beta를 0에 가깝게 만드는 회귀

릿지(Ridge), 라쏘(Lasso) 회귀를 위한 사이킷런 라이브러리/함수

from sklearn.linear_model import Ridge : 사이킷런에 저장된 릿지 회귀를 불러옵니다.
ridge_reg=Ridge(alpha=a): 릿지 회귀 모델 ridge_reg를 정의합니다.
alpha: 기본값은 1입니다.
alpha값이 클수록 더 강한 정규화를 적용합니다.
ridge_reg.fit(X, y): ridge_reg 모델에 데이터 X, y를 학습시킵니다.
from sklearn.linear_model import Lasso : 사이킷런에 저장된 라쏘 회귀를 불러옵니다.
lasso_reg=Lasso(alpha=a): 라쏘 회귀 모델 lasso_reg를 정의합니다.
alpha: 기본값은 1입니다.
alpha값이 클수록 더 강한 정규화를 적용합니다.
lasso_reg.fit(X, y): lasso_reg 모델에 데이터 X, y를 학습시킵니다.

-

더보기
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

from elice_utils import EliceUtils
elice_utils = EliceUtils()

from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso

from sklearn.datasets import load_boston

"""
1. 사이킷런에 존재하는 데이터를 불러오고,
   불러온 데이터를 학습용 데이터와 테스트용 데이터로
   분리하여 반환하는 함수를 구현합니다.
   
   Step01. 사이킷런에 존재하는 boston 데이터를
           (X, y)의 형태로 불러옵니다.
   
   Step02. 데이터의 변수 이름을 feature_names 에
           저장합니다.
"""
def load_data():
   
    X, y = load_boston(return_X_y = True)
   
    feature_names = load_boston().feature_names
   
    return X,y,feature_names
   
"""
2. 릿지(Ridge) 회귀를 구현하고,
   전체 데이터를 바탕으로 학습시킨 모델을
   반환하는 함수를 완성합니다.
   
   Step01. 사이킷런에 구현되어 있는
           릿지(Ridge) 회귀 모델을 불러옵니다.
           
           파라미터 alpha를 10으로 설정합니다.
   
   Step02. 불러온 모델을 전체 데이터에 맞춰
           학습시킵니다.
"""
def Ridge_regression(X, y):
   
    ridge_reg = Ridge(alpha = 10)
   
    ridge_reg.fit(X, y)
   
    return ridge_reg

"""
3. 라쏘(Lasso) 회귀를 구현하고,
   전체 데이터를 바탕으로 학습시킨 모델을
   반환하는 함수를 완성합니다.
   
   Step01. 사이킷런에 구현되어 있는
           라쏘(Lasso) 회귀 모델을 불러옵니다.
           
           파라미터 alpha를 10으로 설정합니다.
   
   Step02. 불러온 모델을 전체 데이터에 맞춰
           학습시킵니다.
"""
def Lasso_regression(X, y):
   
    lasso_reg = Lasso(alpha = 10)
   
    lasso_reg.fit(X, y)
   
    return lasso_reg
   
# 각 변수의 beta_i 크기를 시각화하는 함수입니다.
def plot_graph(coef, title):
    fig = plt.figure()
   
    plt.ylim(-1,1)
    plt.title(title)
    coef.plot(kind='bar')

    plt.savefig("result.png")
    elice_utils.send_image("result.png")


def main():
   
    X,y,feature_names = load_data()
   
    ridge_reg = Ridge_regression(X, y)
    lasso_reg = Lasso_regression(X, y)
   
    ## Ridge 회귀의 beta_i의 크기를 저장합니다.
    ridge_coef = pd.Series(ridge_reg.coef_, feature_names).sort_values()
    print("Ridge 회귀의 beta_i\n", ridge_coef)
   
    ## Lasso 회귀의 beta_i의 크기를 저장합니다.
    lasso_coef = pd.Series(lasso_reg.coef_, feature_names).sort_values()
    print("Lasso 회귀의 beta_i\n", lasso_coef)
   
    plot_graph(ridge_coef, 'Ridge')
    plot_graph(lasso_coef, 'Lasso')

if __name__=="__main__":
    main()

Series()

feature_names = ['feature1', 'feature2', 'feature3']
ridge_reg.coef_ = [0.5, -0.2, 1.3]

ridge_coef = pd.Series(ridge_reg.coef_, feature_names)
// 출력
feature1    0.5
feature2   -0.2
feature3    1.3
dtype: float64

sort_values(): 내림차순으로 정렬

 

엘라스틱넷(ElasticNet)

: L1, L2 정규화를 동시에 사용하여 두 회귀의 장점을 가진 회귀인 엘라스틱넷 회귀

엘라스틱넷 회귀를 위한 사이킷런 함수/라이브러리

from sklearn.linear_model import ElasticNet: 엘라스틱넷 회귀를 불러옵니다.
ElasticNet_reg=ElasticNet(alpha, l1_ratio): ElasticNet모델 ElasticNet_reg을 정의합니다.
alpha: 클수록 더 강한 정규화를 적용합니다. 기본값은 1입니다.
l1_ratio: L1 정규화를 반영할 비율
ElasticNet_reg.fit(X, y): ElasticNet_reg에 데이터 X, y를 학습시킵니다.

 

RSS(Residual Sum of Squares)

: 실제값과 예측값의 단순 오차 제곱 합

 

 

 

 

MES(Mean Squared Error): 평균 제곱 오차,

MEA(Mean Absolute Error): 평균 절댓값 오차 

 

 

 

R_squred(결정 계수): 회귀 모델의 설명력을 표현하는 지표, 1에 가까울수록 높은 성능