当前位置: 首页 > 编程日记 > 正文

sklearn:Python语言开发的通用机器学习库

引言:深入理解机器学习并全然看懂sklearn文档,须要较深厚的理论基础。可是。要将sklearn应用于实际的项目中,仅仅须要对机器学习理论有一个主要的掌握,就能够直接调用其API来完毕各种机器学习问题。


本文选自《全栈数据之门》。将向你介绍通过三个步骤来解决详细的机器学习问题。

sklearn介绍

scikit-learn是Python语言开发的机器学习库。一般简称为sklearn。眼下算是通用机器学习算法库中实现得比較完好的库了。

其完好之处不仅在于实现的算法多。还包含大量详尽的文档和演示样例。其文档写得通俗易懂,全然能够当成机器学习的教程来学习。
  假设要说sklearn文档的重要性,个人认为,应该能够与佛经中的《金刚经》相比。假设能将其当成《金刚经》一样来阅读,你的机器学习水平一定会有质的提升。
  一般初阅佛经。肯定会被当中的一些名词弄糊涂,就像初次阅读sklearn的文档一样,会被诸如training data、testing data、model select、cross validation等这种词汇弄糊涂。但实际上,仅仅要肯用心读,把这些基础概念弄明确,兴许学习就比較easy了。sklearn必需要结合机器学习的一些基础理论来理解,就像佛经必需要结合一些佛法基础理论来理解一样。
  既然是通用的机器学习库。sklearn中包括了大量经常使用的算法。正如其介绍一样。基本功能主要分为6个部分:分类、回归、聚类、数据降维、模型选择与数据预处理。例如以下图所看到的。


【图1】
  要深入理解机器学习,而且全然看懂sklearn的文档,须要较深厚的理论基础。可是。要将sklearn应用于实际的项目中,却并不须要特别多的理论知识,仅仅须要对机器学习理论有一个主要的掌握,就能够直接调用其API来完毕各种机器学习问题。
对于详细的机器学习问题,通常能够分为三个步骤:

  • 数据准备与预处理
  • 模型选择与训练
  • 模型验证与參数调优

以下就通过一个详细的演示样例来介绍这三个步骤。

数据预处理

在这个演示样例中,使用sklearn自带的Iris数据来做演示。而算法使用kNN来进行分类,要了解kNN算法的具体信息,请參考“近朱者赤。相亲kNN”一节。
  使用load_iris方法,载入Iris数据。Iris是一个很有名的公共数据集。描写叙述了鸢尾花的三种不同的子类别,共同拥有4个特征,分别为花萼的长度与宽度,花瓣的长度与宽度。能够不用关注详细分哪三类,仅仅须要知道在数据中类标签分别用0、1、2表示就可以。


  载入数据的代码例如以下:

%pysparkfrom sklearn.datasets import load_iris
from sklearn.cross_validation import train_test_split# 载入数据
iris = load_iris()
data_X = iris.data
data_y = iris.target# 数据维度、特征与目标值的前3项
print('data:', data_X.shape, data_y.shape)
print('features:', data_X[:3, :])
print('target:', data_y[:3])# 数据切分
train_X, test_X, train_y, test_y = train_test_split(data_X, 
data_y, test_size=0.2)# 训练数据与測试数据的维度
print('train:', train_X.shape, train_y.shape)
print('test: ', test_X.shape, test_y.shape)

将数据的特征载入为data_X。将类别标签载入为data_y,一般的命名习惯是,使用大写的X表示特征是多维的,而用小写的y表示目标值为1维。

不同的命名习惯。比較符合人类以貌取人的特点,程序猿不仅是人。更是聪明的人,因此也有这种习惯。
  载入完数据,使用sklearn自带的train_test_split方法将数据按0.8与0.2的比例进行划分。切分为训练数据train与測试数据test,并将特征与目标值分别命名为train_X、train_y与test_X、test_y。
  其运行结果例如以下图所看到的。
【图2】

建模与预測

准备好数据后,就能够从neighbors近邻类中导入kNN分类算法了,其代码例如以下所看到的:

