机器学习算法——概率类模型评估指标2(对数似然函数Log_Loss)

除了上节的布里尔分数外,另一种常用的概率损失衡量是对数损失(log_loss),又叫做对数似然、逻辑损失或者交叉熵损失,它是多元逻辑回归以及一些拓展算法(比如神经网络)中使用的损失函数。它被定义为,对于一个给定的概率分类器,在预测概率为条件的情况下,真实概率发生的可能性的负对数。由于是损失,因此对数似然函数的取值越小,则证明概率估计越准确,模型越理想。需要注意的是,对数损失只能用于评估分类型模型。

为了计算对数损失,分类器必须提供对输入的所属的每个类别的概率值,不只是最可能的类别。对数损失函数的计算公式如下:

L(Y,P(Y|X)) = - log P(Y|X) = - \frac{1}{N} \sum_{i=1}^{N} \sum_{j=1}^{M} y_{ij} logP_{ij}

其中,Y为输出变量,X为输入变量,N为样本数,M为可能的类别数,yij表示类别j是否是输入实例xi的真实类别,pij为模型或分类器预测输入实例xi属于类别j的概率。

如果只有两类{0,1},则对数损失函数可以简化为

-\frac{1}{N} \sum_{i=1}^{N} (y_i log p_i+(1-y_i)log(1-p_i))

还是以手写数据集为例,看一下贝叶斯、逻辑回归以及支持向量机的表现:

from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression as LR
from sklearn.metrics import log_loss

data = load_digits()

X = data.data
y = data.target

Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, y, test_size=0.3, random_state=420)

#朴素贝叶斯分类器
estimators = [GaussianNB().fit(Xtrain, Ytrain)
              , LR(solver='lbfgs', max_iter=3000, multi_class='auto').fit(Xtrain,Ytrain)
              , SVC(kernel='rbf', probability=True).fit(Xtrain,Ytrain)
              ]
name = ['GaussianNB', 'LogisticRegression', 'SVC']
for i, estimator in enumerate(estimators):
    if hasattr(estimator, 'predict_proba'):
        prob = estimator.predict_proba(Xtest)
        print("{}'s log_loss is: {}\n".format(name[i], log_loss(Ytest, prob)))

得到结果如下所示:

机器学习算法——概率类模型评估指标2(对数似然函数Log_Loss)_第1张图片

对于概率类算法专用评估指标,贝叶斯的分数是最差的,按道理来说,贝叶斯模型是纯概率模型,在概率模型的评估指标上应该优于支持向量机这样的非概率模型。

这是因为逻辑回归和SVC都是以最优化为目的来求解模型,然后进行分类的算法。而朴素贝叶斯中,却没有最优化的过程。对数似然函数直接指向模型最优化的方向,甚至就是逻辑回归本身的损失函数,因此在逻辑回归和SVC上表现得更好。

那如何在更换贝叶斯模型的前提下,减少损失?答:调解概率的校准程度。校准程度越高,模型对概率的预测越准确,算法在做判断时就越有自信,模型就会更稳定。如果我们追求模型在概率预测上必须尽量贴近真实概率,那我们就可以使用可靠性曲线(Reliabiltiy Curve)来调节概率的校准程度。

可靠性(Reliabiltiy Curve)曲线将在下节中进行介绍。

你可能感兴趣的:(模型评估,机器学习,算法,深度学习,人工智能,概率论)