机器学习之逻辑回归实战:考试通过

本文介绍了逻辑回归的基本概念,强调了其在二分类问题中的应用,并通过实例展示了如何使用一阶和二阶边界函数改进模型。通过examdata.csv数据,逐步构建并比较了一阶和二阶模型的准确性,最终得出二阶边界能显著提高预测精度的结论。
摘要由CSDN通过智能技术生成


邏輯回歸的概念

logistic回归是一种广义线性回归(generalized linear model),因此与多重线性回归分析有很多相同之处。它们的模型形式基本上相同,都具有 w‘x+b,其中w和b是待求参数,其区别在于他们的因变量不同,多重线性回归直接将w‘x+b作为因变量,即y =w‘x+b,而logistic回归则通过函数L将w‘x+b对应一个隐状态p,p =L(w‘x+b),然后根据p 与1-p的大小决定因变量的值。如果L是logistic函数,就是logistic回归,如果L是多项式函数就是多项式回归。

logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释,多类可以使用softmax方法进行处理。实际中最为常用的就是二分类的logistic回归

Logistic回归模型的适用条件:

  1. 因变量为二分类的分类变量或某事件的发生率,并且是数值型变量。但是需要注意,重复计数现象指标不适用于Logistic回归。

  2. 残差和因变量都要服从二项分布。二项分布对应的是分类变量,所以不是正态分布,进而不是用最小二乘法,而是最大似然法来解决方程估计和检验问题。

  3. 自变量和Logistic概率是线性关系

  4. 各观测对象间相互独立。

原理:如果直接将线性回归的模型扣到Logistic回归中,会造成方程二边取值区间不同和普遍的非直线关系。因为Logistic中因变量为二分类变量,某个概率作为方程的因变量估计值取值范围为0-1,但是,方程右边取值范围是无穷大或者无穷小。所以,才引入Logistic回归。

Logistic回归实质:发生概率除以没有发生概率再取对数。就是这个不太繁琐的变换改变了取值区间的矛盾和因变量自变量间的曲线关系。究其原因,是发生和未发生的概率成为了比值 ,这个比值就是一个缓冲,将取值范围扩大,再进行对数变换,整个因变量改变。不仅如此,这种变换往往使得因变量和自变量之间呈线性关系,这是根据大量实践而总结。所以,Logistic回归从根本上解决因变量要不是连续变量怎么办的问题。还有,Logistic应用广泛的原因是许多现实问题跟它的模型吻合。例如一件事情是否发生跟其他数值型自变量的关系。


逻辑回归方程

请添加图片描述
方程所对应的图形
可以发现当样本值越大y越接近1,样本值越小y越接近0,以0.5为分界点就可以将y分成以下两种情况。
请添加图片描述

这时负样本就是0,正样本就是1,0和1就是我们给样本定义的标签。在考试通过问题中,可以用1代表通过(pass),用0代表失败(failed),这样就可以通过标签0和1将失败和通过进行一个分类,就可以很好地解决二分类问题了。

当问题更复杂时,可以用g(x)代替x,然后就可以根据g(x)寻找最合适的决策边界从而解决二分类问题
在这里插入图片描述
比如下面这个图形:
在这里插入图片描述

此时虚线部分就是它的决策边界请添加图片描述

请添加图片描述

实战

**任务:**基于examdata.csv数据,建立逻辑回归模型 预测Exam1 = 70, Exam2 = 60时,该同学在Exam3是 passed or failed; 建立二阶边界,提高模型准确度。

#load the data
import pandas as pd
import numpy as np
data = pd.read_csv('examdata.csv')
data.head()

#visualize the data
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()

在这里插入图片描述

#add label mask
mask=data.loc[:,'Pass']==1
print(mask)

在这里插入图片描述

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

在这里插入图片描述

#define X,y
X = data.drop(['Pass'],axis=1)
y = data.loc[:,'Pass']
X1 = data.loc[:,'Exam1']
X2 = data.loc[:,'Exam2']
X1.head()

在这里插入图片描述

X.shape,y.shape #查看維度

在这里插入图片描述

#establish the model and  train it
from sklearn.linear_model import LogisticRegression
LR = LogisticRegression()
LR.fit(X,y)

在这里插入图片描述

这里模型已经训练好了

#show the predicted result and its accuracy
y_predict = LR.predict(X)
print(y_predict)

在这里插入图片描述

from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y,y_predict) # accuracy_score分數越接近1越好 
accuracy

准确率达到了0.89,虽然感觉挺高的,但是判断错误的还是很多的

#exam1=70,exam2=65
y_test = LR.predict([[70,65]])
print('passed' if y_test==1 else 'failed')

在这里插入图片描述

邊界函數

在这里插入图片描述

LR.intercept_	#截距 也就是0次項的係數

在这里插入图片描述

theta0 = LR.intercept_
theta1,theta2 = LR.coef_[0][0],LR.coef_[0][1]
print(theta0,theta1,theta2)

在这里插入图片描述

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.title('Exam1-Exam2')
plt.xlabel('Exam1')
plt.ylabel('Exam2')
plt.legend((passed,failed),('passed','failed'))
plt.plot(X1,X2_new)
plt.show()

在这里插入图片描述

# 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)

在这里插入图片描述

訓練新模型

#establish new model and train
LR2 = LogisticRegression()
LR2.fit(X_new,y)

在这里插入图片描述

y2_predict = LR2.predict(X_new)
accuracy2 = accuracy_score(y,y2_predict)
print(accuracy2)

在这里插入图片描述

accuracy_score准确率达到了百分之百,可以看处通过二阶边界建立的模型比通过一阶边界建立的模型准确率高很多

二階邊界函數

在这里插入图片描述

X1_new = X1.sort_values() #将x1_new从小到大排序,这里是保证后面画图不出现交叉,使图形更好看、更直观
print(X1_new) #预览

在这里插入图片描述
看一下可視化效果
在这里插入图片描述
如果不排序的效果如下,可以看出很亂

在这里插入图片描述

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]
a = theta4
b = theta5*X1_new + theta2
c = theta0 + theta1*X1_new + theta3*X1_new*X1_new
X2_new_boundary = (-b + np.sqrt(b*b - 4*a*c))/(2*a)
print(X2_new_boundary)

在这里插入图片描述

fig5 = 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()

在这里插入图片描述

總結

以上就是本次跟著flare老師學習的筆記,附上数据集和源碼,需要的小伙伴自取
鏈接:https://github.com/fbozhang/python/tree/master/jupyter

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值