如何以简单的方式在Keras中分配class_weight?

时间:2017-06-23 08:02:28

标签: python tensorflow deep-learning keras

有人能告诉我,当数据集不平衡时,在Keras中应用class_weight的最简单方法是什么?

我的目标中只有两个班级。

感谢。

5 个答案:

答案 0 :(得分:9)

class_weight函数的fit()参数是将类映射到权重值的字典。

假设您有500个0级和1500个样本的样本,而不是您在class_weight = {0:3,1:1}中提供的样本。这使得0级的等级是等级1的三倍。

train_generator.classes为您的加权提供了正确的类名。

如果您想以编程方式计算,可以使用scikit-learn sklearn.utils.compute_class_weight()

该函数查看标签的分布并生成权重,以便同等地惩罚训练集中不足或过度表示的类。

另请参阅此有用的帖子:https://github.com/fchollet/keras/issues/1875

此线程也可能有所帮助:Is it possible to automatically infer the class_weight from flow_from_directory in Keras?

答案 1 :(得分:9)

使用sklearn kit中的class_weight。

我也使用这种方法来处理不平衡数据

from sklearn.utils import class_weight
class_weight = class_weight.compute_class_weight('balanced'
                                               ,np.unique(Y_train)
                                               ,Y_train)

然后是model.fit

Classifier.fit(train_X,train_Y,batch_size = 100, epochs = 10
           ,validation_data= (test_X,test_Y),class_weight = class_weight )

答案 2 :(得分:1)

您是否询问在代码中应用正确的权重或如何执行此操作?代码很简单:

class_weights = {}
    for i in range(2):
        class_weights[i] = your_weight

然后在class_weight=class_weights中传递参数model.fit

使用正确的权重是某种反向频率;你也可以做一些试验和错误。

答案 3 :(得分:0)

1-定义带有标签及其相关权重的字典

class_weight = {0: 0.1,
                1: 1.,
                2: 2.}

2-将字典作为参数输入:

model.fit(X_train, Y_train, batch_size = 100, epochs = 10, class_weight=class_weight)

答案 4 :(得分:0)

类权重采用字典类型。

UPDATE Attendance SET ShiftCode=c.ShiftsShiftCode
FROM Attendance a
JOIN
(
    SELECT a.EmpCode, a.ShiftCode, CheckIn, CheckOut, b.ShiftCode AS ShiftsShiftCode FROM Attendance a
    JOIN Shifts b ON a.EmpCode=b.EmpCode
    AND (a.CheckIn BETWEEN StartDate AND EndDate OR a.CheckOut BETWEEN StartDate AND EndDate)
)c
ON a.EmpCode = c.EmpCode
AND (a.checkin=c.checkin OR a.CheckOut=c.CheckOut)