Python机器学习入门笔记(2)—— 分类算法

news2024/9/20 22:30:43

目录

转换器(transformer)和估计器(estimator)

K-近邻(K-Nearest Neighbors,简称KNN)算法

模型选择与调优

交叉验证(Cross-validation)

GridSearchCV  API

朴素贝叶斯(Naive Bayes) 算法

MultinomialNB 和 GaussianNB 区别

决策树(Decision Tree)

随机森林 


转换器(transformer)和估计器(estimator)

在Scikit-learn中,转换器(transformer)和估计器(estimator)是机器学习管道(pipeline)的两个重要组成部分。

转换器是将一个数据集转换成另一个数据集的算法。例如,使用Scikit-learn的预处理模块中的StandardScaler对数据集进行标准化,或使用CountVectorizer将文本数据集转换为特征矩阵。转换器通常通过fit()方法学习数据集的某些属性,然后通过transform()方法将其转换成另一个数据集。

估计器是一种机器学习算法,它通过对已知的数据集进行学习来对新数据进行预测。例如,使用Scikit-learn的线性回归模型进行预测,或使用KMeans模型对数据进行聚类。估计器通常使用fit()方法在已知的数据集上进行训练,然后使用predict()方法对新数据进行预测。

除了fit()transform()方法外,许多转换器和估计器还具有fit_transform()方法,该方法将学习和转换组合成单个操作,从而提高了代码的效率。

Scikit-learn提供了许多常用的转换器和估计器,它们具有统一的API接口,可以非常方便地在机器学习管道中组合使用。使用转换器和估计器,可以将数据集进行处理和预测,从而得到更好的模型性能。

K-近邻(K-Nearest Neighbors,简称KNN)算法

K-近邻(K-Nearest Neighbors,简称KNN)是一种基本的分类和回归算法。KNN的基本思想是在数据集中寻找K个距离新实例最近的训练样本,然后根据这K个样本的类别来对新实例进行分类或回归预测。KNN是一种无参数的学习算法,它没有显式地学习一个模型,而是直接根据已有的数据进行预测。

KNN算法的步骤如下:

  1. 计算测试数据与训练集中每个样本的距离,常用的距离度量有欧氏距离、曼哈顿距离、余弦相似度等。
  2. 选取与测试数据距离最近的K个训练集样本。
  3. 统计这K个样本中出现次数最多的类别作为测试数据的类别,即进行分类预测,或计算这K个样本的平均值作为测试数据的预测值,即进行回归预测。

KNN算法的优点在于简单易懂、无需显式地学习模型、适用于分类和回归问题,但是在处理大规模数据集时速度较慢,需要保存全部训练数据,对于高维数据效果不佳。

下面是一个使用Scikit-learn实现KNN分类算法的Python代码案例

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

# 加载iris数据集
iris = load_iris()

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)

# 创建KNN分类器模型
knn = KNeighborsClassifier(n_neighbors=3)

# 训练模型
knn.fit(X_train, y_train)

# 预测测试集
y_pred = knn.predict(X_test)

#查看预估与测试值
print("查看预估数值:\n",y_pred==y_test)

# 输出模型准确率
accuracy = knn.score(X_test, y_test)
print("KNN模型的准确率为:", accuracy)

 

以上代码中,首先使用load_iris()函数加载iris数据集,然后使用train_test_split()函数将数据集划分为训练集和测试集。接着使用KNeighborsClassifier创建KNN分类器模型,并使用fit()方法训练模型。最后使用predict()方法对测试集进行预测,并使用score()方法计算模型准确率。

模型选择与调优

模型选择是指在给定数据集和模型族的情况下,从中选择最优模型的过程。而模型调优则是在选择好模型后,对模型参数进行优化以达到更好的模型效果。 

交叉验证(Cross-validation)

交叉验证(Cross-validation)是一种常用的模型选择和调优的方法。交叉验证将原始数据集分成K个子集,然后使用其中K-1个子集作为训练集,剩余的一个子集作为测试集。这个过程会重复K次,每次用不同的子集作为测试集。最终,将这K次的测试结果平均得到模型的性能指标。

