基于逻辑回归的鸢尾花二分类和三分类问题

  • 一、问题描述及数据集获取
  • 二、逻辑回归
    • 1.概述
    • 2.应用
    • 3. LogisticRegression回归算法
    • 4. sklearn逻辑回归API
  • 三、代码实现及分析
    • 1.导入库
    • 2.导入数据集及分析
      • 2.1 鸢尾花数据集
      • 2.2 查看关键字:
      • 2.3 查看数据集描述:
      • 2.4 查看各类信息
      • 2.5 特征与标签组合的散点可视化
    • 3. 逻辑回归模型
      • 3.1 创建训练集和测试集
      • 3.2 二分类实现
      • 3.3 三分类实现
  • 四、小结

一、问题描述及数据集获取

本实例分别以逻辑回归和支持向量机两种算法实现对Iris数据集的分类。
Iris数据集是常用的分类实验数据集,由Fisher于1936年收集整理。Iris数据集也称鸢尾花数据集,是一个用于多重变量分析的数据集。数据集包含150个样本,分为3类,分别是山鸢尾(Iris Setosa)、变色鸢尾(Iris Versicolor)和维吉尼亚鸢尾(Iris Virginica),每类50个样本,每个样本数据包含4个属性特征,分别是花尊长度、花尊宽度、花瓣长度和花瓣宽度。可通过鸢尾花的4个属性特征预测鸢尾花属于三个种类中的哪一类。
该数据集包含了5个属性,其概况如表2-1所示。

表2-1 鸾尾花数据集概况

特征1 特征2 特征3 特征4 标签
物理含义 花萼长度 花萼宽度 花瓣长度 花瓣宽度 鸾尾花种类
英文释义 Sepal Length Sepal Width Petal Length Petal Width clsss
数据形式 float float float float int
单位 cm cm cm cm

部分鸾尾花样本如表2-2所示。

表2-2 部分鸾尾花样本

花萼长度 花萼宽度 花瓣长度 花瓣宽度 属种(鸾尾花种类)
5.1 3.5 1.4 0.2 setosa
4.9 3.0 1.4 0.2 setosa
4.7 3.2 1.3 0.2 setosa
4.6 3.1 1.5 0.2 setosa

本实例中的Iris 数据集取自scikit-leam包,使用load_iris 方法即可加载Iris数据集,使用train test_split方法可以很方便地将原始数据集划分为两部分,分别用于模型训练和模型测试。默认情况下,train_test_split方法会将25%的数据划分到测试集,75%的数据划分到训练集,random_state 保证了随机采样的可重复性(只要random_state值固定,每次划分得到的训练集和测试集就保持一致)。

二、逻辑回归

1.概述

逻辑回归(Logistic regression,简称LR)虽然其中带有"回归"两个字,但逻辑回归其实是一个分类模型,并且广泛应用于各个领域之中。虽然现在深度学习相对于这些传统方法更为火热,但实则这些传统方法由于其独特的优势依然广泛应用于各个领域中。

而对于逻辑回归而且,最为突出的两点就是其模型简单和模型的可解释性强。

逻辑回归模型的优劣势:

  • 优点:实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低;
  • 缺点:容易欠拟合,分类精度可能不高

逻辑回归 原理简介:

Logistic回归虽然名字里带“回归”,但是它实际上是一种分类方法,主要用于两分类问题(即输出只有两种,分别代表两个类别),所以利用了Logistic函数(或称为Sigmoid函数),函数形式为:
log⁡i(z)=11+e−z\log i(z) = \frac{1}{{1 + {e^{ - z}}}}logi(z)=1+e−z1​

其对应的函数图像可以表示如下:

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-5,5,0.01)
y = 1/(1+np.exp(-x))plt.plot(x,y)
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.show()

通过上图我们可以发现 Logistic 函数是单调递增函数,并且在z=0的时候取值为0.5,并且logi()logi()logi()函数的取值范围为(0,1)

而回归的基本方程为 z=w0+ΣiNwixiz = {w_0} + \Sigma _i^N{w_i}{x_i}z=w0​+ΣiN​wi​xi​.

