Python机器学习基础PPT完整全套教学课件_第1页
Python机器学习基础PPT完整全套教学课件_第2页
Python机器学习基础PPT完整全套教学课件_第3页
Python机器学习基础PPT完整全套教学课件_第4页
Python机器学习基础PPT完整全套教学课件_第5页
已阅读5页,还剩534页未读 继续免费阅读

下载本文档

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

文档简介

Python机器学习基础第1章概述第2章Python机器学习的使用第3章监督学习第4章无监督学习第5章数据预处理与特征工程第6章模型评估及改进第7章算法链第8章文本数据处理全套PPT课件第1章概述1.1什么是机器学习1.2机器学习的算法1.3监督学习1.4无监督学习1.5数据集1.6机器学习项目的流程1.7小结1.1什么是机器学习

机器学习(machinelearning)它属于人工智能的一个分支,因由统计学发展而来,算法中包含了大量的统计学知识和理论,所以又被称为统计学习(statisticallearning)。

北方人理想体重=(身高cm-150)×0.6+50(kg)南方人理想体重=(身高cm-150)×0.6+48(kg)

机器学习还可以利用机器来模拟人类的思维进行工作,来适应不同环境下的各种工作,以实现人类难以完成的工作。通过机器学习来处理问题,不但减少了错误率,还省去了人力,机器全面取代人类的梦想必然会向前迈出实质性的一步。这就是研究机器学习的目的和意义。1.2机器学习的算法

监督学习(SupervisedLearning)无监督学习(UnsupervisedLearning)。

监督学习

监督学习是通过已经训练的数据来训练模型。如果一组训练数据,已知输入和对应的输出,通过算法训练,从而可以得到一个最优的模型。然后在输入一个新的数据,监督学习算法就会根据模型做出相应的预测,这样就能得到一个最优的预测。这类算法往往用于预测性研究。

无监督学习

无监督学习被称为“没有老师的学习”,没有训练的过程,同时数据也只有输入,没有对应的输出,直接通过数据根据算法进行建模分析,意味着这些都是要通过机器学习自行学习探索。这听起来似乎有点不可思议,但是在我们自身认识世界的过程中也会用到无监督学习。这类算法往往用于探究性研究,去用于寻找各种方法。

半监督学习

半监督学习是监督学习和无监督学习相结合而产生的一种学习方法。它主要考虑如何利用少量的标注数据和大量的未标注数据进行训练和分类的问题,其算法主要是在监督学习上进行扩展,半监督学习对于提高学习机器性能具有非常重大的实际意义。

1.3监督学习 分类(Classification)算法 回归(Regression)算法

分类与回归的差异就是分类预测的标签往往是间断的,也就是说我们将输入变量映射到离散类别。

回归问题预测的标签往往是连续的,也就是说我们将输入数据映射到一些连续函数上。

1.4无监督学习

聚类算法

降维

聚类算法是无监督学习中典型的一种算法,聚类算法可以根据数据的特征来进行建模。

降维的原理就是将数据从高维空间映射到低维空间。1.5数据集 数据集的集合。在监督学习中,会将数据集划分为训练集和测试集,有时也会分为训练集、验证集和测试集。

训练集是用来拟合模型,通过设置分类器的参数,训练分类模型。后续结合验证集作用时,会选出同一参数的不同取值,拟合出多个分类器。

验证集用是当通过训练集训练出多个模型后,为了能找出效果最佳的模型,使用各个模型对验证集数据进行预测,并记录模型准确率。选出效果最佳的模型所对应的参数。

测试集用来最终评估模式识别系统的性能和分类能力。即可以把测试集当做从来不存在的数据集,当已经确定模型参数后,可以使用测试集进行模型预测并评估模型的性能。三者本质无任何区别,但划分的作用是为了能够泛化(generalize)出更好的模型。泛化、过拟合、欠拟合

泛化是指一个算法通过数据集对新数据的预测能力的好坏,在监督学习中,我们知道算法训练数据后会构建模型,如果我们此时通过构建的模型来预测一些测试集数据的标签,如果对于每一个测试集数据都能精确预测,就说这个模型能够从训练集泛化到测试集。

过拟合就是根据数据构建的模型的复杂度过高,对于应用于实际的问题,太多不必要的特征,从而导致机器并没有没有理解数据间存在的规律。

欠拟合就是构建模型的复杂度过低,不能很好的解决实际问题。

1.6机器学习项目的流程分析问题,获取数据数据预处理特征工程训练模型与调优模型评估模型融合上线运行一个完整的机器学习项目含有以上步骤,但不一定含有所有以上步骤

分析问题,获取数据 当得到一个问题的时候,首先要将问题转化为机器学习能够处理的问题,机器学习训练的过程非常耗时,所以我们仔细寻找合适的数据和选择机器学习的目标是分类、回归还是聚类。此时得到的数据经决定了我们机器学习结果的上限,所以数据要选择具有代表性的否则会产生过拟合。

数据预处理 在实际中我们得到的数据,并不像库中或者比赛中的数据,得到数据之后还需人工分析数据的格式是否符合要求,是否存在空值、缺失值,是否需要该特征等,然后进行归一化、离散化、缺失值处理、去除共线性等,这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤。

特征工程 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。特征工程在机器学习中也起着非常重要的作用,它也是在做数据处理,只不过是通过特征提取、特征选择、降维把数据处理成更为直接的被使用的数据。

