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

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

1.1 学习知识背景

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

1.2 考生成绩预测问题以及本实战的原始数据(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±√(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()

在这里插入图片描述
        数据集请自取:testdata.csv 提取码为1234

猜你喜欢

转载自blog.csdn.net/qq_32575047/article/details/118524105
今日推荐