监督学习之分类学习:线性分类器

article/2025/9/28 5:49:15

监督学习之分类学习:线性分类器

如果想了解更多的知识,可以去我的机器学习之路 The Road To Machine Learning通道

Introduction

分类学习是最为常见的监督学习问题,并且其中的经典模型也最为广泛地被应用。其中,最基础的便是二分类(Binary Classification) 问题,即判断是非,从两个类别中选择一个作为预测结果;除此之外还有 多类分类(Multiclass Classification) 的问题,即在多于 两个类别中选择一个;甚至还有多标签分类(Multi-label Classification)问题,与上述二分类以及多类分类问题不同,多标签分类问题判断一个样本是否同时属于多个不同类别。

在实际生活和工作中,我们会遇到许许多多的分类问题,比如,医生对肿瘤性质的判定;邮政系统对手写体邮编数字进行识别;互联网资讯公司对新闻进行分类;生物学家对 物种类型的鉴定;甚至,我们还能够对某些大灾难的经历者是否生还进行预测等。

线性分类器

  • 模型介绍:线性分类器(Linear Classifiers),顾名思义,是一种假设特征与分类结果存在线性关系的模型。这个模型通过累加计算每个维度的特征与各自权重的乘积来帮助类别决策。

如果我们定义 x = < x 1 , x 2 , … , x n > x = <x_1,x_2,\dots,x_n> x=<x1,x2,,xn>来代表n维特征列向量D,同时用n维列向量 w = < w 1 , w 2 , … , w n > w=<w_1,w_2,\dots,w_n> w=<w1,w2,,wn>来代表对应的权重,或者叫做系数(Coefficient);同时为了避免其 过坐标原点这种硬性假设,增加一个截距(Intercept)b。由此这种线性关系便可以表达为 f ( w , x , b ) = w T x + b f(w,x,b)=w^Tx+b f(w,x,b)=wTx+b
这里的f∈R,取值范围分布在整个实数域中。
然而,我们所要处理的最简单的二分类问题希望f∈{0,1};因此需要一个函数把原 先的∈R映射到(0,1)。于是我们想到了逻辑斯蒂(Logistic)函数:
g ( z ) = 1 1 + e − z g(z) = \frac{1}{1+e^{-z}} g(z)=1+ez1
这里z∈R,并且g∈(0,1),函数图像如图所示
在这里插入图片描述
综上,如果将 z z z替换为 f f f,结合两个方程,就获得了一个经典的线性分类器,逻辑斯蒂回归模型(Logistic Regression):
h w , b ( x ) = g ( f ( w , x , b ) ) = 1 1 + e − f = 1 1 + e − ( w T x + b ) h_{w,b}(x)=g(f(w,x,b))=\frac{1}{1+e^{-f}}=\frac{1}{1+e^{-(w^Tx+b)}} hw,b(x)=g(f(w,x,b))=1+ef1=1+e(wTx+b)1

如果z = 0,那么g = 0.5;若z < 0则g < 0.5,这个特征向量被判别为一类;反之,若z > 0,则g > 0.5, 其被归为另外一类。
当使用一组m个用于训练的特征向量 X = < x 1 , x 2 , . . , x m > X=<x^1,x^2,..,x^m> X=<x1,x2,..,xm>和其所对应的分类目标 y = < y 1 , y 2 , … , y m > y=<y^1,y^2,\dots,y^m> y=<y1,y2,,ym>,我们希望逻辑斯蒂模型可以在这组训练集上取得最大似然估计(Maximum Likelihod)的概率 L(w,b)。或者说,至少要在训练集上表现如此:
a r g m a x w , b L ( w , b ) = ∏ 1 = 1 m ( h w , b ( i ) ) y i ( 1 − h w , b ( i ) ) 1 − y i argmax_{w,b} L(w,b) = \prod_{1=1}^{m} (h_{w,b}(i))^{y^i}(1-h_{w,b}(i))^{1-y^i} argmaxw,bL(w,b)=1=1m(hw,b(i))yi(1hw,b(i))1yi
为了学习到决定模型的参数(Parameters),即系数w和截距b,我们普遍使用一种精确计算的解析算法和一种快速估计的随机梯度上升(Stochastic Gradient Ascend)算法。这里不会过多介绍算法的细节,主要是编程实践使用这两种算法求解模型参数。

数据描述:

这里我们使用一个”良/恶性乳腺癌肿瘤预测’数据为例子,我们会将完整地使用该数据所有的特征作为训练分类器参数的依据,同时采用更为精细的测评指标对模型性能进行评价。原始数据的下载地址为:https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/

