wzy-1642 2024-04-11 16:36 采纳率: 16.7%
浏览 3

以随机森林为分类器,探究不同不平衡率的数据运用哪种重采样方式更好

想做以随机森林为分类器,探究不同不平衡率的数据运用哪种重采样方式更好的研究
代码如下:

from warnings import simplefilter
simplefilter(action='ignore', category=FutureWarning)
import pandas as pd
from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn import metrics
from sklearn.metrics import roc_curve, auc, roc_auc_score 
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report


data = pd.read_csv("C:/Users/victiger/Desktop/realp1.csv")
target_column = "target"
X=data.iloc[:,0:8]
 y = data[target_column]
# 拆分数据集为训练集和测试集
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
 print(X_train)
# 创建随机森林分类器
rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)
rf_classifier= rf_classifier.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = rf_classifier.predict(X_test)
print('Classification Report:\n', classification_report(y_test, y_pred))
# 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')
# 计算auc
result = roc_auc_score(y_test, rfc.predict_proba(X_test)[:,1])
print(result)

第一张图是1:1平衡数据的准确性,其auc是0.99。第二张是不平衡率1:100的准确性,auc是0.96。两个数据都还没进行重采样处理。
想关注少数类,是不是应该描述1的预测准确性而不是总的?auc为什么会这么高,是少了什么步骤吗?文章中应该怎么解释呢?

img

img

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-11 16:36
    关注

    引自免费微信小程序:皆我百晓生

    首先,针对您的问题,我们确实需要关注的是少数类(在您的例子中是标签为1的类别),因为不平衡数据的问题主要影响了少数类的识别。在分类报告中,关注recall指标(也称为查准率或真正例率)对于少数类更为重要,因为它衡量了正确预测为正样本的比例。

    关于AUC值为什么较高,可能的原因有:

    1. 数据分布:尽管数据严重不平衡,但随机森林在处理高维数据和特征选择方面通常表现良好,这可能导致即使在少数类上也有较高的预测能力。
    2. 随机性:随机森林的决策树结构和集成方法本身就具有一定的鲁棒性,可能在某些情况下能较好地处理不平衡数据。

    为了更深入地探讨不同重采样策略的效果,我们可以尝试以下几种方法:

    • 过采样:增加少数类样本,例如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和精度的变化,讨论哪种策略对于特定任务(如提高召回率或整体性能)更为合适。
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月11日

悬赏问题

  • ¥20 求下下面这个数据结构代码
  • ¥15 路由器考试怎么办,有懂行的吗 ,eNSP
  • ¥20 前端 二进制文件流图片转化异常
  • ¥15 github上的这个C语言项目如何跑起来
  • ¥15 java 判断某个数 区间是否存在
  • ¥15 appium控制多个雷电模拟器问题
  • ¥15 C# iMobileDevice
  • ¥15 谁会做这个啊#ensp#Boson NetSim
  • ¥15 如何编写针对TPS6503320FRGE型号的电源管理芯片的编程代码?
  • ¥15 设计简单目录管理系统,要满足以下内容