使用邏輯回歸預(yù)測用戶是否會購買SUV
往期推薦
機器學(xué)習(xí)100天學(xué)習(xí)計劃?— 第3天?多元線性回歸
這是機器學(xué)習(xí)100天學(xué)習(xí)計劃的第4天,我們將探討邏輯回歸存在的必要性、邏輯回歸訓(xùn)練時的數(shù)據(jù)要求、邏輯回歸的基本運行原理。
文章的最后我們會做一個簡單應(yīng)用:使用邏輯回歸預(yù)測用戶是否會購買SUV.
01
為什么需要邏輯回歸?
從前面的學(xué)習(xí)中知道,線性回歸對數(shù)據(jù)的要求非常嚴格,比如自變臉必須滿足正態(tài)分布,特征之間的多重共線性需要消除,實際生活中的數(shù)據(jù)無法徹底滿足這些要求,因此它在現(xiàn)實場景中的應(yīng)用效果有限。
為了解決那些不滿足線性回歸的嚴格要求的數(shù)據(jù)分析需求,我們需要邏輯回歸。
邏輯回歸由線性回歸變化而來,它對數(shù)據(jù)的要求沒那么高,分類效力很強,對數(shù)據(jù)不需要做消除多重共線性之類的預(yù)處理。邏輯回歸有以下三個優(yōu)點:
1.邏輯回歸對線性關(guān)系的擬合效果好到喪心病狂,比如電商營銷預(yù)測、信用卡欺詐、打分等實際落地應(yīng)用相關(guān)的數(shù)據(jù)都是邏輯回歸的強項。
2.對于線性數(shù)據(jù),邏輯回歸的擬合和計算非???/strong>,尤其對于大數(shù)據(jù),這點優(yōu)勢極其明顯。
3.邏輯回歸返回的分類結(jié)果不是固定的0或1,而是以小數(shù)形式反饋的類概率數(shù)字,因此你可以把邏輯回歸返回的結(jié)果當成連續(xù)型數(shù)據(jù)使用。
邏輯回歸的原理不簡單,細節(jié)非常多,不是在本篇文章能講完的,所以本篇文章主要是給大家提供邏輯回歸的使用方法及其注意事項,并以一個小應(yīng)用為例入門邏輯回歸。
02
邏輯回歸數(shù)據(jù)要求
邏輯回歸對數(shù)據(jù)并不是沒有要求,下面就是使用邏輯回歸分析前需要注意的幾個問題:
1.樣本數(shù)量最好大于300.
2.自變量最好是“分類”的形式。
3.模型運行前去除異常值和缺失值。
你并不需要嚴格遵守上述要求,遇到特殊情況可以靈活變通。
03
邏輯回歸如何工作

上述內(nèi)容可能你不一定能看得懂,沒關(guān)系,往后看我們的實操訓(xùn)練,動手實操后你一定有所收獲。
04
預(yù)測用戶是否會購買SUV
現(xiàn)在有一個數(shù)據(jù)集包含了社交網(wǎng)絡(luò)中用戶的信息。這些信息涉及用戶ID,性別,年齡以及預(yù)估薪資。一家汽車公司剛剛推出了他們新型的豪華SUV,我們嘗試預(yù)測哪些用戶會購買這種全新SUV。并且在最后一列用來表示用戶是否購買:

接下來我們將建立一種邏輯回歸模型來預(yù)測用戶是否購買這種SUV,該模型基于兩個變量,分別是年齡和預(yù)計薪資。因此我們的特征矩陣將是這兩列。我們嘗試尋找用戶年齡與預(yù)估薪資之間的某種相關(guān)性,以及他是否購買SUV的決定。
本文數(shù)據(jù)集和源代碼可在Python實用寶典公眾號后臺回復(fù):機器學(xué)習(xí)4?下載。
4.1
數(shù)據(jù)預(yù)處理
導(dǎo)入庫:
import?numpy as?np
import?matplotlib.pyplot as?plt
import?pandas as?pd導(dǎo)入數(shù)據(jù)集,為了方便可視化,我們暫時去除了性別這一列:
dataset = pd.read_csv('Social_Network_Ads.csv')
X = dataset.iloc[:, [2, 3]].values
Y = dataset.iloc[:,4].values將數(shù)據(jù)集分成訓(xùn)練集和測試集:
from?sklearn.model_selection 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)4.2
邏輯回歸模型
邏輯回歸是一個線性分類器,這意味著我們在二維空間中,我們兩類用戶(購買和不購買)將被一條直線分割。
將邏輯回歸應(yīng)用于訓(xùn)練集:
from?sklearn.linear_model import?LogisticRegression
classifier = LogisticRegression()
classifier.fit(X_train, y_train)4.3
預(yù)測
預(yù)測測試集結(jié)果:
y_pred = classifier.predict(X_test)4.4
模型評估
剛剛我們預(yù)測了測試集?,F(xiàn)在我們將評估邏輯回歸模型是否正確的學(xué)習(xí)和理解數(shù)據(jù)。我們將用到混淆矩陣:
混淆矩陣是一種可視化工具,矩陣的每一列代表一個類的實例預(yù)測,而每一行表示一個實際的類的實例。之所以如此命名,是因為通過這個矩陣可以方便地看出機器是否將兩個不同的類混淆了。
生成混淆矩陣:
from?sklearn.metrics import?confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print(cm)結(jié)果如下:
[[65??3]
?[ 8?24]]

這說明,分類正確的值有65+24=89個,分類錯誤的值有3+8=11個,準確率為89%.
可視化的代碼如下:? ? ? ? ? ? ? ? ? ? ? ? ??

對于訓(xùn)練集,我們訓(xùn)練得到的分隔線如上圖所示,存在部分的錯誤分類,但大部分數(shù)據(jù)點都分類正確。

使用訓(xùn)練集得到的分割線來分隔測試集,分類結(jié)果如上圖所示,有11個錯誤分類的點。
05
加上性別一列進行預(yù)測
剛剛為了可視化結(jié)果,我們?nèi)サ袅诵詣e這一列進行訓(xùn)練和測試。
但性別對結(jié)果的影響是實際存在的,所以我們將性別重新加入訓(xùn)練集中進行訓(xùn)練并測試。
改動非常簡單,只需要在導(dǎo)入數(shù)據(jù)集的時候?qū)⑿詣e這一列加回來,并將性別轉(zhuǎn)化為數(shù)字:
# 1.導(dǎo)入數(shù)據(jù)集
dataset = pd.read_csv('Social_Network_Ads.csv')
X = dataset.iloc[:, [1, 2, 3]].values
Y = dataset.iloc[:, 4].values
# 性別轉(zhuǎn)化為數(shù)字
labelencoder_X = LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[:, 0])完整代碼如下:
# 生成混淆矩陣
from?sklearn.metrics import?confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print(cm)結(jié)果如下:
(base) G:\push\20210117>python test_with_gender.py
[[65 3]
?[?7 25]]可見,分類正確的值有65+25=90個,分類錯誤的值有3+7=10個,準確率為90%.
這相比于除去性別這一列時得到的89%準確率的測試結(jié)果有1%的提升。
我們的文章到此就結(jié)束啦,如果你喜歡今天的Python 實戰(zhàn)教程,請持續(xù)關(guān)注Python實用寶典。
有任何問題,可以在公眾號后臺回復(fù):加群,回答相應(yīng)紅字驗證信息,進入互助群詢問。
原創(chuàng)不易,希望你能在下面點個贊和在看支持我繼續(xù)創(chuàng)作,謝謝!
點擊下方閱讀原文可獲得更好的閱讀體驗
Python實用寶典?(pythondict.com)
不只是一個寶典
歡迎關(guān)注公眾號:Python實用寶典
