随机森林的精度非常高,有可能吗?

数据挖掘 机器学习 Python 分类 随机森林
2022-03-10 03:00:45

我需要你的帮助来找出我的模型中的缺陷,因为它的准确度(95%)是不现实的。

我正在使用 Randomforest 解决分类问题,大约有 2500 个正例和 15000 个负例,75 个自变量。这是我的代码的核心:

# Splitting the dataset into the Training set and Test set
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)

# Fitting Random Forest Classification to the Training set
from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(n_estimators = 900, criterion = 'gini', random_state = 0)
classifier.fit(X_train, y_train)

# Predicting Test set results
y_pred = classifier.predict(X_test)

# Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)

我通过网格搜索优化了超参数并执行了 k 折交叉验证,报告的准确度平均值为 0.9444。混淆矩阵:

[[3390,   85],
 [ 101,  516]]

显示 97.6% 的准确率。

我错过了什么?

注:该数据库由 2500 家意大利黑手党公司的财务报告和从同一地区随机抽样的 15000 家合法公司作为负面案例组成。

谢谢你们!

编辑:我上传了指标和厘米。该模型实际上表现良好,但查看指标和 cm,它显示了有关 logloss 和召回的更现实的值,所以我认为它很好。 在此处输入图像描述 在此处输入图像描述

4个回答

为了了解模型是否表现良好,首先要执行以下操作:

  1. 绘制类的分布,以了解是否需要抽样机制。

  2. 如果类分布不均匀,将在测试训练拆分期间进行分层抽样。

  3. 预测后,将绘制 matplotlib 或 seaborn 等库支持的混淆矩阵

  4. 根据类别分布,了解需要什么样的指标、精度、召回率和 f1 分数的微观平均/加权/宏观平均也很重要。

这应该可以帮助您评估您的模型是否真正在学习特征,或者其中一个类是否不平衡导致结果出现这种峰值。

我总结了以下几种方法,这些方法可以帮助您以尽可能少的偏差训练和验证您的模型:

  1. 通常评估分类性能的一个好方法是与一些非常基本的模型进行比较。如果您的验证指标比(或接近)这些指标差,那么很明显模型需要改进。例如,在您的情况下,您可以比较:

    • 随机模型(每个观察以概率 1/2 随机分类到每个类别)
    • 总是预测负类的模型
  2. 另一种确保您获得的高验证数不会因训练集和测试集的分离方式而产生偏差的方法是使用交叉验证。在交叉验证中,数据通过迭代过程在训练和测试集中多次拆分,最终验证指标计算为迭代的平均值。是一个如何使用 scikit-learn 在 python 中执行交叉验证的示例。

  3. 除了准确性之外,我还会尝试计算和比较其他验证指标,以便更全面地了解模型的性能(例如精度、召回或更简洁的 F 分数)。当大多数观察属于一个类别时,准确性不是推荐的指标。您可以在此处此处阅读有关性能指标的更多信息Scikit-learn 可以自动计算其中的一些(参见此处),但您可以使用混淆矩阵计算任何一个。

  4. SMOTE 是一个广泛用于像您这样的不平衡数据集的库 - 它应用重采样来创建新的平衡数据集。你可以在这里阅读更多

随机森林是使用决策树构建的,决策树对类的分布很敏感。除了分层方法,您可以使用过采样、欠采样或对频率较低的类使用更大的权重来减轻这种影响。您可以研究的详细回复在Cross Validated中。

您可能需要考虑其他指标来衡量您的分类模型,而不是准确性,因为您的数据确实不平衡。

随机森林通常开箱即用。在您的情况下,看起来数据不平衡,因此导致了这种错误的高精度。如何平衡数据?您可以选择多种技术,但最简单的是“上采样”或“下采样””

示例代码:

from sklearn.utils import resample

minority_df = df[df.Col1 == 'value of Italian mafia firm']
majority_df = df[df.Col1 == 'value of lawful firm']

- 这会将您的少数类上采样到 15k,您可以使用多数类进行下采样,但您已经拥有较少的数据,所以我不建议这样做。

minority_df = resample(minority_df, replace=True, n_samples=15000, random_state=123)

-- 合并并创建新的平衡数据集。

df_balanced = pd.concat([majority_df, minority_df])

使用这个新的平衡数据集进行模型训练,让代码中的所有内容看起来都是标准的。让我知道我是否可以提供更多帮助。干杯!