训练模型与调优 真正考验水平的根据对算法的理解调节参数,使模型达到最优。模型诊断中至关重要的是判断过拟合、欠拟合,常见的方法是绘制学习曲线,交叉验证。通过增加训练的数据量、降低模型复杂度来降低过拟合的风险,提高特征的数量和质量、增加模型复杂来防止欠拟合。诊断后的模型需要进行进一步调优,调优后的新模型需要重新诊断,这是一个反复迭代不断逼近的过程,需要不断的尝试,进而达到最优的状态。

模型评估 模型验证和误差分析也是机器学习中非常重要的一步,通过测试数据,验证模型的有效性,观察误差样本,分析误差产生的原因,由算法训练建立的模型,作用到测试集上检验模型的精确度。若检验不合格,重新返回到算法进行学习,直至得到的模型比较精确,往往能使得我们找到提升算法性能的突破点。误差分析主要是分析出误差来源与数据、特征、算法。

模型融合

一般来说实际中,成熟的机器算法也就那么些,提升算法的准确度主要方法是模型的前端(特征工程、清洗、预处理、采样)和后端的模型融合。在机器学习比赛中模型融合非常常见,基本都能使得效果有一定的提升。

上线运行 这一部分内容主要跟工程实现的相关性比较大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。1.7小结

通过本章的学习,我们应该对机器学习有了一定的认识,本章要求掌握机器学习的相关概念,并对机器学习项目的流程能有一定的了解。THANKS第2章Python机器学习的使用2.1Python语言介绍2.2Python平台搭建2.3Python入门2.4Python库的使用2.5小结2.1Python语言介绍

Python作为一门开源语言使用广泛,入手非常快语法简单,简单易读,是一种解释性强、交互式、面向对象、跨平台的语言。Python被称为“胶水语言”,不仅可以使用Python编程,还可以使用C语言、C++编写,他把耗时的代码交给C/C++等高效率的语言进行实现,然后通过粘合来使用,这样就使得Python运行时间得到简化。Python还具有列表、元组、字典等核心数据类型,以及集合、队列等无需进一步编程就能直接使用。由于Python可以应用到多个领域,功能比较广泛,可扩展性强,所以基于Python生成了非常多的第三方库,这些库Python本身不带,运用时需要先安装,然后才能导入,Python包含了大量的第三方库可以运用到机器学习,比如:图形库,数学函数库,机器学习算法库等。2.2Python平台搭建Python适用于多个平台,并且拥有多个版本,可以根据平台选择合适的版本Python可以通过官方网站下载:/Python下载软件安装第三方库的安装2.3Python入门数据类型基本运算控制语句复杂数据类型函数数据类型数值型a=123print(a)a=3.14print(a)a=1.23456890print("{:0.2f}".format(a))字符串str='thisisaprogram'print(str[0])print(str[-1])print(str[0:4])print(len(str))print(str)print("{2}{1}{3}".format("this","is","a","program"))在Python中有两种索引方式,一种是正索引,一种是负索引,我们既可以通过正索引进行查询,也可以通过负索引进行查询。在进行切片操作时,一般通过如下方式:object[start_index:end_index:step]step:步数,其正负值决定了切片方向。start_index:开始索引(包括自身)。end_index:结束索引(不包括自身)。布尔类型 空值true=True a=Nonefalse=False