将回归方程写入其中为:
p=p(y=1∣x,θ)=11+e−(w0+ΣiNwixi)p = p(y = 1|x,\theta ) = \frac{1}{{1 + {e^{ - ({w_0} + \Sigma _i^N{w_i}{x_i})}}}} p=p(y=1∣x,θ)=1+e−(w0​+ΣiN​wi​xi​)1​

所以,p(y=1∣x,θ)=hθ(x,θ),p(y=0∣x,θ)=1−hθ(x,θ)p(y = 1|x,\theta ) = {h_\theta }(x,\theta ),p(y = 0|x,\theta ) = 1 - {h_\theta }(x,\theta )p(y=1∣x,θ)=hθ​(x,θ),p(y=0∣x,θ)=1−hθ​(x,θ)

逻辑回归从其原理上来说,逻辑回归其实是实现了一个决策边界:对于函数y=11+e−zy = \frac{1}{{1 + {e^{ - z}}}}y=1+e−z1​ ,当z≥0z\ge0z≥0时, y≥0.5y \ge 0.5y≥0.5
,分类为1,当z<0z<0z<0时, y<0.5y < 0.5y<0.5,分类为0,其对应的y值我们可以视为类别1的概率预测值.

对于模型的训练而言:实质上来说就是利用数据求解出对应的模型的特定的 w。从而得到一个针对于当前数据的特征逻辑回归模型。

而对于多分类而言,将多个二分类的逻辑回归组合,即可实现多分类。

2.应用

逻辑回归模型广泛用于各个领域,包括机器学习,大多数医学领域和社会科学。例如,最初由Boyd 等人开发的创伤和损伤严重度评分(TRISS)被广泛用于预测受伤患者的死亡率,使用逻辑回归 基于观察到的患者特征(年龄,性别,体重指数,各种血液检查的结果等)分析预测发生特定疾病(例如糖尿病,冠心病)的风险。逻辑回归模型也用于预测在给定的过程中,系统或产品的故障的可能性。还用于市场营销应用程序,例如预测客户购买产品或中止订购的倾向等。在经济学中它可以用来预测一个人选择进入劳动力市场的可能性,而商业应用则可以用来预测房主拖欠抵押贷款的可能性。条件随机字段是逻辑回归到顺序数据的扩展,用于自然语言处理。

逻辑回归模型现在同样是很多分类算法的基础组件,比如 分类任务中基于GBDT算法+LR逻辑回归实现的信用卡交易反欺诈,CTR(点击通过率)预估等,其好处在于输出值自然地落在0到1之间,并且有概率意义。模型清晰,有对应的概率学理论基础。它拟合出来的参数就代表了每一个特征(feature)对结果的影响。也是一个理解数据的好工具。但同时由于其本质上是一个线性的分类器,所以不能应对较为复杂的数据情况。很多时候我们也会拿逻辑回归模型去做一些任务尝试的基线(基础水平)。

3. LogisticRegression回归算法

LogisticRegression回归模型在Sklearn.linear_model子类下,调用sklearn逻辑回归算法步骤比较简单,即:

(1) 导入模型。调用逻辑回归LogisticRegression()函数。

(2) fit()训练。调用fit(x,y)的方法来训练模型,其中x为数据的属性,y为所属类型。

(3) predict()预测。利用训练得到的模型对数据集进行预测,返回预测结果。

4. sklearn逻辑回归API

sklearn.linear_model.LogisticRegression(penalty='l2', dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='lbfgs', max_iter=100, multi_class='auto', verbose=0, warm_start=False, n_jobs=None, l1_ratio=None)