交叉验证可以有效地评估模型的性能,同时还能防止过拟合。它也可以帮助我们选择模型的超参数,即模型构建时需要手动调整的参数,比如KNN模型的k值、线性模型的正则化参数等等。为了选出最优的超参数组合,我们可以使用超参数搜索算法。

网格搜索(Grid Search)是一种常用的超参数搜索算法。它会在给定的超参数空间中进行穷举搜索,并使用交叉验证来评估每种超参数组合的性能。网格搜索通常需要指定一个参数字典,其中每个键表示一个超参数,对应的值是一个超参数的取值列表。然后网格搜索会遍历所有超参数组合,返回性能最优的超参数组合。

GridSearchCV  API

GridSearchCV 是一个用于超参数优化的工具,可以通过系统地遍历不同的参数组合来找到最佳的模型参数,进而提高模型的性能。下面是几个常用的参数及其意义:

  • estimator: 传入一个模型对象,该模型需要实现 fit()predict() 方法,这个模型会在参数网格上进行优化。
  • param_grid: 一个字典或列表,用于指定参数的取值范围,网格搜索会遍历所有的参数组合,将最优参数组合作为模型的最终参数。
  • cv: 交叉验证生成器或迭代器,用于确定交叉验证的折数或生成样本的分割策略。
  • scoring: 模型评价标准,可以是字符串、自定义函数或可调用的对象,用于对每个候选参数组合进行评价。
  • n_jobs: 并行运行的作业数。
  • verbose: 控制详细程度的参数,可以设置为 0(不输出任何信息)到 10(输出所有信息)之间的值。

下面是一个简单的示例,演示如何使用交叉验证和网格搜索来选择最优的KNN模型超参数对上一个python示例代码进行优化

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

# 加载数据
iris = load_iris()
X, y = iris.data, iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

# 定义KNN模型
knn = KNeighborsClassifier()

# 定义参数的搜索空间
param_grid = {'n_neighbors': [1, 3, 5, 7, 9]}

