如何正确地使用Python scikit-learn进行欠采样?

我试图使用Python的scikit-learn对多数类进行欠采样。目前我的代码会查找少数类的数量N,然后尝试从多数类中欠采样出相同数量的N。结果,测试和训练数据都呈现出1:1的分布。但我真正想要的是仅在训练数据上进行1:1的分布,而在测试数据上使用原始分布进行测试。

我还不太确定如何实现后者,因为中间涉及一些字典向量化,这让我感到困惑。

# Perform undersampling majority groupminorityN = len(df[df.ethnicity_scan == 1]) # get the total count of low-frequency groupminority_indices = df[df.ethnicity_scan == 1].indexminority_sample = df.loc[minority_indices]majority_indices = df[df.ethnicity_scan == 0].indexrandom_indices = np.random.choice(majority_indices, minorityN, replace=False) # use the low-frequency group count to randomly sample from high-frequency groupmajority_sample = data.loc[random_indices]merged_sample = pd.concat([minority_sample, majority_sample], ignore_index=True) # merging all the low-frequency group sample and the new (randomly selected) high-frequency sample togetherdf = merged_sampleprint 'Total N after undersampling:', len(df)# Declaring variablesX = df.raw_f1.valuesX2 = df.f2.valuesX3 = df.f3.valuesX4 = df.f4.valuesy = df.outcome.values# Codes skipped ....def feature_noNeighborLoc(locString):    passmy_dict16 = [{'location': feature_noNeighborLoc(feature_full_name(i))} for i in X4]# Codes skipped ....# Dict vectorizationall_dict = []for i in range(0, len(my_dict)):    temp_dict = dict(        my_dict[i].items() + my_dict2[i].items() + my_dict3[i].items() + my_dict4[i].items()        + my_dict5[i].items() + my_dict6[i].items() + my_dict7[i].items() + my_dict8[i].items()        + my_dict9[i].items() + my_dict10[i].items()        + my_dict11[i].items() + my_dict12[i].items() + my_dict13[i].items() + my_dict14[i].items()        + my_dict19[i].items()        + my_dict16[i].items() # location feature        )all_dict.append(temp_dict)newX = dv.fit_transform(all_dict)X_train, X_test, y_train, y_test = cross_validation.train_test_split(newX, y, test_size=testTrainSplit)# Fitting X and y into model, using training dataclassifierUsed2.fit(X_train, y_train)# Making predictions using trained datay_train_predictions = classifierUsed2.predict(X_train)y_test_predictions = classifierUsed2.predict(X_test)

回答:

您希望对某个类别的训练样本进行欠采样,因为您希望分类器能平等地对待所有标签。

如果您不想进行欠采样,可以将分类器的’class_weight’参数值更改为’balanced’(或某些分类器的’auto’),这将实现您想要的效果。

您可以阅读LogisticRegression分类器的文档作为示例。请注意’class_weight’参数的描述,在这里查看。

将该参数更改为’balanced’后,您就不再需要进行欠采样了。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注