Machine Learning (6) - Logistic Regression (Binary Classification)

Rachel發表於2019-06-07

引言

Machine Learning (6) - Logistic Regression (Binary Classification)

我們前面學習了 Linear Regression,它可以用於房價,天氣,股價等的預測,會發現這些場景的資料值都是連續性的。因此可以總結,Linear Regression 用於預測連續的值。

而在現實中還有另外一種場景,比如,判斷郵件是否為垃圾郵件,判斷某人是否會買保險,或者是判斷某人會投票給共和黨還是民主黨等。這些場景有個共同的特點,就是要預測的值是一種明確的分類。我們把這種問題稱為 Classification (分類) 問題。可以用 Logistic Regression 來解決。

Machine Learning (6) - Logistic Regression (Binary Classification)

Classification (分類) 問題還分為兩種情況,一種是預測的值只有 yes 或 no 兩種分類,我們把這種分類問題稱為 Binary Classification, 另一種是預測值是多種分類。

這節課先來看 Binary Classification 的處理方法。

正文

Machine Learning (6) - Logistic Regression (Binary Classification)

假如你是一個保險公司的資料分析師,任務是在已知上述資料的前提下,做分析,預測一個人購買保險的可能性。目測這個表的數值,可以大概看出,年輕人買的可能性比較小,年紀大的人買的可能性比較大。

引入資料

import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline

df = pd.read_csv('/Users/rachel/Downloads/py-master/ML/7_logistic_reg/insurance_data.csv')

輸出

Machine Learning (6) - Logistic Regression (Binary Classification)

圖形化輸出目前的資料分佈

plt.scatter(df.age, df.bought_insurance, marker='+', color='red')

Machine Learning (6) - Logistic Regression (Binary Classification)

拆分訓練資料和測試資料

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(df[['age']], df.bought_insurance, test_size=0.1)

引入模型並訓練

from sklearn.linear_model import LogisticRegression
model = LogisticRegression(solver='lbfgs')
// 訓練模型
model.fit(X_train, y_train)

// 用測試資料預測
model.predict(X_test) // 輸出 array([1, 0, 0])

// 測試資料實際的值
X_test

輸出

Machine Learning (6) - Logistic Regression (Binary Classification)

來分析一下預測資料的合理性,預測的值是 1,0,0,對應著年齡來看,就是 50歲的人會買保險,29歲和 30歲的人不會買保險。這也符合我們最初的分析。

檢視模型精度

下面用 score() 函式檢視模型的準確度:

model.score(X_test, y_test) // 輸出 1.0, 由於資料量小, 所以準確度非常高

// 精確檢視每個資料傾向的百分比
model.predict_proba(X_test)

array([[0.19136177, 0.80863823],
       [0.76147559, 0.23852441],
       [0.87036695, 0.12963305]])

// 隨意預測一個年齡
model.predict([[25]]) // 輸出 array([0]),意味著不買的可能性比較大

相關文章