python sklearn logistic_使用python+sklearn实现分类器校准的比较

注意:单击此处https://urlify.cn/aEJZbe下载完整的示例代码,或通过Binder在浏览器中运行此示例 校准良好的分类器是概率分类器,对于它们来说,predict_proba方法的输出可以直接解释为置信度。例如,经过良好校准的二分类器对样本进行分类,结果对于该样本给出的predict_proba值接近于0.8,也就是说有大概80%的概率可以相信这个样本属于正类。 由于逻辑回归(LogisticRegression)直接优化了对数损失,因此返回了经过良好校准的预测;相反,其他方法返回有偏见的概率(biased probabilities),每种方法都有不同的偏见:
  • 高斯朴素贝叶斯(GaussianNaiveBayes)倾向于将概率推到0或1(请注意直方图中的计数)。这主要是因为它假定特征在给定类别的情况下是条件独立的,而在包含2个冗余特征的数据集中情况却并非如此。
  • 随机森林分类器(RandomForestClassifier)则表现出相反的行为:直方图显示的峰值概率约为0.2和0.9,而接近0或1的概率非常罕见。Niculescu-Mizil和Caruana对此进行了解释 [1]:“bagging和随机森林之类的方法无法根据基础模型进行平均预测,因此很难预测有接近0和1的概率,因为基础模型的方差会使那些接近0或1的预测值偏离。由于预测值的范围仅限于区间[0,1],所以由方差引起的误差往往是在接近0和1的一侧,例如如果模型应针对某个情况预测p = 0,那么bagging唯一能实现的方法就是所有被bagging的树都预测为零,如果我们向平均bagging在一起的树上添加噪声,则此噪声将导致某些树在这种情况下预测的值大于0,从而使bagging总体的平均预测远离0。并且我们在随机森林中最能观察到这种效果,因为使用随机森林训练的基础树由于特征子集而具有相对较高的方差。校准曲线显示出具有特征性的sigmoid型曲线,表明分类器可以更加相信其“直觉”,并且返回的概率通常接近于0或1。
  • 支持向量分类(SVC)与随机森林分类器(RandomForestClassifier)相比显示出更大的sigmoid型曲线,这是典型的最大间隔(比较Niculescu-Mizil和Caruana [1])方法,该方法着重关注于那些靠近决策边界(支持向量)的硬样本(hard samples)。
参考文献: 1(1,2) Predicting Good Probabilities with Supervised Learning, A. Niculescu-Mizil & R. Caruana, ICML 2005
119c191e44cc4754909eb16b3798a69d.png sphx_glr_plot_compare_calibration_001
print(__doc__)# 作者: Jan Hendrik Metzen # 许可证: BSD Style.import numpy as npnp.random.seed(0)import matplotlib.pyplot as pltfrom sklearn import datasetsfrom sklearn.naive_bayes import GaussianNBfrom sklearn.linear_model import LogisticRegressionfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.svm import LinearSVCfrom sklearn.calibration import calibration_curveX, y = datasets.make_classification(n_samples=100000, n_features=20,                                    n_informative=2, n_redundant=2)train_samples = 100  # 用来训练模型的样本X_train = X[:train_samples]X_test = X[train_samples:]y_train = y[:train_samples]y_test = y[train_samples:]# 创建分类器lr = LogisticRegression()gnb = GaussianNB()svc = LinearSVC(C=1.0)rfc = RandomForestClassifier()# ############################################################################## 绘制出校准曲线plt.figure(figsize=(10, 10))ax1 = plt.subplot2grid((3, 1), (0, 0), rowspan=2)ax2 = plt.subplot2grid((3, 1), (2, 0))ax1.plot([0, 1], [0, 1], "k:", label="Perfectly calibrated")for clf, name in [(lr, 'Logistic'),                  (gnb, 'Naive Bayes'),                  (svc, 'Support Vector Classification'),                  (rfc, 'Random Forest')]:    clf.fit(X_train, y_train)    if hasattr(clf, "predict_proba"):        prob_pos = clf.predict_proba(X_test)[:, 1]    else:  # 使用决策函数        prob_pos = clf.decision_function(X_test)        prob_pos = \            (prob_pos - prob_pos.min()) / (prob_pos.max() - prob_pos.min())    fraction_of_positives, mean_predicted_value = \        calibration_curve(y_test, prob_pos, n_bins=10)    ax1.plot(mean_predicted_value, fraction_of_positives, "s-",             label="%s" % (name, ))    ax2.hist(prob_pos, range=(0, 1), bins=10, label=name,             histtype="step", lw=2)ax1.set_ylabel("Fraction of positives")ax1.set_ylim([-0.05, 1.05])ax1.legend(loc="lower right")ax1.set_title('Calibration plots  (reliability curve)')ax2.set_xlabel("Mean predicted value")ax2.set_ylabel("Count")ax2.legend(loc="upper center", ncol=2)plt.tight_layout()plt.show()
脚本的总运行时间:(0分钟1.301秒) 估计的内存使用量: 54 MB ce857f4d5d62262abf238c292d33ec43.png 下载Python源代码: plot_compare_calibration.py 下载Jupyter notebook源代码: plot_compare_calibration.ipynb 由Sphinx-Gallery生成的画廊

文壹由“伴编辑器”提供技术支持

☆☆☆为方便大家查阅,小编已将scikit-learn学习路线专栏 文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“系列文章”,如图:

34a2994fe4924e878e53d7d328ba67fa.png

欢迎大家和我一起沿着scikit-learn文档这条路线,一起巩固机器学习算法基础。(添加微信:mthler备注:sklearn学习,一起进【sklearn机器学习进步群】开启打怪升级的学习之旅。)

8f6e9a9191f00a2db680d33a85280bb0.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值