【机器学习】第二节:线性回归和线性分类

news2024/12/26 22:10:01

作者🕵️‍♂️:让机器理解语言か

 

专栏🎇:机器学习sklearn

描述🎨:本专栏主要分享博主学习机器学习的笔记和一些心得体会。

寄语💓:🐾没有白走的路,每一步都算数!🐾 

0、介绍💬

        监督学习(英语:Supervised learning)是机器学习中最为常见、应用最为广泛的分支之一。本次实验将带你了解监督学习中较为基础的线性模型,并学会使用 scikit-learn 来构建预测模型,用于解决实际问题。

知识点

  • 线性回归模型
  • 感知机分类模型

1、线性回归模型

        scikit-learn 中包含的线性模型有最小二乘回归、感知机、逻辑回归、岭回归,贝叶斯回归等,由 sklearn.linear_model 模块导入。对于线性模型而言,即通过拟合线性函数(下式)去完成样本分类或回归预测。

y(w,x)=w_0+w_1*x_1+...+w_p*x_p

其中,最小二乘回归、岭回归、贝叶斯回归等是用于解决回归问题。而感知机、逻辑回归被用于解决分类问题

这里,我们从比较基础的  最小二乘法 回归说起。最小二乘法是线性回归中最经典的方法之一,最小二乘的取名即来自于其选择了平方损失函数。在 scikit-learn 中,最小二乘法的实现方法如下:

名称方法
最小二乘回归sklearn.linear_model.LinearRegression( )

使用 scikit-learn 去解决一个机器学习相关的问题时,我们的代码都大同小异,主要是由三步走组成:

  1. 调用一个机器学习方法构建相应的模型 model,并设置模型参数
  2. 使用该机器学习模型提供的 model.fit() 方法训练模型
  3. 使用该机器学习模型提供的 model.predict() 方法用于预测

        请注意,上面的 3 个步骤大家多读几遍增强印象,后续我们就可以遵循这 3 步走的套路使用 scikit-learn 完成各类算法的建模了。

        下面,我们尝试通过最小二乘回归去拟合二维平面上的一些点。首先,执行上面的第一步,载入方法并构建模型。

import warnings
from sklearn.linear_model import LinearRegression

# 忽略代码警告,仅供教学方便,自行书写代码时警告也很重要,不建议忽略
warnings.filterwarnings('ignore')

model = LinearRegression()  # 调用最小二乘法线性回归(第 1 步)
model
# 输出结果
# LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

  model 模型输出的参数,即为相应算法类的默认参数。当然,你可以参考  官方文档 中的说明来自定义参数。

接下来,使用模型带有的 fit() 方法去拟合 3 个点。三个点的特征向量分别为 [0,0], [1,1], [2,2],对应的目标值为 [1,2,3]。

model.fit([[0, 0], [1, 1], [2, 2]], [1, 2, 3])  # 模型训练(第 2 步)
# 输出结果:
# LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)

当然,我们也可以从这一步看到模型返回的参数。

训练时,选择的 [0,0], [1,1], [2,2] 这三个点恰好在一条直线上,再结合目标值想象一下它们的空间位置关系。我们可以使用下面的方法,输出拟合直线 w 项和常数项值。

model.coef_, model.intercept_
# (array([0.5, 0.5]), 1.0000000000000002)

如上所示,即实验拟合的函数应该为:

y(x)=0.5 \times x_{1}+0.5 \times x_{2}+1

当我们输入新的数值,例如 [3,3] 时,根据上面的函数,因变量的值为 4。那么,我们使用模型来预测,看一看结果是否为 4。

model.predict([[3, 3]])  # 模型预测(第 3 步)
# array([4.])

结果的确和我们预想的一致,也标志着我们通过 scikit-learn 完成了一个基础的线性回归问题,而建模的过程仅仅需要简单的 3 步。


