1、第4章 分类与聚类主要内容 引言 K最近邻(k-Nearest Neighbor)分类算法 朴素贝叶斯 决策树 随机森林 K均值聚类算法(K-means)引言 机器学习(Machine Learning,ML)一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析和算法复杂度理论等。定义 是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能。是对能通过经验自动改进的计算机算法的研究。是用数据或以往的经验,以此优化计算机程序的性能标准。引言 ML分类(基于学习方式)监督学习监督学习(有导师学习有导师学习):输入数据中有导师信号(标签信息),以概率函数、代
2、数函数或人工神经网络为基函数模型,采用迭代计算方法,学习结果为函数。无监督学习无监督学习(无导师学习无导师学习):输入数据中无导师信号,采用聚类方法,学习结果为类别。典型的无导师学习有发现学习、聚类、竞争学习等。半监督学习半监督学习:输入数据中有的有导师信号,有的没有导师信号。强化学习强化学习(增强学习增强学习):以环境反惯(奖/惩信号)作为输入,以统计和动态规划技术为指导的一种学习方法。引言 Scikit learn(Sklearn)packageSimple and efficient tools for predictive data analysisAccessible to ever
3、ybody,and reusable in various contextsBuilt on NumPy,SciPy,and matplotlibOpen source,commercially usable-BSD licensehttps:/scikit-learn.org/stable/index.html引言 Scikit learn(Sklearn)package引言 Sklearn Installationpip install-U scikit-learnconda install scikit-learn checking your installation you can u
4、sepython-m pip show scikit-learn#to see which version and where scikit-learn is installedpython-m pip freeze#to see all packages installed in the active virtualenvconda list scikit-learn#to see which scikit-learn version is installedconda list#to see all packages installed in the active conda enviro
5、nmentpython-c import sklearn;sklearn.show_versions()“引言ML基本步骤1提出问题理解数据数据清洗构建模型评估模型模型应用-1https:/ 采集数据 sklearn.datasets中有练习数据(数据要有代表性,数据量要合适)导入数据 pd.csv.查看数据集信息 data.shape查看数据集大小;.shape0查看行数;.shape1查看列数 df.head()查看前几行;df.describe()查看数值数据的描述统计信息;df.info()根据行数查看数据是否有缺失值,数据类型是否合适 了解各个字段的含义,目标和特征分别是哪个字段;也
6、可通过可视化了解数据的分布引言ML基本步骤数据清洗数据预处理 包括缺失值处理、重复值处理、数据类型的转换、字符串数据的规整 缺失值处理(标签数据无需填充缺失):数值数据:用平均值取代:dataA.fillna(dataA.mean()分类数据:dataA.value_counts();dataA.fillna(占比最多的类别);dataA.fillna(U)缺失比较多时,填充代表未知的字符串 使用模型预测缺失值,例如:K-NN引言ML基本步骤数据清洗 数据预处理 数据归一化/标准化:模型具有伸缩可变性,如SVM,最好进行标准化,避免模型参数受极值影响;伸缩不变模型,如逻辑回归,最好也进行标准化
7、,可以加快训练速度 归一化/标准化常见两种方法:min-max,化为0,1:(x-min(x)/(max(x)-min(x)/preprocessing.MinMaxScaler;适合分别在有限范围内的数据,数值较集中,但min/max不稳定会影响结果 Z-core,化为均值为0,方差为1:(x-mean(x)/std(x)/sklearn.preprocessing.scale(),适合最大/最小值未知,或者有超出取值范围的离散值引言ML基本步骤数据清洗特征提取(特征工程.1)(以泰坦尼克项目为例)特征:原始数据的抽象表示 数值型数据处理:一般可直接使用,或通过运算转化为新的特征 通过家庭人
8、数可划分大小家庭:df.家庭人数=df.A+df.B+1(自己);df.小家庭=df.家庭人数.map(lambda s:1 if 2=s=Lmax,则舍弃该元组,遍历下一个元组。若L Lmax,删除优先级队列中最大距离的元组,将当前训练元组存入优先级队列7.遍历完毕,计算优先级队列中k 个元组的多数类,并将其作为测试元组的类别。8.测试元组集测试完毕后计算误差率,继续设定不同的k值重新进行训练,最后取误差率最小的k 值K最近邻分类算法算法实践Sklearn包内置了鸢尾花数据集,其中存储花萼长宽(特征0和1)和花瓣长宽(特征2和3),target存储花的分类,Iris-setosa(山鸢尾),
9、Iris-versicolor(变色鸢尾)和Iris-virginica(弗吉尼亚鸢尾),分别标记为数字 0,1和2。图4-1山鸢尾、变色鸢尾和弗吉尼亚鸢尾K最近邻分类算法from sklearn.datasets import load_irisiris=load_iris()iris.datairis.data.shapeiris.targetiris.target.shape#The sklearn.datasets module includes utilities to load datasets,#including methods to load and fetch popula
10、r reference datasets.#It also features some artificial data generators.K最近邻分类算法from sklearn.model_selection import train_test_splitX_train,X_test,y_train,y_test =train_test_split(iris.data,iris.target,test_size=0.25,random_state=33)#sklearn.model_selection.train_test_split(*arrays,*options)K最近邻分类算法#
11、sklearn.model_selection.train_test_split(*arrays,*options)*arrayssequence of indexables with same length/shape0 Allowed inputs are lists,numpy arrays,scipy-sparse matrices or pandas dataframes.test_sizefloat or int,default=None If float,should be between 0.0 and 1.0 and represent the proportion of t
12、he dataset to include in the test split.If int,represents the absolute number of test samples.If None,the value is set to the complement of the train size.If train_size is also None,it will be set to 0.25.train_sizefloat or int,default=None If float,should be between 0.0 and 1.0 and represent the pr
13、oportion of the dataset to include in the train split.If int,represents the absolute number of train samples.If None,the value is automatically set to the complement of the test size.random_stateint or RandomState instance,default=None Controls the shuffling applied to the data before applying the s
14、plit.Pass an int for reproducible output across multiple function calls.See Glossary.K最近邻分类算法from sklearn.preprocessing import StandardScalerss=StandardScaler()X_train=ss.fit_transform(X_train)X_test=ss.transform(X_test)#Standardize features by removing the mean and scaling to unit varianceK最近邻分类算法f
15、rom sklearn.neighbors import KNeighborsClassifierknc=KNeighborsClassifier()knc.fit(X_train,y_train)classsklearn.neighbors.KNeighborsClassifierKNeighborsClassifier(n_neighbors=5,*,weights=uniform,algorithm=auto,leaf_size=30,p=2,metric=minkowski,metric_params=None,n_jobs=None,*kwargs)K最近邻分类算法y_predict
16、=knc.predict(X_test)print(The accuracy of K-Nearest Neighbor Classifier is,knc.score(X_test,y_test)#The accuracy of K-Nearest Neighbor Classifier is 0.8947368421052632from sklearn.metrics import classification_reportprint(classification_report(y_test,y_predict,target_names=iris.target_names)K最近邻分类算法
17、PrecisionRecallFl-scoreSupportsetosa1.001.001.008versicolor0.731.000.8511virginica1.000.790.8819accuracy0.8938macro avg0.910.930.9138weighted avg0.920.890.9038 KNN分类统计结果K最近邻分类算法分类结果每个分类标签的精确度,召回率和 F1-score。精确度:precision,正确预测为正的,占全部预测为正的比例,TP/(TP+FP)召回率:recall,正确预测为正的,占全部实际为正的比例,TP/(TP+FN)F1-score:精确
18、率和召回率的调和平均数,2*precision*recall/(precision+recall)总体的微平均值,宏平均值和加权平均值。微平均值:micro average,所有数据结果的平均值宏平均值:macro average,所有标签结果的平均值加权平均值:weighted average,所有标签结果的加权平均值在二分类场景中,正标签的召回率称为敏感度(sensitivity),负标签的召回率称为特异性(specificity)。K最近邻分类算法K最近邻分类算法 小结 Lazy learning algorithmLazy learning algorithm KNN is a laz
19、y learning algorithm because it does not have a specialized training phase and uses all the data for training while classification.Non-parametric learning algorithmNon-parametric learning algorithm KNN is also a non-parametric learning algorithm because it doesnt assume anything about the underlying
20、 data.K最近邻分类算法 优点 简单易用,相比其他算法,KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。模型训练时间快,上面说到KNN算法是惰性的,这里也就不再过多讲述。预测效果好。对异常值不敏感 缺点 对内存要求较高,因为该算法存储了所有训练数据 预测阶段可能很慢 对不相关的功能和数据规模敏感朴素贝叶斯 朴素贝叶斯方法是在贝叶斯算法的基础上进行了相应的简化,即假定给定目标值时属性之间相互条件独立。也就是说没有哪个属性变量对于决策结果来说占有着较大的比重,也没有哪个属性变量对于决策结果占有着较小的比重。虽然这个简化方式在一定程度上降低了贝叶斯分类算法的分类效果,但是
21、在实际的应用场景中,极大地简化了贝叶斯方法的复杂性。朴素贝叶斯 基本思想基本思想 朴素贝叶斯分类(NBC)是以贝叶斯定理为基础并且假设特征条件之间相互独立的方法,先通过已给定的训练集,以特征词之间独立作为前提假设,学习从输入到输出的联合概率分布,再基于学习到的模型,输入求出使得后验概率最大的输出。朴素贝叶斯 算法实践算法实践from sklearn.naive_bayes import GaussianNBimport numpy as npimport pandas as pdfrom pandas import Series,DataFrameimport matplotlib.pyplo
22、t as pltfrom sklearn.datasets import load_irisfrom matplotlib.colors import ListedColormap%matplotlib inline#导入函数muNB=GaussianNB()#读取数据iris=load_iris()#取出数据中的datadata=iris.data#取出数据中的targettarget=iris.target#取data中所有行前两列为训练数据samples=data:,:2#训练数据muNB.fit(samples,target)朴素贝叶斯#取出训练数据中第一列中的最大与最小值xmin,x
23、max=samples:,0.min(),samples:,0.max()#取出训练数据中第二列中的最大与最小值ymin,ymax=samples:,1.min(),samples:,1.max()#在最大与最小值的区间分成300个数据x=np.linspace(xmin,xmax,300)y=np.linspace(ymin,ymax,300)#然后使这些数据组成一个平面xx,yy=np.meshgrid(x,y)#生成90000个坐标点X_test=np.c_xx.ravel(),yy.ravel()#预测训练数据y_=muNB.predict(X_test)#导入三种不同的颜色color
24、map=ListedColormap(#00aaff,#aa00ff,#ffaa00)#生成三个不同颜色的模块,第一列为x轴坐标,第二列为y轴坐标,预测之后,不同的点分成不同的三类plt.title(Naive Bayesian algorithm)plt.scatter(X_test:,0,X_test:,1,c=y_)朴素贝叶斯 执行结果决策树 决策树(decision tree)是一种基本的分类与回归方法。决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。它可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。其主要优点是模型具有可读
25、性,分类速度快。学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型。预测时,对新的数据,利用决策树模型进行分类。决策树学习通常包括3个步骤:特征选择、决策树的生成和决策树的修剪。决策树 基本思想基本思想1)树以代表训练样本的单个结点开始。2)如果样本都在同一个类则该结点成为树叶,并用该类标记。3)否则,算法选择最有分类能力的属性作为决策树的当前结点4)根据当前决策结点属性取值的不同,将训练样本分为若干子集,每个取值形成一个分枝,有几个取值形成几个分枝。匀针对上一步得到的一个子集,重复进行先前步骤,递归形成每个划分样本上的决策树。一旦一个属性出现在一个结点上,就不必在该结点的任何后代考
26、虑它。5)递归划分步骤仅当下列条件之一成立时停止:给定结点的所有样本属于同一类。没有剩余属性可以用来进一步划分样本在这种情况下使用多数表决,将给定的结点转换成树叶,并以样本中元组个数最多的类别作为类别标记,同时也可以存放该结点样本的类别分布,如果某一分枝tc,没有满足该分支中已有分类的样本,则以样本的多数类创建一个树叶。决策树 算法实践from sklearn.datasets import load_irisfrom sklearn import preprocessingfrom sklearn.model_selection import train_test_splitfrom skl
27、earn.tree import DecisionTreeClassifierfrom sklearn.tree import export_graphvizfrom six import StringIOimport pydotplusfrom IPython.display import display,Imageiris=load_iris()x=iris.data#数据特征y=iris.target#数据特征x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=1)scaler=pre
28、processing.StandardScaler().fit(x_train)x1_train=scaler.transform(x_train)x1_test=scaler.transform(x_test)clf=DecisionTreeClassifier(criterion=entropy)clf.fit(x_train,y_train)决策树y_pre=clf.predict(x1_test)print(clf.score(x1_test,y_test)import osos.environPATH+=os.pathsep+C:Program Files(x86)Graphviz2
29、.38bindot_data=StringIO()export_graphviz(clf,out_file=dot_data,feature_names=iris.feature_names,class_names=iris.target_names,filled=True,rounded=True,special_characters=True)graph=pydotplus.graph_from_dot_data(dot_data.getvalue()graph.write_png(iris.png)display(Image(graph.create_png()决策树随机森林-组合方法、
30、集成学习 实际中,只使用单一模型决定一组数据的分类常常并不现实,一个对数据分类描述比较 清晰的模型也许异常复杂,只使用一种准则建立的模型很难避免不出现过度拟合。组合模型是一个思路,它的基本原理是:用现成的方法建立一些精度不高的弱分类器或 回归,将这些效果粗糙的模型组合起来,形成一个分类系统,达到改善整体模型性能的 效果。组合方法是近年来机器学习领域中的研究热点之一。经典的三个组合方法是AdaBoost、Bagging和随机森林随机森林。随机森林 根据下列算法而建造每棵树 :用N来表示训练用例(样本)的个数,M表示特征数目。输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M。从
31、N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。对于每一个节点,随机选择m个特征,决策树上每个节点的决定都是基于这些特征确定的。根据这m个特征,计算其最佳的分裂方式。每棵树都会完整成长而不会剪枝,这有可能在建完一棵正常树状分类器后会被采用)。随机森林 算法实践import numpy as npimport matplotlib.pyplot as pltfrom matplotlib.colors import ListedColormapfrom sklearn.ensemble import Ra
32、ndomForestClassifierfrom sklearn.ensemble import ExtraTreesClassifierfrom sklearn.datasets import load_irisRF=RandomForestClassifier(n_estimators=100,n_jobs=4,oob_score=True)iris=load_iris()x=iris.data:,:2y=iris.targetRF.fit(x,y)h=.02cmap_light=ListedColormap(#FFAAAA,#AAFFAA,#AAAAFF)随机森林cmap_bold=Li
33、stedColormap(#FF0000,#00FF00,#0000FF)for weight in uniform,distance:x_min,x_max=x:,0.min()-1,x:,0.max()+1 y_min,y_max=x:,1.min()-1,x:,1.max()+1 xx,yy=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h)z=RF.predict(np.c_xx.ravel(),yy.ravel()z=z.reshape(xx.shape)plt.figure()plt.pcolormesh(xx
34、,yy,z,cmap=cmap_light)plt.scatter(x:,0,x:,1,c=y,cmap=cmap_bold,edgecolors=k,s=20)plt.xlim(xx.min(),xx.max()plt.title(RandomForestClassifier)plt.show()随机森林 运行结果K均值聚类算法 k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表
35、一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小K均值聚类算法 算法实践#!/usr/bin/env python#coding:utf-8 import matplotlib.pyplot as plt import numpy as np from sklearn.cluster import KMeans from sklearn.datasets import load_iris iris=load_iri
36、s()X=iris.data:K均值聚类算法#绘制数据分布图 plt.scatter(X:,0,X:,1,c=red,marker=o,label=see)plt.xlabel(petal length)plt.ylabel(petal width)plt.legend(loc=2)plt.show()estimator=KMeans(n_clusters=3)#构造聚类器 estimator.fit(X)#聚类 label_pred=estimator.labels_#获取聚类标签K均值聚类算法#绘制k-means结果x0=Xlabel_pred=0 x1=Xlabel_pred=1x2=Xlabel_pred=2plt.scatter(x0:,0,x0:,1,c=red,marker=o,label=label0)plt.scatter(x1:,0,x1:,1,c=green,marker=*,label=label1)plt.scatter(x2:,0,x2:,1,c=blue,marker=+,label=label2)plt.xlabel(petal length)plt.ylabel(petal width)plt.legend(loc=2)plt.show()K均值聚类算法 运行结果