机器学习折腾记2:数据集、分类以及特征工程

如果我们从整个人生的视角来看,人生就是一个不断选择再选择的过程,在这个过程中,会发生某些我们期待或者并不期待的改变,但不论如何选择,某些深刻的经历和体验会被永久地保留下来,成为我们人生中无法改变的印痕。(《精进:如何成为一个很厉害的人》)

到现在,其实我都没有介绍Numpy和SciPy,甚至连Scikit-learn的影子都没看见,别急,好的切入点通常都不是从基础开始的,但是基础又会在应用的时候很关键,看上去很矛盾,但想明白后,你会发现其实不矛盾。

借用DL4J社区的一段话,就是机器学习需要处理的数据有许多种不同的来源和类型,例如日志文件、文本文档、表格数据、图像、视频等。机器学习数据加工的目标是将各类数据转换为一系列存放于多维数组(Multi-Dimensional Array)中的值。而数据可能还需要进行各种预处理,包括转换、缩放、标准化、变换、合并、划分为定型与测试数据集、随机排序等。

我们继续看看核心三步骤,并试着展开——

1、读取数据——数据来源有那些?有什么类型的数据?数据是否开放的还是加密的?如何读取大量数据?…
2、预处理数据——原始数据能否直接使用?什么样的数据格式更适合机器学习?大家常说的“向量化”又是什么?…
3、选择正确的模型和学习算法——什么才是好的算法?如何优化模型?对硬件的要求有那些?…

当然,只要你愿意,问题还可以继续提下去。

数据集

先说数据集,实际上,机器学习领域最难解决的问题之一和机器学习本身没有什么关系:这个问题就是如何获取格式恰当的合适数据。

如果没有数据,机器就不知道要学什么,就像我们面对空白的一本书一样,并不知道要学习什么。

而不同领域的数据集,需要大量的专业知识去判断,因为这暗含着我们要让机器关注什么,比如,是识别号牌,还是识别不同的花的种类,还是听懂一段音乐等等。

我们实战的数据集是——Iris数据集(Iris dateset, 也称鸢尾花卉数据集),是源自20世纪30年代的经典数据集。

可视化

这里会提到一个概念,叫分类,一般来说,我们会把数据中所有的测量结果都叫做特征 。而特征是某个事物的属性集合,比如,书中提到的花萼长度,花萼宽度,花瓣长度,花瓣宽度。

扫描二维码关注公众号,回复: 39610 查看本文章

实际上,可能还有别的什么特征,但是对于分类来说,可能这个特征已经能够足够区分了。这就是分类试图解决的问题;对于给定的带有类别标签(特征)的样本,我们要设计出一种规则,然后通过这种规则,最终实现对其他样本(比如,手机重新拍了一个鸢尾花的图片)的预测。这跟垃圾邮件分类问题是一样的;根据用户标出的垃圾邮件和非垃圾邮件样本,我们能否判定一个新来的信息是否是垃圾邮件?

书里提到先把数据集用可视化的办法标识出来,我认为,数据集小的时候是可以的,但海量的数据,可能并不是适合先可视化,因为这个过程本身就需要花费大量的时间。

数据分析

读到这里,我建议你不要陷入书中的代码实现里,短暂的跳出来思考一个问题:如何获取格式恰当的合适数据?

前面我们说过,数据有千万种,要是再乘以不同领域维度,数据量是成指数爆炸增长的。现在我们都喜欢随口说大数据,但是海量的大数据如果不经过数据分析和处理,其实只不过是一堆信息的堆积而已,不仅人无法识别,机器也无法识别。

所以说,数据分析和处理,是非常重要的,不过现在也有反对观点认为,机器一味模仿人并不是最佳的机器学习方法,像AlphaGo的兄弟AlphaGo Zero,在没有学习人类棋谱的情况下打败了AlphaGo,基于统计式的经验学习是否真的可行?现在还在探索中。

但是当前的现状里,我们的确需要还需要继续重视数据分析和处理。

构建一个最简单的分类器

话说回来,按照作者的思路,我们已经能够构建一个简单的分类器,并能训练出来一个模型实现分类预测了,如下代码:

from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
data = load_iris()
features = data['data']
feature_names = data['feature_names']
species = data['target_names'][data['target']]

setosa = (species == 'setosa')
features = features[~setosa]
species = species[~setosa]
virginica = species == 'virginica'

t = 1.75
p0,p1 = 3,2

if COLOUR_FIGURE:
    area1c = (1.,.8,.8)
    area2c = (.8,.8,1.)
else:
    area1c = (1.,1,1)
    area2c = (.7,.7,.7)

x0,x1 =[features[:,p0].min()*.9,features[:,p0].max()*1.1]
y0,y1 =[features[:,p1].min()*.9,features[:,p1].max()*1.1]

plt.fill_between([t,x1],[y0,y0],[y1,y1],color=area2c)
plt.fill_between([x0,t],[y0,y0],[y1,y1],color=area1c)
plt.plot([t,t],[y0,y1],'k--',lw=2)
plt.plot([t-.1,t-.1],[y0,y1],'k:',lw=2)
plt.scatter(features[virginica,p0], features[virginica,p1], c='b', marker='o')
plt.scatter(features[~virginica,p0], features[~virginica,p1], c='r', marker='x')
plt.ylim(y0,y1)
plt.xlim(x0,x1)
plt.xlabel(feature_names[p0])
plt.ylabel(feature_names[p1])
# plt.savefig('../1400_02_02.png')
plt.grid()
plt.show()

一个简单的分类示意图

我猜想,同时你可能被里面的各种参数设置给绕晕了,然后对作者提出的各种概念感到疑惑。这就是基础还不够好的表现,可能你已经开始泄气,而这时,我要鼓励你继续看下去,基础知识后面再补。

如果你是做了很长时间的数据分析和数据挖掘的工作,就会觉得学习机器学习,是一件很容易上手的事,难点可能只是在不同算法的优化和实施上。

而对于从零开始的人,这恰恰可能是最要命的事,对于机器学习的热情一下被现实的冷水泼醒了,然后如同又回到了原点一样。

分类

一个分类模型是由什么组成的?书中把它分成三部分——

1、模型结构 ——在这里我们采用一个阈值在一个特征上进行划分。
2、搜索过程 ——在这里我们尽可能多的尝试所有特征和阈值的组合。
3、损失函数 ——我们通过损失函数来确定哪些可能性不会太差(因为我们不会去讨论完美的解决方案)。我们可以用训练误差或者其他方式定义这一点,比如我们想要最高的正确率。一般来说,人们希望损失函数最小化。

分类的目标是什么?简单说,就是区分一个物体是什么不是什么,对于人来说很容易做到,但是对于机器来说就非常不容易。

这里作者提到一个很重要的概念叫特征工程,顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征,并提供给学习算法构建模型使用。

这里要补充一点,其实分类数据是经过人工标记过的数据,预处理是把它变成机器能学习的向量,让后机器才能开始学习,用这样的数据来进行分类学习的算法也叫监督学习。

又出现一个概念——向量,英文叫vector,是线性代数的的概念,一个向量本质就是一列数,也是机器学习的基础数据表示形式。

作者在数据集这一章,还讲了K means近邻分类算法和二分类算法,这里就不介绍了,后续会在单独遇见时再实战。

小结

现在来总结一下今天的内容,我们说到数据集、可视化、分类算法、监督学习、向量、特征工程。通过一个简单的分类示例,理清了核心步骤的前两步——读取数据和预处理数据。而实际上我们远远没有入门机器学习,学习机器学习如果完全从实战角度讲,最后很容易变成对工具的熟练讲解,而不明白背后的本质,,然后本地运行起来几个图形自娱自乐,或者一味的讲算法解析,让想要入门的人望而生畏,而在真正的实际应用中,会遇见的困难远远不是知道几个算法这么简单,反而可能是基础更重要,思维方式更重要。

参考资源

1、《机器学习系统设计》
2、《数据挖掘与数据化运营实战》
3、《Python数据分析基础教程:NumPy学习指南(第2版)》
4、数据集与机器学习介绍:https://deeplearning4j.org/cn/data-sets-ml

猜你喜欢

转载自blog.csdn.net/mickjoust/article/details/80020086