%pysparkfrom sklearn.neighbors import KNeighborsClassifier# 构建knn模型
knn = KNeighborsClassifier(n_neighbors=3, n_jobs=-1)# 拟合数据
knn.fit(train_X, train_y)# 预測
preds = knn.predict(test_X)print('knn model:', knn)
print('First 3 pred:',preds[:3])

通过使用两个自己定义參数n_neighbors(參考的近邻数)与n_jobs(使用的CPU核数)来导入KNeighborsClassifier模型。这样就生成了一个knn的模型。n_neighbors是knn中最重要的參数,能够通过交叉验证来设置一个合理的值。而n_jobs是sklearn中所有支持并行的算法都会支持的參数。sklearn中有非常多算法都能够将单台机器的所有CPU进行并行运算,设置为-1即是使用机器的所有CPU核,也能够设置成详细的数字值。
  接着使用fit方法在训练数据上进行拟合。kNN是一个有监督的学习算法,因此在拟合数据的时候,须要将已知的类别标签train_y与特征train_X一起输入到模型中进行数据拟合。


  模型在训练数据上完毕了拟合,便能够对測试数据进行预測了,使用predict方法来对測试的特征进行预測。由于是使用特征来预測其类别。此处自然不能传入測试数据的类别标签数据test_y。这个数据是在后面对模型进行评估时使用的。打印knn模型,会输出其用于构建的參数。也能够打印出预測的前三个值。例如以下图所看到的。


【图3】
  在上面的建模与预測过程中,sklearn的这样的简洁API方式已经成为现代机器学习库争相模仿的对象,就连Spark的ML库。也在学习这样的简洁的方式。能够说差点儿已经成为大众接受的标准方式了。

模型评估

评估一个模型的好坏是机器学习中很重要的任务。

否则,无法评价模型的好坏,也就无法更好地优化模型。归根究竟,全部的机器学习算法都是一堆数学运算,其预測的值与标准的值是能够进行数学上的对照的。在这一点上,与教育中所用的考试分数来评估一个人的能力不一样,也与公司中所用的KPI来考核一个人对公司的贡献是不一样的。


  在分类算法中,通常的评价指标有精确率、召回率与F1-Score等几种。
  前面构建的knn模型。本身也有一个score方法,能够对模型的好坏做一个初步评估。其使用的指标为F1-Score。当然,也能够使用sklearn中提供的很多其它的评价指标来评估模型。其代码例如以下所看到的:

%pysparkfrom pprint import pprint# 使用測试的特征与測试的目标值
print(knn.score(test_X, test_y))from sklearn.metrics import precision_recall_fscore_support# 打印出三个指标
scores = precision_recall_fscore_support(test_y, preds)
pprint(scores)

对每一个类别的数据都进行了精确率、召回率与F-beta Score的评估,其结果例如以下图所看到的。
【图4】

模型持久化

辛辛苦苦训练好一个模型后,总希望后面能够直接使用。此时就必需要对模型进行持久化操作了。模型本身就是一个Python的对象。能够使用pickle的方式将模型转储到文件。但sklearn推荐使用其joblib接口,保存与载入模型都很easy:

import joblib# 保存模型
joblib.dump(model, '/tmp/model.pkl')# 载入模型
model = joblib.load('/tmp/model.pkl')

三个层次

前面已经演示了一个完整的使用sklearn来解决实际问题的样例,能够发现。假设仅仅是调用sklearn的API,确实不须要太复杂的理论知识。在学完上面的演示样例后,你也许都并不清楚kNN算法是怎样工作的。但学习是分层次的。
  或许有的人觉得。仅仅会调用API来实现。并非真正会用机器学习了。确实。不理解kNN算法,就不清楚怎样进行算法的參数调优。但个人觉得,从sklearn入门机器学习是最好的途径。虽然你曾经全然没有接触过机器学习。
  我所理解的。学习机器学习算法的三个层次例如以下所述。

  1. 调用:知道算法的基本思想,能应用现有的库来做測试。简单说,就是了解kNN是做什么的,会调用sklearn中的kNN算法。
  2. 调參:知道算法的主要影响參数,能进行參数调节优化。
  3. 嚼透:理解算法的实现细节,而且能用代码实现出来。