Number of Instances: 699 (as of 15 July 1992)

Number of Attributes: 10 plus the class attribute

Attribute Information: (class attribute has been moved to last column)

Attribute Domain


  1. Sample code number      id number
  2. Clump Thickness              1 - 10
  3. Uniformity of Cell Size      1 - 10
  4. Uniformity of Cell Shape    1 - 10
  5. Marginal Adhesion              1 - 10
  6. Single Epithelial Cell Size   1 - 10
  7. Bare Nuclei                        1 - 10
  8. Bland Chromatin              1 - 10
  9. Normal Nucleoli                  1 - 10
  10. Mitoses                                  1 - 10
  11. Class: (2 for benign, 4 for malignant)

Missing attribute values: 16

There are 16 instances in Groups 1 to 6 that contain a single missing
(i.e., unavailable) attribute value, now denoted by “?”.

Class distribution

Benign: 458 (65.5%)
Malignant: 241 (34.5%)

我们得知该原始数据共有699条样本,每条样本有11列不同的数值:1列用于检索的id,9列与肿瘤相关的医学特征,以及一列表征肿瘤类型的数值。所有9列用于表示肿瘤医 学特质的数值均被量化为1~10之间的数字,而肿瘤的类型也借由数字⒉和数字4分别 指代良性与恶性。不过,这份数据也声明其中包含16个缺失值,并且用“?”标出。事实上,缺失值问题广泛存在于现实数据中,也是机器学习任务无法回避的问题;对于存在缺失值的数据,都暂时予以忽略;而用于处理缺失数据的方法会在后续为大家介绍。下面这段代码用于预处理原始肿瘤数据:

#导入pandas包,并重命名为pd。
import pandas as pd
#导入numpy包,并重命名为np。
import numpy as np
#通过查阅breast-cancer-wisconsin.names文件,给出每个特征列的名称。
column_names = ['Sample code name','Clump Thickness','Uniformity of Cell Size','Uniformity of Cell Shape','Marginal Adhesion','Single Epithelial Cell Size','Bare Nuclei','Bland Chromatin','Normal Nuleoli','Mitoses','Class']
# 使用pandas.read_csv函数从互联网读取指定数据
data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data',names = column_names)
# 将'?'替换为标准缺失值表示
data = data.replace(to_replace='?',value=np.nan)
# 丢弃带有缺失值的数据(只要有一个维度有缺失)
data = data.dropna(how='any')
# 输出data的数据量和维度
data.shape

(683, 11)
在这里插入图片描述

我们也可以看看数据的分布和统计

data.describe()

经过简单的处理之后,无缺失值的数据样本共有683条,特征包括细胞厚度、细胞大小、形状等9个维度,并且每个维度的特征均量化为1~10之间的数值进行表示。
在这里插入图片描述
由于原始数据没有提供对应的测试样本用于评估模型性能,因此需要对带有标记的.数据进行分割。通常情况下,25%的数据会作为测试集,其余75%的数据用于训练

# 使用sklearn.model_selection的train_test_split模板用于分割数据
from sklearn.model_selection import train_test_split
# 用train_test_split函数来分隔数据,默认情况下这些数据会被随机打乱(shuffle=True)。
# 我们这里分割出25%的数据作为测试集,剩下75%的数据作为训练样本。
# random_state全书设定为一个固定值(2019),为了保证每次重新运行获得的训练集和测试集是一样的,实验结果可重现。
X_train, X_test, y_train, y_test = train_test_split(data[column_names[1:10]],data[column_names[10]],test_size=0.25,random_state=2019)
# 查验训练样本的数量和类别分布
y_train.value_counts()

2 332
4 180
Name: Class, dtype: int64

# 查验测试样本的数量和类别分布
y_test.value_counts()

2 112
4 59
Name: Class, dtype: int64

综上,我们用于训练样本共有512条(332条良性肿瘤数据、180条恶性肿瘤数据),测试样本有171条(112条良性肿瘤数据、59条恶性肿瘤数据)。

编程实践

接下来,我们使用逻辑斯蒂回归与随机梯度参数估计两种方法对上述处理后的训练数据进行学习,并且根据测试样本特征进行预测。

# 初始化 LogisticRegression 与 SGDClassifier
lr = LogisticRegression()
sgdc = SGDClassifier()
# 初始化 LogisticRegression 与 SGDClassifier
lr = LogisticRegression()
sgdc = SGDClassifier()
# 调用fit函数来训练模型参数
lr.fit(X_train,y_train)
# 用predict对X_test进行预测
lr_y_predict = lr.predict(X_test)
# 同理
sgdc.fit(X_train,y_train)
sgdc_y_predict= sgdc.predict(X_test)