上面的例子比较简单,下面我们导入 scikit-learn 内置的 diabetes 糖尿病数据集来训练一个复杂一点的最小二乘回归模型。

第一步:导入数据,并将其划分为 70% 的训练集和 30% 的测试集。机器学习中,我们习惯采用这样的比例来划分训练集和测试集。其中训练集用来训练模型,而测试集则用来评估模型的质量。测试集的数据不会出现在训练数据中,这也就类似我们使用了新的数据对训练好的模型进行预测和评估,以保证模型质量真实可靠。

下面,我们会使用到 scikit-learn 提供的数据集切分函数  train_test_split

from sklearn import datasets  # 导入内置数据集模块
from sklearn.model_selection import train_test_split  # 导入数据集切分模块
import numpy as np  # 导入数值计算模块

diabetes = datasets.load_diabetes()  # 载入糖尿病数据集

diabetes_feature = diabetes.data[:, np.newaxis, 2]  # 该数据集的特征较多,这里只选取其中一个
diabetes_target = diabetes.target  # 设定目标值

# 切分数据集为 70% 的训练集和 30% 的预测集
# random_state 随机数种子用于保证每次执行结果一致
train_feature, test_feature, train_target, test_target = train_test_split(
    diabetes_feature, diabetes_target, test_size=0.3, random_state=56)

 第二步:载入最小二乘回归模型,并训练数据。这一步想必通过上面的例子已经清楚了,注意这里传入的是训练数据。

model = LinearRegression()  # 构建最小二乘线性回归模型
model.fit(train_feature, train_target)  # 使用训练集数据训练模型
# LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)

第三步:使用测试集进行预测,并将结果绘图。

import matplotlib.pyplot as plt  # 导入 matplotlib 绘图模块
%matplotlib inline

# 绘图
plt.scatter(train_feature, train_target,  color='black')  # 绘制训练集散点图
plt.scatter(test_feature, test_target,  color='red')  # 绘制测试集散点图
plt.plot(test_feature, model.predict(test_feature),
         color='blue', linewidth=3)  # 绘制拟合直线

# 绘制图例
plt.legend(('Fit line', 'Train Set', 'Test Set'), loc='lower right')
plt.title('LinearRegression Example')
# Text(0.5, 1.0, 'LinearRegression Example')

最后,我们可以通过绘制的图像,更加直观地看出采用最小二乘回归模型进行线性拟合的结果。

对于其他常见的线性回归模型,它们和最小二乘线性回归模型非常相似,只是采用了不同的损失函数。

例如,岭回归采用了带 L2 惩罚项的平方和损失函数。

\min _{w}\|X w-y\|_{2}^{2}+\alpha\|w\|_{2}^{2}

而另一种常见的 Lasso 回归,同样采用了带 L1 惩罚项的平方损失函数

\min _{w} \frac{1}{2 n_{\text {samples}}}\|X w-y\|_{2}^{2}+\alpha\|w\|_{1}

下面列举了一些常见的广义线性回归模型,及它们在 scikit-learn 中对应的方法。

名称方法
贝叶斯岭回归sklearn.linear_model.BayesianRidge()
Lasso 回归sklearn.linear_model.Lasso()
岭回归sklearn.linear_model.Ridge()
随机梯度下降回归sklearn.linear_model.SGDRegressor()
鲁棒回归sklearn.linear_model.HuberRegressor()

这些方法相对于普通最小二乘回归模型而言,均增加了一些惩罚项。这样会提高模型的泛化能力,在实际应用中效果可能会好一些。

2、线性分类模型

        除了线性回归,scikit-learn 还提供了一些解决线性分类的方法。其中,感知机就是非常有代表性的线性分类模型。

        感知机 是一个经典的二分类方法,由 Rosenblatt 于 1957 年时提出。它是神经网络和支持向量机的基础。感知机模型非常简单,输入为一些特征向量,输出则由正类和负类组成。而输入和输出之间,则是由符号函数连接

