Python中SVM分类器ROC曲线因阈值问题不光滑的排查咨询
ROC曲线不光滑的排查方向
针对你遇到的ROC曲线不光滑问题,按以下几点逐一排查:
确认是否用对了预测值类型
ROC曲线需要基于分类器输出的预测概率(比如正类的概率),如果误把predict()输出的类别标签(0/1)传进去,只会得到2个阈值点,曲线必然是生硬的折线。检查代码里是不是用了clf.predict(X_test),应该换成clf.predict_proba(X_test)[:, 1](取正类的概率列)。检查
drop_intermediate=False的使用位置
这个参数必须在计算FPR、TPR的时候传给roc_curve()函数,而不是绘图环节。正确写法:from sklearn.metrics import roc_curve fpr, tpr, thresholds = roc_curve(y_true, y_pred_proba, drop_intermediate=False)如果之前是在
plt.plot()里设置,肯定没效果。排查分类器的概率输出设置
部分分类器默认不输出真实概率,比如SVM的SVC类,必须初始化时加probability=True才能生成有效的概率值,否则predict_proba()的结果没有统计意义,会导致阈值点异常。示例:from sklearn.svm import SVC clf = SVC(probability=True) clf.fit(X_train, y_train)检查样本量与类别分布
如果测试集样本量太小(比如只有几十条),或者正负样本比例极度失衡,可用的阈值点数量太少,曲线自然会呈现锯齿状。可以统计下测试集的样本总数,以及正负样本的数量。验证数据预处理是否到位
像逻辑回归、SVM这类对特征尺度敏感的模型,如果特征没有做归一化/标准化,概率输出可能波动剧烈,导致ROC曲线出现不规则的锯齿。检查下训练集和测试集是否做了一致的尺度处理。
附你提供的问题曲线:
内容的提问来源于stack exchange,提问作者Kamila Pawłuszek
相关产品推荐
相关产品推荐

