iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 16
0

上一篇在交叉驗證的過程中,提到超參數的計算是使用窮舉法,因此要設定好參數的區間,來在訓練的過程中對參數進行測試。
而在這次使用中我參考了本篇文章:LightGBM核心解析与调参

窮舉法的幾個注意要點

  1. 窮舉是依序將參數交叉組合,因此在參數的區間設定過程中,不要一次輸入過大的參數區間以及過多的參數類別。
  2. 窮舉訓練中會重複訓練相當多的模型,在不確定資料處理是否妥善時,丟太大的資料集進去會讓訓練時間大幅度的拉長。

調參的核心概念

正如我們在第十四天與第十五天提到的,調參數是為了在變異以及偏誤中權衡(也有人叫方差與偏差),因此有些參數是提高變異降低偏誤,有些則相反,認識這些參數的影響也能夠幫助你調整參數。

關於調參更知識性的內容可以參考這篇

實際調參過程

匯入套件

import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import GridSearchCV  # Perforing grid search
from sklearn.model_selection import train_test_split

數據處理

train_data = total_data.copy()   # 拷貝文件 務必使用copy避免修改原始資料集
y = train_data.pop('target').values   # 用pop取出預測集的答案
col = train_data.columns   
x = train_data[col].values  # 除了答案列以外的都放入訓練
train_x, valid_x, train_y, valid_y = train_test_split(x, y, test_size=0.333, random_state=0)   # 切分訓練與驗證集

參數設定

parameters = {
    #          超參數名稱 : 超參數區間
              'max_depth': [10,15, 20, 25, 30], # 
              'learning_rate': [0.005,0.01, 0.02, 0.05, 0.1]
}

訓練模型

# 當中每一項都可以列入窮舉
# 但一次不要放太多 會導致訓練時間拉長

gbm = lgb.LGBMRegressor(boosting_type='gbdt',
                         verbose = 0,
                         learning_rate = 0.01,
                         num_leaves = 35,
                         feature_fraction=0.8,
                         bagging_fraction= 0.9,
                         bagging_freq= 8,
                         lambda_l1= 0.6,
                         lambda_l2= 0)

# fit GridSearchCV 就可以得到模型並且預測了

gsearch = GridSearchCV(gbm, param_grid=parameters, cv=3)
gsearch.fit(train_x, train_y)

print("Best score: %0.3f" % gsearch.best_score_) # 模型最佳績效
print("Best parameters set:") # 窮舉後的最佳參數
best_parameters = gsearch.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):
    print("\t%s: %r" % (param_name, best_parameters[param_name]))

param tuning

參考資料

LightGBM核心解析与调参


上一篇
DAY[15]-機器學習(6)交叉驗證
下一篇
DAY[17]-競賽平台介紹
系列文
Python機器學習介紹與實戰30

尚未有邦友留言

立即登入留言