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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/16 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 不均衡分类问题 之 class weight sample weight 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

分類問題中,當不同類別的樣本量差異很大,即類分布不平衡時,很容易影響分類結果。因此需要進行校正。

sklearn的做法是加權,加權就要涉及到class_weight和sample_weight,當不設置該參數時,默認所有類別的權值為1。

類型權重 class_weight

字典類型,將類索引映射到權重值。對訓練集里的每個類別加權,作用于損失函數(僅在訓練過程中)。從而使模型更加關注樣本數量少的類別。如果某類別的樣本數多,那么它的權重就低,反之則權重就高.

應用場景
第一種是誤分類的代價很高。比如對合法用戶和非法用戶進行分類,將非法用戶分類為合法用戶的代價很高,我們寧愿將合法用戶分類為非法用戶,這時可以人工再甄別,但是卻不愿將非法用戶分類為合法用戶。這時,我們可以適當提高非法用戶的權重class_weight={0:0.9, 1:0.1}。

第二種是樣本是高度失衡的,比如我們有合法用戶和非法用戶的二元樣本數據10000條,里面合法用戶有9995條,非法用戶只有5條,如果我們不考慮權重,則我們可以將所有的測試集都預測為合法用戶,這樣預測準確率理論上有99.95%,但是卻沒有任何意義。這時,我們可以選擇balanced(scikit-learn 邏輯回歸類庫使用小結),讓類庫自動提高非法用戶樣本的權重。

參數設置
那么應該如何設置class_weight呢?

  • 通過字典形式傳入權重參數,如二分類問題y∈{0,1}y \in \{0,1\}y{0,1},class_weight={0:0.9, 1:0.1}
  • 設置class_weight = 'balanced’
    此時,會自動調用from sklearn.utils.class_weight import compute_class_weight計算權重,平衡輸入樣本中各類別之間的權重。其計算公式為:
    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] #標簽值,一共16個樣本a = np.bincount(y) # array([8, 6, 2], dtype=int64) 計算每個類別的樣本數量 aa = 1/a #倒數 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]) #標簽類別 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 # 這三個值非常接近 # 'balanced'計算出來的結果很均衡,使得懲罰項和樣本量對應

    這種方式在原始的損失函數的基礎上乘以對應的sample_weight來計算最終的損失。這樣計算而來的損失函數不會因為樣本不平衡而被“推向”樣本量偏少的類別中

    樣本權重 sample_weight

    numpy權重數組。對每個樣本加權(僅在訓練過程中),思路和類別權重類似,即樣本數多的類別樣本權重低,反之樣本權重高

    應用場景
    樣本不平衡,導致樣本不是總體樣本的無偏估計,從而可能導致我們的模型預測能力下降。遇到這種情況,我們可以通過調節樣本權重來嘗試解決這個問題。調節樣本權重的方法有兩種,第一種是在class_weight使用balanced。第二種是在調用fit函數時,通過sample_weight來自己調節每個樣本權重。

    注意事項:

  • 在sklearn中的邏輯回歸時,如果上面兩種方法都用到了,那么樣本的真正權重是class_weight * sample_weight.
    原理:樣本或類別的權重在訓練模型最終通過損失函數實現(以邏輯回歸為例):
    算法會把每個樣本的訓練損失乘以它的權重class_weight*sample_weight,損失函數為:

    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)

    應用:做受眾選擇(人群擴展、人群定向)模型,若種子包括目標商品轉化和行為用戶(購買較少,加入線上加購、收藏作為正樣本),可考慮加大轉化用戶的樣本權重。

  • 如果僅僅是類不平衡,則使用class_weight;
    如果類內樣本之間還不平衡,則使用sample_weights。

  • 如果class_weight選擇balanced,那么類庫會根據訓練樣本量來計算權重。某種類型樣本量越多,則權重越低,樣本量越少,則權重越高。

  • 總結

    以上是生活随笔為你收集整理的不均衡分类问题 之 class weight sample weight的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。