Scikit learn sklearn train_test_split返回测试/训练中的一些元素

Scikit learn sklearn train_test_split返回测试/训练中的一些元素,scikit-learn,train-test-split,Scikit Learn,Train Test Split,我有一个数据集X,有260个独特的观察值 当运行x\u列、x\u测试、\uu、\uu=test\u列分割(x,y,test\u大小=0.2)时,我会假设 [x\u测试中的p表示x\u列中的p]将为空,但它不是空的。事实上,x\u测试中只有两个观察结果不在x\u序列中 这是有意的还是 编辑(发布我正在使用的数据): 从sklearn.datasets导入加载\u乳腺癌 从sklearn.model\u选择导入列车测试\u拆分为拆分 将numpy作为np导入 数据=乳腺癌负荷() X=DATA.DA

我有一个数据集
X
,有260个独特的观察值

当运行
x\u列、x\u测试、\uu、\uu=test\u列分割(x,y,test\u大小=0.2)
时,我会假设
[x\u测试中的p表示x\u列中的p]
将为空,但它不是空的。事实上,
x\u测试中只有两个观察结果不在
x\u序列中

这是有意的还是

编辑(发布我正在使用的数据):

从sklearn.datasets导入加载\u乳腺癌
从sklearn.model\u选择导入列车测试\u拆分为拆分
将numpy作为np导入
数据=乳腺癌负荷()
X=DATA.DATA
y=DATA.target
y=np.array([1如果p==0,则为1;对于DATA.target中的p,则为0])
x_序列,x_测试,y_序列,y_测试=分割(x,y,测试_大小=0.2,分层=y,随机_状态=42)
len([x_测试中的p,如果x_序列中的p])不是0
编辑2.0:显示测试工作正常

a=np.array([[1,2,3],[4,5,6])
b=np.数组([[1,2,3],[11,12,13])
len([p表示a中的p,如果p表示b中的p])#1

您需要使用以下方法进行检查:

from sklearn.datasets import load_breast_cancer 
from sklearn.model_selection import train_test_split as split
import numpy as np

DATA=load_breast_cancer()
X=DATA.data
y= DATA.target
y=np.array([1 if p==0 else 0 for p in DATA.target])

x_train,x_test,y_train,y_test=split(X,y,test_size=0.2,stratify=y,random_state=42)

len([p for p in x_test.tolist() if p in x_train.tolist()])
0
使用
x\u test.tolist()
中的
操作符将按预期工作。


参考资料:

这不是在
sklearn
中执行
train\u test\u split
的错误,而是
中的
操作员在numpy阵列上工作的一个奇怪特性。
中的
运算符首先对两个数组进行元素比较,如果有任何元素匹配,则返回
True

将numpy导入为np
a=np.array([[1,2,3],[4,5,6]]
b=np.数组([[6,7,8],[5,5,5]]
b#中的a是真的
测试这种重叠的正确方法是使用相等运算符和
np.all
np.any
。作为奖励,您还可以免费获得重叠的索引

将numpy导入为np
a=np.array([[1,2,3],[4,5,6]]
b=np.数组([[6,7,8],[5,5,5],[7,8,9])
b#中的a是真的
z=np.any(np.all(a==b[:,None,:],-1))#False
a=np.array([[1,2,3],[4,5,6]]
b=np.数组([[6,7,8],[1,2,3],[7,8,9]]
b#中的a是真的
重叠=np.all(a==b[:,无,:],-1)
z=np.任何(重叠)#正确
指数=np.非零(重叠)#(1,0)

您能发布一个完整的可复制示例吗?列车和测试的交叉点应该是空的。如果我使用的答案是,即
np.其中((x_test==x_train[:,None]),则现在用数据编辑问题。所有(-1))[1]
返回
[]
(交叉点是空的)。但是我确实认为
[p代表x_测试中的p,如果x_训练中的p]
应该做得很清楚
[p代表x_测试中的p,如果x_训练中的p]
不会做这件事,因为它给出的结果与
np不同。其中((x_测试==x_训练[:,无]).all(-1))[code>。至于为什么会这样,请看这里:好的,但是我们同意,如果
x\u测试
x\u列中有一些值,那么
[p对于x\u测试中的p如果x\u列中的p]
将是非空的(逻辑上相反)?我的意思是,我测试两组交集是否为空的方法是正确的,所以如果你使用乳腺癌数据,你会得到相同的行为?我首先认为数据集可能不是唯一的,但是
len(X)=len(np.unique(X))#True
,所以我看不出问题出在哪里?这不是sklearn bug,所以不应该在问题跟踪程序上报告它。