参数:

  • penalty:惩罚项,str类型,可选参数为l1和l2,默认为l2。用于指定惩罚项中使用的规范。newton-cg、sag和lbfgs求解算法只支持L2规范。
  • dual:对偶或原始方法,bool类型,默认为False。对偶方法只用在求解线性多核(liblinear)的L2惩罚项上。当样本数量>样本特征的时候,dual通常设置为False。
  • tol:停止求解的标准,float类型,默认为1e-4。就是求解到多少的时候,停止,认为已经求出最优解。
  • c:正则化系数λ的倒数,float类型,默认为1.0。必须是正浮点型数。像SVM一样,越小的数值表示越强的正则化。
  • fit_intercept:是否存在截距或偏差,bool类型,默认为True。
  • intercept_scaling:仅在正则化项为”liblinear”,且fit_intercept设置为True时有用。float类型,默认为1。
  • class_weight:用于标示分类模型中各种类型的权重,可以是一个字典或者balanced字符串,默认为不输入,也就是不考虑权重,即为None。
  • random_state:随机数种子,int类型,可选参数,默认为无,仅在正则化优化算法为sag,liblinear时有用。
  • solver:优化算法选择参数,只有五个可选参数,即newton-cg,lbfgs,liblinear,sag,saga。默认为liblinear。solver参数决定了我们对逻辑回归损失函数的优化方法,有四种算法可以选择,分别是:
  • liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
  • lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
  • newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
  • sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。
  • saga:线性收敛的随机优化算法的的变重。

三、代码实现及分析

1.导入库

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from mpl_toolkits.mplot3d import Axes3D
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn import metrics

2.导入数据集及分析

2.1 鸢尾花数据集

data = load_iris()  # 数据集
iris_target = data.target # 标签
# 将所需的数据以及特征名提取出来转换成DataFrame类型,方便后面处理
iris_df = pd.DataFrame(data=data.data, columns=data.feature_names)

2.2 查看关键字:

print(data.keys())

2.3 查看数据集描述:

print(data["DESCR"])

由DESCR可知:
iris数据集共有150个样本,三个种类,每个类有五十个样本

三个种类:class:

  • Iris-Setosa(标签0)
  • Iris-Versicolour(标签1)
  • Iris-Virginica(标签2)

每个样本特征向量为4个:
Attribute Information:

  • sepal length in cm(花萼长度)
  • sepal width in cm(花萼宽度)
  • petal length in cm(花瓣长度)
  • petal width in cm(花瓣宽度)

统计特征:

其中,Class Correlation为类别相关性

2.4 查看各类信息

print(data.feature_names)
print(data.target_names)
print(data.target)
print(iris_df.head())
print(iris_df.tail())
print(iris_df.info())
print(iris_df.describe())

将原iris_df复制出来,防止变动,并将数据标签添加到iris_all中

iris_all = iris_df.copy()
iris_all['target'] = iris_target

2.5 特征与标签组合的散点可视化

2.5.1 sns.pairplot展现变量两两之间的关系

sns.pairplot(data=iris_all,hue='target', palette="coolwarm")
plt.show()


2.5.2 2D散点图

plt.plot(iris_all[iris_all["target"]==0]["petal length (cm)"],iris_all[iris_all["target"]==0]["petal width (cm)"],"rs",label="Setosa")
plt.plot(iris_all[iris_all["target"]==1]["petal length (cm)"],iris_all[iris_all["target"]==1]["petal width (cm)"],"bx",label="Versicolour")
plt.plot(iris_all[iris_all["target"]==2]["petal length (cm)"],iris_all[iris_all["target"]==2]["petal width (cm)"],"go",label="Virginica")
plt.xlabel("petal length (cm)")
plt.ylabel("petal width (cm)")
plt.legend()
plt.rcParams["font.sans-serif"]="simHei"
plt.show()


2.5.3 3D散点图

#绘制三维散点图
fig = plt.figure(figsize=(20,15))
ax =fig.add_subplot(121,projection='3d')
ax.scatter(iris_all[iris_all["target"]==0]["sepal length (cm)"], iris_all[iris_all["target"]==0]["petal length (cm)"], iris_all[iris_all["target"]==0]["petal width (cm)"])
ax.scatter(iris_all[iris_all["target"]==1]["sepal length (cm)"], iris_all[iris_all["target"]==1]["petal length (cm)"], iris_all[iris_all["target"]==1]["petal width (cm)"])
ax.scatter(iris_all[iris_all["target"]==2]["sepal length (cm)"], iris_all[iris_all["target"]==2]["petal length (cm)"], iris_all[iris_all["target"]==2]["petal width (cm)"])
ax.set_xlabel('sepal length (cm)')
ax.set_ylabel('petal length (cm)')
ax.set_zlabel('petal width (cm)')
plt.show()

3. 逻辑回归模型

