[Scikit-learn教程] 01 快速入门

3,223

欢迎访问集智主站:集智,通向智能时代的引擎


注意!

本文所有代码均可在集智原贴中运行调试(无需安装环境),请点击这里前往原贴



scikit-learn(简称sklearn)是目前最受欢迎,也是功能最强大的一个用于机器学习的Python库件。它广泛地支持各种分类、聚类以及回归分析方法比如支持向量机、随机森林、DBSCAN等等,由于其强大的功能、优异的拓展性以及易用性,目前受到了很多数据科学从业者的欢迎,也是业界相当著名的一个开源项目之一。

得益于其强大的功能以及方便快捷的使用特性,sklearn可以说是目前学习数据科学所必须了解的一个重要内容,接下来我们将在一系列的课程以及实践过程中,快速掌握sklearn的常用使用方法。

  • 注意,本课程中的所有示例程序将可以直接在网页中运行,你甚至可以自行修改某些示例程序,而无需打开你的IDE重新编写代码。

关于机器学习

机器学习是目前数据科学中非常重要的一项内容。一般来讲,机器学习是指让计算机程序分析和学习一系列样本数据的特征来预测未知数据的属性内容,比如通过算法分析大量猫咪照片的信息,就可以让计算机以极高的准确率识别出一张图片中是否存在猫咪,如下图。

按照学习方式的不同,机器学习可以分为有监督学习和无监督学习两种。sklearn包涵了大量与机器学习相关的功能函数,我们将在下面介绍一个使用sklearn进行机器学习的简单例子——数字码点阵图识别。这是一个初级的图像内容识别问题,是有监督学习的一个代表,其本质是通过分析已知分类图片的构成信息来对未知分类图片进行分类,我们将通过这个例子,来简单介绍机器学习的一般流程和一些实现细节。

sklearn的安装

首先我们需要安装sklearn这个库(由于您可以在我们的网页上进行所有的实验,所以您可以在之后再尝试在您的电脑上安装sklearn)。sklearn是Python的扩展库,因此我们必须首先设置好Python运行环境。同时,由于sklearn基于Numpy和Scipy这两个库,我们也要首先安装好它们。然后,我们便可以使用pipconda来自动安装sklearn,具体方法如下:

# 安装sklearn之前必须先安装较新版本的Scipy与Numpy
# 使用pip安装sklearn:
pip install -U scikit-learn
# 使用conda安装sklearn:
conda install scikit-learn

安装好sklearn之后,我们便可以在Python脚本中使用来自sklearn中的各种数据、功能函数等等。

使用sklearn处理数据

数据是机器学习的关键,在机器学习工作中我们需要花费大量的时间来采集和整理数据,合理且科学的数据是得到良好机器学习效果的关键。一般而言,一个分类问题的机器学习过程需要用到四块数据内容,分别是:

  • 训练数据,一般用train来表示
  • 训练数据的分类属性,一般用target来表示
  • 测试数据,一般用test来表示
  • 测试数据的真实分类属性,用于评估分类器性能,一般用expected来表示

为了方便学习和测试机器学习中的各种内容,sklearn内置了各种有用的数据集,文本处理、图像识别等具有代表性的问题的数据在sklearn中均有收集。本文中所介绍的数字码点阵图的数据集同样可以在sklearn中的datasets模块中找到,以下是数据读取示例。

from sklearn import datasets

# 以下程序将输出sklearn库中内置的一个用于记录数字码点阵图的训练数据集及其分类
# 请点击运行按钮查看内部数据

digits = datasets.load_digits()
print(digits.data)
print(digits.target)

上述程序结果中的第一组数据实际上是一组8x8的数字码点阵图的数据,每幅点阵图被记录为一个64个元素的数组,数组元素的值代表8x8点阵中点阵的颜色深度。我们将在在下一节使用matplotlib的绘图功能来绘制这些数组所代表的真实图片。

使用matplotlib绘图

机器学习项目中往往需要处理很多与图形识别相关的问题,而且我们经常需要以图片的方式来呈现机器学习工具的计算结果,这时候就要用到Python中一个常见的绘图库——matplotlib,它能够很方便地用来绘制各种图形,如下述程序展示了使用matplotlib绘制上一节所展示数据的真实图片的例子。

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn import datasets

