2. 파이톤이 접미사된 다변수 해석 6-2.척추 회귀·라소 회귀(scikit-learn)[척추 회귀 vs 라소 회귀]

  • 중회귀에서 파생된 척추회귀·라소회귀는 중회귀와 학습을 억제하는 메커니즘을 가지고 구체적으로 다음과 같다.
  • 척추 회귀 처리 권중의 제곱이고 라소 회귀는 권중의 절대값이다.
  • 이전 절의 반전이지만 기존의 재회귀분석에서 예측치와 관측치의 제곱과 오차를 최소화하는 계수를 계산했다.여기에 변수의 양과 무게에 따라 처벌하면 계수가 커지는 것을 막을 수 있다.
  • 여기서 라소 회귀가 포함된 3개의 재회귀 모델을 비교해 보고 싶다.

    (1) 라이브러리 가져오기

    # データ加工・計算・分析ライブラリ
    import numpy as np
    import pandas as pd
    
    # グラフ描画ライブラリ
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    # 機械学習ライブラリ
    import sklearn
    

    (2) 데이터 획득 및 읽기

    # データを取得
    url = 'https://raw.githubusercontent.com/yumi-ito/datasets/master/datasets_auto_4variables_pre-processed.csv'
    
    # 取得したデータをDataFrameオブジェクトとして読み込み
    df = pd.read_csv(url, header=None)
    
    # 列ラベルを設定
    df.columns = ['width', 'height', 'horsepower', 'price']
    
    print(df)
    
  • 는 자동차와 관련된 각종 규격 중 width(차폭), 하이트(차높이), horsepower(마력) 세 가지를 설명 변수로 삼아 목적 변수를 예측하는 price(가격)의 데이터로 사용한다.
  • 데이터 원본과 개요 등의 상세한 내용은 다음과 같다.https://qiita.com/y_itoh/items/9befbf47869d66337dad
  • 또한 알 수 없는 값그리고 부족한 값을 삭제했고 데이터 형식도 flat형, int형으로 변환되었습니다.
  • # データ形状の確認
    print('データ形状:', df.shape)
    
    # 欠損値の確認
    print('欠損値の数:{}\n'.format(df.isnull().sum().sum()))
    
    # データ型の確認
    print(df.dtypes)
    

    (트레이닝 데이터 분할 및 테스트 데이터)

    # モデル構築のためのインポート
    from sklearn.linear_model import Ridge, Lasso, LinearRegression
    
    # データ分割のためのインポート
    from sklearn.model_selection import train_test_split
    
  • pandasdrop() 함수를 통해 열을 삭제price하고 설명 변수만 x로 설정하고 price만 y로 설정합니다.
  • sklearn의 train_test_split 방법으로 설명 변수 x, 목적 변수 y를 훈련 데이터(train)와 테스트 데이터(test)로 나눈다.
  • # 説明変数と目的変数を設定
    x = df.drop('price', axis=1)
    y = df['price']
    
    # 訓練データとテストデータに分割
    X_train, X_test, Y_train, Y_test = train_test_split(x, y, test_size=0.5, random_state=0)
    

    4. 모델의 생성과 평가

  • 재회귀, 척추회귀, 라소회귀를 통일적으로 초기화하고for 문장에 따라 모델 생성, 훈련 데이터의 정해율, 테스트 데이터의 정해율 계산까지 단숨에 회전한다.
  • # 各クラスを初期化してdict型変数のmodelsに格納
    models = {
        'linear': LinearRegression(),
        'ridge': Ridge(random_state=0),
        'lasso': Lasso(random_state=0)}
    
    # 正解率を格納するdict型変数を初期化
    scores = {}
    
    # 各モデルを順次生成し、正解率を算出して格納
    for model_name, model in models.items():
        # モデル生成
        model.fit(X_train, Y_train)
        # 訓練データの正解率
        scores[(model_name, 'train')] = model.score(X_train, Y_train)
        # テストデータの正解率
        scores[(model_name, 'test')] = model.score(X_test, Y_test)
    
    # dict型をpandasの1次元リストに変換
    print(pd.Series(scores))
    
  • for문으로 dict 대상을 직접 회전하면 각 요소의 키를 얻을 수 있지만 items():를 사용하면 각 요소의 키와value를 얻을 수 있다.
  • sklearn의 score() 함수를 통해 정확도를 계산하여 model_nametrain 중 임의의 하나를 키로 저장한다.

  • 다시 돌아오다
    산등성이.
    라소 회귀
    훈련 데이터의 정확도
    0.733358
    0.733355
    0.733358
    테스트 데이터의 정확도
    0.737069
    0.737768
    0.737084
  • 트레이닝 데이터의 정확도는 회귀척추형<라소회귀=중회귀형 크기 관계이고 테스트 데이터의 정확도는 회귀척추형>라소회귀>중회귀이다.
  • 라소의 회귀에 주목하면 훈련 데이터의 정확도와 재회귀는 같다. 테스트 데이터에서 산등성이로 회귀할 정도는 아니지만 재회귀를 약간 초과했다.
  • 단, 정규화 강도의 매개 변수 지정 $λ$아직 사용하지 않았습니다. scikit-learn의 기본값은 $입니다.λ=1.0달러입니다.
  • 그래서 정규화 파라미터를 변경해서 비교하고 싶습니다.

    정규화 매개 변수

  • 정규화 강도의 매개 변수 지정 $λ$그러면 처벌의 영향이 강해지고 회귀계수의 절대치가 아주 적게 억제된다.
  • 파라미터의 설정은 클래스를 초기화한 후 모델의 모형을 만들 때 파라미터test에 $$$US를 지정합니다알파=10.0달러를 시험해 보겠습니다.
  • # パラメータ設定
    alpha = 10.0
    
    # 各クラスを初期化してmodelsに格納
    models = {
        'ridge': Ridge(alpha=alpha, random_state=0),
        'lasso': Lasso(alpha=alpha, random_state=0)}
    
    # 正解率を格納するdict型変数を初期化
    scores = {}
    
    # 各モデルを順次実行し、正解率を格納していく
    for model_name, model in models.items():
        model.fit(X_train, Y_train)
        scores[(model_name, 'train')] = model.score(X_train, Y_train)
        scores[(model_name, 'test')] = model.score(X_test, Y_test)
    
    print(pd.Series(scores))
    
  • 다음은 정규화 매개 변수 $λ$단계적으로 변화해 본 결과를 나타낸다.
  • λ
    Ridge(train)
    Ridge(test)
    Lasso(train)
    Lasso(test)
    1
    0.733355
    0.737768
    0.733358
    0.737084
    10
    0.733100
    0.743506
    0.733357
    0.737372
    100
    0.721015
    0.771022
    0.733289
    0.740192
    200
    0.705228
    0.778607
    0.733083
    0.743195
    400
    0.680726
    0.779004
    0.732259
    0.748795
    500
    0.671349
    0.777338
    0.731640
    0.751391
    1000
    0.640017
    0.767504
    0.726479
    0.762336
  • 이 예에서 먼저 척추 회귀는 일반적으로 훈련 데이터에서 아래로 진동하는 경향이 있고 테스트 데이터로 변할 때 역전이 발생한다.λ$클수록 이런 경향은 더욱 두드러진다.이에 비해 라소의 회귀 행위는 전체적으로 $λ$데이터가 커져도 훈련 데이터는 완성률이 높고 테스트 데이터의 정확도는 $λ$나이가 들수록 가격이 조금씩 높아진다.
  • 단순히 계수를 곱하느냐 절대치를 취하느냐의 차이로 벌칙의 크기는 계수에 따라 라소의 회귀도 커지고 어쨌든 영향 방식의 유형도 다르다.
  • 각 규칙화의 효과에 대해 계수의 관계를 결합시켜 한 걸음 더 추진하고 싶습니다.
  • 좋은 웹페이지 즐겨찾기