我正在进行一个二分类任务,使用Scikit-learn.. 我有:
类别0: 200个观察值
类别1: 50个观察值。
因为我有一个不平衡的数据.. 我想从多数类别中随机抽取一个子样本,使得观察数量与少数类别相同,并希望使用新获得的数据集作为分类器的输入.. 子采样和分类的过程可以重复多次.. 我有以下代码用于子采样,主要是在Ami Tavory的帮助下。
它的运作非常出色,但是在处理majority_x和majority_y的最后,我希望能够用新的较小集合替换X_train、y_train中代表class0的旧集合,以便将其传递给分类器或管道。
为了解决这个问题,我尝试将两个结果数组majority_x和minority_x合并起来,以形成所需的训练数据。但是,由于这些数组是numpy数组,并且我对整个领域都很新手,我真的很努力学习…我不能成功合并它们,因为出现了一些错误,我正在努力解决…即使我能够合并它们,如何保持它们的索引,以便majority_y和minority_y也是正确的呢!
因为我有一个不平衡的数据.. 我想从多数类别中随机抽取一个子样本,使得观察数量与少数类别相同,并希望使用新获得的数据集作为分类器的输入.. 子采样和分类的过程可以重复多次.. 我有以下代码用于子采样,主要是在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)
为了解决这个问题,我尝试将两个结果数组majority_x和minority_x合并起来,以形成所需的训练数据。但是,由于这些数组是numpy数组,并且我对整个领域都很新手,我真的很努力学习…我不能成功合并它们,因为出现了一些错误,我正在努力解决…即使我能够合并它们,如何保持它们的索引,以便majority_y和minority_y也是正确的呢!
numpy.concatenate((majority_x,minority_x))
。另外,作为补充说明,你可能需要在 random.choice 中添加replace=False
,以防止多次采样相同的样本。 - Robin Spiess