数据科学基础 课件 6.2 分类与回归_第1页
数据科学基础 课件 6.2 分类与回归_第2页
数据科学基础 课件 6.2 分类与回归_第3页
数据科学基础 课件 6.2 分类与回归_第4页
数据科学基础 课件 6.2 分类与回归_第5页
已阅读5页,还剩128页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

6.2分类6.2.1性能评估与模型验证常用分类算法分类器性能评估sklearn中的metrics类模型验证6.2.2k近邻6.2.3朴素贝叶斯分类器6.2.4支持向量机(SVM)6.2.5决策树126.2.1性能评估与模型验证|常用分类算法朴素贝叶斯k近邻法支持向量机(SupportVectorMachine)决策树(DecisionTree)神经网络(NeuralNetwork)集成学习(EnsembleLearning)常用分类算法:

36.2.1性能评估与模型验证|分类器性能评估预测为正类预测为负类真实是正类ab真实是负类cd真实预测

例假定一文本中有100个词,20个地名(正类),80个非地名(负类)分类结果:30个地名,其中15是真的地名,15个不是70个非地名,其中65个真的不是地名,5个是地名46.2.1性能评估与模型验证|分类器性能评估预测为正类预测为负类真实是正类155真实是负类1565真实预测准确率:80/100精确率:15/30召回率:15/20F1得分:30/5056.2.1性能评估与模型验证|sklearn中的metrics类数据集划分为训练集和测试集两部分:用训练集数据训练模型、用测试集数据来测试模型。sklearn.metrics模块中提供模型评估的常用方法函数,有:

预测结果的准确率accuracy_score(y,predicted_y)

混淆矩阵计算metrics.confusion_matrix(y,predicted_y)分类性能报告metrics.classification_report(y,predicted_y)参数:y:待预测量的真实值Predicted_y:模型预测结果66.2.1性能评估与模型验证|例6.1iris数据集(4)(4)如何评估前面建立的分类器的分类结果?

分别用sklearn.metrics中的accuracy_score、classification_report、confusion_matrix评估分类器的性能。有监督学习的基本步骤:选择模型类选择模型超参数用模型拟合训练数据用模型预测新数据的标签76.2.1性能评估与模型验证|模型验证模型验证的常用方法:留出法、交叉验证法sklearn.naive_bayes.GaussianNB如何验证选中的模型和超参数是否已经很好地拟合了数据呢?思考:可否用一套数据训练模型,又用它评估模型?为什么?常用模型验证方法:(1)留出法:从原训练集中留出一部分用来验证模型性能。(2)k折交叉验证法:将所有训练样本分为k个子集,其中k-1个作为训练集,剩下的1个作为验证集;然后更换验证子集,使得每个子集均做一次验证集,交叉验证总共重复k次;最后将k次验证结果的均值作为最终的结果。优点:所有样本都被作为了训练集和验证集,每个样本都被验证一次。这样在多个模型比较中,用k折交叉验证结果来评估各模型准确性,更准确。极端情况只留一个样本做验证,其余样本全用于训练,称为LOO(Leave-One-Out)交叉验证,即留一法。86.2.1性能评估与模型验证|模型验证训练集模型验证的主要目的是为了选择最优模型。主要挑战是算法必须能在先前未观测的新输入上表现良好。在先前未观测到的输入上表现良好的能力被称为泛化(generalization)。6.2.1性能评估与模型验证|选择最优模型模型对数据过拟合(overfitting):过拟合是指训练误差和测试误差之间的差距太大。另一种说法是模型具有高方差。模型对数据欠拟合(underfitting):欠拟合是指模型不能在训练集上获得足够低的误差。另一种说法是模型具有高偏差。用线性函数拟合数据用二次函数拟合数据用9阶多项式拟合数据若模型效果不好,如何改进?可能的答案:用更复杂/更灵活的模型用更简单/更确定的模型采集更多的训练样本为每个样本采集更多的特征sklearn.model_selection.cross_val_score方法:k折交叉验证评分

cross_val_score(estimator,X,y,cv=3,…)106.2.1性能评估与模型验证|cross_val_score参数estimator:待训练的模型X:list或array;待拟合的特征矩阵y:array;目标向量(监督学习)cv:int,交叉验证折数,默认值3返回值scores:实型数组;评估器每次运行交叉验证得分构成的数组。6.2分类6.2.1性能评估与模型验证6.2.2k近邻法K近邻分类思想Scikit-learn中kNN类构建kNN分类器的步骤模型验证最优模型选择6.2.3朴素贝叶斯分类器6.2.4支持向量机(SVM)6.2.5决策树11126.2.2k近邻法|思想K近邻法(KNearestNeighbors,KNN)最简单思想:新数据点的预测结果由距离其最近的k个“邻居”的信息决定。判断x属于哪个类别:找出距离x最近K个邻居

看K个邻居分别属于哪个类别,最多的类别就是x的类别欧氏距离136.2.2k近邻法|思想可见,K值是影响KNN分类算法性能的一个关键因素146.2.2k近邻法|KNN算法关键因素对K进行枚举(从较小的K开始,不断增加),通过交叉验证,最终找到一个的K值KNN分类算法的关键:K值、距离1.K:超参数156.2.2k近邻法|KNN算法关键因素KNN分类算法的关键:K值、距离2.距离:超参数

