可靠性曲线是一个概率类模型的评估指标,适用于朴素贝叶斯,SVM,逻辑回归等概率类算法。是以y预测值为横坐标,y真实值为纵坐标的曲线。
因此当我们画出的可靠性曲线越接近对角线时,我们认为这个学习器的性能越好。
sklearn的可靠性曲线和学习曲线相同都是不能直接画图而是返回画图所需要的值,因此下面代码是根据calibration_curve返回的值对三个算法的可靠性曲线的探索。
from sklearn.datasets import make_classification as mc
import matplotlib.pyplot as plt
from sklearn.naive_bayes import GaussianNB # 导入高斯朴素贝叶斯
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression as LR
from sklearn.metrics import brier_score_loss # 导入布里尔分数
from sklearn.model_selection import train_test_split
from sklearn.calibration import calibration_curve # 对概率类模型进行校准,方法是分箱
#创建数据
x,y = mc(n_samples=100000,
n_features= 20,
n_classes= 2,
n_repeated=10, # 10个特征无用
random_state=420)
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.9,random_state=420) #在朴素贝叶斯当中训练集可以非常的小
#print(np.unique(ytrain))
name = ["GaussianBayes","Logistic","SVC"]
gnb = GaussianNB()
logi = LR()
svc = SVC(kernel="linear",gamma = 1)
#开始画图
fig,ax1 = plt.subplots(figsize = (8,6))
ax1.plot([0,1],[0,1],label = "Perfectly calibrated") # 绘制对角线,把(0,0),(1,1)连起来
for clf,name_ in zip([gnb,logi,svc],name):
clf.fit(xtrain,ytrain)
y_pred = clf.predict(xtest)
if hasattr(clf,"predict_proba"): #对象里如果有这个接口
prob_pos = clf.predict_proba(xtest)[:,1]
else: #就是针对SVM
prob_pos = clf.decision_function(xtest)
prob_pos = (prob_pos-prob_pos.min())/(prob_pos.max()-prob_pos.min()) #手动归一化
clf_score = brier_score_loss(ytest,prob_pos,pos_label=y.max())
#对只有0,1的标签值进行分箱后才能画图
trueproba, predproba = calibration_curve(ytest, prob_pos, n_bins=10)
ax1.plot(predproba,trueproba,"s-",label = "%s(%1.3f)"%(name_,clf_score))
ax1.set_ylabel("True probability for class 1")
ax1.set_xlabel("Mean Predcited probability")
ax1.set_ylim([-0.05,1.05])
ax1.legend()
plt.show()
由此我们可以看出Logistic对这种概率分类问题有着天然的优势
4.1如果只关系一两个算法的话,可以在calibration_curve使用对n_bins进行调参来达到更好的效果。
当可靠性曲线过于粗糙的时候可以适当的降低n_bins的值,来使曲线变得更为平滑
4.2 校准可靠性曲线,这是sklearn中自带的接口,用于校准可靠性曲线。
from sklearn.calibration import CalibratedClassifierCV
重要参数:
best_estimator :需要校准其输出决策功能的分类器
cv: 交叉验证的参数,对每一组数都进行概率估计和校准,然后返回最佳的那一组参数估计和校准。
method: 就两个,具体不用深究,试试那个好使就用那个。分别是:sigmoid,isotonic.如果样本数量太少,不建议使用isotonic,容易过拟合。
使用的功能和其他的sklearn的算法相同。
#拿朴素贝叶斯用isotonic方法进行校准
gnbisotonic = CalibratedClassifier(gnb,cv = 3,method = 'isotonic').fit(xtrain,ytrain)
gnbisotonic.score(xtest,ytest)