LightGBM 可視化調(diào)參
↓↓↓點(diǎn)擊關(guān)注,回復(fù)資料,10個(gè)G的驚喜
更深入地理解 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)過程:
LightGBM 的參數(shù)
在完成模型構(gòu)建之后,必須對(duì)模型的效果進(jìn)行評(píng)估,根據(jù)評(píng)估結(jié)果來繼續(xù)調(diào)整模型的參數(shù)、特征或者算法,以達(dá)到滿意的結(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 | 樹的最大深度 | 當(dāng)模型過擬合時(shí),可以考慮首先降低 max_depth |
| min_data_in_leaf | 葉子可能具有的最小記錄數(shù) | 默認(rèn)20,過擬合時(shí)用 |
| feature_fraction | 例如 為0.8時(shí),意味著在每次迭代中隨機(jī)選擇80%的參數(shù)來建樹 | boosting 為 random forest 時(shí)用 |
| bagging_fraction | 每次迭代時(shí)用的數(shù)據(jù)比例 | 用于加快訓(xùn)練速度和減小過擬合 |
| early_stopping_round | 如果一次驗(yàn)證數(shù)據(jù)的一個(gè)度量在最近的early_stopping_round 回合中沒有提高,模型將停止訓(xùn)練 | 加速分析,減少過多迭代 |
| lambda | 指定正則化 | 0~1 |
| min_gain_to_split | 描述分裂的最小 gain | 控制樹的有用的分裂 |
| max_cat_group | 在 group 邊界上找到分割點(diǎn) | 當(dāng)類別數(shù)量很多時(shí),找分割點(diǎn)很容易過擬合時(shí) |
| CoreParameters | 含義 | 用法 |
|---|---|---|
| Task | 數(shù)據(jù)的用途 | 選擇 train 或者 predict |
| application | 模型的用途 | 選擇 regression: 回歸時(shí),binary: 二分類時(shí),multiclass: 多分類時(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 回合中沒有提高,模型將停止訓(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 來做 sub-sampling | 用 feature_fraction | |
| 用 bagging_fraction 和 bagging_freq | 設(shè)定 bagging_fraction 和 bagging_freq | |
| training data 多一些 | training data 多一些 | |
| 用 save_binary 來加速數(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 控制樹的深度 |
模型評(píng)估指標(biāo)
以分類模型為例,常見的模型評(píng)估指標(biāo)有一下幾種:
混淆矩陣
混淆矩陣是能夠比較全面的反映模型的性能,從混淆矩陣能夠衍生出很多的指標(biāo)來。
ROC曲線
ROC曲線,全稱The Receiver Operating Characteristic Curve,譯為受試者操作特性曲線。這是一條以不同閾值 下的假正率FPR為橫坐標(biāo),不同閾值下的召回率Recall為縱坐標(biāo)的曲線。讓我們衡量模型在盡量捕捉少數(shù)類的時(shí)候,誤傷多數(shù)類的情況如何變化的。
AUC
AUC(Area Under the ROC Curve)指標(biāo)是在二分類問題中,模型評(píng)估階段常被用作最重要的評(píng)估指標(biāo)來衡量模型的穩(wěn)定性。ROC曲線下的面積稱為AUC面積,AUC面積越大說明ROC曲線越靠近左上角,模型越優(yōu);
Streamlit 實(shí)現(xiàn)
Streamlit我就不再多做介紹了,老讀者應(yīng)該都特別熟悉了。就再列一下之前開發(fā)的幾個(gè)小東西:
開發(fā)機(jī)器學(xué)習(xí)APP,太簡單了 為了這個(gè)GIF,我專門建了一個(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("請選擇模型參數(shù):sunglasses:")
#?加載數(shù)據(jù)
breast_cancer?=?load_breast_cancer()
data?=?breast_cancer.data
target?=?breast_cancer.target
#?劃分訓(xùn)練數(shù)據(jù)和測試數(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)介紹過了,這里就順便再講一下步驟吧。
step1:注冊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ì)讓輸入用戶名(就是你的注冊郵箱)和密碼,解決git總輸入用戶名和密碼的問題:git config --global credential.helper store
push完成就大功告成了,回到你的space頁對(duì)應(yīng)項(xiàng)目,就可以看到效果了。