digits = datasets.load_digits()

# 下面我们将输出四张数字码(0、1、2、3)的8x8点阵图,
# 点阵图的数据从datasets读取并存储在digits中,
# 我们可以通过matplotlib所提供的方法显示这些点阵图,
# 请点击运行按钮查看效果。

images_and_labels = list(zip(digits.images, digits.target))
for index, (image, label) in enumerate(images_and_labels[:4]):
    plt.subplot(2, 4, index + 1)
    plt.axis('off')
    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
    plt.title('Training: %i' % label)

我们可以看到,程序绘制出了四幅数字码点阵图,图片中不同的点拥有不尽相同的颜色深度。上一节中所展示的原始数据实际上就是记录了这些点的颜色深度,而我们将使用表示颜色深度的这些数据完成具体的机器学习的工作内容。

选择分类器并进行设置、训练和预测

拥有了训练数据之后,我们就可以开始构建一个分类器(classifier,或称之为分类模型)来进行机器学习过程。所谓分类器,就是指基于某种统计学习算法的一个函数。首先,我们需要从若干种统计学习算法中选择一种方法,如支持向量机(SVM)、决策树、随机森林等等。然后调用sklearn的相关函数并设置合理的参数来使用这些方法,并使用训练数据对分类器进行训练。下述的程序展示了一个简单的基于SVM的分类器构建和训练过程。

from sklearn import datasets, svm
# 读取数据
digits = datasets.load_digits()
# 建立SVM分类器
clf = svm.SVC(gamma=0.001, C=100.)
# 使用训练数据对分类器进行训练,它将会返回分类器的某些参数设置
clf.fit(digits.data[:-1], digits.target[:-1])

分类器在建立时需要设置某些参数,以适应不同场合的需要同时避免出现过拟合现象。不同参数有着不同的意义,对计算结果的影响也不尽相同,我们将在之后的课程中详细讨论各种机器学习方法中参数的意义。

sklearn的训练过程使用clf.fit(train, target)这样一个方法,通过这个方法,我们可以使用训练数据和训练数据的分类属性来对分类器进行训练,从而得到一个可用于预测的分类模型。注意这个训练得到的分类模型是可以导出了——也就是说我们可以直接使用一个已经得到的效果良好的分类器进行预测工作。

训练结束之后,我们便可使用已经得到的分类器对未知数据进行分类预测。以下程序展示了使用分类器预测未知数据分类的一个过程。你可以自行修改未知数据(即test数组)的内容,来查看我们所训练的分类器的效果。

%matplotlib inline
from sklearn import datasets, svm
import matplotlib.pyplot as plt
import numpy as np
digits = datasets.load_digits()
plt.axis('off')
clf = svm.SVC(gamma=0.001, C=100.)
clf.fit(digits.data[:-1], digits.target[:-1])
def showresult(test) :
    plt.imshow((np.asarray(test)).reshape((8,8)), cmap=plt.cm.gray_r, interpolation='nearest')
# 用于计算的部分代码已被隐藏,以下是用于预测的未知数据
# 你可以改变这个数据中的数字,但必须保证数组元素个数为64,否则将会出错
test = [0, 0, 10, 14, 8, 1, 0, 0,
        0, 2, 16, 14, 6, 1, 0, 0,
        0, 0, 15, 15, 8, 15, 0, 0,
        0, 0, 5, 16, 16, 10, 0, 0,
        0, 0, 12, 15, 15, 12, 0, 0,
        0, 4, 16, 6, 4, 16, 6, 0,
        0, 8, 16, 10, 8, 16, 8, 0,
        0, 1, 8, 12, 14, 12, 1, 0]
print("对图片的预测结果为:")
print(clf.predict(np.asarray(test)))

# 下面这个函数将自动完成绘图任务
showresult(test)

通过上述程序将可以发现,即使对于很模糊的图片,我们的分类器也可以给出比较准确的预测结果。事实上,使用机器学习得到的分类器的性能是相当优异的,不仅速度很快,其分类准确率在某些情况下甚至会超过人类。下一节我们将具体讨论评价分类器性能的一些方法。

