概率预测的准确程度被称为“校准程度”,是衡量算法预测出的概率和真实结果的差异的一种方式。
一种常用的指标叫做布里尔分数,它被计算为是概率预测相对于测试样本的均方误差(MSE)。
MSE通常用作回归问题的损失函数。MSE的公式为
预测值为,真实值为Y。
由MSE推出布里尔分数(Brier Score)的公式为:
其中,N是样本数量,为朴素贝叶斯预测出的概率,为样本所对应的真实结果。取值范围为[0,1],分数越高则说明预测结果越差劲,校准程度越差,因此布里尔分数越接近0越好。这个指标衡量了我们的预测概率距离真实标签结果的差异。由于它的本质是在衡量一种损失,所以在sklearn中,布里尔得分被定义为brier_score_loss。
我们继续用上节机器学习算法——贝叶斯分类器6(sklearn中的朴素贝叶斯)_Vicky_xiduoduo的博客-CSDN博客中的代码求布里尔分数。如下所示:
import numpy as np
import matplotlib.pyplot as plt
import sklearn
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix as CM
from sklearn.metrics import brier_score_loss
digits = load_digits()
X = digits.data
y = digits.target
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=420)
#建模
gnb = GaussianNB().fit(Xtrain,Ytrain)
#查看分数
acc_score = gnb.score(Xtest,Ytest)
print(acc_score)
print(Ytest)
#查看预测的概率结果
Y_pred = gnb.predict(Xtest)
#查看预测的概率结果
prob = gnb.predict_proba(Xtest) #返回的是每个特征下的概率
#混淆矩阵
#print(CM(Ytest, Y_pred))
#计算布里尔分数
print(brier_score_loss(Ytest, prob[:, 1], pos_label=1))
#pos_label与prob中的索引一致,就可以查看这个类别下的布里尔分数是多少
但是会报如下错误:
这是因为在sklearn中的布里尔分数只支持二分类进行布里尔分数评估,经过查询资料得到如下的解决方案:
先对测试集的标签进行哑变量(又称为虚拟变量,是人为设置的变量,通常取值为0或1,来反映某个变量的不同属性。对于n个分类属性的自变量,通常选取1个变量作为参照,因此会产生n-1个哑变量。换言之,哑变量是一种将多分类变量转换为二分变量的一种形式。)变换。再计算每个类别的布里尔分数就能成功计算出来。最终完整代码为:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import sklearn
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix as CM
from sklearn.metrics import brier_score_loss
digits = load_digits()
X = digits.data
y = digits.target
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=420)
#建模
gnb = GaussianNB().fit(Xtrain,Ytrain)
#查看分数
acc_score = gnb.score(Xtest,Ytest)
print(acc_score)
print(np.unique(Ytest))#得到总类别,10个
#查看预测的概率结果
Y_pred = gnb.predict(Xtest)
#查看预测的概率结果
prob = gnb.predict_proba(Xtest) #返回的是每个特征下的概率
#转换为哑变量
Ytest_copy = Ytest.copy()
Ytest_copy = pd.get_dummies(Ytest_copy)
#混淆矩阵
#print(CM(Ytest, Y_pred))
#z再计算每个类别的布里尔分数,就可以成功计算出来
for i in range(10):
print(brier_score_loss(Ytest_copy[i], prob[:, i], pos_label=i))
#pos_label与prob中的索引一致,就可以查看这个类别下的布里尔分数是多少
结果为:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)