机器学习逻辑回归模型总结——从原理到sklearn实践

2024-06-16 03:32

本文主要是介绍机器学习逻辑回归模型总结——从原理到sklearn实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0x00 基本原理

逻辑回归算法,从名字上看似乎是个回归问题,但实际上逻辑回归是个典型的分类算法。
对于分类问题,一般都是一些离散变量,且y的取值如下:

y{0,1,2,3,...,n}
,显然不能使用线性回归拟合。
以二元分类问题开始讨论,y的取值为“类别1,类别2”,为了表示清楚,这里使用0和1来表示二元分类中的两个类别,即y的取值为: y{0,1}
和线性回归问题一样,我们规定假设函数为: hθ(x) ,设置取值范围: 0hθ(x)1 ,因为我们希望算法得出的结果取值非0即1,所以还要设置一个阈值,如果得出的概率大于这个阈值,则假设函数输出1,否则输出0。
在逻辑回归中,实际上对于假设函数,使用了一种逻辑函数的概念,函数如下:
hθ(x)=11+eθTx

称为S型函数,或者逻辑函数。取值范围为(0,1),符合我们上面对假设函数的要求。通常,设置阈值为0.5,如果训练样本输入到假设函数中,得到的值大于0.5,则认为分类为1,否则分类为0:
P(y=0|x;θ)+P(y=1|x;θ)=1

相应的,我们的损失函数(Cost Function)为:
J(θ)=1mi=1m12(hθ(x(i))y(i))2

如果这里计算折损的形式还是和线性回归一样平方损失函数: mi=112(hθ(x(i))y(i))2 ,实际上,在求minJ的时候,对于J函数,我们很可能得出的不是凸函数的形式,这样再使用梯度下降算法时,会陷入至局部最优解中,很难找到全局最优解。
所以在计算折损值的时候,逻辑回归中使用了对数损失函数来获得一个凸函数的J,整理得到的最终损失函数形式如下,其中省略了若干数学推导:

我们再次使用梯度下降算法来求出最优的参数向量,梯度下降在逻辑回归中表现如下:

可能有人发现,这不和线性拟合问题中的梯度下降公式一样吗?实际上,由于逻辑回归模型中采用了逻辑函数来表示假设函数,所以这两种模型中的梯度下降表达式是完全不同的两回事儿。
有了梯度下降算法,我们就可以使用训练集来求出最优的参数向量。逻辑回归中,为了消除过度拟合问题,有正则化方法,这里就不再赘述。

0x01 算法实现

根据Andrew Ng所提供的资料,我们依旧选择Octave来实现逻辑回归算法。
首先是sigmoid函数(逻辑函数)的表达:

function g = sigmoid(z)
g = zeros(size(z));
g = 1 ./ (1+exp(-z));
end

Cost Function的实现:

function [J, grad] = costFunction(theta, X, y)
% 初始化
m = length(y);
J = 0;
grad = zeros(size(theta));% 损失函数的计算
temp = sigmoid(X*theta);
temp = temp(:,size(temp, 2));
J = (1/m) * sum((-y.*log(temp))-((1-y).*log(1-temp))) ;% 损失函数的导数计算
for i=1:size(theta,1),grad(i) = (1/m) * sum((temp - y).*X(:,i));
end;
end

由于资料中所给的不是直接使用梯度下降算法,而是使用了Octave中的优化方法来求最优参数向量,所以只需要返回损失函数J和各个损失函数的导数grad。实际上,如果改成直接使用梯度下降的话,只需要在求grad的过程中,同步更新我们各个参数即可。
预测函数如下,这里一般选择阈值为0.5,所以大于0.5的假设函数返回值,我们就判断类别为1。

function p = predict(theta, X)
m = size(X, 1); 
p = zeros(m, 1);% 计算类别,使用p向量返回
for i=1:m,prop = sigmoid(X(i,:)*theta) ;if prop >= 0.5,p(i) = 1;end;
end;
end;

