Python Keras:一个热编码的类权重(类权重)

Python Keras:一个热编码的类权重(类权重),python,keras,Python,Keras,我想在keras model.fit中使用class_weight参数来处理不平衡的训练数据。通过查看一些文档,我了解到我们可以通过这样的词典: class_weight = {0 : 1, 1: 1, 2: 5} (在本例中,2类将在损失函数中获得更高的惩罚。) 问题是我的网络输出有一个热编码,即class-0=(1,0,0),class-1=(0,1,0),class-3=(0,0,1) 我们如何为一个热编码输出使用类_权重 通过查看,它看起来像是\u feed\u out

我想在keras model.fit中使用class_weight参数来处理不平衡的训练数据。通过查看一些文档,我了解到我们可以通过这样的词典:

class_weight = {0 : 1,
    1: 1,
    2: 5}
(在本例中,2类将在损失函数中获得更高的惩罚。)

问题是我的网络输出有一个热编码,即class-0=(1,0,0),class-1=(0,1,0),class-3=(0,0,1)

我们如何为一个热编码输出使用类_权重

通过查看,它看起来像是
\u feed\u output\u names
包含一个输出类列表,但在我的例子中,
model.output\u names
/
model.\u feed\u output\u names
返回
['densite\u 1']


相关:

我想我们可以用
样本权重来代替。实际上,在KERA内部,
类权重
被转换为
样本权重

示例_权重:与x长度相同的可选数组,包含 应用于每个样本的模型损失的权重。就 时间数据,可以传递带有形状的二维数组(采样, sequence_length),将不同的权重应用于 每个样品。在这种情况下,您应该确保指定 compile()中的sample\u weight\u mode=“temporal”


这是一个有点复杂的答案,但这是迄今为止我找到的最好的答案。这假设您的数据是一个热编码的多类数据,并且仅对标签数据帧进行处理

import pandas as pd
import numpy as np

# Create a pd.series that represents the categorical class of each one-hot encoded row
y_classes = df_y.idxmax(1, skipna=False)

from sklearn.preprocessing import LabelEncoder

# Instantiate the label encoder
le = LabelEncoder()

# Fit the label encoder to our label series
le.fit(list(y_classes))

# Create integer based labels Series
y_integers = le.transform(list(y_classes))

# Create dict of labels : integer representation
labels_and_integers = dict(zip(y_classes, y_integers))

from sklearn.utils.class_weight import compute_class_weight, compute_sample_weight

class_weights = compute_class_weight('balanced', np.unique(y_integers), y_integers)
sample_weights = compute_sample_weight('balanced', y_integers)

class_weights_dict = dict(zip(le.transform(list(le.classes_)), class_weights))

这将导致计算出一个
sample\u weights
向量,以平衡可传递给Keras
sample\u weights
属性的不平衡数据集,以及一个
class\u weights\u dict
向量,该向量可馈送到
fit
方法中的Keras
class\u weights
属性。你并不是真的想两者都用,只要选一个就行了。我现在正在使用
class\u weight
,因为使用
fit\u generator
获取
sample\u weight
非常复杂

在标准化重量中,keras:

if y.shape[1] > 1:
    y_classes = y.argmax(axis=1)
因此,基本上,如果您选择使用一种热编码,那么这些类就是列索引

您可能还会问自己如何将列索引映射到数据的原始类。 好的,如果您使用scikit learn的LabelEncoder类执行一个热编码,那么列索引映射由
.fit
函数计算的
唯一标签的顺序。
医生说

提取唯一标签的有序数组

例如:

from sklearn.preprocessing import LabelBinarizer
y=[4,1,2,8]
l=LabelBinarizer()
y_transformed=l.fit_transorm(y)
y_transormed
> array([[0, 0, 1, 0],
   [1, 0, 0, 0],
   [0, 1, 0, 0],
   [0, 0, 0, 1]])
l.classes_
> array([1, 2, 4, 8])

总之,
class\u weights
字典的键应该反映编码器的
class\u
属性中的顺序

这里有一个更短更快的解决方案。如果一个热编码y是np.array:

import numpy as np
from sklearn.utils.class_weight import compute_class_weight

y_integers = np.argmax(y, axis=1)
class_weights = compute_class_weight('balanced', np.unique(y_integers), y_integers)
d_class_weights = dict(enumerate(class_weights))

d\u class\u权重
然后可以传递到
中的
class\u权重
。fit

sample\u weight\u mode=“temporal”如何帮助多个class\u热编码目标?您是否知道如何处理每个样本可以接受多个类的情况?THX在
model.fit()
函数中,传递
类权重
就像传递numpy数组一样,而不将其转换为字典。@tsveti_iko发送类权重对于一个热编码的
elif isinstance(类权重,dict)不起作用:。。。否则:返回np.one((y.shape[0],),dtype=K.floatx())
您必须为它提供样本权重,例如
class\u weight.compute\u sample\u weight('balanced',y train)
使用sklearnFor me传递
class\u weight
就像一个numpy数组一样,而不将其转换为
model.fit()
函数中使用的字典。