3.1 创建训练集和测试集

iris_df_part = iris_df.iloc[:100]
iris_target_part = iris_target[:100]x_train, x_test, y_train, y_test = train_test_split(iris_df_part, iris_target_part, test_size = 0.2, random_state =180)X_train,X_test,Y_train,Y_test=train_test_split(iris_df,iris_target,test_size=0.2,random_state=180)

3.2 二分类实现

# 训练逻辑回归二分类模型
def basic2_logosticregression(x_train, x_test, y_train, y_test):model=LogisticRegression(random_state=0, solver='lbfgs') model.fit(x_train,y_train)y_train_pre=model.predict(x_train)y_test_pre=model.predict(x_test)## 利用 predict_proba 函数预测其概率train_predict_proba = model.predict_proba(x_train)test_predict_proba = model.predict_proba(x_test)print('测试预测每一类的概率:\n',test_predict_proba)MSE_train=mean_squared_error(y_train,y_train_pre)MSE_test=mean_squared_error(y_test,y_test_pre)confusion_matrix_result = metrics.confusion_matrix(y_test_pre,y_test)print('混淆矩阵结果:\n',confusion_matrix_result)plt.figure(figsize=(8, 6))sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')plt.xlabel('预测的标签')plt.ylabel('实际的标签')print("权重w:"+ str(model.coef_))print("截距w0:"+ str(model.intercept_))print("训练集均方误差:"+str(MSE_train))print("测试集均方误差:"+str(MSE_test))print("score_train: "+str(model.score(x_train,y_train)))print("score_test: "+str(model.score(x_test,y_test)))

调用:

basic2_logosticregression(x_train, x_test, y_train, y_test)


3.3 三分类实现

# 训练逻辑回归三分类模型
def basic3_logosticregression(X_train,X_test,Y_train,Y_test):model=LogisticRegression(random_state=0, solver='lbfgs')model.fit(X_train,Y_train)Y_train_pre=model.predict(X_train)print(Y_train_pre)Y_test_pre=model.predict(X_test)train_predict_proba = model.predict_proba(X_train)test_predict_proba = model.predict_proba(X_test)print('测试预测每一类的概率:\n',test_predict_proba)confusion_matrix_result = metrics.confusion_matrix(Y_test_pre,Y_test)print('混淆矩阵结果:\n',confusion_matrix_result)# 利用热力图对于结果进行可视化plt.figure(figsize=(8, 6))sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')plt.xlabel('预测的标签')plt.ylabel('实际的标签')MSE_train=mean_squared_error(Y_train,Y_train_pre)MSE_test=mean_squared_error(Y_test,Y_test_pre)print("权重:"+ str(model.coef_))print("截距:"+ str(model.intercept_))print("训练集均方误差:"+str(MSE_train))print("测试集均方误差:"+str(MSE_test))print("score_train: "+str(model.score(X_train, Y_train)))print("score_test: "+str(model.score(X_test,Y_test)))

调用:

basic3_logosticregression(X_train,X_test,Y_train,Y_test)


四、小结

通过上述测试结果,在逻辑回归中,我们可以发现,其在三分类的结果的预测准确度上有所下降,其在测试集上的准确度为: 96.67% ,这是由于类别标签1和2两个类别的特征,我们从可视化的时候也可以发现,其特征的边界具有一定的模糊性(边界类别混杂,没有明显区分边界),所有在这两类的预测上出现了一定的错误。

