日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

不均衡分类问题 之 class weight sample weight

發(fā)布時(shí)間:2023/12/16 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 不均衡分类问题 之 class weight sample weight 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

分類問(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呢?

  • 通過(guò)字典形式傳入權(quán)重參數(shù),如二分類問(wèn)題y∈{0,1}y \in \{0,1\}y{0,1},class_weight={0:0.9, 1:0.1}
  • 設(shè)置class_weight = 'balanced’
    此時(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))
  • import numpy as npy = [0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2] #標(biāo)簽值,一共16個(gè)樣本a = np.bincount(y) # array([8, 6, 2], dtype=int64) 計(jì)算每個(gè)類別的樣本數(shù)量 aa = 1/a #倒數(shù) array([0.125 , 0.16666667, 0.5 ]) print(aa)from sklearn.utils.class_weight import compute_class_weight class_weight = 'balanced' classes = np.array([0, 1, 2]) #標(biāo)簽類別 weight = compute_class_weight(class_weight, classes, y) print(weight) # [0.66666667 0.88888889 2.66666667]print(0.66666667*8) #5.33333336 print(0.88888889*6) #5.33333334 print(2.66666667*2) #5.33333334 # 這三個(gè)值非常接近 # 'balanced'計(jì)算出來(lái)的結(jié)果很均衡,使得懲罰項(xiàng)和樣本量對(duì)應(yīng)

    這種方式在原始的損失函數(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。