LightGBM 可視化調(diào)參
大家好,在100天搞定機(jī)器學(xué)習(xí)|Day63 徹底掌握 LightGBM一文中,我介紹了LightGBM 的模型原理和一個(gè)極簡(jiǎn)實(shí)例。最近我發(fā)現(xiàn)Huggingface與Streamlit好像更配,所以就開(kāi)發(fā)了一個(gè)簡(jiǎn)易的 LightGBM 可視化調(diào)參的小工具,旨在讓大家可以更深入地理解 LightGBM
網(wǎng)址:
https://huggingface.co/spaces/beihai/LightGBM-parameter-tuning

只隨便放了幾個(gè)參數(shù),調(diào)整這些參數(shù)可以實(shí)時(shí)看到模型評(píng)估指標(biāo)的變化。代碼我也放到文章中了,大家有好的優(yōu)化思路可以留言。
下面就詳細(xì)介紹一下實(shí)現(xiàn)過(guò)程:
LightGBM 的參數(shù)
在完成模型構(gòu)建之后,必須對(duì)模型的效果進(jìn)行評(píng)估,根據(jù)評(píng)估結(jié)果來(lái)繼續(xù)調(diào)整模型的參數(shù)、特征或者算法,以達(dá)到滿(mǎn)意的結(jié)果。
LightGBM,有核心參數(shù),學(xué)習(xí)控制參數(shù),IO參數(shù),目標(biāo)參數(shù),度量參數(shù),網(wǎng)絡(luò)參數(shù),GPU參數(shù),模型參數(shù),這里我常修改的便是核心參數(shù),學(xué)習(xí)控制參數(shù),度量參數(shù)等。
| Control Parameters | 含義 | 用法 |
|---|---|---|
| max_depth | 樹(shù)的最大深度 | 當(dāng)模型過(guò)擬合時(shí),可以考慮首先降低 max_depth |
| min_data_in_leaf | 葉子可能具有的最小記錄數(shù) | 默認(rèn)20,過(guò)擬合時(shí)用 |
| feature_fraction | 例如 為0.8時(shí),意味著在每次迭代中隨機(jī)選擇80%的參數(shù)來(lái)建樹(shù) | boosting 為 random forest 時(shí)用 |
| bagging_fraction | 每次迭代時(shí)用的數(shù)據(jù)比例 | 用于加快訓(xùn)練速度和減小過(guò)擬合 |
| early_stopping_round | 如果一次驗(yàn)證數(shù)據(jù)的一個(gè)度量在最近的early_stopping_round 回合中沒(méi)有提高,模型將停止訓(xùn)練 | 加速分析,減少過(guò)多迭代 |
| lambda | 指定正則化 | 0~1 |
| min_gain_to_split | 描述分裂的最小 gain | 控制樹(shù)的有用的分裂 |
| max_cat_group | 在 group 邊界上找到分割點(diǎn) | 當(dāng)類(lèi)別數(shù)量很多時(shí),找分割點(diǎn)很容易過(guò)擬合時(shí) |
| CoreParameters | 含義 | 用法 |
|---|---|---|
| Task | 數(shù)據(jù)的用途 | 選擇 train 或者 predict |
| application | 模型的用途 | 選擇 regression: 回歸時(shí),binary: 二分類(lèi)時(shí),multiclass: 多分類(lèi)時(shí) |
| boosting | 要用的算法 | gbdt, rf: random forest, dart: Dropouts meet Multiple Additive Regression Trees, goss: Gradient-based One-Side Sampling |
| num_boost_round | 迭代次數(shù) | 通常 100+ |
| learning_rate | 如果一次驗(yàn)證數(shù)據(jù)的一個(gè)度量在最近的 early_stopping_round 回合中沒(méi)有提高,模型將停止訓(xùn)練 | 常用 0.1, 0.001, 0.003… |
| num_leaves | 默認(rèn) 31 | |
| device | cpu 或者 gpu | |
| metric | mae: mean absolute error , mse: mean squared error , binary_logloss: loss for binary classification , multi_logloss: loss for multi classification |
| Faster Speed | better accuracy | over-fitting |
|---|---|---|
| 將 max_bin 設(shè)置小一些 | 用較大的 max_bin | max_bin 小一些 |
| num_leaves 大一些 | num_leaves 小一些 | |
| 用 feature_fraction 來(lái)做 sub-sampling | 用 feature_fraction | |
| 用 bagging_fraction 和 bagging_freq | 設(shè)定 bagging_fraction 和 bagging_freq | |
| training data 多一些 | training data 多一些 | |
| 用 save_binary 來(lái)加速數(shù)據(jù)加載 | 直接用 categorical feature | 用 gmin_data_in_leaf 和 min_sum_hessian_in_leaf |
| 用 parallel learning | 用 dart | 用 lambda_l1, lambda_l2 ,min_gain_to_split 做正則化 |
| num_iterations 大一些,learning_rate 小一些 | 用 max_depth 控制樹(shù)的深度 |
模型評(píng)估指標(biāo)
以分類(lèi)模型為例,常見(jiàn)的模型評(píng)估指標(biāo)有一下幾種:
混淆矩陣
混淆矩陣是能夠比較全面的反映模型的性能,從混淆矩陣能夠衍生出很多的指標(biāo)來(lái)。
ROC曲線
ROC曲線,全稱(chēng)The Receiver Operating Characteristic Curve,譯為受試者操作特性曲線。這是一條以不同閾值 下的假正率FPR為橫坐標(biāo),不同閾值下的召回率Recall為縱坐標(biāo)的曲線。讓我們衡量模型在盡量捕捉少數(shù)類(lèi)的時(shí)候,誤傷多數(shù)類(lèi)的情況如何變化的。
AUC
AUC(Area Under the ROC Curve)指標(biāo)是在二分類(lèi)問(wèn)題中,模型評(píng)估階段常被用作最重要的評(píng)估指標(biāo)來(lái)衡量模型的穩(wěn)定性。ROC曲線下的面積稱(chēng)為AUC面積,AUC面積越大說(shuō)明ROC曲線越靠近左上角,模型越優(yōu);
Streamlit 實(shí)現(xiàn)
Streamlit我就不再多做介紹了,老讀者應(yīng)該都特別熟悉了。就再列一下之前開(kāi)發(fā)的幾個(gè)小東西:
開(kāi)發(fā)機(jī)器學(xué)習(xí)APP,太簡(jiǎn)單了 為了這個(gè)GIF,我專(zhuān)門(mén)建了一個(gè)網(wǎng)站 收手吧,華強(qiáng)!我用機(jī)器學(xué)習(xí)幫你挑西瓜 耗時(shí)一個(gè)月,做了一個(gè)純粹的機(jī)器學(xué)習(xí)網(wǎng)站
核心代碼如下,完整代碼我放到Github,歡迎大家給個(gè)Star
https://github.com/tjxj/visual-parameter-tuning-with-streamlit
from?definitions?import?*
st.set_option('deprecation.showPyplotGlobalUse',?False)
st.sidebar.subheader("請(qǐng)選擇模型參數(shù):sunglasses:")
#?加載數(shù)據(jù)
breast_cancer?=?load_breast_cancer()
data?=?breast_cancer.data
target?=?breast_cancer.target
#?劃分訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)
X_train,?X_test,?y_train,?y_test?=?train_test_split(data,?target,?test_size=0.2)
#?轉(zhuǎn)換為Dataset數(shù)據(jù)格式
lgb_train?=?lgb.Dataset(X_train,?y_train)
lgb_eval?=?lgb.Dataset(X_test,?y_test,?reference=lgb_train)
#?模型訓(xùn)練
params?=?{'num_leaves':?num_leaves,?'max_depth':?max_depth,
????????????'min_data_in_leaf':?min_data_in_leaf,?
????????????'feature_fraction':?feature_fraction,
????????????'min_data_per_group':?min_data_per_group,?
????????????'max_cat_threshold':?max_cat_threshold,
????????????'learning_rate':learning_rate,'num_leaves':num_leaves,
????????????'max_bin':max_bin,'num_iterations':num_iterations
????????????}
gbm?=?lgb.train(params,?lgb_train,?num_boost_round=2000,?valid_sets=lgb_eval,?early_stopping_rounds=500)
lgb_eval?=?lgb.Dataset(X_test,?y_test,?reference=lgb_train)??
probs?=?gbm.predict(X_test,?num_iteration=gbm.best_iteration)??#?輸出的是概率結(jié)果??
fpr,?tpr,?thresholds?=?roc_curve(y_test,?probs)
st.write('------------------------------------')
st.write('Confusion?Matrix:')
st.write(confusion_matrix(y_test,?np.where(probs?>?0.5,?1,?0)))
st.write('------------------------------------')
st.write('Classification?Report:')
report?=?classification_report(y_test,?np.where(probs?>?0.5,?1,?0),?output_dict=True)
report_matrix?=?pd.DataFrame(report).transpose()
st.dataframe(report_matrix)
st.write('------------------------------------')
st.write('ROC:')
plot_roc(fpr,?tpr)
上傳Huggingface
Huggingface 前一篇文章(騰訊的這個(gè)算法,我搬到了網(wǎng)上,隨便玩!)我已經(jīng)介紹過(guò)了,這里就順便再講一下步驟吧。
step1:注冊(cè)Huggingface賬號(hào)
step2:創(chuàng)建Space,SDK記得選擇Streamlit
step3:克隆新建的space代碼,然后將改好的代碼push上去
git?lfs?install?
git?add?.
git?commit?-m?"commit?from?$beihai"
git?push
push的時(shí)候會(huì)讓輸入用戶(hù)名(就是你的注冊(cè)郵箱)和密碼,解決git總輸入用戶(hù)名和密碼的問(wèn)題:git config --global credential.helper store
push完成就大功告成了,回到你的space頁(yè)對(duì)應(yīng)項(xiàng)目,就可以看到效果了。


相關(guān)閱讀:
