logistic_regression---python实现

2023-11-02

logistic regression(用python实现)

一、 理论知识

logistic 回归,虽然名字里有 “回归” 二字,但实际上是解决分类问题的一类线性模型。在某些文献中,logistic 回归又被称作 logit 回归,maximum-entropy classification(MaxEnt,最大熵分类),或 log-linear classifier(对数线性分类器)。该模型利用函数 logistic function 将单次试验(single trial)的可能结果输出为概率。

scikit-learn 中 logistic 回归在 LogisticRegression 类中实现了二分类(binary)、一对多分类(one-vs-rest)及多项式 logistic 回归,并带有可选的 L1 和 L2 正则化。

注意,scikit-learn的逻辑回归在默认情况下使用L2正则化,这样的方式在机器学习领域是常见的,在统计分析领域是不常见的。正则化的另一优势是提升数值稳定性。scikit-learn通过将C设置为很大的值实现无正则化。

作为优化问题,带 L2罚项的二分类 logistic 回归要最小化以下代价函数(cost function):
m i n   w , c 1 2 w T w + C ∑ i = 1 n log ⁡ ( exp ⁡ ( − y i ( X i T w + c ) ) + 1 ) . \underset{w, c}{min\,} \frac{1}{2}w^T w + C \sum_{i=1}^n \log(\exp(- y_i (X_i^T w + c)) + 1) . w,cmin21wTw+Ci=1nlog(exp(yi(XiTw+c))+1).
类似地,带 L1 正则的 logistic 回归解决的是如下优化问题:
m i n   w , c ∥ w ∥ 1 + C ∑ i = 1 n log ⁡ ( exp ⁡ ( − y i ( X i T w + c ) ) + 1 ) . \underset{w, c}{min\,} \|w\|_1 + C \sum_{i=1}^n \log(\exp(- y_i (X_i^T w + c)) + 1) . w,cminw1+Ci=1nlog(exp(yi(XiTw+c))+1).
Elastic-Net正则化是L1 和 L2的组合,来使如下代价函数最小:
min ⁡ w , c 1 − ρ 2 w T w + ρ ∥ w ∥ 1 + C ∑ i = 1 n log ⁡ ( exp ⁡ ( − y i ( X i T w + c ) ) + 1 ) . \min_{w, c} \frac{1 - \rho}{2}w^T w + \rho \|w\|_1 + C \sum_{i=1}^n \log(\exp(- y_i (X_i^T w + c)) + 1) . w,cmin21ρwTw+ρw1+Ci=1nlog(exp(yi(XiTw+c))+1).
其中ρ控制正则化L1与正则化L2的强度(对应于l1_ratio参数)。

注意,在这个表示法中,假定目标y_i在测试时应属于集合[-1,1]。我们可以发现Elastic-Net在ρ=1时与L1罚项等价,在ρ=0时与L2罚项等价

在 LogisticRegression 类中实现了这些优化算法: liblinear, newton-cg, lbfgs, sag 和 saga。

liblinear应用了坐标下降算法(Coordinate Descent, CD),并基于 scikit-learn 内附的高性能 C++ 库 LIBLINEAR library 实现。不过 CD 算法训练的模型不是真正意义上的多分类模型,而是基于 “one-vs-rest” 思想分解了这个优化问题,为每个类别都训练了一个二元分类器。因为实现在底层使用该求解器的 LogisticRegression 实例对象表面上看是一个多元分类器。 sklearn.svm.l1_min_c 可以计算使用 L1时 C 的下界,以避免模型为空(即全部特征分量的权重为零)。

lbfgs, sag 和 newton-cg 求解器只支持 L2罚项以及无罚项,对某些高维数据收敛更快。这些求解器的参数 multi_class设为 multinomial 即可训练一个真正的多项式 logistic 回归 [5] ,其预测的概率比默认的 “one-vs-rest” 设定更为准确。

sag 求解器基于平均随机梯度下降算法(Stochastic Average Gradient descent) [6]。在大数据集上的表现更快,大数据集指样本量大且特征数多。

saga 求解器 [7] 是 sag 的一类变体,它支持非平滑(non-smooth)的 L1 正则选项 penalty=“l1” 。因此对于稀疏多项式 logistic 回归 ,往往选用该求解器。saga求解器是唯一支持弹性网络正则选项的求解器。

lbfgs是一种近似于Broyden–Fletcher–Goldfarb–Shanno算法[8]的优化算法,属于准牛顿法。lbfgs求解器推荐用于较小的数据集,对于较大的数据集,它的性能会受到影响。[9]

总的来说,各求解器特点如下:

罚项 liblinear lbfgs newton-cg sag saga
多项式损失+L2罚项 ×
一对剩余(One vs Rest) + L2罚项
多项式损失 + L1罚项 × × × ×
一对剩余(One vs Rest) + L1罚项 √ × × ×
弹性网络 × × × ×
无罚项 ×
表现
惩罚偏置值(差) × × × ×
大数据集上速度快 × × ×
未缩放数据集上鲁棒 × ×

默认情况下,lbfgs求解器鲁棒性占优。对于大型数据集,saga求解器通常更快。对于大数据集,还可以用 SGDClassifier ,并使用对数损失(log loss)这可能更快,但需要更多的调优。

示例

  • Logistic回归中的L1罚项和稀疏系数
  • L1罚项-logistic回归的路径
  • 多项式和OVR的Logistic回归
  • newgroups20上的多类稀疏Logistic回归
  • 使用多项式Logistic回归和L1进行MNIST数据集的分类
    与 liblinear 的区别:
    当 fit_intercept=False 拟合得到的 coef_ 或者待预测的数据为零时,用 solver=liblinear 的 LogisticRegression 或 LinearSVC 与直接使用外部 liblinear 库预测得分会有差异。这是因为, 对于 decision_function 为零的样本, LogisticRegression 和 LinearSVC 将预测为负类,而 liblinear 预测为正类。
    注意,设定了 fit_intercept=False ,又有很多样本使得 decision_function 为零的模型,很可能会欠拟合,其表现往往比较差。建议您设置 fit_intercept=True 并增大 intercept_scaling 。
    注意:利用稀疏 logistic 回归进行特征选择
    带 L1罚项的 logistic 回归 将得到稀疏模型(sparse model),相当于进行了特征选择(feature selection),详情参见 基于 L1 的特征选取。
    LogisticRegressionCV 对 logistic 回归 的实现内置了交叉验证(cross-validation),可以找出最优的 C和l1_ratio参数 。newton-cg, sag, saga 和 lbfgs 在高维数据上更快,这是因为采用了热启动(warm-starting)。

二、代码实现

数据预处理

导入库

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

导入数据集

data = pd.read_csv('ex2data1.txt',sep = ',',names = ['exam1', 'exam2','admitted'])
data.head()
exam1 exam2 admitted
0 34.623660 78.024693 0
1 30.286711 43.894998 0
2 35.847409 72.902198 0
3 60.182599 86.308552 1
4 79.032736 75.344376 1
# 选取exam1和exam2列,并转为array类型
X = data.iloc[:,[0,1]].values
y = data.iloc[:,2].values

将数据集分为训练集和测试集

from sklearn.model_selection import train_test_split
X_train, X_test, y_train,  y_test = train_test_split(X, y, random_state = 0, test_size = 0.25)

特征缩放

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.fit_transform(X_test)

第二步:逻辑回归模型

将逻辑回归应用于训练集

LogisticRegressio官方指导文档

from sklearn.linear_model import LogisticRegression
classfier = LogisticRegression()
classfier.fit(X_train, y_train)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=100,
                   multi_class='warn', n_jobs=None, penalty='l2',
                   random_state=None, solver='warn', tol=0.0001, verbose=0,
                   warm_start=False)

第三步:预测

预测测试集结果

y_pred = classfier.predict(X_test)

第四步:评估预测

我们预测了测试集。 现在我们将评估逻辑回归模型是否正确的学习和理解。因此这个混淆矩阵将包含我们模型的正确和错误的预测。

生成混淆矩阵

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)

可视化

from matplotlib.colors import ListedColormap
X_set, y_set = X_train, y_train
X1, X2 = np.meshgrid(np.arange(start=X_set[:,0].min()-1, stop = X_set[:,0].max()+1, step=0.01),
                     np.arange(start=X_set[:,1].min()-1, stop = X_set[:,1].max()+1, step=0.01))
plt.contourf(X1, X2, classfier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c = ListedColormap(('red','green'))(i),label=j)
        
plt.title('LOGISTIC(Training set)')
plt.xlabel('Exam 1 score')
plt.ylabel('Exam 2 score')
plt.legend()
plt.show()

X_set, y_set = X_test, y_test
X1, X2 = np.meshgrid(np.arange(start=X_set[:,0].min()-1, stop = X_set[:,0].max()+1, step=0.01),
                     np.arange(start=X_set[:,1].min()-1, stop = X_set[:,1].max()+1, step=0.01))
plt.contourf(X1, X2, classfier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c = ListedColormap(('red','green'))(i),label=j)
        
plt.title('LOGISTIC(Test set)')
plt.xlabel('Exam 1 score')
plt.ylabel('Exam 2 score')
plt.legend()
plt.show()

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

logistic_regression---python实现 的相关文章

  • Python RAD(桌面部署)[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果这个问题回答了这么多次 请原谅我
  • 如何关闭python服务器

    使用此代码来运行 python 服务器 import os from http server import SimpleHTTPRequestHandler HTTPServer os chdir c users owner desktop
  • 使用解析将 ** 运算符更改为幂函数?

    我的要求是将 运算符更改为幂函数 例如 1 Input B 2 Output power B 2 2 B 2 T 2 X Output power B 2 我写了下面的正则表达式来解决这个问题 rx r a zA Z0 9 a zA Z0
  • 创建一个行为类似于任何变量但具有更改/读取回调的类

    我想创建一个类 其行为类似于 python 变量 但在更改 读取 变量 时调用一些回调函数 换句话说 我希望能够按如下方式使用该类 x myClass change callback read callback 将 x 定义为 myclas
  • Python3如何安装.ttf字体文件?

    我想使用 python3 更精确的 Python 3 6 代码在 Windows 10 上安装 ttf 字体文件 我用谷歌搜索 但我发现的唯一的就是这个使用python在windows上安装TTF字体 https stackoverflow
  • 不使用 graphviz/web 可视化决策树

    由于某些限制 我无法使用 graphviz webgraphviz com 可视化决策树 工作网络与另一个世界是封闭的 问题 是否有一些替代实用程序或一些 Python 代码用于至少非常简单的可视化可能只是决策树的 ASCII 可视化 py
  • 生产环境的 Flask-Login 与 Flask-Security

    我正在构建一个功能 供用户注册 登录 验证和授权自己 特别是使用 Python Flask 作为后端 我找到了一些解决方案 例如flask login and flask security 据我了解 flask login实际上并没有进行任
  • Python控制台默认十六进制显示

    我在 Python 控制台中做了很多工作 其中大部分都涉及地址 我更喜欢以十六进制形式查看地址 So if a 0xBADF00D 当我简单地输入Python gt a进入控制台查看其值 我更喜欢 python 回复0xBADF00D代替1
  • Pythoncom - 将相同的 COM 对象传递给多个线程

    你好 对于 COM 对象 我是一个完全的初学者 非常感谢任何帮助 我正在开发一个Python程序 该程序应该以客户端 服务器的方式读取传入的MS Word文档 即客户端发送一个请求 一个或多个MS Word文档 服务器使用pythoncom
  • Tensorflow 到 ONNX 的转换

    我目前正在尝试转换我使用本教程创建的已保存 且正在工作 的 pb 文件 https github com thtrieu darkflow https github com thtrieu darkflow 到 onnx 文件中 我目前正在
  • 如何使用子进程打开新的浏览器选项卡?

    我正在打开一个新的 IE 窗口 subprocess Popen r os environ PROGRAMFILES Internet Explorer IEXPLORE EXE Call URL 当 IE 关闭时这很好 但即使打开它也会生
  • 将 Python 控制台集成到 GUI C++ 应用程序中

    I m going to add a python console widget into a C GUI below some other controls 许多类将暴露给 python 代码 包括一些对 GUI 的访问 也许我会考虑 P
  • python 和 android 中通过 AES 算法加密和解密

    我有用于 AES 加密的 python 和 android 代码 当我在android中加密文本时 它在python上成功解密 但无法在android端解密 有人有想法吗 Python代码 import base64 import hash
  • 使用 Matplotlib、PyQt 和 Threading 进行实时绘图导致 python 崩溃

    我一直在努力研究我的 Python 应用程序 但找不到任何答案 我有 PyQT GUI 应用程序 它使用 Matplotlib 小部件 GUI 启动一个新线程来处理 mpl 小部件的绘图 恐怕我现在通过从另一个线程访问 matplotlib
  • 安装python启动文件

    我如何安装pythonstartup文件 以便它在命令上运行 例如python myfile py 我尝试将其安装到我的 home myuserUbuntu的目录 但它说我没有足够的权限 此外 不同的地方交替说它应该全部大写或全部小写 前面
  • 如何使用JQuery和Django(ajax + HttpResponse)?

    假设我有一个 AJAX 函数 function callpage ajax method get url abc data x 3 beforeSend function success function html IF HTTPRESPO
  • python 中的异步编程

    python 中有异步编程的通用概念吗 我可以为一个函数分配一个回调 执行它并立即返回主程序流 无论该函数的执行需要多长时间吗 您所描述的 主程序流程在另一个函数执行时立即恢复 不是通常所说的 异步 又名 事件驱动 编程 而是 多任务 又名
  • Python:如何使用生成器来避免 sql 内存问题

    我有以下方法来访问 mysql 数据库 并且查询在服务器中执行 我无权更改有关增加内存的任何内容 我对生成器很陌生 并开始阅读更多有关它的内容 并认为我可以将其转换为使用生成器 def getUNames self globalUserQu
  • Numba jitclass 不适用于 python 列表

    我在用python 3 6 and numba 0 36 这个问题有一个sister https stackoverflow com questions 48159360 numba custom stack class and pop f
  • 有效积累稀疏 scipy 矩阵的集合

    我有一个 O N NxN 的集合scipy sparse csr matrix 每个稀疏矩阵都有 N 个元素集 我想将所有这些矩阵加在一起以获得一个常规的 NxN numpy 数组 N 约为 1000 矩阵内非零元素的排列使得所得总和肯定不

随机推荐

  • 【深度学习之图像理解】图像分类、物体检测、物体分割、实例分割、语义分割的区别

    Directions in the CV 物体分割 Object segment 属于图像理解范畴 那什么是图像理解 Image Understanding IU 领域包含众多sub domains 如图像分类 物体检测 物体分割 实例分割
  • 前端zip.js实现加密打包上传文件

    背景 一方面 部分系统对文件的私密性和安全性要求较高 实现前端加密打包 服务端不存储密码 下载时手动输入密钥并解压文件 另一方面 传输压缩包到客户端 节约了带宽 节约了传输时间 使用的库 zip js Support of the Zip6
  • List写入Excel,poi操作

    前言 公司最近需要将所有的报表导出集中到报表中心系统中 需要做一个通用的Excel工具类 让各个业务系统简单高效的生成Excel报表 由于原先各个业务系统生成报表方式都不一样 有的地方还直接使用了CSV 因此需要统一生成Excel 本来想用
  • Android Studio 可以正常编译运行 但是代码爆红

    这段时间毕设选题 选了一个自己曾经做过的题目 因为之前是用Android Studio2 3 3写的 现在导入Android Studio 3 2 1 代码报错 但是能正常编译运行 很是奇怪 主要报错原因是 找不到有些类 之前用Androi
  • zookeeper(二)——2PC理论、zookeeper集群、ZAB 协议

    一 关于 2PC 提交 Two Phase Commitment Protocol 当一个事务操作需要跨越多个分布式节点的时候 为了保持事务处理的 ACID特性 就需要引入一个 协调者 TM 来统一调度所有分布式节点的执行逻辑 这些被调度的
  • CTFshow php特性 web111

    目录 源码 思路 题解 总结 源码
  • adworld-crypto-banana_princess

    拿到了一个打不开的pdf文件 用hex editor打开一下看看 再看一下正常的pdf文件 猜测是用了rot13映射了一下字母字符 解密脚本 def load data filename content with open filename
  • SpringBoot线程上下文传递数据

    1 底层实现 使用ThreadLocal 使用方法 public T get public void set T value public void remove 2 自定义上下文 package com ybw context confi
  • golang 闭包函数的应用技巧

    一 有名函数和匿名函数 函数变量类型初始值为nil 函数字面量类型的语法表达格式是 func InputTypeList OutputTypeList 无参函数 func fun var f func 无入参无返回值的函数对象声明 初始值为
  • 以太坊教程:入门学习开发以太坊dapp

    一 区块链 1 分布式去中心化 比特币设计的初衷就是要避免依赖中心化的机构 没有发行机构 也不可能操纵发行数量 既然没有中心化的信用机构 在电子货币运行的过程中 也势必需要一种机制来认可运行在区块链上的行为 包括比特币的运营 亦或是运行在区
  • 【pytorch】Module.parameters()函数实现与网络参数管理

    我们知道可以通过Module parameters 获取网络的参数 那这个是如何实现的呢 我先直接看看函数的代码实现 def parameters self r Returns an iterator over module paramet
  • Edge插件之WeTab,画面优美,可以免费使用chatgpt,很难不爱

    目录 一 普通的edge新标签页 二 安装WeTab插件 1 WeTab插件的安装非常简单 只需在百度搜索wetab 进入官网 2 进入官网 点击edge图标 进入插件下载页面 3 这里由于我是已经安装成功 显示的是删除和启动 首次下载的话
  • element-ui el-tooltip 显示导致父元素 hover 失效问题解决

    添加如下css属性 el tooltip popper pointer events none pointer events 属性用于设置元素是否对鼠标事件做出反应 CSS 语法 属性值 pointer events auto 默认值 设置
  • maven3.8.2版本导致openjdk.jar包报错:Cannot find file

    真的吐血了快 又是maven问题 导致项目打包报错 maven问题梅开二度 我醉了呀 问题描述 在idea中使用Terminal终端 对项目进行打包 然后报错 报错信息 ERROR Failed to execute goal on pro
  • IAR使用技巧

    一 状态栏的解析 Compile 只对目前打开的c文件进行语法检查 不对它进行link Make 对工程所有打开的c文件进行语法检查和link 只编译有改动的文件或者设置变动的文件 Rebuild All 编译链接当前工程 不管文件或者设置
  • Stem教育究竟是什么性质

    STEM教育是中性的 是既可以为应试教育又可以为素质教育服务的工具和武器 用素质教育去引爆STEM教育 才能产生良性的的核裂变 格物斯坦小坦克来研究下stem教育究竟是什么性质 科学教育有一个不大不小的误区 以为 科学 教育就是教科学知识
  • 错误:reference to non-static member function must be called

    问题 今天刷牛客这道题的时候 题目描述 输入一个正整数数组 把数组里所有数字拼接起来排成一个数 打印能拼接出的所有数字中最小的一个 例如输入数组 3 32 321 则打印出这三个数字能排成的最小数字为321323 这是我的代码 class
  • rtx服务器修改登录端口,rtx服务器端口设置

    rtx服务器端口设置 内容精选 换一换 用户在MRS Manager界面配置监控指标转储后 转储失败时产生该告警 转储成功后 告警恢复 监控指标转储失败会影响上层管理系统无法获取到MRS Manager系统的监控指标 无法连接服务器 无法访
  • Python Utils

    在Python开发中 将常用功能封装成为接口 并放入Utils工具类中 直接调用 可以提升效率 常用的函数有 文件夹遍历 文件夹创建 文件读取 时间可读 时间统计 安全除法 双列表排序 配置读取 脚本路径 Numpy判空 文件夹遍历 遍历文
  • logistic_regression---python实现

    logistic regression 用python实现 一 理论知识 logistic 回归 虽然名字里有 回归 二字 但实际上是解决分类问题的一类线性模型 在某些文献中 logistic 回归又被称作 logit 回归 maximum