机器学习——分类算法

news2025/1/19 14:33:23

K-近邻算法(KNN)

K Nearest Neighbor算法又叫KNN算法,它的原理是如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

两个样本间距离可通过欧式距离计算,如a(a1,a2,a3),b(b1,b2,b3),则:

d=\sqrt{(a1-b1)^{2}+(a2-b2)^{2}+(a3-b3)^{2}}

k值取的太小容易受到异常点的影响,而取的过大容易受到样本不均衡的影响。 

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler


def knn_demo():
    # 1)读取数据
    iris = load_iris()

    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)  # 前两个参数传的是特征值和目标值

    # 3)特征工程:标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)  # fit_transform其实是fit计算均值、标准差和transform按照计算的均值、标准差将数据转换两个步骤,它们都是转换器
    x_test = transfer.transform(x_test)  # 这里测试集需要用训练集的均值和标准差来进行转换,所以transform就好

    # 4)KNN算法预估器
    estimator = KNeighborsClassifier(n_neighbors=3)  # estimator是预估器,n_neighbors=3即k值为3的意思,不填默认为5
    estimator.fit(x_train, y_train) # 这里的fit做的工作是训练模型(也是计算的一种)

    # 5)模型评估
    # 方法一:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比对真实值和预测值:\n", y_test == y_predict)  # 每个数据都比对,相等的返回True
    # 方法二:计算准确率
    score = estimator.score(x_test, y_test)  # 相当于在方法一比对的基础上算出了预测的准确率
    print("准确率为:\n", score)

    return None


if __name__ == "__main__":
    knn_demo()

模型的选择与调优

  • 交叉验证
  • 超参数搜索

交叉验证(cross validation)

目的是为了让训练得到的模型结果更加准确做法:将拿到的训练数据,分为训练集和验证集。以下图为例:将数据分成4份,其中一份作为验证集,然后经过4次(组)的测试,每次都更换不同的验证集,即得到4组模型的结果,取平均值作为最终结果,称为4折交叉验证。

  • 训练集:训练集+验证集
  • 测试集:测试集 

超参数搜索-网格搜索(Gird Search) 

通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的k值),这种叫超参数。但是手动调参繁杂,所以需要对模型预设几种超参数组合。每种超参数都采用交叉验证来进行评估,最后选出最优参数组合建立模型。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler


def knn_gscv_demo():
    # 1)读取数据
    iris = load_iris()

    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)

    # 3)特征工程:标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 4)KNN算法预估器
    estimator = KNeighborsClassifier()
    # 加入网络搜索与交叉验证
    param_dict = {"n_neighbors": [1, 2, 3, 4, 5, 6, 7, 8]}  # 参数列表:相当于后面for循环一遍这些参数看看哪个好
    estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10)  # 数据量不大时cv可以大一些,即交叉验证分割的多一些,否则数据量大时cv又大会太耗时间

    estimator.fit(x_train, y_train)

    # 5)模型评估
    # 方法一:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比对真实值和预测值:\n", y_test == y_predict)
    # 方法二:计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)  # 这里的准确率是训练集+测试集这个结构中测试集的预测准确率

    print("最佳参数:\n", estimator.best_params_)
    print("最佳结果:\n", estimator.best_score_)  # 这里的最佳结构是测试集=测试集+验证集中验证集的结果
    print("最佳估计器:\n", estimator.best_estimator_)
    print("交叉验证结果:\n", estimator.cv_results_)

    return None


if __name__ == "__main__":
    knn_gscv_demo()

朴素贝叶斯算法

朴素是因为加了个假设:特征与特征之间是相互独立的。故朴素贝叶斯算法=朴素+贝叶斯公式。

贝叶斯公式:

 p(c|w)=\frac{p(w|c)p(c)}{p(w)}

注:w为给定文档的特征值,c为文档类别 。

一般还需要引入拉普拉斯平滑系数进行计算,目的是为了防止计算出的分类概率为0(数据少时易出现)。

P(F1|C)=\frac{Ni+\alpha }{N+\alpha m}

