【发布时间】:2017-11-26 17:19:33
【问题描述】:
当数据集不平衡时,谁能告诉我在 Keras 中应用 class_weight 的最简单方法是什么?
我的目标中只有两个类。
谢谢。
【问题讨论】:
标签: python tensorflow deep-learning keras
当数据集不平衡时,谁能告诉我在 Keras 中应用 class_weight 的最简单方法是什么?
我的目标中只有两个类。
谢谢。
【问题讨论】:
标签: python tensorflow deep-learning keras
类权重采用字典类型。
from collections import Counter
itemCt = Counter(trainGen.classes)
maxCt = float(max(itemCt.values()))
cw = {clsID : maxCt/numImg for clsID, numImg in itemCt.items()}
【讨论】:
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)
【讨论】:
fit() 函数的class_weight 参数是将类映射到权重值的字典。
假设您有 500 个 0 类样本和 1500 个 1 类样本,而不是您输入的 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?
【讨论】:
使用 sklearn 工具包中的 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 )
【讨论】:
您是在询问要应用的正确权重还是如何在代码中执行此操作?代码很简单:
class_weights = {}
for i in range(2):
class_weights[i] = your_weight
然后你在model.fit 中传递参数class_weight=class_weights。
使用的正确权重是某种逆频率;你也可以做一些试验和错误。
【讨论】: