这一节主要将逻辑回归模型应用到莺尾花数据集进行分类

our features were measured from each sample: the length and the width of the sepals and petals, in centimeters.
数据集包含 Setosa、Versicolor 和 Virginica 3 个种类,这三个类别标签就是我们想要预测的量,即因变量。其中每个种类包含有 50 个数据,每个数据包含 4 种变量(特征),这 4 种变量就是我们要分析的自变量,分别是:花瓣长度、花瓣宽度、花萼长度和花萼宽度。

1. 从单变量说起

先看一个简单的问题:请利用花萼长度这一特征(自变量)来对 setosa 和 versicolor 两类(因变量)进行分类。

(1)读取两类数据

df = iris.query("species == ('setosa', 'versicolor')")
y_0 = pd.Categorical(df['species']).codes
x_n = 'sepal_length'
x_0 = df[x_n].values

(2)查看一下数据格式

(3)建立逻辑回归模型

with pm.Model() as model_0:alpha = pm.Normal('alpha', mu=0, sd=10)beta = pm.Normal('beta', mu=0, sd=10)mu = alpha + pm.math.dot(x_0, beta)theta = pm.Deterministic('theta', 1 / (1 + pm.math.exp(-mu)))bd = pm.Deterministic('bd', -alpha/beta)yl = pm.Bernoulli('yl', p=theta, observed=y_0)start = pm.find_MAP()step = pm.NUTS()trace_0 = pm.sample(5000, step, start, nchains=1)varnames = ['alpha', 'beta', 'bd']
pm.traceplot(trace_0, varnames)
plt.savefig('B04958_05_05.png', dpi=300, figsize=(5.5, 5.5))

这里需要注意两点:

  1. 变量 theta 表示什么? 变量 theta 是对 mu 应用逻辑函数之后的值,表示 p(y=1∣x)p(y=1|x)p(y=1∣x);
  2. 变量 bd 表示什么? 变量 bd 表示决策边界,位于决策左侧的 x 值属于类别0,位于决策右侧的 x 值属于类别1。
    接下来证明为什么 bd = −αβ-\frac{\alpha}{\beta}−βα​?
    假设分类出错的代价是对称的,即 p=0.5 决定着区分 0类与 1类,所以有:
    0.5=logistic(α+βxi)=>0=α+βxi=>xi−αβ0.5 = logistic(\alpha + \beta x_i) => 0 = \alpha + \beta x_i => x_i-\frac{\alpha}{\beta}0.5=logistic(α+βxi​)=>0=α+βxi​=>xi​−βα​

(4)将后验的总结打印出来,然后将 bd 与通过另外一种方式得到的值进行比较

(5)现在我们将数据及拟合的Sigmoid曲线画出来

注意:这里的曲线是 y=11+e−(α+βX)y = \frac{1}{1+e^{-(\alpha+\beta X)}}y=1+e−(α+βX)1​,并不是 y=11+e−xy = \frac{1}{1+e^{-x}}y=1+e−x1​。
另外,上述模型找的决策边界95%HPD区间(红色区域)并不能很好地区分数据集。可能是模型不够好,也可能是只根据这一个特征很难区分这两个类别,显然这里应该是后者。

(6)使用模型做预测
给定若干个 花萼长度 返回他们分类结果为versicolor(1类)的概率值

def classify(n, threshold):"""A simple classifying function"""n = np.array(n)mu = trace_0['alpha'].mean() + trace_0['beta'].mean() * nprob = 1 / (1 + np.exp(-mu))return prob, prob >= thresholdclassify([5, 5.5, 6], 0.5)


可以看到,三个样本点属于 1类 的概率分别是(0.14, 0.59, 0.93)。

2. 多元逻辑回归

与多变量线性回归类似,多元逻辑回归使用了多个自变量。这里讲根据花萼长度与花萼宽度结合在一起对 setosa 与 versicolor 进行分类。
(1)读取两类数据

