邏輯迴歸用於解決「二分類」問題,好比判斷明天是晴是雨,判斷一封郵件是不是垃圾郵件,判斷腫瘤是不是惡性的等等。python
讓咱們舉個例子來講明爲何這類問題適合用邏輯迴歸而不是線性迴歸來解決。git
假如咱們想用腫瘤的大小判斷它是否爲惡性,根據樣本,獲得以下的線性迴歸模型:github
看起來這條線擬合地並非很使人滿意,但彷佛仍是可以解決問題的,咱們把輸出的中值做爲閾值,就能夠獲得正確的分類結果。算法
但若是在右側再加入一個樣本,直線會發生如下改變:dom
很明顯出現了矛盾。這個時候,假如咱們用於預測的模型長下面這樣:函數
好像問題就迎刃而解了呢!那麼什麼函數長這樣呢?通過一些科學的設想與推導(參考「阿拉丁吃米粉的文章 - 邏輯迴歸的簡單解釋」),咱們發現 Sigmoid 函數,即測試
$$S(x) = \frac{1}{1 + e^{-\theta x}}$$.net
很是符合這個特性,並且與咱們須要解決的問題的思路——經過機率來判斷分類的狀況相統一。code
接下來,問題變成了求 $\theta$ 的值,與線性迴歸同樣,咱們能夠找出損失函數,再使用梯度降低法(參考「邏輯迴歸詳解」、「如何理解梯度降低法」)來求得 $\theta$。orm
對有多元輸入的狀況,則須要求出 $\theta^T$。
示例數據地址:GitHub - Avik-Jain/100-Days-Of-ML-Code/datasets
# 導入庫 import numpy as np import matplotlib.pyplot as plt import pandas as pd # 導入數據 dataset = pd.read_csv('Social_Network_Ads.csv') X = dataset.iloc[:, [2, 3]].values y = dataset.iloc[:, 4].values # 分割 from sklearn.cross_validation import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0) # 特徵縮放 from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test)
# 擬合邏輯迴歸模型 from sklearn.linear_model import LogisticRegression classifier = LogisticRegression() classifier.fit(X_train, y_train)
這裏咱們使用「混淆矩陣」來評估預測的結果。混淆矩陣就是將預測的結果與測試集中實際的結果進行對比,好比矩陣
$$\begin{bmatrix}12
& 1\ 2
& 14
\end{bmatrix}$$
是指預測爲第 1 類,實際也爲第 1 類的結果有 12 個,預測爲第 2 類,實際爲第 1 類的結果有 1個;
預測爲第 1 類,實際爲第 2 類的有 2 個,預測爲第 2 類,實際也爲第 2 類的有14 個。
# 使用測試集預測 y_pred = classifier.predict(X_test) # 構建混淆矩陣 from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_test, y_pred)
能夠看出,實際應用時使用的代碼很是簡單。可是咱們只有理解了算法自己,才能更好地利用它。
歡迎關注 Evan 的博客