机器学习与Scikit Learn学习库

摘要: 本文介绍机器学习相关的学习库Scikit Learn,包含其安装及具体识别手写体数字案例,适合机器学习初学者入门Scikit Learn。

在我科研的时候,机器学习(ML)是计算机科学领域中最先吸引我的一门学科。虽然这个概念非常简单,但是它表现优异。以Google、AirBnb和Uber为代表的高科技公司,已经将机器学习应用于他们的产品中。当我第一次尝试在工作中应用机器学习时,Scikit Learn库是一个很好的起点。

针对于Python语言开发的Scikit Learn,允许开发者们轻易地将机器学习集成到自己的项目中。我希望通过一个简单的Scikit Learn应用来教会大家学习,如果你刚接触Python,不要感到害怕,本文会有详细的代码注释讲解。


安装

在进行应用展示之前,需要安装Scikit Learn。首先确保下载并安装Python(本文使用Python 3)。除此之外,确保通过pip语句安装NumPy 和 SciPy

pip install numpy
pip install scipy

剩下的安装过程很简单,一条语句命令即可完成Scikit Learn的安装。

pip install scikit-learn

只需花费一小段时间即可安装成功,为了读取所举案例的CSV 文件,还需要安装Pandas,同样只需一条语句即可完成安装:

pip install pandas

此时,我们已经完成全部安装!


程序

Scikit Learn在其主页上提供了丰富的使用案例,当我第一次使用该软件包时,我发现这个主页是非常有用的。为了在这里展示Scikit Learn,我打算实现一个识别数字手写体的分类器,数据集来自于UCI数据集(由11000张图片组成)。这个数据集来自44个参与者,每个参与者需要手写250个数字,并且数据集中的每张图片(也被称作样本)对应于0-9之间的一个手写数字。

每个样本用一个保存0到100之间的特征向量表示,这些值表示样本中每个像素的强度。鉴于每个样本大小为500x500,这样会造成特征向量很长以至于难以处理。为了解决这个问题,图像被重新采样以减少像素的数目,采样后的特征向量长度为16。

数字0到9将是分类器在分类过程中要考虑的类别集合,分类器将从30名参与者(约7500张)抽取样本,以学习每个数字类别的样本。剩余的样本将被保留以测试训练好后的分类器。每个样本已经通过人为分类,这也意味着测试集中的每个样本有着正确的分类(标签)。这使得能够通过比较预测值与实际标签值来确定分类器的性能。

训练数据集和测试数据集均由UCI的CSV文件提供,通过Pandas将这些文件导入Python中,命令如下:

import pandas as pddef retrieveData():trainingData = pd.read_csv("training-data.csv").as_matrix()testData = pd.read_csv("test-data.csv").as_matrix()return trainingData, testData

使用read_csv读取每个文件,以生成Pandas 数据框架,并使用as_matrix将其转换为Numpy数组以便后续使用。这些文件的每一行都对应着一个数字样本——由长度为16的特征向量组成,后面跟着对应的类别标签。将特征向量与类别标签分离有利于后续Scikit Learn的使用。

def separateFeaturesAndCategories(trainingData, testData):trainingFeatures = trainingData[:, :-1]trainingCategories = trainingData[:, -1:]testFeatures = testData[:, :-1]testCategories = testData[:, -1:]return trainingFeatures, trainingCategories, testFeatures, testCategories

预处理

Scikit Learn提供的绝大多数分类器对特征缩放比较敏感,每个特征向量中的值是0到100之间,没有一致的均值或方差。将这些特征向量进行缩放以满足零均值和方差为1的条件,这有助于分类器在训练和分类过程中能够识别任何数字类别的样本。这种预处理操作是机器学习中一个可选步骤,但我强烈推荐使用这种操作,有助于提升分类器的性能。使用Scikit Learn的预处理数据包中的StandardScalar能够完成预处理操作,这样证明该操作实现起来非常简单。首先允许缩放器拟合训练数据以学习未缩放特征是什么样,缩放器能够将训练和测试数据集中的特征转换为零均值和方差为1的特征向量。

from sklearn.preprocessing import StandardScalerdef scaleData(trainingFeatures, testFeatures):scaler = StandardScaler()scaler.fit(trainingFeatures)scaledTrainingFeatures = scaler.transform(trainingFeatures)scaledTestFeatures = scaler.transform(testFeatures)return scaledTrainingFeatures, scaledTestFeatures   


