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

本文涉及的产品
模型训练 PAI-DLC,5000CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,5000CU*H 3个月
简介: 深入理解机器学习并完全看懂sklearn文档,需要较深厚的理论基础。但是,要将sklearn应用于实际的项目中,只需要对机器学习理论有一个基本的掌握,就可以直接调用其API来完成各种机器学习问题。本文选自《全栈数据之门》,将向你介绍通过三个步骤来解决具体的机器学习问题。

引言:深入理解机器学习并完全看懂sklearn文档,需要较深厚的理论基础。但是,要将sklearn应用于实际的项目中,只需要对机器学习理论有一个基本的掌握,就可以直接调用其API来完成各种机器学习问题。
本文选自《全栈数据之门》,将向你介绍通过三个步骤来解决具体的机器学习问题。

sklearn介绍

  scikit-learn是Python语言开发的机器学习库,一般简称为sklearn,目前算是通用机器学习算法库中实现得比较完善的库了。其完善之处不仅在于实现的算法多,还包括大量详尽的文档和示例。其文档写得通俗易懂,完全可以当成机器学习的教程来学习。
  如果要说sklearn文档的重要性,个人觉得,应该可以与佛经中的《金刚经》相比。如果能将其当成《金刚经》一样来阅读,你的机器学习水平一定会有质的提升。
  一般初阅佛经,肯定会被其中的一些名词弄糊涂,就像初次阅读sklearn的文档一样,会被诸如training data、testing data、model select、cross validation等这样的词汇弄糊涂。但实际上,只要肯用心读,把这些基础概念弄明白,后续学习就比较容易了。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接口,保存与加载模型都非常简单:

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

相关实践学习
机器学习算法(一): 基于逻辑回归的分类预测
基于逻辑回归的分类预测。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
相关文章
|
14小时前
|
前端开发 JavaScript 网络协议
深入理解Python Web开发中的前后端分离与WebSocket实时通信技术
【7月更文挑战第18天】前后端分离采用Flask/Django框架,前端JavaScript框架如Vue.js与后端通过AJAX/Fetch通信。WebSocket提供实时双向通信,Python可借助websockets库或Flask-SocketIO实现。最佳实践包括定义清晰的接口规范,确保安全性(HTTPS,认证授权),优化性能,和健壮的错误处理。结合两者,打造高效实时应用。
13 1
|
2天前
|
机器学习/深度学习 数据采集 前端开发
网络爬虫开发:JavaScript与Python特性的小差异
我们以前写JavaScript的代码时,在遇到了发送请求时,都是需要去await的。 但是为什么Python代码不需要这样做呢? 这就是因为JavaScript是异步的,Python是同步的。 JavaScript就需要使用关键词await将异步代码块变为同步代码。
|
2天前
|
JavaScript 前端开发 UED
WebSocket在Python Web开发中的革新应用:解锁实时通信的新可能
【7月更文挑战第16天】WebSocket是实现Web实时通信的协议,与HTTP不同,它提供持久双向连接,允许服务器主动推送数据。Python有多种库如websockets和Flask-SocketIO支持WebSocket开发。使用Flask-SocketIO的简单示例包括定义路由、监听消息事件,并在HTML中用JavaScript建立连接。WebSocket提高了实时性、减少了服务器压力,广泛应用于聊天、游戏等场景。
11 1
|
4天前
|
XML 前端开发 API
颠覆传统!AJAX、Fetch API与Python后端,开启Web开发新篇章!
【7月更文挑战第14天】Web开发中,AJAX作为异步通信先驱,与新兴的Fetch API一起革新交互体验。Fetch基于Promise,简化了请求处理。Python后端,如Flask,提供稳定支撑。这三者的融合,推动Web应用达到新高度,实现高效、实时交互。通过示例展示,我们看到从发送请求到更新UI的流畅过程,以及Python如何轻松返回JSON数据。这种组合揭示了现代Web开发的潜力和魅力。
11 0
爆赞!GitHub首本Python开发实战背记手册,标星果然百万名不虚传
Python (发音:[ 'paiθ(ə) n; (US) 'paiθɔn ] n. 蟒蛇,巨蛇 ),是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。 Python 语言的特点:
|
9天前
|
机器学习/深度学习 监控 算法
Python数据分析与机器学习在金融风控中的应用
Python数据分析与机器学习在金融风控中的应用
37 12
|
10天前
|
机器学习/深度学习 算法 Python
【Python】已完美解决:机器学习填补数值型缺失值时报错)TypeError: init() got an unexpected keyword argument ‘axis’,
【Python】已完美解决:机器学习填补数值型缺失值时报错)TypeError: init() got an unexpected keyword argument ‘axis’,
13 1
|
10天前
|
机器学习/深度学习 数据采集 搜索推荐
Python数据分析与机器学习在电子商务推荐系统中的应用
Python数据分析与机器学习在电子商务推荐系统中的应用
28 5
|
13天前
|
机器学习/深度学习 数据可视化 搜索推荐
Python在社交媒体分析中扮演关键角色,借助Pandas、NumPy、Matplotlib等工具处理、可视化数据及进行机器学习。
【7月更文挑战第5天】Python在社交媒体分析中扮演关键角色,借助Pandas、NumPy、Matplotlib等工具处理、可视化数据及进行机器学习。流程包括数据获取、预处理、探索、模型选择、评估与优化,以及结果可视化。示例展示了用户行为、话题趋势和用户画像分析。Python的丰富生态使得社交媒体洞察变得高效。通过学习和实践,可以提升社交媒体分析能力。
28 1
|
13天前
|
机器学习/深度学习 算法 文件存储
使用Python实现深度学习模型:神经架构搜索与自动机器学习
【7月更文挑战第5天】 使用Python实现深度学习模型:神经架构搜索与自动机器学习
29 2