性能测评

我们分别利用LogisticRegression 与SGDClassifier针对171条测试样本进行预测工作。由于这171条测试样本拥有正确标记,并记录在变量y_test中,因此非常直观的做法是比对预测结果和原本正确标记,计算171条测试样本中,预测正确的百分比。我们在把这个百分比称作准确性(Accuracy),并且将其作为评估分类模型的一个重要性能指标。

然而,在许多实际问题中,我们往往更加关注模型对某一特定类别的预测能力。这 时,准确性指标就变得笼统了。比如,在“良/恶性肿瘤预测任务”里,医生和患者往往更加关心有多少恶性肿瘤被正确地诊断出来,因为这种肿瘤更加致命。也就是说,在二分类任 务下,预测结果(Predicted Condition)和正确标记(True Condition)之间存在4种不同的 组合,构成混淆矩阵(Confusion Matrix),如图所示。如果恶性肿瘤为阳性(Positive),良性肿瘤为阴性(Negative),那么,预测正确的恶性肿瘤即为真阳性(True Positive),预测正确的良性肿瘤为真阴性(True Negative);原本是良性肿瘤(Condition negative) ,误判为恶性肿瘤( Predicted condition positive) 的为假阳性(False Positive) ;而实际是恶性肿瘤,但是预测模型没有检测出来,则为假阴性(FalseNegative)。事实上,医生和病患最不愿看到的是有假阴性(FalseNegative)的结果,因为这种误诊会耽误病患的治疗,进而危及生命。

混淆矩阵(图片来源于维基百科)
在这里插入图片描述

所以除了准确性以外,我们还引入了两个评价指标,分别是召回率(Recall)和精确率(Precsion)。他们的定义分别是
Accuracy = t p + t n t p + t n + f p + f n Precision = t p t p + f p Recall = t p t p + f n {\displaystyle {\text{Accuracy}}={\frac {tp+tn}{tp+tn+fp+fn}}\,} {\displaystyle {\begin{aligned}{\text{Precision}}&={\frac {tp}{tp+fp}}\\{\text{Recall}}&={\frac {tp}{tp+fn}}\,\end{aligned}}} Accuracy=tp+tn+fp+fntp+tnPrecisionRecall=tp+fptp=tp+fntp
其中tp代表真阳性样本的数量,以此类推。此外,为了综合考量回率与精确率,我们计算这两个指标的调和平均数,得到F1指标(F1 measure):

之所以使用调和平均数,是因为它除了具备平均功能外,还会对那些召回率和精确 率更加接近的模型给予更高的分数;而这也是我们所期待的,因为那些召回率和精确率差 距过大的学习模型,往往没有足够的实用价值。
回到本节所讨论的任务,对于乳腺癌肿瘤预测的问题,我们显然更加关注召回率,也 就是应该被正确识别的恶性肿瘤的百分比。对于召回率更高的预测模型,医生和患者会 更为信赖并给予更多关注。

# 从sklearn.metrics 导入 classification_report 模块
from sklearn.metrics import classification_report
# 从sklearn.metrics导入accuracy_score,用来做分类准确率的评估。
from sklearn.metrics import accuracy_scoreprint('%s: %f'%('使用逻辑斯蒂回归模型做分类的准确率为', accuracy_score(y_test, lr.predict(X_test))))
print('Accuaracy of LR Classifier:',lr.score(X_test, y_test))
print(classification_report(y_test,lr_y_predict,target_names = ['Benign','Malignant']))

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210429183624313.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nL
mNzZG4ubmV0L3dlaXhpbl80NTUwODI2NQ==,size_16,color_FFFFFF,t_70#pic_center)

print('Accuaracy of SGD Classifier:',sgdc.score(X_test, y_test))
print(classification_report(y_test,sgdc_y_predict,target_names = ['Benign','Malignant']))

在这里插入图片描述

from sklearn.metrics import confusion_matrixcon_mat = confusion_matrix(y_test, lr_y_predict, labels=[2,4])
print(con_mat)
from sklearn.metrics import recall_score, precision_score, precision_recall_curve
import numpy as np
print(precision_score(y_test, lr_y_predict, pos_label=4))
print(recall_score(y_test, lr_y_predict, pos_label=4))
# 表示每一个预测的概率probability
lr_y_predict_prob = lr.predict_proba(X_test) 
precisions, recalls, thresholds = precision_recall_curve(y_test, np.max(lr_y_predict_prob, axis=1), pos_label=4)from matplotlib import pyplot as plt
plt.rcParams['figure.dpi'] = 300
plt.plot(recalls, precisions)

