【转载】【案例1】-- 机器学习之考试通过预测

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

<<从零入门机器学习>> 逻辑回归之预测考生是否通过考试

blog.csdn.net

目录

    • 1. 学习前需要掌握的知识以及问题背景
      • 1.1 学习知识背景
      • 1.2 考生成绩预测问题以及本实战的原始数据(testdata.csv文件放在文章的末尾,自行取)
    • 2. 根据具体步骤解决问题
      • 2.1 基于testdata.csv数据,建立逻辑回归模型,评估模型的表现。
      • 2.2 预测Exam1 = 75,Exam2 = 60时,该同学能否通过Exam3。
      • 2.3 建立二阶边界函数,重复任务1,2步骤。

1. 学习前需要掌握的知识以及问题背景

1.1 学习知识背景

   学习本实战例子前提需要掌握机器学习中逻辑回归的概念,Python的基础语法,MSE,R2_score等变量的含义,以及数学求解过程,本篇博客默认是基于掌握如上知识点进行的。

1.2 考生成绩预测问题以及本实战的原始数据(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±√(b²-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阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容