【发布时间】:2016-05-08 11:06:19
【问题描述】:
我正在使用 Scikit-learn 进行二进制分类任务。我有: 0 级:有 200 个观察值 第 1 类:有 50 个观察结果
因为我有一个不平衡的数据.. 我想随机抽取多数类的子样本,其中观察的数量将与少数类相同,并希望使用新获得的数据集作为分类器的输入.. 下采样和分类的过程可以重复多次.. 我有以下子采样代码,主要是在Ami Tavory的帮助下@
docs_train=load_files(rootdir,categories=categories, encoding='latin-1')
X_train = docs_train.data
y_train = docs_train.target
majority_x,majority_y=x[y==0,:],y[y==0] # assuming that class 0 is the majority class
minority_x,minority_y=x[y==1,:],y[y==1]
inds=np.random.choice(range(majority_x.shape[0]),50)
majority_x=majority_x[inds,:]
majority_y=majority_y[inds]
它的工作原理就像一个魅力,但是,在处理 major_x 和 most_y 结束时,我希望能够用新的更小的集合替换代表 X_train、y_train 中的 class0 的旧集合,以便按如下方式传递给分类器或管道:
pipeline = Pipeline([
('vectorizer', CountVectorizer( tokenizer=tokens, binary=True)),
('classifier',SVC(C=1,kernel='linear')) ])
pipeline.fit(X_train, y_train)
我做了什么为了解决这个问题: 因为结果数组是 numpy 数组,并且因为我是整个领域的新手,我真的非常努力学习.. 我试图将两个结果数组组合在一起,majority_x+minority_x 以形成训练数据我想要..我不能给出一些我试图解决的错误直到现在......但即使我可以..我怎样才能保持他们的索引,所以majority_y和minority_y也将是真的!
【问题讨论】:
-
只是为了确保这不是XY problem:您是否真的在寻找类似stratified cross validation in sklearn 的东西?也许您可以简要解释一下为什么(如果有的话)这是一个与一般为不平衡数据构建 CV 管道不同的问题?
-
从您给我的页面上的示例看来,分层函数将始终返回与我的情况不同的训练和测试集......我直到现在只在训练set ... 我想稍后提供测试集,因为它是根据不同的标准进行拆分的,而不是基于随机拆分
-
如果我理解您的问题(如何将新的二次采样集合并在一起),您可能需要查看
numpy.concatenate((majority_x,minority_x))。作为附加评论,您可能希望将replace=False添加到您的 random.choice 中,以防止多次采样相同的样本。
标签: python machine-learning scikit-learn