上面三个层次是不是非常押韵呢,但不幸的是,有的人一上来就想达到第三个层次。于是刚開始就被怎样实现kNN算法吓到了,过不了三天就从入门到放弃了。
  作为应用型的机器学习,能达到第三阶段固然好,但在实际应用中。建议能调用现有的库就直接调用好了。不理解的地方,能看懂源代码最好。不太建议自己从头实现,除非能力确实够了,否则写出来的代码并不能保证性能与准确性。
  当然,从另外一个角度来说,尤其是在分布式环境下,机器学习还有另外三个层次,想知道的话,请见《全栈数据之门》一书。
  本文选自《全栈数据之门》,点此链接可在博文视点官网查看此书。
                    图片描写叙述
  想及时获得很多其它精彩文章。可在微信中搜索“博文视点”或者扫描下方二维码并关注。
                       图片描写叙述

相关文章:

资料分享:送你一本《BigONE Developer API V2》电子书!

背景 昨天,我推送了一篇技术图文《如何利用 BigOne 的 API 制作自动化交易系统 – 身份验证》,里面提到了 BigONE Developer API V2。为了方便自己也方便他人,所以把这份文档整理成 PDF。如果大家对封装 BigONE 提供的 API 感兴趣可以下载这…

Web前端培训面试攻略

学会web前端技术之后,接下来就是要找到一份合适的工作,今天小编要跟大家分享的文章是关于web前端面试攻略,做好这些可以给面试环节加分,找到合适的工作几率会更高,希望本篇文章能够对大家有所帮助。 ​  Web前端培训…

微软鲍尔默回应被苹果超越:将开发更好产品

针对苹果超过微软成为全球市值最高的高科技公司的消息,微软首席执行官史蒂夫鲍尔默 (Steve Ballmer)周四表示,其目标是开发更好的产品,提高盈利能力。鲍尔默周四在印度首都新德里说,“我每天思考的是如何改进产品、如何使产品更 具…

技术图文:如何利用C#实现Huffman编码?

背景 Huffman编码 在通信和数据压缩领域具有重要的应用。 在介绍 Huffman 编码具体实现之前,先介绍几个相关的概念。 概念1:树中结点的带权路径长度 – 根结点到该结点的路径长度与该结点权值的乘积。 概念2:树的带权路径长度 – 树中所有…

ELK 5.x日志分析 (二) Elasticserach 5.2 安装

2019独角兽企业重金招聘Python工程师标准>>> 解压安装包到/opt/elasticsearch 目录下面 [roots1-prod-it-web01 opt]# tree -L 1 elasticsearch/ elasticsearch/ ├── bin ├── config ├── lib ├── LICENSE.txt ├── modules ├── NOTICE.txt ├── …

什么样的人适合学习UI?

UI时代的到来,让我们的生活都多姿多彩,很多企业越来越注重UI设计这方面,想要学习UI设计的人也越来越多,暗恶魔什么样的人适合学习UI呢? 什么样的人适合学习UI? 目前的UI设计很多都是停留在手机端设计,网页&#xff0…

Uva 10074【递推dp】

UVa 10074 题意:求01矩阵的最大子0矩阵。 http://www.csie.ntnu.edu.tw/~u91029/MaximumSubarray.html#2 这里说的很清楚。先求Largest Empty Interval,枚举每个点为矩形的右下角。 1 #include<iostream>2 #include<cstdio>3 #include<cstring>4 #include<…

金融时报:谷歌撤离中国有99.9%的可能性

据国外媒体报道&#xff0c;英国《金融时报》周六发表文章称&#xff0c;谷歌与中国政府就监管问题的谈判显然陷入僵局&#xff0c;而这家世界最大的搜索引擎关闭中国业务现在有99.9%的可能性。《金融时报》称&#xff0c;谷歌已经制定了关闭中国搜索引擎的详细计划。该报援引一…

技术图文:匿名方法是怎样演变为Lambda表达试的?

