簡體   English   中英

使用 imblearn 在 SMOTE 之后執行隨機欠采樣

[英]Performing Random Under-sampling after SMOTE using imblearn

我正在嘗試使用RandomUnderSampler()和 SMOTE( SMOTE()來實現組合過采樣和欠采樣。

我正在處理 loan_status 數據集。

我做了以下拆分。

X = df.drop(['Loan_Status'],axis=1).values   # independant features
y = df['Loan_Status'].values# dependant variable

這就是我的訓練數據分布的樣子。

目標變頻計數

這是我嘗試為類平衡執行的代碼片段。

from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler
from imblearn.pipeline import make_pipeline
over = SMOTE(sampling_strategy=0.1)
under = RandomUnderSampler(sampling_strategy=0.5)
pipeline = make_pipeline(over,under)
    
x_sm,y_sm = pipeline.fit_resample(X_train,y_train)

它給了我一個帶有以下回溯的 ValueError:

ValueError                                Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_64588/3438707951.py in <module>
      4 pipeline = make_pipeline(over,under)
      5 
----> 6 x_copy,y_copy = pipeline.fit_resample(x_train_copy,y_train_copy)

~\Anaconda3\lib\site-packages\imblearn\pipeline.py in fit_resample(self, X, y, **fit_params)
    351             fit_params_last_step = fit_params_steps[self.steps[-1][0]]
    352             if hasattr(last_step, "fit_resample"):
--> 353                 return last_step.fit_resample(Xt, yt, **fit_params_last_step)
    354 
    355     @if_delegate_has_method(delegate="_final_estimator")

~\Anaconda3\lib\site-packages\imblearn\base.py in fit_resample(self, X, y)
     77         X, y, binarize_y = self._check_X_y(X, y)
     78 
---> 79         self.sampling_strategy_ = check_sampling_strategy(
     80             self.sampling_strategy, y, self._sampling_type
     81         )

~\Anaconda3\lib\site-packages\imblearn\utils\_validation.py in check_sampling_strategy(sampling_strategy, y, sampling_type, **kwargs)
    532         return OrderedDict(
    533             sorted(
--> 534                 _sampling_strategy_float(sampling_strategy, y, sampling_type).items()
    535             )
    536         )

~\Anaconda3\lib\site-packages\imblearn\utils\_validation.py in _sampling_strategy_float(sampling_strategy, y, sampling_type)
    391             ]
    392         ):
--> 393             raise ValueError(
    394                 "The specified ratio required to generate new "
    395                 "sample in the majority class while trying to "

ValueError: The specified ratio required to generate new sample in the majority class while trying to remove samples. Please increase the ratio.

您必須增加 SMOTE 的采樣策略,因為 (( SMOTE ((y_train==0).sum())/((y_train==1).sum())高於0.1 看來您的起始不平衡率約為(肉眼) 0.4 嘗試:

over = SMOTE(sampling_strategy=0.5)

最后,您可能想要一個相等的最終比率(在欠采樣之后),因此您應該將RandomUnderSampler的采樣策略設置為1.0

under = RandomUnderSampler(sampling_strategy=1)

嘗試這種方式,如果您有其他問題,請給我反饋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM