关于sklearn下class_weight参数
一直沒有很在意過sklearn的class_weight的這個參數的具體作用細節,只大致了解是是用于處理樣本不均衡。后來在簡書上閱讀svm松弛變量的一些推導的時候,看到樣本不均衡的帶來的問題時候,想更深層次的看一下class_weight的具體作用方式,
svm松弛變量的簡書鏈接:https://www.jianshu.com/p/8a499171baa9
該文中的樣本不均衡的描述:
“樣本偏斜是指數據集中正負類樣本數量不均,比如正類樣本有10000個,負類樣本只有100個,這就可能使得超平面被“推向”負類(因為負類數量少,分布得不夠廣),影響結果的準確性。”?
隨后翻開sklearn LR的源碼:
我們以分類作為說明重點
在輸入參數class_weight=‘balanced’的時候:
?
進一步閱讀 compute_class_weight這個函數:
elif class_weight == 'balanced':# Find the weight of each class as present in y.le = LabelEncoder()y_ind = le.fit_transform(y)if not all(np.in1d(classes, le.classes_)):raise ValueError("classes should have valid labels that are in y")recip_freq = len(y) / (len(le.classes_) *np.bincount(y_ind).astype(np.float64))weight = recip_freq[le.transform(classes)]compute_class_weight這個函數的作用是對于輸入的樣本,平衡類別之間的權重,下面寫段測試代碼測試這個函數:
# coding:utf-8from sklearn.utils.class_weight import compute_class_weightclass_weight = 'balanced' label = [0] * 9 + [1]*1 + [2, 2] print(label) # [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2] classes=[0, 1, 2] weight = compute_class_weight(class_weight, classes, label) print(weight) #[ 0.44444444 4. 2. ] print(.44444444 * 9) # 3.99999996 print(4 * 1) # 4 print(2 * 2) # 4如上圖所示,可以看到這個函數把樣本的平衡后的權重乘積為4,每個類別均如此。banlanced的計算公式為:n_samples/n_classes/np.bincount(y)。n_samples表示樣本總數,n_classes表示總類別數量,np.bincount(y)輸出所有類別的每個類別的樣本數量,y是所有樣本的標簽。一個標簽代表一個類別。采用balanced模型時,每種類別的權重為n_samples/n_classes,即12/3=4;然后根據每種類別中的樣本數量對每個樣本進行平均分配權重,即4/9=0.444, 4/1=4, 4/2=2。0類別有9個樣本,1類別有1個樣本,2類別有2個樣本。
關于class_weight與sample_weight在損失函數上的具體計算方式:
sample_weight *= class_weight_[le.fit_transform(y_bin)] # sample_weight 與 class_weight相乘# Logistic loss is the negative of the log of the logistic function. out = -np.sum(sample_weight * log_logistic(yz)) + .5 * alpha * np.dot(w, w)上述可以看出對于每個樣本,計算的損失函數乘上對應的sample_weight來計算最終的損失。這樣計算而來的損失函數不會因為樣本不平衡而被“推向”樣本量偏少的類別中。
class_weight以及sample_weight并沒有進行不平衡數據的處理,比如,上下采樣。詳細參見SMOTE EasyEnsemble等。
————————————————
原文鏈接:https://blog.csdn.net/go_og/article/details/81281387
?
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
keras ?中fit(self, x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0,
validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0,
steps_per_epoch=None, validation_steps=None)
官方文檔中:
class_weight:字典,將不同的類別映射為不同的權值,該參數用來在訓練過程中調整損失函數(只能用于訓練)。該參數在處理非平衡的訓練數據(某些類的訓練樣本數很少)時,可以使得損失函數對樣本數不足的數據更加關注。
sample_weight:權值的numpy array,用于在訓練時調整損失函數(僅用于訓練)。可以傳遞一個1D的與樣本等長的向量用于對樣本進行1對1的加權,或者在面對時序數據時,傳遞一個的形式為(samples,sequence_length)的矩陣來為每個時間步上的樣本賦不同的權。這種情況下請確定在編譯模型時添加了sample_weight_mode='temporal'。
class_weight---主要針對的上數據不均衡問題,比如:異常檢測的二項分類問題,異常數據僅占1%,正常數據占99%; 此時就要設置不同類對loss的影響。
sample_weigh---主要解決的是樣本質量不同的問題,比如前1000個樣本的可信度,那么它的權重就要高,后1000個樣本可能有錯、不可信,那么權重就要調低。
————————————————
原文鏈接:https://blog.csdn.net/weixin_40755306/article/details/82290033
?
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
鏈接:https://www.zhihu.com/question/265420166/answer/293896934
?
總結
以上是生活随笔為你收集整理的关于sklearn下class_weight参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现网必用的主备冗余技术,VRRP理论+配
- 下一篇: Linkerd、Consul、Istio