機械学習(七)——LightGBMアルゴリズム


LightGBMアルゴリズム
  • アルゴリズム原理
  • 2 LightGBM重要パラメータ
  • 2.1基本パラメータ調整
  • 2.2訓練速度に対するパラメータ調整
  • 2.3精度に対するパラメータ調整
  • 2.4オーバーフィットに対するパラメータ調整
  • 3コード実践
  • 4参照
  • 主に自分のために勉強したノートですが、間違いがあれば訂正してください.
    1アルゴリズムの原理
    LightGBMもXGBoostのような統合アルゴリズムであり、XGBoostと全体的に同じであり、CART回帰ツリーを同様に使用しており、アルゴリズムは本質的にXgboostと出入りせず、XGBoostに基づいて最適化されているだけである(XGBoostアルゴリズム参照).新しい機能が追加されました.
  • 最適化速度とメモリ使用1)ヒストグラムアルゴリズムに基づいて最適化を行い、データ記憶をより便利にし、演算をより速くし、ロバスト性が強く、モデルをより安定させる.2)各分割利得を計算するコストを低減し、単辺勾配サンプリングアルゴリズムを提案し、大部分の小勾配の試料を排除し、残りの試料だけで情報利得を計算し、データ量を減少し、精度を保証するバランスのとれたアルゴリズムである.3)メモリ使用量を減らす;4)並行学習の計算コストを削減する.
  • 精度最適化1)葉数ガイド(深さ制限付きLeaf-wiseアルゴリズム)を用いた決定木構築アルゴリズムは、多くのGBDTツールで使用される決定木深さガイド(層成長(level-wise))ではなく、誤差を低減し、より良い精度を得ることができる.2)分類特徴の符号化方式の最適化は,高次元のデータがしばしば疎である反発特徴バンドルアルゴリズムを提案し,この疎性は,特徴の次元を低減するための無損な方法を設計することを示唆した.通常、バンドルされた特徴は反発的である(すなわち、特徴がone-hotのように非ゼロ値であることはない).このように、2つの特徴がバンドルされても情報が失われない.3)通信ネットワークの最適化;4)並行学習の最適化;4)GPUサポート.
  • 疎最適化1)連続値を離散binで置換した.binsが小さい場合、トレーニングデータを格納するために、uint 8_tのような小さなデータ型を使用することができる.2)他の情報を格納することなく,特徴値を事前にソートする.

  • LightGBMの利点:1)より速いトレーニング効率2)低メモリ使用3)より高い精度4)並列化学習をサポート5)大規模データを扱うことができるLightGBMの欠点:1)深さ学習モデルに比べて時空位置のモデリングができず,画像,音声,テキストなどの高次元データ2)大量の訓練データを持ち,適切な深さ学習モデルを見つけることができる場合,深さ学習の精度はLightGBMをはるかにリードすることができる
    2 LightGBM重要パラメータ
    2.1基本パラメータ調整
  • num_leaves(num_leaf,max_leaves,max_leaf):デフォルト=31で、1本の木の最大葉数です.これはツリーモデルの複雑さを制御する主なパラメータであり、num_leavesは(2のmax_depth次数)より小さく、オーバーフィットを防止する.
  • min_data_in_leaf:デフォルト=20で、1つの葉のデータの最小数です.オーバーフィットの処理に使用できます.その値は、トレーニングデータのサンプルツリーとnum_に依存します.leavesパラメータ.これを大きく設定すると、深すぎるツリーの生成は回避されますが、フィットしない可能性があります.
  • max_depth:ツリーモデルの最大深さを制限します.これにより、#dataが小さい場合にオーバーフィットを防止することができる.木はleaf−wiseによって成長することができる.depthの概念はleaf−wiseツリーにあまり役に立たない.leavesからdepthへの合理的なマッピングは存在しないからである.

  • 2.2訓練速度に対するパラメータ調整
  • bagging_fraction(sub_row,subsample):デフォルト=1で、再サンプリングを行わずに部分データをランダムに選択します.フィーチャーを使用するサブサンプリングを設定できます.
  • bagging_freq(subsample_freq):baggingの頻度、0はbaggingを無効にすることを意味する.kは、k反復毎にbagging
  • が実行されることを意味する.
  • より小さいmax_を選択binパラメータ
  • 使用save_binaryは将来の学習過程でデータのロードを加速させる.

  • 2.3精度に対するパラメータ調整
  • より大きなmax_を設定bin(学習速度が遅くなる可能性がある)
  • より小さいlearning_を設定rateと大きなnum_iterations
  • より大きいnum_を設定leaves(オーバーフィットの原因となる可能性がある)
  • より大きい訓練セット
  • を設置する
  • boosting:デフォルトgbdtで、アップグレードタイプを設定します.dart:複数の加算回帰ツリーのDROPOUTメソッドを使用してみてください.

  • 2.4オーバーフィットに対するパラメータ調整
  • より小さいmax_を設定bin
  • より小さいnum_を設定leaves
  • min_data_in_leaf:デフォルト=20で、1つの葉のデータの最小数です.オーバーフィット
  • を処理するために使用することができる
  • min_sum_hessian_in_leaf(min_sum_hessian_per_leaf,min_sum_hessian,min_hessian):デフォルト=1 e-3、葉の最小hessianと.min_に似ていますdata_in_leafは、フィッティング
  • を処理するために使用することができる
  • bagging_の設定fractionとbagging_freqはbagging
  • を使用する
  • 設定feature_fractionは、特徴サブサンプリング
  • を用いる
  • より大きなデータセットを使用して
  • を訓練する
  • 正規化方法
  • を用いる.
  • max_depth:ツリーモデルの最大深さを制限します.

  • さらなるチューニングは『LightGBMチューニングノート』を参考に
    3コード実践
    コードリファレンスはKaggleオープンソースプロジェクトから来て、私はそれを運んでリファレンスを勉強します.
    import lightgbm as lgb
    from sklearn import metrics
    from sklearn.datasets import load_breast_cancer
    from sklearn.model_selection import train_test_split
     
    canceData=load_breast_cancer()
    X=canceData.data
    y=canceData.target
    X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=0,test_size=0.2)
     
    ###     
    print('    ')
    lgb_train = lgb.Dataset(X_train, y_train, free_raw_data=False)
    lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train,free_raw_data=False)
     
    ###       --        
    print('    ')
    params = {
         
              'boosting_type': 'gbdt',
              'objective': 'binary',
              'metric': 'auc',
              'nthread':4,
              'learning_rate':0.1
              }
     
    ###     (  )
    print('    ')
    max_auc = float('0')
    best_params = {
         }
     
    #    
    print("  1:     ")
    for num_leaves in range(5,100,5):
        for max_depth in range(3,8,1):
            params['num_leaves'] = num_leaves
            params['max_depth'] = max_depth
     
            cv_results = lgb.cv(
                                params,
                                lgb_train,
                                seed=1,
                                nfold=5,
                                metrics=['auc'],
                                early_stopping_rounds=10,
                                verbose_eval=True
                                )
                
            mean_auc = pd.Series(cv_results['auc-mean']).max()
            boost_rounds = pd.Series(cv_results['auc-mean']).idxmax()
                
            if mean_auc >= max_auc:
                max_auc = mean_auc
                best_params['num_leaves'] = num_leaves
                best_params['max_depth'] = max_depth
    if 'num_leaves' and 'max_depth' in best_params.keys():          
        params['num_leaves'] = best_params['num_leaves']
        params['max_depth'] = best_params['max_depth']
     
    #    
    print("  2:     ")
    for max_bin in range(5,256,10):
        for min_data_in_leaf in range(1,102,10):
                params['max_bin'] = max_bin
                params['min_data_in_leaf'] = min_data_in_leaf
                
                cv_results = lgb.cv(
                                    params,
                                    lgb_train,
                                    seed=1,
                                    nfold=5,
                                    metrics=['auc'],
                                    early_stopping_rounds=10,
                                    verbose_eval=True
                                    )
                        
                mean_auc = pd.Series(cv_results['auc-mean']).max()
                boost_rounds = pd.Series(cv_results['auc-mean']).idxmax()
     
                if mean_auc >= max_auc:
                    max_auc = mean_auc
                    best_params['max_bin']= max_bin
                    best_params['min_data_in_leaf'] = min_data_in_leaf
    if 'max_bin' and 'min_data_in_leaf' in best_params.keys():
        params['min_data_in_leaf'] = best_params['min_data_in_leaf']
        params['max_bin'] = best_params['max_bin']
     
    print("  3:     ")
    for feature_fraction in [0.6,0.7,0.8,0.9,1.0]:
        for bagging_fraction in [0.6,0.7,0.8,0.9,1.0]:
            for bagging_freq in range(0,50,5):
                params['feature_fraction'] = feature_fraction
                params['bagging_fraction'] = bagging_fraction
                params['bagging_freq'] = bagging_freq
                
                cv_results = lgb.cv(
                                    params,
                                    lgb_train,
                                    seed=1,
                                    nfold=5,
                                    metrics=['auc'],
                                    early_stopping_rounds=10,
                                    verbose_eval=True
                                    )
                        
                mean_auc = pd.Series(cv_results['auc-mean']).max()
                boost_rounds = pd.Series(cv_results['auc-mean']).idxmax()
     
                if mean_auc >= max_auc:
                    max_auc=mean_auc
                    best_params['feature_fraction'] = feature_fraction
                    best_params['bagging_fraction'] = bagging_fraction
                    best_params['bagging_freq'] = bagging_freq
     
    if 'feature_fraction' and 'bagging_fraction' and 'bagging_freq' in best_params.keys():
        params['feature_fraction'] = best_params['feature_fraction']
        params['bagging_fraction'] = best_params['bagging_fraction']
        params['bagging_freq'] = best_params['bagging_freq']
     
     
    print("  4:     ")
    for lambda_l1 in [1e-5,1e-3,1e-1,0.0,0.1,0.3,0.5,0.7,0.9,1.0]:
        for lambda_l2 in [1e-5,1e-3,1e-1,0.0,0.1,0.4,0.6,0.7,0.9,1.0]:
            params['lambda_l1'] = lambda_l1
            params['lambda_l2'] = lambda_l2
            cv_results = lgb.cv(
                                params,
                                lgb_train,
                                seed=1,
                                nfold=5,
                                metrics=['auc'],
                                early_stopping_rounds=10,
                                verbose_eval=True
                                )
                    
            mean_auc = pd.Series(cv_results['auc-mean']).max()
            boost_rounds = pd.Series(cv_results['auc-mean']).idxmax()
     
            if mean_auc >= max_auc:
                max_auc=mean_auc
                best_params['lambda_l1'] = lambda_l1
                best_params['lambda_l2'] = lambda_l2
    if 'lambda_l1' and 'lambda_l2' in best_params.keys():
        params['lambda_l1'] = best_params['lambda_l1']
        params['lambda_l2'] = best_params['lambda_l2']
     
    print("  5:     2")
    for min_split_gain in [0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]:
        params['min_split_gain'] = min_split_gain
        
        cv_results = lgb.cv(
                            params,
                            lgb_train,
                            seed=1,
                            nfold=5,
                            metrics=['auc'],
                            early_stopping_rounds=10,
                            verbose_eval=True
                            )
                
        mean_auc = pd.Series(cv_results['auc-mean']).max()
        boost_rounds = pd.Series(cv_results['auc-mean']).idxmax()
     
        if mean_auc >= max_auc:
            max_auc=mean_auc
            
            best_params['min_split_gain'] = min_split_gain
    if 'min_split_gain' in best_params.keys():
        params['min_split_gain'] = best_params['min_split_gain']
     
    print(best_params)
    

    4参考
  • 《LightGBM调参笔记》
  • Kaggleオープンソースプロジェクト
  • 『LightGBMに基づく分類予測』