隨機選擇類別較多的資料與類別較少的資料一致。
# x特徵,y類別
x = data.ix[
:, data.columns !=
'class'
]y = data.ix[
:, data.columns ==
'class'
]# 小類別資料個數
number_records_fraud =
len(data[data.class ==1]
)# 小類別資料索引
fraud_indices = np.array(data[data.class ==1]
.index)
# 大類別資料索引
normal_indices = data[data.class ==0]
.index
# 從大類別索引中隨機選擇,個數與小類別資料個數相同
random_normal_indices = np.random.choice(normal_indices, number_records_fraud, replace =
false
)random_normal_indices = np.array(random_normal_indices)
# 合併小類別索引與下取樣的大類別索引
under_sample_indices = np.concatenate(
[fraud_indices,random_normal_indices]
)# 根據索引取資料
under_sample_data = data.iloc[under_sample_indices,:]
# 取出特徵與類別
x_undersample = under_sample_data.ix[
:, under_sample_data.columns !=
'class'
]y_undersample = under_sample_data.ix[
:, under_sample_data.columns ==
'class'
]
下取樣會丟失資訊,如何減少資訊的損失呢?
smote
利用小眾樣本在特徵空間的相似性來生成新樣本。對於小眾樣本xi∈smin,從它屬於小眾類的k近鄰中隨機選取乙個樣本點xi,生成乙個新的小眾樣本xnew:xnew=xi+(x^−xi)×δ,其中δ∈[0,1]是隨機數。
# imbalance-learn
from imblearn.over_sampling import smote
features_train, features_test, labels_train, labels_test = train_test_split(features,
labels,
test_size=
0.2,
random_state=0)
oversampler=smote(random_state=0)
os_features,os_labels=oversampler.fit_sample(features_train,labels_train)
smote為每個小眾樣本合成相同數量的新樣本,這帶來一些潛在的問題:一方面是增加了類之間重疊的可能性,另一方面是生成一些沒有提供有益資訊的樣本。為了解決這個問題,出現兩種方法:borderline-smote與adasyn。 機器學習分類問題中 訓練資料類別不均衡怎麼解決
碰到樣本資料類別不均衡怎麼辦?如果有 10000個樣例,做二分類,9990條資料 都屬於 正類1,如果不處理的話 全部結果為 1,準確率也為 99 但這顯然不是想要的結果。碰到這樣樣本很不平衡的樣例,應該怎樣做。def down sample df df1 df df label 1 正例df2 d...
在機器學習中如何應對不均衡分類問題?
在處理機器學習等資料科學問題時,經常會碰到不均衡種類分布的情況,即在樣本資料中乙個或多個種類的觀察值明顯少於其他種類的觀察值的現象。在我們更關心少數類的問題時這個現象會非常突出,例如竊電問題 銀行詐騙 易 罕見病鑑定等。在這種情況下,運用常規的機器學習演算法的 模型可能會無法準確 這是因為機器學習演...
機器學習分類問題中,資料不均衡時的解決方法
資料不均衡是指資料集中每種類別的資料的數量相差比較大。比如乙個資料集s中,a類資料有100個,b類有1個,一般相差乙個以上數量級的就算是資料不均衡了,需要進行預處理。資料不均衡會導致最終的分類結果有偏差。同樣以資料集s作為說明,如果不作任何處理直接用s作為訓練資料,那麼用訓練模型對乙個新的資料進行測...