背景 “Lambda 表达式”&#xff08;lambda expression&#xff09;是一个匿名函数&#xff0c;Lambda 表达式基于数学中的 λ演算得名&#xff0c;直接对应于其中的 lambda 抽象&#xff08;lambda abstraction&#xff09;&#xff0c;是一个匿名函数&#xff0c;即没有函数…

python和c++的相互调用教程

日常工作中会遇到需要python与cpp代码之间的相互调用&#xff0c;工作的应用复杂&#xff0c;都是取决于代码的多少&#xff0c;但是总的方法不变&#xff0c;这里用两个简单例子说明下&#xff0c;有兴趣的筒子可以探讨下~~ 我的测试环境&#xff1a;ubuntu1604&#xff0c;py…

技术图文:如何通过 LINQ 查找集合中的重复数据?

背景 在前几天介绍的 如何利用C#实现Huffman编码&#xff1f; 的图文中有以下代码。 private List<HuffmanTreeNode> CreateInitForest(string str) {if (string.IsNullOrEmpty(str))throw new ArgumentNullException();List<HuffmanTreeNode> result new List&…

mysql的基本知识

安装&#xff1a;http://www.cnblogs.com/sshoub/p/4321640.html 导库 http://www.cnblogs.com/yuwensong/p/3955834.html 报错&#xff1a;Error was: No module named PIL pip install image转载于:https://www.cnblogs.com/baldermurphy/p/7403778.html

msys下产生dll的导入库

有些时候在只有一个dll的情况下&#xff0c;如果需要隐式链接的话&#xff0c;就需要为该dll产生一个导入库.注意导入库是不能跨编译器使用的&#xff0c;在mingw中导入库需要以.a结尾,而vs则以.lib 以下的方法是在Msys产生mingw及vs 的导入库 , 打开MSys工具 首先生成dll库的d…

零基础小白如何学习好UI设计

智能时代的来临&#xff0c;很多企业都越来越注重用户体验这一块&#xff0c;想要有一个吸引用户的好页面&#xff0c;UI设计师岗位不可或缺&#xff0c;如今越来越多的人想要学习UI设计技术&#xff0c;那么对于零基础小白如何学习好UI设计呢? 零基础小白如何学习好UI设计? …

技术图文:如何利用BigOne的API制作自动化交易系统 -- 获取账户资产

背景 前几天我们介绍了如何使用 BigONE Developer API V2 来获取身份令牌的方法「如何利用BigOne的API制作自动化交易系统 – 身份验证」。一旦获取了身份令牌&#xff0c;我们就可以在网络请求的 header 中加入令牌来获取自己的账户数据&#xff0c;创建买入、卖出订单&#…

『网站升级』PHPWind8.0至8.3升级过程及问题种种回顾录

上星期的PHPWind杭州峰会之后&#xff0c;PHPWind发布了8.3版。紧接着淘连接&#xff0c;淘满意&#xff0c;团购PHPWind的一系统ARP应用开始进入我们公司技术苦力的耳朵里&#xff08;也就是偶&#xff09;&#xff0c;偶知道有大事要发生了。于是乎。领导悠然降至&#xff0c…

新浪 抓取详情页

转载于:https://www.cnblogs.com/tian-sun/p/7404493.html

零基础如何学习软件测试

很多人想学软件测试是因为软件测试是进入到IT行业里比较快的一门技术&#xff0c;软件测试的门槛比较低&#xff0c;初学者和零基础小白学起来都是比较容易的&#xff0c;下面小编就详细的给大家介绍一下具体零基础如何学习软件测试? 零基础如何学习软件测试?对于初级测试而言…

VPS使用初体验

很早就想建个人网站&#xff0c;但是出于各种限制&#xff0c;一直没有实施。前几天开通了网银&#xff0c;便再次萌发了建站的想法。。。 购买一个了enom的域名&#xff0c;然后寻找比较好的虚拟主机&#xff0c;发现ubuntuchina上有个卖vps的&#xff0c;价格还行&#xff0c…

LeetCode实战:相同的树

题目英文 Given two binary trees, write a function to check if they are the same or not. Two binary trees are considered the same if they are structurally identical and the nodes have the same value. Example 1: Input: 1 1/ \ / \2 3 …

