2.0.Logistic 回归

1)题目:

在本部分的练习中,您将使用Logistic回归模型来预测一个学生是否被大学录取。假设你是大学某个院系的管理员,你想通过申请人在两门考试中的表现来决定每个人的录取率,你有来自以前申请人的历史数据,你可以用这些数据作为训练集建立Logistic回归,对每一个训练样本,你有申请人在两门考试中的分数和录取决定。
你的任务是建立一个分类模型,基于这两门课的分数来估计申请人的录取概率。
数据链接: https://pan.baidu.com/s/1-u0iDFDibZc6tTGGx9_wnQ 提取码: 351j

2)知识点概括:

  • Logistic回归虽然名叫回归,但实际是一种分类算法。
    它的假设函数hθ(x)=11+e−θTxh_\theta(x)={1\over 1+e^{-\theta^Tx}}hθ​(x)=1+e−θTx1​的估计值表示了输入值x的条件下得到y=1的概率,即该样例为正类的概率,即hθ(x)=P(y=1∣x;θ)h_\theta(x)=P(y=1|x;\theta)hθ​(x)=P(y=1∣x;θ)
  • θTx=0\theta^Tx=0θTx=0称为决策边界(decision boundary)即对应了hθ(x)=0.5h_\theta(x)=0.5hθ​(x)=0.5,它不是训练集的属性,而是假设本身及其参数的属性。若阈值为0.5,则y=1y=1y=1的区域为θTx&gt;0\theta^Tx&gt;0θTx>0,反之y=0y=0y=0的区域为θTx&lt;0\theta^Tx&lt;0θTx<0。
  • 代价函数(cost function)为J(θ)=1m∑i=1mCost(hθ(x(i)),y(i))=−1m∑i=1m[y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]J(\theta)={1\over m}\sum_{i=1}^mCost(h_\theta(x^{(i)}),y^{(i)})=-{1\over m}\sum_{i=1}^m[y^{(i)}logh_\theta(x^{(i)})+(1-y^{(i)})log(1-h_\theta(x^{(i)}))]J(θ)=m1​∑i=1m​Cost(hθ​(x(i)),y(i))=−m1​∑i=1m​[y(i)loghθ​(x(i))+(1−y(i))log(1−hθ​(x(i)))]
  • 梯度(gradient)为∂∂θjJ(θ)=1m∑i=1m(hθ(x(i))−y(i))xj(i){\partial \over \partial\theta_j}J(\theta)={1\over m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}∂θj​∂​J(θ)=m1​∑i=1m​(hθ​(x(i))−y(i))xj(i)​

3)大致步骤:

首先用pandas读取数据,数据处理好之后用.values转化为矩阵进行运算,然后可视化训练集数据,定义sigmoid函数、代价函数和梯度,带入更高级的算法中自动优化求解参数。
这里Ng推荐的算法有:共轭梯度法(conjugate gradient)、拟牛顿法(BFGS、L-BFGS)。
然后再进行对给定的某名学生的录取概率进行预测,并计算该分类器的精度、查准率和查全率。最后画出决策边界。

4)关于Python:

scipy中的optimize子包中提供了常用的最优化算法函数实现。我们可以直接调用这些函数完成我们的优化问题。具体可参考:

http://blog.sina.com.cn/s/blog_5f234d4701013ln6.html

本次练习主要采用了拟牛顿法、牛顿共轭梯度法和L-BFGS-B,其中需要输入目标函数、theta初始值、目标函数的梯度、最大迭代次数、传递给函数和梯度的值、并设置其他输出full_output=True(注意fmin_bfgs、fmin_ncg与fmin_l_bfgs_b参数不同,前两个需要选择full_output才可以返回优化的最小值,而fmin_l_bfgs_b默认返回)。

5)代码和结果:


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy.optimize as optdata = pd.read_csv('ex2data1.txt', sep=',', names=['score1', 'score2', 'admission'])
(m, n) = data.shape
#截取并转化为矩阵
x = data[['score1', 'score2']]
x1 = pd.DataFrame(np.ones((m,1)), columns=['constant']) #在前面赋值一列1
x = pd.concat([x1, x], axis=1) #合并dataframe
y = data['admission'].astype(float) #y是int的需要转化为浮点型x = x.values #从数据框转化为矩阵
y = y.values
theta = np.zeros(n) #赋值theta'''可视化训练集数据'''
def plotData(data):positive = data[data.admission==1] #筛选出y=1的部分negative = data[data.admission==0]plt.scatter(positive.score1, positive.score2, c='k', marker='+', label='Admitted')plt.scatter(negative.score1, negative.score2, c='y', marker='o', label='Not Admitted')plt.legend(loc=1)plt.xlabel('Exam1 Score')plt.ylabel('Exam2 Score')plt.figure(0)
plotData(data)'''sigmoid函数'''
def sigmoid(x):return 1/(1+np.exp(-x))'''计算代价函数和梯度'''
#代价函数
def cost_func(theta, x, y):m = y.sizereturn -1/m*(y@np.log(sigmoid(x@theta))+(1-y)@np.log(1-sigmoid(x@theta)))#梯度
def gradient_func(theta, x, y):m = y.sizereturn 1/m*((sigmoid(x@theta))-y).T@x'''求解最优参数'''
#方法一 BFGS
theta1, cost1, *unused1 = opt.fmin_bfgs(f=cost_func, fprime=gradient_func, x0=theta, args=(x, y), maxiter=400, full_output=True)#方法二 牛顿共轭梯度
theta2, cost2, *unused2 = opt.fmin_ncg(f=cost_func, fprime=gradient_func, x0=theta, args=(x, y), maxiter=400, full_output=True)#方法三 L-BFGS-B
theta3, cost3, *unused3 = opt.fmin_l_bfgs_b(func=cost_func, fprime=gradient_func, x0=theta, args=(x, y), maxiter=400)'''预测与模型评价'''
#预测录取改率
def predict(x, theta):return sigmoid(x@theta)x_test = [1, 45, 85]
print('The admission probabilities are %.4f  %.4f  %.4f respectively' %(predict(x_test, theta1),predict(x_test, theta2),predict(x_test, theta3)))#阈值取0.5时的预测样例,即输出是正例还是反例
def p_or_n(theta, x=x):a = predict(x, theta)for i in range(a.size):if a[i]<0.5:a[i]=0else:a[i]=1return a#精度
def accuracy(theta, x=x, y=y):m = y.sizereturn 1-np.sum(np.abs(y-p_or_n(theta)))/m#查准率
def precision(theta, x=x, y=y):p_p = pd.DataFrame((y+p_or_n(theta))) #转换成dataframe来计数,真正例预测也为正例return np.sum(p_p==2)/np.sum(p_or_n(theta)) #预测的正例中真实正例的比例#查全率
def recall(theta, x=x, y=y):p_p = pd.DataFrame((y+p_or_n(theta))) #转换成dataframe来计数,真正例预测也为正例return np.sum(p_p==2)/np.sum(y) #真实正例中被预测为正例的比例for i in range(1,4):print(accuracy(locals()['theta'+str(i)])) #变量名循环,依次打印精度for i in range(1,4):print(precision(locals()['theta'+str(i)])) #变量名循环,依次打印查准率for i in range(1,4):print(recall(locals()['theta'+str(i)])) #变量名循环,依次打印查全率'''画出决策边界'''
#x@theta=0为决策边界,即theta[0]*1+theta[1]*x[1]+theta[2]*x[2]=0
def plotBD(theta,method,color):x1 = np.arange(25, 100, step=0.1)x2 = -(theta[0]+theta[1]*x1)/theta[2]plt.plot(x1, x2, label=method, c=color)plt.legend(loc=3)plt.title('The Decision Boundary')plt.figure(1)
plotData(data)
plotBD(theta1,'BFGS','g')
plotBD(theta2,'NCG','r')
plotBD(theta3,'L-BFGS-B','b')
plt.show

BFGS、牛顿共轭梯度、L-BFGS-B的迭代次数分别为23、26和27。
三种方法所求的最优参数和最后的代价函数值分别为

三种方法预测的成绩分别为45、85的学生的录取概率为(期望值为0.776)

虽然从代价函数和单个学生的录取概率准确性来说,第二种方法即牛顿共轭梯度不如拟牛顿表现好,但是当阈值取0.5时,三种方法的精度(0.89)、查准率(0.901639)、查全率(0.916667)完全相同,且仔细查看后发现他们虽然对每个训练集的预测录取概率有所差别,但是在阈值0.5下所产生的预测正反例完全一样。

三种方法预测的正反例矩阵一样:

自然三种方法的决策边界也一样:

