2018年4月22日

[TF.5]分类与评估

本文参考《Google机器学习速成课程》分类

评估方式

2158851404.jpg

准确率|识别率 Accuracy=\dfrac{TN+TP}{All}

错误率|误分类率 Error Rate=\dfrac{FP+FN}{All}

当使用分类不平衡的数据集时,准确率并不能反映全面情况

精确率|精度 Precision=\dfrac{TP}{TP+FP}

真正例率|敏感度|召回率 Recall=\dfrac{TP}{P}

真负例率|特效性 Specificity=\dfrac{TN}{N}

精确率和召回率往往此消彼长

分类操作工程化

# 线性多分类器
linear_classifier = tf.estimator.LinearClassifier(
      feature_columns=construct_feature_columns(training_examples),
      optimizer=my_optimizer
  )
# 获取实值预测概率
training_probabilities = linear_classifier.predict(input_fn=predict_training_input_fn)
    training_probabilities = np.array([item['probabilities'] for item in training_probabilities])
#获得一个多维数组[[0.813 0.184][0.821 0.179]...[0.557  0.443]]
# 使用Sklearn 的 log_loss 函数可基于这些概率计算对数损失函数
training_log_loss = metrics.log_loss(training_targets, training_probabilities)
#LinearClassifier.evaluate 可计算准确率和 AUC 等实用指标
predict_validation_input_fn = lambda: my_input_fn(validation_examples,
                               validation_targets["median_house_value_is_high"],
                               num_epochs=1,
                               shuffle=False)
evaluation_metrics = linear_classifier.evaluate(input_fn=predict_validation_input_fn)
print "AUC on the validation set: %0.2f" % evaluation_metrics['auc']
print "Accuracy on the validation set: %0.2f" % evaluation_metrics['accuracy']

ROC曲线

在逻辑回归里,我们会设一个阈值,大于这个值的为正类,小于这个值为负类。如果我们减小这个阀值,那么更多的样本会被识别为正类。这会提高正类的识别率,但同时也会使得更多的负类被错误识别为正类。为了形象化这一变化,引入ROC(Receiver Operating Characteristic)
ROC曲线有个很好的特性,当测试集中的正负样本的分布变化的时候(类不平衡现象),ROC曲线能够保持不变,因此更适合用于评价一个分类器好坏
AUC(Area Under Curve)被定义为ROC曲线下的面积,AUC值越大的分类器,正确率越高


# 绘制 ROC 曲线
# 使用类别概率(例如由 LinearClassifier.predict 和
validation_probabilities = linear_classifier.predict(input_fn=predict_validation_input_fn)
#只要预测为正的那一列
validation_probabilities = np.array([item['probabilities'][3] for item in validation_probabilities])
#使用Sklearn的 roc_curve 来获得所需的TP和FP
false_positive_rate, true_positive_rate, thresholds = metrics.roc_curve(
    validation_targets, validation_probabilities)
#FP:[0.0000e+00 0.0000e+00 2.6788e-04 ... 9.9785e-01 9.9785e-01 1.0000e+00]
#TP:[7.8926e-04 2.3677e-03 2.3677e-03 ... 9.9921e-01 1.0000e+00 1.0000e+00]
#th:[9.9380e-01 9.7655e-01 9.7536e-01 ... 1.3434e-05 8.5868e-06 6.9566e-14]
plt.plot(false_positive_rate, true_positive_rate, label="our model")
plt.plot([0, 1], [0, 1], label="random classifier")
_ = plt.legend(loc=2)

tf5-roc.png

Share

You may also like...

发表评论

您的电子邮箱地址不会被公开。