df = iris.query("species == ('setosa', 'versicolor')")
y_1 = pd.Categorical(df['species']).codes
x_n = ['sepal_length', 'sepal_width']
x_1 = df[x_n].values#x_1 = (x_1 - x_1.mean(axis=0))/x_1.std(axis=0)
#x_1 = (x_1 - x_1.mean(axis=0))

(2)查看一下数据格式

(3)建立逻辑回归模型

with pm.Model() as model_1:# We define the priorisalpha = pm.Normal('alpha', mu=0, sd=10)beta = pm.Normal('beta', mu=0, sd=2, shape=len(x_n))mu = alpha + pm.math.dot(x_1, beta)# Aplly the logistic linking functiontheta = 1 / (1 + pm.math.exp(-mu))# Compute the boundary decisionbd = pm.Deterministic('bd', -alpha/beta[1] - beta[0]/beta[1] * x_1[:,0])# Define the likelihoodyl = pm.Bernoulli('yl', p=theta, observed=y_1)# Sampling#start = pm.find_MAP()#step = pm.NUTS()#trace_1 = pm.sample(5000, step, start)trace_1 = pm.sample(5000, nchains=1)chain_1 = trace_1[100:]
pm.traceplot(chain_1)
plt.savefig('B04958_05_07.png', dpi=300, figsize=(5.5, 5.5))

现在我们看看二元逻辑回归的决策边界(一条直线):
0.5=logistic(α+β0x0+β1x1)=>0=α+β0x0+β1x10.5 = logistic(\alpha + \beta_0 x_0 + \beta_1 x_1) => 0 = \alpha + \beta_0 x_0 + \beta_1 x_1 0.5=logistic(α+β0​x0​+β1​x1​)=>0=α+β0​x0​+β1​x1​ x1=−αβ1+(−β0β1)∗x0x_1 = -\frac{\alpha}{\beta_1} + (-\frac{\beta_0}{\beta_1}) *x_0 x1​=−β1​α​+(−β1​β0​​)∗x0​

思考一下为什么现在 bd 是100个曲线(每个曲线对于一个数据点)?
(4)现在我们将数据及拟合的Sigmoid曲线画出来


对于多元逻辑回归,这里还有几个问题需要交代。

3. 多元逻辑回归细节

3.1 处理相关变量

相关变量是什么?相关变量会引发什么问题?相关变量是指两个变量之间存在一定的相关关系(比如线性关系),相关变量限制模型的能力更弱,即不能给予模型足够多的限制。

那么如何解决这个问题呢?

  1. 不使用相关变量;
  2. 使用携带信息的先验;
  3. 使用弱先验。

3.2 处理类别不平衡数据

类别不平衡会使得决策边界向样本量更少的类别偏移,而且不确定性会更大。

3.3 如何解决类别不平衡的问题

给数据加入更多的先验信息。

3.4 解释逻辑回归系数

系数 β\betaβ 的意义是:当 xxx 增加单位量的时候,发生比的对数增量。

发生比:
p(y=1∣x)1−p(y=1∣x)\frac{p(y =1|x)}{1 - p(y=1|x)}1−p(y=1∣x)p(y=1∣x)​

3.5 Softmax回归

使用完整的数据集(4个特征)进行分类(3类),这个作为一个练习,代码我会附在项目源码中。

项目源码:https://github.com/dhuQChen/BayesianAnalysis

