AI/MachineLearning

과적합 방지 기법 - 정규화

향식이 2021. 6. 4. 10:07

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

  • from sklearn.linear_model import Ridge : 사이킷런에 저장된 릿지회귀를 불러옵니다.
  • Ridge(alpha) : 릿지 회귀를 정의합니다.
    • alpha : 기본값은 1입니다.
    • alpha값이 클수록 더 강한 정규화를 적용합니다.
  • from sklearn.linear_model import Lasso : 사이킷런에 저장된 라쏘회귀를 불러옵니다. 
  • Lasso(alpha) : 라쏘 회귀를 정의합니다.
    • alpha: 기본값은 1입니다.
    • alpha값이 클수록 더 강한 정규화를 적용합니다. 
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

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

from sklearn.datasets import load_boston

def load_data():
    
    X, y = load_boston(return_X_y = True)
    
    feature_names = load_boston().feature_names 
    
    return X,y,feature_names

def Ridge_regression(X, y):
    
    # alpha : 정규화를 적용할 정도, 클수록 더 강한 정규화 적용
    # 중요하지 않은 베타는 0에 가까워짐
    ridge_reg = Ridge(alpha = 10)
    
    ridge_reg.fit(X, y)
    
    return ridge_reg

def Lasso_regression(X, y):
    
    # alpha 값이 너무 크면 중요한 값을 잃을 수 있음
    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()

 

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

  • from sklearn.linear_model import ElasticNet : 엘라스틱넷 회귀를 불러옵니다.
  • ElasticNet(alpha, l1_ratio)
    • alpha: 기본값은 1입니다.
    • alpha값이 클수록 더 강한 정규화를 적용합니다. 
    • l1_ratio: L1 정규화를 반영할 비율
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

from sklearn.linear_model import ElasticNet
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston

def load_data():
    
    X, y = load_boston(return_X_y = True)
    
    feature_names = load_boston().feature_names
    
    return X,y,feature_names

def ElasticNet_regression(train_X, train_y):
    
    ElasticNet_reg = ElasticNet(alpha = 0.001, l1_ratio = 0.002)
    
    ElasticNet_reg.fit(train_X, train_y)
    
    return ElasticNet_reg
    
    
# 각 변수의 beta_i 크기를 시각화하는 함수입니다.
def plot_graph(coef):
    coef.plot(kind='bar')
    
    plt.savefig("result.png")
    elice_utils.send_image("result.png")
    
    
def main():
    
    X,y,feature_names = load_data()
    
    train_X, test_X, train_y, test_y = train_test_split(X,y,test_size=0.2, random_state=100)
    
    elasticnet_reg = ElasticNet_regression(train_X, train_y)
    
    # 엘라스틱넷 회귀 모델 평가 점수 출력하기
    score = elasticnet_reg.score(test_X,test_y)
    print("ElasticNet 회귀의 평가 점수:", score)
    
    # 엘라스틱넷 회귀의 beta_i의 크기를 저장하기
    ElasticNet_coef = pd.Series(elasticnet_reg.coef_, feature_names).sort_values()
    print("\nElasticNet 회귀의 beta_i\n", ElasticNet_coef)
    
    plot_graph(ElasticNet_coef)
    
    return elasticnet_reg

if __name__=="__main__":
    main()

출처: 앨리스 교육

반응형