# 使用GridSearchCV进行模型选择和调优
grid_search = GridSearchCV(knn, param_grid=param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 输出最优参数和交叉验证的结果
print('Best parameter:', grid_search.best_params_)
print('Best cross-validation score:', grid_search.best_score_)
print('Test set score:', grid_search.score(X_test, y_test))

上述代码中,首先加载数据,然后划分训练集和测试集。接着,定义KNN模型,并定义参数的搜索空间。然后使用GridSearchCV进行模型选择和调优。最后输出最优参数和交叉验证的结果。 

朴素贝叶斯(Naive Bayes) 算法

朴素贝叶斯(Naive Bayes)是一种基于贝叶斯定理的分类算法,它假设样本特征之间相互独立,因此被称为“朴素”。

朴素贝叶斯算法在文本分类、垃圾邮件过滤、情感分析等领域得到广泛应用,其原理是基于贝叶斯定理,通过计算样本在给定类别的条件下的概率来进行分类。

具体来说,对于一个待分类的样本,朴素贝叶斯算法会计算它属于每个类别的概率,并将概率最大的类别作为分类结果。计算样本属于某个类别的概率时,需要通过先验概率似然概率来计算后验概率。先验概率指的是样本属于某个类别的概率,而似然概率指的是样本在给定类别下的特征出现概率。朴素贝叶斯算法假设样本特征之间相互独立,因此可以将特征的似然概率相乘来计算样本在给定类别下的概率。

MultinomialNB 和 GaussianNB 区别

MultinomialNB适用于特征是离散值的情况,例如文本分类问题,其中特征是单词或短语的出现次数或出现概率。在MultinomialNB中,每个特征的概率分布是一个多项分布。

GaussianNB适用于特征是连续值的情况,例如数据集中的各种测量结果。在GaussianNB中,每个特征的概率分布是一个高斯分布。

在使用朴素贝叶斯分类器时,应根据特征类型选择合适的模型。

下面是一个使用Scikit-learn库中的MultinomialNB和GaussianNB进行文本分类的示例:

from sklearn.naive_bayes import MultinomialNB, GaussianNB
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split

# 加载数据集
newsgroups = fetch_20newsgroups(subset='test',data_home='./data')

# 对文本进行特征提取
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(newsgroups.data)
y = newsgroups.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 使用MultinomialNB进行分类
mnb = MultinomialNB()
mnb.fit(X_train, y_train)
print("MultinomialNB accuracy:", mnb.score(X_test, y_test))

# 使用GaussianNB进行分类
gnb = GaussianNB()
gnb.fit(X_train.toarray(), y_train)
print("GaussianNB accuracy:", gnb.score(X_test.toarray(), y_test))

 

这个例子加载了Scikit-learn库中的20个新闻组数据集,使用CountVectorizer进行文本特征提取,并使用MultinomialNB和GaussianNB进行分类。其中,MultinomialNB适用于文本分类问题,而GaussianNB不太适用。

决策树(Decision Tree)

决策树(Decision Tree)是一种基于树结构的分类器,通过对一系列问题的回答,逐步向下递归,最终得到一棵决策树,每个叶节点代表一种类别。决策树算法的优点是可以处理离散型和连续型数据,且易于理解和解释,缺点是容易产生过拟合。

决策树是一种常用的分类和回归算法,在许多场景下都可以得到很好的应用。一般来说,决策树适用于以下情况:

  1. 数据量不大且特征比较简单:决策树在处理数据量不大且特征比较简单的数据集时,运行速度较快,同时也比较容易理解和解释生成的决策树。

  2. 需要理解和解释分类规则:生成的决策树可以用于直观地表示分类规则,可以帮助人们更好地理解和解释分类规则,特别是在一些需要向其他人进行解释的场景中,决策树的解释性非常有用。

  3. 特征具有一定的可解释性:决策树适用于特征具有一定的可解释性的情况,例如医学诊断等领域中的数据分析,特征的可解释性对于专家评估非常重要。

  4. 需要进行特征选择:在决策树的构建过程中,根据特征的重要性对特征进行选择,可以得到更简洁、更容易理解和解释的分类器。

class sklearn.tree.DecisionTreeClassifier API是决策树分类器的实现,主要用于分类问题。其中的参数和方法包括:

  • criterion: 切分质量的评价准则,可选值为"gini"或"entropy"。

  • splitter: 决策树分裂策略,可选值为"best"或"random"。

  • max_depth: 决策树最大深度,用于防止过拟合。

  • min_samples_split: 节点分裂所需的最小样本数。

  • min_samples_leaf: 叶节点所需的最小样本数。

  • max_features: 每个节点评估分裂时要考虑的最大特征数。

  • random_state: 随机数种子,用于控制每次运行时的随机性。

  • fit(X, y): 拟合决策树模型。

  • predict(X): 对X进行预测。

  • score(X, y): 返回模型在测试集上的精度得分。

下面是一个简单的示例,使用 sklearn.tree.DecisionTreeClassifier 对鸢尾花数据集进行分类:

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载数据
iris = load_iris()
X, y = iris.data, iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建决策树模型
clf = DecisionTreeClassifier(random_state=42)

# 训练模型
clf.fit(X_train, y_train)

# 在测试集上评估模型
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

 

 

在上面的代码中,首先使用 load_iris() 函数加载鸢尾花数据集,然后使用 train_test_split() 函数将数据集划分为训练集和测试集。接下来,使用 DecisionTreeClassifier 类创建决策树模型,并使用训练集对模型进行训练。最后,在测试集上评估模型的准确率。

随机森林 

在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。

学习算法根据下列算法而建造每棵树:

  • 用N来表示训练用例(样本)的个数,M表示特征数目。
    • 1、一次随机选出一个样本,重复N次, (有可能出现重复的样本)
    • 2、随机去选出m个特征, m <<M,建立决策树
  • 采取bootstrap抽样(一种随机放回抽样的方法)

RandomForestClassifier的使用方法与其他scikit-learn的分类器类似,可以通过fit()方法拟合模型,predict()方法预测结果,score()方法评估模型性能,等等。其中,最常用的参数包括:

  • n_estimators:森林中决策树的数量。
  • criterion:决策树的分裂标准,可以选择"gini"或"entropy"。
  • max_depth:决策树的最大深度,控制决策树的复杂度。
  • min_samples_split:决策树分裂所需的最小样本数。
  • min_samples_leaf:叶节点所需的最小样本数。
  • max_features:用于每个决策树的特征数量,可以选择"auto"、"sqrt"、"log2"或任意整数。
  • bootstrap:是否使用有放回的随机抽样来训练每个决策树。

下面是一个使用RandomForestClassifier进行分类的示例代码:

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

# 生成随机数据
X, y = make_classification(n_samples=10000,
                           n_features=100, n_informative=20,
                           n_classes=5, random_state=1)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    test_size=0.3,
                                                    random_state=1)

