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,所以不应该在问题跟踪程序上报告它。