引自免费微信小程序:皆我百晓生
首先,针对您的问题,我们确实需要关注的是少数类(在您的例子中是标签为1的类别),因为不平衡数据的问题主要影响了少数类的识别。在分类报告中,关注recall
指标(也称为查准率或真正例率)对于少数类更为重要,因为它衡量了正确预测为正样本的比例。
关于AUC值为什么较高,可能的原因有:
- 数据分布:尽管数据严重不平衡,但随机森林在处理高维数据和特征选择方面通常表现良好,这可能导致即使在少数类上也有较高的预测能力。
- 随机性:随机森林的决策树结构和集成方法本身就具有一定的鲁棒性,可能在某些情况下能较好地处理不平衡数据。
为了更深入地探讨不同重采样策略的效果,我们可以尝试以下几种方法:
- 过采样:增加少数类样本,例如SMOTE(Synthetic Minority Over-sampling Technique)。
- 欠采样:减少多数类样本,例如RandomUnderSampler。
- SMOTE+ Tomek Links:结合过采样和欠采样,同时减少噪声点。
- Class Weighting:在随机森林的fit函数中设置
class_weight='balanced'
,让算法自动调整对每类样本的权重。
下面是一个完整的代码示例,用于比较这些重采样策略:
from imblearn.over_sampling import SMOTE, RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler
from imblearn.combine import SMOTETomek
from sklearn.utils import class_weight
# 1. 过采样
smote = SMOTE(random_state=42)
X_smote, y_smote = smote.fit_resample(X_train, y_train)
# 2. 欠采样
rus = RandomUnderSampler(random_state=42)
X_rus, y_rus = rus.fit_resample(X_train, y_train)
# 3. SMOTE+Tomek Links
smotetk = SMOTETomek(random_state=42)
X_smotetk, y_smotetk = smotetk.fit_resample(X_train, y_train)
# 4. Class Weighting (默认不使用重采样)
class_weights = class_weight.compute_class_weight('balanced', np.unique(y_train), y_train)
rf_classifier_balanced = RandomForestClassifier(n_estimators=100, random_state=42, class_weight=class_weights)
rf_classifier_balanced.fit(X_train, y_train)
# 对每个策略分别进行评估
results = {
'Original': {'accuracy': accuracy_score(y_test, rf_classifier.predict(X_test)),
'roc_auc': roc_auc_score(y_test, rf_classifier.predict_proba(X_test)[:, 1])},
'SMOTE': {'accuracy': accuracy_score(y_test, rf_classifier_smote.predict(X_test)),
'roc_auc': roc_auc_score(y_test, rf_classifier_smote.predict_proba(X_test)[:, 1])},
'Random Under-Sampling': {'accuracy': accuracy_score(y_test, rf_classifier_rus.predict(X_test)),
'roc_auc': roc_auc_score(y_test, rf_classifier_rus.predict_proba(X_test)[:, 1])},
'SMOTE+Tomek': {'accuracy': accuracy_score(y_test, rf_classifier_smotetk.predict(X_test)),
'roc_auc': roc_auc_score(y_test, rf_classifier_smotetk.predict_proba(X_test)[:, 1])},
'Class Weighting': {'accuracy': accuracy_score(y_test, rf_classifier_balanced.predict(X_test)),
'roc_auc': roc_auc_score(y_test, rf_classifier_balanced.predict_proba(X_test)[:, 1])}
}
# 生成表格和图形展示结果
df_results = pd.DataFrame(results, index=['Accuracy', 'ROC AUC'])
df_results.index.name = 'Sampling Strategy'
sns.set(style="whitegrid")
ax = df_results.plot(kind='bar', figsize=(10, 6), title='Comparison of Different Sampling Strategies')
ax.set_ylabel('Score')
plt.show()
这个代码将分别计算原始数据、SMOTE、随机欠采样、SMOTE+Tomek和加权类别的准确性和AUC,并将结果可视化。您可以根据这些结果选择最适合您数据的重采样策略。
在文章中,您可以这样解释:
- 原始数据:展示了数据不平衡时的模型性能,强调了少数类识别的挑战。
- 重采样策略:对比了不同的处理方法,说明过采样(如SMOTE)有助于提高少数类的识别,而欠采样(如RandomUnderSampler)可能会损失信息。
- Class Weighting:虽然没有直接重采样,但通过调整权重可以平衡不同类别的影响,效果可能介于两者之间。
- 选择策略:根据AUC和精度的变化,讨论哪种策略对于特定任务(如提高召回率或整体性能)更为合适。