機器學習-TensorFlow應用之classification和ROC curve

  • 概述
  • 這裡咱們再講一個非常常用的一種模型那就是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的問題。所以綜上所述,它也是一個非常簡單的定義的過程;

    其次當咱們用的這個classifier來predict的時候,咱們可以看出來它的結果的數據結構跟linear regressor是不同的,下面我把的的結構在Spyder中打開給大家看一下

    機器學習-TensorFlow應用之classification和ROC curve

    咱們可以看出來,它的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之前,先給大家看一個谷歌官方教程的matrix

    機器學習-TensorFlow應用之classification和ROC curve

    咱先來看看幾個概念分別是TP, TN, FP, FN; 在這個例子中我們定義Malignant 的值是True, Benign的值是False。那麼很顯然上面綠色的部分就是咱們的模型預測的跟實際的是一樣的;紅色的部分則是怎麼預測錯誤了,就是預測的跟實際的不一樣。根據Accuracy的的定義,咱們很容易就能得到下面的公式

    機器學習-TensorFlow應用之classification和ROC curve

    咱們來看看上面的例子,咱們總共的數據有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又是什麼意思呢,咱們看下面的公式

    機器學習-TensorFlow應用之classification和ROC curve

    機器學習-TensorFlow應用之classification和ROC curve

    機器學習-TensorFlow應用之classification和ROC curve

    上面的公式分別表達TPR和FPR的定義的意思,其中Specificity咱們可以將它看成是Ture Negative Rate。那麼這麼看,咱們還是有點懵懵懂懂的不知道他們的具體含有,咱們可以結合下面的圖來理解TPR, FPR

    機器學習-TensorFlow應用之classification和ROC curve

    結合上面的圖片,咱們可以認為TPR就是在所有的Positive的數據中,咱們正確預測出的Positive佔咱們整個Positive數據數量的比例; FPR就是在咱們所有的Negative的數據中, 咱們錯誤的預測的數量佔咱們整個Negative數據的比例。上面一句話一定一定要理解,否則什麼都白瞎。那麼咱們最終的ROC長什麼樣呢?看下圖

    機器學習-TensorFlow應用之classification和ROC curve

    咱們每選擇一個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是用來幹什麼的以及如何用它就行了。


    分享到:


    相關文章: