有三种不同的方法来评估一个模型的预测质量:
评价指标针对不同的机器学习任务有不同的指标,同一任务也有不同侧重点的评价指标。
主要有分类(classification)、回归(regression)、排序(ranking)、聚类(clustering)、热门主题模型(topic modeling)、推荐(recommendation)等。
分类有二分类和多分类,二分类主要“是”和“不是”的问题,可以扩展到多分类,如逻辑回归->SoftMax。
分类中,使用模型对测试集进行分类,分类正确的样本个数占总样本的比例:
问题:
SKlearn API
from sklearn.metrics import accuracy_score
# y_pred是预测标签
y_pred, y_true=[1,2,3,4], [2,2,3,4]
accuracy_score(y_true=y_true, y_pred=y_pred)
针对不平衡数据,对n个类,计算每个类别i的准确率,然后求平均:
缺点:某些类别样本数很少,测试集中该类别的准确率 方差会很大(统计变量偏离程度:高)。
from sklearn.metrics import average_precision_score
# y_pred是预测标签
y_pred, y_true =[1,0,1,0], [0,0,1,0]
average_precision_score(y_true=y_true, y_score=y_pred)
针对分类输出不是类别,而是类别的概率,使用对数损失函数进行评价。这也是逻辑回归的分类函数,下面是二分类的损失函数。
表示第i个样本类别0或1。
表示其输入类别1的概率。其实就是真实值域预测值得交叉熵,包含了真实分布的熵加上假设与真实分布不同的分布的不确定性,最小化交叉熵,便是最大化分类器的准确率。
from sklearn.metrics import log_loss
y_true, y_pred = [0,0,1,1], [[0.9,0.1],[0.8,0.2],[0.3,0.7],[0.01,0.99]]
print(log_loss(y_true,y_pred))
混淆矩阵通过计算各种分类度量,指导模型的评估。
Predicted: 0 | Predicted: 1 |
---|---|
Actual: 0 | TN |
Actual: 1 | FN |
from sklearn.metrics import confusion_matrix
# y_pred是预测标签
y_pred, y_true =[1,0,1,0], [0,0,1,0]
confusion_matrix(y_true=y_true, y_pred=y_pred)
所有分正确的正样本/所有预测为正类的样本数。
所有分正确的正样本/所有的正样本数:
精确率和召回率两者一般同时使用,F1-score中和了二者的评估:
sklearn中classification_report可以直接输出各个类的precision recall f1-score support
from sklearn.metrics import classification_report
# y_pred是预测标签
y_pred, y_true =[1,0,1,0], [0,0,1,0]
print(classification_report(y_true=y_true, y_pred=y_pred))
Auc是ROC(Receiver Operating Characteristic)曲线下的面积。在此再次召唤出混淆矩阵:
Predicted: 0 | Predicted: 1 |
---|---|
Actual: 0 | TN |
Actual: 1 | FN |
分类器分类正确的正样本个数占总正样本个数的比例:
分类器分类错误的负样本个数占总负样本个数的比例:
描述分类器的True Positive Rate与False Positive Rate之间的变化关系。
绘制ROC曲线。
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
# y_test:实际的标签, dataset_pred:预测的概率值。
fpr, tpr, thresholds = roc_curve(y_test, dataset_pred)
roc_auc = auc(fpr, tpr)
#画图,只需要plt.plot(fpr,tpr),变量roc_auc只是记录auc的值,通过auc()函数能计算出来
plt.plot(fpr, tpr, lw=1, label='ROC(area = %0.2f)' % (roc_auc))
plt.xlabel("FPR (False Positive Rate)")
plt.ylabel("TPR (True Positive Rate)")
plt.title("Receiver Operating Characteristic, ROC(AUC = %0.2f)"% (roc_auc))
plt.show()
AUC即为ROC曲线下的面积,同时证明AUC与Wilcoxon-Mann-Witney Test是等价的。其计算公式:
M为正类样本的数目,N为负类样本的数目,
是样本i模型预测概率的排名。
from sklearn.metrics import roc_auc_score
# y_test:实际的标签, dataset_pred:预测的概率值。
roc_auc_score(y_test, dataset_pred)
回归是对连续的实数值进行预测,而分类中是离散值。
RMSE(root mean square error,平方根误差),定义为:
其中,
是真实值,
是预测值,n是样本数量,使用了欧式距离。
缺点:平均值是非鲁棒的,对于异常点敏感,如果某个异常点误差大,整个RMSE就会比较大。
from sklearn.metrics import mean_squared_error
y_true, y_pred = [3, -0.5, 2, 7], [2.5, 0.0, 2, 8]
mean_squared_error(y_true, y_pred)
$$
MAE(y,\hat{y}) = \frac{1}{n_{samples}} \sum_{i=1}^n |y_i - \hat{y_i}|
$$
from sklearn.metrics import mean_squared_error
y_true, y_pred = [3, -0.5, 2, 7], [2.5, 0.0, 2, 8]
mean_squared_error(y_true, y_pred)
from sklearn.metrics import median_absolute_error
y_true, y_pred = [3, -0.5, 2, 7], [2.5, 0.0, 2, 8]
median_absolute_error(y_true, y_pred)
from sklearn.metrics import r2_score
y_true, y_pred = [3, -0.5, 2, 7], [2.5, 0.0, 2, 8]
r2_score(y_true, y_pred)
Scoring | Function | Comment |
---|---|---|
Classification | ||
‘accuracy’ | metrics.accuracy_score | |
‘average_precision’ | metrics.average_precision_score | |
‘f1’ | metrics.f1_score | for binary targets |
‘f1_micro’ | metrics.f1_score | micro-averaged |
‘f1_macro’ | metrics.f1_score | macro-averaged |
‘f1_weighted’ | metrics.f1_score | weighted average |
‘f1_samples’ | metrics.f1_score | by multilabel sample |
‘neg_log_loss’ | metrics.log_loss | requires predict_proba support |
‘precision’ etc. | metrics.precision_score | suffixes apply as with ‘f1’ |
‘recall’ etc. | metrics.recall_score | suffixes apply as with ‘f1’ |
‘roc_auc’ | metrics.roc_auc_score | |
Clustering | ||
‘adjusted_rand_score’ | metrics.adjusted_rand_score | |
Regression | ||
‘neg_mean_absolute_error’ | metrics.mean_absolute_error | |
‘neg_mean_squared_error’ | metrics.mean_squared_error | |
‘neg_median_absolute_error’ | metrics.median_absolute_error | |
‘r2’ | metrics.r2_score |