Logistic回归实战

一、题目

        假设你是一所大学的行政管理人员,你想根据两门考试的结果,来决定每个申请人是否被录取。你有以前申请人的历史数据,可以将其用作逻辑回归训练集。对于每一个训练样本,你有申请人两次测评的分数以及录取的结果。为了完成这个预测任务,我们需要构建一个可以基于两次测试评分来评估录取可能性的分类模型。

二、可视化数据

import numpy as np               
import pandas as pd              
import matplotlib.pyplot as plt  
data = pd.read_csv('ex2data1.txt', names=['exam1', 'exam2', 'admitted'])    
print(data.head())                                                          

print(data.describe())

让我们创建两个分数的散点图,并使用颜色编码来可视化,如果样本是正的(被录取)或负的(未被录取)

# 具体来说,data.admitted表示data DataFrame中的admitted列                                                 
# isin([1])是一个布尔条件,用于检查admitted列中的值是否在列表[1]中                                                    
# data[data.admitted.isin([1])]表示从data DataFrame中筛选出满足条件的行                                      
# 最后,将筛选出的行赋值给变量positive                                                                        
positive = data[data.admitted.isin([1])]  # 1                                                   
negative = data[data.admitted.isin([0])]  # 0                                                   fig, ax = plt.subplots(figsize=(6, 5))                                                          
ax.scatter(positive['exam1'], positive['exam2'], c='b', label='Admitted')                       
# marker='x':这表示点的标记样式为叉号                                                                       
ax.scatter(negative['exam1'], negative['exam2'], s=50, c='r', marker='x', label='Not Admitted') 
# 设置横纵坐标名                                                                                       
ax.set_xlabel('Exam 1 Score')                                                                   
ax.set_ylabel('Exam 2 Score')                                                                   
plt.show()                                                                                      

三、 Sigmoid function

根据前面我们给出的的假设函数和g函数

def sigmoid(z):                   return 1 / (1 + np.exp(- z))  x1 = np.arange(-10, 10, 0.1)
plt.plot(x1, sigmoid(x1), c='r')
plt.show()

四、代价函数

代价函数的表达式前面我们也讲过:

def cost(theta, X, y):                                              theta = np.matrix(theta)                                        first = np.multiply(-y, np.log(sigmoid(X * theta.T)))           second = np.multiply((1 - y), np.log(1 - sigmoid(X * theta.T))) return np.sum(first - second) / (len(X))                        

获取训练集的数据并传入参数计算Cost

data.insert(0, 'Ones', 1)                            
cols = data.shape[1]                                 
X = data.iloc[:, 0:cols - 1]                         
y = data.iloc[:, cols - 1:cols]                      
print(X.head())                                      
print(y.head())                                      
X = np.matrix(X.values)                              
y = np.matrix(y.values)                              
theta = np.zeros(3)                                  
print(cost(theta, X, y))  # 0.6931471805599453       

五、批量梯度下降

def gradient(theta, X, y):                                                            theta = np.matrix(theta)                                                          grad_theta = np.array(((X.T) @ (sigmoid(X @ theta.T) - y)) / len(X)).reshape(-1)  return grad_theta                                                                 grad_theta = gradient(theta, X, y) 
print(type(grad_theta))            
print(grad_theta)    #[ -0.1        -12.00921659 -11.26284221]                                                                  

六、训练参数θ

        注意,我们实际上没有在上面的函数中执行梯度下降,我们仅仅在计算梯度。由于我们使用Python,我们可以用SciPyoptimize来计算成本和梯度参数。这里我们使用的是高级优化算法,运行速度通常远远超过梯度下降,方便快捷,我们只需传入cost函数、初始化的变量theta、X、y和梯度即可

import scipy.optimize as optresult = opt.fmin_tnc(func=cost, x0=theta, fprime=gradient, args=(X, y))       
print(result)  # (array([-25.16131859,   0.20623159,   0.20147149]), 36, 0)    
print(cost(result[0], X, y))  # 0.20349770158947475                            

七、训练模型

        训练好了参数θ后,我们来用这个模型预测某个学生是否能被录取。接下来,我们需要编写一个函数,用我们所训练的参数θ来为数据集X输出预测,然后我们可以使用这个函数来给我们的分类器的训练精度打分。

逻辑回归模型的假设函数:


{​{h}_{\theta }}大于等于0.5时,预测 y=1

{​{h}_{\theta }}小于0.5时,预测 y=0 

def predict(theta, X):                                                    theta = np.matrix(theta)                                              probability = sigmoid(X * theta.T)                                    return [1 if x >= 0.5 else 0 for x in probability]   
final_theta = result[0]                                                  
predictions = predict(final_theta, X)                                    
print(predictions)                                                       
correct = [1 if a == b else 0 for (a, b) in zip(predictions, y)]         
print(correct)                                                           
accuracy = sum(correct) / len(X)                                         
print(accuracy)   #0.89                                                  