mysql数据库常用命令

登录&#xff1a; mysql -h 服务器地址 -u 登录名 -P 端口 -p 密码 &#xff08;登录时最好先不输入密码&#xff0c;等下一条提示出来之后再输&#xff0c;这样可以在界面中隐藏密码&#xff09; 退出&#xff1a; quit 或者 exit 注意&#xff1a;登录数据库系统后&#xff0…

Java入门学习注意事项有哪些?

想要学好java技术&#xff0c;做好学习规划路线和注意事项是非常重要的&#xff0c;尤其是零基础学员&#xff0c;Java涉及到的知识点非常多&#xff0c;我们需要制定合理的Java学习路线图&#xff0c;这样会事半功倍&#xff0c;下面小编和大家总结一下Java入门学习注意事项有…

在Hibernate中处理批量更新和批量删除

批量更新是指在一个事务中更新大批量数据&#xff0c;批量删除是指在一个事务中删除大批量数据。以下程序直接通过Hibernate API批量更新CUSTOMERS表中年龄大于零的所有记录的AGE字段&#xff1a; 如果CUSTOMERS表中有1万条年龄大于零的记录&#xff0c;那么Session的find()方法…

LeetCode实战:对称二叉树

题目英文 Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For example, this binary tree [1,2,2,3,4,4,3] is symmetric: 1/ \2 2/ \ / \ 3 4 4 3But the following [1,2,2,null,3,null,3] is not: 1/ \2 2\ \3 …

flannel 概述 - 每天5分钟玩转 Docker 容器技术(58)

2019独角兽企业重金招聘Python工程师标准>>> flannel 是 CoreOS 开发的容器网络解决方案。flannel 为每个 host 分配一个 subnet&#xff0c;容器从此 subnet 中分配 IP&#xff0c;这些 IP 可以在 host 间路由&#xff0c;容器间无需 NAT 和 port mapping 就可以跨…

Python如何实现穷举搜索?

穷举搜索就是在整个搜索空间范围内尝试每一种可能性&#xff0c;直到找到目标值或者整个搜索空间都找完也没有找到目标值。最常见的穷举搜索就是线性搜索&#xff0c;即按照顺序简单检查所有不同的可能性。 例如&#xff1a;2个警察追逐强盗到了一个废弃旅馆的二楼走廊&#xf…

技术图文:如何利用BigOne的API制作自动化交易系统 -- 订单系统

背景 前面几天&#xff0c;我们一起封装了 BigONE 提供的“身份验证”与“资产账户”部分的 API。 如何利用BigOne的API制作自动化交易系统 – 身份验证如何利用BigOne的API制作自动化交易系统 – 获取账户资产 现在&#xff0c;离搭建咱们的自动化交易系统更近一步了。 本…

[解决]eclipse中android自动补全/提示卡机或假死

这是Eclipse3.6版本的特有问题&#xff0c;想彻底解决此问题的话&#xff0c;还是建议换为3.5/3.4&#xff1b; 在保持版本不变的前提下&#xff0c;可以按如下方法优化下&#xff1a; 解决办法&#xff1a;1. 找到你的JDK安装目录下的src.zip文件&#xff1b;2. 打开eclipse: …

17.SpringMVC核心技术-拦截器

SpringMVC 中的 Interceptor 拦截器是非常重要和相当有用的&#xff0c;它的主要作用是拦截指定 的用户请求&#xff0c; 并进行相应的预处理与后处理。其拦截的时间点在“处理器映射器根据用户提 交的请求映射出了所要执行的处理器类&#xff0c; 并且也找到了要执行该处理器类…

Python培训讲解二叉树的三种深度

python代码实现了二叉树&#xff0c;这次将会实现二叉树的几种遍历方法&#xff0c;来更好的解析二叉树的结构特点。分别是一种广度遍历&#xff0c;和三种深度遍历方法&#xff1a;先序遍历&#xff0c;中序遍历&#xff0c;后序遍历。下面是代码实现&#xff1a; 1、先序遍历…