【问题标题】:Subsampling + classifying using scikit-learn使用 scikit-learn 进行二次采样 + 分类
【发布时间】: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


【解决方案1】:

在处理了多数_x 和少数_y 后,您可以将您的训练集与

X_train = np.concatenate((majority_x,minority_x))
y_train = np.concatenate((majority_y,minority_y))

现在 X_train 和 y_train 将首先包含 y=0 的选定样本,然后是 y=1 的样本。

您的相关问题的想法: 通过创建多数样本数量长度的随机置换向量来选择多数样本。 然后选择该向量的前 50 个索引,然后选择下一个 50,依此类推。 当您完成该向量时,每个样本都将被选择一次。 如果你想要更多的迭代或者剩余的置换向量太短,你可以求助于随机选择。

正如我在评论中提到的,您可能还想在 np.random.choice 中添加参数“replace=False”, 如果您想防止在一次迭代中多次使用相同的样本。

【讨论】:

  • 谢谢,.. 我已经完成了您的建议,并且在一个小程序中一切都非常好.. 直到我将它移到我原来的程序.. 看起来原来的 x_train 不是我想的列表列表!它只是一个在每个项目的开头附加“u”的列表!..我正在从文本文件加载我的原始数据,这就是原因!我该如何解决这个问题
  • @user2739381 print(type(x_train)) 的输出是什么?如果它真的只是一个列表,我认为你不能这样做 majority_x = x_train[y==0,:] (顺便说一句,在你的问题中你有 majority_x = x[y==0,:] 是 x 与 x_train 一样吗?)你也可以尝试将列表转换为带有np.array(x_train) 的numpy 数组虽然我不确定会发生什么。
  • 是的,它是一个列表,我将其转换为 numpy 数组,并且我已将多数代码更改为 mosto_x=x[y==0] .. 它起作用了.. 会发生什么错误呢你认为
  • 那么连接现在可以工作了吗?如果是列表,应该可以将它们与majority_x + minority_x 合并。
猜你喜欢
  • 2015-05-26
  • 2018-03-24
  • 2018-01-24
  • 2016-05-16
  • 2014-06-20
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
相关资源
最近更新 更多