scikit学习中train_test_split()的不稳定行为



Python 3.5(anaconda安装)SciKit 0.17.1

我只是不明白为什么train_test_split()一直在给我我认为不可靠的训练案例列表拆分。

下面是一个例子。我的列表trnImgPaths有3个类,每个类有67个图像(总共201个图像):

['/Caltech101/ferry/image_0001.jpg',
   ... thru ...
 '/Caltech101/ferry/image_0067.jpg',
 '/Caltech101/laptop/image_0001.jpg',
   ... thru ...
 '/Caltech101/laptop/image_0067.jpg',
 '/Caltech101/airplane/image_0001.jpg',
   ... thru ...
 '/Caltech101/airplane/image_0067.jpg']

我的目标列表trnImgTargets在长度上和类本身都与trnImgPaths完全匹配。

In[148]: len(trnImgPaths)
Out[148]: 201
In[149]: len(trnImgTargets)
Out[149]: 201

如果我运行:

[trnImgs, testImgs, trnTargets, testTargets] = 
    train_test_split(trnImgPaths, trnImgTargets, test_size=141, train_size=60, random_state=42)

[trnImgs, testImgs, trnTargets, testTargets] = 
    train_test_split(trnImgPaths, trnImgTargets, test_size=0.7, train_size=0.3, random_state=42)

[trnImgs, testImgs, trnTargets, testTargets] = 
    train_test_split(trnImgPaths, trnImgTargets, test_size=0.7, train_size=0.3)

虽然我最终得到:

In[150]: len(trnImgs)
Out[150]: 60
In[151]: len(testImgs)
Out[151]: 141
In[152]: len(trnTargets)
Out[152]: 60
In[153]: len(testTargets)
Out[153]: 141

我从来没有得到一个完美的20-20-20的训练设置。我可以判断,因为无论是通过手动检查还是通过混淆矩阵进行健全性检查。以下分别是上述每个实验的结果:

[[19  0  0]
 [ 0 21  0]
 [ 0  0 20]]
[[19  0  0]
 [ 0 21  0]
 [ 0  0 20]]
[[16  0  0]
 [ 0 22  0]
 [ 0  0 22]]

我原以为双方会完全平衡。有什么想法为什么会发生这种事吗?

它甚至看起来可能先验地对一些情况进行了错误分类,因为对于给定的类,永远不会有n=22个训练情况。

简而言之:这是预期的行为。

随机拆分不能保证"平衡"拆分。这就是分层拆分的目的(也在sklearn中实现)。

根据@lejlot的评论,我设法锁定病例数的方法是在SKLearn 0.17上使用train_test_split的新功能。现在有一个名为分层的参数,我使用它如下(这将迫使拆分遵循标签列表中的标签数量):

[trnImgs, testImgs, trnTargets, testTargets] = 
    train_test_split(trnImgPaths, trnImgTargets, test_size=0.7,
                     train_size=0.3, stratify=trnImgTargets)

现在,每次我运行脚本时,我都会得到:

[[20  0  0]
 [ 0 20  0]
 [ 0  0 20]]

相关内容

  • 没有找到相关文章

最新更新