print(a)print(true)print(false)基本运算基本运算符a=1+2print(a)a=1-2print(a)a=1*2print(a)a=1/2print(a)a=1//2print(a)a=1%2print(a)a=10**32print(a)多变量赋值a=1b=2a,b=b,a+bprint(a,b)控制语句条件控制语句year=int(input("请输入年份:"))ifyear%4==0andyear%100!=0:print("{}年isleap".format(year))elifyear%400==0:print("{}年isleap".format(year))else:print("{}年isn'tleap".format(year))循环控制语句foriinrange(5):print(i)条件循环n=5while(n):print(n)n=n-1复杂数据类型列表(list)、元组(tuple)、字典(dict)、集合(set)列表:列表是可变的数据类型,在创建列表后可以添加、删除或者搜索数据,在Python中用[]表示。list=['a','b','c']print(list)list.append('d')print(list)list.extend('e')print(list)list.remove('e')print(list)元组:元祖和列表相似,但元组不可变。即不能添加或删除元组内的信息,但元组可以嵌套。在Python中用()表示。list=['b','c']tuple=('a',list,'d')print(tuple)list.remove('c')print(tuple)tuple[1].append('c')print(tuple)字典:字典是可变的,其数据类型包括键和值,键和值之间用“:”隔开,每个元素间以“,”隔开。且字典中的键是唯一的。在Python中用{}表示。dict={'a':1,'b':2,'c':'three'}print(dict.keys())print(dict.values())print(dict['c'])dict['c']=3print(dict['c'])dict.setdefault('d',4)print(dict)dict.pop('a')print(dict)dict.clear()print(dict)集合:集合与字典类似,但只包含键,没有对应的值,且包含的键不能重复。在Python中用set()或{}表示,set()中可以是列表、元组、字符串等。s=set([1,2,3])print(s)s={1,2,3}print(s)s=set("aabbc")print(s)函数:函数在任何时候都非常重要,能够自己建立函数解决机器学习问题,是一件不容易的事。我们先介绍Python中函数的语法:Python中建立函数利用def作为关键字开头,然后后面跟函数名、参数、“()”、“:”等,通过缩进表示函数内的内容。deffun(n):ifn==1orn==0:return1else:returnn*fun(n-1)print(fun(5))2.4Python库的使用scikit-learnmglearnnumpyscipypandasmatplotlibGraphvizscikit-learnscikit-learn简称为sklearn,是机器学习最重要的一个机器学习库,包括了大量的机器学习算法,而且还包括了大量的小型数据集,节省了获取数据集所花费的时间,使新手很容易上手,因而成为了广泛应用的重要的机器学习库。sklearn还包括了许多功能,例如:分类任务、回归任务、聚类任务、降维任务、模型选择和数据的预处理。mglearn机器学习主要运用到这个库的两个方面,一是利用matlotlib作图时,库中有配置好的cm2、cm3配色方案,二是库中有加载和获取常用数据集、人工生成数据集的模板load,可以引用sklearn.datasets模块。numpynumpy支持高级大量的维度数组与矩阵运算,它要求列表中所有元素类型都是相同的,然后将列表转化成相对应的数组进行运算。而且具有矢量运算能力,快速、节省空间。此外也针对数组运算提供大量的数学函数库。建立列表importnumpyasnpdata=[[1,2,3],[4,5,6],[7,8,9]]print(data)将列表转换为数组importnumpyasnpdata=[[1,2,3],[4,5,6],[7,8,9]]ndarray=np.array(data)print(ndarray.shape)print(ndarray)比较两者的运算importnumpyasnpdata=[[1,2,3],[4,5,6],[7,8,9]]ndarray=np.array(data)print("data数据:\n{}".format(data*2))print("ndarray数据:\n{}".format(ndarray*2))对数组进行切片importnumpyasnpdata=[[1,2,3],[4,5,6],[7,8,9]]ndarray=np.array(data)print(ndarray[1,2])print(ndarray[1,:])print(ndarray[:,2])scipyscipy建立在numpy的基础之上,用于数学、科学、工程领域的第三方库。它主要用于用于有效计算numpy矩阵,使numpy和scipy协同工作,高效解决问题。如统计、优化、数值积分、图像处理、信号处理以及常微分方程数值解的求解功能。建立稀疏矩阵importnumpyfromscipyimportsparsea=[[1,0,0,2],[0,0,3,0],[0,3,0,0]]a=numpy.array(a)print(a)转换importnumpyfromscipyimportsparsea=[[1,0,0,2],[0,0,3,0],[0,3,0,0]]a=numpy.array(a)array=sparse.csr_matrix(a)print(array)pandaspandas也是基于numpy创建的一个为了解决数据分析任务的一种数据处理工具。pandas是一款最具有统计意义的统计包,它纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具和大量能使我们快速便捷地处理数据的函数和方法。pandas常用的是series,dataframe,panel等,分别用来处理一维、二维和三维数据,应用最多的是dataframe,它能将numpy数组或者字典转化为类似于表格的类型,有行标签和列标签。importnumpyasnpimportpandasaspdarray=[[1,2],[3,4]]array=np.array(array)row=['r1','r2']col=['c1','c2']dataframe=pd.DataFrame(array,row,col)print(dataframe)importpandasaspddic={'name':["zhao","qian","sun","li"],'sex':['m','f','f','m']}dic=pd.DataFrame(dic)print(dic)matplotlibmatplotlib是一款绘图工具,用于绘制散点图、直方图、线型图等,类似于matlab,有matlab基础的同学能够快速上手matplotlib。importmatplotlib.pyplotaspltimportnumpyasnpdata=np.random.randn(200)plt.hist(data)plt.xlabel("XLabel")plt.ylabel("YLabel")plt.title("Title")plt.show()importmatplotlib.pyplotaspltimportnumpyasnpx=np.linspace(-10,10)y=np.abs(x)plt.plot(x,y)plt.xlabel("XLabel")plt.ylabel("YLabel")plt.title("Title")plt.show()importmatplotlib.pyplotaspltimportnumpyasnpx=np.random.random(20)y=np.random.random(20)plt.scatter(x,y)plt.show()GraphvizGraphviz和matplotlib一样是图形绘制工具。在做数据可视化的时候用到了Graphviz库,往往用于生成决策树、流程图。2.5小结通过本章的学习,我们应该对Python有了一定的了解。本章要求掌握Python的基本语法规则,了解各种库的基本功能。THANKS第2章监督学习3.1K近邻算法3.2线性回归3.3岭回归3.4LASSON回归3.5逻辑回归3.6朴素贝叶斯算法3.7决策树3.8随机森林3.9核支持向量机3.10神经网络3.11分类器的不确定性3.12小结3.1K近邻算法

K近邻(K-NearestNeighbor,KNN)算法是分类算法中最简单的算法,也是一种理论很成熟的机器学习算法,算法的核心思想是“近朱者赤,近墨者黑”。即KNN算法会根据训练集的数据构建一个模型,然后对于输入的新数据,算法会将新数据的特征与训练集中对应的特征进行比对匹配,在训练集中找到与之相对较为相似的k个数据,判断未知样本的标签。如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个标签,则该样本也属于这个类别,并具有这个类别上样本的特性。

那么问题来了,这k个临近的样本是如何计算出来的,当样本中一半属于A标签,一半属于B标签的情况下如何处理呢?

KNN算法有多个参数,但算法中主要有三个参数比较重要,分别是算法中的k值n_neighbors,权重weights,度量距离方法的选择p、metric,只要这三个要素确定了,算法的预测方式也就确定了。分类决策

算法的分类决策规则通常采用多数表决法,即由样本中k个邻近最多的类别决定输入数据的类别。如果存在恰好临近多种类别的个数相同,这时权重weights就起到了作用,通过给临近距离加权从中选择一个,这也是算法风险较小的原因。由于一般不改变,遇到相同的情况比较小或者可以改变k值再次预测,所以我们把重点放在距离度量方式和k值选择上。距离度量

在KNN算法中,常用的距离度量方式有三种,分别为曼哈顿距离、欧式距离和闵可夫斯基距离,默认使用欧氏距离,最常用的也是欧式距离。下面是三种距离度量的公式,其中x1,x2,……,xn,y1,y2,……,yn分别是两个数据点的特征值。

距离的选择有两个参数控制,一个是p值,一个是metric。当metric=“minkowski”,p为2时是欧氏距离,p是1时,是曼哈顿距离,p为其他值时是闵可夫斯基距离,从公式可以看出,欧氏距离、曼哈顿距离是闵可夫斯基的特例。k值选择

k值大小的选择是非常重要的要素之一。当k=1时,称算法为最近邻算法。

当选择的k值较小时,就相当于用较小的领域中的训练实例进行预测,训练误差近似误差小,泛化误差会增大。预测结果对近邻的实例点非常敏感,若此时近邻的实例点是噪声,预测就会出错。换句话说,k值较小就意味着整体模型变得复杂,容易发生过拟合。

k值较大,就相当于用较大领域中的训练实例进行预测,泛化误差小,但缺点是近似误差大。一个极端是k等于样本数m,则完全没有分类,此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的类,模型过于简单。换句话说,K值较大就意味着整体模型变得简单,容易发生欠拟合。工作原理k=1k=3鸢尾花数据集

鸢尾花数据集是一个三分类问题,返回类型的是一个bunch对象,类似于Python中的字典,所以可以实现Python中字典的功能,例如利用键来查看相应的值。数据集内包含3个种类共150条数据,每类各50个数据。数据集有4项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度,可以通过这4个特征预测鸢尾花卉属于setosa,versicolour,virginica中的哪一个标签,即类别。fromsklearn.datasetsimportload_irisiris=load_iris()print(iris.keys())filename的功能是输出数据集所在位置。DESCR中是该数据集的详细解释,里面说明了数据,特征的数目,特征信息,分类信息等。feature_names里是鸢尾花数据集的所有特征名。data里面包括了数据集中的数据。target_names保存了目标名。target里面保存了目标值。#利用KKNN算法的简单实例#导入相关包fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.neighborsimportKNeighborsClassifier#加载数据集iris=load_iris()#划分数据集X_train,X_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=0)#加载算法knn=KNeighborsClassifier(n_neighbors=1)#训练数据集knn.fit(X_train,y_train)score=knn.score(X_test,y_test)print("预测结果:{}".format(knn.predict(X_test)))print("预测精度={}".format(score))#KNN算法用于二分类importnumpyasnpfromsklearn.neighborsimportKNeighborsClassifierfromsklearn.model_selectionimporttrain_test_splitdata=[[-3,-4],[-2,-2],[-5,-4],[-4,-2],[-1,-3],[1,3],[2,3],[1,2],[2,5],[3,4]]target=[0,0,0,0,0,1,1,1,1,1]X=np.array(data)y=np.array(target)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)knn=KNeighborsClassifier(n_neighbors=1)knn.fit(X_train,y_train)score=knn.score(X_test,y_test)print("knn.score={}".format(score))对二分类数据可视化决策边界可视化importmglearnimportnumpyasnpfromsklearn.model_selectionimporttrain_test_splitfromsklearn.neighborsimportKNeighborsClassifierimportmatplotlib.pyplotaspltdata=[[-3,-4],[-2,-2],[-5,-4],[-4,-2],[-1,-3],[1,3],[2,3],[1,2],[2,5],[3,4]]target=[0,0,0,0,0,1,1,1,1,1]X=np.array(data)y=np.array(target)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)knn=KNeighborsClassifier(n_neighbors=1)fit=knn.fit(X,y)fig,axes=plt.subplots(figsize=(6,6))mglearn.plots.plot_2d_separator(fit,X,fill=True,eps=0.5,ax=axes,alpha=0.4)mglearn.discrete_scatter(X[:,0],X[:,1],y,ax=axes)plt.legend(["Class0","Class1"],loc=4)axes.set_xlabel("firstfeature")axes.set_ylabel("secondfeature")plt.show()

KNN算法虽然使分类算法,但是还可以用于回归问题。在分类任务中可使用投票法,选择这K个样本中出现最多的类别标记作为预测结果;在回归任务中可使用平均法,将这K个样本的实值输出标记的平均值作为预测结果。当然还可以基于距离远近程度进行加权平均等方法。工作原理回归问题我们将用到sklearn中make_regression函数

