Как рассчитать вес класса Pandas DataFrame для Keras? - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь

print(Y)
print(Y.shape)

class_weights = compute_class_weight('balanced',
                                     np.unique(Y),
                                     Y)
print(class_weights)

Но это дает мне ошибку:

ValueError: classes should include all valid labels that can be in y

Мой Y выглядит так:

       0  1  2  3  4
0      0  0  1  0  0
1      1  0  0  0  0
2      0  0  0  1  0
3      0  0  1  0  0
...
14992     0  0  1  0  0
14993      0  0  1  0  0

И мойY.shape выглядит следующим образом: (14993, 5)

В моей модели keras я хочу использовать class_weights, поскольку это неравномерное распределение:

model.fit(X, Y, epochs=100, shuffle=True, batch_size=1500, class_weights=class_weights, validation_split=0.05, verbose=1, callbacks=[csvLogger])

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Просто преобразуйте кодирование в одно касание в категориальные метки:

from sklearn.utils import class_weight

y = Y.idxmax(axis=1)

class_weights = class_weight.compute_class_weight('balanced',
                                                  np.unique(y),
                                                  y)

# Convert class_weights to a dictionary to pass it to class_weight in model.fit
class_weights = dict(enumerate(class_weights))
0 голосов
/ 26 февраля 2019

Создайте несколько примеров данных, по крайней мере, с одним примером на класс

df = pd.DataFrame({
    '0': [0, 1, 0, 0, 0, 0],
    '1': [0, 0, 0, 0, 1, 0], 
    '2': [1, 0, 0, 1, 0, 0],
    '3': [0, 0, 1, 0, 0, 0],
    '4': [0, 0, 0, 0, 0, 1],
})

Стекируйте столбцы (преобразуйте из широкой таблицы в длинную)

df = df.stack().reset_index()
>>> df.head()

  level_0   level_1     0
0   0       0       0
1   0       1       0
2   0       2       1
3   0       3       0
4   0       4       0

Получите класс для каждой точки данных

Y = df[df[0] == 1]['level_1']
>>> Y
2     2
5     0
13    3
17    2
21    1
29    4

Вес класса вычислений

class_weights = compute_class_weight(
    'balanced', np.unique(Y), Y
)
>>> print(class_weights)
[1.2 1.2 0.6 1.2 1.2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...