分类

Scikit Learn提供了一系列适合我们需求的分类器,选择其中的随机梯度下降分类器(SGD)作为此次举例的分类器,这是因为我过去经常使用该分类器。首先,我们需要将分类器拟合训练数据集(即训练分类器)。然后,我们准备设置分类器以预测未见过的测试样本的标签。使用Scikit Learn,所有的这些操作只需要通过几行代码即可实现。

from sklearn.linear_model.stochastic_gradient import SGDClassifierdef classifyTestSamples(trainingFeatures, trainingCategories, testFeatures):clf = SGDClassifier()clf.fit(trainingFeatures, trainingCategories)predictedCategories = clf.predict(testFeatures)return predictedCategories


结果

有了预测值之后,就可以与文件中提供的类别标签进行比较。那么这里会有几个问题,分类器效果怎样?我们如何衡量分类器的效果?给定一个特定的衡量标准,我们在哪里设置阈值来区分不好的结果?为了回答前两个问题,可以参考Scikit Learn的分类器度量包。我从中挑选出四个指标,分别是准确率、精度、召回率和F1分数。

  1. 准确率:正确分类样本所占的百分比
  2. 精度:类别x中正确分类的样本数目占类别x总数的百分比
  3. 召回率:类别x中正确分类的样本数目占其本身与其它不是x类别样本数之和的百分数
  4. F1分数:精度(P)和召回率(R)的加权平均值 ,在Scikit Learn中定义为2 * (P * R) / (P + R)

Scikit Learn的accuracy_score函数能够得出分类器的准确率,剩余的三个指标通过classification_report得到,最终打印出每个类别的准确率、精度、召回率和F1分数,并提供平均值。

from sklearn.metrics import accuracy_score, classification_reportdef gatherClassificationMetrics(testCategories, predictedCategories):accuracy = accuracy_score(testCategories, predictedCategories)metrics_report = classification_report(testCategories, predictedCategories)print("Accuracy rate: " + str(round(accuracy, 2)) + "\n")print(metrics_report)

分类器运行时其指标总会有小的变化,有些情况下会得到很高的测试准确率。虽然这些预测值与文件提供的标签值可能相一致,但也会出现分类器对其工作缺乏信心的情况。每次运行时,分类器可能会得出不同的预测结果,这可能归结为针对特定数字的样本数量不足或分类器遇到了与训练集中有显著区别的字迹。考虑到这些变化,下面是SGD分类器的一组实验结果。

Accuracy rate: 0.84precision    recall  f1-score   support0       0.98      0.84      0.90       3631       0.58      0.84      0.69       3642       0.97      0.81      0.88       3643       0.98      0.90      0.94       3364       0.95      0.93      0.94       3645       0.62      0.94      0.75       3356       1.00      0.96      0.98       3367       0.88      0.84      0.86       3648       0.85      0.76      0.80       3369       0.93      0.58      0.72       336avg / total       0.87      0.84      0.85      3498

对于第一次尝试而言,84%的准确率已经相当不错了。这也提醒了我们之前提到的问题中的第三个问题——我们在哪里设置区分好结果和坏结果的阈值?这是一个棘手的问题,因为这完全取决于分类器要实现的目标,每个人考虑的好坏区分标准都不一样。我们是否可以改进分类器,使其始终能够比这里观察到的结果更好吗?


我们可以做得更好吗?

答案是肯定的,并有很多选择需要考虑。首先,本次举例使用了基本的预处理操作,更复杂的缩放方法可能会进一步降低分类器的敏感度以提升相关指标。其次,本次举例实现的是一个基本的SGD分类器,而且使用的是Scikit Learn提供的默认参数,没有进行适当的调整。因此,我们可以改变训练数据的迭代次数(被称作epoch),防止分类器在每次迭代时打乱训练数据,或者是多次运行分类器,启用它的热启动属性,以便分类器回忆之前做出的预测。

同样值得考虑的是,我们只实现了Scikit Learn中提供的其中一种分类器。虽然SGD分类器足够完成文中所举的例子,但是我们也可以考虑尝试使用一些其它的分类器,比如LinearSVC或Multinomial Naive Bayes等。机器学习的乐趣在于:有很多参数变量需要考虑,调整这些参数可能会改善或恶化整个模型吗的性能。为任何机器学习问题寻找最佳解决方案都是一项艰巨的任务,需要通过不断尝试。


