sklearn:Python语言开发的通用机器学习库-程序员宅基地

技术标签: 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表示就可以。


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

%pyspark

from 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分类算法了,其代码例如以下所看到的:

%pyspark

from 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中提供的很多其它的评价指标来评估模型。其代码例如以下所看到的:

%pyspark

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

转载于:https://www.cnblogs.com/claireyuancy/p/7400999.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30737363/article/details/99207183

智能推荐

hdu 1229 还是A+B(水)-程序员宅基地

文章浏览阅读122次。还是A+BTime Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24568Accepted Submission(s): 11729Problem Description读入两个小于10000的正整数A和B,计算A+B。...

http客户端Feign——日志配置_feign 日志设置-程序员宅基地

文章浏览阅读419次。HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息。FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。BASIC:仅记录请求的方法,URL以及响应状态码和执行时间。NONE:不记录任何日志信息,这是默认值。配置Feign日志有两种方式;方式二:java代码实现。注解中声明则代表某服务。方式一:配置文件方式。_feign 日志设置

[转载]将容器管理的持久性 Bean 用于面向服务的体系结构-程序员宅基地

文章浏览阅读155次。将容器管理的持久性 Bean 用于面向服务的体系结构本文将介绍如何使用 IBM WebSphere Process Server 对容器管理的持久性 (CMP) Bean的连接和持久性逻辑加以控制,使其可以存储在非关系数据库..._javax.ejb.objectnotfoundexception: no such entity!

基础java练习题(递归)_java 递归例题-程序员宅基地

文章浏览阅读1.5k次。基础java练习题一、递归实现跳台阶从第一级跳到第n级,有多少种跳法一次可跳一级,也可跳两级。还能跳三级import java.math.BigDecimal;import java.util.Scanner;public class Main{ public static void main(String[]args){ Scanner reader=new Scanner(System.in); while(reader.hasNext()){ _java 递归例题

面向对象程序设计(荣誉)实验一 String_对存储在string数组内的所有以字符‘a’开始并以字符‘e’结尾的单词做加密处理。-程序员宅基地

文章浏览阅读1.5k次,点赞6次,收藏6次。目录1.串应用- 计算一个串的最长的真前后缀题目描述输入输出样例输入样例输出题解2.字符串替换(string)题目描述输入输出样例输入样例输出题解3.可重叠子串 (Ver. I)题目描述输入输出样例输入样例输出题解4.字符串操作(string)题目描述输入输出样例输入样例输出题解1.串应用- 计算一个串的最长的真前后缀题目描述给定一个串,如ABCDAB,则ABCDAB的真前缀有:{ A, AB,ABC, ABCD, ABCDA }ABCDAB的真后缀有:{ B, AB,DAB, CDAB, BCDAB_对存储在string数组内的所有以字符‘a’开始并以字符‘e’结尾的单词做加密处理。

算法设计与问题求解/西安交通大学本科课程MOOC/C_算法设计与问题求解西安交通大学-程序员宅基地

文章浏览阅读68次。西安交通大学/算法设计与问题求解/树与二叉树/MOOC_算法设计与问题求解西安交通大学

随便推点

[Vue warn]: Computed property “totalPrice“ was assigned to but it has no setter._computed property "totalprice" was assigned to but-程序员宅基地

文章浏览阅读1.6k次。问题:在Vue项目中出现如下错误提示:[Vue warn]: Computed property "totalPrice" was assigned to but it has no setter. (found in <Anonymous>)代码:<input v-model="totalPrice"/>原因:v-model命令,因Vue 的双向数据绑定原理 , 会自动操作 totalPrice, 对其进行set 操作而 totalPrice 作为计..._computed property "totalprice" was assigned to but it has no setter.

basic1003-我要通过!13行搞定:也许是全网最奇葩解法_basic 1003 case 1-程序员宅基地

文章浏览阅读60次。十分暴力而简洁的解决方式:读取P和T的位置并自动生成唯一正确答案,将题给测点与之对比,不一样就给我爬!_basic 1003 case 1

服务器浏览war文件,详解将Web项目War包部署到Tomcat服务器基本步骤-程序员宅基地

文章浏览阅读422次。原标题:详解将Web项目War包部署到Tomcat服务器基本步骤详解将Web项目War包部署到Tomcat服务器基本步骤1 War包War包一般是在进行Web开发时,通常是一个网站Project下的所有源码的集合,里面包含前台HTML/CSS/JS的代码,也包含Java的代码。当开发人员在自己的开发机器上调试所有代码并通过后,为了交给测试人员测试和未来进行产品发布,都需要将开发人员的源码打包成Wa..._/opt/bosssoft/war/medical-web.war/web-inf/web.xml of module medical-web.war.

python组成三位无重复数字_python组合无重复三位数的实例-程序员宅基地

文章浏览阅读3k次,点赞3次,收藏13次。# -*- coding: utf-8 -*-# 简述:这里有四个数字,分别是:1、2、3、4#提问:能组成多少个互不相同且无重复数字的三位数?各是多少?def f(n):list=[]count=0for i in range(1,n+1):for j in range(1, n+1):for k in range(1, n+1):if i!=j and j!=k and i!=k:list.a..._python求从0到9任意组合成三位数数字不能重复并输出

ElementUl中的el-table怎样吧0和1改变为男和女_elementui table 性别-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏2次。<el-table-column prop="studentSex" label="性别" :formatter="sex"></el-table-column>然后就在vue的methods中写方法就OK了methods: { sex(row,index){ if(row.studentSex == 1){ return '男'; }else{ return '女'; }..._elementui table 性别

java文件操作之移动文件到指定的目录_java中怎么将pro.txt移动到design_mode_code根目录下-程序员宅基地

文章浏览阅读1.1k次。java文件操作之移动文件到指定的目录_java中怎么将pro.txt移动到design_mode_code根目录下

推荐文章

热门文章

相关标签