如何在 Keras 中使用 fit_generator() 平衡数据集?

Eda*_*diz 5 python machine-learning generator deep-learning keras

我正在尝试使用 keras 来拟合 CNN 模型来对 2 类数据进行分类。我有不平衡的数据集我想平衡数据。我不知道我可以在model.fit_generator. 我想知道我是否使用class_weight="balanced"model.fit_generator

主要代码

def generate_arrays_for_training(indexPat, paths, start=0, end=100):      
    while True:
        from_=int(len(paths)/100*start)
        to_=int(len(paths)/100*end)
        for i in range(from_, int(to_)):
            f=paths[i]
            x = np.load(PathSpectogramFolder+f) 
            x = np.expand_dims(x, axis=0) 
            
            if('P' in f):
                y = np.repeat([[0,1]],x.shape[0], axis=0)
            else:
                y =np.repeat([[1,0]],x.shape[0], axis=0)
            yield(x,y)   
history=model.fit_generator(generate_arrays_for_training(indexPat, filesPath, end=75), 
                                validation_data=generate_arrays_for_training(indexPat, filesPath, start=75),
                                steps_per_epoch=int((len(filesPath)-int(len(filesPath)/100*25))), 
                                validation_steps=int((len(filesPath)-int(len(filesPath)/100*75))),
                                verbose=2,
                                epochs=15, max_queue_size=2, shuffle=True, callbacks=[callback])

Run Code Online (Sandbox Code Playgroud)

小智 1

如果您不想更改数据创建过程,可以class_weight在拟合生成器中使用。您可以使用字典来设置您的 class_weight 并进行微调观察。例如,当不使用 class_weight 时,您有 50 个 class0 示例和 100 个 class1 示例。然后,损失函数统一计算损失。这意味着class1将会出现问题。但是,当你设置:

class_weight = {0:2 , 1:1}
Run Code Online (Sandbox Code Playgroud)

这意味着损失函数现在将为您的 0 类赋予 2 倍的权重。因此,对代表性不足的数据进行错误分类将受到比以前多两倍的惩罚。因此,模型可以处理不平衡的数据。

如果您使用class_weight='balanced'模型可以自动进行该设置。但我的建议是,创建一个类似的字典class_weight = {0:a1 , 1:a2},并为 a1 和 a2 尝试不同的值,这样你就可以理解差异。

此外,您可以对不平衡数据使用欠采样方法,而不是使用 class_weight。检查用于此目的的引导方法。