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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

sklearn的class_weight设置为'balanced'的计算方法

發布時間:2023/12/13 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 sklearn的class_weight设置为'balanced'的计算方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

分類的時候,當不同類別的樣本量差異很大時,很容易影響分類結果,因此要么每個類別的數據量大致相同,要么就要進行校正。

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

在python中:

# class_weight的傳參
class_weight : {dict, 'balanced'}, optional
        Set the parameter C of class i to class_weight[i]*C for
        SVC. If not given, all classes are supposed to have
        weight one. The "balanced" mode uses the values of y to automatically
        adjust weights inversely proportional to class frequencies as
        ``n_samples / (n_classes * np.bincount(y))``
#  當使用字典時,其形式為:Weights associated with classes in the form ``{class_label: weight}``,比如:{0: 1, 1: 1}表示類0的權值為1,類1的權值為1.

# sample_weight的傳參
sample_weight : array-like, shape (n_samples,)
            Per-sample weights. Rescale C per sample. Higher weights
            force the classifier to put more emphasis on these points. 

1. 在:from sklearn.utils.class_weight import compute_class_weight 里面可以看到計算的源代碼。

2. 除了通過字典形式傳入權重參數,還可以設置的是:class_weight = 'balanced',例如使用SVM分類:

clf = SVC(kernel = 'linear', class_weight='balanced', decision_function_shape='ovr')
clf.fit(X_train, y_train)

3. 那么'balanced'的計算方法是什么呢?看例子:

import numpy as np

y = [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'計算出來的結果很均衡,使得懲罰項和樣本量對應

可以看出計算出來的值,乘以樣本量之后,三個類別的數字很接近,我想的是:個人覺得懲罰項就用樣本量的倒數未嘗不可,因為乘以樣本量都是1,相當于'balanced'這里是多乘以了一個常數

4. 真正的魔法到了:還記得上面所給出的python中,當class_weight為'balanced'時的計算公式嗎?

# weight_ = n_samples / (n_classes * np.bincount(y))``
# 這里
# n_samples為16
# n_classes為3
# np.bincount(y)實際上就是每個類別的樣本數量

于是:

print(16/(3*8))  #輸出 0.6666666666666666
print(16/(3*6))  #輸出 0.8888888888888888
print(16/(3*2))  #輸出 2.6666666666666665

是不是跟計算出來的權值一樣?這就是class_weight設置為'balanced'時的計算方法了。

5. 當然,需要說明一下傳入字典時的情形

import numpy as np

y = [0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2]  #標簽值,一共16個樣本

from sklearn.utils.class_weight import compute_class_weight 
class_weight = {0:1,1:3,2:5}   # {class_label_1:weight_1, class_label_2:weight_2, class_label_3:weight_3}
classes = np.array([0, 1, 2])  #標簽類別
weight = compute_class_weight(class_weight, classes, y)
print(weight)   # 輸出:[1. 3. 5.],也就是字典中設置的值

參考:

https://blog.csdn.net/go_og/article/details/81281387

https://www.zhihu.com/question/265420166/answer/293896934

總結

以上是生活随笔為你收集整理的sklearn的class_weight设置为'balanced'的计算方法的全部內容,希望文章能夠幫你解決所遇到的問題。

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