n_samples表示生成数据集的数据数量,n_features表示特征数,n_informative表示有信息的特征数量,也就是用来构造线性模型,生成输出的特征数量,n_targets表示回归目标的数量,也就是对应于一个样本输出向量y的维度,默认输出是标量,noise代表数据中噪声数量。fromsklearn.datasetsimportmake_regressionfromsklearn.neighborsimportKNeighborsRegressorfromsklearn.model_selectionimporttrain_test_splitX,y=make_regression(n_samples=100,n_features=1,n_informative=1,noise=12,random_state=11)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=11)knn=KNeighborsRegressor(n_neighbors=1)knn.fit(X_train,y_train)score=knn.score(X_test,y_test)print("knn.score={}".format(score))对knn算法参数进行调整fromsklearn.datasetsimportmake_regressionfromsklearn.neighborsimportKNeighborsRegressorfromsklearn.model_selectionimporttrain_test_splitX,y=make_regression(n_samples=100,n_features=1,n_informative=1,noise=12,random_state=11)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=11)knn=KNeighborsRegressor(n_neighbors=3)knn.fit(X_train,y_train)train_score=knn.score(X_train,y_train)test_score=knn.score(X_test,y_test)print("knn.train_score={}".format(train_score))print("knn.test_score={}".format(test_score))可视化决策边界fromsklearn.datasetsimportmake_regressionfromsklearn.neighborsimportKNeighborsRegressorfromsklearn.model_selectionimporttrain_test_splitimportnumpyasnpimportmatplotlib.pyplotaspltX,y=make_regression(n_samples=100,n_features=1,n_informative=1,noise=12,random_state=11)X_train,X_test,y_train,y_test=train_test_split(X,y)knn=KNeighborsRegressor(n_neighbors=3)fit=knn.fit(X,y)fig,axes=plt.subplots(figsize=(6,6))line=np.linspace(-3,3,100).reshape(-1,1)axes.plot(line,knn.predict(line))axes.plot(X,y,"^")plt.show()优点1、KNN可以处理分类问题,同样也可以处理多分类问题,比如鸢尾花的分类。2、简单好用,容易理解,精度高,理论成熟。同时也很强大,对于手写数字的识别,鸢尾花这一类问题来说,准确率很高。3、可以用来做分类也可以用来做回归,可用于数值型数据和离散型数据,无数据输入假定,对异常值不敏感。缺点1、时间复杂度和空间复杂性高。因为每一次分类或者回归,都要把训练数据和测试数据都算一遍,如果数据量很大的话,需要的算力会很惊人,但是在机器学习中,大数据处理又是很常见的一件事。2、对训练数据依赖度特别大,虽然所有机器学习的算法对数据的依赖度很高,但是KNN尤其严重,因为如果我们的训练数据集中,有一两个数据是错误的,刚刚好又在我们需要分类的数值的旁边,这样就会直接导致预测的数据的不准确,对训练数据的容错性太差。3、一般数值很大的时候不用这个,计算量太大。但是单个样本又不能太少,否则容易发生误分。最大的缺点是无法给出数据的内在含义。3.2线性回归

线性回归属于回归算法,回归算法是一种根据数据构建模型,再利用这个模型训练其中的数据进行处理的算法,其标签是连续的。回归算法主要以线性模型为主。线性模型指的不是一个模型,而是一类模型,包括线性回归、岭回归、LASSO回归,逻辑回归等。本节先对线性回归、多项式回归做一下介绍。对于线性模型,其公式一般是如下所示:公式中,X[0]-X[n]表示特征,w[0]-w[n]和b表示模型的参数。当我们的数据集特征为1时,此时的线性模型公式是这样的:

假如我们给出一些数据,线性模型可以做出相应的决策:

通过模型可以看到,满足上述一个特征的公式。在一次函数中,自变量前面的w代表斜率,b代表截距。对于多个特征线性模型仍能做出决策:线性回归

线性回归,又被称为最小二乘法。在线性回归中,特征值与目标值之间存在着线性关系。线性回归算法指的是在认为数据满足线性关系的时候,根据训练数据构建出一个模型,并用此模型进行预测。

线性回归就是求线性回归方程,寻找参数w和b,使得对训练集的预测值与真实的回归目标值y之间的损失函数最小。线性回归模型的损失函数一般有两种,绝对损失和平方损失。

绝对损失函数,即

平方损失函数,即

因为平方误差利于算法的运算,通常将平方误差作为线性回归模型的损失函数,线性回归模型求解就是为了使损失函数最小。

在线性回归中,没有需要调节的参数。但存在两个参数coef_和intercept_用来保存回归模型的系数和截距。fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLinearRegressioncanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)reg=LinearRegression()reg.fit(X_train,y_train)score=reg.score(X_test,y_test)print("系数矩阵{}".format(reg.coef_))print("线性回归模型:{}".format(ercept_))print("score={}".format(score))

线性回归在线性可分的情况下表现得非常出色,但对于线性不可分的情况下,会表现得束手无策,比如对于以下数据:从图中可以看出该数据的决策边界应该是个二次函数,接下来我们通过线性回归进行决策。importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLinearRegressionX=np.array([1,3,5,7,9,11,13,15,17,19,21])X=X.reshape(-1,1)y=np.array([80,64,52,36,59,24,66,79,72,89,100])plt.scatter(X,y)plt.show()liner=LinearRegression()liner.fit(X,y)#预测结果展示#生成待预测的数据y_predict=liner.predict(X)#预测数据plt.scatter(X,y)plt.plot(X,y_predict,c="r")plt.show()

可以看到效果差强人意。那么既然线性不可分,利用线性回归无法进行划分,应该怎么处理呢?下面就是就线性不可分数据的处理,多项式回归。多项式回归

线性回归适合于线性可分的数据,当我们处理非线性可分的数据时可以使用多项式回归。在这种回归中,我们是要找到一条曲线来拟合数据点,在特征工程公有多项式特征类似于这个算法。