166.2.2k近邻法|k近邻分类算法

输入:已知类别训练集(X,y)数据,待预测类别的新数据inX,近邻个数k过程:选择一种距离度量方法(如欧氏距离),计算训练集中的每个点与新数据点之间的距离;按距离递增次序排序;确定前k个点所在类别的出现频率返回前k个点出现频率最高的类别,作为新数据点的预测类别。输出:新数据的类别标签labelY默认使用欧式距离,它在多数情况下效果都很好。17k近邻分类器代码新建:kNearest_Neighbor_Classifier.py功能:实现k近邻分类器类kNNClassifier距离:欧氏距离存储训练样本例6.3编写k近邻类18新建:kNearest_Neighbor_Classifier.py功能:实现k近邻分类器类kNNClassifier距离:欧氏距离对每个测试样本:

找它的k个近邻训练样本

预测这k个样本的出现频次最高的类标19例6.4kNN鸢尾花分类例6.4kNN鸢尾花分类用例6.3编写的k近邻类kNNClassifier,训练一个k为3的k近邻分类器,计算该分类器的分类准确率、混淆矩阵,输出分类性能报告。20例6.4#1.读iris.csv数据importpandasaspdiris=pd.read_csv(r'..\datasets\iris.csv')iris.head(3)#2.整理数据X=iris.drop('species',axis=1)#特征矩阵Xy=iris['species']#目标数组yimportnumpyasnpX=np.array(X)#转换为(n,d)的numpy数组y=np.array(y,np.newaxis)#转换为(n,1)的numpy数组fromsklearn.model_selectionimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(X,y,random_state=0)#划分数据集21例6.4(续)

#3.创建k=3的近邻分类器,然后训练fromkNNimportkNNClassifier#导入自定义KNNClassifier类clf=kNNClassifier(3)#初始化k=3的近邻分类器clf.train(X_train,y_train)#训练y_pred=clf.predict(X_test)#预测#4.评估模型性能fromsklearnimportmetricsscore=metrics.accuracy_score(y_test,y_pred)print('测试集上分类准确率为:{:.4f}'.format(score))mat=metrics.confusion_matrix(y_test,y_pred)#计算混淆矩阵print("混淆矩阵:\n",mat)print("分类性能报告:")print(metrics.classification_report(y_test,y_pred))scikit-learn中的k近邻分类评估器

sklearn.neighbors.KNeighborsClassifier(n_neighbors=k,p=2)主要参数:n_neighbors:int,用来设置近邻个数k,是超参数,默认为5。k=1,称为最近邻法。p:默认值2,minkowski距离的幂次主要方法:

fit(X_train,y_train):用训练集数据训练模型。predict(X_new):预测新数据的类别。score(X_test,y_test):返回模型分类准确度。

kneighbors(X,n_neighbors,return_distance):找X的k个近邻,返回k近邻的索引,及其与X的距离。若return_distance=False,则不返回距离,其默认值为True。226.2.2k近邻法|Sklearn中kNN分类评估器fromsklearn.neighborsimportKNeighborsClassifierknn=KNeigborsClassifier(n_neighbors=3)

例6.5一个简单的kNN分类器(1)生成带标签的数据集(X,y),含100个样本,每个样本有2个特征,分属2个类别。数据在中心点(-2,1)和(0,2)周围呈高斯分布。

(2)试用sklearn.neighbors的KNeighborsClassifier,建一个k=5的kNN分类器,预测两个新样本(-1,3)和(-0.9,1.1)的类别,并评估预测的准确率。23

6.2.2k近邻法|例6.5一个简单的kNN分类器利用sklearn.datasets下的make_blobs函数,生成各向同性的呈高斯分布的数据集。

make_blobs(n_samples=100,n_features=2,centers=None,cluster_std=1.0,random_state=None,…)参数:n_samples:生成的样本个数,默认100

n_features:每个样本的特征个数,默认2centers:默认值为None,生成的样本中心个数或样本中心位置cluster_std:聚类簇的标准差,默认值为1.0random_state

随机数种子,以便多次调用产生相同结果。返回值:X

:

[n_samples,n_features]

的数组,生成的样本集。y

:

[n_samples]

的数组,样本对应的类标签数组。24

