機器學習-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是用來幹什麼的以及如何用它就好了。

相關文章
相關標籤/搜索