实例:【基于逻辑回归的鸢尾花二分类和三分类问题】相关推荐

  1. RDkit&mol2vec :基于逻辑回归的靶标抑制剂活性二分类对比

    逻辑回归(logistics regression) 逻辑回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域.逻辑回归从本质来说属于二分类问题 ...

  2. 机器学习笔记-基于逻辑回归的分类预测

    天池学习笔记:AI训练营机器学习-阿里云天池 基于逻辑回归的分类预测 1 逻辑回归的介绍和应用 1.1 逻辑回归的介绍 逻辑回归(Logistic regression,简称LR)虽然其中带有&quo ...

  3. 机器学习算法(一): 基于逻辑回归的分类预测-Task01

    基于逻辑回归LR的分类预测 1.逻辑回归的介绍 Logistic Regression 虽然被称为回归,但其实际上是分类模型,并常用于二分类.Logistic Regression 因其简单.可并行化 ...

  4. 基于逻辑回归的鸢尾花分类预测

    基于逻辑回归的分类预测 1 逻辑回归的介绍和应用 1.1 逻辑回归的介绍 1.2 逻辑回归的应用 2 学习目标 3 代码流程 4 算法实战 4.1 Demo实践 Step1:库函数导入 Step2:模 ...

  5. ML机器学习算法(一): 基于逻辑回归的分类预测

    机器学习算法(一): 基于逻辑回归的分类预测 1 逻辑回归的介绍和应用 1.1 逻辑回归的介绍 逻辑回归(Logistic regression,简称LR)虽然其中带有"回归"两个 ...

  6. python逻辑回归训练预测_[Python] 机器学习笔记 基于逻辑回归的分类预测

    导学问题 什么是逻辑回归(一),逻辑回归的推导(二 3),损失函数的推导(二 4) 逻辑回归与SVM的异同 逻辑回归和SVM都用来做分类,都是基于回归的概念 SVM的处理方法是只考虑 support ...

  7. 基于逻辑回归的新闻数据集分类

    目录 1. 作者介绍 2. 逻辑回归 2.1 逻辑回归 2.2 逻辑回归算法 3. 实验过程 3.1 fetch_20newsgroups(20类新闻文本)数据集的简介 3.2 实验代码 3.3 运行 ...

  8. 基于逻辑回归,支持向量机,朴素贝叶斯以及简单深度学习文本分类方法(BiLSTM、CNN)实现的中文情感分析,含数据集可直接运行

    基于逻辑回归,支持向量机,朴素贝叶斯以及简单深度学习文本分类方法(BiLSTM.CNN)实现的中文情感分析,含数据集可直接运行 完整代码下载地址:中文情感分析 中文情感分析 本项目旨在通过一个中文情感 ...

  9. 基于Python的情感极性判断(基于规则、基于逻辑回归、基于朴素贝叶斯)

    资源下载地址:https://download.csdn.net/download/sheziqiong/85734418 资源下载地址:https://download.csdn.net/downl ...

最新文章

  1. ASP.net中的几种分页方法
  2. ad域帐号登录提示无法处理请求_微软Windows Server之AD域控制器迁移测试方案
  3. bom event周期_前端知识点总结——BOM
  4. C语言学习之将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1. 要求改为1,4,5,6,8。
  5. MOXy作为您的JAX-RS JSON提供程序–客户端
  6. react把表格渲染好ui_react 入坑笔记(五) - 条件渲染和列表渲染
  7. Tuxera NTFS对磁盘进行不同格式转换
  8. awk编程之数组、控制流(长期更新)
  9. WPF教程:依赖属性
  10. java文件如何打包_java文件如何打包?
  11. Ember之Computed Properties计算属性
  12. 定值保险计算举例_保险学计算题
  13. no matter相关
  14. 如何区分b ,B,KB,MB,GB?
  15. “疫情待业在家做跨境电商,两年全款买了房”:你看不起的行业,往往很赚钱...
  16. mac安全性与隐私 不允许_隐私不仅仅是安全
  17. 随机生成一个1 到100之间的整数,从键盘输入数字进行猜数,一共可以猜5次
  18. AtCoder Beginner Contest 242——1111gal password
  19. 从自己挖的坑里爬出来
  20. Java学习路线(完整详细版)超详细

热门文章

  1. linux下如何删除文件
  2. Java 面向对象之剪刀石头布
  3. 【§再看掉出来了win7主题之热门电脑主题下载§】
  4. php创建mdb,如何用php创建一个新的.MDB文件?
  5. 我的世界服务器名称被占用,【求助】【紧急】【大神】水桶服务器启动后显示端口被占用...
  6. Hive综合案例练习(中级):环境数据准备
  7. SSH使用及协议分析。
  8. 程序员初入职场,你应该遵守什么“潜规则”?
  9. 多元统计分析--聚类分析(系统性聚类、K均值聚类)
  10. java怎么打印对象内容_如何打印对象内容