爱吧机器人网 » 技术 > 机器学习 > 正文

实战:分类算法实践及如何用好Python工具

核心提示:学好机器学习、深度学习,我们在吃透思想、原理、算法的同时,必须用好python工具,就拿本文说的分类算法,总结来说,python主要需要记住几点

古语有:工欲善其事必先利其器。我们学习机器学习、深度学习,首先就是深悟思想、理解原理、吃透算法,其次就是数学逻辑及推演过程,最后,也是最重要的就是实战,而学习人工智能,我们首选的重要工具就是Python,如何学习Python,这个见仁见智,不同的人有不同的学习路线,主要的有两种,一种是专门学习Python工具,然后再用,一种是将学习Python与各种算法实践、各种应用结合起来,正所谓"在学中用、在用中学",我们推荐后者。

本文以基于mnist数据的分类实践为示例,讲解如何边进行分类实验边学习python:

一、数据准备

1、我们用Python3:

Python 3.6.1 (default, Jun 6 2017, 11:38:19)

[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

2、加载数据集:

1)我们使用scikit-learn库,下面导入sklearn中的数据集,sklearn.datasets模块主要提供了一些导入、在线下载及本地生成数据集的方法,主要有三种形式:load_、fetch_及make_的方法

>>> from sklearn.datasets import fetch_mldata

>>> mnist = fetch_mldata('MNIST original')

>>> mnist

{'DESCR': 'mldata.org dataset: mnist-original', 'COL_NAMES': ['label', 'data'], 'target': array([ 0., 0., 0., ..., 9., 9., 9.]), 'data': array([[0, 0, 0, ..., 0, 0, 0],

[0, 0, 0, ..., 0, 0, 0],

[0, 0, 0, ..., 0, 0, 0],

...,

[0, 0, 0, ..., 0, 0, 0],

[0, 0, 0, ..., 0, 0, 0],

[0, 0, 0, ..., 0, 0, 0]], dtype=uint8)}

>>> X,y=mnist["data"],mnist["target"]

>>> X.shape

(70000, 784)

>>> y.shape

(70000,)

2)sklearn 加载的数据集有着相似的字典结构:

DESCR 键描述数据集;

data 键存放一个数组,数组的一行表示一个样例,一列表示一个特征;

target 键存放一个标签数组;

所以,mnist["data"]是mnist数据中非标签数据矩阵,mnist["target"]是mnist数据中标签数据,单列。

3)shape是numpy中的方法,可获得矩阵的行数、列数,shape[0]得到矩阵的行数。

3、mnist 数据集简介

1) MNIST 有 70000 张图片,每张图片有 784 个特征。每个图片都是 28*28 像素,并且每个像素的值介于 0~255 之间。让我们看一看数据集的某一个数字。只要将某个实例的特征向量, reshape 为 28*28 的数组,然后使用 Matplotlib 的 imshow 函数就可以把图片展示出来。

2) reshape()是数组对象中的方法,用于改变数组的形状,已经展开为784个特征的列向量,再折叠成矩阵。

>>> import matplotlib

>>> import matplotlib.pyplot as plt

>>> some_digit = X[36000]

>>> some_digit_image = some_digit.reshape(28, 28)

>>> plt.imshow(some_digit_image, cmap = matplotlib.cm.binary, interpolation="nearest")



>>> plt.axis("off")

(-0.5, 27.5, 27.5, -0.5)

>>> plt.show()

重磅实战:分类算法实践及如何用好Python工具
二、训练一个二分类器

1、创建训练集、测试集

>>>X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]

>>>y_train_5 = (y_train == 5)

>>>y_test_5 = (y_test == 5)

1)我们把MNIST 数据集已经事先被分成了一个训练集(前 60000 张图片)和一个测试集(最后 10000 张图片)

2)取一个列表前多少个元素用X[:i],到后多少个元素用X[i:]

3)简化一下问题,只尝试去识别一个数字,比如说,数字 5。这个"数字 5 检测器"就是一个二分类器,能够识别两类别,"是 5"和"非 5"。让我们为这个分类任务创建目标向量y_train_5、y_test_5

2、选择随机梯度下降法

1)从sklearn.linear 导入SGDClassifier。分类器参数每次都会变,如果想重现结果,可以固定这个参数

>>>from sklearn.linear_model import SGDClassifier

>>>sgd_clf = SGDClassifier(random_state=42)

>>>sgd_clf.fit(X_train, y_train_5)

2)fit函数的两个参数分别是特征数据矩阵和目标列

3)用predict获得结果

>>> sgd_clf.predict([some_digit])

array([ True], dtype=bool)

3、评估分类器性能

1)使用交叉验证测量准确性,类似于cross_val_score()

,我们实现自己版本的交叉验证

from sklearn.model_selection import StratifiedKFold

from sklearn.base import clone

skfolds = StratifiedKFold(n_splits=3, random_state=42)