贝叶斯分析之利用逻辑回归对数据进行分类相关推荐

  1. python利用什么写模板_Python利用逻辑回归分类实现模板

    Logistic Regression Classifier逻辑回归主要思想就是用最大似然概率方法构建出方程,为最大化方程,利用牛顿梯度上升求解方程参数. 优点:计算代价不高,易于理解和实现. 缺点: ...

  2. TF之LoR:基于tensorflow利用逻辑回归算LoR法实现手写数字图片识别提高准确率

    TF之LoR:基于tensorflow利用逻辑回归算LoR法实现手写数字图片识别提高准确率 目录 输出结果 设计代码 输出结果 设计代码 #TF之LoR:基于tensorflow实现手写数字图片识别准 ...

  3. ML之mlxtend:基于iris鸢尾花数据集利用逻辑回归LoR/随机森林RF/支持向量机SVM/集成学习算法结合mlxtend库实现模型可解释性(决策边界可视化)

    ML之mlxtend:基于iris鸢尾花数据集利用逻辑回归LoR/随机森林RF/支持向量机SVM/集成学习算法结合mlxtend库实现模型可解释性(决策边界可视化) 目录 相关文章 ML之mlxten ...

  4. 利用逻辑回归进行简单的人群分类解决广告推荐问题

    利用逻辑回归进行简单的人群分类解决广告推荐问题 参考文章: (1)利用逻辑回归进行简单的人群分类解决广告推荐问题 (2)https://www.cnblogs.com/songyifan427/p/1 ...

  5. 信用卡欺诈案例数据分析——利用逻辑回归进行分类

    1.数据读取 import pandas as pd import matplotlib.pyplot as plt import numpy as np %matplotlib inlinedata ...

  6. 利用逻辑回归进行用户流失预测分析

    1.项目背景 客户流失是所有与消费者挂钩行业都会关注的点.因为发展一个新客户是需要一定成本的,一旦客户流失,除了浪费拉新成本,还需要花费更多的用户召回成本. 所以,电信行业在竞争日益激烈当下,如何挽留 ...

  7. Python | 逻辑回归(数据学习时长与是否通过考试)

    逻辑回归 逻辑回归里虽然带回归2字,其实其本质是分类,相当于打个标签,0或1,包括得出0或1的概率 线性回归返回的是一个数值,而不是标签,对于标签的预测,逻辑回归更合适 其中X=z=a+bx impo ...

  8. R 逻辑回归乳腺癌数据

    7-1 乳腺癌数据准备 loc <- "http://archive.ics.uci.edu/ml/machine-learning-databases/" ds <- ...

  9. 利用逻辑回归进行员工离职预测

    数据城堡上的比赛,也是自己第一次独立完成的练手项目,只做了基本的数据特征处理,还不够精致.初始得分0.802,经过优化后0.877. import pandas as pd import numpy ...

最新文章

  1. 插值法:拉格朗日插值、牛顿插值
  2. 【学习笔记】WQS二分详解及常见理解误区解释
  3. 破解key file时经常用到的几个API函数及其用法
  4. 盲人方便的使用计算机输入文字,中文信息学报盲人用计算机软件系统中的语音和自然语言处理技术Ξ.PDF...
  5. C语言程序项目计划书,(C语言程序设计课程设计计划书.doc
  6. python小学生教程-python 小学生教程|怎么让一个小学生学会Python?
  7. 云台山风景区:秋末冬初,走进湘中小镇的诗意时光
  8. 关于一些数学符号和概率的阐述;
  9. 2018华为软挑--模拟退火+FF解决装箱问题【C++代码】
  10. 自由空气间隙,爬电距离计算~~最便宜的ESD防护方法
  11. jQuery动画与效果
  12. PN转CANopen调试案例
  13. npm模块之opn使用教程(node **.js直接再浏览器中打开相应的文件)
  14. 从微信的成功看移动AppUI设计的精髓
  15. The event in requested index is outdated and cleared (the requested history has been cleared ) 问题和修复
  16. 人工智能很危险!?开发需谨慎?
  17. 《操作系统》-吸烟者问题
  18. 新手的java学习建议
  19. 《桃花庵歌》- 唐寅
  20. 超碰网站源码搭建教程超碰在线视频搭建超碰网站搭建教程

热门文章

  1. 一个中国白领(SAP从业者)的美国跳槽记
  2. Framer Motion问题收集
  3. js 检查当前浏览器是否在苹果设备上
  4. java.lang.IllegalArgumentException: MALFORMED
  5. linux标准学习之-LSB
  6. 菜鸟实现 PHP 二阶、三阶行列式计算和矩阵运算的加、减、乘
  7. Win7(32bit) + VS2012 + Qt
  8. 移动端网页站点调用拨打电话发送短信等功能
  9. Linux—教你两个方法轻松找回root密码
  10. 配置Chrony同步时间,以及ntpd,ntpupate