我正在使用 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]
它就像一个魅力,但是,在处理 majority_x 和 majority_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 也为真!
最佳答案
在处理 majority_x 和 minority_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”, 如果您想防止在一次迭代中多次使用相同的样本。
关于python - 使用 scikit-learn 进行子采样 + 分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35106112/