吴恩达|机器学习作业2.0Logistic 回归相关推荐

  1. 吴恩达机器学习作业1-线性回归讲解版奔雷手

    机器学习作业 1 - 线性回归 奔雷手 1.单变量线性回归 导入需要使用的包 import numpy as np import pandas as pd import matplotlib.pypl ...

  2. 吴恩达机器学习作业二——逻辑回归

    有了作业一的铺垫,作业二的代码更容易理解了. 逻辑回归 题目描述:在训练的初始阶段,我们将要构建一个逻辑回归模型来预测,某个学生是否被大学录取.设想你是大学相关部分的管理者,想通过申请学生两次测试的评 ...

  3. 吴恩达机器学习作业1-线性回归

    题目概述: 整个2的部分需要根据城市人口数量,预测开小吃店的利润 数据在ex1data1.txt里,第一列是城市人口数量,第二列是该城市小吃店利润. 用到2个公式: 代价函数: 批量梯度下降 进行优化 ...

  4. 吴恩达机器学习作业ex2-python实现

    系列文章目录 吴恩达机器学习作业ex1-python实现 吴恩达机器学习作业ex2-python实现 吴恩达机器学习作业ex3-python实现 作业说明及数据集 链接:https://pan.bai ...

  5. 第一章-机器学习简介 深度之眼_吴恩达机器学习作业训练营

    目录 专栏简介: 一,机器学习简介 1.1 机器学习定义 1.1 机器学习的重要性 1.2 应用领域 二.监督学习 三.无监督学习 四.总结 专栏简介: 本栏主要内容为吴恩达机器学习公开课的学习笔记, ...

  6. k均值算法python实现(吴恩达机器学习作业)

    k均值算法python实现(吴恩达机器学习作业) 题目要求 数据集 读取mat文件 K-means 实现 结果 问题 题目要求 采用K均值算法对样本进行聚类. 编写K均值算法源代码,对ex7data2 ...

  7. 吴恩达机器学习作业7 - K-means和PCA主成分分析(Python实现)

    吴恩达机器学习作业7 - K-means和PCA主成分分析(Python实现) Introduction 在本实验中,将实现K-means聚类算法,并将其应用于图像压缩.在第二部分实验中,将使用主成分 ...

  8. 吴恩达机器学习作业Python实现(二):logistic回归

    吴恩达机器学习系列作业目录 1 Logistic regression 在这部分的练习中,你将建立一个逻辑回归模型来预测一个学生是否能进入大学.假设你是一所大学的行政管理人员,你想根据两门考试的结果, ...

  9. 吴恩达机器学习作业Python实现(八):异常检测和推荐系统

    吴恩达机器学习系列作业目录 1 Anomaly detection 这部分,您将实现一个异常检测算法来检测服务器计算机中的异常行为.他的特征是测量每个服务器的响应速度(mb/s)和延迟(ms).当你的 ...

最新文章

  1. DeepMind、哈佛造出了 AI「小白鼠」,从跑、跳、觅食、击球窥探神经网络的奥秘...
  2. eBPF内核探测中将任意系统调用转换成事件
  3. IIS不能下载.apk文件
  4. 【转】IOS动画的实现,其实很简单
  5. 【玩转cocos2d-x之六】节点类CCNode
  6. 使用 Playwright 对 ASP.NET Core 应用执行功能测试
  7. python 遍历usb设备_python程序员教你写脚本玩微信跳一跳,只要有耐心,你就是王者!...
  8. imx6 配置串口波特率_RS232串口多机通信
  9. Flyway 数据库脚本版本控制工具
  10. python插件使用教程_Python插件机制实现详解
  11. mysql简单指令_Mysql基本指令
  12. J - 简单枚举类型——植物与颜色
  13. 阿里移动推送服务端API
  14. 通过Field (反射)给私有字段赋值
  15. linux修改mysql配置文件_CentOS7离线安装 mysql,超细步骤,基础配置,90%小白10分钟学会...
  16. ImageZoom 图片放大效果
  17. 交警高德强联手 助威吉林马拉松
  18. 使用CSS3关键帧动画创建的动态通知气泡
  19. android 把file资源转file,Android文件管理器选择文件,获得文件路径URI转File
  20. [bzoj2959][动态树]长跑

热门文章

  1. 3-cd 命令总结
  2. BZOJ 1070: [SCOI2007]修车
  3. 漫话CLR ---- 属性
  4. Autoware(2)—加载地图数据
  5. 使用Json封装scroll,已处理其兼容性问题
  6. kafka学习总结之集群部署和zookeeper
  7. Eclipse打JAR包的使用
  8. AC-WEB使用HTTPS登录
  9. 电商订单ElasticSearch同步解决方案--使用logstash
  10. 通过BitmapFactory.Options解决activity之间传递图片出现内存溢出(OOM)问题