6.2.2k近邻法|例6.4一个简单的kNN分类器|生成数据的方法25#100个样本点,2个特征。分布在centers参数所指定的2个中心点(-2,1)和(0,2)周围。#分布的标准差cluster_std设为0.6。生成数据(特征矩阵)放在X中,其类别标记存入y中。fromsklearn.datasetsimportmake_blobscenters=[(-2,1),(0,2)]X,y=make_blobs(n_samples=100,centers=centers,random_state=0,cluster_std=0.6)1.生成数据集#拆分数据集fromsklearn.model_selectionimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(X,y,random_state=0)fromsklearn.neighborsimportKNeighborsClassifierclf=KNeighborsClassifier(n_neighbors=5)#初始化模型clf.fit(X_train,y_train)#训练模型2.模型初始化与训练3.对新数据点(-1,3)和(-0.9,1.1)进行预测importnumpyasnpX_sample=np.array([[-1,3],[-0.9,1.1]])#输入必须是二维数组y_sample=clf.predict(X_sample)neighbors=clf.kneighbors(X_sample,return_distance=False);#取出最近的5个点print("KNeighborsClassifier分类器预测结果:{}".format(y_sample))例6.426#把待预测的新数据以及和它最近的5个样本点标出来%matplotlibinlineimportmatplotlib.pyplotaspltplt.figure(figsize=(16,10),dpi=144)c0=[idxforidx,iteminenumerate(y_train)ifitem==0]#0类样本索引集合c1=[idxforidx,iteminenumerate(y_train)ifitem==1]#1类样本索引集合plt.scatter(X_train[c0,0],X_train[c0,1],marker='*',c='c',s=100,cmap='cool')#0类样本点,用蓝绿色('c':cyan)星号绘制plt.scatter(X_train[c1,0],X_train[c1,1],marker='o',c='m',s=100,cmap='cool')#1类样本点,用洋红色('m':magenta)圆点绘制c=np.array(centers)plt.scatter(c[:,0],c[:,1],s=100,marker='^',c='k')#中心点,用黑色三角绘制color=['c','m']foridx,iteminenumerate(y_sample[:]):plt.scatter(X_sample[idx,0],X_sample[idx,1],marker="x",c=color[item],s=100)#待预测点foriinneighbors[0]:#第一个样本到5个近邻的连线

plt.plot([X_train[i][0],X_sample[0][0]],[X_train[i][1],X_sample[0][1]],'k--',linewidth=0.6)foriinneighbors[1]:#第二个样本到5个近邻的连线

plt.plot([X_train[i][0],X_sample[1][0]],[X_train[i][1],X_sample[1][1]],'k--',linewidth=0.6)4.画出示意图5.评估模型print("分类准确率:{:.2f}".format(clf.score(X_test,y_test)))27

6.2.2k近邻法|例6.4一个简单的kNN分类器(-1,3)的类别(-1,1)的类别预测精度k=5100.92k=3100.96图1k=5时分类结果图2k=3时分类结果(3)将近邻数改为3,用同样的训练集重新训练一个模型,预测同样新数据的类别,并用同样的测试集评估两个模型的性能。超参数k:即近邻个数k。当k取不同值时,分类结果会有显著不同。实践中,使用较小的k(如3或5)往往得到较好的结果,但需要调节这个参数。距离测度:采用不同的距离测度,找出的“近邻”可能有显著差别,从而也会导致分类结果有显著不同。默认使用欧式距离,它在多数情况下效果都很好。28

6.2.2k近邻法|影响k近邻分类的主要因素测试样本在k=3时被判为类,k=5时被判为

类。

加权kNN:使用加权距离,对不同的邻居指定不同的距离权重,距离越近权重越高。sklearn.neighbors中的KNeighborsClassifier参数weights设置为'distance'。

KNeighborsClassifier(n_neighbors=k,weights='distance')指定半径的kNN:用指定半径内的点取代距离最近的k个点。当数据采样不均匀时,该法可取得更好的性能。sklearn.neighbors中RadiusNeighborsClassifier评估器类

RadiusNeighborsClassifier(radius=1.0)296.2.2k近邻法|kNN算法的改进加权kNN,k=5时测试样本被判为?类。目的:模型的比较要求:(1)给定糖尿病数据集,试比较K近邻、加权K近邻、指定半径的K近邻算法的分类性能。(2)选出性能最好的模型,训练并计算其性能评分,分析结果;通过学习曲线、数据可视化验证结论。30

6.2.2k近邻法|例6.6kNN糖尿病预测

数据来源:

/uciml/pima-Indians-diabetes-database.数据简介:768个样本,9列信息(8列是特征,Outcome列为类别标签,0表示没有糖尿病(阴性),1表示由糖尿病(阳性))。768个样本中阴性样本500例,阳性样本268例。8个特征及其涵义如下表所示:316.2.2k近邻法|例6.6kNN糖尿病预测|数据下载PregnanciesGlucoseBloodPressureSkinThicknessInsulinBMIDiabetesPedigreeFunctionAge怀孕的次数血浆葡萄糖浓度舒张压(毫米汞柱)肱三头肌皮肤褶皱厚度(毫米)两个小时血清胰岛素(μU/毫升)身体质量指数,体重除以身高的平方糖尿病血统指数,糖尿病和家庭遗传相关。年龄Sklearn提供了内置函数可获取该数据集,sklearn.datasets.load_diabetes326.2.2k近邻法|例6.6kNN糖尿病预测|Diabetes数据集的部分数据数据准备:处理数据:把Outcome列分离出来,作为类别标签存入y;其余8个特征值分离出来,作为行数据存入X。划分数据集:用train_test_split(),把数据集(X,y)划分为训练集(X_train,y_train)和测试集(X_test,y_test)。模型比较:待比较模型:KNN、带权KNN、指定半径的KNN分类器比较1:用训练集分别训练以上3个模型,并计算在测试集上的各自评分。比较2:采用交叉验证法(cross_val_score函数),计算各模型准确性评分的平均值,以提高模型评价的准确度。模型分析:选择评分平均值最高的模型,再次用数据集训练该模型,计算评分,并分析结果。画出学习曲线,证实结论。选择与输出值最相关的两个特征,画出数据分布图,进一步证实结论。336.2.2k近邻法|例6.6kNN糖尿病预测|模型比较与分析关键代码(1)#1.加载数据,下载diabetes.csv存入当前程序所在文件夹importpandasaspddata=pd.read_csv('diabetes.csv')#返回DataFrame类型的数据X=data.iloc[:,0:8]#将8个特征值分离出来,存入Xy=data.iloc[:,8]#outcome列分离出来作为目标值存入yfromsklearn.model_selectionimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)#划分数据集#2.构造3个模型fromsklearn.neighborsimportKNeighborsClassifier,RadiusNeighborsClassifiermodels=[]models.append(("KNN",KNeighborsClassifier(n_neighbors=3)))#k=3models.append(("KNNwithweights",KNeighborsClassifier(n_neighbors=3,weights="distance")))#权重算法:距离越近,权重越高models.append(("RadiusNeighbors",RadiusNeighborsClassifier(radius=500.0)))#模型半径设为50034例6.6#3.分别训练3个模型,并计算模型评分(实现模型比较1)results=[]forname,modelinmodels:model.fit(X_train,y_train)results.append((name,model.score(X_test,y_test)))foriinrange(len(results)):print("name:{};score:{:.4f}".format(results[i][0],results[i][1]))#4.利用scikit-learn提供的cross_val_score(实现模型比较2)fromsklearn.model_selectionimportcross_val_scoreresults=[]forname,modelinmodels:cv_result=cross_val_score(model,X_train,y_train,cv=10)