# 创建随机森林分类器
clf = RandomForestClassifier(n_estimators=100, max_depth=100)
tree =DecisionTreeClassifier()
# 训练模型
clf.fit(X_train, y_train)
tree.fit(X_train,y_train)
# 预测测试集
y_pred = clf.predict(X_test)
y_t_pred = tree.predict(X_test)

# 评估模型性能
score = clf.score(X_test, y_test)
tree_score = tree.score(X_test, y_test)
print("Accuracy: {:.2f}%".format(score*100))
print("Tree Accuracy: {:.2f}%".format(tree_score*100))

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

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

相关文章

UE4 渲染学习笔记(未完)

原文链接&#xff1a;虚幻4渲染管线入门 - 知乎 从原文摘抄一下&#xff1a; 渲染框架 1&#xff0c;一套是传统的以RHICmdList为核心构建RenderPass&#xff0c;从RHICmdList.BeginRenderPass(...)开始&#xff0c;以RHICmdList.EndRenderPass()结束的框架。 2.一套是以新的Gr…

【面向对象语言三大特性之 “继承”】

目录 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6. 继承与静态成员 7.复杂的菱形继承及菱形虚拟…

linux(全志)初始环境到移植lvgl

一、 格式化TF卡 1. linux命令行格式化 1.1 找到U盘位置&#xff08;已挂载&#xff09; sudo fdisk -l 如图&#xff0c;我的在/dev/sdb 1.2 格式化U盘 sudo mkfs -t vfat /dev/sdb-t 后面是格式化为哪种文件系统格式&#xff0c;vfat就是fat32格式&#xff0c;最后…

Hashmap链表长度大于8真的会变成红黑树吗?

1、本人博客《HashMap、HashSet底层原理分析》 2、本人博客《若debug时显示的Hashmap没有table、size等元素时&#xff0c;查看第19条》 结论 1、链表长度大于8时(插入第9条时)&#xff0c;会触发树化(treeifyBin)方法&#xff0c;但是不一定会树化&#xff0c;若数组大小小于…

Win11电脑速度慢、延迟高怎么办?

作为新版的系统&#xff0c;Windows 11还需要更多的时间完善。不少用户反映升级了Win11后反而感觉速度慢&#xff0c;还有延迟或死机现象。 如果你使用Win11系统时也有这种感觉&#xff0c;那这篇文章就是为你提供的。 问题可能出在系统存储容量低、驱动程序已过时&#xff0…

APP渗透抓包

APP渗透抓包1.APP渗透测试原理2.安装安卓模拟器抓包2.1.安装模拟器2.2.设置代理下载证书2.2.1.burp suite设置代理2.2.2.浏览器设置代理2.2.3.下载证书2.3.模拟器安装证书2.3.1.移动证书2.3.2.证书设置2.4.设置代理2.4.1.设置burp suite代理2.4.2.夜神模拟器代理2.5.抓包测试2.…

JVM调优及垃圾回收GC

一、说一说JVM的内存模型。JVM的运行时内存也叫做JVM堆&#xff0c;从GC的角度可以将JVM分为新生代、老年代和永久代。其中新生代默认占1/3堆内存空间&#xff0c;老年代默认占2/3堆内存空间&#xff0c;永久代占非常少的对内存空间。新生代又分为Eden区、SurvivorFrom区和Surv…

Node.js安装与配置

Node.js安装与配置 前言 本篇博文记录了Node.js安装与环境变量配置的详细步骤&#xff0c;旨在为将来再次配置Node.js时提供指导方法。 另外&#xff1a;Node.js版本请根据自身系统选择&#xff0c;安装位置、全局模块存放位置和环境变量应根据自身实际情况进行更改。 Node…

spring(四)——————从spring源码角度去解释前面的疑问

前面两篇文章&#xff0c;我们从mybatis-spring的插件包出发&#xff0c;探究如何将第三方框架集成到spring中&#xff0c;也知道了mybatis中使用了FactoryBeanImportBeanDefifinitionRegistrarImport对mapper进行注入。 不过我们在前两篇文章中仍然遗留很多疑点&#xff0c;例…