0x02 算法运行

运行算法,可以看到可视化的决策边界:

0x03 sklearn库实践

清楚了逻辑回归模型的原理,我们使用python进行机器学习演练,使用sklearn机器学习库,可以很方便地进行实践。
数据集为学生的两次考试成绩以及是否通过大学申请,我们用逻辑回归进行分类,以后给出一个样本,输出成功通过大学申请的概率。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import division
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.cross_validation import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report 
from sklearn.metrics import precision_recall_curve, roc_curve, auc data = pd.read_csv('ex2data1.txt', sep=',', \skiprows=[2], names=['score1','score2','result'])
score_data = data.loc[:,['score1','score2']]
result_data = data.resultp = 0
for i in xrange(10):x_train, x_test, y_train, y_test = \train_test_split(score_data, result_data, test_size = 0.2)model = LogisticRegression(C=1e9)model.fit(x_train, y_train)predict_y = model.predict(x_test)p += np.mean(predict_y == y_test)# 绘制图像
pos_data = data[data.result == 1].loc[:,['score1','score2']]
neg_data = data[data.result == 0].loc[:,['score1','score2']]h = 0.02
x_min, x_max = score_data.loc[:, ['score1']].min() - .5, score_data.loc[:, ['score1']].max() + .5
y_min, y_max = score_data.loc[:, ['score2']].min() - .5, score_data.loc[:, ['score2']].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])# 绘制边界和散点
Z = Z.reshape(xx.shape)
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)
plt.scatter(x=pos_data.score1, y=pos_data.score2, color='black', marker='o')
plt.scatter(x=neg_data.score1, y=neg_data.score2, color='red', marker='*')plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.show()# 模型表现
answer = model.predict_proba(x_test)[:,1]  
precision, recall, thresholds = precision_recall_curve(y_test, answer)      
report = answer > 0.5  
print(classification_report(y_test, report, target_names = ['neg', 'pos']))  
print("average precision:", p/100)  

运行结果如下:

画出了决策边界之后,就可以看到我们最后的分类结果。
当然也可以使用precision_call_curve方法自动计算召回率精度等数据:

               precision    recall  f1-score   supportneg       0.88      0.88      0.88         8pos       0.92      0.92      0.92        12avg / total       0.90      0.90      0.90        20
('average precision:', 0.089999999999999997)

精度达到了90%,模型效果还不错。

0x04 总结

逻辑回归模型实际上是一个典型的监督学习分类算法,配合sklearn库可以很方便的进行逻辑回归处理。前提是要真正理解逻辑回归模型的原理和推导过程。
实战中,机器学习和信息安全结合越来越紧密了,所以这也是我为啥开始学习机器学习的原因,就逻辑回归而言,完全可以用在防爬检测,扫描器检测,恶意URL提取的应用上,实战的前提是了解原理:)

这篇关于机器学习逻辑回归模型总结——从原理到sklearn实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

Jvm sandbox mock机制的实践过程

《Jvmsandboxmock机制的实践过程》:本文主要介绍Jvmsandboxmock机制的实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景二、定义一个损坏的钟1、 Springboot工程中创建一个Clock类2、 添加一个Controller

Mysql中的用户管理实践

《Mysql中的用户管理实践》:本文主要介绍Mysql中的用户管理实践,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录13. 用户管理13.1 用户 13.1.1 用户信息 13.1.2 创建用户 13.1.3 删除用户 13.1.4 修改用户

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

qtcreater配置opencv遇到的坑及实践记录

《qtcreater配置opencv遇到的坑及实践记录》我配置opencv不管是按照网上的教程还是deepseek发现都有些问题,下面是我的配置方法以及实践成功的心得,感兴趣的朋友跟随小编一起看看吧... 目录电脑环境下载环境变量配置qmake加入外部库测试配置我配置opencv不管是按照网上的教程还是de

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1