结论

以上是所举例子的全部内容,文中只是介绍了一些基本知识,而Scikit Learn提供了更多丰富的内容等待着大家的探索,可以借助于其主页找到很多有用的文档。对于希望查看完整代码或自行尝试的读者,可以在本人的Github上找到相应的CSV文件和Python代码。


作者信息

Ross Rhodes,软件开发工程师,擅长Java、Python

文章原标题《Machine Learning with Scikit Learn》,作者:Ross Rhodes,译者:海棠,审阅: 

原文链接

干货好文,请关注扫描以下二维码:


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

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

相关文章

工作流实战_19_flowable 任务委派

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://www.bilibili.com/video/av78294766/ 用户名密码0000001test0000002test0000003test0000004test文章目录场景分析1. 演示2. 代码分享3. 委派的执行处理场景分析 解释:委派 A…

【视频点播最佳实践】使用OSS SDK上传视频到点播

摘要: 场景 点播上传SDK缺乏需要的语言版本(如C/C、Go等)或相应的功能(如网络流上传、追加上传),可以直接使用OSS的SDK进行上传。 准备工作 确认已开通点播服务并完成了相关配置。确认已准备了阿里云账号AK…

pythonxml库_对python 生成拼接xml报文的示例详解

最近临时工作要生成xml报名,通过MQ接口发送。简单小程序。 自增长拼成xml报文 Test_001.py # encodingutf-8 import time orderId s1 "\n" # for ID in range(1,5): item1 "" \ "" str(ID) "" \ "" time…

字符串数组长度的几种求法

第一种 根据库函数求出字符串的长度&#xff0c;采用这种方法要引入头文件string.h #include<string.h> int main() {char arr[] "abcdef";int sz strlen(arr);printf("%d", sz);return 0;}第二种 采用计数器的方法求得字符串的方法 int my_strl…

Aruba 推出Instant On 为中小型企业提供安全、高速的无线连接

戳蓝字“CSDN云计算”关注我们哦&#xff01;让你过几天没有Wi-Fi的生活&#xff0c;是一种什么样的感受&#xff1f;在现代人的生活里&#xff0c;离不开Wi-Fi已经成为日常&#xff0c;超市、酒店、住宅、医院、高铁……你能想到的所有场景几乎都已经部署了Wi-Fi。从个人角度来…

NSURLProtocol 拦截 NSURLSession 请求时body丢失问题解决方案探讨

摘要&#xff1a; “IP直连方案”主要在于解决DNS污染、省去DNS解析时间&#xff0c;通常情况下我们可以在项目中使用 NSURLProtocol 拦截 NSURLSession 请求&#xff0c;下面将支持 Post 请求中面临的一个挑战&#xff0c;以及应对策略介绍一下。 “IP直连方案”主要在于解决D…

工作流实战_18_flowable 流程任务的转办

项目地址https://gitee.com/lwj/flowable.git代码分支flowable-base视频讲解地址https://www.bilibili.com/video/av78184848/ 用户名密码0000001test0000002test0000003test0000004test文章目录1. 演示2. 代码分享1. 演示 2. 代码分享 public ReturnVo<String> turnTa…

深入解读:获Forrester大数据能力高评价的阿里云DataWorks思路与能力

摘要&#xff1a; Forrester发布了Now Tech: Cloud Data Warehouse Q1 2018报告&#xff0c;报告对云化数据仓库&#xff08;Cloud Data Warehouse, CDW&#xff09;的主要功能、区域表现、细分市场和典型客户等进行了全面评估。 1.前言 本文基于Now Tech: Cloud Data Warehous…

用C语言倒置字符串

要逆置这个字符串&#xff0c;有很多种方法&#xff0c;在此说一次比较巧妙的方法 首先&#xff0c;逆置这个字符串&#xff0c;可以考虑单独的把每个单词都逆序一下&#xff0c;在对整个字符串进行逆序 考虑本题中的I like beijing. 首先对I、like、beijing. 中的每个单词逆序…

java中怎么把生成文件到项目根目录_[SpringBoot2.X] 02- 项目结构介绍

POM文件继承Spring Boot 的父级依赖&#xff0c;只有继承它项目才是 Spring Boot 项目。 spring-boot-starter-parent 是一个特殊的 starter&#xff0c;它用来提供相关的 Maven 默认依赖。使用它之后&#xff0c;常用的包依赖可以省去 version 标签。也就是继承的是springboot…

大咖云集、精彩议题、独家内容,2019 AI ProCon震撼来袭!(日程出炉)

2019年9月5-7日&#xff0c;面向AI技术人的年度盛会—— 2019 AI开发者大会 AI ProCon&#xff0c;火热来袭&#xff01; 继2018 年由CSDN成功举办AI 开发者大会一年之后&#xff0c;全球AI市场正发生着巨大的变化。顶尖科技企业和创新力量不断地进行着技术的更迭和应用的推进。…

机器学习的未来——深度特征融合

摘要&#xff1a; 深度特征融合是一项能够克服机器学习不足&#xff0c;为机器学习打开通往未来大门的新技术。新技术要不要了解一下&#xff1f;即使是最敏锐的技术布道师也无法预测大数据对数字革命的影响。因为他们最初的关注点都聚焦在了扩大基础设施以构建现有服务上。在提…

flowable 图片缓存

背景 由于我们的每次显示图片的话&#xff0c;都将需要大量的查询和相关的流。这样对我们的系统压力极大&#xff0c;用户体验极差。 所以使用了缓存把图片流缓存起来&#xff0c;这样就可以解决问题了。 实现 这里我用的是ehcache&#xff0c;由于他小巧依赖少。 1.把我们的…

原码,反码,补码的关系和大小端字节序存储的关系

在看如下代码之前&#xff0c;要知道原码&#xff0c;反码&#xff0c;补码之间的关系 首先要知道第一位是符号位&#xff0c;0代表是正数&#xff0c;1代码是负数 正数的原码&#xff0c;反码&#xff0c;补码相同 负数的反码是符号位不变&#xff0c;其他位按位取反 负数的补…

与机器学习算法有关的数据结构

摘要&#xff1a; 在机器学习中需要运用到许多数据结构&#xff0c;掌握它们是非常重要的。希望本文能有所帮助拥有机器学习技能是不够的。你还需要良好的数据结构的工作知识。学习更多&#xff0c;并解决一些问题。因此&#xff0c;你已经决定不再使用固定的算法并开始编写自己…

resnet结构_经典卷积网络(二)-ResNet

一、ResNet&#xff08;总结自csdn文章&#xff09;随着网络的加深&#xff0c;出现了训练集准确率下降的现象&#xff0c;确定这不是由于Overfit过拟合造成的。作者针对这个问题提出了一种全新的网络&#xff0c;叫深度残差网络&#xff0c;它允许网络尽可能的加深&#xff0c…

物联网避坑 3 大指南!

戳蓝字“CSDN云计算”关注我们哦&#xff01;整理 | 胡巍巍参考 | 中信出版社《物联网时代》如果你正是物联网从业者&#xff0c;你如何避免自己的投入&#xff0c;不会成为一种痛苦的学习经历&#xff0c;相反成为一个令人瞩目的成功故事呢&#xff1f;最好的方式之一&#xf…

flowable 账号密码加密

1.背景&#xff1a; 集成flowable的idm的时候&#xff0c;密码总是明文&#xff0c;这种肯定不行。 2.实现 2.1.配置config Configuration public class IdmProcessEngineConfiguration extends SpringIdmEngineConfiguration {Beanpublic PasswordEncoder bCryptEncoder() {…

深度学习工作机制通俗介绍

摘要&#xff1a; 本文是深度学习基础性介绍&#xff0c;以降维的角度分析卷积神经网络模型&#xff0c;并着重说明了目前人工智能存在的不科学性。在本文之前&#xff0c;写过一些关于人工智能的科普性文章&#xff0c;比如人工智能为什么能起作用、模型是什么以及如何去创建模…

结合Apache Kafka生态系统,谈谈2018年机器学习5大趋势

摘要&#xff1a; 让我们来研究下Uber和Netflix上的KSQL&#xff0c;ONNX&#xff0c;AutoML和机器学习平台&#xff0c;看看它们之间是如何相互关联的。在2018慕尼黑OOP会议上&#xff0c;我展示了使用Apache Kafka生态系统和深度学习框架&#xff08;如TensorFlow&#xff0c…