原文鏈接:https://blog.csdn.net/qq_32575047/article/details/118524105
<<從零入門機器學習>> 邏輯回歸之預測考生是否通過考試
目錄
- 1. 學習前需要掌握的知識以及問題背景
- 1.1 學習知識背景
- 1.2 考生成績預測問題以及本實戰(zhàn)的原始數據(testdata.csv文件放在文章的末尾,自行取)
- 2. 根據具體步驟解決問題
- 2.1 基于testdata.csv數據啡彬,建立邏輯回歸模型酷麦,評估模型的表現。
- 2.2 預測Exam1 = 75,Exam2 = 60時柜思,該同學能否通過Exam3房维。
- 2.3 建立二階邊界函數,重復任務1,2步驟每窖。
1. 學習前需要掌握的知識以及問題背景
1.1 學習知識背景
學習本實戰(zhàn)例子前提需要掌握機器學習中邏輯回歸的概念帮掉,Python的基礎語法,MSE窒典,R2_score等變量的含義蟆炊,以及數學求解過程,本篇博客默認是基于掌握如上知識點進行的瀑志。
1.2 考生成績預測問題以及本實戰(zhàn)的原始數據(testdata.csv文件放在文章的末尾涩搓,自行取)
如下是usa_housing_price.csv文件的部分數據截圖污秆,可見Exam1和Exam2兩個屬性都會影響到學生是否能通過下一次的考試(Pass:指的是學生下一次考試是否能通過 0-不能通過 1-能通過)。
現在基于testdata.csv數據昧甘,建立邏輯回歸模型良拼,預測考生是否能通過接下來的考試。主要預測問題分為三個步驟充边,如下所示:
1\. 基于testdata.csv數據庸推,建立邏輯回歸模型,評估模型的表現浇冰。
2\. 預測Exam1 = 75贬媒,Exam2 = 60時,該同學能否通過Exam3肘习。
3\. 建立二階邊界函數际乘,重復任務1,2步驟。
2. 根據具體步驟解決問題
2.1 基于testdata.csv數據漂佩,建立邏輯回歸模型脖含,評估模型的表現。
2.1.1 將testdata.csv文件通過pandas的read_csv(path)方法讀取到內存中來投蝉,然后通過head()方法查看文件的部分內容特征养葵,如下代碼和圖所示:
注意read_csv方法當中的path是存放testdata.csv文件的本地路徑,每個人存放的路徑都不同墓拜,可以自定義港柜。
import pandas as pd
import numpy as np
data = pd.read_csv('D:/Google/picture/usa_housing_price.csv')
data.head()
data.head()方法顯示出的內容和我們表格的表頭內容格式一致,只不過其只顯示源文件內容的一部分咳榜。
2.1.2 引入matplotlib包將Exam1作為x軸夏醉、Exam2作為y軸,可視化testdata.csv文件的數據涌韩,如下圖所示:
%matplotlib inline #在console中生成圖像
from matplotlib import pyplot as plt
fig1 = plt.figure()
plt.scatter(data.loc[:,'Exam1'],data.loc[:,'Exam2'])
plt.title('Exam1-Exam2')
plt.xlabel('Exam1')
plt.ylabel('Exam2')
plt.show()
2.1.3 將Pass特征值等于1賦值給mask變量畔柔,以mask變量作為分類的標簽,將testdata.csv分為兩類數據臣樱,如下圖所示:
mask = data.loc[:,'Pass'] == 1
fig2 = plt.figure()
passed = plt.scatter(data.loc[:,'Exam1'][mask],data.loc[:,'Exam2'][mask])
failed = plt.scatter(data.loc[:,'Exam1'][~mask],data.loc[:,'Exam2'][~mask])
plt.title('Exam1-Exam2')
plt.xlabel('Exam1')
plt.ylabel('Exam2')
plt.legend((passed,failed),('passed','failed'))
plt.show()
2.1.4 將Exam1和Exam2作為x變量靶擦,Pass作為y變量,調用sklearn的邏輯回歸模型雇毫,訓練數據玄捕,代碼如下:
#define x,y x->Exam1,Exam2 y->Pass
x = data.drop(['Pass'],axis=1) #axis->縱坐標 Exam1和Exam2
y = data.loc[:,'Pass'] #取出Pass->y
x1 = data.loc[:,'Exam1']
x2 = data.loc[:,'Exam2']
print(x.shape)
#establish the model and train it 模型訓練
from sklearn.linear_model import LogisticRegression
LR = LogisticRegression()
LR.fit(x,y)
2.1.5 把訓練集x作為輸入參數,傳入到訓練好的模型中預測y的值y_predict棚放,如下代碼所示:
#show the predicted result and its accuracy
y_predict = LR.predict(x)
print(y_predict)
2.1.6 將y和y_predict傳入accuracy_score方法并計算其系數枚粘,計算出的分數為0.89(系數越接近1越好):
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y,y_predict)
print(accuracy)
2.1.7 邏輯回歸一階邊界函數式為:theta0 + theta1 * x1 + theta2 * x2 = 0;我們通過剛剛訓練的模型LR飘蚯,可以求出theta0 馍迄、theta1和theta2福也,代碼如下:
theta0 = LR.intercept_ #theta0 + theta1*x1 + theta2*x2 = 0 邊界函數
theta1,theta2 = LR.coef_[0][0],LR.coef_[0][1]
print(theta0,theta1,theta2)
2.1.8 這時我們的一階邊界函數表達式就出來了,我們用上面的x1變量(代表Exam1)攀圈,將x1代入函數表達式中求解出x2_new暴凑,然后劃出x1在邊界函數對應下的x2_new(Exam2),如下圖所示:
#用原始數據的Exam1 ->x1 通過邊界函數求解新的x2_new 然后畫出直線
x2_new = -(theta0 + theta1*x1) / theta2
print(x2_new)
fig3 = plt.figure()
passed = plt.scatter(data.loc[:,'Exam1'][mask],data.loc[:,'Exam2'][mask])
failed = plt.scatter(data.loc[:,'Exam1'][~mask],data.loc[:,'Exam2'][~mask])
plt.plot(x1,x2_new)
plt.title('Exam1-Exam2')
plt.xlabel('Exam1')
plt.ylabel('Exam2')
plt.legend((passed,failed),('passed','failed'))
plt.show()
2.2 預測Exam1 = 75赘来,Exam2 = 60時现喳,該同學能否通過Exam3。
2.2.1 將Exam1和Exam2傳入到LR的算法模型計算出是否該同學能通過Exam3的考試:
#exam1 = 70,exam2=65
y_test = LR.predict([[70,65]])
print('passed' if y_test==1 else 'failed')
2.3 建立二階邊界函數撕捍,重復任務1,2步驟拿穴。
2.3.1 通過以上的分析,建立一階邊界函數忧风,訓練數據集計算accuracy_socre以及可視化結果,達到的效果差強人意球凰,那么我們嘗試建立邏輯回歸的二階邊界函數狮腿。嘗試建立二階邊界函數:theta0+theta1 * x1+theta2 * x2+theta3 * x1^2+theta4 * x2^2+theta5 * x1 * x2,顯然可見我們需要求解以下的變量:(x_new只是將這幾個變量合在一起呕诉,然后轉換成矩陣)
#create new data
x1_2 = x1 * x1
x2_2 = x2 * x2
x1_x2 = x1 * x2
x_new = {'x1':x1,'x2':x2,'x1_2':x1_2,'x2_2':x2_2,'x1_x2':x1_x2}
x_new = pd.DataFrame(x_new)
print(x_new)
2.3.2 將x_new和y放入LR2訓練模型缘厢,并評估分數為1.0,代碼如下:
LR2 = LogisticRegression()
LR2.fit(x_new,y)
y2_predict = LR2.predict(x_new)
accuracy2 = accuracy_score(y,y2_predict)
print(accuracy2)
2.3.3 通過上面的二階邊界函數和訓練出來的LR算法模型甩挫,可以計算出二階函數表達式的幾個參數:
#二階邊界函數 theta0+theta1*x1+theta2*x2+theta3*x1^2+theta4*x2^2+theta5*x1*x2
#ax^2+bx+c=0-> x1 = (-b+(b^2-4ac)^5)/2a,x1 = (-b-(b^2-4ac)/2a)(分數不可以為負,舍去)
#theta4*x2^2+(theta5*x1+theta2)x2 + (theta0+theta1*x1+theta3*x1^2) = 0
theta0 = LR2.intercept_
theta1,theta2,theta3,theta4,theta5 = LR2.coef_[0][0],LR2.coef_[0][1],LR2.coef_[0][2],LR2.coef_[0][3],LR2.coef_[0][4]
print(theta0,theta1,theta2,theta3,theta4,theta5)
2.3.4 和一階函數一樣的思路贴硫,將x1_new代入二階邊界函數當中,然后計算出x2_new_boundary的值伊者,并且可視化數據:
x1_new = x1.sort_values() #x1從小到大排序 升序排列
a = theta4
b = theta5*x1_new+theta2
c = theta0+theta1*x1_new+theta3*x1_new*x1_new
#一元二次方程求根公式:x=[-b±√(b2-4ac)]/2a
x2_new_boundary = (-b+np.sqrt(b*b-4*a*c)) / (2*a)
print(x2_new_boundary)
fig4 = plt.figure()
passed = plt.scatter(data.loc[:,'Exam1'][mask],data.loc[:,'Exam2'][mask])
failed = plt.scatter(data.loc[:,'Exam1'][~mask],data.loc[:,'Exam2'][~mask])
plt.plot(x1_new ,x2_new_boundary)
plt.title('Exam1-Exam2')
plt.xlabel('Exam1')
plt.ylabel('Exam2')
plt.legend((passed,failed),('passed','failed'))
plt.show()