Revit导出PDF格式图纸流程及“批量导出图纸”

一、Revit导出PDF格式图纸流程 1、点击左上方“应用程序菜单”即“R”图标&#xff0c;进择“打印”选项。 2、在弹出的对话框中&#xff0c;需要设置图纸“打印范围”&#xff0c;选择“所选的视图/图纸选项”&#xff0c;点击“选择”&#xff0c;按钮&#xff0c;选择我们需…

LESS模型与随机森林

模型学习 1 随机森林 https://blog.csdn.net/weixin_35770067/article/details/107346591? 森林就是建立了很多决策树&#xff0c;把很多决策树组合到一起就是森林。 这些决策树都是为了解决同一任务建立的&#xff0c;最终的目标也都是一致的&#xff0c;最后将其结果来平均…

Xline v0.2.0: 一个用于元数据管理的分布式KV存储

Xline是什么&#xff1f;我们为什么要做Xline&#xff1f; Xline是一个基于Curp协议的&#xff0c;用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议&#xff0c;需要两次RTT才能完成一次请求。当部署在单个数据中心时&#xff0c;节点之间的延迟较低&a…

08 SpringCloud 微服务网关Gateway组件

网关简介 大家都都知道在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f; 如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去用。 这样的架构&#xff0c;会存…

Linux软件管理:源代码安装

前言 Linux上面的软件几乎都是经过GPL的授权&#xff0c;所以每个软件都提供源码 我们的系统中有一个http软件包&#xff08;上一篇文章中安装的&#xff09; 通过man手册我们知道了该软件包属于Apache&#xff0c;所以我们就可以进入它的官网中获取此源码 官网除了能获取源码…

IB学校获得IBO授权究竟有多难?

IB 学校认证之路&#xff0c;道阻且长 The road to IB school accreditation is long and difficult一所学校能获得IB授权必须经过IBO非常严格的审核&#xff0c;在办学使命&教育理念、组织架构、师资力量&授课技能、学校硬件设施和课程体系上完全符合标准才可获得授权…

英特尔 31.0.101.4125显卡驱动更新!

周更驱动的英特尔又来啦&#xff01;时隔一周英特尔为大家带来了31.0.101.4125版本的显卡驱动&#xff0c;支持《英雄连3》、《工人物语&#xff1a;新兴同盟》、《原子之心》、《狂野之心》、《如龙维新&#xff01;极》等游戏。 《如龙维新&#xff01;极》将在2月22日正式登…

功率放大器在lamb波方向算法的损伤定位中的应用

实验名称&#xff1a;基于PZT结Lamb波方向算法的损伤定位方法研究方向&#xff1a;损伤定位测试目的&#xff1a;Lamb波是在具有自由边界的固体板或层状结构中传输的一种弹性导波&#xff0c;由于其本身的传播特性&#xff0c;如沿传播路径衰减小&#xff0c;能量损失小&#x…

makefile简易教程

makefile简易教程 一、学习目标 达到多文件快速编译的需求&#xff0c;相关符号的意思&#xff0c;以及其它注意事项。 二、快速入门 2.1 基本概念 Makefile 是一个在Unix和Linux操作系统上使用的构建工具&#xff0c;用于自动化编译和构建源代码。 2.2 用处 通过Makefi…

Linux环境下(CentOS 7)安装MySQL

Linux环境下(CentOS 7)安装MySQL数据库 文章目录Linux环境下(CentOS 7)安装MySQL数据库一、安装MySQL数据库二、安装过程的中相关问题三、如何卸载已安装的MySQL四、参考链接一、安装MySQL数据库 1、下载mysql源安装包(version: 5.7.41 MySQL Community Server) wget http://…

ACM MM 相关内容的整理+汇总

目录一、网址二、重要时间点三、论文篇幅要求四、征稿主题五、论文格式相关要求六、论文模板修改成投稿模式上述参考七、模板使用相关八、关于图片方面的问题九、Review and Rebuttal十、ACM MM2022相关论文参考arxiv上 ACM MM2022 论文汇总一、网址 ACM MM2023 主页&#xff1…