ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 지도학습 | 리지 회귀 (Ridge Regression)
    Machine Learning/ML with Python Library 2024. 3. 30. 14:02

    리지회귀는 기본 선형 회귀 방식 대신 가장 널리 쓰이는 모델이다. 리지 회귀에서 가중치, weight(w) 서택은 훈련 데이터를 잘 예측하기 뿐만 아니라, 이 weight의 절대값을 가능한 작게 만드는 목적을 갖고 모델을 만든다. 다시 말해, 모든 w가 0에 가깝게 되길 원한다. 즉, 모든 특성이 주는 영향을 최소한으로 만드는 것이다. 이런 제약을 규제, regulation이라고 한다. 규제란, 과대 적합이 되지 않도록 모델을 강제로 제한한다는 의미이다. Ridge Regression에 사용하는 규제 방식을 L2 Regulation이라고 한다. 

     

    Ridge and Alpha

    Ridge Regression은 linear_model.Ridge에 구현되어 있다. 코드로 확인해보자. 먼저, 필요한 라이브러리 설치 및 import를 하고

    !pip install mglearn
    import mglearn
    
    from sklearn.linear_model import Ridge
    from sklearn.model_selection import train_test_split

     

    리지 회귀가 적용된 보스턴 주택가격 측정 데이터셋의 성능을 확인해보자.

    X, Y = mglearn.datasets.load_extended_boston()
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=0)
    
    ridge = Ridge().fit(X_train, Y_train)
    print("training score: {:.2f}".format(ridge.score(X_train, Y_train)))
    print("testing score: {:.2f}".format(ridge.score(X_test, Y_test)))
    training score: 0.89
    testing score: 0.75

    결과를 보면, 기본 선형회귀 방식과 비교했을 때, 테스트 세트점수가 높게 나왔는데, 이는 Ridge가 선형회귀에 비해 덜 자유로운 모델이기 때문에, 과대적합이 적어졌기 때문이다. 모델의 복잡도가 낮아지면서 훈련세트에서 성능은 조금 나빠졌더라도, 더 일반화된 모델이 된다. 우리가 관심있는 것은 training score가 아니라, testing score이기 때문에, Linear Regression이 아닌, Ridge 모델이 더 적합한 선택이라고 볼 수 있다.

     

    Ridge에서는 alpha 변수를 이용해 훈련세트 성능 대비 모델을 얼마나 단순화 할지 지정할 수 있는데, 기본값은 1.0이다. alpha값을 높이면 계수를 0에 더 가깝게 만들어서, 훈련 세트의 성능은 나빠지더라도, 일반화에 도움을 줄 수 있다. 아래 코드를 보자.

    ridge10 = Ridge(alpha=10).fit(X_train, Y_train)
    print("training score: {:.2f}".format(ridge10.score(X_train, Y_train)))
    print("testing score: {:.2f}".format(ridge10.score(X_test, Y_test)))
    training score: 0.79
    testing score: 0.64

    기본값보다는 testing에서 좋은 성능을 보이지는 못했다.

     

    alpha값을 줄이면, 계수에 대한 제약이 풀리게 된다. 아래 예시를 보자.

    ridge01 = Ridge(alpha=0.1).fit(X_train, Y_train)
    print("training score: {:.2f}".format(ridge01.score(X_train, Y_train)))
    print("testing score: {:.2f}".format(ridge01.score(X_test, Y_test)))
    training score: 0.93
    testing score: 0.77

    이 코드에서, alpha=0.1이 좋은 성능을 낸것으로 보인다. 이런식으로 테스트 세트에 대한 점수, 즉 성능이 높아질 때까지 alpha값을 줄일 수 있을것이다. 

     

    Alpha and Coefficient

    alpha값에 따라, 모델의 coefficient가 어떻게 달라지는지 조사하면, alpha가 모델을 어떻게 변경시키는지 이해할 수 있다. 알파값이 달라지는 모델들을 plot을 이용해 비교해보자.

     

    import matplotlib.pyplot as plt
    from sklearn.linear_model import LinearRegression, Ridge
    from sklearn.model_selection import train_test_split
    
    X, Y = mglearn.datasets.load_extended_boston()
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=0)
    
    ridge = Ridge().fit(X_train, Y_train)
    ridge10 = Ridge(alpha=10).fit(X_train, Y_train)
    ridge01 = Ridge(alpha=0.1).fit(X_train, Y_train)
    lr = LinearRegression().fit(X_train, Y_train)
    
    plt.plot(ridge10.coef_, '^', label='Ridge alpha=10')
    plt.plot(ridge.coef_, '^', label='Ridge alpha=1')
    plt.plot(ridge01.coef_, '^', label='Ridge alpha=0.1')
    plt.plot(lr.coef_, 'o', label='LinearRegression')
    
    xlims = plt.xlim()
    plt.hlines(0, xlims[0], xlims[1])
    plt.xlim(xlims)
    plt.ylim(-25, 25)
    plt.legend()

     

     

     

    위 그래프에서 x-axis는 coefficient 원소들을 위치대로 나열한 것이다. 즉, x=0은 첫번째 특성에 연관된 것이고, x=100까지 보여진다. y는 각 계수의 수치를 나타내는데, alpha=10 일때, 파랑색을 보면 -3에서 3 사이에 위치한다. alpha=1인 오렌지색은 계수들이 조금 더 커졌고, alpha=0.1인 초록색은 더 커졌다. 마지막으로 아무런 regulation이 없는 alpha=0, 즉 Linear Regression 계수의 값은 더 커져서 그림 밖으로 넘어갔다. 

     

    Regulation Effect

    Ridge Regression에서 regulation에 대한 효과를 이해하기 위해 alpha값을 고정하고, training data 크기를 변화시켜보자. 보스턴 주택가격 데이텃에서 여러가지 크리고 샘플링을 한 후, Linear Regression과 Ridge(alpha=1)을 적용해 비교했다. 그리고 성능 변화를 보기 위해 Learning Curve, 학습 곡선을 그려봤다.

    mglearn.plots.plot_ridge_n_samples()

     

     

    Ridge와 Linear Regression 모두 훈련세트의 점수가 테스트 세트 점수보다 높았다. 둘의 훈련세트 점수를 비교해보면, Ridge에는 regulation이 적용되기 때문에, 전체적으로 Linear Regression에 비해 점수가 낮았다. 하지만, 테스트 데이터에서는 Ridge의 점수가 더 높았고, 특히 작은 데이터셋에서는 훨씬 좋은 Score를 보였다. 데이터셋 크기가 400미만일 때, Linear Regression은 어떤것도 학습하지 못하고 있다는것을 보여줬다. 

     

    두 보델 모두, 데이터가 많아질수록 좋아지는것으로 보였고, 약 500개정도가 되었을 때, Linear Regression이 Ridge Regression의 성능을 따라잡았다.

     

    여기서 우리는 알 수 있다. 데이터를 충분히 주면, regulation은 덜 중요해지고, Ridge와 Linear Regression의 성능이 같아진다는 것이다. 또, Linear Regression의 훈련 데이터 성능이 조금씩 감소했는데, 이는 데이터가 많아질수록 모델이 데이터에 대한 과대적합이 어려워지기 때문이다. 

     

    Reference

    https://colab.research.google.com/drive/1fzSiPpwbTUplw6G0PJSpGaVBWx5CEMIZ?usp=sharing

     

    _02_supervised_machine_learning.ipynb

    Colaboratory notebook

    colab.research.google.com

    https://www.yes24.com/Product/Goods/42806875

     

    파이썬 라이브러리를 활용한 머신러닝 - 예스24

    사이킷런 핵심 개발자에게 배우는 머신러닝 이론과 구현 현업에서 머신러닝을 연구하고 인공지능 서비스를 개발하기 위해 꼭 학위를 받을 필요는 없다. 사이킷런(scikit-learn)과 같은 훌륭한 머신

    www.yes24.com

     

    댓글

Designed by Tistory.