\alpha为指定系数一般为1,m为训练文档中统计出的特征词个数。

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB


def nb_demo():
    """
    用朴素贝叶斯算法对新闻进行分类
    :return:
    """
    # 1)读取数据
    news = fetch_20newsgroups(subset="all")  # 数据集较大用fetch,subset默认是获取训练集,都要就all

    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(news.data, news.target)

    # 3)特征工程:文本特征抽取-tfidf
    transfer = TfidfVectorizer()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 4)朴素贝叶斯算法预估器流程
    estimator = MultinomialNB()
    estimator.fit(x_train, y_train)

    # 5)模型评估
    # 方法一:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比对真实值和预测值:\n", y_test == y_predict)
    # 方法二:计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)

    return None


if __name__ == "__main__":
    nb_demo()

缺点:由于加了样本属性独立性的假设,所以如果特征属性有关联时效果不好。

决策树

类似于if-else嵌套构建起的一颗树。 

信息熵

简单来说信息是消除随机不定性的东西,比如当我不知道小明的年龄时,小明说他今年18岁,那么小明的话就是一条信息,这时小华接着说小明明年19岁,小华的话就不是信息了。而要衡量消除的不确定性有多少,就引入了信息熵。

H(x)=-\sum_{i=1}^{n}P(x_{i})log_{b}P(x_{i})

H的专业术语称之为信息熵,单位为比特,其中底数b一般为2。

决策树的划分条件之一 :信息增益

特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)于特征A给定条件下D的信息条件熵H(D|A)之差:

g(D,A)=H(D)-H(D|A)

 比如从下面这个例子来理解公式,应该选取什么特征开始构建一棵树,从而决策是否贷款。

 

from matplotlib import pyplot as plt
from sklearn import tree
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, plot_tree


def decision_demo():
    """
    用决策树进行分类
    :return:
    """
    # 1)读取数据
    iris = load_iris()
    feature_names = iris.feature_names

    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)

    # 3)决策树预估器
    estimator = DecisionTreeClassifier(criterion="entropy")  # 表示用信息增益的熵分类
    estimator.fit(x_train, y_train)

    # 4)模型评估
    # 方法一:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比对真实值和预测值:\n", y_test == y_predict)
    # 方法二:计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)

    # 5)决策树的可视化
    # 指定图幅大小
    plt.figure(figsize=(18, 12))
    # 绘制图像
    _ = tree.plot_tree(estimator, filled=True, feature_names=feature_names)  # 由于返回值不重要,因此直接用下划线接收
    plt.show()
    # 保存图像
    # plt.savefig('./tree.jpg')  # 如果要保存图片记得将plt.show()注释先

    return None


if __name__ == "__main__":
    decision_demo()

集成学习方法之随机森林

集成学习通过建立几个模型组合来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立的学习和作出预测,这些预测最后结合成组合预测,因此优于任何一个单分类的作出预测。在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数决定。

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split, GridSearchCV


def rf_demo():
    """
    用随机森林进行分类
    :return:
    """
    # 1)读取数据
    iris = load_iris()

    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)

    # 3)随机森林预估器
    estimator = RandomForestClassifier()
    # 加入网格搜索与交叉验证
    # n_estimators是森林里树的个数,max_depth是树的最大深度
    param_dict = {"n_estimators": [120, 200, 300, 500, 800, 1200], "max_depth": [5, 8, 15, 25, 30]}
    estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
    estimator.fit(x_train, y_train)

    # 4)模型评估
    # 方法一:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比对真实值和预测值:\n", y_test == y_predict)
    # 方法二:计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)

    # 最佳参数:best_params_
    print("最佳参数:\n", estimator.best_params_)
    # 最佳结果:best_score_
    print("最佳结果:\n", estimator.best_score_)
    # 最佳估计器:best_estimator_
    print("最佳估计器:\n", estimator.best_estimator_)
    # 交叉验证结果:cv_results_
    print("交叉验证结果:\n", estimator.cv_results_)

    return None


