scikit-learn中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]: 201In[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]: 60In[151]: len(testImgs)Out[151]: 141In[152]: len(trnTargets)Out[152]: 60In[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中也有实现)。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注