机器学习-TensorFlow应用之classification和ROC curve

  • 概述

前面几节讲的是linear regression的内容,这里我们再讲一个很是经常使用的一种模型那就是classification,classification顾名思义就是分类的意思,在实际的状况是很是经常使用的,例如我们能够定义房价是否太高,若是房价高于100万,则房价太高,设置成true;若是房价低于100万,则房价不高,target就能够设置成false。这里的target就只有2种,分别只有True和False,而不像我们的的linear regression那样target是连续的。在实际的应用中,这是有很是普遍的应用的,这一节的第一部分主要是讲如何用TensorFlow来训练一个classifier模型来预测classification problems。第二部分主要解释一下measure classification模型的的方法,那就是ROC curve。在linear regression中我们知道有MAE,MSE等等一些列的方式来判断我们的模型的表现怎么样,那么在classification中,MAE和MSE都不适用的,那么我们用什么measurement来判断我们的模型好很差呢?这时候就须要介绍我们的ROC curve了。数据结构

  • TensorFlow应用之Classification

若是我们的target只有2个(True/False 或者 1/0等等),这种状况我们通常称之为binary classification problem;若是我们的target的数量大于2,我们通常称之为multi_class classification problem。这两种方式不管是哪种,在我们用TensorFlow训练的时候,它的的API都是同样的,只是multi-class须要在定义模型的的时候设置一个n_classes参数而已,其余都同样。另外的建模过程跟前面章节说的同样,这一节主要介绍一下他在TensorFlow的应用中跟linear regression的区别,因此我就不会展现整个建模的过程,只会展现他们的不一样。第一个不一样就是模型定义的时候不一样,那么如今来看一下吧函数

linear_classifier = tf.estimator.LinearClassifier(feature_columns = construct_feature_columns(trainning_features),
                                                      optimizer = my_optimizer
                              ) linear_classifier
= tf.estimator.LinearClassifier(feature_columns = configure_feature_columns(), n_classes = 10, optimizer = my_optimizer, )

上面我们能够看出来有两种定义classifier的方式,他们用的是LinearClassifier()来实例化模型的,而不像linear regression那样用LinearRegressor(); 其次上面的第一种没有n_classes这个参数,则说明是binary classification,由于他的默认值就是2;上面第二种方式则说明这是一个multi_class classification的问题。因此综上所述,它也是一个很是简单的定义的过程;spa

其次当我们用的这个classifier来predict的时候,我们能够看出来它的结果的数据结构跟linear regressor是不一样的,下面我把的的结构在Spyder中打开给你们看一下code

 

 

 

 我们能够看出来,它的prediction的结果是一个list,list里面的element是dictionary,每个dictionary都有6个key-value pairs。这个dictionary的信息也是很是丰富的,从上面的图片能够看出来我们的模型计算出来的结果就是class_ids这个key对应的value,固然啦,classifier计算的结果是每一种class的几率,而后选择几率最大的那一个;几率的对于的key很显然是probabilities这个字段。在其余方面,TensorFlow在classification problem中的应用的流程基本跟linear regression是同样的。对象

  • Classifier measurement
  •   Accuracy

  咱们知道在前面的linear regression中,我们能够用MAE,MES等等measurements来判断一个模型是否好呢?这里对于binary classification的问题,我们能够常用Accuracy, ROC等方式来判断一个模型是否合格,另外在multi-classes的场景中,我们也可使用Accuracy和logloss等方法来判断,可是英文accuracy有它固定的缺陷,因此我们常常不拿它做为最终参考的对象,只起一个辅助的做用。好了,那么我们接下来来分别讲述一下他们的细节部分,在正式将这些metric以前,先给你们看一个谷歌官方教程的matrixblog

 

 咱先来看看几个概念分别是TP, TN, FP, FN; 在这个例子中咱们定义Malignant 的值是True, Benign的值是False。那么很显然上面绿色的部分就是我们的模型预测的跟实际的是同样的;红色的部分则是怎么预测错误了,就是预测的跟实际的不同。根据Accuracy的的定义,我们很容易就能获得下面的公式教程

 

 我们来看看上面的例子,我们总共的数据有100条,分别有91个Benign(良性), 9个Malignant(恶性); 若是我们的模型预测的结果如上的matrix所示,那么根据accuracy的公式,我们能够看出咱的的准确率高达91%,看其实还不错哦,对吧?那么我们能用这个模型来预测吗??答案是不能够!!!我们来仔细分析一下哈,上面的数据一共有9个malignant 恶性肿瘤,但是我们的模型居然只准确的预测出一个malignant (TP),其余的8个malignant居然都没有预测出来,很显然这是有很大问题的!!!!那么为何我们的accuracy仍是这么高呢??这是由于我们的数据target的分布是很是不均匀的,换句话说我们的数据是class-imbalanced dataset, 例如我们的数据中有高达91%的Benign, 只有19%的的malignant,这个数据是很是不平衡的;我们再举个极端的例子,上面的状况,即便我们的模型prediction始终等于Negative,即不管什么数据送进来,我们的预测结果始终都是Negative, 我们的accuracy也是高达91%,这是否是很不合理??因此在判断我们模型的时候,必定要慎用accuracy,尤为是在class-imbalanced dataset中。图片

  •   AUC-ROC Curve