f(x)=\operatorname{sign}(w \cdot x+b) ; \operatorname{sign}(x)=\left\{\begin{array}{ll}{+1, x \geq 0} \\ {-1, x \leq 0}\end{array}\right.

感知机的损失函数是错误分类点到分离超平面之间的距离总和,其学习策略同样也是损失函数最小化。

\min \sum y(w \cdot x+b)

        在 scikit-learn 中,实现感知机通过调用 sklearn.linear_model.Perceptron()方法完成。下面,我们通过一个例子来展示感知机的分类过程。首先,使用 scikit-learn 提供的 make_classification 方法生成一组可被二分类的二维数组作为数据集。

from sklearn.datasets import make_classification  # 导入分类数据生成模块

# 随机生成一组可以被二分类的数据
X, y = make_classification(n_features=2, n_redundant=0,
                           n_informative=1, n_clusters_per_class=1, random_state=1)

X.shape, y.shape  # 查看数组形状
# ((100, 2), (100,))

这里,我们可以使用 Matplotlib 将该数据集绘制出来。

plt.scatter(X[:, 0], X[:, 1], marker='o', c=y)  # 绘制数据集散点图
# <matplotlib.collections.PathCollection at 0x7fffc2c25c10>

         其中,y 即相当于人为给数据添加的标签。

        我们可以看到,数据集分为 2 种颜色的样本点,并呈现出明显的线性界线。接下来,我们使用感知机对该数据集进行分类训练。

from sklearn.linear_model import Perceptron

# 将数据集划分为 70% 训练集和 30% 测试集
train_feature, test_feature, train_target, test_target = train_test_split(
    X, y, test_size=0.3, random_state=56)
# 建立感知机模型,使用默认参数
model = Perceptron()
# 使用训练集训练模型
model.fit(train_feature, train_target)

# Perceptron(alpha=0.0001, class_weight=None, early_stopping=False, eta0=1.0,
#            fit_intercept=True, max_iter=1000, n_iter_no_change=5, n_jobs=None,
#            penalty=None, random_state=0, shuffle=True, tol=0.001,
#            validation_fraction=0.1, verbose=0, warm_start=False)

        训练结束后,我们用测试数据进行预测。请注意,由于测试数据与训练数据完全不同,也是算法之前完全没有见过的数据。我们后续可以通过模型对测试数据的预测结果,然后与真实的结果进行比较,从而得到模型的分类准确度。

preds = model.predict(test_feature)  # 使用测试集预测

        准确度表示正确预测的样本占全部样本的比例,是用于评估分类模型的常用指标之一,我们得到的 preds 是模型的预测结果,而真实结果为 test_target。接下来,可以通过 scikit-learn 提供的  accuracy_score 计算出分类准确度。

from sklearn.metrics import accuracy_score

accuracy_score(test_target, preds)  # 先传入真实值,再传入预测值
# 1.0

        返回的结果即是测试集预测分类准确度,如果为 1.0 则表示预测全部正确,分类准确度为 100%。下面,我们使用 Matplotlib 将训练数据和测试数据绘制在原图上,并绘制出感知机分类时的决策边界。

# 创建一个绘图矩阵方便显示决策边界线
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                     np.arange(y_min, y_max, 0.02))

fig, ax = plt.subplots()
# 绘制决策边界
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
ax.contourf(xx, yy, Z, cmap=plt.cm.Paired)
# 绘制训练和测试数据
ax.scatter(train_feature[:, 0], train_feature[:, 1])
ax.scatter(test_feature[:, 0], test_feature[:, 1])

# <matplotlib.collections.PathCollection at 0x7fffc2b9cc50>

  

        现在,我们就完成了一个简单的感知机分类实验。可以看出来,对于二分类问题,感知机的预测效果还是很不错的。

