2. 利用keras中的fit方法裡的引數
2.2 sample_weight
2.3 注意的點
隨機過取樣的核心思想,就是隨機的複製、重複少數類樣本,最終使得少數類與多數類的個數相同從而得到乙個新的均衡的資料集。
但是這樣做很容易引起「過擬合」問題
丟棄大量資料,和過取樣一樣會存在過擬合的問題。
smote(synthetic minority oversampling technique)即合成少數類過取樣技術,它是基於隨機過取樣演算法的一種改進方案,smote演算法的基本思想是對少數類樣本進行分析並根據少數類樣本人工合成新樣本新增到資料集中。
其思想是:對於少數類樣本a, 隨機選擇乙個最近鄰的樣本b, 然後從a與b的連線上隨機選取乙個點c作為新的少數類樣本。
引數型別為字典,將不同的類別對映為不同的權值,該引數用來在訓練過程中調整損失函式(只能用於訓練)。該引數在處理非平衡的訓練資料(某些類的訓練樣本數很少)時,可以使得損失函式對樣本數不足的資料更加關注。
**實現:
from sklearn.utils import class_weight
import pandas as pd
train_df = pd.read_csv("input/train.csv")
x_train = train_df['image']
y_train = train_df['class']
class_weight = class_weight.compute_class_weight('balanced',
np.unique(y_train),
y_train)
cw = dict(enumerate(class_weight))
**實現:
import math
# 權重超引數
mu = 0.15
def create_class_weight(labels_dict, mu):
keys = labels_dict.keys()
class_weight = dict()
for key in keys:
score = math.log(mu * num_train_sample / float(labels_dict[key]))
class_weight[key] = score if score > 1.0 else 1.0
return class_weight
labels_dict =
cw = create_class_weight(labels_dict, mu)
權值的numpy array,用於在訓練時調整損失函式(僅用於訓練)。可以傳遞乙個1d的與樣本等長的向量用於對樣本進行1對1的加權,或者在面對時序資料時,傳遞乙個的形式為(samples,sequence_length)的矩陣來為每個時間步上的樣本賦不同的權。這種情況下請確定在編譯模型時新增了sample_weight_mode=『temporal』。
1.sample_weight會覆蓋class_weight,所以二者用其一;
2.如果僅僅是類不平衡,則使用class_weight,sample_weights則是類內樣本之間還不平衡的時候使用。
3.keras已經在新版本中加入了 class_weight = 『auto』。
設定了這個引數後,keras會自動設定class weight讓每類的sample對損失的貢獻相等。
4.在設定類別權重的時候,類別序列可以使用.class_indices獲取。
print(train_generator.class_indices)
keras官方中文文件中有關fit函式的部分參考部落格
keras中處理樣本不平衡
參考文獻 兩者的區別為 class weight 主要針對的上資料不均衡問題,比如 異常檢測的二項分類問題,異常資料僅佔1 正常資料佔99 此時就要設定不同類對loss的影響。sample weight 主要解決的是樣本質量不同的問題,比如前1000個樣本的可信度,那麼它的權重就要高,後1000個樣...
不平衡資料處理
在做實驗中遇到了非平衡資料集,導致實驗結果很憂傷,資料類別不均對模型訓練有挺大影響,尤其是在類別極度不均的時候。目前還沒有很好的解決方法,還處於查詢資料,比著葫蘆找葫蘆的過程中,記錄一下,或許能有所啟發。對於不平衡資料,其實類別精度 precise 和召回率 recall 或者是準確率 accura...
如何處理不平衡資料
過取樣 過擬合 學習到小類別樣本中的雜訊 欠取樣 欠擬合 丟失大類別樣本中的重要資料 找到小類別樣本中的k個近鄰,然後在他們之間的連線上取點,作為新的樣本。缺點 容易過擬合 其與smote的不同是 smote是對每乙個minority樣本產生綜合新樣本,而borderline smote僅對靠近邊界...