如果我们在用线性回归划分的话无从下手,可以尝试多项式回归。算法式子可用下式表示:importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.preprocessingimportPolynomialFeaturesfromsklearn.linear_modelimportLinearRegression#生成原始数据X=np.array([1,3,5,7,9,11,13,15,17,19,21])#重塑数据,使其变为二维X=X.reshape(-1,1)y=np.array([80,64,52,36,59,24,66,79,72,89,100])plt.scatter(X,y)plt.show()#多项式特征转换poly=PolynomialFeatures(degree=2)X1=poly.fit_transform(X)#下面与线性回归步骤相同建立模型,开始训练liner=LinearRegression()liner.fit(X1,y)#预测结果展示#生成待预测的数据y_predict=liner.predict(X1)#预测数据plt.scatter(X,y)plt.plot(X,y_predict,c="r")plt.show()可以看到多项式回归对数据拟合的比较完美。线性回归优点:1、回归分析法在分析多因素模型时,建模速度快,不需要很复杂的计算,在数据量大的情况下依然运行速度很快。更加简单和方便;2、回归分析可以准确地计量各个因素之间的相关程度与回归拟合程度的高低,提高预测方程式的效果;3、可以根据系数给出每个变量的理解和解释缺点:1、回归方程式只是一种推测,这影响了因子的多样性和某些因子的不可测性,使得回归分析在某些情况下受到限制。2、对异常值很敏感。多项式回归优点1、能够拟合非线性可分的数据,更加灵活的处理复杂的关系

2、因为需要设置变量的指数,所以它是完全控制要素变量的建模

缺点1、需要一些数据的先验知识才能选择最佳指数

2、如果指数选择不当容易出现过拟合3.3岭回归

岭回归是由最小二乘法改进而来,虽然利用了最小二乘法,但放弃了其无偏性,以降低精度来获得回归系数更为符合实际的回归方法,这种方法要强于最小二乘法。在岭回归中,不但要求模型特征系数w要表现的好,而且会添加约束,尽量减小特征的系数值大小,使之接近于0,这种约束方式被称为L2正则化,其目的是为了避免过拟合。

在岭回归中还添加了参数,其中最重要的莫过于alpha,通过调整alpha的值来降低特征系数的大小。在本例中,对岭回归与线性回归进行对比,观察其特点fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLinearRegressioncanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)reg=LinearRegression()reg.fit(X_train,y_train)train_score=reg.score(X_train,y_train)test_score=reg.score(X_test,y_test)print("系数矩阵{}".format(reg.coef_))print("线性回归模型:{}".format(ercept_))print("train_score={}".format(train_score))print("test_score={}".format(test_score))fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportRidgecanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)reg=Ridge()reg.fit(X_train,y_train)train_score=reg.score(X_train,y_train)test_score=reg.score(X_test,y_test)print("系数矩阵{}".format(reg.coef_))print("岭回归模型:{}".format(ercept_))print("train_score={}".format(train_score))print("test_score={}".format(test_score))

可以从岭回归得到的精度发现,训练集的精度有所下降,而测试集的精度却提高了,说明了存在过拟合问题。

通过对alpha参数的调整,发现测试集上的分数上升了。而那么alpha的改变到底改变了什么呢?又是如何改变的呢?下面通过可视化观察其特征变化。fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLinearRegressionfromsklearn.linear_modelimportRidgecanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)lr=LinearRegression().fit(X_train,y_train)r1=Ridge().fit(X_train,y_train)r01=Ridge(alpha=0.1).fit(X_train,y_train)plt.plot(lr.coef_,'o',label='Linearregression')plt.plot(r1.coef_,'^',label='Ridgealpha=1')plt.plot(r01.coef_,'v',label='Ridgealpha=0.1')plt.xlabel("Coefficientindex")plt.ylabel("Coefficientmagnitude")plt.hlines(0,0,len(lr.coef_))plt.legend()plt.show()

从图中我们可以看到,线性模型没有经过正则化的处理,特征系数的数值都比较大,而岭回归中的系数几乎都接近于零。当岭回归的alpha值为1时,特征系数几乎都在零在一条线上,当alpha值为0.1时,特征系数有所增加。对于alpha值,当alpha值增大时,数据集的特征系数会减小,从而降低训练集的性能,但是会提升测试集的性能,也就是泛化性能,当alpha减小时,特征系数则会增大,如果alpha值非常小时,则会消除正则化,建立的模型也会趋向于线性回归。优点1、岭回归可以解决特征数量比样本量多的问题。2、岭回归作为一种缩减算法可以判断哪些特征重要或者不重要,有点类似于降维的效果3、岭回归可以解决变量间存在共线性问题。缺点1、不能降低样本特征数计算量大。2、牺牲了一定的精确度。3.4LASSON回归

与岭回归相似,套索(LASSO)回归也是用于限制数据的特征系数,防止过拟合。不同的是LASSO回归中用绝对值偏差作为算法的正则化项。即在LASSO回归中,会使某些特征系数恰好为0。LASSO回归处理后,某些特征被完全忽略,从而研究重要特征对数据的影响,这种称为L1正则化。

LASSO系数也与岭回归类似,比较重要的是alpha。

既然有了一种正则化的方式,为什么还要出现另一种呢?

这是因为L1正则化用于处理高维数据,高维数据就是指数据的维度很高,也就是说特征变量十分多的情况。在处理高维数据过程中碰到最大的问题就是维数过高,因为维数越高计算量会增加,还有就是不能可视化,无法观察工作原理,还会导致过拟合,无法精确预测。L2正则化会保留特征来降低系数,这样并不会减少计算量,而L1正则化会直接删掉一些特征系数。因此L1正则化在高维数据集中的优势尤其明显。

