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