混淆矩阵:随机播放与非随机播放

时间:2019-01-25 22:41:28

标签: python machine-learning shuffle confusion-matrix

这是我的模型的配置:

"hi I am human being I live  for money".split("  ")
#["hi I am human being I live", "for money"]

一旦我完成了模型训练,我决定比较如果我不随机播放数据集和标签,混淆矩阵的外观。

我改行了

"model": {
        "loss": "categorical_crossentropy",
        "optimizer": "adam",
        "layers": [
            {
                "type": "lstm",
                "neurons": 180,
                "input_timesteps": 15,
                "input_dim": 103,
                "return_seq": true,
                "activation": "relu"
            },
            {
                "type": "dropout",
                "rate": 0.1
            },
            {
                "type": "lstm",
                "neurons": 100,
                "activation": "relu",
                "return_seq": false
            },
            {
                "type": "dropout",
                "rate": 0.1
            },
            {
                "type": "dense",
                "neurons": 30,
                "activation": "relu"
            },
            {
                "type": "dense",
                "neurons": 3,
                "activation": "softmax"
            }
        ]
    }

请注意from sklearn.utils import shuffle X, label = shuffle(X, label, random_state=0) X是两个测试集。因此它与训练集无关。

混洗阶段的混淆矩阵

label

没有混洗阶段的混淆矩阵

Confusion Matrix
[[16062  1676  3594]
 [ 1760  4466  1482]
 [ 3120  1158 13456]]
Classification Report
             precision    recall  f1-score   support

   class -1       0.77      0.75      0.76     21332
    class 0       0.61      0.58      0.60      7708
    class 1       0.73      0.76      0.74     17734

avg / total       0.73      0.73      0.73     46774

正如您在此处看到的那样,两个报告的精度差异很大。有什么可以解释这两个报告之间的差距?

2 个答案:

答案 0 :(得分:0)

对于两个混淆矩阵,您的0类和1类的数量相减一。

您需要确保将数据与类标签匹配没有错误。

答案 1 :(得分:0)

数据改组从不影响性能,它通常会有所帮助,原因是它打破了数据准备过程中可能出现的偏差-例如将所有猫图像首先放置,然后再将猫图像放入猫/狗分类数据集中。

以著名的虹膜数据集为例:

from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
y
# result:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

您可以清楚地看到,数据集的制备方式是前50个样本全部为标签0,后50个标签均为1,最后50个标签2。尝试在这样的数据集中执行5折交叉验证而不进行混洗,您会发现大部分折痕中只包含一个标签;尝试3折CV,所有 您的折页将只包含一个标签。 Bad ...顺便说一句,这不仅是理论上的可能性,而且还有actually happened

由于很难事先知道数据集中可能存在这种偏差,因此为了安全起见,我们总是随机播放(如前所述,它永远不会造成伤害),这就是随机播放的原因是所有机器学习管道中的标准程序。

因此,即使这里的情况显然取决于您的数据详细信息(我们不知道),这种行为也并不令人惊讶-相反,这是完全可以预期的。