查看和评估分类效果

为了观察分类器的性能,我们通常会在分类器构建完毕之后使用测试数据集对分类器进行测试评估,其具体过程为,从训练数据中选取一部分或是直接选择新的数据作为测试数据,将这些测试数据输入分类器进行分类预测,然后将得到的分类结果与真实的分类结果相比对,来评估分类器的性能。这里使用了几个评估参数来表示预测结果的准确度,它们分别是准确率(precision)、召回率(recall)和F值(f1-score),准确率和召回率的详细介绍请参见它们的维基百科页面进行了解。一般来讲,F值综合了准确率和召回率的优势,具有较好的说服力。你可以尝试修改下属程序中分类器构建时所选择的参数,以此来观察评估结果的变化。

from sklearn import datasets, svm, metrics

digits = datasets.load_digits()
# 以下是分类器构建过程,你可以尝试修改分类器参数的数值
clf = svm.SVC(gamma=0.001, C=100.)
# 选取数据集中前500条数据作为训练数据
clf.fit(digits.data[:500], digits.target[:500])

# 选取数据集中后1000条数据作为测试数据
expected = digits.target[800:]
predicted = clf.predict(digits.data[800:])
print("分类器预测结果评估:\n%s\n"
      % (metrics.classification_report(expected, predicted)))

以上就是一个完整的使用sklearn进行机器学习的过程。一般而言,一个完整的机器学习工作也都需要包括获取并处理数据、分类器构建、分类器训练与评估、数据可视化等多方面工作。我们可以通过以下这个小测试来进一步加深对于机器学习过程的理解.

小测试

请根据以上课程内容,自行完成下面的机器学习任务,要求使用SVM分类器并自行调整参数,采用程序中已经给出的数据进行分类器训练,然后对测试数据进行预测。程序将自动评估分类器的性能并给出评估结果。

注意!

本文所有代码均可在集智原贴中运行调试(无需安装环境),请点击这里前往原贴

from sklearn import svm, metrics
import numpy as np

train = np.asarray([[1,2,3,4,5],
[4,4,0,5,6],
[4,8,7,7,8],
[5,0,2,3,0],
[8,7,6,5,2],
[3,0,3,8,4],
[5,7,8,3,6],
[9,2,0,6,3],
[6,4,1,8,6],
[3,2,3,2,8]])

target = np.asarray([1,0,1,0,0,0,1,0,0,1])

test = np.asarray([[3,4,6,5,2],
[4,1,9,3,4],
[6,2,4,8,7],
[4,8,6,5,7],
[3,8,2,2,4],
[4,6,5,9,7],
[3,4,0,7,2],
[5,9,4,5,4],
[4,2,7,3,6],
[3,9,0,1,2]])

expected = np.asarray([0,1,1,1,0,0,0,0,1,0])
predicted = np.asarray([0])
# 请完成一个基于SVM方法的分类器的构建、训练和预测工作
# 程序中已预先导入sklearn.svm库,无需再次导入
# 训练数据train、训练数据分类target、测试数据test也已存在,可直接使用
# 要求使用数组train和target对分类器进行训练,然后使用数组test进行预测
# 预测结果请记录为predicted,程序将自动进行评测

# ========= 代码 起 =========



# ========= 代码 止 =========
clf = svm.SVC(gamma=0.001, C=100.)
clf.fit(train, target)
predicted = clf.predict(test)[/amalthea_solution]
[amalthea_sct sct-method="0"]
print("分类器预测结果评估:\n%s\n"
      % (metrics.classification_report(expected, predicted)))
predicted.shape == (10,)[/amalthea_sct]
[amalthea_hint]
需要完成三个步骤:
1.构建svm分类器,添加部分参数
2.使用训练数据和训练数据的分类属性对分类器进行训练,考虑使用.fit()方法
3.使用测试数据进行预测工作,考虑使用.predict()方法

(本篇课程内容来自于An introduction to machine learning with scikit-learn,转载请注明来源。)



推荐阅读

“女生科技体验节” TensorFlow Workshop

这评论有毒!——文本分类的一般套路

我做了一个叫“瑟曦”的机器人,可是她动不动就想让格雷果爵士弄死我。