lightGBMはパラメータから背景理論に調整します.

6916 ワード

機械学習競争のいい道具
lightはとても使いやすいマシンで競技のアルゴリズムを勉強します.多くのアップグレードツールは決定ツリーの学習にpre−sortedに基づくアルゴリズムを使用する.これは簡単な解ですが、最適化は容易ではありません.LightGBMは、histogramに基づくアルゴリズム[3,4,5]を利用して、連続する特徴(属性)値をdiscrete binsに分割することにより、トレーニングの速度を速め、メモリの使用を低減する.ほとんどの決定ツリーの学習アルゴリズムは、ツリーをlevel(depth)-wise戦略によって成長させ、lightgbmはLeaf-wise(Best-first)の決定ツリー成長戦略を使用する.それは最大デルタlossを有するリーフノードを選択して成長する.同じ萼leafを成長させると、leaf-wiseアルゴリズムは、level-wiseアルゴリズムよりも多くの損失を低減することができる.萼dataが小さい場合、leaf-wiseはフィッティングの原因になります.したがって、LightGBMは追加のパラメータmax_を利用することができる.depthは、ツリーの深さを制限し、フィッティングを回避する(ツリーの成長は依然としてleaf−wise戦略によって行われる).
私たちは通常、カテゴリの特徴をone-hot codingに変換します.しかし、学習ツリーにとっては良い解決策ではない.理由は、1つの基数が大きいクラスの特徴に対して、学習ツリーは非常にアンバランスで成長し、非常に深い深さが必要であるからです.実際に、最良の解決策は、カテゴリの特徴を2つのサブセットに分割することであり、全部で2^(k-1) - 1種類の可能な区分があるが、回帰ツリー[7]に対して有効な解決策がある.最適な区分を見つけるためには約k * log(k)が必要です.
使うのも簡単です.
  • まずlgbパッケージのDataSet類でテストが必要なデータを包装します.
  • lightgbmのパラメータをdict辞書形式の変数
  • に構成する.
  • パラメータ辞書、トレーニングサンプル、テストサンプル、評価指標をまとめたlgb.trainメソッドのパラメータを
  • に組み入れます.
  • の前のステップの方法は、最適なパラメータと最適なモデルを自覚的に取得し、モデルを保存する
  • .
  • モデルを用いてテストセットの予測を行う
  • .
    その中で重要なのは第二ステップ、つまりパラメータの設定です.多くの重要なパラメータがありますが、下記の第二部分(パラメータ辞書)では、多くの意味のあるパラメータを紹介します.
    インストール
    annacondaがインストールされたwindows 7環境下で、cmdコントロールパネルにpip install lightgbmを入力すると、インストールが実現されます.その前に、setuptools、wheel、numpy、scipyなどの依存パッケージをダウンロードしておく必要があります.pip install setuptools wheel numpy scipy scikit-learn -U.過程で問題に遭遇しませんでした.
    トレーニングデータ包装
    lightgbmのいくつかの特徴:
  • LightGBMは、CSV、TSV、およびLibSVMフォーマットの入力データファイルをサポートしています.
  • LightGBMは、直接にcategorical feature(クラス特徴)を使用することができる(個別にコード化する必要はない).Expo data実験により,one-hot符号化に比べてその速度は8倍改善されることが分かった.包装データの場合、どの属性がカテゴリの特徴ですか?
  • LightGBMも加重トレーニングをサポートしており、データを包装する際に、各記録の重み
  • を指定することができる.
    LightGBMのDatasetオブジェクトはdiscrete bins(離散的なデータブロック)だけを保存する必要があるので、メモリ効率が良いです.しかし、Numpy/Aray/Pandsオブジェクトのメモリはかなり高いです.メモリ消費に関心があれば、以下のように保存できます.
  • Datasetを構築する際にfree_を設定する.raw_data=True(デフォルトはTrue)
  • Datasetが構築された後、手動でraw_を設定する.data=None
  • 呼び出しgc
  • LightGBM Pythonモジュールは、データをロードするために以下のいくつかの方法を使用することができる.
  • libsvm/tsv/csv txt format file(libsvm/tsv/csvテキストファイルフォーマット)
  • Numpy 2 D array,pands Oject(Numpy 2次元配列,pandsオブジェクト)
  • LightGBM binary file(LightGBMバイナリファイル)ロード後のデータはDatasetオブジェクト中にあります.
  • numpy配列をDatasetにロードするには、
    data = np.random.rand(500, 10)  # 500    ,       10    
    label = np.random.randint(2, size=500)  #       ,  0   1
    train_data = lgb.Dataset(data, label=label)
    
    実際には、私たちが以前使っていたのはパンダンのdataFrame形式でトレーニングデータを使っていますが、それも大丈夫です.まずスカイラインパッケージを使ってトレーニングセットとテストセットを分けてからDataSet類を使って包装してもいいです.DataSetの最初のパラメータはトレーニングの特徴で、2番目のパラメータはラベルです.
    from sklearn.model_selection import train_test_split
    X_train,X_val,y_train,y_val = train_test_split(X,Y,test_size=0.2)
    xgtrain = lgb.Dataset(X_train, y_train)
    xgvalid = lgb.Dataset(X_val, y_val)
    
    LightGBMでは、検証データはトレーニングデータと一致しているはずです.DatasetからLightGBMバイナリファイルを保存すると、ローディングがより速くなります.
    train_data = lgb.Dataset('train.svm.txt')
    train_data.save_binary('train.bin')
    
    フィーチャーnames(特徴名)とcategorical feat uresを指定します.Datasetを構築する前に、分類特徴をintタイプの値に変換してください.各データの重みを指定してもよい(例えば、サンプルの規模が不均衡である場合、サンプルの少ないラベルに対応するレコードは大きな重みを有してもよい).
    w = np.random.rand(500, )
    train_data = lgb.Dataset(data, label=label, feature_name=['c1', 'c2', 'c3'], 
                       categorical_feature=['c3'],weight=w)
    
    または
    train_data = lgb.Dataset(data, label=label)
    w = np.random.rand(500, )
    train_data.set_weight(w)
    
    パラメータを設定
  • パラメータ辞書の各パラメータの意味については後述する
  • を紹介する.
    lgb_params = {
        'boosting_type': 'gbdt',
        'objective': 'binary', #xentlambda
        'metric': 'auc',
        'silent':0,
        'learning_rate': 0.05,
        'is_unbalance': 'true',  #because training data is unbalance (replaced with scale_pos_weight)
        'num_leaves': 50,  # we should let it be smaller than 2^(max_depth)
        'max_depth': -1,  # -1 means no limit
        'min_child_samples': 15,  # Minimum number of data need in a child(min_data_in_leaf)
        'max_bin': 200,  # Number of bucketed bin for feature values
        'subsample': 0.8,  # Subsample ratio of the training instance.
        'subsample_freq': 1,  # frequence of subsample, <=0 means no enable
        'colsample_bytree': 0.5,  # Subsample ratio of columns when constructing each tree.
        'min_child_weight': 0,  # Minimum sum of instance weight(hessian) needed in a child(leaf)
        #'scale_pos_weight':100,
        'subsample_for_bin': 200000,  # Number of samples for constructing bin
        'min_split_gain': 0,  # lambda_l1, lambda_l2 and min_gain_to_split to regularization
        'reg_alpha': 2.99,  # L1 regularization term on weights
        'reg_lambda': 1.9,  # L2 regularization term on weights
        'nthread': 10,
        'verbose': 0,
    }
    
  • 評価関数評価関数は、カスタムであっても良いし、skylearnで使用されても良い.
  • def feval_spec(preds, train_data):
        from sklearn.metrics import roc_curve
        fpr, tpr, threshold = roc_curve(train_data.get_label(), preds)
        tpr0001 = tpr[fpr <= 0.0005].max()
        tpr001 = tpr[fpr <= 0.001].max()
        tpr005 = tpr[fpr <= 0.005].max()
        #tpr01 = tpr[fpr.values <= 0.01].max()
        tprcal = 0.4 * tpr0001 + 0.3 * tpr001 + 0.3 * tpr005
        return 'spec_cal',tprcal,True
    
    ユーザー定義の評価関数であれば、関数の入力は予測値、入力データである必要があります.戻りパラメータは三つあります.一つ目は評価指標名、二つ目は評価値、三つ目はTrueで成功します.
    訓練する
    基礎版
    モデルを訓練するには、parameter list(パラメータリスト)とdata set(データセット)が必要です.
    num_round = 10
    bst = lgb.train(param, train_data, num_round, valid_sets=[test_data])
    
    クロス認証
    5つの折れ曲がり方式のクロス検証を使用して、トレーニング(4つのトレーニングセット、1つのテストセット)を行います.
    num_round = 10
    lgb.cv(param, train_data, num_round, nfold=5)
    
    早目に停止する
    検証セットがある場合は、事前に停止して最適な数のbooting rounds(勾配回数)を見つけることができます.事前に停止するには、valid_が必要です.セットの中に少なくとも一つのセットがあります.複数があれば、それらは使用されます.
    bst = lgb.train(param, train_data, num_round, valid_sets=valid_sets, 
          early_stopping_rounds=10)
    bst.save_model('model.txt', num_iteration=bst.best_iteration)
    
    このモデルは検証得点が停止するまで訓練を開始します.検証エラーは少なくとも1つのearly gauが必要です.stopping_roundsは減少して訓練を続けます.
    事前に停止すると、モデルは追加のフィールドがあります.iteration.train()は最後の反復から最高のモデルではなくモデルを返すことに注意してください.複数の評価指標を指定すると、それらは事前停止に使用されます.
    モデルを保存
    トレーニングが完了した後、モデルを格納するために以下の方法が使用されてもよい.bst.save_model('model.txt')が訓練されたモデルまたはローディングされたモデルは、データセットを予測することができる.
    予測する
    7つのサンプルには、それぞれ10の特徴が含まれています.
    data = np.random.rand(7, 10)
    ypred = bst.predict(data)
    
    トレーニング中に事前停止を有効にしたら、bst.best_を使ってもいいです.iterationは、最適な反復から予測結果を得る.
    ypred = bst.predict(data, num_iteration=bst.best_iteration)