基于卫星数据集的Isolation Forest模型ROC曲线不平滑的原因与修复方案
Isolation Forest异常检测ROC曲线不平滑的原因及修复方案
常见原因
- 误用离散标签计算ROC:直接用
IsolationForest.predict()输出的-1/1离散标签计算ROC,会导致曲线只有少数离散点,呈现锯齿状。 - 异常样本量不足:卫星数据集本身异常比例较低,若设置的污染率对应的异常样本太少,
roc_curve生成的阈值点稀疏,曲线自然不平滑。 - 得分转换不合理:
IsolationForest.score_samples()返回的是样本“正常度”得分(值越大越正常),直接用该值计算ROC会导致得分分布区分度不足,阈值点分布不均。 - 未做插值处理:
roc_curve返回的是离散的FPR、TPR点,直接连线时样本量少就会出现不平滑的折线。
修复方法
1. 使用连续异常得分计算ROC
替换predict()为score_samples(),并将得分转换为“异常度”(值越大代表越异常):
from sklearn.ensemble import IsolationForest from sklearn.metrics import roc_curve, auc import matplotlib.pyplot as plt # 初始化模型,contamination贴近数据集真实异常比例 model = IsolationForest(contamination=0.05) model.fit(X_train) # 转换为异常度得分:取score_samples的负值 y_score = -model.score_samples(X_test) # 计算ROC离散点 fpr, tpr, thresholds = roc_curve(y_test, y_score) roc_auc = auc(fpr, tpr)
2. 插值平滑ROC曲线
用插值生成更多连续的FPR、TPR点,让曲线更平滑:
from scipy.interpolate import interp1d import numpy as np # 生成1000个均匀分布的FPR点 fpr_interp = np.linspace(0, 1, 1000) # 对TPR做线性插值 tpr_interp = interp1d(fpr, tpr, kind='linear', fill_value="extrapolate")(fpr_interp) roc_auc_interp = auc(fpr_interp, tpr_interp) # 绘制平滑曲线 plt.figure(figsize=(8,6)) plt.plot(fpr_interp, tpr_interp, label=f'Smoothed ROC (AUC = {roc_auc_interp:.2f})') plt.plot([0,1], [0,1], 'k--', label='Random Guess') plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.legend(loc='lower right') plt.show()
3. 校准模型得分(可选)
用概率校准优化得分连续性,提升曲线平滑度:
from sklearn.calibration import CalibratedClassifierCV # 对Isolation Forest做概率校准 calibrated_model = CalibratedClassifierCV(model, method='sigmoid', cv='prefit') calibrated_model.fit(X_train, y_train) # 获取校准后的异常概率 y_proba = calibrated_model.predict_proba(X_test)[:, 1] # 用校准概率计算ROC fpr, tpr, thresholds = roc_curve(y_test, y_proba)
4. 调整污染率参数
确保contamination参数尽可能贴近数据集真实异常比例,提升模型得分的区分度,让ROC曲线点分布更合理。
内容的提问来源于stack exchange,提问作者ابوبكر مستور
相关产品推荐
相关产品推荐

