scikitlearn中train_test_split()的异常行为

2024-09-27 21:35:07 发布

您现在位置:Python中文网/ 问答频道 /正文

Python3.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完全匹配。在

^{pr2}$

如果我跑:

[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个培训案例。在


Tags: intestimagesizelentrainjpgsplit
2条回答

根据@lejlot的注释,我锁定案例数量的方法是在sklearn0.17上使用^{}的新特性。现在有一个名为分层的参数,我使用如下方式(这将强制拆分遵循标签列表中标签的数量):

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

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

^{pr2}$

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

随机拆分不能保证“平衡”拆分。这就是分层分裂的目的(也是implemented in sklearn)。在

相关问题 更多 >

    热门问题