從這兒開始,來到一個新的機器學習領域,跑迴歸的時候我們可以拿資料來預測「值」,而本章則進一步介紹如何根據訓練資料辨識「類別」,是一種監督式學習,在實際應用上也很廣泛。
舉個簡單的例子,現在你有一筆客戶資料,你想知道那些客戶會留下來、那些客戶不留,你就可以建立一個客戶流失率的模型。那假設你預測到這些客戶要走了,就可以開始發送優惠、詢問反饋,或做出某些改變~
另外常見的案例也包含,電子郵件: 電子郵件大概要怎麼分類呢? 普通? 促銷? 重要? 垃圾郵件? 雖然講者沒有詳細說明背後的機制,但基本上也是透過機器學習模型,根據信件的特徵將郵件分類到不同的類別。
還有個案例,就是圖像識別,在一堆可愛動物的照片中,要怎麼分辨貓還是狗? 也是Classification在機器學習的重要應用情境。
而 Classification 第一個介紹的方法,就是 Logistic Regression,
Logistic Regression 可以根據自變數,預測資料屬於某個分類的機率,進而將資料歸類到不同的類別。
例如,維基百科中的一個範例,是利用「讀書時間」來預測「考試通過的機率」。其中,自變數就是讀書時間,而我們希望預測的則是考試通過與否。
這裡的資料分布和前面介紹的線性迴歸不太一樣。線性迴歸通常會得到一條直線,而 Logistic Regression 則會得到一條類似 S 型的曲線,講者就直接稱他S-curve,會如下圖:
而我們可以看到資料的分布跟訓練資料求出來的曲線(S curve),這曲線是根據訓練資料建立出來的模型,用來表示「自變數的數值」與「屬於某個類別的機率」之間的關係。例如讀書兩小時考過的機率是25%。接著,我們可以設定一個分類門檻,例如 50%。當預測機率高於 50% 時,就將資料分類為「會通過」;低於 50% 時,則分類為「不會通過」。
因此,當我們輸入一個新的資料,例如某個人讀了 1 小時或 3 小時,就可以透過模型預測他考試通過的機率。如果讀了 3 小時後,預測機率已經高於 50%,我們就可以將他歸類為「可能會通過」。換句話說,也可以根據模型的結果,推論出讀書時間與考試通過機率之間的關係。
Maximum Likelihood
而S curve 並不是只有一種,根據訓練資料可以得到很多個,那哪一條才是最好的?這時候就可以用Maximum likelihood去評估S curve 的好壞,作法如下:
可以先把訓練資料中的真實結果帶入模型,觀察模型對這些結果所給出的機率。
例如,假設有幾個「最後考過」的學生,他們分別讀了不同的時間。模型根據這些學生的讀書時間,可能預測他們考過的機率分別為:15%、28%、50%……
另一方面,對於實際上「沒有考過」的學生,我們則要看模型預測他們「沒有考過」的機率。例如,一個完全沒有準備的人,模型可能預測他「考過」的機率只有 5%,因此「沒考過」的機率就是:1 - 5% = 95%
如果另一個人讀了一小時,模型預測他考過的機率是 10%,那麼他沒考過的機率就是:1 - 10% = 90%
以此類推,我們就可以把每一筆訓練資料對應的「真實結果發生的機率」記錄下來。接著,把這些機率全部乘在一起,例如:15% × 28% × 50% × 95% × 90% × ……
最後得到的結果,就是這個模型對目前訓練資料的 Likelihood(概似值)。我們會嘗試尋找一組模型參數,使這個 Likelihood 最大化。簡單來說,就是找出一條 S-curve,讓模型對訓練資料中「實際發生的結果」給出盡可能高的機率。因此,能夠讓 Likelihood 最大的模型,就會是我們所選擇的最佳模型。
實作
實作上前面資料處理的步驟跟迴歸一樣:先讀取函式庫>載入資料>將資料分成自變數&依變數>將資料分組(train & test),接著對自變數做feature scaling處理,然後就可以開始做logistics regression了。
https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
Logistic regression 使用的是sklearn中的linear_model函式庫,就把他們呼叫出來~from sklearn.linear_model import LogisticRegression
接著就是宣告模型變數並帶入資料訓練lr=LogisticRegression(random_state = 0) #0只是為了求出跟講師依樣的結果、實際上可以不用設定喔~lr.fit(x_train,y_train) #這兒就是帶入資料並訓練拉
最後用predict方法就可以得到預測值,比方說我可以lr.predict([[自變數1,自變數2]])然後得到對應的分類結果,但但但,這兒又有一個細節要注意,我們做模型時已經有先用feature scaling處理過資料,所以我們必須要把prdict的輸入值寫為lr.predict(sc_transform([[自變數1,自變數2]])) # sc是做feature scaling時宣告過的 sc = StandardScaler()
不過、又回到每一章節我都會問自己的問題: 我怎麼知道這結果好不好呢? 答案就是、把結果print出來惹,
比較簡單一點的方式是把資料列出來
[預測值|實際值]
[0|0]
[0|1]....
講師另外介紹了混淆矩陣+accuracy score的方法
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html
混淆矩陣的自我介紹已經非常清楚的說明這個工具是幹嘛用的,就是拿來評估classification準不準確的^^
Compute confusion matrix to evaluate the accuracy of a classification
網站已經有給sample
from sklearn.metrics import confusion_matrix
y_true = [2, 0, 2, 2, 0, 1]
y_pred = [0, 0, 2, 2, 0, 2]
confusion_matrix(y_true, y_pred)
算完會得到一個矩陣,以下是範例矩陣
[65 3
2 24]
恩有sense的人應該到這兒已經看得懂了,但我沒sense哈哈哈,所以畫成表格會比較好懂,繼續使用考試跟讀書時長的案例
| /// | 模型預測考過 | 模型預測沒考過 |
|---|---|---|
| 實際考過 | 65 | 3 |
| 實際沒考過 | 2 | 24 |
這樣子你大概就知道準確度多高了,就5個沒預測到,感覺是預測的挺好的,但講求一點也可以用 accuracy score計算一個分數,附上官網的sample,沒做什麼參數設定的話,最佳值的分數就是1~
from sklearn.metrics import accuracy_score
y_pred = [0, 2, 1, 3
y_true = [0, 1, 2, 3]
accuracy_score(y_true, y_pred)
accuracy_score(y_true, y_pred, normalize=False)
視覺化的部分就不細寫了、因為其實用途不大(&個人蠻討厭視覺化的XD、code很難寫&做出來也不能給評估,不過視覺化對做簡報還是很需要的=w=,所以看用途囉)
想拿真實案例實作&學習的話可以註冊這個免費課程:
https://www.udemy.com/course/logistic-regression-cancer-detection-case-study/?referralCode=7E62BC258B645C95D9F5
視覺化的部分確實很麻煩,有時候要呈現都會想說直接PPT 弄一個把數值丟上去,參數有時候一直都會設錯,超級搞![]()