分类模型的评价
1、从案例出发
假如某个班级有男生80人,女生20人,共计100人。目标是找出所有女生。
现在某人挑选出50个人,其中20人是女生,另外还错误的把30个男生也当作女生挑选出来了。评估(evaluation)下他的工作。
(1)accuracy(准确率):0-1损失。分类器(某人)正确分类的样本数/总样本数,即20+50/100=70%
不适合不均衡数据集。举例,总人数100人,男生1人,女生99人,现调出男生。假设都是女生,那么accuracy:99/100=99%
虽然accuracy很高。但是我的目的是要调出男生,它没有做到。差评。
(2)precision(精确率):成功查询到的样本/总查询的样本
前面案例中分别是20/20+30=40% 0/100=0%
(3)recall(召回率):成功查询到的样本/目标样本总数
前面案例中分别是20/20=100% 0/20=0%
2、损失函数
(1)0-1损失
(2)log损失:log_loss,logistic/负log似然损失。
3、不均衡样本的评价指标
(1)混淆矩阵
可以用于二分类,有可以用于多分类(如shou手写数字识别)
(2)前面介绍的precision、recall
(3)ROC:面积AUC
不仅仅只考虑precision或者recall,而是综合考虑。ROC:TPR(就是recall)+FPR(将多少个假的预测成了真的)
通常,如A、B曲线,我们会选择A。
但如果曲线是不规则的,我们会计算AUC值(曲线的面积),判别大小,取AUC最大的曲线。
(4)PR:面积AP
当负样本非常多时,FPR很小。
(5)在现代web信息检索中,recall意义不大了(进本上都能查到,但是查到的信息很多,人们只关心部分)。
改用[email protected],如[email protected],意味着只关注前10个查询到的数据。
(6)将precision和recall值结合在一起:F1分数,称为precision和recall的调和平均。
4、sklearn中的评价指标
(1)每一个学习器都有一个score函数(回归中缺省的就是R2 Score),分类中缺省的是正确率(Mean accuracy)。
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_train, y_train)
#方式1
y_test_pred_lr = lr.predict(X_test)
y_train_pred_lr = lr.predict(X_train)
print('测试集的评价指标:', r2_score(y_test, y_test_pred_lr))
print('训练集的评价指标', r2_score(y_train, y_train_pred_lr))
#方式2(必须先fit才行)
print("test:",lr.score(X_test,y_test))
print("train:",lr.score(X_train,y_train))
(2)在交叉验证时(评估模型性能),scoring参数,它就可以指定选用哪种评价指标。
model_selection.cross_val_score、model_selection.GridSearchCV、xxCV类中有scoring参数(最佳参数为最大scoring模型对应的参数)。
由于要评价模型,交叉验证GridSearchCV会自动保留最佳的参数、最佳的分数、最佳的模型。scoring的评价指标要越大越好。
如果采用损失/误差(损失越小越好)类函数的话,需要加上负号,即负损失越大越好。如:log_loss==>net_log_loss
(3)Metric模块,提供了一些其他的评价指标
(4)一个特定的任务,sklearn不支持,怎么办?
NO1:Metric里面定义了一些积分函数,如fbeta_score,对其进行变换,将beta设定为2。
NO2:自己写评价函数
(5)Classification metrics模块:PR、ROC等
一般竞赛中,会规定我们用哪个评价指标。我们就可以将这个评价指标作为交叉验证中的scoring参数即可。