資料探勘中有時候會遇到不均衡樣本,一種常用的方法是通過根據樣本個數進行統計計算,或者根據業務場景人工計算權重。諸如sklearn的dt、rf等模型都設定了class_weight引數進行快速balanced;而xgb的fit中也有sampe_weight引數,只是需要手動提供每個樣本對應權重的array,這裡提供了一段簡單的計算樣本權重的**。
"""
根據labels序列進行統計,生成對應的sample權重
或者根據指定的權重字典,生成對應的sample權重
"""import numpy as np
defsample_weights_cal
(labels, flag=
0, class_weights=
none):
""" :param labels: 樣本label
:param flag: 0-返回權重字典,1-返回labels同維的權重序列
:return: 權重字典或權重序列
"""try:
labels = np.array(labels)
except typeerror:
print
("輸入格式錯誤"
)assert labels.ndim ==
1 labels_set =
set(labels)
labels_value =
list
(labels_set)
labels_count = np.array(
[(labels==l)
.sum()
for l in labels_value]
) sample_ratio = labels_count.prod(
)/labels_count
sample_ratio_std = sample_ratio / sample_ratio.
sum(
) sample_weights_dict =
ifnot class_weights:
if flag ==0:
return sample_weights_dict
else
: sample_weights_info = np.zeros(shape=labels.shape)
for i in
range
(sample_weights_info.shape[0]
):sample_weights_info[i]
= sample_weights_dict.get(labels[i]
)return sample_weights_info
else
:assert
isinstance
(class_weights,
dict
)# 必須為字典
assert flag==
1# 必須返回序列
assert labels_set ==
set(class_weights.keys())
class_weights_sum = np.array(
list
(class_weights.values())
).sum(
)print
(class_weights_sum)
for key, value in class_weights.items():
class_weights[key]
= value/class_weights_sum
sample_weights_info = np.zeros(shape=labels.shape)
for i in
range
(sample_weights_info.shape[0]
):sample_weights_info[i]
= class_weights.get(labels[i]
)return sample_weights_info
樣本不均衡
在分類中,訓練資料不均衡是指不同類別下的樣本數目相差巨大。舉兩個例子 在乙個二分類問題中,訓練集中class 1的樣本數比上class 2的樣本數的比值為60 1。使用邏輯回歸進行分類,最後結果是其忽略了class 2,將所有的訓練樣本都分類為class 1。在三分類問題中,三個類別分別為a,b,c...
樣本不均衡問題
樣本不均衡是機器學習,深度學習中常見問題。分類任務 a 95 b 5 模型將所有樣本 為a,那麼正確率可以達到95 第一種 是把多的那個組變少 降取樣 第二種 是把少的那個組變多 過取樣 最簡單的是oversampling,由於其侷限性,又有很多根據已有的資料生成新資料的方法,比如各種變體的synt...
分類問題 樣本不均衡
資料層 通過重取樣使樣本空間均衡 演算法層 重點學習正樣本來適應現存的分類器 損失敏感方法 整合資料層和演算法層的思想,假設正樣本誤分類的損失更大。boosting演算法 不斷提高樣本權重 1 對正樣本隨機過取樣,對負樣本隨機下取樣。2 按照樣本特徵和比例來過取樣正樣本或下取樣負樣本,雖然重取樣在樣...