- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的数据具有极度的类别不平衡。约99.99%的样本为阴性;积极因素(大致)平均分配给其他三个类别。我认为我正在训练的模型基本上一直在预测多数类(class)。出于这个原因,我正在尝试对类(class)进行加权。
型号
model = Sequential()
#Layer 1
model.add(Conv1D( {{choice([32, 64, 90, 128])}}, {{choice([3, 4, 5, 6, 8])}}, activation='relu', kernel_initializer=kernel_initializer, input_shape=X_train.shape[1:]))
model.add(BatchNormalization())
#Layer 2
model.add(Conv1D({{choice([32, 64, 90, 128])}}, {{choice([3, 4, 5, 6])}}, activation='relu',kernel_initializer=kernel_initializer))
model.add(Dropout({{uniform(0, 0.9)}}))
#Flatten
model.add(Flatten())
#Output
model.add(Dense(4, activation='softmax'))
({{...}}
用于 Hyperas。)
我是如何尝试加权的
\1.在 model.fit()
class_weight
model.fit(X_train, Y_train, batch_size=64, epochs=10, verbose=2, validation_data=(X_test, Y_test), class_weight={0: 9999, 1:9999, 2: 9999, 3:1})
\2。在 model.fit()
中使用 class_weight
与 sklearn
compute_class_weight()
model.fit(..., class_weight=class_weight.compute_class_weight("balanced", np.unique(Y_train), Y_train)
\3.使用自定义损失函数
from keras import backend as K
def custom_loss(weights):
#gist.github.com/wassname/ce364fddfc8a025bfab4348cf5de852d
def loss(Y_true, Y_pred):
Y_pred /= K.sum(Y_pred, axis=-1, keepdims=True)
Y_pred = K.clip(Y_pred, K.epsilon(), 1 - K.epsilon())
loss = Y_true * K.log(Y_pred) * weights
loss = -K.sum(loss, -1)
return loss
return loss
extreme_weights = np.array([9999, 9999, 9999, 1])
model.compile(loss=custom_loss(extreme_weights),
metrics=['accuracy'],
optimizer={{choice(['rmsprop', 'adam', 'sgd','Adagrad','Adadelta'])}}
)
#(then fit *without* class_weight)
结果
可怜。所有类别的准确度为 ~.99
,所有类别的不平衡准确度为 ~.5
。但更有意义的指标,如 auPRC,讲述了一个不同的故事。大多数类别的 auPRC 接近 1
,其余类别接近 0
。
这就是 Keras 平衡类的方式吗?它只是确保它们之间的准确性相同——或者这两个指标是否也应该相等或可比?还是我指定的权重有误?
最佳答案
Keras 在训练期间使用类权重,但准确性并未反射(reflect)这一点。准确性是在所有样本中计算的,与类之间的权重无关。这是因为您在 compile() 中使用了指标“准确度”。您可以定义自定义和更准确的加权精度并使用它或使用 sklearn 指标(例如 f1_score() 可以是“二进制”、“加权”等)。
例子:
def macro_f1(y_true, y_pred):
return f1_score(y_true, y_pred, average='macro')
model.compile(loss=custom_loss(extreme_weights),
metrics=['accuracy', macro_f1],
optimizer={{choice(['rmsprop', 'adam', 'sgd','Adagrad','Adadelta'])}}
)
关于python - Keras:class_weight 实际上试图平衡什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51432992/
documentation中的措辞看起来 None 和“balanced_subsample”是等价的,但我想确保情况确实如此。 最佳答案 文档清楚地表明它们不等效: class_weight=Non
ValueError: class_weight must contain all classes in the data. The classes {1, 2, 3} exist in the da
我正在使用两个不同的分类器对相同的不平衡数据执行一些(二进制)文本分类。我想比较两个分类器的结果。 使用 sklearns 逻辑回归时,我可以选择设置 class_weight = 'balanced
我目前正在研究一个随机森林分类模型,其中包含 24,000 个样本,其中 20,000 个样本属于 class 0其中 4,000 个属于 class 1 。我做了一个train_test_split
我有一个不平衡的数据集,其中 200000 个描述属于 0 类,大约 10000 个描述属于 1 类。但是,在我的训练数据集中,我有相同数量的“正”和“负”样本,每个样本大约 8000 个。所以现在我
在使用 class_weight 解决我的多标签问题时遇到问题。也就是说,每个标签不是0就是1,但是每个输入样本有很多标签。 代码(带有用于 MWE 目的的随机数据): import tensorfl
我正在将 ScikitLearn 的随机森林应用于极度不平衡的数据集(比率为 1:10 000)。我可以使用 class_weigth='balanced' 参数。我看过它相当于欠采样。 但是,这种方
我想在 Keras 训练期间更改我的 class_weight。 我使用了 fit_generator 和 Callback 方法,如下所示。 model.fit_generator(
我的数据具有极度的类别不平衡。约99.99%的样本为阴性;积极因素(大致)平均分配给其他三个类别。我认为我正在训练的模型基本上一直在预测多数类(class)。出于这个原因,我正在尝试对类(class)
尝试让 class_weight 开始。我知道其余代码有效,只是 class_weight 给我错误: parameters_to_tune = ['min_samples_split':[2
我目前正在尝试改变随机森林分类器的阈值以绘制 ROC 曲线。我的印象是,对随机森林执行此操作的唯一方法是使用 class_weight 参数。我已经能够成功地做到这一点,提高和降低精确度、召回率、真阳
Keras 使用 class_weight 参数来处理不平衡的数据集。 这是我们可以在 doc 中找到的内容: Optional dictionary mapping class indices (i
尝试对大约 2500*~4000 个大型特征进行分类,并在训练数据中附上置信文档。 我尝试使用置信度值作为分类器的 class_weight 参数,但无法理解 class_weight 所需的字典格式
我有一个多标签数据(有些类有 2 个标签,有些类有 10 个标签),并且我的模型对于平衡值和无值过度拟合。为 class_weight 参数设置的最佳值是多少。 from sklearn.svm im
我对 sklearn 如何应用我们提供的类权重感兴趣。 documentation没有明确说明类权重的应用位置和方式。阅读源代码也没有帮助(似乎 sklearn.svm.liblinear 用于优化,
我的数据集已经有加权示例。在这个二元分类中,与第二类相比,我也有更多的第一类。 我可以同时使用 sample_weight 并在 model.fit() 函数中使用 class_weight 进一步重
谁能告诉我当数据集不平衡时在 Keras 中应用 class_weight 的最简单方法是什么? 我的目标中只有两个类。 谢谢。 最佳答案 fit() 函数的class_weight 参数是一个将类别
我想在 keras model.fit 中使用 class_weight 参数来处理不平衡的训练数据。通过查看一些文档,我了解到我们可以像这样传递一个字典: class_weight = {0 : 1
此问题已在其他论坛中提出,我尝试了他们的变体但无济于事:class_weight for imbalanced data - Keras how to set class-weights for im
在 TensorFlow 中,当在 fit_generator 中使用 class_weights 时,会导致训练过程不断消耗越来越多的 CPU RAM,直到耗尽。每个纪元后内存使用量都会逐步增加。请
我是一名优秀的程序员,十分优秀!