#10折交叉验证results.append((name,cv_result))#3种模型,均得到10次评分foriinrange(len(results)):print("name:{};crossvalscore:{:.4f}".format(results[i][0],results[i][1].mean()))#求每种模型10次评分的平均值关键代码(2)#5.选择评分最高的KNN模型,训练并评估knn=KNeighborsClassifier(n_neighbors=3)#k=3knn.fit(X_train,y_train)train_score=knn.score(X_train,y_train)test_score=knn.score(X_test,y_test)print("trainscore:{:.4f};testscore:{:.4f}".format(train_score,test_score))完整代码:例6knn预测糖尿病.ipynb关键代码(3)分析:观察学习曲线,训练样本得分不高,且测试样本与训练样本距离较大。这是典型的欠拟合现象。KNN算法没有更好的措施解决欠拟合问题。由此可见,KNN算法对该问题不是一个好模型。(自定义了函数plot_learning_curve(),用于画学习曲线。)376.2.2k近邻法|例6.6kNN糖尿病预测|学习曲线38

6.2.2k近邻法|验证曲线与学习曲线模型得分模型复杂度训练得分验证得分高偏差高方差最优模型模型得分训练数据集规模训练得分验证得分高方差效果好验证曲线学习曲线影响模型效果的因素有两个:模型的复杂度和训练数据集的规模。分析:从图可看出,在中间数据密集区域,阳性样本与阴性样本几乎重叠在一起。现假设有一个待预测样本在中间密集区域,那么它的阳性近邻多还是阴性近邻多呢?很难确定。可直观地看到,KNN算法对这个糖尿病预测问题无法到达很高的预测准确性。396.2.2k近邻法|例6.6kNN糖尿病预测|数据可视化结果KNN算法性能缺陷:KNN是一种懒惰算法,平时不好好学习,考试(对测试样本分类)时才临阵磨枪(临时去找k个近邻)。懒惰的后果:构造模型很简单,但在对测试样本分类时的系统开销大,因为要扫描全部训练样本并计算距离。该算法对有很多特征的数据集效果不好,对稀疏数据集效果尤其不好。406.2.2k近邻法|KNN算法性能提升性能改进416.2.2k近邻法|特点KNN特点:非参的、惰性的1.非参的:不会对数据做出任何的假设,线性回归假设数据是一条直线2.惰性有:没有明确的训练数据的过程KNN算法优点:

简单易用

模型训练时间快对异常值不敏感KNN算法缺点:存储空间要求较高(存储了所有训练数据)预测阶段可能很慢(计算与所有点的距离)42构建kNN分类器的主要步骤:1.整理数据,包括数据集拆分2.选择模型类,初始化模型

fromsklearn.neighborsimportKNeighborsClassifierknn=KNeighborsClassifier(n_neighbors=k)

3.拟合数据,knn.fit(X_train,y_train)4.评估模型,knn.score(X_test,y_test)cross_val_score(knn,X_train,y_train,cv=5)5.预测新数据,knn.predict(X_new)小结6.2分类6.2.1引例鸢尾花分类6.2.2k近邻6.2.3朴素贝叶斯分类器原理Scikit-learn中朴素贝叶斯分类器在文本分类上的应用6.2.4支持向量机(SVM)6.2.5决策树431.病人分类问题6.2.3朴素贝叶斯分类器|原理已有六例病人:症状职业疾病(类标签)打喷嚏护士感冒打喷嚏农夫过敏头痛建筑工人脑震荡头痛建筑工人感冒打喷嚏教师感冒头痛教师脑震荡第七例病人:打喷嚏的建筑工人,患上感冒的概率有多大?离散特征贝叶斯定理:后验概率P(A|B)=P(B|A)P(A)/P(B)6.2.3朴素贝叶斯分类器|原理

朴素,独立性假设☞☞☞朴素贝叶斯分类的原理:6.2.3朴素贝叶斯分类器|原理

朴素贝叶斯分类器:2.性别分类6.2.3朴素贝叶斯分类器|原理性别身高(英尺)体重(磅)脚掌(英寸)男6

