机器学习入门之sklearn:Python语言开发的通用机器学习库
小标 2019-01-22 来源 : 阅读 790 评论 0

摘要:本文主要向大家介绍了机器学习入门之sklearn:Python语言开发的通用机器学习库,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。

本文主要向大家介绍了机器学习入门之sklearn:Python语言开发的通用机器学习库,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。

深入理解机器学习并完全看懂sklearn文档,需要较深厚的理论基础。但是,要将sklearn应用于实际的项目中,只需要对机器学习理论有一个基本的掌握,就可以直接调用其API来完成各种机器学习问题。

本文选自《全栈数据之门》。


sklearn介绍


scikit-learn是Python语言开发的机器学习库,一般简称为sklearn,目前算是通用机器学习算法库中实现得比较完善的库了。其完善之处不仅在于实现的算法多,还包括大量详尽的文档和示例。其文档写得通俗易懂,完全可以当成机器学习的教程来学习。

如果要说sklearn文档的重要性,个人觉得,应该可以与佛经中的《金刚经》相比。如果能将其当成《金刚经》一样来阅读,你的机器学习水平一定会有质的提升。

一般初阅佛经,肯定会被其中的一些名词弄糊涂,就像初次阅读sklearn的文档一样,会被诸如training data、testing data、model select、cross validation等这样的词汇弄糊涂。但实际上,只要肯用心读,把这些基础概念弄明白,后续学习就比较容易了。sklearn必须要结合机器学习的一些基础理论来理解,就像佛经必须要结合一些佛法基础理论来理解一样。

既然是通用的机器学习库,sklearn中包含了大量常用的算法。正如其介绍一样,基本功能主要分为6个部分:分类、回归、聚类、数据降维、模型选择与数据预处理,如下图所示。











要深入理解机器学习,并且完全看懂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。

其执行结果如下图所示。











建模与预测


准备好数据后,就可以从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模型,会输出其用于构建的参数,也可以打印出预测的前三个值,如下图所示。











在上面的建模与预测过程中,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的评估,其结果如下图所示。











模型持久化


辛辛苦苦训练好一个模型后,总希望后面可以直接使用,此时就必须要对模型进行持久化操作了。模型本身就是一个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入门机器学习是最好的途径,尽管你以前完全没有接触过机器学习。

我所理解的,学习机器学习算法的三个层次如下所述。



调用:知道算法的基本思想,能应用现有的库来做测试。简单说,就是了解kNN是做什么的,会调用sklearn中的kNN算法。


调参:知道算法的主要影响参数,能进行参数调节优化。


嚼透:理解算法的实现细节,并且能用代码实现出来。



上面三个层次是不是很押韵呢,但不幸的是,有的人一上来就想达到第三个层次,于是刚开始就被如何实现kNN算法吓到了,过不了三天就从入门到放弃了。

作为应用型的机器学习,能达到第三阶段固然好,但在实际应用中,建议能调用现有的库就直接调用好了。不理解的地方,能看懂源码最好。不太建议自己从头实现,除非能力确实够了,否则写出来的代码并不能保证性能与准确性。

当然,从另外一个角度来说,尤其是在分布式环境下,机器学习还有另外三个层次,想知道的话,请见《全栈数据之门》一书。


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标人工智能机器学习频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程