如何为 Keras 计算 Pandas DataFrame 的类权重?

Posted

技术标签:

【中文标题】如何为 Keras 计算 Pandas DataFrame 的类权重?【英文标题】:How to calculate class weights of a Pandas DataFrame for Keras? 【发布时间】:2019-07-17 10:22:30 【问题描述】:

我在努力

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])

【问题讨论】:

我不明白你这里所说的类 wieghts 是什么意思? @MohitMotwani 我更新了问题来解释 你可以参考这个问题***.com/questions/43481490/… @giser_yugang 对我的pandas 问题没有帮助 【参考方案1】:

创建一些示例数据,每个类至少有一个示例

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]

【讨论】:

【参考方案2】:

只需将 one-hot 编码转换为分类标签:

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))

【讨论】:

以上是关于如何为 Keras 计算 Pandas DataFrame 的类权重?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Keras 打开一个大的 parquet 文件?

如何为LSTM Keras中的多步和多变量准备时间序列数据

如何为 size() 列分配名称?

如何为层中的每个节点为 Keras relu 函数分配自定义 alpha?

如何为 keras 模型使用 tensorflow 自定义损失?

如何为 keras 使用自定义损失函数