180

12

男5.92

190

11

男5.58

170

12

男5.92

165

10

女5

100

6

女5.5

150

8

女5.42

130

7

女5.75

150

9

问题:某人身高6英尺、体重130磅,脚掌8英寸,男是女?难点:身高、体重、脚掌都是连续特征,不能采用离散特征的方法计算概率。由于样本太少,所以也无法分成区间计算。假定:正态分布,通过均值和方差得到正态分布的密度函数,通过密度函数算出值不能离散化的连续特征2.性别分类6.2.3朴素贝叶斯分类器|原理假定:男性身高正态分布(均值5.855、方差0.035)男性的身高为6英尺,其概率约等于1.5789P(身高=6|男)xP(体重=130|男)xP(脚掌=8|男)xP(男)

=6.1984e-9P(身高=6|女)xP(体重=130|女)xP(脚掌=8|女)xP(女)

=5.3778e-4故,推测为女性。朴素贝叶斯分类器,基于贝叶斯判定准则,其数学基础是贝叶斯公式。496.2.3朴素贝叶斯分类器|原理

贝叶斯决策是使后验概率最大的决策,这样的决策错误率最小。506.2.3朴素贝叶斯分类器|原理|贝叶斯判定准则

朴素贝叶斯分类器表达式516.2.3朴素贝叶斯分类|原理|概率估计

(1)(2)Scikit-learn中实现了三种朴素贝叶斯分类,根据对数据分布的不同假设,分别为:高斯朴素贝叶斯,假设每个类标签的数据服从简单的高斯分布,输入数据为连续数据。

sklearn.naive_bayes包中的GaussianNB评估器多项式朴素贝叶斯,假设每个类标签的数据由简单多项式分布生成的,输入数据为计数数据(即每个特征代表某个对象的整数计数,如一个单词在句中出现的次数)。sklearn.naive_bayes包中的MultinomialNB评估器伯努利朴素贝叶斯,假设每个类标签的数据服从伯努利分布,输入数据为二分类数据。

sklearn.naive_bayes包中的BernoulliNB评估器说明:GaussianNB主要用于连续的高维数据;BernoulliNB和MultinomialNB主要稀疏计数数据,如文本分类。MultinomialNB性能优于BernoulliNB,特别是包含很多非零特征的数据集(即大型文档)上。526.2.3朴素贝叶斯分类器|sklearn中的朴素贝叶斯文本数据:自由格式的字符串数据,由短语或句子组成。如聊天记录和酒店评论、维基百科内容等。这些集合包含的信息大多是由单词组成的句子。语料库:在文本分析的语境下,数据集通常被称为语料库(corpus);文档:每个由单个文本表示的数据点被称为文档(document)文本表示方法:将文本转换成一组数值,以便用于机器学习。词袋(bag-of-words):计算语料库中每个单词在每个文本中的出现频次。最简单的方法。对于文档语料库,计算词袋表示包括三个步骤:分词、构建词表、编码。分词(tokenization):将每个文档划分为出现在其中的单词[称为词例(token)],如按空格和标点划分。构建词表(vocabularybuilding):收集一个词表,里面包含出现在任意文档中的所有单词,并对它们进行编号(比如按字母顺序排序)。编码(encoding):对于每个文档,计算词表中每个单词在该文档中的出现次数。sklearn.feature_extraction.text中的CountVectorizer类实现了词袋表示

fromsklearn.feature_extraction.textimportCountVectorizer

CountVectorizer作用:将文本文档集合转换为词例计数矩阵536.2.3朴素贝叶斯分类器|在文本分类上的应用|词袋表示546.2.3朴素贝叶斯分类器|在文本分类上的应用|词袋处理过程语料库词例计数矩阵‘problem

of

evil’[‘evil’,‘horizon’,‘of’,‘problem’,‘queen’][‘problem’,‘of’,‘evil’]Evilhorizonofproblemqueen[1,0,1,1,0]分词器对所有文档构建一个词表稀疏矩阵编码图1词袋处理过程例6-5一个包含4个样本的语料库,要求:(1)利用CountVectorizer进行词袋表示。556.2.3朴素贝叶斯分类器|在文本分类上的应用|例6-5文本表示(1)CountVectorizer的常用方法作用fit_transform(raw_documents)参数:raw_documents语料库返回值:X文档-词矩阵(n_samples,n_features)拟合语料库数据并返回文档-词矩阵(即词袋表示)get_feature_names()返回值:feature_names特征名称列表从特征索引到特征名称的数组映射。fromsklearn.feature_extraction.textimportCountVectorizervec=CountVectorizer()#实例化X=vec.fit_transform(corpus)#拟合语料库数据并返回文档-词矩阵print(vec.get_feature_names())#返回特征名称print(X.toarray())#将稀疏矩阵转换为数组,输出#表示为带列标签的DataFrameimportpandasaspdpd.DataFrame(X.toarray(),columns=vec.get_feature_names())corpus=['thisisthefirstdocument','thisdocumentistheseconddocument','andthisisthethirdone','isthisthefirstdocument']词袋表示的缺点:会使一些常用词权重过高。解决方法:TF-IDF(termfrequency-inversedocumentfrequency,词频-逆文档频率),通过单词在文档中出现的频率来衡量其权重。对在某个特定文档中经常出现的术语给予很高的权重,但对在语料库的许多文档中都经常出现的术语给予的权重却不高。如果一个单词在某个特定文档中经常出现,但在许多文档中却不常出现,那么这个单词很可能是对文档内容的很好描述。Scikit-learn中的TfidfVecotorizer类和TfidfTransformer类实现了是TF-IDF方法。TfidfTransformer接受CountVectorizer生成的稀疏矩阵并将其变换。TfidfVecotorizer接受文本数据并完成词袋特征提取与tf-idf变换。单词w在文档d中的tf-idf分数计算公式如下:

566.2.3朴素贝叶斯分类器|在文本分类上的应用|TF-IDF表示

576.2.3朴素贝叶斯分类器|在文本分类上的应用|例6-5文本表示(2)例6-5一个包含4个样本的语料库,要求:(2)利用TfidfVectorizer进行tfidf表示。corpus=['thisisthefirstdocument','thisdocumentistheseconddocument','andthisisthethirdone','isthisthefirstdocument']例6-6文本分类对20个网络新闻组语料库(约20000篇新闻),以TF-IDF作为特征,用多项式朴素贝叶斯对该新闻组分类。586.2.3朴素贝叶斯分类器|在文本分类上的应用|例6-6文本分类1.载入数据fromsklearn.datasetsimportfetch_20newsgroupsdata=fetch_20newsgroups()data.target_names#为简化演示过程,只选择4类新闻,下载训练集和测试集:categories=['talk.religion.misc','soc.religion.christian','sci.space','comp.graphics']train=fetch_20newsgroups(subset='train',categories=categories)#加载指定类别的训练集test=fetch_20newsgroups(subset='test',categories=categories)2.TF-IDF特征向量化与多项式朴素贝叶斯组合成管道fromsklearn.feature_extraction.textimportTfidfVectorizerfromsklearn.naive_bayesimportMultinomialNBfromsklearn.pipelineimportmake_pipelinemodel=make_pipeline(TfidfVectorizer(),MultinomialNB())3.模型训练、预测model.fit(train.data,train.target)labels=model.predict(test.data)4.画混淆矩阵fromsklearn.metricsimportconfusion_matriximportmatplotlib.pyplotaspltimportseabornassns;sns.set()mat=confusion_matrix(test.target,labels)sns.heatmap(mat,square=True,annot=True,fmt='d',cbar=False,xticklabels=train.target_names,yticklabels=train.target_names)plt.xlabel('truelabel')plt.ylabel('predictedlabel’)plt.show()5960fromsklearnimportmetricsprint('模型的准确率为:\n',metrics.accuracy_score(test.target,labels))print('模型的评估报告:\n',metrics.classification_report(test.target,labels))5.模型性能评估6.对任意字符串进行分类pred=model.predict(['sendingapayloadtotheISS'])train.target_names[pred[0]]61朴素贝叶斯特点和应用场景特点训练和预测的速度快直接使用概率预测,很容易解释可调参数非常少应用场景假设分布函数与数据匹配(实际中很少见)各种类型的区分度很高,模型复杂度不重要非常高维度的数据,模型复杂度不重要6.2分类6.2.1引例鸢尾花分类6.2.2k近邻6.2.3朴素贝叶斯分类器6.2.4支持向量机最大间隔准则核技巧scikit-learn中的SVM人脸识别上的应用6.2.5决策树62对有些数据集,能通过一直线、平面、超平面,将两类样本清晰分开。这样的数据集被称为是线性可分的。这样的分类器是线性分类器。636.2.4支持向量机|引子

0问:此图中将两类样本分开的分类线有多条,哪一个好呢?答:选择“正中间”,因为这条分类线离两类样本最远。

问题转化为找到正中间的那条线646.2.4支持向量机|引子

|最优超平面

0最优超平面(optimalhyperplane)与两类中最靠近的样本点的距离同时达到最大的超平面,称为“最优分类超平面”(简称“最优超平面”)间隔(margin)两类样本中离分类面最近的样本到分类面的距离称作分类间隔(简称“间隔”)。最优超平面是具有最大间隔的超平面。

最优超平面怎样才能找到最优分类超平面?支持向量机(SupportVectorMachine,SVM)是基于最优化技术,求解最优超平面,将两种不同类别的样本分开的方法。656.2.4支持向量机|思想6.2.4支持向量机|支持向量0支持向量间隔边界最优超平面间隔边界间隔支持向量(SupportVector)两类中与最优超平面最靠近的样本,称为支持向量,穿过支持向量与最优超平面平行的两个超平面(虚线所示),称为间隔边界。

寻找最优超平面,即寻找间隔最大的超平面。支持向量是用来确定间隔的样本,通常是那些最难被分类,却能给分类器提供最多信息的样本。6.2.4支持向量机|最大间隔准则

两分类问题

有些数据集,在原空间中找不到一个超平面划分各类,而适当地映射到高维空间后,则能找到一个超平面将不同类别的数据分开。6.2.4支持向量机|核技巧原空间变换变换后的特征空间

SVM核函数6.2.4支持向量机|核技巧

3维向量变换成9维向量6.2.4支持向量机|核技巧6.2.4支持向量机|核技巧

多项式核函数6.2.4支持向量机|核技巧K(x,y)=<f(x),f(y)>