在这里插入图片描述
我们可以发现:LogisticRegression比起 SGDClassifier在测试集上表现有更高的准确性(Accuracy)。这是因为Scikit-learn中采用解析的方式精确计算LogisticRegression的参数,而使用梯度法估计SGDClassifier的 参数。

  • 特点分析:线性分类器可以说是最为基本和常用的机器学习模型。尽管其受限于数据特征与分类目标之间的线性假设,我们仍然可以在科学研究与工程实践中把线性分类器的表现性能作为基准。这里所使用的模型包括LogisticRegression与SGDClassifier。相比之下,前者对参数的计算采用精确解析的方式,计算时间长但是模型性能略高;后者采用随机梯度上升算法估计模型参数,计算时间短但是产出的模型性能略低。一般而言,对于训练数据规模在10万量级以上的数据考虑到时间的耗用,可能更加推荐使用随机梯度算法对模型参数进行估计。

http://chatgpt.dhexx.cn/article/We5kP6Cg.shtml

相关文章

【线性分类器】线性分类器理论知识

文章目录 一、图像分类任务二、线性分类器&#xff1a;2.1 图像表示&#xff1a;2.2 损失函数&#xff1a;多类支持向量机损失&#xff1a; 2.3 正则项与超参数&#xff1a;K折交叉验证&#xff1a; 2.4 优化算法&#xff1a;梯度下降法&#xff08;SGD&#xff09;&#xff1a…

分类器的相关概念

昨天&#xff0c;人民网 发了一条八卦微博&#xff0c;盘点“雨神”&#xff08;萧敬腾&#xff09;是如何炼成的。微博称&#xff0c;网友统计发现&#xff0c;在萧敬腾 近年12次主要行程中&#xff0c;有10次他的“现身”让当地下起了雨&#xff0c;下雨的概率为83.3%。 图1 …

二类分类器构造多类分类器

from&#xff1a; http://tech.ddvip.com/2009-03/1238054080112304.html 从 SVM的那几张图可以看出来&#xff0c;SVM是一种典型的两类分类器&#xff0c;即它只回答属于正类还是负类的问题。而现实中要解决的问题&#xff0c;往往是多类的问题&#xff08;少部分例外&#xf…

KNN分类器

1&#xff0e;1 KNN的主要研究内容 &#xff08;1&#xff09;分类器的基本原理及算法内容 &#xff08;2&#xff09;利用现有的公开数据集&#xff08;鸢尾花&#xff09;实现分类器分类 &#xff08;3&#xff09;利用某种评价标准对分类结果进行分析评判 1.2分类的定义…

机器学习学习笔记(三)之分类器

分类器&#xff1a; 输入数据&#xff0c;识别是什么类&#xff0c;可以拓展为更广泛的用途。 将特征数据化&#xff0c;作为判断的依据。 和regression有相似的地方&#xff0c;但也有很大区别&#xff0c;把最好不把classification当作regression做 对于有多个分组的如cla…

分类器

分类器的作用&#xff1a;常规任务是利用给定的类别、已知的训练数据来学习分类规则和分类器&#xff0c;然后对未知数据进行分类&#xff08;或预测&#xff09;。逻辑回归&#xff08;logistics&#xff09;、SVM等常用于解决二分类问题&#xff0c;对于多分类问题&#xff0…

机器学习-分类-线性分类器

在一个机器学习任务中&#xff0c;如果每一条数据的目标值是离散的&#xff0c;则该任务是一个分类任务。 解决分类问题基本的方法有&#xff1a;线性分类器、决策树、朴素贝叶斯、人工神经网络、K近邻&#xff08;KNN&#xff09;、支持向量机&#xff08;SVM&#xff09;&am…

加密芯片大对比

市面上加密芯片,让人看的眼花缭乱,本文对各家加密芯片作了分析及对比 https://files.cnblogs.com/files/walta99/%E5%8A%A0%E5%AF%86%E8%8A%AF%E7%89%87%E5%A4%A7%E5%AF%B9%E6%AF%94.pdf 转载于:https://www.cnblogs.com/walta99/p/8484469.html

硬件加密芯片

