falsepositive机器学习
1、如何提高机器学习算法的召回率
最近在做文本分类,遇到了一些问题,想问问大家有没有好的方法。为了节省时间,我只采取了部分数据来跑算法(全部数据跑了之后的结果和这个差不多)训练集:4837 documents
测试集:2074 documents
样本比例:正样本:负样本 = 1:3
预测结果中,有的算法在正样本中预测的精确率还行(0.95-1.00之间),但是召回率非常差,通常只有0.01和0.02左右,KNeighbors和DecisionTree的精确率和召回率都是0,只有NaiveBayes和BernoulliNB的PR和Recall比较平均,但是也没有到0.8。
问题:我查了一下那些召回率较低(0.01)的算法,475个样本中(正样本),实际上只有5个被预测正确了的,但是具体原因没有查出来。
我想请问一下:1.召回率低是因为样本极度不平衡造成的吗?(虽然我认为1:3的比例不算极度不平衡。)2.在这种样本不平衡的问题上,有没有什么好的方法可以提高召回率?我试过SMOTE方法(过采样和欠采样都有试过),但对于我的数据集并没有什么好的效果,不止到有没有有什么好的方法可以解决这个问题?!
添加评论
分享
查看全部 11 个回答
0赞同反对,不会显示你的姓名
Elvin 全是细枝末节,做一个乐于分享的人
两个问题一并回答一下,根据你的描述,我觉得问题应该不是出在正负样本比上,1比3这个比例不但不是非常不均衡,相反在我看来已经是非常均衡了。以前做比赛有处理过正负比1比10000的数据,我觉得这才叫不平衡,才需要使用类似上采样,下采样,以及SMOTE算法(都用过),而且这样的情况下recall,F1等指标的提升是显著的。我觉得正负比例在1:1至1:100间差别都不会太大,需要根据具体问题做离线交叉验证去找到最好的比例。
所以我建议你不用再纠结正负样本比的问题,可以再回头看一看你的数据集,一方面看一看代码是否有误?数据集是否太小?(总觉得你的数据集太小,而且测试集相对于训练集太大)另外训练集,测试集的划分是否正确?或者重新划分一下训练测试集做一下交叉验证看一看各项指标再具体研究。 TP —— True Positive (真正, TP)被模型预测为正的正样本;可以称作判断为真的正确率
TN —— True Negative(真负 , TN)被模型预测为负的负样本 ;可以称作判断为假的正确率
FP ——False Positive (假正, FP)被模型预测为正的负样本;可以称作误报率
FN——False Negative(假负 , FN)被模型预测为负的正样本;可以称作漏报率
True Positive Rate(真正率 , TPR)或灵敏度(sensitivity) TPR = TP /(TP + FN) 正样本预测结果数 / 正样本实际数
True Negative Rate(真负率 , TNR)或特指度(specificity) TNR = TN /(TN + FP) 负样本预测结果数 / 负样本实际数
False Positive Rate (假正率, FPR) FPR = FP /(FP + TN) 被预测为正的负样本结果数 /负样本实际数
False Negative Rate(假负率 , FNR) FNR = FN /(TP + FN) 被预测为负的正样本结果数 / 正样本实际数
2、机器学习中对数几率回归中为什么把y看作x为正例的概率
考虑二问题即实例类(positive)或负类(negative)二问题说现四种情况实例类并且预测类即真类(Truepositive),实例负类预测类称假类(Falsepositive)相应实例负类预测负类称真负类(Truenegative),类预测负类则假负类(falsenegative)列联表表所示1代表类0代表负类预测10合计实际1TruePositive(TP)FalseNegative(FN)ActualPositive(TP+FN)0FalsePositive(FP)TrueNegative(TN)ActualNegative(FP+TN)合计PredictedPositive(TP+FP)PredictedNegative(FN+TN)TP+FP+FN+TN列联表引入两新名词其真类率(truepositiverate,TPR),计算公式TPR=TP/(TP+FN)刻画类器所识别实例占所实例比例另外假类率(falsepositiverate,FPR),计算公式FPR=FP/(FP+TN)计算类器错认类负实例占所负实例比例真负类率(TrueNegativeRateTNR)称specificity,计算公式TNR=TN/(FP+TN)=1-FPR二类模型于所连续结假设已确定阈值比说0.6于值实例划归类于值则划负类减阈值减0.5固能识别类提高识别例占所例比例即TPR同负实例作实例即提高FPR形象化变化引入ROCReceiverOperatingCharacteristic,翻译接受者操作特性曲线够拗口曲线由两变量1-specificitySensitivity绘制.1-specificity=FPR即假类率Sensitivity即真类率TPR(Truepositiverate),反映类覆盖程度组合1-specificitysensitivity,即代价(costs)收益(benefits)表逻辑归结实数值按划10数相同部Percentile实例数例数1-特异度(%)敏度(%)10618048792.7334.6420618028049.8054.55306180216518.2269.92406180150628.0180.6250618098738.9087.6260618052950.7491.3870618036562.9393.9780618029475.2696.0690618029787.5998.171006177258100.00100.00其例数部实际类数说逻辑归结按排列倘若前10%数值作阀值即前10%实例都划归类6180其确数4879占所类4879/14084*100%=34.64%即敏度;另外6180-4879=1301负实例错划类占所负类1301/47713*100%=2.73%,即1-特异度两组值别作x值y值excel作散点图ROC曲线3、机器学习中roc曲线的accuracy怎么求
考虑一个二分问题,即将实例分成正类(positive)或负类(negative)。对一个二分问题来说,会出现四种情况。如果一个实例是正类并且也被预测成正类,即为真正类(Truepositive),如果实例是负类被预测成正类,称之为假正类(Falsepositive)。相应地,如果实例是负类被预测成负类,称之为真负类(Truenegative),正类被预测成负类则为假负类(falsenegative)。列联表如下表所示,1代表正类,0代表负类。预测10合计实际1TruePositive(TP)FalseNegative(FN)ActualPositive(TP+FN)0FalsePositive(FP)TrueNegative(TN)ActualNegative(FP+TN)合计PredictedPositive(TP+FP)PredictedNegative(FN+TN)TP+FP+FN+TN从列联表引入两个新名词。其一是真正类率(truepositiverate,TPR),计算公式为TPR=TP/(TP+FN),刻画的是分类器所识别出的正实例占所有正实例的比例。另外一个是假正类率(falsepositiverate,FPR),计算公式为FPR=FP/(FP+TN),计算的是分类器错认为正类的负实例占所有负实例的比例。还有一个真负类率(TrueNegativeRate,TNR),也称为specificity,计算公式为TNR=TN/(FP+TN)=1-FPR。在一个二分类模型中,对于所得到的连续结果,假设已确定一个阈值,比如说0.6,大于这个值的实例划归为正类,小于这个值则划到负类中。如果减小阈值,减到0.5,固然能识别出的正类,也就是提高了识别出的正例占所有正例的比例,即TPR,但同时也将的负实例当作了正实例,即提高了FPR。为了形象化这一变化,在此引入ROC。ReceiverOperatingCharacteristic,翻译为接受者操作特性曲线,够拗口的。曲线由两个变量1-specificity和Sensitivity绘制.1-specificity=FPR,即假正类率。Sensitivity即是真正类率,TPR(Truepositiverate),反映了正类覆盖程度。这个组合以1-specificity对sensitivity,即是以代价(costs)对收益(benefits)。下表是一个逻辑回归得到的结果。将得到的实数值按大到小划分成10个个数相同的部分。Percentile实例数正例数1-特异度(%)敏感度(%)10618048792.7334.6420618028049.8054.55306180216518.2269.92406180150628.0180.6250618098738.9087.6260618052950.7491.3870618036562.9393.9780618029475.2696.0690618029787.5998.171006177258100.00100.00其正例数为此部分里实际的正类数。也就是说,将逻辑回归得到的结果按从大到小排列,倘若以前10%的数值作为阀值,即将前10%的实例都划归为正类,6180个。其中,正确的个数为4879个,占所有正类的4879/14084*100%=34.64%,即敏感度;另外,有6180-4879=1301个负实例被错划为正类,占所有负类的1301/47713*100%=2.73%,即1-特异度。以这两组值分别作为x值和y值,在excel中作散点图。得到ROC曲线如下 你讲的是信号检测论里的吧?ROC曲线纵轴是击中率,横轴是虚报率,对角线表示随机概率.对角线以上链接对角向上弯曲的曲线就是ROC曲线.曲率越大越向上表示被试感受性越强.4、机器学习模型评价指标及R实现
机器学习模型评价指标及R实现1.ROC曲线
考虑一个二分问题,即将实例分成正类(positive)或负类(negative)。对一个二分问题来说,会出现四种情况。如果一个实例是正类并且也被 预测成正类,即为真正类(True positive),如果实例是负类被预测成正类,称之为假正类(False positive)。相应地,如果实例是负类被预测成负类,称之为真负类(True negative),正类被预测成负类则为假负类(false negative)。
列联表如下表所示,1代表正类,0代表负类。
真正类率(true positive rate ,TPR), 也称为 Sensitivity,计算公式为TPR=TP/ (TP+ FN),刻画的是分类器所识别出的 正实例占所有正实例的比例。
假正类率(false positive rate, FPR),计算公式为FPR= FP / (FP + TN),计算的是分类器错认为正类的负实例占所有负实例的比例。
真负类率(True Negative Rate,TNR),也称为specificity,计算公式为TNR=TN/ (FP+ TN) = 1 - FPR。 在一个二分类模型中,对于所得到的连续结果,假设已确定一个阈值,比如说 0.6,大于这个值的实例划归为正类,小于这个值则划到负类中。如果减小阈值,减到0.5,固然能识别出更多的正类,也就是提高了识别出的正例占所有正例的比例,即TPR,但同时也将更多的负实例当作了正实例,即提高了FPR。为了形象化这一变化,在此引入ROC。
ROC曲线正是由两个变量1-specificity(x轴) 和 Sensitivity(y轴)绘制的,其中1-specificity为FPR,Sensitivity为TPR。随着阈值的改变,就能得到每个阈值所对应的1-specificity和Sensitivity,最后绘制成图像。
该图像的面积如果越接近1,那么我们则认为该分类器效果越好。从直觉上来说,假设我们的预测全部100%正确,那么不管阈值怎么变(除了阈值等于0和1时),我们的Sensitivity(真正类)率永远等于1,1-specificity(1-真负类率)永远等于0,所以该图就是个正方形,面积为1,效果最好。
样例数据集:
library(ROCR)
data(ROCR.simple)
ROCR.simple<-as.data.frame(ROCR.simple)
head(ROCR.simple)
# predictions labels
# 1 0.6125478 1
# 2 0.3642710 1
# 3 0.4321361 0
# 4 0.1402911 0
# 5 0.3848959 0
# 6 0.2444155 1
绘制ROC图:
pred <- prediction(ROCR.simple$predictions, ROCR.simple$labels)
perf <- performance(pred,"tpr","fpr")
plot(perf,colorize=TRUE)
2.AUC值
AUC值就是ROC曲线下的面积,可以通过以下代码计算:
pred <- prediction(ROCR.simple$predictions, ROCR.simple$labels)
auc.tmp <- performance(pred,"auc")
auc <- as.numeric(auc.tmp@y.values)
3.Recall-Precision(PR)曲线
同样是一个二分类的模型的列联表,我们可以定义:
然后我们通过计算不同的阈值,以Recall为X轴,Precision为Y轴绘制图像。
PR图可以有这样的应用,引用一个例子[1]:
1. 地震的预测
对于地震的预测,我们希望的是RECALL非常高,也就是说每次地震我们都希望预测出来。这个时候我们可以牺牲PRECISION。情愿发出1000次警报,把10次地震都预测正确了;也不要预测100次对了8次漏了两次。
2. 嫌疑人定罪
基于不错怪一个好人的原则,对于嫌疑人的定罪我们希望是非常准确的。及时有时候放过了一些罪犯(recall低),但也是值得的。
对于分类器来说,本质上是给一个概率,此时,我们再选择一个CUTOFF点(阀值),高于这个点的判正,低于的判负。那么这个点的选择就需要结合你的具体场景去选择。反过来,场景会决定训练模型时的标准,比如第一个场景中,我们就只看RECALL=99.9999%(地震全中)时的PRECISION,其他指标就变得没有了意义。
绘制代码:
pred <- prediction(ROCR.simple$predictions, ROCR.simple$labels)
RP.perf <- performance(pred, "prec", "rec")
plot (RP.perf)
#查看阈值为0.1,0.5,0.9下的召回率和精确率
plot(RP.perf, colorize=T, colorkey.pos="top",
print.cutoffs.at=c(0.1,0.5,0.9), text.cex=1,
text.adj=c(1.2, 1.2), lwd=2)
一般这曲线越靠上,则认为模型越好。对于这个曲线的评价,我们可以使用F分数来描述它。就像ROC使用AUC来描述一样。
4.F1分数
Fβ
分数定义如下:
我们可以使用R计算F1分数:
pred <- prediction(ROCR.simple$predictions, ROCR.simple$labels)
f.perf <- performance(pred, "f")
plot(f.perf) #横坐标为阈值的取值
5.均方根误差RMSE
回归模型中最常用的评价模型便是RMSE(root mean square error,平方根误差),其又被称为RMSD(root mean square deviation),其定义如下:
其中,yi是第i个样本的真实值,y^i是第i个样本的预测值,n是样本的个数。该评价指标使用的便是欧式距离。
??RMSE虽然广为使用,但是其存在一些缺点,因为它是使用平均误差,而平均值对异常点(outliers)较敏感,如果回归器对某个点的回归值很不理性,那么它的误差则较大,从而会对RMSE的值有较大影响,即平均值是非鲁棒的。 所以有的时候我们会先剔除掉异常值,然后再计算RMSE。
R语言中RMSE计算代码如下:
pred <- prediction(ROCR.simple$predictions, ROCR.simple$labels)
rmse.tmp<-performance(pred, "rmse")
rmse<-rmse.tmp@y.values
6.SAR
SAR是一个结合了各类评价指标,想要使得评价更具有鲁棒性的指标。(cf. Caruana R., ROCAI2004):
其中准确率(Accuracy)是指在分类中,使用测试集对模型进行分类,分类正确的记录个数占总记录个数的比例:
pred <- prediction(ROCR.simple$predictions, ROCR.simple$labels)
sar.perf<-performance(pred, "sar")
7.多分类的AUC[5]
将二类 AUC 方法直接扩展到多类分类评估中, 存在表述空间维数高、复杂性大的问题。 一般采用将多类分类转成多个二类分类的思想, 用二类 AUC 方法来评估多类分类器的性能。Fawcett 根据这种思想提出了 F- AUC 方法[4], 该评估模型如下
其中AUC(i,rest)是计算 用 ” 1- a- r”方 法 得 到 的 每 个 二 类 分 类器的 AUC 值,“ 1- a- r”方法思想是 k 类分类问题构造 k 个二类分类器, 第 i 个二类分类器中用第 i 类的训练样本作为正例, 其他所有样本作为负例。 p ( i) 是计算每个类在所有样本中占有的比例,
5、机器学习除了准确率,召回率,roc,还有没有其他的评价指标
分类
混淆矩阵1
True Positive(真正, TP):将正类预测为正类数.
True Negative(真负 , TN):将负类预测为负类数.
False Positive(假正, FP):将负类预测为正类数 →→ 误报 (Type I error).
False Negative(假负 , FN):将正类预测为负类数 →→ 漏报 (Type II error).
精确率(precision)定义为:
P=TPTP+FP(1)(1)P=TPTP+FP
需要注意的是精确率(precision)和准确率(accuracy)是不一样的,
ACC=TP+TNTP+TN+FP+FNACC=TP+TNTP+TN+FP+FN
在正负样本不平衡的情况下,准确率这个评价指标有很大的缺陷。比如在互联网广告里面,点击的数量是很少的,一般只有千分之几,如果用acc,即使全部预测成负类(不点击)acc 也有 99% 以上,没有意义。
召回率(recall,sensitivity,true positive rate)定义为:
R=TPTP+FN(2)(2)R=TPTP+FN
此外,还有 F1F1 值,是精确率和召回率的调和均值,
2F1F1=1P+1R=2TP2TP+FP+FN(3)2F1=1P+1R(3)F1=2TP2TP+FP+FN
精确率和准确率都高的情况下,F1F1 值也会高。
通俗版本
刚开始接触这两个概念的时候总搞混,时间一长就记不清了。
实际上非常简单,精确率是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是对的。那么预测为正就有两种可能了,一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP)。
而召回率是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。那也有两种可能,一种是把原来的正类预测成正类(TP),另一种就是把原来的正类预测为负类(FN)。
在信息检索领域,精确率和召回率又被称为查准率和查全率,
查准率查全率=检索出的相关信息量检索出的信息总量=检索出的相关信息量系统中的相关信息总量查准率=检索出的相关信息量检索出的信息总量查全率=检索出的相关信息量系统中的相关信息总量
ROC 曲线
我们先来看下维基百科的定义,
In signal detection theory, a receiver operating characteristic (ROC), or simply ROC curve, is a graphical plot which illustrates the performance of a binary classifier system as its discrimination threshold is varied.
比如在逻辑回归里面,我们会设一个阈值,大于这个值的为正类,小于这个值为负类。如果我们减小这个阀值,那么更多的样本会被识别为正类。这会提高正类的识别率,但同时也会使得更多的负类被错误识别为正类。为了形象化这一变化,在此引入 ROC ,ROC 曲线可以用于评价一个分类器好坏。
ROC 关注两个指标,
true positive rate:false positive rate:TPR=TPTP+FNFPR=FPFP+TNtrue positive rate:TPR=TPTP+FNfalse positive rate:FPR=FPFP+TN
直观上,TPR 代表能将正例分对的概率,FPR 代表将负例错分为正例的概率。在 ROC 空间中,每个点的横坐标是 FPR,纵坐标是 TPR,这也就描绘了分类器在 TP(真正率)和 FP(假正率)间的 trade-off2。
AUC
AUC(Area Under Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。
The AUC value is equivalent to the probability that a randomly chosen positive example is ranked higher than a randomly chosen negative example.
翻译过来就是,随机挑选一个正样本以及一个负样本,分类器判定正样本的值高于负样本的概率就是 AUC 值。
简单说:AUC值越大的分类器,正确率越高3。
AUC=1AUC=1,完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。
0.5<AUC<10.5<AUC<1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
AUC=0.5AUC=0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
AUC<0.5AUC<0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测,因此不存在 AUC<0.5AUC<0.5 的情况。
既然已经这么多评价标准,为什么还要使用ROC和AUC呢?因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反)
回归4
平均绝对误差
平均绝对误差MAE(Mean Absolute Error)又被称为 l1l1 范数损失(l1-norm loss):
MAE(y,y^)=1nsamples∑i=1nsamples|yi−y^i|MAE(y,y^)=1nsamples∑i=1nsamples|yi−y^i|
平均平方误差
平均平方误差 MSE(Mean Squared Error)又被称为 l2l2 范数损失(l2-norm loss):
MSE(y,y^)=1nsamples∑i=1nsamples(yi−y^i)2MSE(y,y^)=1nsamples∑i=1nsamples(yi−y^i)2
看你要做什么样的任务,根据任务来定指标。比如说你如果要做的是检索方面的任务,那么准确率、召回率还有其衍生出来的F1值是常用的指标。ROC曲线当然也是一个不错的指标。
如果你做的是预测方面的任务,那么衡量的就是预测的误差了,这个时候可能就会要用到RMSE(均方根误差)这样的指标了。具体的计算公式你可以百度。
如果你要做的是排序方面的任务,还有MAP(平均准确率)、NDCG等等。
所以说,要先确定问题,再根据问题选择相应的评价指标

转载请带上网址:http://www.pos-diy.com/posjitwo/145531.html