注意:单击此处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)。
print(__doc__)
# 作者: Jan Hendrik Metzen
# 许可证: BSD Style.
import numpy as np
np.random.seed(0)
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import LinearSVC
from sklearn.calibration import calibration_curve
X, 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
下载Python源代码: plot_compare_calibration.py
下载Jupyter notebook源代码: plot_compare_calibration.ipynb
由Sphinx-Gallery生成的画廊
文壹由“伴编辑器”提供技术支持
☆☆☆为方便大家查阅,小编已将scikit-learn学习路线专栏 文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“系列文章”,如图:欢迎大家和我一起沿着scikit-learn文档这条路线,一起巩固机器学习算法基础。(添加微信:mthler,备注:sklearn学习,一起进【sklearn机器学习进步群】开启打怪升级的学习之旅。)