我正在使用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]
它的工作方式就像魅力一样,但是,在处理most_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数组,并且因为我是整个区域的新手而且我真的非常努力学习..我试图将两个结果数组合在一起,使seven_x + minority_x组合以形成训练数据,我想..我不能给它一些我想要解决的错误,直到现在......但即使我可以......我怎么能保持他们的索引,所以most_y和minority_y也将是真的!
答案 0 :(得分:1)
在处理了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”, if 您希望在一次迭代中多次阻止相同的样本。