for train_index, test_index in skfolds.split(X_train, y_train_5):

clone_clf = clone(sgd_clf)

X_train_folds = X_train[train_index]

y_train_folds = (y_train_5[train_index])

X_test_fold = X_train[test_index]

y_test_fold = (y_train_5[test_index])

clone_clf.fit(X_train_folds, y_train_folds)

y_pred = clone_clf.predict(X_test_fold)

n_correct = sum(y_pred == y_test_fold)

print(n_correct / len(y_pred))

0.9502, 0.96565 and 0.96495

(1) StratifiedKFold 类实现了分层采样,生成的折(fold)包含了各类相应比例的样例。在每一次迭代,上述代码生成分类器的一个克隆版本,在训练折(training folds)的克隆版本上进行训练,在测试折(test folds)上进行预测。然后它计算出被正确预测的数目和输出正确预测的比例。

(2) StratifiedKFold返回的skfolds用split函数分成训练集、测试集

2)使用 cross_val_score() 函数来评估 SGDClassifier 模型。

同时使用 K 折交叉验证,此处让 k=3 。记住:K 折交叉验证意味着把训练集分成 K 折(此处 3 折),然后使用一个模型对其中一折进行预测,对其他折进行训练。

>>> from sklearn.model_selection import cross_val_score

>>> cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring="accuracy")

array([ 0.9502 , 0.96565, 0.96495]

3)混淆矩阵

需要有一系列的预测值,这样才能将预测值与真实值做比较。如果在测试集上做预测,这是在验证模型阶段,现在我们是在模型训练阶段,所以我们使用 cross_val_predict() 函数。

>>>from sklearn.model_selection import cross_val_predict

>>>y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)

就像 cross_val_score() ,cross_val_predict() 也使用 K 折交叉验证。它不是返回一个评估分数,而是返回基于每一个测试折做出的一个预测值。

>>> from sklearn.metrics import confusion_matrix

>>> confusion_matrix(y_train_5, y_train_pred)

array([[53272, 1307],

[ 1077, 4344]])

混淆矩阵中的每一行表示实际, 而每一列表示预测。该矩阵的第一行负样本(非5)中的 53272 张被正确归类(被称为真反例,true negatives), 而其余1307 被错误归类为正样本(是 5) (假正例,false positives)。第二行正样本(是 5)中的 1077被错误地归类(假反例,false negatives),其余 4344 正确分类为正样本 (是 5类)(真正例,true positives)。一个完美的分类器将只有真反例和真正例,所以混淆矩阵的非零值仅在其主对角线。

4)准确率与召回率

Scikit-Learn 提供了一些函数去计算分类器的指标,包括准确率和召回率。

了解一下SGDClassifier 是如何做分类决策的。对于每个样例,它根据

决策函数计算分数,如果这个分数大于一个阈值,它会将样例分配给正例,否则它将分配给反例。

>>> from sklearn.metrics import precision_score, recall_score

>>> precision_score(y_train_5, y_pred)

0.76871350203503808

>>> recall_score(y_train_5, y_train_pred)

0.79136690647482011

需要再次使用 cross_val_predict() 得到每一个样例的分数值,但是这一次指定返回一个决策分数,而不是预测值。

>>> y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3,method="decision_function")

对于任何可能的阈值,使用 precision_recall_curve() ,你都可以计算准确率和召回率,并绘出曲线。

>>> from sklearn.metrics import precision_recall_curve

>>> precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)

def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):

plt.plot(thresholds, precisions[:-1], "b--", label="Precision")

plt.plot(thresholds, recalls[:-1], "g-", label="Recall")

plt.xlabel("Threshold")

plt.legend(loc="upper left")

plt.ylim([0, 1])

plot_precision_recall_vs_threshold(precisions, recalls, thresholds)

plt.show()

重磅实战:分类算法实践及如何用好Python工具
5)ROC曲线

受试者工作特征(ROC)曲线是另一个二分类器常用的工具。它非常类似与准确率/召回率曲线,但不是画出准确率对召回率的曲线,ROC 曲线是真正例率(召回率)对假正例率的曲线。假正率,是反例被错误分成正例

的比率。它等于 1 减去真反例率。

所以 ROC 曲线画出召回率对(1 减特异性)的曲线。

为了画出 ROC 曲线,你首先需要计算各种不同阈值下的 TPR、FPR,使用 roc_curve() 函数:

>>> from sklearn.metrics import roc_curve

>>> fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)

def plot_roc_curve(fpr, tpr, label=None):

plt.plot(fpr, tpr, linewidth=2, label=label)

plt.plot([0, 1], [0, 1], 'k--')

plt.axis([0, 1, 0, 1])

plt.xlabel('False Positive Rate')

plt.ylabel('True Positive Rate')

plot_roc_curve(fpr, tpr)

plt.show()

重磅实战:分类算法实践及如何用好Python工具
后记:

