Machine learning keras和scikit learn在精度计算上的差异

Machine learning keras和scikit learn在精度计算上的差异,machine-learning,keras,scikit-learn,cnn,multilabel-classification,Machine Learning,Keras,Scikit Learn,Cnn,Multilabel Classification,我目前正在keras使用CNN进行多标签图像分类。 除了keras的准确性外,我们还使用各种评估方法(回忆、准确度、F1分数和准确度)再次确认了scikit学习的准确性 我们发现keras计算的准确率约为90%,而scikit learn仅为60% 我不知道为什么会这样,所以请让我知道 keras的计算有问题吗 我们使用sigmoid作为激活函数,二进制交叉熵作为损失函数,adam作为优化器 凯拉斯训练 input_tensor = Input(shape=(img_width, img_he

我目前正在keras使用CNN进行多标签图像分类。 除了keras的准确性外,我们还使用各种评估方法(回忆、准确度、F1分数和准确度)再次确认了scikit学习的准确性

我们发现keras计算的准确率约为90%,而scikit learn仅为60%

我不知道为什么会这样,所以请让我知道

keras的计算有问题吗

我们使用sigmoid作为激活函数,
二进制交叉熵
作为损失函数,adam作为优化器


凯拉斯训练

input_tensor = Input(shape=(img_width, img_height, 3))

base_model = MobileNetV2(include_top=False, weights='imagenet')

#model.summary()

x = base_model.output
x = GlobalAveragePooling2D()(x)
#x = Dense(2048, activation='relu')(x)
#x = Dropout(0.5)(x)
x = Dense(1024, activation = 'relu')(x)

x = Dropout(0.5)(x)
predictions = Dense(6, activation = 'sigmoid')(x)

for layer in base_model.layers:
    layer.trainable = False


model = Model(inputs = base_model.input, outputs = predictions)
print("{}層".format(len(model.layers)))


model.compile(optimizer=sgd, loss="binary_crossentropy", metrics=["acc"])

history = model.fit(X_train, y_train, epochs=50, validation_data=(X_val, y_val), batch_size=64, verbose=2)

model_evaluate()
Keras显示90%的准确率


scikit学习检查

 from sklearn.metrics import precision_score, recall_score, f1_score, accuracy_score
thresholds=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9]

y_pred = model.predict(X_test)

for val in thresholds:
    print("For threshold: ", val)
    pred=y_pred.copy()
  
    pred[pred>=val]=1
    pred[pred<val]=0
    
    accuracy = accuracy_score(y_test, pred)
    precision = precision_score(y_test, pred, average='micro')
    recall = recall_score(y_test, pred, average='micro')
    f1 = f1_score(y_test, pred, average='micro')
   
    print("Micro-average quality numbers")
    print("Acc: {:.4f}, Precision: {:.4f}, Recall: {:.4f}, F1-measure: {:.4f}".format(accuracy, precision, recall, f1))

在多标签分类的情况下,可能有两种类型的正确答案

  • 如果预测的所有子标签都正确。示例:在演示数据集中,有5个输出。在
    y_pred
    中,其中3个是完全正确的。 在这种情况下,精度应为
    60%

  • >P。如果我们考虑多标签分类的子标签,则精度会发生变化。示例:演示数据集
    y_true
    总共包含15个预测
    y_pred
    正确预测了其中的10个。在这种情况下,精度应为
    66.7%

    SkLearn处理第1点中所述的多标签分类。鉴于 Keras精度指标遵循第2点中规定的方法。下面给出了一个代码示例

    代码:

    产出:

    Keras Accuracy acc: 66.7
    Keras BinaryAccuracy acc: 66.7
    SkLearn acc: 60.0
    

    因此,您必须选择任何选项。如果选择使用方法1,则必须手动实现精度度量。然而,多标签训练通常使用
    sigmoid
    binary\u交叉熵
    loss来完成。基于方法2,
    二进制交叉熵
    使损失最小化。因此,您也应该遵循它。

    请添加一段代码,以复制您的结果。感谢您提供非常清晰的解释!!这个答案对我的理解很有帮助:)
    import tensorflow as tf
    from sklearn.metrics import accuracy_score
    import numpy as np
    
    # A demo dataset 
    y_true = np.array([[0, 1, 0], [1, 0, 0], [1, 1, 1], [0, 0, 0], [1, 0, 1]])
    y_pred = np.array([[1, 0, 0], [1, 0, 0], [0, 0, 0], [0, 0, 0], [1, 0, 1]])
    
    kacc = tf.keras.metrics.Accuracy()
    _ = kacc.update_state(y_true, y_pred)
    print(f'Keras Accuracy acc: {kacc.result().numpy()*100:.3}')
    
    kbacc = tf.keras.metrics.BinaryAccuracy()
    _ = kbacc.update_state(y_true, y_pred)
    print(f'Keras BinaryAccuracy acc: {kbacc.result().numpy()*100:.3}')
    
    print(f'SkLearn acc: {accuracy_score(y_true, y_pred)*100:.3}')
    
    Keras Accuracy acc: 66.7
    Keras BinaryAccuracy acc: 66.7
    SkLearn acc: 60.0