TF32A09 芯片简介 产品描述 TF32A09系列芯片是同方股份有 限公司计算机系统本部自主研发的一 款高速度、高性能32位信息安全SoC 芯片。该芯片集成了高速的安全算法 和通讯接口&#xff0c;摒弃了传统的数据加解 密处理方式&#xff0c;使数据流加解密速度大 幅提升&#x…

芯片程序保护-常规芯片加密方式

芯片程序为什么要保护 针对于市场上越来越多的芯片解密方案的成熟和扩大&#xff0c;目前很对客户存在一个对于自己的产品会被同行或者其他竞争者抄袭的情况&#xff0c;对于硬件这块通常情况下是无法防止被抄的。但对于电路板的核心芯片和程序部分&#xff0c;是存在一些方式…

ATSHA204A加密芯片攻略——使用篇

ATSHA204A加密芯片是ATMEL公司研发的一款高安全性的&#xff0c;功能丰富的加密IC&#xff0c;使用SHA-256算法进行加密操作&#xff0c;内置16*32字节的slot(EEPROM)可以存储用户数据和秘钥&#xff0c;唯一的9字节序列号用于区分其他芯片&#xff0c;还有512bits的OTP区用于保…

硬件加密芯片介绍

同方股份有限公司计算机系统本部自主研发的一款高速度、高性能32位信息安全S高速加密芯片TF32A09系列。该系列芯片集成了高速的安全算法和通讯接口&#xff0c;摒弃了传统的数据加解密处理方式&#xff0c;使数据流加解密速度大幅提升&#xff0c;适用于高速数据流加密。 TF32A…

STM32芯片加密的方法

stm32加密方法&#xff1a; flash加密 96位ID号加密 96位id号 id校验 反汇编 Id存到数组&#xff0c;程序执行之前与数组之中的ID比较&#xff0c;如果相同继续执行&#xff0c;不同则终止执行 加密步骤&#xff1a; ①设计一套加密算法&#xff0c;利用MCU内部的unique ID作…

加密芯片十大品牌对比

加密芯片十大品牌对比 各大品牌加密芯片厂商都为各自的加密芯片定了型号&#xff0c;用户在进行加密芯片的选型时&#xff0c;如果没有明确的参考依据&#xff0c;很难效率而准确的选取到合适的加密芯片。作者结合自身经验&#xff0c;为大家提供一些简单实用的加密芯片选型建…

芯片加密与解密技术方法

目录&#xff1a; 一、简介 二、硅芯片安全措施的演变 三、总结 ------------------------------------------------------------------------------------------------------------- 一、简介 IC集成电路在早期&#xff0c;除法律和经济外&#xff0c;几乎没有保护措施…

His系统简介、医院信息系统(Hospital Information System

医院信息系统&#xff08;Hospital Information System&#xff09;是利用计算机技术、网络及通讯技术、多媒体技术&#xff0c;快速、准确、有效地整合医院业务信息和管理信息&#xff0c;实现医院信息最大限度的采集、传输、存储&#xff0c;从而使医院内部资源最有效的利用和…

开源项目-his医院信息系统

哈喽,大家好,今天给大家带来的开源系统是-his医院信息系统 系统主要有收费管理,药房管理,医生工作站,基础信息,统计等模块 登录 角色管理 部门管理 药品类别 药品编码 药品库存 需求计划表

医院信息系统(HIS)的“一个都不能少”!

本文由Markdown语法编辑器编辑完成。 1. 《一个都不能少》 《一个都不能少》是1999年上映的一部剧情片&#xff0c;由张艺谋导演拍摄。该片使用一班非专业演员制作一出像纪录片的电影&#xff0c;故事主题是关于农村、贫穷及文盲的问题。本片获得十项国际电影奖项&#xff0c;…

分享 | 医院常见的HIS、CIS、LIS、EMR、PACS、RIS都是指哪些系统?

随着医疗卫生体制改革&#xff0c;卫生系统的信息化建设步伐也进一步加快&#xff0c;医院信息系统已成医院必不可少的基础设施与技术环境。60年代初美国、日本、欧洲各国开始建立医院信息系统。到70年代已建成许多规模较大的医院信息系统。例如&#xff0c;瑞典首都斯德哥尔摩…

大型医院信息系统HIS源码 HIS系统全套源码

源码开发环境&#xff1a;VS2013sql2012 C/S架构 HIS主要模块介绍&#xff1a; 门急诊挂号&#xff1a;提供门诊号表处理&#xff0c;科室排班、退换号处理&#xff0c;门诊病人统计功能&#xff0c;门急诊挂号收费核算功能&#xff0c;支持医保、公费、自费等多种身份的病人…