机器学习评估方法
Accuracy准确率
其定义是: 对于给定的测试数据集,分类器正确分类的样本数与总样本数之比。也就是损失函数是0-1损失时测试数据集上的准确率。
由准确率,我们可以在一些场合,从某种意义上得到一个分类器是否有效,但它并不总是能有效的评价一个分类器的工作。
比如 搜索引擎 抓取了 CSDN 100个页面,而它索引中共有10,000,000个页面,随机抽一个页面,如果以 accuracy 来判断我的工作,而 accuracy 已经到了99.999%(9,999,900/10,000,000),所以我会把所有的页面都判断为"不是 CSDN 的页面"。
那怎么解决呢?这就需要用到Precision,Recall 和 F1-score 了。
Precision精确率,Recall召回率,F1-scoreF分数
- 被检索到:
- 相关,正类:TP: true positives 正类判定为正类
- 无关,负类:FP: false positives 负类判定为正类,存伪
- 未被检索到:
- 相关,正类:FN: false negatives 正类判定位负类,去真
- 无关,负类:TN: true positives 负类判定为负类
Precision精确率的公式:P=
T
P
T
P
+
F
P
\frac{TP}{TP+FP}
TP+FPTP
它计算的是所有"正确被检索的结果(TP)"占所有"实际被检索到的(TP+FP)"的比例。
Recall召回率的公式:R=
T
P
T
P
+
F
N
\frac{TP}{TP+FN}
TP+FNTP
它计算的是所有"正确被检索的结果(TP)"占所有"应该检索到的结果(TP+FN)"的比例。
F1-score就是精确率和召回率的调和均值,也就是
2
F
1
\frac{2}{F1}
F12=
1
P
\frac{1}{P}
P1+
1
R
\frac{1}{R}
R1
亦即
F1=
2
P
R
P
+
R
\frac{2PR}{P+R}
P+R2PR=
2
T
P
2
T
P
+
F
P
+
F
N
\frac{2TP}{2TP+FP+FN}
2TP+FP+FN2TP
在F1-score中,我们认为精确率和召回率的权重相等。
Fβ=(β^2+1)*
P
R
β
2
+
P
+
R
\frac{PR}{β^2+P+R}
β2+P+RPR是一般化公式
通过调整β可以改变精确率和召回率的权重。
代码实现
def divide_information(predictions, y):
TP = 0 # 正确判定正类
FP = 0 # 错误判断正类,实际为负类
TN = 0 # 正确判定负类
FN = 0 # 错误判定负类,实际为正类
for i in range(len(predictions)):
if predictions[i] == 1:
if y[i] == 1:
TP += 1
else:
FP += 1
else:
if y[i] == 1:
FN += 1
else:
TN += 1
return TP, FP, TN, FN
def getAccuracy(predictions, y):
return (predictions == y).sum()/len(y)
def getPrecision(predictions, y):
# TP/(TP+FP)
TP, FP, TN, FN = divide_information(predictions, y)
precision = TP/(TP + FP)
return precision
def getRecall(predictions, y):
# TP/(TP+FN)
TP, FP, TN, FN = divide_information(predictions, y)
recall = TP / (TP + FN)
return recall
def getF1score(predictions, y):
# 2P*R/(P+R)
# 2TP/(2TP+FP+FN)
precision = getPrecision(predictions, y)
recall = getRecall(predictions, y)
F1score = 2 * precision * recall / (precision + recall)
return F1score
ROC & AUC
……………………