小练习

        尝试通过 make_classification() 方法随机生成 300 条可用于二分类的数据,并通过 sklearn.linear_model.LogisticRegression() 调用线性模型中的逻辑回归方法完成分类。最后通过 Matplotlib 将训练集和测试集绘制出来。

3、实验总结

        线性模型是机器学习中十分简单基础的模型。但是由于其本身的特点,只能用于二分类问题。对于实际生活中经常遇到的多分类及非线性分类问题,无法适用。但对于刚刚入门机器学习的朋友来说,线性分类模型是不错范例。希望大家能掌握本次试验的全部内容。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux文件描述符和重定向

介绍 文件描述符是与文件输入、输出相关联的整数&#xff0c;在编写脚本时会经常使用标准的文件描述符来将内容重定向输出&#xff0c;0、1、2是文件描述符&#xff08;分别对应stdin、stdout、stderr&#xff09;&#xff0c;< 、>, >>叫做操作符。 概念 stdin(…

《走进对象村7》之内部类基地

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f341;内部类匿名内部类匿名内部类的定义匿名内部类访问内部类的特点 &#x1f341;实例内部类实例内部类的定义实例内部类的如何实例化对象实例内部类访问情况 &#x1f341;静态内部类&#x1f341;局部内部类内部…

谈谈中台建设

大家好&#xff0c;我是易安&#xff01; 中台是数字化转型中备受关注的话题。今天&#xff0c;我们将重点探讨业务中台和数据中台。同时&#xff0c;作为企业数字化中台转型的整体&#xff0c;我们也会探讨前台和后台的设计思路。 平台与中台 中台这一概念源于阿里巴巴&#…

命题逻辑与推理

推理理论(假设前提条件为真推出的结论) 真值表法 直接证明法 常用推理规则—倒着看&#xff0c;推理整理过程 P规则(前提引入) T规则(结论引入) ** 常用推理公式 ** 名称内容附加率 A ⇒ ( A ∨ B ) A ⇒ A → B B ⇒ A → B A\Rightarrow(A\lor B)\qquad\\\neg A\Rightarro…

软件工程开发文档写作教程(10)—需求分析书的适用范围

本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;电子工业出版社《软件文档写作教程》 马平&#xff0c;黄冬梅编著 需求分析书的适用范围 软件项目一旦被确定要实施之后&#xff0c;撇开项目的立项投标不谈&a…

Java每日一练(20230515) 阶乘后的零、矩阵置零、两数相除

目录 1. 阶乘后的零 &#x1f31f; 2. 矩阵置零 &#x1f31f;&#x1f31f; 3. 两数相除 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 阶乘后的零 …

基于PyQt5的图形化界面开发——PyQt示例_计算器

基于PyQt5的图形化界面开发——PyQt示例_计算器 前言1. caculator.py2. MainWindow.py3. 运行你的项目4. 其他 PyQt 文章 前言 本节学习 PyQt5示例 &#xff0c;制作一个图形化界面 计算器 操作系统&#xff1a;Windows10 专业版 开发环境&#xff1a;Pycahrm Comunity 2022…

2023 年 Pycharm 常用插件推荐

1. Key Promoter X 如果让我给新手推荐一个 PyCharm 必装插件&#xff0c;那一定是 Key Promoter X 。 它就相当于一个快捷键管理大师&#xff0c;它时刻地在&#xff1a; 教导你&#xff0c;当下你的这个操作&#xff0c;应该使用哪个快捷操作来提高效率&#xff1f;提醒你…

Nginx之正向代理与反向代理进阶(支持https)

在【Nginx之正向代理与反向代理】一文中我们实现了将Nginx服务器作为正向代理服务器和反向代理服务器&#xff0c;但美中不足的是仅支持http协议&#xff0c;不支持https协议。 我们先看看看http和https的区别&#xff1a; http协议&#xff1a;协议以明文方式发送数据&#…

django ORM框架(操作数据库)【正在更新中...】

