機器學習A-Z~Logistic Regression

之前的課程談論的都是線性迴歸問題,現在開始看看分類問題。首先講的是邏輯迴歸,英文叫做Logistic Regression。看一下下面的圖像,因變量不再如同線性迴歸那樣相對來說比較連續,這裏的數據點是離散的。

比如我們現在是一家媒體公司,有一些廣告投放,爲了讓客戶購買產品。現在收集了客戶的年齡信息和客戶是否購買的產品,那麼就得到了這些數據點。

[站外圖片上傳中...(image-3c3c49-1549943831895)]

那麼現在的問題就是如何去擬合這組數據,如果直接使用之前的線性迴歸的方法顯然是不合適的。但可以先保留之前的線性迴歸模型,我們建立模型是爲了根據自變量去預測因變量的結果,這裏要麼等於0要麼等於1.但與其預測用戶是否會購買產品,不如去預測客戶有多少概率去購買產品。對於圖像中,那些超過了0和1的範圍的,可以將其截去,用水平的直線進行代替。那麼這樣的曲線就可以預測不同年齡段購買的概率。但這個模型有幾個缺點,前後的部分都是常數而且在某一點處存在一個折點。那麼接下來看看Logistic Regression到底如何運作的。

[站外圖片上傳中...(image-51b87-1549943831895)]

首先這條黑色的直線可以當作方程$y = b_0 + b_1 * x$,這裏要運用一個機器學習領域非常常見的方程:Sigmoid Function(S函數)。

$$ p = \frac{1}{1+e^{-y}} $$

將這個方程帶入到上述公式中,會得到:

$$ ln(\frac{p}{1-p}) = b_0 + b_1 * x $$

圖像如下:

[站外圖片上傳中...(image-ce40fe-1549943831895)]

那麼看看這裏發生了什麼事情。這裏的綠色的曲線是我們表達概率$\hat{p}$的曲線。假設當前有幾個數據分別是年齡20、30、40、50。那麼其在縱座標上對應的結果也可以標記出來,得到不同的概率。

[站外圖片上傳中...(image-c60b1a-1549943831895)]

這邊畫出一條概率等於0.5的直線,在這條直線以下的我們可以預測該用戶不會購買產品,再其以上的就可以預測用戶會購買。

image

接下來我們看看如何在python中實現Logistic Regression。

現在有一組數據集,反映的是社交網絡的用戶信息及用戶看了投放廣告後是否購買產品。(這裏也只給出部分數據)

User ID Gender Age EstimatedSalary Purchased
15624510 Male 19 19000 0
15810944 Male 35 20000 0
15668575 Female 26 43000 0

這裏的步驟很簡單,首先進行數據預處理,然後使用Logistic Regression來創建一個分類器,通過分類器來預測測試集的結果,然後使用混淆矩陣來判斷這個分類器的效果。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix

data_path = "./Social_Network_Ads.csv"

dataset = pd.read_csv(data_path)
X = dataset.iloc[:, [2, 3]].values
y = dataset.iloc[:, 4].values

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)


# feature scaling
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)

# Fitting Logistic Regression to the Training set
classifier = LogisticRegression(random_state=0)
classifier.fit(X_train, y_train)

# Predicting the Test set results
y_pred = classifier.predict(X_test)

# Making the Confusion Matrix(混淆矩陣)
cm = confusion_matrix(y_test, y_pred)

其中cm的結果是:

array([[65,  3],
       [ 8, 24]])

其中8和3分別代表預測錯誤的數據個數,65和24代表預測正確的個數。得到模型後將圖像畫出來:

X_set, y_set = X_train, y_train
X1, X2 = np.meshgrid(np.arange(start=X_set[:, 0].min() - 1, stop=X_set[:, 0].max() + 1, step=0.01),
                     np.arange(start=X_set[:, 1].min() - 1, stop=X_set[:, 1].max() + 1, step=0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha=0.75, cmap=ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c=ListedColormap(('orange', 'blue'))(i), label=j)
plt.title('Classifier (Training set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()

得到的圖像如下:

[站外圖片上傳中...(image-cf7ae2-1549943831895)]

其中橫縱座標分別對應的是年齡和薪水,圖中的橘黃色的點表示用戶看到廣告後沒有購買,藍色的表示購買了的。圖中有一條很明顯的直線區分了兩種類別的數據,這條直線就叫做預測邊界。邏輯迴歸分類器是個廣義的分類器,對於線性分類器的預測邊界都是線性的,二維情況下就是一條直線,三維就是一個平面。對於非線性的分類器,預測邊界就不是直線了,後面會再討論。

接下來在將測試集的數據畫出來,得到新的圖像,代碼和訓練集基本一樣只是換了數據集:

[站外圖片上傳中...(image-3071bf-1549943831895)]

如何畫出圖像的代碼這裏不做解釋,這裏可以看出圖像上的結果和cm得到的值是一樣的。

綜上,可以觀察代碼中發現實際上使用到跟分類器相關的代碼實際上只有一處:

classifier = LogisticRegression(random_state=0)
classifier.fit(X_train, y_train)

# Predicting the Test set results
y_pred = classifier.predict(X_test)

那麼之後如果需要創建其他分類器的時候實際上只需要修改這一處的代碼即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章