使用catboost解決ML中高維度不平衡數據集挑戰的解決方案
python風控評分卡建模和風控常識(博客主親自錄制視頻教程)
https://study.163.com/course/introduction.htm?courseId=1005214003&utm_campaign=commission&utm_source=cp-400000000398149&utm_medium=share
https://blog.csdn.net/myboyliu2007/article/details/80256681
什麽是不平衡的數據集
本文中所涉及的數據分類之間不均勻,有的幾千條,有的幾十條,這種數據集被認為是不平衡的數據集。 這些類型的數據集通常存在於預測維護系統,銷售傾向,欺詐識別,智能診斷等應用領域中。
例如,在電子病歷中的呼吸科疾病診斷中,以2200條測試數據來看具體分布,數據分布很不均勻,最多的是1214例,最少的37例。各個疾病的分布如下。
J20 急性支氣管炎 97
J15 肺炎 1214
J45 哮喘 149
J44 閉塞性細支氣管炎 88
A16 原發性肺結核 379
A17 結核性腦膜炎 78
T17 支氣管異物 158
J06 上感 37
我們的模型大概設置了164個特征的不平衡數據集,所有可以認定為是一個高維不平衡的機器學習問題。 在原來的使用sklearn的邏輯回歸算法時候,模型在樣本數比較少的的分類中召回率很低,並且會錯分類為樣本數最多的分類,也就是說模型發生了過擬合。
邏輯回歸算法的模型性能
一般ML算法在不平衡數據集上的性能:
為了對catboost模型進行比較,我們使用了2種模型,一個是sklearn的邏輯回歸,還有就是xgboost,使用這2種算法分別對數據進行了訓練。
邏輯回歸:
0.843858969
[[ 167 35 20 2 2 1 22 0]
[ 47 1022 19 13 32 9 18 1]
[ 13 7 185 11 4 0 5 1]
[ 0 5 9 211 3 0 0 0]
[ 5 46 1 3 345 17 4 0]
[ 2 4 0 0 5 83 0 0]
[ 8 14 6 4 2 0 136 0]
[ 0 0 0 1 0 0 2 29]]
precision recall f1-score support
J20 急性支氣管炎 0.69 0.67 0.68 249
J15 肺炎 0.90 0.88 0.89 1161
J45 哮喘 0.77 0.82 0.79 226
J44 閉塞性細支氣管炎 0.86 0.93 0.89 228
A16 原發性肺結核 0.88 0.82 0.85 421
A17 結核性腦膜炎 0.75 0.88 0.81 94
T17 支氣管異物 0.73 0.80 0.76 170
J06 上感 0.94 0.91 0.92 32
avg / total 0.85 0.84 0.84 2581
正如我們可以清楚地看到,模型預測急性支氣管炎的能力很差(這種疾病樣本數比較少)(Precision = 0.67 Recall = 0.67),整體模型精確度大約為85%。
xgboost:
0.865909090909
[[ 22 37 8 2 3 0 10 0]
[ 12 960 8 2 12 0 4 0]
[ 5 18 68 6 2 0 2 0]
[ 0 7 9 39 3 0 2 0]
[ 1 43 2 0 256 3 4 0]
[ 0 2 0 0 7 54 0 0]
[ 1 13 3 0 2 0 97 0]
[ 1 1 0 0 1 0 0 28]]
precision recall f1-score support
J20 急性支氣管炎 0.52 0.27 0.35 82
J15 肺炎 0.89 0.96 0.92 998
J45 哮喘 0.69 0.67 0.68 101
J44 閉塞性細支氣管炎 0.80 0.65 0.72 60
A16 原發性肺結核 0.90 0.83 0.86 309
A17 結核性腦膜炎 0.95 0.86 0.90 63
T17 支氣管異物 0.82 0.84 0.83 116
J06 上感 1.00 0.90 0.95 31
avg / total 0.86 0.87 0.86 1760
xgboost模型沒有經過調參,性能比邏輯回歸有了一定提升,但是對於少樣本數據的預測結果變得更差了。急性支氣管炎的結果為:(Precision = 0.52 Recall = 0.27),整體模型精確度大約為86%。
可以通過下面一些技巧來提升小樣本的分類效果
以下是我們處理這個問題的方式,並且訓練了一個預測精度92%的小樣本的模型:
減少特征的數量:
更多特征的變量導致過度擬合數據,通過刪除一些沒有相關性的變量(需要專業知識)以及缺失值超過平均水平(本例考慮為15%)的變量。我們還計算了變量的重要性得分並據此刪掉一些低重要性得分的特征變量。
對小樣本分類的數據進行oversample
對於一般的不平衡問題我們采用oversample/undersample 的方法可能就能取得比較好的結果。但缺點就是如果overdample的比例過大會導致過擬合,undersample的比例過小可能會導致欠擬合。這個得經過實驗去比較分析了。
提高小樣本分類的召回率:
正如我們最初所看到的,由於在小樣本的分類上會錯誤分類到大樣本的分類上,所以我們試圖找到一種可以解決小樣本過擬合問題的模型。我們選擇了一個非常強大的機器學習算法,叫做“catboost”,它對過擬合是魯棒的。
使用catboost
由於在Kaggle的很多比賽中都是用了增強型機器學習算法,因此我們選擇了Catboost算法,而且由於它對於小樣本的過擬合問題解決的比較好,所以我們嘗試使用這種算法。
Catboost可以通過過擬合檢測器來防止過度擬合模型,從而使得模型的泛化能力更好。 它基於一種與標準梯度下降方式的優化方法不同的方法,叫做Gradient Boosting。
我們在沒有調參的情況下,使用catboost訓練後結果如下:
0.833636364
[[ 21 58 8 0 4 0 6 0]
[ 6 1159 14 2 24 2 7 0]
[ 2 21 108 9 5 0 4 0]
[ 0 10 1 58 14 0 5 0]
[ 0 65 3 4 301 4 2 0]
[ 0 7 0 0 16 55 0 0]
[ 2 43 7 3 1 0 102 0]
[ 0 2 0 0 4 0 1 30]]
precision recall f1-score support
J20 急性支氣管炎 0.68 0.22 0.33 97
J15 肺炎 0.85 0.95 0.90 1214
J45 哮喘 0.77 0.72 0.74 149
J44 閉塞性細支氣管炎 0.76 0.66 0.71 88
A16 原發性肺結核 0.82 0.79 0.80 379
A17 結核性腦膜炎 0.90 0.71 0.79 78
T17 支氣管異物 0.80 0.65 0.72 158
J06 上感 1.00 0.81 0.90 37
avg / total 0.83 0.83 0.82 2200
最終的結果
經過對超參數的調參,主要是學習率和叠代次數的調整,還有就是對小樣本的數據進行oversample,最終得到一個相對理想的結果。
(‘error:‘, 0.7361311844473497)
0.890072639
[[190 6 6 0 1 0 3 0]
[ 9 867 7 1 27 2 5 0]
[ 3 11 162 7 1 0 4 0]
[ 0 0 3 175 0 0 0 0]
[ 2 52 1 2 264 9 1 0]
[ 0 8 0 0 7 59 0 0]
[ 3 26 5 7 4 0 98 0]
[ 0 0 1 1 2 0 0 23]]
precision recall f1-score support
J20 急性支氣管炎 0.92 0.92 0.92 206
J15 肺炎 0.89 0.94 0.92 918
J45 哮喘 0.88 0.86 0.87 188
J44 閉塞性細支氣管炎 0.91 0.98 0.94 178
A16 原發性肺結核 0.86 0.80 0.83 331
A17 結核性腦膜炎 0.84 0.80 0.82 74
T17 支氣管異物 0.88 0.69 0.77 143
J06 上感 1.00 0.85 0.92 27
avg / total 0.89 0.89 0.89 2065
sklearn實戰-乳腺癌細胞數據挖掘(博客主親自錄制視頻教程,QQ:231469242)
https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campaign=commission&utm_source=cp-400000000398149&utm_medium=share
使用catboost解決ML中高維度不平衡數據集挑戰的解決方案