学好机器学习、深度学习,我们在吃透思想、原理、算法的同时,必须用好python工具,就拿本文说的分类算法,总结来说,python主要需要记住几点

  • python列表的使用;
  • sklearn常用模块sklearn.datasets、sklearn.model、sklearn.base、sklearn.linear、sklearn.metrics;
  • sklearn常用方法SGDClassifier 、StratifiedKFold、cross_val_score、cross_val_predict、precision_recall_curve、roc_curve;
  • matplotlib.pyplot模块使用;
  • plot函数使用
各位如有任何问题,欢迎留言或者私信交流。

重磅实战:分类算法实践及如何用好Python工具


上一篇:AutoML:深度学习的学习器
下一篇:打基础之,LeetCode算法题第7日刷,数组分区

本周栏目热点

入门 | 一文介绍机器学习中基本的数学符号

[2018-04-09]  本文介绍了机器学习中的基本数学符号。具体来说有算数符号,包括各种乘法、指数、平方根以及对数;数列和集合符号,包括索引、累加以及集合关系。此外,本文还给出了 5 个当......

[2016-08-19]  在深度学习出现之前,文字所包含的意思是通过人为设计的符号和结构传达给计算机的。本文讨论了深度学习如何用向量来表示语义,如何更灵活地 ...

美海军研究实验室研发新型数据高效的机器学习算法

[2018-12-12]  NRL机器人专家格伦·亨肖表示,在过去10年里机器人的自主能力已经取得显著进步,但机器人仍难以执行特殊的动作,尤其是使用机械臂进行操纵的动作。N...

Real机智:新一代谷歌机器人ATLAS已逆天

[2016-03-04]     自从被谷歌收购后,波士顿动力公司的 机器人技术 发展的也相当迅猛,除了那款 ...

2018年值得关注的10种机器学习工具

[2018-01-03]  2017年是机器学习大放异彩的一年,这归功于众多公司广泛而深入地研究和开发更新颖、更高效的工具和框架。这里介绍,有望在2018年大行其道的10种机器学习的工具和框架。...

精选推荐

2023年服务机器人市场将超过250亿美元
2023年服务机器人市场将超过250亿美元

[2017-09-04]  全球服务机器人市场预计到2023年将达到250亿美元, 并在预测期内登记15% 的复合年增长率。短期中期回收期和投资回报率高 (ROI), 以及在教育和研究、临场感、防御、救援和安......

这些人型机器人是如此真实,你的肉眼几乎无法区分
这些人型机器人是如此真实,你的肉眼几乎无法区分

[2017-09-03]   我们生活在一个区分现实与幻想变得越来越困难的世界。由于机器人技术的进步,创造人工的人类正在逐渐接近完美的最终目标。我们现在看到的机器人不再只是一块发光二极管,......

美国喷气推进实验室的AI驱动无人机挑战人类飞行员
美国喷气推进实验室的AI驱动无人机挑战人类飞行员

[2017-12-08]  随着无人机及其组件越来越小,效率越来越高,功能越来越强大,我们已经看到越来越多的研究开始让无人机自主飞行在半结构化的环境中,而不依赖于外部定位。 宾夕法尼亚大学在......

CES 2018:英特尔推出49量子位芯片争夺量子霸权
CES 2018:英特尔推出49量子位芯片争夺量子霸权

[2018-01-10]  在与Google、IBM的一场关于建立量子计算系统的马拉松比赛中,英特尔通过了一个关键的里程碑。近日,这个科技巨头已经推出了一个49个量子位 ...

麻省理工正研究植物机器人 让植物自主控制机器人
麻省理工正研究植物机器人 让植物自主控制机器人

[2018-12-08]  控制论通常指人类用机器人部件增强自己。我们听说过动物机器人或昆虫机器人,但我们很少听说植物机器人对吧?一个机器人其实是对植物有很大益处的,因为一般植物根本无法移动......

基于生物启发的机器人很容易适应丢失附属器官
基于生物启发的机器人很容易适应丢失附属器官

[2017-12-17]  很多机器人被设计应用在危险环境,如灾难现场。在这些地方,他们的运动系统完全有可能被损坏。那这样会吓跑这些机器人吗?也许不是,如果它们像日本的东北和北海道大学创造的......

7种常见的机器人焊接类型
7种常见的机器人焊接类型

[2017-12-17]  机器人焊接是工业领域最常见的机器人应用之一,近几十年来主要由汽车行业驱动。机器人焊接在完成大批量,重复性的焊接任务时效率最高。...

美国Natilus公司试飞水上无人货机 设计简单成本降低
美国Natilus公司试飞水上无人货机 设计简单成本降低

[2017-12-28]  Natilus创业公司成立于2014年,其梦想是建造大型无人机,以半价提供比船舶快得多国际货运。在十二月份,Natilus计划在旧金山湾测试一个9米翼展的小型原型无人机的水上滑行能力......