一、ORM框架介绍 ORM框架&#xff0c;把类和数据进行映射&#xff0c;通过类和对象操作它对应表格中的数据&#xff0c;进行增删改查&#xff08;CRUD) ORM框架中 数据库&#xff1a;需要提前手动创建数据库 数据表&#xff1a;与OMR框架中的模型类对应 字段&#xff1a;模…

C++基础STL-deque容器

双端数组&#xff0c;可以对头端进行插入删除操作 deque 容器和 vecotr 容器有很多相似之处&#xff0c;比如&#xff1a; deque 容器也擅长在序列尾部添加或删除元素&#xff08;时间复杂度为O(1)&#xff09;&#xff0c;而不擅长在序列中间添加或删除元素。deque 容器也可…

图解LeetCode——240. 搜索二维矩阵 II

一、题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 二、示例 2.1> 示例 1&#xff1a; 【输入】matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,1…

软件工程开发文档写作教程(08)—需求分析书的编制目标

本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;电子工业出版社《软件文档写作教程》 马平&#xff0c;黄冬梅编著 需求分析定义 需求分析的基本任务是要准确地定义新系统的目标&#xff0c;为了满足用户需求…

seleniumplaywright获取网站Authorization鉴权实现伪装requests请求

文章目录 selenium&playwright获取网站Authorization鉴权实现伪装requests请求需求背景知识点&#xff1a;selenium获取已登录网站的用户鉴权信息知识点&#xff1a;playwright获取cookie知识点&#xff1a;playwright获取storage_state提取cookie秃发状况windows禁止chrom…

OpenCV实现提取水平线和垂直线,提取验证码

1.提取水平线和垂直线 在之前的博客中&#xff0c;我们介绍了很多形态学操作。其中&#xff0c;膨胀与腐蚀操作可以使用任意的结构元素&#xff0c;例如矩形、圆、直线等各种自定义形状。 提取水平线和垂直线的具体步骤见下&#xff1a; 1.1.步骤一&#xff1a;读入原始图像…

提速YOLOv7:用MobileNetV3更换骨干网络加速目标检测

目录 前言一、MobileNetV3的介绍1、MobileNetV3的原理和特点2、MobileNetV3的结构 二、YOLOv7的介绍1、YOLOv7的结构和流程2、YOLOv7的性能指标 三、MobileNetV3替换YOLOv7的骨干网络1、替换骨干网络2、修改neck部分3、微调模型 四、实验结果与分析1、数据集和实验设置2、实验结…

【Prompting】ChatGPT Prompt Engineering开发指南(3)

ChatGPT Prompt Engineering开发指南3 总结文字使用单词/句子/字符限制进行总结以运输和交付为重点进行总结以价格和价值为重点进行总结 尝试“extract”而不是“summarize”总结多个产品评论内容来源 本文承接上文&#xff1a;ChatGPT Prompt Engineering开发指南2&#xff0c…

RK3588平台开发系列讲解(进程篇)图解linux netlink

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、netlink协议簇二、netlink初始化沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 netlink 协议是一种进程间通信(Inter Process Communication,IPC)机制,为的用户空间和内核空间以及内核的某些部分之间…

解决FTD2000 麒麟系统下计算机属性中显示的内存比实际内存少

FTD2000 麒麟系统下计算机属性中显示的内存比实际内存少,首先确认问题点,判断是飞腾D2000的bios问题,还是麒麟系统问题 可以用如下方式做出判断 1、D2000 log打印进入shell 后 exit 在弹出来的界面中选 bios set 选项、进入bios 设置界面,如下图 可以看到 bios 下,Tota…

总结851

每周小结 英语背了3篇文章 高数一直刷关于一元积分的题目&#xff0c;一共150道左右&#xff0c;平均一天20道左右&#xff0c;强化课看到第2讲数列。 每日必复习&#xff08;5分钟&#xff09; 线性代数 向量组 学习内容&#xff1a; 暴力英语&#xff1a;继续背诵《The kin…