这个是我们在binary classification problem中判断一个模型好坏的一个最经常使用的一种方式, AUC是Aera Under Curve的缩写,很显然它是一个计算一条曲线下面的面积的函数, ROC是Receiver Operating Characteristics的缩写;那么根据名字我们就知道AUC-ROC curve就是计算ROC curve下面的面积的一个方法。那么ROC curve到底长什么样呢?首先ROC的纵坐标是TPR(Ture Positive Rate), 横坐标是FPR(False Positive Rate). 那么具体的TPR和FPR又是什么意思呢,我们看下面的公式ci

 

 

 

 

 

 上面的公式分别表达TPR和FPR的定义的意思,其中Specificity我们能够将它当作是Ture Negative Rate。那么这么看,我们仍是有点懵懵懂懂的不知道他们的具体含有,我们能够结合下面的图来理解TPR, FPRelement

 

 结合上面的图片,我们能够认为TPR就是在全部的Positive的数据中,我们正确预测出的Positive占我们整个Positive数据数量的比例; FPR就是在我们全部的Negative的数据中, 我们错误的预测的数量占我们整个Negative数据的比例。上面一句话必定必定要理解,不然什么都白瞎。那么我们最终的ROC长什么样呢?看下图

 

我们每选择一个threshold,咱ROC上面就绘制一个点,经过选择多个threshold最终画出了上面的ROC curve。 那么接着问题又来了,我们既然已经绘制了ROC curve,我们如何用它来判断我们模型的好坏呢?其实就是经过计算ROC curve下面的面积(AUC)来判断的, AUC的意思是表明这这个模型分辨我们classes的能力!!!!记住这句话,必定要记住。AUC->1表明着我们的模型可以彻底分辨出classes,AUC->0则说明我们的模型预测的classes彻底是相反的,其实这种状况也很是好,我们只须要经过简单的取反就可以达到几乎完美的模型;最差的一种状况是AUC-> 0.5,这个时候意味着我们的模型一点分辨能力都没有,跟我们胡乱猜的结果是同样的。

  • Log Loss

根据我们的分析,上面的ROC的方式只适用于binary classes的状况,那么若是我们的classes有不少怎么办,例若有10个classes,这时候我们就没法经过计算AUC-ROC的方式来判断我们的模型了,我们就得经过另一种方式来判断我们的模型好坏了,那么这个就是Log Loss了。具体LogLoss的数学意义以及原理,我会在下一节来解释,这里我就用最简单的方式演示一下他的应用,其实在classification problem中,我们的loss function就是Log Loss, 在linear regression中我们的loss function是 Mean Squared Error. 具体它们的意义,我会在后面的一节详细的展现它们的意义和推导过程。好了,那么如今我们来看一下,我们如何计算出我们的log loss从而来判断出我们classfier是否是一个好的可用的模型

trainning_predictions_one_hot = tf.keras.utils.to_categorical(trainning_class_id,10)
metrics.log_loss(trainning_targets, trainning_predictions_one_hot)
  • 总结

上面我们介绍了一些classification 模型在训练中和linear regression不同的地方,以及用什么metrics来最终判断我们的classification模型,这里介绍了一下Accuracy, AUC-ROC和Log Loss. 其中的重点是AUC-ROC的含义和过程,而后知道Accuracy的一些应用场景,觉得为何有时候不能用它。最后了解一下Log loss是用来干什么的以及如何用它就好了。

相关文章
相关标签/搜索