Цикл для выполнения одной и той же задачи передискретизации на нескольких фреймах данных панд для логистической регрессии - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть ряд информационных фреймов, содержащих суточные суммы осадков (непрерывные данные) и информацию о том, происходит ли наводнение (двоичные данные, т.е. 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

Любые советы или комментарии с благодарностью :)

ОБНОВЛЕНИЕ: один ответ предположил, что некоторые из моих фреймов данных могут не содержать выборки из класса меньшинства. Это было правильно, поэтому я удалил их, но возникает та же ошибка.

1 Ответ

0 голосов
/ 06 ноября 2018

Дает вам преимущество сомнения в том, что вы используете тот же синтаксис mask во втором блоке кода, что и в первом, похоже, что у вас может не быть образцов для передачи в resample в одном или больше ваших DF:

df=pd.DataFrame({'date':[1,2,3,4,5,6],'ppt':[1.5,0,2.7,4.6,15.5,1.5],'fld':[0,1,0,0,1,1]})

date    ppt     fld
1       1.5     0
2       0.0     1
3       2.7     0
4       4.6     0
5       15.5    1
6       1.5     1

resample(df[df.fld==1], replace=True, n_samples=3, random_state=123)

date    ppt     fld
6       1.5     1
5       15.5    1
6       1.5     1

resample(df[df.fld==2], replace=True, n_samples=3, random_state=123)

"...ValueError: low >= high"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...