如果有一个函数K,得到与<f(x),f(y)>相同的结果,而无需计算f(x)和f(y),则称K为核函数。有些数据集不是线性可分的,即使采用核技巧也不能完全分开,如存在离群点(outlier,也称异常值)。6.2.4支持向量机|软间隔最大化

支持向量机既可用于分类,又可用于回归。sklearn.svm模块给出了多个SVM算法实现,包括:分类算法:SVC,LinearSVC,NuSVC均适用于多类问题.回归算法:SVR,LinearSVR,NuSVR746.2.4支持向量机|scikit-learn中的SVM左图是鸢尾花(iris)数据集上,选择不同核函数的SVM分类器的分类效果。SVC用线性核SVC用高斯核SVC用多项式核(3阶)线性SVC(线性核)/stable/modules/svm.html#svm.tw/~cjlin/papers/libsvm.pdf

756.2.4支持向量机|Scikit-learn中SVC类

sklearn.svm.SVC(C,kernel=,gamma,…)

目的:SVM两分类;预处理(规范化)数据;SVM调参要求:

1.构建RBF核SVM,并应用到乳腺癌数据集上,分析预测结果。2.采用0-1缩放方法预处理数据,使得数据各个特征大致在同一范围变化。

在缩放后的数据上再次拟合SVM,计算预测准确度。3.调节模型参数C和gamma,改进拟合效果。766.2.4支持向量机|例6-7SVM乳腺癌预测

sklearn.datasets包下的cancer数据集:威斯康星州乳腺癌数据集共569个样本(良性357个,恶性212个),30个特征。用sklearn.datasets中load_breast_cancer函数来加载数据。数据集77sklearn.datasets包下的cancer数据集威斯康星州乳腺癌数据集(cancer,里面记录了乳腺癌肿瘤的临床测量数据)每个数据都被标记为“良性”或“恶性”,其任务是基于人体组织的测量数据来学习预测肿瘤是否为恶性。共569个样本(良性357个,恶性212个),30个特征。可利用scikit-learn模块的load_breast_cancer函数来加载数据。fromsklearn.datasetsimportload_breast_cancercancer=load_breast_cancer()#返回类似字典的数据:data是数据,target是类标签;feature_name是特征名,target_name是类名.

78step1.加载数据fromsklearn.datasetsimportload_breast_cancercancer=load_breast_cancer()#返回类似字典的sklearn.utils.Bunch类型对象print("cancer.keys():{}".format(cancer.keys()))#查看cancer数据的keysprint("cancer数据的形状:{}".format(cancer.data.shape))

#查看数据集形状print("cancer数据:\n{}".format(cancer.feature_names))#查看特征名data是数据,target是类标签klearn.utils.Bunch类型对象:

模型建立过程:79step2.构建并训练SVM分类器#拆分数据集,分为训练集(75%)和测试集(25%默认值)fromsklearn.model_selectionimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(cancer.data,cancer.target,random_state=0)fromsklearn.svmimportSVCsvm=SVC(kernel='rbf',C=1.0,gamma=0.1)#构建svm分类器svm.fit(X_train,y_train)#模型训练print("训练集上准确度为:{:.2f}".format(svm.score(X_train,y_train)))print("测试集上准确度为:{:.2f}".format(svm.score(X_test,y_test)))分析:该模型在训练集上准确度为100%,而在测试集上为63%,存在严重过拟合。Cancer数据中特征的变化范围有较大差异。SVM对此非常敏感,要求所有特征有相似的变化范围。解决该问题的一种方法是对每个特征进行缩放,使其大致都在同一范围。常用的缩放变换方法是将所有特征缩放到0和1之间。sklearn库中MinMaxScaler可实现了指定范围的缩放变换。☛80step3.为SVM预处理数据补充:MinMaxScaler是sklearn.preprocessing模块中提供的规范化类。格式sklearn.preprocessing.MinMaxScaler(feature_range=(0,1),copy=True)作用:将特征取值缩放到feature_range指定范围内,默认范围为0-1fromsklearn.preprocessingimportMinMaxScaler

#导入缩放器类scaler=MinMaxScaler()#创建0-1缩放器scaler.fit(X_train)#拟合数据,即计算特征的最大值和最小值X_train_scaled=scaler.transform(X_train)#将X_train缩放到[0,1]内X_test_scaled=scaler.transform(X_test)#将X_test缩放到[0,1]内svm.fit(X_train_scaled,y_train)#在缩放后的训练数据上学习SVMprint("缩放后训练集上准确度:{:.2f}".format(svm.score(X_train_scaled,y_train)))print("缩放后测试集上准确度:{:.2f}".format(svm.score(X_test_scaled,y_test)))分析:缩放处理后,svm的性能有明显提升。但测试集和训练集的准确度非常接近,仍没接近100%的准确度,说明模型处于欠拟合状态。可通过调大模型参数C或gamma来改进。每当数据有新的表示时,都要先fit,再transform81step4.调节SVM模型参数#调大svm参数C或gamma,以拟合更复杂的模型,这里调大Csvm=SVC(C=1000)svm.fit(X_train_scaled,y_train)print("调参后已缩放训练集上准确度:{:.3f}".format(svm.score(X_train_scaled,y_train)))print("调参后已缩放测试集上准确度:{:.3f}".format(svm.score(X_test_scaled,y_test)))结论:1.本例调大C显著地改进了模型。SVM调参是关键。2.SVM对特征尺度变化敏感,不同特征取值范围需规范化。sklearn.model_selection的GridSearchCV元评估器,能自动寻找最优超参数组合。

