У меня есть ряд информационных фреймов, содержащих суточные суммы осадков (непрерывные данные) и информацию о том, происходит ли наводнение (двоичные данные, т.е. 1 или 0). Каждый кадр данных представляет год (например, df01, df02, df03 и т. Д.), Который выглядит следующим образом:
date ppt fld
01/02/2011 1.5 0
02/02/2011 0.0 0
03/02/2011 2.7 0
04/02/2011 4.6 0
05/02/2011 15.5 1
06/02/2011 1.5 0
...
Я хочу выполнить логистическую регрессию для каждого года данных, но данные сильно дисбалансированы из-за очень небольшого числа наводнений по сравнению с количеством осадков. Как таковой, я хочу увеличить выборку только класса меньшинства (значения 1 в 'fld'). До сих пор я знал, что нужно разделить каждый фрейм данных на два в соответствии со значением 'fld', затем сэмплировать результирующий фрейм данных '1', а затем снова объединить в один фрейм данных.
# So if I apply to one dataframe it looks like this:
# Separate majority and minority classes
mask = df01.fld == 0
fld_0 = df01[mask]
fld_1 = df01[~mask]
# Upsample minority class
fld_1_upsampled = resample(fld_1,
replace=True, # sample with replacement
n_samples=247, # to match majority class
random_state=123) # reproducible results
# Combine majority class with upsampled minority class
df01_upsampled = pd.concat([fld_0, fld_1_upsampled])
Поскольку у меня есть 17 фреймов данных, неэффективно переходить с фрейма на фрейм. Есть ли мысли о том, как я мог бы быть более эффективным с этим? До сих пор я пробовал это (вероятно, я понятия не имею, что я делаю с циклами такого рода, я совсем новичок в python):
df_all = [df01, df02, df03, df04,
df05, df06, df07, df08,
df09, df10, df11, df12,
df13, df14, df15, df16, df17]
# This is my list of annual data
for i in df_all:
fld_0 = i[mask]
fld_1 = i[~mask]
fld_1_upsampled = resample(fld_1,
replace=True, # sample with replacement
n_samples=len(fld_0), # to match majority class
random_state=123) # reproducible results
i_upsampled = pd.concat([fld_0, fld_1_upsampled])
return i_upsampled
, который возвращает следующую ошибку:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-36-6fd782d4c469> in <module>()
11 replace=True, # sample with replacement
12 n_samples=247, # to match majority class
---> 13 random_state=123) # reproducible results
14 i_upsampled = pd.concat([fld_0, fld_1_upsampled])
15 return i_upsampled
~/anaconda3/lib/python3.6/site-packages/sklearn/utils/__init__.py in resample(*arrays, **options)
259
260 if replace:
--> 261 indices = random_state.randint(0, n_samples, size=(max_n_samples,))
262 else:
263 indices = np.arange(n_samples)
mtrand.pyx in mtrand.RandomState.randint()
ValueError: low >= high
Любые советы или комментарии с благодарностью :)
ОБНОВЛЕНИЕ: один ответ предположил, что некоторые из моих фреймов данных могут не содержать выборки из класса меньшинства. Это было правильно, поэтому я удалил их, но возникает та же ошибка.