不均衡分类问题 之 class weight sample weight
分類問(wèn)題中,當(dāng)不同類別的樣本量差異很大,即類分布不平衡時(shí),很容易影響分類結(jié)果。因此需要進(jìn)行校正。
sklearn的做法是加權(quán),加權(quán)就要涉及到class_weight和sample_weight,當(dāng)不設(shè)置該參數(shù)時(shí),默認(rèn)所有類別的權(quán)值為1。
類型權(quán)重 class_weight
字典類型,將類索引映射到權(quán)重值。對(duì)訓(xùn)練集里的每個(gè)類別加權(quán),作用于損失函數(shù)(僅在訓(xùn)練過(guò)程中)。從而使模型更加關(guān)注樣本數(shù)量少的類別。如果某類別的樣本數(shù)多,那么它的權(quán)重就低,反之則權(quán)重就高.
應(yīng)用場(chǎng)景:
第一種是誤分類的代價(jià)很高。比如對(duì)合法用戶和非法用戶進(jìn)行分類,將非法用戶分類為合法用戶的代價(jià)很高,我們寧愿將合法用戶分類為非法用戶,這時(shí)可以人工再甄別,但是卻不愿將非法用戶分類為合法用戶。這時(shí),我們可以適當(dāng)提高非法用戶的權(quán)重class_weight={0:0.9, 1:0.1}。
第二種是樣本是高度失衡的,比如我們有合法用戶和非法用戶的二元樣本數(shù)據(jù)10000條,里面合法用戶有9995條,非法用戶只有5條,如果我們不考慮權(quán)重,則我們可以將所有的測(cè)試集都預(yù)測(cè)為合法用戶,這樣預(yù)測(cè)準(zhǔn)確率理論上有99.95%,但是卻沒(méi)有任何意義。這時(shí),我們可以選擇balanced(scikit-learn 邏輯回歸類庫(kù)使用小結(jié)),讓類庫(kù)自動(dòng)提高非法用戶樣本的權(quán)重。
參數(shù)設(shè)置
那么應(yīng)該如何設(shè)置class_weight呢?
此時(shí),會(huì)自動(dòng)調(diào)用from sklearn.utils.class_weight import compute_class_weight計(jì)算權(quán)重,平衡輸入樣本中各類別之間的權(quán)重。其計(jì)算公式為:
weight=n_samples/(n_classes?np.bincount(y))weight = n\_samples / (n\_classes * np.bincount(y))weight=n_samples/(n_classes?np.bincount(y))
這種方式在原始的損失函數(shù)的基礎(chǔ)上乘以對(duì)應(yīng)的sample_weight來(lái)計(jì)算最終的損失。這樣計(jì)算而來(lái)的損失函數(shù)不會(huì)因?yàn)闃颖静黄胶舛弧巴葡颉睒颖玖科俚念悇e中
樣本權(quán)重 sample_weight
numpy權(quán)重?cái)?shù)組。對(duì)每個(gè)樣本加權(quán)(僅在訓(xùn)練過(guò)程中),思路和類別權(quán)重類似,即樣本數(shù)多的類別樣本權(quán)重低,反之樣本權(quán)重高
應(yīng)用場(chǎng)景:
樣本不平衡,導(dǎo)致樣本不是總體樣本的無(wú)偏估計(jì),從而可能導(dǎo)致我們的模型預(yù)測(cè)能力下降。遇到這種情況,我們可以通過(guò)調(diào)節(jié)樣本權(quán)重來(lái)嘗試解決這個(gè)問(wèn)題。調(diào)節(jié)樣本權(quán)重的方法有兩種,第一種是在class_weight使用balanced。第二種是在調(diào)用fit函數(shù)時(shí),通過(guò)sample_weight來(lái)自己調(diào)節(jié)每個(gè)樣本權(quán)重。
注意事項(xiàng):
在sklearn中的邏輯回歸時(shí),如果上面兩種方法都用到了,那么樣本的真正權(quán)重是class_weight * sample_weight.
原理:樣本或類別的權(quán)重在訓(xùn)練模型最終通過(guò)損失函數(shù)實(shí)現(xiàn)(以邏輯回歸為例):
算法會(huì)把每個(gè)樣本的訓(xùn)練損失乘以它的權(quán)重class_weight*sample_weight,損失函數(shù)為:
J(θ)=?β?ln?(θ)=?β∑i=1m(y(i)log(hθ(x(i)))+(1?y(i))log(1?hθ(x(i))))J(\theta) =-\beta*\ln(\theta) = ?\beta∑_{i=1}^m(y^{(i)}log(h_θ(x^{(i)}))+(1?y^{(i)})log(1?h_θ{(x^{(i)})}))J(θ)=?β?ln(θ)=?β∑i=1m?(y(i)log(hθ?(x(i)))+(1?y(i))log(1?hθ?(x(i))))
其中,β=(class_weight?sample_weight)\beta = (class\_weight?sample\_weight)β=(class_weight?sample_weight)
應(yīng)用:做受眾選擇(人群擴(kuò)展、人群定向)模型,若種子包括目標(biāo)商品轉(zhuǎn)化和行為用戶(購(gòu)買較少,加入線上加購(gòu)、收藏作為正樣本),可考慮加大轉(zhuǎn)化用戶的樣本權(quán)重。
如果僅僅是類不平衡,則使用class_weight;
如果類內(nèi)樣本之間還不平衡,則使用sample_weights。
如果class_weight選擇balanced,那么類庫(kù)會(huì)根據(jù)訓(xùn)練樣本量來(lái)計(jì)算權(quán)重。某種類型樣本量越多,則權(quán)重越低,樣本量越少,則權(quán)重越高。
總結(jié)
以上是生活随笔為你收集整理的不均衡分类问题 之 class weight sample weight的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Permutation 和 Combin
- 下一篇: cocoa touch框架