1、8.1Python常用数据分析工具8.2数据预处理8.3分类与预测8.5实战:信用评估习题8.4聚类分析of5618.6实战:影片推荐系统第八章数据挖掘8.1 Python常用数据分析工具第八章 数据挖掘of3128.1.1 NumpyNumPy提供了真正的数组功能,以及对数据进行快速处理的函数。NumPy 安装:方式一:pip install numpy 方式二:python setup.py installNumPy基本操作:#-*-coding:utf-8-*import numpy as np#一般以np作为 numpy 的别名a=np.arra y(2,8,5,7)#创建数组prin
2、t(a)#输出数组print(a:3)#引用前三个数字(切片)print(a.min()#输出a的最小值a.sort()#将a的元素从小到大排序,此操作直接修改a,因此这时候a为2,5,7,8b=np.array(1,2,3,4,5,6 )#创建二维数组print(b*b)#输出数组的平方阵,即(1,4,9),(16,25,36)8.1 Python常用数据分析工具第八章 数据挖掘of3138.1.2 ScipyScipy 提供了真正的矩阵,以及大量基于矩阵运算的对象与函数。Scipy依赖于NumPy,安装它之前得先安装NumPy。安装好Scipy后,可以通过以下命令进行简单测试。用Scipy
3、求解非线性方程组和数值积分:#-*-coding:utf-8-*#求解非线性方程组 2x1-x22=1,x12-x2=2from scipy.optimize import fsolve#导入求解方程组的函数#定义要求解的方程组def f(x):x1=x0 x2=x1 return 2*x1-x2*2-1,x1*2-x2-2 result=fsolve(f,1,1)#输入初值1,1并求解print(result)#输出结果:array(1.91963957,1.68501606)#数值积分from scipy import integrate#导入积分函数def g(x):#定义被积函数 re
4、turn(1-x*2)*0.5pi_2,err=integrate.quad(g,-1,1)#积分结果和误差print(pi_2*2)#由微积分知识可知,积分结果为圆周率pi的一半8.1 Python常用数据分析工具第八章 数据挖掘of3148.1.3 PandasPandas是Python中强大的数据分析和探索工具,它包含高级的数据结构和精巧的工具,使得在Python中处理数据非常快速和简单。Pandas的功能非常强大,支持类似SQL Server数据库的数据增、删、查、改操作,并且带有丰富的数据处理函数;支持时间序列分析;支持灵活处理缺失数据等。Pandas的安装过程跟普通的第三方库一样,
5、但如果需要读取和写入Excel数据,还需要安装xlrd库(读)和xlwt库(写)。其安装方法如下:pip install xlrd 为Python添加读取Excel数据的功能 pip install xlwt 为Python添加写入Excel数据的功能8.1 Python常用数据分析工具第八章 数据挖掘of3158.1.3 PandasPandas基本的数据结构是Series和DataFrame。Series是序列,类似一维数组;DataFrame相当于一张二维的表格,类似二维数组,它的每一列都是一个Series。为了定位Series中的元素,pandas 提供了Index对象,每个Serie
6、s都会有一个对应的Index,用来标记不同的元素。Index的内容不一定是数字,也可以是字母、汉字等。类似地,DataFrame相当于多个有同样Index的Series 的组合,每个Series都有唯一的表头,用来标识不同的Series。Pandas简例:#-*-coding:utf-8-*import pandas as pd#通常用pd作为pandas 的别名。s=pd.Series(1,2,3,index=a,b,c)#创建一个序列sd=pd.DataFrame(1,2,3,4,5,6,columns=a,b,c)#创建一个表d2=pd.DataFrame(s)#也可以用已有的序列来创建
7、表格d.head()#预览前5行数据d.describe()#数据基本统计量#读取文件,注意文件的存储路径不能有中文,否则,读取可能出错pd.read_excel(data.xls)#读取Excel文件,创建DataFrame pd.read_csv(data.csv,encoding=utf-8)#读文本格式数据,encoding指定编码8.1 Python常用数据分析工具第八章 数据挖掘of3168.1.4 Scikit-LearnScikit-Learn是Python中强大的机器学习工具包,它提供了完善的机器学习工具箱,包括数据预处理、分类、回归、聚类、预测和模型分析等。Scikit-L
8、earn依赖于NumPy、Scipy和Matplotlib,安装方法与普通第三方库的安装类似。创建一个机器学习模型:#-*-coding:utf-8-*from sklearn.linear_model import LinearRegression#导入线性回归模型model=LinearRegression()#建立线性回归模型print(model)1)所有模型提供的接口model.fit():训练模型,对于监督模型是fit(X,y),对于非监督模型是fit(X)。2)监督模型提供的接口model.predict(X_new):预测新样本。model.predict_proba(X_ne
9、w):预测概率,仅对某些模型有用(如LR)。model.score():得分越高,拟合越好。3)非监督模型提供的接口model.transform():从数据中学到新的“基空间”。model.fit_transform():从数据中学到新的基并将这个数据按照这组“基”进行转换。8.1 Python常用数据分析工具第八章 数据挖掘of3178.1.4 Scikit-LearnScikit-Learn本身提供了一些实例数据,比较常见的有安德森莺尾花卉数据集、手写图像数据集等。Scikit-Learn简例:#-*-coding:utf-8-*from sklearn import datasets#
10、导入数据集iris=datasets.load_iris()#加载数据集print(iris.data.shape)#查看数据集大小from sklearn import svm#导入SVM模型clf=svm.LinearSVC()#建立线性SVM分类器clf.fit(iris.data,iris.target)#用数据训练模型clf.predict(3.6,5.9,1.4,2.35)#训练好模型之后,输入新的数据进行预测clf.coef_#查看训练好模型的参数8.1Python常用数据分析工具8.2数据预处理8.3分类与预测8.5实战:信用评估习题8.4聚类分析of5688.6实战:影片推荐
11、系统第八章数据挖掘8.2 数据预处理第八章 数据挖掘of319在实际的数据挖掘中,海量的原始数据中存在大量信息不完整(有缺失值)、信息表达不一致、有异常(受噪声影响)的数据,无法直接进行数据挖掘,或挖掘结果差强人意。为了提高数据挖掘的质量,产生了数据预处理(Data Preprocessing)技术。统计发现,在数据挖掘的过程中,数据预处理工作量占到了整个过程的60%。数据预处理有多种方法:数据清理(Data Cleaning)、数据集成(Data Integration)、数据变换(Data Transformation)等。这些数据预处理技术在数据挖掘之前使用,大大提高了数据挖掘模式的质量
12、,降低了实际挖掘所需要的时间。8.2 数据预处理第八章 数据挖掘of31108.2.1 数据清洗数据清理是进行数据预处理的首要方法,它通过识别或删除离群点来光滑噪声数据,并填补缺失值,从而“清理”数据。数据清理的主要任务是处理缺失值、光滑噪声数据。1.处理缺失值处理缺失值通常包括以下几类方法:(1)删除元组(2)人工填写缺失值(3)中心度量填补(4)多重填补(5)使用最可能的值填补8.2 数据预处理第八章 数据挖掘of31118.2.1 数据清洗 2.光滑噪声数据光滑噪声数据主要有以下几种方法:(1)分箱。其主要思想为每一个数据与它的“近邻”数据应该是相似的,因此将数据用其近邻(“箱”或“桶”
13、)替代,这样既可以光滑有序数据值,还能在一定程度上保持数据的独有特点。(2)回归。回归技术是通过一个映像或函数拟合多个属性数据,从而达到光滑数据的效果。线性回归是寻找一条“最佳”直线来拟合多个属性,从而使用其中的某些属性预测其他属性。(3)离群点分析。聚类可以将相似的值归为同一“簇”,因此主要使用聚类等技术来检测离群点。聚类技术将在8.3节展开讨论。8.2 数据预处理第八章 数据挖掘of31128.2.2 数据集成数据挖掘需要的数据往往分布在不同的数据源中,数据集成就是将多个数据源合并存放在一个一致的数据存储(如数据仓库)中的过程。在实际应用中,数据集成解决3类问题:实体识别、冗余和相关分析,
14、以及数值冲突的检测与处理。1.实体识别实体识别是指从不同数据源识别现实世界的实体,它的任务是统一不同源数据的矛盾之处。例如,一个数据库中的属性名student_id与另一个数据库中的属性名student_number表示的含义是否相同。每个属性的元数据包括属性名、现实含义、数据类型、取值范围,以及处理零或空白时的空值规则。元数据的统一设计不仅可以有效避免模式集成的错误,还能在变换数据时起到一定的作用。8.2 数据预处理第八章 数据挖掘of31138.2.2 数据集成2.冗余和相关分析数据集成往往导致数据冗余,分析冗余有很多种方法。首先,可以将数据进行可视化处理,将数据点绘制成图表后趋势和关联会
15、变得清晰起来。除此之外,冗余还可以通过相关性分析方法检验。对于标称数据,可以使用卡方检验;对于数值属性,可以用相关系数度量一个属性在多大程度上蕴含另一个属性,通过相关性分析来删除冗余数据。3.数值冲突的检测与处理对于现实世界的同一实体,由于表达方式、尺度标准或编码的不同常导致元数据的巨大差异。例如,在大学的课程评分系统中,有的学校采用A+F对成绩进行评分,而有的则采用数值1100评分。于是在对这两所学校进行数据库合并时,应该将两个系统的评分制度做统一处理,以便进行进一步的数据挖掘。8.2 数据预处理第八章 数据挖掘of31148.2.3 数据交换在进行数据挖掘前,须对数据集进行相应的数据变换。
16、常用的变换策略如下。1.数据规范化数据规范化的目的是将数据按比例缩放,使得属性之间的权值适合数据挖掘。例如,统计身高信息的度量单位是不同的,若在数据挖掘中把height属性的度量单位从米变成英寸,则可能导致完全不同的结果。常见的数据规范化方法包括最小-最大规范化、z-score分数规范化、小数定标规范化等。2.数据离散化数据离散化是将数值属性的原始值用区间标签或概念标签替换的过程,它可以将连续属性值离散化。连续属性离散化的实质是将连续属性值转换成少数有限的区间,从而有效地提高数据挖掘工作的计算效率。8.2 数据预处理第八章 数据挖掘of31158.2.3 数据交换3.概念分层概念分层的主要思想
17、是将低层概念的集合映射到高层概念的集合,它广泛应用于标称数据的转换。如现有某个数据库需要对关于地理位置location的属性集进行概念分层,其中属性内容包括街道street、国家country、城市city和省份province_or_state。首先,对每个属性不同值的个数进行统计分析,并将其按照升序进行排列。其次,根据排列好的属性顺序,自顶向下进行分层。根据大家的常规认识,对属性的全序排列结果为街道street城市city省份province_or_state国家country,即街道street属性在最顶层,国家country属性在最底层。最后,用户根据产生的分层,选择合适的属性代替该属
18、性集。8.2 数据预处理第八章 数据挖掘of31168.2.4 Python数据预处理下面结合kaggle比赛HousePrices来介绍数据预处理。1.加载数据houseprice=pd.read_csv(./input/train.csv)#加载后放入DataFrame里all_data=pd.read_csv(train.csv,header=0,parse_dates=time,usecols=time,LotArea,price)#可选择加载哪几列houseprice.head()#显示前5行数据houseprice.info()#查看各字段信息houseprice.shape#查看
19、数据集行列分布houseprice.describe()#查看数据大体情况,可获得某一列的基本统计特征8.2 数据预处理第八章 数据挖掘of31178.2.4 Python数据预处理2.分析缺失数据houseprice.isnull()#元素级别的判断,把对应的所有元素的位置都列出来,元素为空值或NA就显示True;否则,显示Falsehouseprice.isnull().any()#列级别的判断,只要该列有为空值或NA的元素,就为True;否则,为Falsemissing=houseprice.columnshouseprice.isnull().any().tolist()#将为空值或N
20、A的列找出来housepricemissing.isnull().sum()#将列中为空值或NA的元素个数统计出来#将某一列中缺失元素的值,用value值进行填补。处理缺失数据时,如该列都是字符串,不是数值,则可以用出现次数最多的字符串来填补缺失值def cat_imputation(column,value):houseprice.lochousepricecolumn.isnull(),column=valuehousepriceLotFrontage,AlleyhousepriceAlley.isnull()=True#从LotFrontage 和Alley列中选择行,选择Alley中数
21、据为空值的行。主要用来看两个列的关联程度,看它们是不是大多同时为空值。housepriceFireplaceshousepriceFireplaceQu.isnull()=True.describe()#对筛选出来的数据进行描述,比如一共多少行、均值、方差、最小值、最大值,等等8.2 数据预处理第八章 数据挖掘of31188.2.4 Python数据预处理3.统计分析housepriceMSSubClass.value_counts()#统计某一列中各个元素值出现的次数print(Skewness:%f%housepriceMSSubClass.skew()#列出数据的偏斜度print(Kur
22、tosis:%f%housepriceMSSubClass.kurt()#列出数据的峰度housepriceLotFrontage.corr(housepriceLotArea)#计算两个列的相关度housepriceSqrtLotArea=np.sqrt(housepriceLotArea)#将列的数值求根,并赋予一个新列housepriceMSSubClass,LotFrontage.groupby(MSSubClass,as_index=False).mean()#对MSSubClass进行分组,并求分组后的平均值8.2 数据预处理第八章 数据挖掘of31198.2.4 Python数据
23、预处理4.数据处理1)删除相关del housepriceSqrtLotArea#删除列housepriceLotFrontage.dropna()#去掉为空值或NA的元素houseprice.drop(Alley,axis=1)#去掉Alley列,不管空值与否df.drop(df.columns0,1,axis=1,inplace=True)#删除第1、2列,inplace=True表示直接在内存中替换,不用二次赋值生效houseprice.dropna(axis=0)#删除有空值的行houseprice.dropna(axis=1)#删除有空值的列2)缺失值填补处理housepriceLo
24、tFrontage=housepriceLotFrontage.fillna(0)#将该列中的空值或NA填补为0all_data.product_typeall_data.product_type.isnull()=all_data.product_type.dropna().mode().values#如果该列是字符串,就将该列中出现次数最多的字符串赋予空值,mode()函数是取出现次数最多的元素housepriceLotFrontage.fillna(method=pad)#使用前一个数值替代空值或NA,就是用NA前面最近的非空数值替换housepriceLotFrontage.filln
25、a(method=bfill,limit=1)#使用后一个数值替代空值或NA,limit=1是限制如果有几个连续的空值,只有最近的一个空值可以被填补housepriceLotFrontage.fillna(housepriceLotFrontage.mean()#使用平均值进行填补housepriceLotFrontage.interpolate()#使用插值来估计NaN。如果index是数字,可以设置参数method=value;如果是时间,可以设置method=timehouseprice=houseprice.fillna(houseprice.mean()#将缺失值全部用该列的平均值代
26、替,此时一般已经提前将字符串特征转换成了数值注意:如果在处理缺失数据时,数据缺失比例达到15%,并且该变量作用不大,那么就删除该变量!8.2 数据预处理第八章 数据挖掘of31208.2.4 Python数据预处理4.数据处理3)字符串替换housepriceMSZoning=housepriceMSZoning.map(RL:1,RM:2,RR:3,).astype(int)#将MSZoning中的字符串变成对应的数字4)数据连接merge_data=pd.concat(new_train,df_test)#将训练数据与测试数据连接起来,以便一起进行数据清洗all_data=pd.conca
27、t(train.loc:,MSSubClass:SaleCondition,test.loc:,MSSubClass:SaleCondition)#另一种合并方式,按列名字进行合并res=pd.merge(df1,df2,on=time)#将df1、df2按照time字段进行合并5)数据保存merge_data.to_csv(merge_data.csv,index=False)#index=False,写入的时候不写入列的索引序号6)数据转换housepriceAlley=np.log1p(housepriceAlley)#采用log(1+x)方式对原数据进行处理,改变原数据的偏斜度,使数据
28、更加符合正态分布曲线numeric_feats=houseprice.dtypeshouseprice.dtypes!=object.index#把内容为数值的特征列找出来7)数据标准化Scikit-Learn库为其提供了相应的函数:from sklearn import preprocessingnormalized_X=preprocessing.normalize(X)#normalize the data attributesstandardized_X=preprocessing.scale(X)#standardize the data attributes8.1Python常用数
29、据分析工具8.2数据预处理8.3分类与预测8.5实战:信用评估习题8.4聚类分析of56218.6实战:影片推荐系统第八章数据挖掘8.3 分类与预测第八章 数据挖掘of31228.3.1 特征选择分类(Classification)和预测(Prediction)是预测问题的两种主要类型。分类主要是预测分类标号(离散属性),而预测主要是建立连续值函数模型。预测可给定自变量对应的因变量的值。特征选择的一般过程如图所示:首先从原始特征集中根据一定的策略产生特征子集,对特征子集进行评估,得到相应的评估值,然后将评估值和设定的阈值比较,如果评估值低于阈值,则重新产生新的特征子集,进行下一轮迭代;如果评估
30、值高于阈值,则停止迭代,并对最优特征子集进行验证。特征选择模型主要有两种:Filter模型和Wrapper模型。8.3 分类与预测第八章 数据挖掘of31238.3.2 性能评估对于分类问题,为了评估算法的性能,通常要将数据集分为训练集和测试集两类:训练集用来训练分类模型,测试集用来测试分类模型的性能。将一个训练集划分为训练集和测试集的常见方法:留出法、交叉验证法和自助法。留出法:将数据集分为2个互斥的集合,分别为训练集和测试集。在划分的时候需要注意,训练集和测试集的数据分布要基本一致,避免划分数据集过程中的偏差影响模型的训练和测试。交叉验证法:将数据集分为k份互斥子集,通过分层采样保证数据分
31、布的一致性。每次将k-1份子集的合集作为训练集,剩下的一份作为测试集,总共进行k次实验,结果取平均值。这两种方法都使得训练样本数少于实际数据集中的样本数,而自助法可解决这一问题。自助法:对于有m个样本的数据集,每次通过有放回的方式从原始数据集中抽取m次,这样生成的训练集和测试集都是和原始数据集规模一致的。自助法的缺点是改变了原始数据集的分布。8.3 分类与预测第八章 数据挖掘of31248.3.2 性能评估对于算法的性能评估除了需要测试集,还需要算法性能评估指标。对于不同的任务,采用不同的算法性能评估指标来比较不同算法或同一算法不同参数的效果。对于二分类问题,可以将分类算法预测的类别和样本的实
32、际类别组合,得到分类结果的混淆矩阵,如下表所示。预测结果实际情况正例反例正例TP(真正例)FN(假反例)反例FP(假正例)TN(真反例)其中:TP表示分类算法预测为正例且实际也是正例的样本数量,称为真正例;FP表示分类算法预测为正例但实际是反例的样本数量,称为假正例;FN表示分类算法预测为反例但实际是正例的样本数量,称为假反例;TN表示分类算法预测为反例且实际也是反例的样本数量,称为真反例。8.3 分类与预测第八章 数据挖掘of31258.3.2 性能评估主要的评估指标:1)准确率(accuration)准确率是指分类正确的样本数占总样本数的比例。定义为:(8-1)2)精确率(precisio
33、n)精确率是指预测正确的正样本数占总的预测为正样本数的比例。定义为:(8-2)3)召回率(recall)召回率是指预测正确的正样本数占总的正样本数的比例。定义为:(8-3)4)F1值 F1值是在精确率和召回率的基础上提出的,定义为:(8-4)对于一个分类问题,预测的精确率和召回率通常是相互制约的,精确率高一般召回率低,召回率高一般精确率低,F1值很好地平衡了这两个指标的影响。8.3 分类与预测第八章 数据挖掘of31268.3.2 性能评估主要的评估指标:5)ROC和AUC分类算法得到的结果一般是一个实值,然后通过将这个值与设定的阈值比较大小来判定这个样本属于正例或反例。值越大,说明这个样本属
34、于正样本的概率越大;值越小,说明这个样本属于负样本的概率越大。实际应用中,如果更看重精确率,则可以提高阈值;如果更看重召回率,则可以降低阈值。ROC曲线全称为“受试者工作特征”(Receiver Operating Characteristic)曲线,体现不同阈值下的分类效果,即分类算法在不同需求任务下的泛化性能的好坏,如图8-2所示。在图8-2中,横坐标是假正例率(False Positive Rate,FPR),表示真实正例被预测为正例的比例,和召回率一致;纵坐标是真正例率(True Positive Rate,TPR),表示真实反例被预测为正例的比例。它们的定义分别为:(8-5)(8-6
35、)AUC是ROC下包含的面积,当AUC大于0.5时,说明分类算法是有效的,而且 AUC越大说明分类算法的泛化能力越强;当AUC小于或等于0.5时,说明分类算法无效。8.3 分类与预测第八章 数据挖掘of31278.3.3 实现过程1.分类分类是构造一个分类模型,输入样本的属性值,可以输出对应的类别,从而将每个样本映射到预先定义好的类别中。分类模型建立在已知类标记的数据集上,可以方便地计算模型在已有样本上的准确率,所以分类属于有监督的学习。2.预测预测是指建立两种或两种以上变量间相互依赖的函数模型,然后进行预测或控制。3.实现过程分类和预测的实现过程类似,以分类模型为例。分类模型的实现有两个步骤
36、:第一步是建立一个模型(见图8-3),可通过归纳分析训练样本集来建立分类模型,得到分类规则;第二步是使用模型进行分类(见图8-4),用已知的测试样本集评估分类规则的准确率,如果准确率是可以接受的,则使用该模型对未知类标记的待测样本集进行预测。8.3 分类与预测第八章 数据挖掘of31288.3.3 实现过程3.实现过程 预测模型的实现也有两个步骤,类似于分类,首先通过训练集建立预测属性(数值型的)的函数模型,然后在模型通过检验后进行预测或控制。分类(Classification)是一种重要的数据分析形式,它提取刻画重要数据类的模型。这种模型称为分类器,预测分类的(离散的、无序的)类标号。这些类
37、别可以用离散值表示,其中值之间的次序没有意义。8.3 分类与预测第八章 数据挖掘of31298.3.4 分类与预测的常用方法1.K-最近邻K-最近邻(K-Nearest Neighbor,KNN)算法最早是由Cover和Hart在1967年提出的,其主要思想是找到特征最相似的训练集,然后认为待预测的样本类型就是这个最近邻样本的类型。K-最近邻算法的实现流程如下:(1)对于预测集的样本,计算其特征向量和每个训练集样本特征向量的距离。(2)按距离对训练样本排序。(3)取排序靠前的前K个样本,统计这些样本中出现次数最多的标签。(4)出现最多的标签就认为是待预测样本的标签。K-最近邻算法实现简单,预测
38、的精度一般也较高,但是对预测集的每个样本都需要计算它和每个训练样本的相似度,计算量较大,尤其是训练集很大的时候,计算量会严重影响算法的性能。8.3 分类与预测第八章 数据挖掘of31308.3.4 分类与预测的常用方法1.K-最近邻例:先验数据如表8-3所示,使用KNN算法对表8-4中的未知类别数据分类。1)KNN算法的Python实现(详见P:214)2)KNN Test.py测试文件(详见P:215)8.3 分类与预测第八章 数据挖掘of31318.3.4 分类与预测的常用方法2.决策树决策树是一个树状结构,它的每一个叶节点对应一个分类,非叶节点对应在某个属性上的划分,根据样本在该属性上的
39、不同取值将其划分成若干个子集。对于非纯的叶节点,多数类的标号给出了到达这个节点的样本所属的类。构造决策树的核心问题在于每一步该如何选择适当的属性对样本做拆分。对一个分类问题,从已知类标记的训练样本中学习并构造出决策树是一个自上而下、分而治之的过程。决策树的关键是在节点上对属性的判别,但是一般样本都有很多属性,优先选取哪些属性显得尤为重要。分枝时我们的目标是尽量使分枝的节点包括的样本都属于同一类别。在此基础上产生了很多有效的最优划分属性判别算法,常见的有ID3决策树、C4.5决策树和CART决策树等。8.3 分类与预测第八章 数据挖掘of31328.3.4 分类与预测的常用方法2.决策树 ID3
40、决策树使用的判别方法是信息增益。信息熵:度量样本集合纯度的一个指标,定义为:(8-7)信息熵越小,代表纯度越高。信息增益:属性 对于样本D进行划分时获得的增益,表示为:(8-8)信息增益越大说明用属性 来划分样本D获得的分类效果越好。因此,信息增益可以作为优先选择属性的判别标准之一。8.3 分类与预测第八章 数据挖掘of31338.3.4 分类与预测的常用方法2.决策树信息增益有个缺点,它对可取值多的属性的偏好较大,为此,C4.5决策树提出以增益率作为选取最优属性的指标。增益率定义为:(8-9)其中,(8-10)一个固定值,这个值的特点是属性的可取值越多,这个值越大,从而有效地避免了取值多的属
41、性被优先选取的可能性。但是这会导致另一个问题,就是属性取值少的属性优先选取的概率被放大,所以不能直接用这个指标作为选取优先属性的标准。C4.5决策树给出的是一种启发式的方法:先找到属性中信息增益高于平均水平的属性,再从里面选取增益率最高的属性。集合两个指标选取属性,可使得属性的取值对算法的影响大大减小。8.3 分类与预测第八章 数据挖掘of31348.3.4 分类与预测的常用方法2.决策树对于CART决策树,使用“基尼指数”选取属性。基尼值为:(8-11)基尼值越小,代表集合的纯度越高。基尼指数定义为:(8-12)优先选取基尼指数最小的属性作为优先属性。决策树的一个缺点是容易过拟合。过拟合的一
42、个表现是在训练集上都能正确分类,但是在测试集上表现很差,体现在算法上就是分枝过多。为了克服这个缺点,决策树引进了剪枝的概念。剪枝分为预剪枝和后剪枝。预剪枝是在树生成过程中,判断节点的划分能不能带来算法泛化性能的提升,如果不能,这个节点就可当作叶节点。后剪枝是树生成后,对每个节点进行考察,如果去掉这个节点能够提升算法的泛化性能,那么就把这个节点设置成叶节点。8.3 分类与预测第八章 数据挖掘of31358.3.4 分类与预测的常用方法2.决策树输出:这样递归得到的一棵以node为根节点的树就是生成的决策树。算法优点:准确率较高,可解释性强,对缺失值、异常值和数据分布不敏感等。缺点:对于连续型的变
43、量需要离散化处理,容易出现过拟合现象等。8.3 分类与预测第八章 数据挖掘of31368.3.4 分类与预测的常用方法2.决策树下面以表8-5中的数据为例,说明ID3决策树算法的实现。8.3 分类与预测第八章 数据挖掘of31378.3.4 分类与预测的常用方法2.决策树说明:a.示例Python源代码详见P:221-224b.图形显示决策树的Python源代码详见P:225-226 c.运行得到的决策树如图8-6所示。8.3 分类与预测第八章 数据挖掘of31388.3.4 分类与预测的常用方法3.朴素贝叶斯分类算法朴素贝叶斯分类算法的基础是1763年英国学者提出的贝叶斯定理,贝叶斯定理的定
44、义如下:(8-13)(8-14)8.3 分类与预测第八章 数据挖掘of31398.3.4 分类与预测的常用方法3.朴素贝叶斯分类算法对于未知样本,分别计算这个样本为每一类的条件概率,最大概率值对应的类别就判定为样本所属的类别。其中,计算比较困难,因为未知样本的属性在训练集中可能没出现,根据属性间相互独立的假设可得:(8-15)所以朴素贝叶斯分类算法的表达式可以写成:(8-16)朴素贝叶斯分类算法的流程为:(1)计算每个类别出现的概率 。(2)计算每个独立特征的条件概率 ,求和得到 。(3)计算不同类别下的 ,最大值对应的类别判断为样本的类别。朴素贝叶斯分类算法的优点是计算简单,在数据量较少的情
45、况下依然有效,也适用于多分类的问题;缺点是属性的相互独立假设在实际问题中可能得不到很好地满足。该算法在医学、经济和社会领域都有广泛的应用。朴素贝叶斯分类算法的Python源代码及运行结果详见P:227-2298.3 分类与预测第八章 数据挖掘of31408.3.4 分类与预测的常用方法4.支持向量机支持向量机(SVM)算法是由Cortes和Vapnik等人在1995年提出的一种机器学习算法,具有很强的理论基础,不仅可以用于分类任务,同时也适合回归任务。对于二分类问题,需要在不同类别间划出超平面将两个类别分开。超平面的方程描述如下:(8-17)其中,是超平面的法向量,代表平面的方向;是位移,代表
46、超平面和原点之间的距离。样本中的点到超平面的距离为:(8-18)如果超平面可以将正负样本分开,那么有:(8-19)训练样本中使得式(8-19)等号成立的样本点称为“支持向量”,类型不同的两个支持向量到超平面的距离和为:(8-20)也称为“间隔”。寻找能使间隔最大的超平面,就是在满足式(8-19)的情况下使得R最大,即 (8-21)8.3 分类与预测第八章 数据挖掘of31418.3.4 分类与预测的常用方法4.支持向量机最大化 等价于最小化 ,式(8-21)可以改写成:(8-22)使用拉格朗日乘子法对式(8-22)的每个约束添加拉格朗日乘子,可以得到拉格朗日方程:(8-23)对 和 分别求偏导
47、并令其为0可得:(8-24)由式(8-23)和式(8-24)可以得到式(8-22)的对偶问题:(8-25)8.3 分类与预测第八章 数据挖掘of31428.3.4 分类与预测的常用方法4.支持向量机求解出 后,求出 和 即可得到SVM模型:(8-26)式(8-25)一般用SMO算法求解 值。SMO算法的基本思想是固定 以外的参数,然后求 上的极值,流程为:(1)选取需要更新的 和 。(2)固定 和 以外的参数,求解式(8-25)得到更新后的 和 。(3)执行上面两步直至收敛。SVM算法有充分的理论基础,并且最终的决策只由少数的支持向量确定,算法的复杂度取决于支持向量的数量,而不是样本空间的维数
48、,所以计算量不是很大,而且泛化准确率较高。该算法的缺点是它对参数调节和核函数的选取比较敏感,而且在存储和计算上占用较多的内存和运行时间,所以在大规模的样本训练上有所不足。8.3 分类与预测第八章 数据挖掘of31438.3.4 分类与预测的常用方法4.支持向量机SVM算法的Python实现:(详见P:231-235)SVM算法的分类结果如图8-7所示。8.3 分类与预测第八章 数据挖掘of31448.3.4 分类与预测的常用方法5.集成学习集成学习(Ensemble Learning)是通过综合多个分类器来进行决策的方法,基本流程如图8-8所示。根据集成学习的生成过程,可以将其分为两大类,一类
49、是前后没有依赖关系、分类器间是并行关系的方法,代表是Bagging方法;另一类是前后有强依赖关系、分类器间是串行关系的方法,代表是Boosting方法。8.3 分类与预测第八章 数据挖掘of31458.3.4 分类与预测的常用方法5.集成学习1)Bagging和BoostingBagging方法是1996年由Breiman提出的可以并行执行的集成学习方法。Bagging方法的主要思想是采用有放回随机抽样,得到N 份同等规模的训练数据,对于每份数据采用分类算法得到一个弱分类器,最后将这些分类器综合起来,通过投票的方式进行汇总,得到最终分类结果。Bagging方法对于不稳定的算法,如决策树和神经网
50、络具有不错的提升,但是对于稳定的算法,如K-最近邻算法可能没有明显的效果。Boosting方法也是将弱分类器综合成强分类器的方法,其中的代表是由Freund和Schapire于1997年提出的Adaboost方法。Boosting方法的主要思想是先由训练集和分类算法训练一个基分类器,然后对分类错误的样本,通过调整样本分布,使得下次训练的时候,这些样本得到更多关注。这样,每进行一次迭代,分类算法的性能都可得到改进,最后累计得到一个分类效果更好的分类模型。8.3 分类与预测第八章 数据挖掘of31468.3.4 分类与预测的常用方法5.集成学习1)Bagging和BoostingBagging方法