GridSearchCV(estimator,param_grid,scoring=None,cv,=None…)

穷尽搜索指定评估器的超参数组合,以优化超参数。主要参数:estimator:待优化超参数的评估器对象(即模型对象),如SVC分类器。param_grid:字典型。以评估器的超参数名为键、对应的取值列表作为值。为穷举搜索提供参数取值网格。scoring:准确度评价标准,默认None,这时使用评估器默认的性能评价指标。分类常用‘accuracy’。cv:int型或交叉验证生成器。设置交叉验证拆分策略。默认为None(使用交叉验证默认的3折)。主要方法:

fit(X_train,y_train):运行所有参数集来拟合数据。predict(X_new):用找到的最佳参数配置评估器,以预测新数据。score(X_test,y_test):计算评估器在给定数据上的分类性能得分。主要属性:

best_estimator_:通过搜索选出的评估器,即在验证集上得分最高的评估器。best_params_:在验证集上得分最高的参数组合。补充:网格搜索交叉验证(GridSearchCV)评估器的超参数名查找:estimator.get_params()目的:SVM多分类问题;网格搜索选择最优模型;模型保存与加载要求:

(1)用wild数据集中带标记的人脸图像,用网格搜索工具GridSearchCV,自动寻找SVC(“rbf”核)最优超参数组合。(2)利用joblib保存最优模型到文件中,然后加载模型。836.2.4支持向量机|人脸识别上的应用|例6-8人脸识别

LabeledFacesintheWild数据集网址:/lfw/SVC超参数的待搜索范围如下:C:

[1,5,10,50]gamma

:[0.0001,0.0005,0.001,0.005]84LabeledFacesintheWild数据集:

用sklearn.datasets中的fetch_lfw_people()函数,获取Wild数据集中带标记的人脸图像。

它包括数千张公开的人脸照片,每个图像含[62*47]个像素。为高效处理,先使用PCA(主成分分析)来提取150个主要成分,然后以此为特征,训练SVC。fromsklearn.decompositionimportPCApca=PCA(n_components=150,svd_solver='randomized',whiten=True,random_state=42)#白化提高下游预测精度fromsklearn.datasetsimportfetch_lfw_peoplefaces=fetch_lfw_people(min_faces_per_person=60)#返回bunch类型对象print(faces.target_names)856.2.4支持向量机|例6-8人脸识别|模型建立过程1.获取数据2.创建预处理器和分类器,构成管道#用PCA提取150个基本元素,然后将其提供给SVCfromsklearn.decompositionimportPCAfromsklearn.svmimportSVCfromsklearn.pipelineimportmake_pipelinepca=PCA(n_components=150,svd_solver='randomized',whiten=True,random_state=42)#白化提高下游预测精度svc=SVC(kernel=‘rbf’,class_weight=‘balanced’)#创建分类器

model=make_pipeline(pca,svc)#创建管道86model.get_params()查询model的超参数名87#划分数据集fromsklearn.model_selectionimporttrain_test_splitXtrain,Xtest,ytrain,ytest=train_test_split(faces.data,faces.target,random_state=42)#网格搜索交叉验证,返回最佳模型及其参数fromsklearn.model_selectionimportGridSearchCVparam_grid={'svc__C':[1,5,10,50],'svc__gamma':[0.0001,0.0005,0.001,0.005]}grid=GridSearchCV(model,param_grid,cv=3)%timegrid.fit(Xtrain,ytrain)print(grid.best_params_)#

输出最佳参数组合3.网格搜索最优超参数组合,超参数:svc__C,svc__gamma4.获取最优模型,评估模型model=grid.best_estimator_print("测试集上得分:{:.3f}".format(model.score(Xtest,ytest)))yfit=model.predict(Xtest)885.打印分类性能报告、输出混淆矩阵fromsklearn.metricsimportclassification_reportprint(classification_report(ytest,yfit,target_names=faces.target_names))importseabornassns;sns.set()#设置seaborn绘图风格fromsklearn.metricsimportconfusion_matrixmat=confusion_matrix(ytest,yfit)sns.heatmap(mat.T,square=True,annot=True,fmt='d',cbar=False,xticklabels=faces.target_names,yticklabels=faces.target_names)plt.xlabel('truelabel')plt.ylabel('predictedlabel')89#保存模型,代码如下:importjoblibjoblib.dump(model,'lfw_svm.pkl');#当有新数据需要预测时,可加载模型,导入模型参数,直接进行预测,代码如下:clf=joblib.load('lfw_svm.pkl')Ypred=clf.predict(Xtest[0:4]);6.模型保存与加载Python的joblib模块方法:joblib.dump()保存模型,到指定的文件中

joblib.load()用指定的模型文件加载模型请同学们在鸢尾花数据上,用网格搜索工具GridSearchCV,自动寻找SVC最优超参数组合。

SVC超参数待搜索范围如下:kernel:['linear','rbf','poly']C:[1,5,10,50]gamma:[0.0001,0.001,0.1,1]怎样查找模型的超参数名?模型对象名.get_params()1.导入数据fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitiris=load_iris()X_train,X_test,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论