邏輯迴歸(Logistic Regression)屬於監督式學習,用於二分類問題,例如:成功或失敗、是或否、有影響或沒影響等,邏輯迴歸會分別計算出兩者的機率,機率高者為解答。抽菸是否比較容易得肺癌,預估結果為「是或否」就可以使用邏輯迴歸進行分析。
4-1 邏輯迴歸的運作原理
邏輯迴歸的運作原理的示意圖,如下。
4-2 使用sklearn實作邏輯迴歸
(1)輸入資料
train_X, test_X, train_y, test_y = train_test_split(input_data, target, test_size=0.2, random_state=42, shuffle=True)
sc = StandardScaler()
train_X_std = sc.fit_transform(train_X)
test_X_std = sc.fit_transform(test_X)
(2)建立與訓練模型
model = LogisticRegression()
model.fit(train_X_std, train_y['target'])
(3)使用模型進行預測
model.predict(test_X_std)
(4)使用混淆矩陣比較目標值與預測值的差異
cm = confusion_matrix(test_y['target'],model.predict(test_X_std))
print(cm)
4-3 邏輯迴歸模型實作範例
4-3-1 使用邏輯迴歸分類鳶尾花
使用花瓣長度與萼片長度經由邏輯迴歸預估鳶尾花的種類,本範例測資來自於sklearn.datasets的函式load_iris下載鳶尾花資料。
from sklearn.datasets import load_iris
iris = load_iris()
Step1)匯入資料
從sklearn.datasets匯入鳶尾花資料,並匯入本單元所需的所有函式庫。
程式說明
第1到9行:匯入函式庫。
第10行:使用函式load_iris匯入鳶尾花資料集到變數iris。
第11行:讀取鳶尾花資料集的data,以鳶尾花資料集的feature_names為行名稱轉換成DataFrame,當成模型的獨立變數到變數X。
第12行:讀取鳶尾花資料集的target,以target為行名稱轉換成DataFrame,當成模型的相依變數到變數y。
第13行:以行為主方式,串接X與y,使用變數iris參考到此結果。
第14行:使用函式head顯示變數iris前五筆資料。
執行結果
Step2)檢查資料
檢查資料是否有空值、資料維度大小、欄位名稱、第一筆資料內容與目標值。
程式說明
第1行:使用函式isnull檢查資料是否有空值,如果欄位有空值就會回傳True,轉換成數值1,加總結果就會是空值個數。
第2到3行:使用shape顯示資料的筆數,函式keys顯示欄位名稱。
第4到5行:使用iloc顯示指定範圍的資料內容,使用[]顯示指定欄位的資料內容。
執行結果
Step3)分析資料
使用繪圖了解資料間關係,繪圖萼片長度、花瓣長度與鳶尾花的分佈圖。
程式說明
第1行:設定繪圖的中文字型。
第2到3行:設定三種圖形標記與三種顏色,讓每一種鳶尾花使用不同圖形標記與顏色。
第4行:將顏色名稱陣列colors輸入到ListedColormap,使用cmap參考到此結果,等一下函式scatter會使用。
第5行:設定變數y為資料集iris欄位target的數值。
第6到8行:使用迴圈依序取出每一種鳶尾花,使用plt.scatter繪製萼片長度、花瓣長度與鳶尾花的分佈圖,取出資料集iris欄位「sepal length (cm)」為x,取出資料集iris欄位「petal length (cm)」為y,顏色c使用cmap,圖形標記使用陣列marker,標籤使用陣列t。
第9到10行:X軸標籤設定為「萼片長度」,Y軸標籤設定為「花瓣長度」。
第11行:圖例標記於左上方。
第12行:顯示圖片。
執行結果
由上圖可知,右上部的第1類與第2類鳶尾花混在一起,不是線性可分割問題,本範例刻意取第1類與第2類鳶尾花作邏輯迴歸,一定會發生辨識錯誤。
Step4)準備訓練資料與測試資料
準備機器學習模型的訓練資料與測試資料。
程式說明
第1行:取出iris資料集欄位「sepal length (cm)」、「petal length (cm)」與「target」,指定給變數iris。
第2行:取出iris資料集欄位「target」等於1與2(第1類與第2類鳶尾花)的資料到變數iris。
第3行:使用函式value_counts計算每兩種鳶尾花的個數。
執行結果
將資料分成測試資料集與訓練資料集。
程式說明
第1到3行:使用函式train_test_split,以iris資料集欄位「sepal length (cm)」、「petal length (cm)」為獨立變數,iris資料集欄位「target」為相依變數,隨機挑選出訓練集與測試集,原始資料的百分之70為訓練集,剩餘百分之30為測試集,設定random_state為42。
第4到6行:使用StandardScaler標準化輸入資料,讓輸入欄位「sepal length (cm)」與欄位「petal length (cm)」的平均值為0,標準差平方為1。
第7到8行:使用shape顯示訓練資料與測試資料的筆數
執行結果
Step5)建立與訓練模型
使用LogisticRegression建立模型與訓練模型。
程式說明
第1行:建立邏輯迴歸模型。
第2行:輸入訓練資料到模型進行訓練。
第3到4行:顯示模型係數與截距。
Step6)模型預測
輸入測試資料到模型進行預測。
程式說明
第1行:以test_X_std為輸入,使用函式predict進行預測,顯示結果到螢幕上。
第2行:顯示資料集test_y欄位target的數值,可以比較預測結果(第1行)與目標值(第2行)的差異。
第3行:使用函式predict_proba 計算test_X_std為輸入的機率。
使用混淆矩陣進行分析,發現有3個輸入辨別錯誤。
程式說明
第1行:輸入test_y['target']與model.predict(test_X_std)到函式confusion_matrix計算混淆矩陣,使用變數cm參考到此結果。
第2行:顯示變數cm。
本範例延伸應用 – 繪製輸入資料與邏輯迴歸分布圖
程式說明
第1行:設定繪圖的中文字形。
第2行:設定X為test_X_std。
第3行:y為test_y的欄位target的所有可能數值。
第4到5行:設定三種圖形標記與三種顏色,讓每一種鳶尾花使用不同圖形標記與顏色。
第6行:將顏色名稱陣列colors輸入到ListedColormap,使用cmap參考到此結果。
第7到8行:取出輸入資料第1行的最小值減1到x0min,最大值加1到x0max,取出輸入資料第2行的最小值減1到x1min,最大值加1到x1max。
第9行:使用函式meshgrid製作出X與Y座標點值的二維陣列,X座標值為x0min到x0max,每次遞增0.03,將此二維陣列指定給a;Y座標值為x1min到x1max,每次遞增0.03,將此二維陣列指定給b。
第10行:使用函式raval將二維陣列a與b轉換成一維陣列,再將兩個一維陣列每次取一個元素,形成X座標與Y座標的一維陣列,將X座標與Y座標的一維陣列輸入模型進行預測,就可以找出每個座標點的預測結果。
第11行:重新經由函式reshape轉換成二維陣列。
第12行:使用函式contourf繪製等高線圖形,圖形中座標點(X,Y)的顏色由Z決定。
第13到14行:設定圖形的座標軸範圍,X軸範圍由a的最小值到a的最大值,Y軸範圍由b的最小值到b的最大值。
第15到17行:使用迴圈依序取出每一種鳶尾花,使用plt.scatter繪製萼片長度、花瓣長度與鳶尾花的分佈圖。取出資料集p為資料集X的元素,其索引值同於資料集y等於t的索引值(第16行),取出資料集p的第一個欄位為x,取出資料集p的第二個欄位為y,顏色使用cmap,圖形標記使用陣列marker,標籤使用陣列t(第17行)。
第18到21行:X軸標籤設定為「萼片長度」,Y軸標籤設定為「花瓣長度」,圖例標記於左上方,最後顯示圖片。
4-3-2使用邏輯迴歸分類病人是否有糖尿病
使用病人的年齡、膽固醇、腰圍等生理資訊,經由邏輯迴歸預估病人是否有糖尿病。本範例測資來自於Kaggle網站,可以從以下網址下載diabetes.csv。
https://www.kaggle.com/houcembenmansour/predict-diabetes-based-on-diagnostic-measures
Step1)匯入資料
本範例需要函式庫seaborn,使用指令「pip install seaborn」進行安裝。
程式說明
第1到9行:匯入函式庫。
第10行:請從Kaggle網站下載diabetes.csv,讀取diabetes.csv轉換成DataFrame,儲存到變數df。
第11行:使用函式head顯示變數df的前五筆資料。
Step2)檢查資料
檢查資料是否有空值、欄位名稱、第一筆資料內容與目標值。
第1行:使用函式isnull檢查資料是否有空值,如果欄位有空值就會回傳True,轉換成數值1,加總結果就會是空值個數。
第2到3行:使用shape顯示資料的筆數,函式keys顯示欄位名稱。
第4到5行:使用iloc顯示指定範圍的資料內容,使用[]顯示指定欄位的資料內容。
Step3)處理資料
將字串欄位「diabetes」轉換成數值,欄位「chol_hdl_ratio」、「bmi」、「waist_hip_ratio」出現的逗點「,」轉換成句點「.」,並轉換成數值。
程式說明
第1行:使用函式value_counts找出欄位「diabetes」的數值與個數統計。
第2行:若欄位「diabetes」的資料為「Diabetes」則轉換為1,否則轉換成0。
第3到5行:使用函式replace將欄位「chol_hdl_ratio」、「bmi」、「waist_hip_ratio」出現的逗點「,」轉換成句點「.」,接著使用函式to_numeric轉換成數值。
第6行:使用函式head顯示變數df的前五筆資料。
Step4)分析資料
製作gender、waist與糖尿病(diabetes)的統計圖。
程式說明
第1到2行:找出diabetes與gender的人數統計關係圖,顯示到螢幕上。
第3到4行:找出diabetes與waist的人數統計關係圖,顯示到螢幕上。
Step5)準備訓練資料與測試資料
準備機器學習模型的訓練資料與測試資料。
程式說明
第1行:從df刪除欄位「diabetes」,指定給變數X。
第2到3行:使用LabelEncoder將字串欄位「gender」轉換成數值。
第4行:從df取出欄位「diabetes」,指定給變數y。
第5行:使用train_test_split將資料變數X與y隨機挑選出訓練集與測試集,原始資料的百分之80為訓練集,剩餘百分之20為測試集,設定random_state為42。
第6到8行:使用StandardScaler讓train_X與test_X的每個欄位數值的平均值為0,標準差平方為1,變數train_X_std與test_X_std參考到此結果。
第9到10行:使用shape顯示訓練資料與測試資料的筆數。
Step6)建立與訓練模型
使用LogisticRegression建立模型與訓練模型。
程式說明
第1行:建立邏輯迴歸模型。
第2行:輸入訓練資料到模型進行訓練。
第3到4行:顯示模型係數與截距。
Step7)模型預測
輸入測試資料到模型進行預測。
第1行:以test_X_std為輸入,使用函式predict進行預測,顯示結果到螢幕上。
第2行:顯示資料集test_y的數值,可以比較預測結果(第1行)與目標值(第2行)的差異。
第3行:使用函式score,可以找出模型的評分。
使用混淆矩陣進行分析,發現有10個輸入辨別錯誤。
第1行:輸入test_y與model.predict(test_X_std)到函式confusion_matrix計算混淆矩陣,使用變數cm參考到此結果。
第2行:顯示變數cm。