【轉載】【案例1】-- 機器學習之考試通過預測

原文鏈接:https://blog.csdn.net/qq_32575047/article/details/118524105

<<從零入門機器學習>> 邏輯回歸之預測考生是否通過考試

blog.csdn.net

目錄

    • 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-能通過)。
image
    現在基于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()

image
    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()

image
    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()

image

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)

image
    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()

image
數據集請自扔⒃狻:testdata.csv 提取碼為1234
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市亦渗,隨后出現的幾起案子挖诸,更是在濱河造成了極大的恐慌,老刑警劉巖法精,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件多律,死亡現場離奇詭異,居然都是意外死亡搂蜓,警方通過查閱死者的電腦和手機狼荞,發(fā)現死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帮碰,“玉大人相味,你說我怎么就攤上這事∈蘸粒” “怎么了攻走?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵殷勘,是天一觀的道長。 經常有香客問我昔搂,道長玲销,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任摘符,我火速辦了婚禮贤斜,結果婚禮上,老公的妹妹穿的比我還像新娘逛裤。我一直安慰自己瘩绒,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布带族。 她就那樣靜靜地躺著锁荔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝙砌。 梳的紋絲不亂的頭發(fā)上阳堕,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音择克,去河邊找鬼恬总。 笑死,一個胖子當著我的面吹牛肚邢,可吹牛的內容都是我干的壹堰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼骡湖,長吁一口氣:“原來是場噩夢啊……” “哼贱纠!你這毒婦竟也來了?” 一聲冷哼從身側響起勺鸦,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤并巍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后换途,有當地人在樹林里發(fā)現了一具尸體懊渡,經...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年军拟,在試婚紗的時候發(fā)現自己被綠了剃执。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡懈息,死狀恐怖肾档,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤怒见,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布俗慈,位于F島的核電站,受9級特大地震影響遣耍,放射性物質發(fā)生泄漏闺阱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一舵变、第九天 我趴在偏房一處隱蔽的房頂上張望酣溃。 院中可真熱鬧,春花似錦纪隙、人聲如沸赊豌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碘饼。三九已至,卻和暖如春麸拄,著一層夾襖步出監(jiān)牢的瞬間派昧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工拢切, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秆吵。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓淮椰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纳寂。 傳聞我的和親對象是個殘疾皇子主穗,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容