if __name__ == "__main__":
    rf_demo()
  • 在当前所以算法中,具有极好的准确率
  • 能够有效的运行在大数据集上,处理具有高维特征的输入样本,而且不需要降维
  • 能够评估各个特征在分类问题上的重要性  

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

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

相关文章

FE_HTML标签学习

1 图像标签 <body> <img src"./image/img.png" alt"图片标签属性" title"提示文本&#xff0c;鼠标放到图像上显示的文字" > </body>2 超链接标签 <body><h4>1.外部链接</h4><a href"http://www.…

4点决定你在银行的到手薪资

众所周知&#xff0c;银行的工资水平在整个国家中也是排名靠前的。然而&#xff0c;全国范围之内&#xff0c;有4000多家银行&#xff0c;有20多万个网点&#xff0c;不同的银行&#xff0c;甚至同一银行不同区域的网点之间的工资差别都是比较大的&#xff0c;即使是在同一家银…

手搭手SpringBoot之REST接口风格

REST一种软件架构风格 REST即表述性状态传递&#xff08;英文&#xff1a;Representational State Transfer&#xff0c;简称REST,中文&#xff1a;表示层状态转移&#xff09;是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计…

gRPC-Go源码解读二 传输层数据处理流程

本篇文章主要介绍gRPC Client传输层的处理流程&#xff0c;如有疑问&#xff0c;欢迎指教。 gRPC版本&#xff1a; 1.54.0-dev gRPC基于http2传输&#xff0c;传输层主要处理http2相关的内容。RFC7540制定了http2协议规范&#xff0c;因此&#xff0c;这部分代码的逻辑绝大部分…

科普|FCC的卫星标准 为什么又说是FCC Part25呢?

我们今天介绍的FCC的卫星标准&#xff0c;在美国是作为一种法律规定&#xff0c;具有法律效力的标准&#xff0c;通常又称为法规文件。 01 — FCC Part 25 我们先从CFR说起&#xff0c;《美国联邦法规》&#xff08; Code of Federal Regulations &#xff0c;简称CFR&#…

【JAVAEE】网络原理之网络发展史

目录 &#x1f381;1. 独立模式 &#x1f383;2. 网络互连 &#x1f388;2.1 局域网 LAN ✨2.1.1 基于网线直连 &#x1f451;2.2.2 基于集线器组建 &#x1f48b;2.2.3 基于交换机组建 &#x1f457;2.2.4 基于交换机与路由器组建 &#x1f388;2.2 广域网 21世纪是一…

我的第一台电脑------计算机类专业学生购置电脑的一些个人心得

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…

Web 攻防之业务安全:接口参数账号篡改测试(修改别人邮箱 || 手机号为自己的)

Web 攻防之业务安全&#xff1a;接口参数账号篡改测试. 业务安全是指保护业务系统免受安全威胁的措施或手段。广义的业务安全应包括业务运行的软硬件平台&#xff08;操作系统、数据库&#xff0c;中间件等&#xff09;、业务系统自身&#xff08;软件或设备&#xff09;、业务…

HCIP之LSP静态搭建实验

目录 HCIP之LSP静态搭建实验 实验图 基本配置 R1 R2 R3 R4 配置方法 搭建从1.0 - 4.0 网段的LSP 搭建静态路由 配置MPLS 配置LSR - ID 激活MPLS 全局激活 接口激活 搭建静态LSP 搭建入站LSR R1配置 搭建中转LSR R2配置 R3配置 搭建出站LSR R4配置 搭建从…

Java语言-----泛型的认识

目录 一.什么是泛型 二.泛型类的使用 2.1泛型类的定义 2.2泛型类的数组使用 三.泛型的上界 四.泛型的方法 五.泛型与集合 &#x1f63d;个人主页&#xff1a; tq02的博客_CSDN博客-C语言,Java领域博主 &#x1f308;梦的目标&#xff1a;努力学习&#xff0c;向Java进发…

八大数据库全面对比,让你明确数据库怎么去选!