可以看到我们预测精度达到了89%

八、决策边界

x1 = np.arange(130, step=0.1)                                                                     
x2 = -(final_theta[0] + x1 * final_theta[1]) / final_theta[2]                                     
fig, ax = plt.subplots(figsize=(8, 5))                                                            
ax.scatter(positive['exam1'], positive['exam2'], c='b', label='Admitted')                         
ax.scatter(negative['exam1'], negative['exam2'], s=50, c='r', marker='x', label='Not Admitted')   
ax.plot(x1, x2)                                                                                   
ax.set_xlim(0, 130)                                                                               
ax.set_ylim(0, 130)                                                                               
ax.set_xlabel('Exam 1 Score')                                                                     
ax.set_ylabel('Exam 2 Score')                                                                     
ax.set_title('Decision Boundary')                                                                 
plt.show()                                                                                        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/416121.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

测试基础-软件测试必备知识总结

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 什么是软件测试? 软件测试是在软件产品发布之前检查其质量、功能和性能的过程。为了…

【论文阅读】GPT4Graph: Can Large Language Models Understand Graph Structured Data?

文章目录 0、基本介绍1、研究动机2、准备2.1、图挖掘任务2.2、图描述语言(GDL) 3、使用LLM进行图理解流程3.1、手动提示3.2、自提示 4、图理解基准4.1、结构理解任务4.1、语义理解任务 5、数据搜集5.1、结构理解任务5.2、语义理解任务 6、实验6.1、实验设…

基于SpringBoot Vue自习室管理系统

大家好✌!我是Dwzun。很高兴你能来阅读我,我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结,还为大家分享优质的实战项目,本人在Java项目开发领域有多年的经验,陆续会更新更多优质的Java实战项目&#x…

解决Qt的release构建下无法进入断点调试的问题

在工作的时候遇到了第三方库只提供release版本的库的情况,我需要在这基础上封装一层自家库,在调试的时候遇到如下问题,但是在Qt环境下,release的库只能在进行release构建和调试。 卡在了一直进不了断点的情况。提示内容如下&#…

2024-01-17(SpringCloud)

1.使用openFeign的itemClient接口去做远程调用其他微服务中的接口。但我们直接使用了itemClient接口,而不是该接口的实现类,说明我们是使用该接口的代理对象帮我们做远程调用的。这个代理对象是invocationHandler来生成的。 2.openFeign底层发起远程调用…

解决js计算精度问题

问题 浮点数,常用的办法是四舍五入保留2位小数来解决。但是在向上、向下保留小数的时候,比如:0.10.20.30000000000000004,向上保留2位小数就变成了0.31。 大整数,在超出Number的最大安全整数时,计算也会存…

Tide Quencher 8WS-Amine,TQ8WS-胺,可用于特定荧光信号的检测

您好,欢迎来到新研之家 文章关键词:Tide Quencher 8WS Amine,TQ8WS amine,Tide Quencher 8WS NH2 ,TQ8WS NH2,Tide Quencher 8WS 胺,TQ8WS 胺 一、基本信息 产品简介:The fluores…

MySQL的基本查询(附案例)

目录 前言 Create(创建) 单行数据全列插入: 多行数据指定列插入: 插入否则更新: 替换: Retrieve(读取) SELECT 列: 全列查询: 指定列查询&#xff1a…

DMA技术在STM32中优化UART、SPI和I2C通信性能的研究与实现

DMA(Direct Memory Access,直接存储器访问)技术可以在STM32微控制器上优化UART、SPI和I2C等通信性能。DMA可以实现数据的高速传输,减轻CPU的负担,提高系统性能。在本篇文章中,我将探讨DMA技术在STM32中优化…

【数据开发】BI数据报表之数据可测试性设计与分析

文章目录 1、什么是BI&数据报表2、什么是可测试性3、数据测试与方法3.1 数据准确性与对比(重要)3.2 数据安全性 1、什么是BI&数据报表 数据报表是一种数据可视化工具 用于将数据以图表、表格和其他可视化形式呈现出来,以便用户可以…

学习响应式编程中遇到的奇奇怪怪的问题

spring项目无法启动 Description: Web application could not be started as there was no org.springframework.boot.web.reactive.server.ReactiveWebServerFactory bean defined in the context. Action: Check your application’s dependencies for a supported react…

Linux的网络文件共享服务之FTP服务

一.存储类型 1.1 存储类型分为三种 直连式存储:Direct-Attached Storage,简称DAS 存储区域网络:Storage Area Network,简称SAN(可以使用空间,管理也是你来管理) 网络附加存储:Net…