在LASSO回归中,我们仍使用线性回归和岭回归中的数据集fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLassocanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)reg=Lasso(alpha=0.001)reg.fit(X_train,y_train)train_score=reg.score(X_train,y_train)test_score=reg.score(X_test,y_test)print("系数矩阵{}".format(reg.coef_))print("LASSO回归模型:{}".format(ercept_))print("train_score={}".format(train_score))print("test_score={}".format(test_score))

经过LASSO回归处理后,系数矩阵中有的特征系数为零。下面通过可视化观察系数改变后特征的变化。fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLassofromsklearn.linear_modelimportRidgecanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)r1=Ridge(alpha=0.1).fit(X_train,y_train)l1=Lasso().fit(X_train,y_train)l01=Lasso(alpha=0.01).fit(X_train,y_train)l001=Lasso(alpha=0.00001).fit(X_train,y_train)plt.plot(l1.coef_,'o',label='Lassoalpha=1')plt.plot(l01.coef_,'^',label='Lassoalpha=0.01')plt.plot(l001.coef_,'v',label='Lassoalpha=0.00001')plt.plot(r1.coef_,'.',label="Ridgealpha=0.1")plt.xlabel("Coefficientindex")plt.ylabel("Coefficientmagnitude")plt.legend()plt.show()

通过图中数据可以看到,当LASSO系数较大时,数据集的特征几乎全为0,随着alpha值的减小,特征系数才逐渐增大,当alpha等于0.00001时,几乎没有了正则化的约束,而Ridge回归中,虽然有特征系数很小的点,但都不为0。在LASSO回归和Ridge回归中,虽然都是alpha系数,但意义完全不同,在岭回归中,随着alpha值的增大,数据集的特征系数会减小,随着alpha值的减小,数据集的特征系数会增大,而LASSO回归中,随着alpha值的增大,特征系数会增大,随着alpha值的减小,特征系数会减小。而且岭回归中,特征系数不会为0,LASSO回归中会。1、Lasso回归的出现能够有效的解决线性回归出现的过拟合。2、岭回归与Lasso回归最大的区别在于岭回归引入的是L2正则化,Lasso回归引入的是L1正则化,Lasso回归能够使得许多特征变量变成0,这点要优于岭回归,是得运算素的变快。缺点3、不适用一般情况,仅适用于特征非常多和对模型解释。3.5逻辑回归

在分类算法中,有的可以用于回归问题,同样对于回归算法,有的适用于分类问题。而逻辑回归就属于线性模型中的一种,用于解决分类问题。逻辑回归是用来处理自变量和结果的回归问题,虽然被叫做回归,但却是一种分类方法。主要有两个使用场景,第一,用于研究二分类或者多分类问题,第二寻找因变量的影响因素。

逻辑回归算法与线性回归算法最大的差异是,逻辑回归中的

被当做决策边界,而对于线性回归等模型中是一条直线、平面或者超平面。逻辑回归建立的模型如下面这个公式:

在公式中0代表阈值,但是对于现实数据,阈值的设置也是一个问题,如果采取平均值,假设正常数据点都处于0左右,而出现一个异常值非常大,则会出现错误。

于是需要建立的一个函数来映射概率,sigmoid函数:

该函数将所有数据都映射到0-1之间,对于异常值进行了处理,其图像这样的:

与训练线性回归模型类似,为了逻辑回归模型的参数w和b需要一个代价函数,算法的代价函数是对m个样本的损失函数求和然后除以m,因为对于线性模型损失函数对于模型的影响不是很大,所以不作详细介绍。逻辑回归的原理是:根据一个问题,建立代价函数,然后通过迭代优化求解出最优的模型参数,然后测试验证我们这个求解的模型的好坏。

逻辑回归有一个重要的参数C,C值越大正则化越弱。与前面类似如果参数C值较大,那么特征系数也将会越大,逻辑回归可能将训练集拟合到最好,而如果C值较小,那么模型更强调使特征系数接近于0,正则化越强。我们继续对乳腺癌数据集进行建模。fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLogisticRegressioncanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)reg=LogisticRegression()reg.fit(X_train,y_train)train_score=reg.score(X_train,y_train)test_score=reg.score(X_test,y_test)print("系数矩阵{}".format(reg.coef_))print("逻辑回归模型:{}".format(ercept_))print("train_score={}".format(train_score))print("test_score={}".format(test_score))

可以看到精确度非常高,因为该数据集本身就是分类问题,恰好也说明了线性模型中的逻辑回归适用于分类。对C值进行调节,并通过可视化观察特征系数的变化。fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLogisticRegressioncanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)lg01=LogisticRegression(C=0.1).fit(X_train,y_train)lg1=LogisticRegression().fit(X_train,y_train)lg10=LogisticRegression(C=10).fit(X_train,y_train)plt.plot(lg01.coef_.T,'x',label='LogisticC=0.1')plt.plot(lg1.coef_.T,'o',label='LogisticC=1')plt.plot(lg10.coef_.T,'.',label='LogisticC=10')plt.xticks(range(canner.data.shape[1]),canner.feature_names,rotation=90)plt.hlines(0,0,canner.data.shape[1])plt.xlabel("Coefficientindex")plt.ylabel("Coefficientmagnitude")plt.legend()plt.show()因为逻辑回归使用L2正则化,可以看到随着C值增大特征系数也会变大,可以看到随着C值减小特征系数也会变小,但是不会为0。优点:

