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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

关于sklearn下class_weight参数

發布時間:2023/12/16 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于sklearn下class_weight参数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一直沒有很在意過sklearn的class_weight的這個參數的具體作用細節,只大致了解是是用于處理樣本不均衡。后來在簡書上閱讀svm松弛變量的一些推導的時候,看到樣本不均衡的帶來的問題時候,想更深層次的看一下class_weight的具體作用方式,

svm松弛變量的簡書鏈接:https://www.jianshu.com/p/8a499171baa9

該文中的樣本不均衡的描述:

“樣本偏斜是指數據集中正負類樣本數量不均,比如正類樣本有10000個,負類樣本只有100個,這就可能使得超平面被“推向”負類(因為負類數量少,分布得不夠廣),影響結果的準確性。”?

隨后翻開sklearn LR的源碼:

我們以分類作為說明重點

在輸入參數class_weight=‘balanced’的時候:
?

# compute the class weights for the entire dataset yif class_weight == "balanced":class_weight = compute_class_weight(class_weight,np.arange(len(self.classes_)),y)class_weight = dict(enumerate(class_weight))

進一步閱讀 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参数的全部內容,希望文章能夠幫你解決所遇到的問題。

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