Python을 사용하여 Lasso 구현

지난번'척추 회귀에 대한 총결산'보도 이후.

카탈로그

  • Lasso는
  • Lasso의 실현
  • 구속 강도 변경
  • 도표 계수의 크기
  • 경품
  • 참고 문헌

  • Python으로 시작한 머신러닝
  • 라소


    Lasso는 선형 모델의 회귀 중의 하나이다.

    통상의 최소 2승법과 같은 점

  • 예측에 사용되는 공식
  • 통상의 최소 2승법과 다른 점

  • 척추 회귀와 유사하며 구속 계수($w$)는 0
  • 척추 회귀와 다른 점

  • 정규화 사용 L1 정규화
  • L1 정규화를 사용하면 완전히 0인 계수가 존재합니다.
  • 사용하지 않는 특징량을 결정하고 모델이 쉽게 해석된다
  • 다음 그림에서 정규화를 통해 왼쪽으로 이동합니다.

    준비

    $ pip install scikit-learn
    $ pip install mglearn
    

    Lasso 구현

    import mglearn
    from sklearn.linear_model import Lasso
    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)
    
    lasso = Lasso().fit(X_train, y_train)
    print(f"training dataに対しての精度: {lasso.score(X_train, y_train):.2}")
    print(f"test set scoreに対しての精度: {lasso.score(X_test, y_test):.2f}")
    # => training dataに対しての精度: 0.29
    # => test set scoreに対しての精度: 0.21
    

    고찰

  • training 데이터에 대한 정밀도 차이
  • test 데이터에 대한 정밀도 차이
  • 부족에 적합하다고 판단
  • 적합도가 낮기 때문에 모델이 너무 간결할 수 있습니다.
    사용된 특징량의 수량을 확인해 보세요.
    import numpy as np
    
    print(f"使われている特徴量の数: {np.sum(lasso.coef_ != 0)}")
    # => 使われている特徴量の数: 4
    
    4개밖에 안 사용한 것 같아요.
    모형을 더욱 복잡하게 할 수 있다면 정밀도를 높일 수 있다.
    Lasso의 정규화를 조정하기 위해서는 모델의 매개 변수로서의 알파만 바꾸면 된다.

    구속의 강도 변경


    위의 Lassp 구현에서 정규화된 강도는 기본값을 유지합니다.
    정규화의 강약, 즉 모델의 복잡도는 알파의 값을 바꾸어 우리(모델을 구축하는 측)를 결정한다.
  • 알파->정규화강화->모형이 간결해졌다
  • 알파->정규화 약화->모델 복잡성 감소
  • aplha 감소


    “alpha=0.01”.
    lasso001 = Lasso(alpha=0.01, max_iter=100000).fit(X_train, y_train)
    
    print(f"training dataに対する精度: {lasso001.score(X_train, y_train):.2f}")
    print(f"test dataに対する精度: {lasso001.score(X_test, y_test):.2f}")
    print(f"使われている特徴量の数: {np.sum(np.sum(lasso001.coef_ != 0))}")
    # => training dataに対する精度: 0.90
    # => test dataに対する精度: 0.77
    # => 使われている特徴量の数: 33
    

    고찰


  • 두 가지 데이터의 정밀도를 높였다
  • 더 복잡한 모델
  • 위의 그림에서 오른쪽으로 이동
  • 사용된 특징량의 수량 증가
  • 척추 회귀에서 같은 정도의 정밀도를 얻기 위해서는 104의 모든 특징량을 사용하여 모델을 구축해야 한다.
    따라서 이 Lasso를 사용한 모델에서는 33의 특징량만 사용했기 때문에 해석성이 증가했다.

    척추 회귀


    이번 데이터 집합을 사용하면 다음 조건에서 척추 회귀와 Lasso의 정밀도는 대체적으로 같다.
  • 척추 회귀:alpha=0.1
  • Lasso: alpha=0.01
  • 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(alpha=0.1).fit(X_train, y_train)
    print(f"training dataに対しての精度: {ridge.score(X_train, y_train):.2}")
    print(f"test set scoreに対しての精度: {ridge.score(X_test, y_test):.2f}")
    # => training dataに対しての精度: 0.93
    # => test set scoreに対しての精度: 0.77
    

    그림 계수 크기

    import matplotlib.pyplot as plt
    
    plt.plot(lasso.coef_, 's', label="Lasso alpha=1")
    plt.plot(lasso001.coef_, '^', label="Lasso alpha=0.01")
    plt.plot(ridge.coef_, 'o', label="Ridge alpha=0.1")
    plt.legend(ncol=2, loc=(0, 1.05))
    plt.ylim(-25, 25)
    plt.xlabel("Features index")
    plt.ylabel("Coefficient magnitude")
    
    plt.show()
    

    고찰


    '척추 회귀:alpha=0.1'과'Lasso:alpha=0.01'은 같은 정도의 정밀도를 나타내지만 계수의 편차는'척추 회귀:alpha=0.1'(녹색 ○)보다 훨씬 크다.
    이 모델을 설명하기 어렵다는 얘기다.
    따라서 해석성을 요구하는 경우에는 Lasso를 사용하는 것이 좋습니다.

    경품


    분석 결과와 도표의 대응을 확인하면서 공부하면 이해도가 깊어진다고 생각합니다.참고서에 도표가 나올 때는 그 해설을 읽기 전에 그 도표를 스스로 읽어보는 것이 좋다.

    좋은 웹페이지 즐겨찾기