1、简单、速度快,适用于二分类问题。2、易于理解,能直接看到各个特征的权重。3、容易吸收新的数据更新模型。缺点:

1、适应能力弱,对数据适应能力有局限性。3.6朴素贝叶斯算法

贝叶斯算法是一类分类算法的总称,来源于统计学。它是由18世纪英国数学家贝叶斯学派创始人塔马斯·贝叶斯所提出的利用概率统计知识进行分类的方法演变而来,贝叶斯学派很古老,但是从诞生到一百年前一直不是主流。

朴素贝叶斯分类与我们介绍的线性模型十分相似,是一种十分简单的分类算法,叫它朴素贝叶斯分类是因为这种方法的思想真的很朴素,朴素贝叶斯的原理是:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。即如果一个事物在一些属性条件发生的情况下,事物属于A的概率>属于B的概率,则判定事物属于A。朴素贝叶斯算法较为简单、高效,在处理分类问题上,是值得优先考虑的方法之一,但是泛化能力比分类模型较差。

朴素贝叶斯分类算法,核心是下面这个贝叶斯公式:

朴素贝叶斯算法同样有多种算法,分别是高斯朴素贝叶斯(GaussianNaiveBayes),伯努利朴素贝叶斯(BernoulliNaiveBayes),多项式朴素贝叶斯(MultinomialNaiveBayes)。高斯朴素贝叶斯其实就是正态分布用于解决一些连续数据的问题,伯努利朴素贝叶斯就是应用于二分类,多项式朴素贝叶斯文本计数中经常使用。接下来对这三种贝叶斯算法进行模型的构建。

在对KNN算法处理回归问题中,用到了sklearn库中的make_regression函数,该函数可通过设置得到想要的数据集,同时在sklearn库中还有一个手动设置的分类数据集,make_blobs。

n_samples表示数据的数量。

n_features表示特征的数量。

centers表示类别的数量。

首先函数生成数据为300个、特征为2、类别为7的数据集,然后利用三种朴素贝叶斯算法观察其精度。#高斯朴素贝叶斯fromsklearn.datasetsimportmake_blobsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.naive_bayesimportGaussianNBX,y=make_blobs(n_samples=300,centers=7,random_state=3)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=3)bayes=GaussianNB()bayes.fit(X_train,y_train)train_score=bayes.score(X_train,y_train)test_score=bayes.score(X_test,y_test)print("trainpredict={}".format(train_score))print("testpredict={}".format(test_score))#伯努利朴素贝叶斯fromsklearn.datasetsimportmake_blobsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.naive_bayesimportBernoulliNBX,y=make_blobs(n_samples=300,centers=7,random_state=3)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=3)bayes=BernoulliNB()bayes.fit(X_train,y_train)train_score=bayes.score(X_train,y_train)test_score=bayes.score(X_test,y_test)print("trainpredict={}".format(train_score))print("testpredict={}".format(test_score))因为多项式朴素贝叶斯只适用于处理非负离散数值,所以在下面对数据进行了归一化。#多项式朴素贝叶斯fromsklearn.datasetsimportmake_blobsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.naive_bayesimportMultinomialNBimportnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.preprocessingimportMinMaxScalerX,y=make_blobs(n_samples=300,centers=7,random_state=3)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=3)scaler=MinMaxScaler()scaler.fit(X_train)X_train_scaler=scaler.transform(X_train)X_test_scaler=scaler.transform(X_test)bayes=MultinomialNB()bayes.fit(X_train_scaler,y_train)train_score=bayes.score(X_train_scaler,y_train)test_score=bayes.score(X_test_scaler,y_test)print("trainpredict={}".format(train_score))print("testpredict={}".format(test_score))

因为有的算法不适用该数据集的缘故,可以看到评分越来越低。列下来通过决策可视化观察其决策边界。

伯努利朴素贝叶斯主要解决的是二项分布,多项式朴素贝叶斯多用于转化为对文本的处理,所以效果不是很好。优点1、朴素贝叶斯算法分类效率稳定,不仅能处理二分类还能处理多分类,适用于小规模数据,而且还能做增量式训练,即数据量过多超出内存时,我们可以分批的去增量训练。2、对缺失数据不太敏感,算法也比较简单,常用于文本分类。3、当属性相关性较小时,朴素贝叶斯性能最好。缺点1、在属性个数比较多或者属性之间相关性较大时,分类效果不好,往往无法预测精确的数据。2、需要知道先验概率,且先验概率很多时候取决于假设,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。3、由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率,并且对输入数据的表达形式很敏感。3.7决策树

决策树是一种相对普遍的机器学习算法,常用于分类和回归。在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系,它在对数据进行分类的同时,还可以给出各个特征的重要性评分。决策树在决策过程中,会根据数据的特征来划分数据的类别。

对于上表数据,如果做出划分你会怎么做?决策树可能会做出以下划分:

当然可能也会有其他划分方法,总而言之,在使用决策树分类的时候,从根结点开始,对数据集的某一个特征进行测验,选择最优特征,然后每一个数据被对应着分配到子结点。如此循环继续进行,当到达叶结点时,循环停止,这时每个数据都被分到一个类别。如果还有子集不能够被正确的分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的节点,如此递归进

温馨提示

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

评论

0/150

提交评论