随着互联网和大数据时代的到来&#xff0c;各种数据管理技术也在迅猛发展。而在数据管理技术中&#xff0c;数据库无疑是最重要的一环。现今市场上涌现出了众多数据库产品&#xff0c;不同的数据库产品针对不同的业务需求和应用场景&#xff0c;有着不同的特点和优势。本文将介…

【双碳系列】LEAP碳排放预测、LCA生命周期、GAMS电力、CGE一般均衡模型

本文围绕双碳专题分为五大内容&#xff0c;分别为&#xff1a; 基于LEAP模型的能源环境发展、碳排放建模预测及不确定性分析实践应用 (qq.com) 双碳目标下农田温室气体排放模拟实践技术应用 (qq.com) 环境影响与碳排放生命周期评估应用及案例分析 (qq.com) “双碳”目标下资…

如何实现一个可靠的 UDP

QUIC是如何实现可靠传输的&#xff1f; 市面上的基于UDP协议实现的可靠传输协议的成熟方案&#xff0c;应用在HTTP/3上。 UDP报文头部和TCP报文头部夹着三层头部 Packet Header Packet Header细分这两种&#xff1a; Long Packet Header 用于首次建立连接Short Packet Hea…

深元ai智慧工地视频分析盒子提高建筑施工现场安全效率

随着社会的快速发展&#xff0c;建筑行业安全问题日益受到重视。为了解决传统人工巡查的诸多问题&#xff0c;AI智慧工地视频分析盒子应运而生&#xff0c;通过人工智能技术&#xff0c;全面提高建筑施工现场的安全工作效率。 一、AI智慧工地视频分析盒子解决传统巡查的痛点 …

【产品设计】Android 和 IOS 的交互设计对垒

在手机操作系统百花齐放的年代&#xff0c;也是产品经理最头疼的年代&#xff0c;因为需要根据不同的操作系统做出不同的设计。而如今&#xff0c;手机操作系统基本只剩下安卓和IOS两大阵营&#xff0c;只需处理好安卓和IOS交互上的差异部分就可以做好产品设计了。 手机操作系统…

不良事件上报系统源码 有演示,已在多家医院运营多年

不良事件上报系统源码&#xff0c;医院安全不良事件管理系统源码 技术架构&#xff1a;前后端分离&#xff0c;仓储模式&#xff0c;BS架构&#xff0c;有演示&#xff0c;已在多家医院完美运营。 相关技术&#xff1a;PHPvscodevue2elementlaravel8mysql5.7 文末获取联系&am…

【每日一练】基础题目练习

1、打印1-100之间所有的素数 素数&#xff1a;(也说质数) 数学上指在大于1的整数中只能被1和它本身整除的数。如2、3、5、7、11、43、109。过去。 方法一&#xff1a; 如果数据i能够被[2 &#xff0c;qsrt(i)]之间的数整除&#xff0c;则表示这个数不是素数。 当一个数na*b时&a…

CVE漏洞复现-CVE-2022-22947-Spring Cloud Gateway RCE

CVE-2022-22947-Spring Cloud Gateway RCE 基本介绍 微服务架构与Spring Cloud 最开始时&#xff0c;我们开发java项目时&#xff0c;所有的代码都在一个工程里&#xff0c;我们把它称为单体架构。当我们的项目的代码量越来越大时&#xff0c;开发的成员越来越多时&#xff…

Vivdao FFT IP核调试记录

最近一时兴起&#xff0c;看了下Vivado版本下的FFT IP核&#xff0c;发现和ISE版本下的FFT IP核有一些差别&#xff0c;貌似还不小。做了个简单的仿真&#xff0c;Vivado仿真结果竟然和Matlab仿真结果对不上&#xff0c;废了九牛二虎之力研究datasheet、做仿真&#xff0c;终于…

SpringBoot JSON全局日期格式转换器

参考资料 SpringBoot日期格式转换&#xff0c;SpringBoot配置全局日期格式转换器在Spring Boot中定制Jackson ObjectMapper详解SpringBoot中jackson日期格式化问题(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS not turning off timestamps) 目录需求分析一. 前期准备1.1 …