本文包含了五个知识点:
一、数据挖掘与机器学习技术简介
什么是数据挖掘?数据挖掘指的是对现有的一些数据进行相应的处理和分析,最终得到数据与数据之间深层次关系的一种技术。例如在对超市货品进行摆放时,牛奶到底是和面包摆放在一起销量更高,还是和其他商品摆在一起销量更高。数据挖掘技术就可以用于解决这类问题。具体来说,超市的货品摆放问题可以划分为关联分析类场景。
在日常生活中,数据挖掘技术应用的非常广泛。例如对于商户而言,常常需要对其客户的等级(svip、vip、普通客户等)进行划分,这时候可以将一部分客户数据作为训练数据,另一部分客户数据作为测试数据。然后将训练数据输入到模型中进行训练,在训练完成后,输入另一部分数据进行测试,最终实现客户等级的自动划分。其他类似的应用例子还有验证码识别、水果品质自动筛选等。
那么机器学习技术又是什么呢?一言以蔽之,凡是让机器通过我们所建立的模型和算法对数据之间的关系或者规则进行学习,最后供我们利用的技术都是机器学习技术。其实机器学习技术是一个交叉的学科,它可以大致分为两类:传统的机器学习技术与深度学习技术,其中深度学习技术包含了神经网络相关技术。在本次课程中,着重讲解的是传统的机器学习技术及各种算法。
由于机器学习技术和数据挖掘技术都是对数据之间的规律进行探索,所以人们通常将两者放在一起提及。而这两种技术在现实生活中也有着非常广阔的应用场景,其中经典的几类应用场景如下图所示:
1、分类:对客户等级进行划分、验证码识别、水果品质自动筛选等
机器学习和数据挖掘技术可以用于解决分类问题,如对客户等级进行划分、验证码识别、水果品质自动筛选等。
以验证码识别为例,现需要设计一种方案,用以识别由0到9的手写体数字组成的验证码。有一种解决思路是,先将一些出现的0到9的手写体数字划分为训练集,然后人工的对这个训练集进行划分,即将各个手写体映射到其对应的数字类别下面,在建立了这些映射关系之后,就可以通过分类算法建立相应的模型。这时候如果出现了一个新的数字手写体,该模型可以对该手写体代表的数字进行预测,即它到底属于哪个数字类别。例如该模型预测某手写体属于数字1的这个类别,就可以将该手写体自动识别为数字1。所以验证码识别问题实质上就是一个分类问题。
水果品质的自动筛选问题也是一个分类问题。水果的大小、颜色等特征也可以映射到对应的甜度类别下面,例如1这个类别可以代表甜,0这个类别代表不甜。在获得一些训练集的数据之后,同样可以通过分类算法建立模型,这时候如果出现一个新的水果,就可以通过它的大小、颜色等特征来自动的判断它到底是甜的还是不甜的。这样就实现了水果品质的自动筛选。
2、回归:对连续型数据进行预测、趋势预测等
除了分类之外,数据挖掘技术和机器学习技术还有一个非常经典的场景——回归。在前文提到的分类的场景,其类别的数量都有一定的限制。比如数字验证码识别场景中,包含了0到9的数字类别;再比如字母验证码识别场景中,包含了a到z的有限的类别。无论是数字类别还是字母类别,其类别数量都是有限的。
现在假设存在一些数据,在对其进行映射后,最好的结果没有落在某个0、1或者2的点上,而是连续的落在1.2、1.3、1.4...上面。而分类算法就无法解决这类问题,这时候就可以采用回归分析算法进行解决。在实际的应用中,回归分析算法可以实现对连续型数据进行预测和趋势预测等。
3、聚类:客户价值预测、商圈预测等
什么是聚类?在上文中提过,要想解决分类问题,必须要有历史数据(即人为建立的正确的训练数据)。倘若没有历史数据,而需要直接将某对象的特征划分到其对应的类别,分类算法和回归算法无法解决这个问题。这种时候有一种解决办法——聚类,聚类方法直接根据对象特征划分出对应的类别,它是不需要经过训练的,所以它是一种非监督的学习方法。
在什么时候能用到聚类?假如数据库中有一群客户的特征数据,现在需要根据这些客户的特征直接划分出客户的级别(如SVIP客户、VIP客户),这时候就可以使用聚类的模型去解决。另外在预测商圈的时候,也可以使用聚类的算法。
4、关联分析:超市货品摆放、个性化推荐等
关联分析是指对物品之间的关联性进行分析。例如,某超市内存放有大量的货品,现在需要分析出这些货品之间的关联性,如面包商品与牛奶商品之间的关联性的强弱程度,这时候可以采用关联分析算法,借助于用户的购买记录等信息,直接分析出这些商品之间的关联性。在了解了这些商品的关联性之后,就可以将之应用于超市的商品摆放,通过将关联性强的商品放在相近的位置上,可以有效提升该超市的商品销量。
此外,关联分析还可以用于个性化推荐技术。比如,借助于用户的浏览记录,分析各个网页之间存在的关联性,在用户浏览网页时,可以向其推送强关联的网页。例如,在分析了浏览记录数据后,发现网页A与网页C之间有很强的关联关系,那么在某个用户浏览网页A时,可以向他推送网页C,这样就实现了个性化推荐。
5、自然语言处理:文本相似度技术、聊天机器人等
除了上述的应用场景之外,数据挖掘和机器学习技术也可以用于自然语言处理和语音处理等等。例如对文本相似度的计算和聊天机器人。
二、Python数据预处理实战
在进行数据挖掘与机器学习之前,首先要做的一步是对已有数据进行预处理。倘若连初始数据都是不正确的,那么就无法保证最后的结果的正确性。只有对数据进行预处理,保证其准确性,才能保证最后结果的正确性。
数据预处理指的是对数据进行初步处理,把脏数据(即影响结果准确率的数据)处理掉,否则很容易影响最终的结果。常见的数据预处理方法如下图所示:
1、缺失值处理
缺失值是指在一组数据中,某行数据缺失的某个特征值。解决缺失值有两种方法,一是将该缺失值所在的这行数据删除掉,二是将这个缺失值补充一个正确的值。
2、异常值处理
异常值产生的原因往往是数据在采集时发生了错误,如在采集数字68时发生了错误,误将其采集成680。在处理异常值之前,自然需要先发现这些异常值数据,往往可以借助画图的方法来发现这些异常值数据。在对异常值数据处理完成之后,原始数据才会趋于正确,才能保证最终结果的准确性。
3、数据集成
相较于上文的缺失值处理和异常值处理,数据集成是一种较为简单的数据预处理方式。那么数据集成是什么?假设存在两组结构一样的数据A和数据B,且两组数据都已加载进入内存,这时候如果用户想将这两组数据合并为一组数据,可以直接使用Pandas对其进行合并,而这个合并的过程实际上就是数据的集成。
接下来以淘宝商品数据为例,介绍一下上文预处理的实战。
在进行数据预处理之前,首先需要从MySQL数据库中导入淘宝商品数据。在开启MySQL数据库之后,对其中的taob表进行查询,得到了如下的输出:
可以看到,taob表中有四个字段。其中title字段用于存储淘宝商品的名称;link字段存储淘宝商品的链接;price存储淘宝商品的价格;comment存储淘宝商品的评论数(一定程度上代表商品的销量)。
那么接下来如何将这些数据导入进来?首先通过pymysql连接数据库(如果出现乱码,则对pymysql的源码进行修改),连接成功后,将taob中的数据全部检索出来,然后借助pandas中的read_sql()方法便可以将数据导入到内存中。
read_sql()方法有两个参数,第一个参数是sql语句,第二个参数是MySQL数据库的连接信息。具体代码如下图:
1、缺失值处理实战
对缺失值进行处理可以采用数据清洗的方式。以上面的淘宝商品数据为例,某件商品的评论数可能为0,但是它的价格却不可能为0。然而实际上在数据库内存在一些price值为0的数据,之所以会出现这种情况,是因为对部分数据的价格属性没有爬到。
那么如何才能判断出这些数据出现了缺失值呢?可以通过以下的方法来进行判别:
首先对于之前的taob表调用data.describe()方法,会出现如下图所示的结果:
如何看懂这个统计结果?第一步要注意观察price和comment字段的count数据,如果两者不相等,说明一定有信息缺失;如果两者相等,则暂时无法看出是否有缺失情况。例如price的count为9616.0000,而comment的count为9615.0000,说明评论数据至少缺失了一条。
其他各个字段的含义分别为:mean代表平均数;std代表标准差;min代表最小值;max代表最大值。
那么如何对这些缺失数据进行处理?一种方法是删掉这些数据,还有一种方法是在缺失值处插入一个新值。第二种方法中的值可以是平均数或者中位数,而具体使用平均数还是中位数需要根据实际情况来决定。例如年龄这个数据(1到100岁),这类平稳、变化的级差不大的数据,一般插入平均数,而变化的间隔比较大的数据,一般插入中位数。
处理价格的缺失值的具体操作如下:
2、异常值处理实战
跟缺失值的处理过程类似,想要处理异常值,首先要发现异常值。而异常值的发现往往是通过画散点图的方法,因为相似的数据会在散点图中集中分布到一块区域,而异常的数据会分布到远离这块区域的地方。根据这个性质,可以很方便的找到数据中的异常值。具体操作如下图:
首先需要从数据中抽出价格数据和评论数据。通常的做法可以借助循环去抽取,但是这种方法太复杂,有一种简单的方法是这个数据框进行转置,这时候原先的列数据就变成了现在的行数据,可以很方便的获取价格数据和评论数据。接下来通过plot()方法绘制散点图,plot()方法第一个参数代表横坐标,第二个参数代表纵坐标,第三个参数代表图的类型,”o”代表散点图。最后通过show()方法将其展现出来,这样就可以直观的观测到离群点。这些离群点对数据的分析没有帮助,在实际操作中往往需要将这些离群点代表的数据删除或者转成正常的值。下图是绘制的散点图:
根据上图所示,将评论大于100000,价格大于1000的数据都处理掉,就可以达到处理异常值的效果。而具体的两种处理方法的实现过程如下:
第一种是改值法,将其改为中位数、平均数或者其他的值。具体操作如下图所示:
第二种是删除处理法,即直接删除这些异常数据,也是推荐使用的一种方法。具体操作如下图所示:
3、分布分析
分布分析是指对数据的分布状态进行分析,即观察其是线性分布还是正态分布。一般采用画直方图的方式来进行分布分析。直方图的绘制有以下几个步骤:计算极差、计算组距和绘制直方图。具体的操作如下图所示:
其中,借助arrange()方法来制定样式,arrange()方法第一个参数代表最小值,第二个参数代表最大值,第三个参数代表组距,接下来使用hist()方法来绘制直方图。
taob表中的淘宝商品价格直方图如下图所示,大致上符合正态分布:
taob表中的淘宝商品评论直方图如下图所示,大致上是递减的曲线:
4、词云图的绘制
有的时候常常需要根据一段文本信息来进行词云图的绘制,绘制的具体操作如下图:
实现的大致流程是:先使用cut()对文档进行切词,在切词完成之后,将这些词语整理为固定格式,然后根据所需的词云图的展现形式读取相应的图片(下图中的词云图是猫的形状),接着使用wc.WordCloud()进行词云图的转换,最后通过imshow()展现出相应的词云图。例如根据老九门.txt文档绘制的词云图效果如下图所示:
三、常见分类算法介绍
常见的分类算法有很多,如下图所示:
其中KNN算法和贝叶斯算法都是较为重要的算法,除此之外还有其他的一些算法,如决策树算法、逻辑回归算法和SVM算法。Adaboost算法主要是用于弱分类算法改造成强分类算法。
四、对鸢尾花进行分类案例实战
假如现有一些鸢尾花的数据,这些数据包含了鸢尾花的一些特征,如花瓣长度、花瓣宽度、花萼长度和花萼宽度这四个特征。有了这些历史数据之后,可以利用这些数据进行分类模型的训练,在模型训练完成后,当新出现一朵不知类型的鸢尾花时,便可以借助已训练的模型判断出这朵鸢尾花的类型。这个案例有着不同的实现方法,但是借助哪种分类算法进行实现会更好呢?
1、KNN算法
(1)、KNN算法简介
首先考虑这样一个问题,在上文的淘宝商品中,有三类商品,分别是零食、名牌包包和电器,它们都有两个特征:price和comment。按照价格来排序,名牌包包最贵,电器次之,零食最便宜;按照评论数来排序,零食评论数最多,电器次之,名牌包包最少。然后以price为x轴、comment为y轴建立直角坐标系,将这三类商品的分布绘制在坐标系中,如下图所示:
显然可以发现,这三类商品都集中分布在不同的区域。如果现在出现了一个已知其特征的新商品,用?表示这个新商品。根据其特征,该商品在坐标系映射的位置如图所示,问该商品最有可能是这三类商品中的哪种?
这类问题可以采用KNN算法进行解决,该算法的实现思路是,分别计算未知商品到其他各个商品的欧几里得距离之和,然后进行排序,距离之和越小,说明该未知商品与这类商品越相似。例如在经过计算之后,得出该未知商品与电器类的商品的欧几里得距离之和最小,那么就可以认为该商品属于电器类商品。
(2)、实现方式
上述过程的具体实现如下:
当然也可以直接调包,这样更加简洁和方便,缺点在于使用的人无法理解它的原理:
(3)、使用KNN算法解决鸢尾花的分类问题
首先加载鸢尾花数据。具体有两种加载方案,一种是直接从鸢尾花数据集中读取,在设置好路径之后,通过read_csv()方法进行读取,分离数据集的特征和结果,具体操作如下:
还有一种加载方法是借助sklearn来实现加载。sklearn的datasets中自带有鸢尾花的数据集,通过使用datasets的load_iris()方法就可以将数据加载出来,随后同样获取特征和类别,然后进行训练数据和测试数据的分离(一般做交叉验证),具体是使用train_test_split()方法进行分离,该方法第三个参数代表测试比例,第四个参数是随机种子,具体操作如下:
在加载完成之后,就可以调用上文中提到的KNN算法进行分类了。
2、贝叶斯算法
(1)、贝叶斯算法的介绍
首先介绍朴素贝叶斯公式:P(B|A)=P(A|B)P(B)/P(A)。假如现在有一些课程的数据,如下表所示,价格和课时数是课程的特征,销量是课程的结果,若出现了一门新课,其价格高且课时多,根据已有的数据预测新课的销量。
显然这个问题属于分类问题。先对表格进行处理,将特征一与特征二转化成数字,即0代表低,1代表中,2代表高。在进行数字化之后,[[t1,t2],[t1,t2],[t1,t2]]------[[0,2],[2,1],[0,0]],然后对这个二维列表进行转置(便于后续统计),得到[[t1,t1,t1],[t2,t2,t2]]-------[[0,2,0],[2,1,0]]。其中[0,2,0]代表着各个课程价格,[2,1,0]代表各个课程的课时数。
而原问题可以等价于求在价格高、课时多的情况下,新课程销量分别为高、中、低的概率。即P(C|AB)=P(AB|C)P(C)/P(AB)=P(A|C)P(B|C)P(C)/P(AB)=》P(A|C)P(B|C)P(C),其中C有三种情况:c0=高,c1=中,c2=低。而最终需要比较P(c0|AB)、P(c1|AB)和P(c2|AB)这三者的大小,又
P(c0|AB)=P(A|C0)P(B|C0)P(C0)=2/4*2/4*4/7=1/7 P(c1|AB)=P(A|C1)P(B|C1)P(C1)=0=0 P(c2|AB)=P(A|C2)P(B|C2)P(C2)=0=0
显然P(c0|AB)最大,即可预测这门新课的销量为高。
(2)、实现方式
跟KNN算法一样,贝叶斯算法也有两种实现方式,一种是详细的实现:
另一种是集成的实现方式:
3、决策树算法
决策树算法是基于信息熵的理论去实现的,该算法的计算流程分为以下几个步骤:
决策树是指对于多特征的数据,对于第一个特征,是否考虑这个特征(0代表不考虑,1代表考虑)会形成一颗二叉树,然后对第二个特征也这么考虑...直到所有特征都考虑完,最终形成一颗决策树。如下图就是一颗决策树:
决策树算法实现过程为:首先取出数据的类别,然后对数据转化描述的方式(例如将“是”转化成1,“否”转化成0),借助于sklearn中的DecisionTreeClassifier建立决策树,使用fit()方法进行数据训练,训练完成后直接使用predict()即可得到预测结果,最后使用export_graphviz进行决策树的可视化。具体实现过程如下图所示:
4、逻辑回归算法
逻辑回归算法是借助于线性回归的原理来实现的。假如存在一个线性回归函数:y=a1x1+a2x2+a3x3+…+anxn+b,其中x1到xn代表的是各个特征,虽然可以用这条直线去拟合它,但是由于y范围太大,导致其鲁棒性太差。若想实现分类,需要缩小y的范围到一定的空间内,如[0,1]。这时候通过换元法可以实现y范围的缩小:
令y=ln(p/(1-p)) 那么:e^y=e^(ln(p/(1-p))) => e^y=p/(1-p) =>e^y*(1-p)=p => e^y-p*e^y=p => e^y=p(1+e^y) => p=e^y/(1+e^y) => p属于[0,1]
这样y就降低了范围,从而实现了精准分类,进而实现逻辑回归。
逻辑回归算法对应的实现过程如下图所示:
5、SVM算法
SVM算法是一种精准分类的算法,但是其可解释性并不强。它可以将低维空间线性不可分的问题,变为高位空间上的线性可分。SVM算法的使用十分简单,直接导入SVC,然后训练模型,并进行预测。具体操作如下:
尽管实现非常简单,然而该算法的关键却在于如何选择核函数。核函数可分为以下几类,各个核函数也适用于不同的情况:
对于不是特别复杂的数据,可以采用线性核函数或者多项式核函数。对于复杂的数据,则采用径向基核函数。采用各个核函数绘制的图像如下图所示:
5、Adaboost算法
假如有一个单层决策树的算法,它是一种弱分类算法(准确率很低的算法)。如果想对这个弱分类器进行加强,可以使用boost的思想去实现,比如使用Adaboost算法,即进行多次的迭代,每次都赋予不同的权重,同时进行错误率的计算并调整权重,最终形成一个综合的结果。
Adaboost算法一般不单独使用,而是组合使用,来加强那些弱分类的算法。
五、分类算法的选择思路与技巧
首先看是二分类还是多分类问题,如果是二分类问题,一般这些算法都可以使用;如果是多分类问题,则可以使用KNN和贝叶斯算法。其次看是否要求高可解释性,如果要求高可解释性,则不能使用SVM算法。再看训练样本数量、再看训练样本数量,如果训练样本的数量太大,则不适合使用KNN算法。最后看是否需要进行弱-强算法改造,如果需要则使用Adaboost算法,否则不使用Adaboost算法。如果不确定,可以选择部分数据进行验证,并进行模型评价(耗时和准确率)。
综上所述,可以总结出各个分类算法的优缺点为: