Pandas случайным образом меняются значения столбцов в строке - PullRequest
0 голосов
/ 25 февраля 2020

Я хочу обучить модель ML бинарной классификации с некоторыми данными, которые у меня есть; что-то вроде этого:

df 

y   ch1_g1  ch2_g1  ch3_g1  ch1_g2  ch2_g2  ch3_g2
0   20      89      62      23      3       74
1   51      64      19      2       83      0
0   14      58      2       71      31      48
1   32      28      2       30      92      91
1   51      36      51      66      15      14
...

Моя цель (y) зависит от трех характеристик из двух групп, однако у меня есть дисбаланс в моих данных, подсчет значений моей цели y показывает, что я имеют больше нулей, чем в соотношении около 2,68. Я исправляю это путем зацикливания каждой строки и случайного обмена значениями из группы 1 в группу 2 и наоборот, например:

for index,row in df.iterrows():

choice = np.random.choice([0,1])

if row['y'] != choice:

    df.loc[index, 'y'] = choice

    for column in df.columns[1:]:

        key = column.replace('g1', 'g2') if 'g1' in column else column.replace('g2', 'g1')

        df.loc[index, column] = row[key]

Делая это, уменьшите соотношение не более чем до 1,3, поэтому мне было интересно, есть ли более прямой подход с использованием pandas методов. ¿У кого-нибудь есть идеи, как это сделать sh? 1009 *

1 Ответ

1 голос
/ 25 февраля 2020

Независимо от того, решает ли перестановка столбцов дисбаланс классов или нет, я бы поменял весь набор данных и произвольно выбрал между исходным и переставленным:

# Step 1: swap the columns
df1 = pd.concat((df.filter(regex='[^(_g1)]$'),
                 df.filter(regex='_g1$')),
                axis=1)

# Step 2: rename the columns
df1.columns = df.columns

# random choice
np.random.seed(1)
is_original = np.random.choice([True,False], size=len(df))

# concat to make new dataset
pd.concat((df[is_original],df1[~is_original]))

Выход:

   y  ch1_g1  ch2_g1  ch3_g1  ch1_g2  ch2_g2  ch3_g2
2  0      14      58       2      71      31      48
3  1      32      28       2      30      92      91
0  0      23       3      74      20      89      62
1  1       2      83       0      51      64      19
4  1      66      15      14      51      36      51

Обратите внимание, что в строке с индексами 1,4 есть g1 своп с g2.

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