您的位置:首页 > 编程语言 > Python开发

《python机器学习及实践_从零开始通往kaggle竞赛之路》——读书笔记

2020-04-20 15:49 218 查看

一、简介

 

1、什么是机器学习

 

AprogramcanbesaidtolearnfromexperienceEwithrespecttosomeclassoftasksTandperformancemeasureP,ifitsperformanceattasksinT,asmeasuredbyP,improveswithexperienceE.

 

 

2、机器学习三要素

 

2.1任务T

 

机器学习任务种类有很多,比较经典的有两类:监督学习和无监督学习

 

监督学习关注对事物未知表现的预测,一般包括:分类问题、回归问题

分类问题:对所在类别进行预测,类别是离散的,并且预先知道数量

回归问题:也是预测问题,预测目标是连续变量

 

无监督学习倾向于对事物本身特性的,常用的技术包括:数据降维和聚类问题

数据降维:对事物的特性进行压缩和筛选

聚类问题:依赖于数据的相似性,把相似的数据样本划分为一个簇。和分类问题的区别是,预先不知道簇的数量和每个簇的具体含义。

 

 

2.2经验E

习惯性的把数据视作经验。

 

特征:反映数据内在规律的信息叫做特征。一个样本可以用一个特征向量来描述。

而从原始数据到特征向量转化的过程,会有多种数据类型:类别型特征、数值型特征、缺失的数据等。

 

监督学习的经验包括特征和标记/目标两部分。一般用一个特征向量来描述一个样本,标记/目标的表现形式取决于监督学习的种类

 

无监督学习没有标记/目标,无法从事预测任务,更适合对数据结构的分析。

 

 

2.3性能P

性能指评价所完成任务质量的指标。

 

对于预测性质的问题,关注预测精度。

分类问题要根据预测正确类别的百分比来评价性能,即准确性

回归问题通常衡量预测值与实际值之间的偏差大小。

 

 

出现在测试集中的样本一定不能被用于模型训练

一般,训练集75%,测试集25%

 

 

 

二、经典模型

 

1、监督学习经典模型

 

监督学习任务基本架构和流程:

 

准备训练数据→抽取特征,形成特征向量→把特征向量和对应的标记/目标送入学习算法,训练出一个预测模型;然后,用同样的特征抽取方法作用于新测试数据,得到用于测试的特征向量,用预测模型对这些待测试的特征向量进行预测并得到结果。

 

 

1.1分类学习

 

有二分类、多类分类、多标签分类。

二分类、多类分类:从两个或多于两个类别中选择一个作为预测结果

多标签分类:判断一个样本是否同时属于多个不同类别

 

 

分类问题性能测评指标:

 

 

实际类别

预测类别

 

T

F

T

TT

TF

F

FT

FF

准确率Accuracy:(#TT+#FF)/(#TT+#TF+#FT+#FF)     就是不管原来是T还是F,真预测对了的比例

召回率Recall:(#TT)/(#TT+#FT)                   原来是T的那些,预测对了多少比例

精确率Precision:(#TT)/(#TT+#TF)                预测为T的那些,有多少预测对了

 

1.1.1线性分类器

 

假设特征和分类结果之间存在线性关系的模型。

线性关系可以表达为:

1)LR

对于二分类问题,用逻辑斯蒂函数将 映射到(0,1),

得到逻辑斯蒂回归模型(即决策函数):

损失函数(最大似然估计):

 

另说明:h(x)是每个样本取值为1的概率

特点:线性分类器假设数据特征和分类目标之间关系是线性的

有LogisticRegression:对参数计算精确解析,计算时间长,模型性能略高

和SGDClassifier:随机梯度上升估计参数,计算时间短,模型性能略低

10万量级以上数据,考虑时间耗用,使用SGDClassifier

 

2)SVC

决策函数:

损失函数:

当epsilon=0时,退化为线性可分的情况

损失函数第一项保证了最大化分类间隔,第二项是分类错误造成代价

 

特点:在海量高维度数据中筛选对预测任务最为有效的少数训练样本,

节省模型数据内存,提高模型预测性能。

缺点:付出CPU资源和计算时间

 

SVC和LR的区别及联系:

都是线性分类器,但是计算参数时,LR考虑了所有样本对参数的影响,而SVC仅考虑支持向量对参数的影响

都是在寻找w.T·x=0的超平面,但是损失函数不同,SVC希望找到使点到平面的垂直距离最小的参数,而LR则使似然函数最大

 

1.1.2朴素贝叶斯

 

模型构造基础的贝叶斯理论。

基本数学假设是:各个维度上的特征被分类的条件概率之间是相互独立的。

概率模型表达为:

x(x1,……,xn)为一n维特征向量,

y∈{c1,……,ck}是特征向量x所有k种可能的类别

p(y=ci|x)是x属于类别ci的概率,则

目标是求所有y∈{c1,……,ck}中P(y|x)最大的。

 

特点:广泛应用于海量互联网文本分类任务。

由于其较强的特征条件独立假设,使模型预测所需估计的参数规模从幂指数量级向线性量级减少,节约内存消耗和计算时间

无法将各个特征之间的联系考量在内,使得模型在其他数据特征关联性较强的分类任务上的性能表现不佳。

 

1.1.3  K近邻

 

给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分为这个类。

所以,K近邻法不具有显式的学习过程。

实际上是利用训练数据集对特征向量空间进行划分,并作为其分类的模型。

三要素:K值的选择,距离度量,分类决策规则

 

特点:无参数模型,非常高的计算复杂度和内存消耗

 

 

1.1.4决策树

 

假设特征和目标之间是非线性关系

度量方式:信息熵、基尼不纯性

 

特点:推断逻辑直观,具有清晰的可解释性,方便模型可视化

使用决策树时,无需考虑对数据标准化

有参数模型

 

 

1.1.5集成分类模型

 

综合考量多个分类器的预测结果,从而做出决策

综合考量方式分两种:

一是利用相同的训练数据同时搭建多个独立的分类模型,然后通过投票的方式,以少数服从多数的原则作出最终的分类决策,如:随机森林分类器,即在相同训练数据上同时搭建多棵决策树,每棵决策树构建时都是随机选取特征。

二是按照一定次序搭建多个分类模型。这些模型之间彼此存在依赖关系。一般,每个后续模型的加入都需要对现有集成模型的综合性能有所贡献,进而不断提升更新过后的集成模型的性能,并最终期望借助整合多个分类能力较弱的分类器,搭建出具有更强分类能力的模型,如梯度提升决策树,每一棵决策树在生成的过程中都会尽可能降低整体集成模型在训练集上的拟合误差。

 

特点:具有更高的表现性能和更好的稳定性

训练过程耗费更多时间

 

 

1.2回归预测

 

1.2.1线性回归器

 

线性回归模型:

优化目标:最小化预测值和真实值的差异

同样有精确计算的解析算法和随机梯度下降估计算法

 

性能评价:使用R2评价模型和数据拟合的好坏,越大代表拟合的越好

 

可作为基线系统

 

 

1.2.2 支持向量机回归:从训练数据中选出一部分更加有效的支持向量,用于预测

 

1.2.3 K邻近回归:只借助周围K个最近训练样本的目标数值,对待预测的回归值进行决策。

衍生出衡量待测样本回归值的不同方式,即到底是对K个近邻目标数值使用普通的算术平均法还是同时考虑距离的差异进行加权平均。

 

 

1.2.4 回归树:回归树在选择不同特征作为分裂节点的策略上,与决策树思路类似。不同之处在于,回归树叶节点的数据类型不是离散型,而是连续型。决策树每个叶节点依照训练数据表现的概率倾向决定了其最终的预测类别;而回归树的叶节点却是一个个具体的值,从预测值连续这个意义上严格讲,回归树不能成为“回归算法”。因为回归树的叶节点返回的是“一团”训练数据的均值,而不是具体的、连续的预测值。

 

树模型的优点:

1、树模型可以解决非线性特征的问题

2、树模型不要求对特征标准化和统一化,即数值型和类别型特征都可以直接被应用在树模型的构建和预测过程中

3、因为上述原因,树模型也可以直观地输出决策过程,使得预测结果具有可解释性

树模型的缺点

1、因为树模型可以解决一些复杂的非线性拟合问题,所以更加容易因为模型搭建过于复杂而丧失对新数据的精度(泛化能力)

2、树模型从上至下的预测流程会因为数据细微的更改而发生较大的结构变化,因此预测稳定性较差

3、依托训练数据构建最佳的树模型是NP难问题,即在有限时间内无法找到最优解的问题,因此常使用类似贪婪算法的解法只能找到一些次优解,这也是为什么经常借助集成模型,在多个次优解中寻觅更高的模型性能

 

1.2.5集成模型(回归)

普通回归森林

提升树模型

极端随机森林:与普通的随机森林不同的是,极端随机森林在每当构建一棵树的分裂点的时候,不会任意地选取特征,而是先随机收集一部分特征,然后利用信息熵和基尼不纯性等指标挑选最佳的节点特征

 

特点:训练过程耗时,但性能好,稳定性好

 

 

 

2、无监督学习经典模型

 

着重于发现数据本身的分布特点,可发现数据的“群落”,寻找离群点,降维

 

2.1数据聚类

 

K-均值聚类步骤:

1、确定要分的类别数目K

根据实际问题反复尝试,得到不同的分类并进行比较,得出最后要分的类别数量

2、确定K个类别的初始聚类中心

在用于聚类的全部样本中,选择K个样本作为K个类别的初始聚类中心,可由系统随机选择

3、根据确定的K个初始聚类中心,依次计算每个样本到K个聚类中心的距离欧氏距离,并根据距离最近的原则将所有的样本分到事先确定的K个类别中

4、根据所分成的K个类别,计算出各类别中每个变量的均值,并以均值点作为新的K个类别中心。根据新的中心位置,重新计算每个样本到新中心的距离,并重新进行分类

5、重复第4步,直到满足终止聚类条件为止

 

性能测评:

1、如果被用来评估的数据本身带有正确的类别信息,用ARI指标,含义和分类问题中的准确性Accurary类似

2、如果被用于评估的数据没有所属类别,那么用轮廓系数来度量聚类结果的质量

轮廓系数兼顾聚类的凝聚度和分离度,取值范围[-1,1],越大越好

计算步骤:

定义xi与某类簇的距离为xi与该类簇内所有样本距离的平均值

①对于已聚类数据xi,计算xi与同一类簇内所有其他样本距离的平均值,记为ai

②计算xi与其他各类簇的距离,并找到最小的距离,记为bi

③对于样本xi,轮廓系数为sci=(bi-ai)/max(bi,ai)

④对所有样本轮廓系数求出平均值即为当前聚类结果的整体轮廓系数。

 

 

缺点:容易收敛到局部最优解,需要预先设定簇的数量

 

如何预估合理的类簇个数:K-meas模型最终期望所有数据点到其所属的类簇距离平方和趋于稳定,所以可以观察这个数值随K的走势来找出最佳类簇数量

 

 

另:

K-均值聚类法是根据事先确定的K个类别反复迭代直到把每个样本分到指定的里类别中。类别数目的确定具有一定的主主观性,究竟分多少类合适,需要研究者对研究问题的了解程度、相关知识和经验

 

聚类数据要求:

1、各变量的取值不应有数量级上的过大差异,否则会对分类结果产生较大影响。这时需要对变量进行标准化处理

2、各变量间不应有较强的相关关系。若两个强相关的变量同时参与聚类分析,在测度距离时,就加大了它们的贡献,而其他变量则相对被削弱

 

分类结果是否合理取决于它是否“有用”,但分类结果是否可靠和稳定,则需要反复聚类和比较

一般来说,在所分的类别中,各类所包含的对象(样本或变量)的数量应该大致相当。至少这从表面上看更漂亮一些

 

 

 

 

2.2 特征降维

主成分最为经典和实用。可以把PCA当做特征选择,这种特征选择首先是把原来的特征空间做了映射,使得新的映射后特征空间数据彼此正交,这样就可尽可能保留具有区分性的低维数据特征。

降维过程可能会损失一些模式信息,不过综合效率更好。

 

 

 

三、进阶

 

提升模型性能的方式:预处理数据、控制参数训练、优化模型配置

 

1、特征提升

 

特征抽取:将原始数据转化为特征向量的形式,这个过程同时涉及对数据特征的量化表示

特征筛选:在高维度、已量化的特征向量中选择对指定任务更有效的特征组合,与PCA这类通过选择主成分对特征进行重建的方法有区别,对于PCA,无法解释重建之后的特征,但特征筛选不对特征值修改,而是选择对模型性能提升较大的少量特征

 

 

2、模型正则化

 

欠拟合:当模型复杂度很低,模型不仅没有对训练集上的数据有良好的拟合状态,且在测试集上也表现平平,即欠拟合

过拟合:模型复杂度很高,几乎完全拟合了所有的训练数据,但几乎丧失了对未知数据的预测能力,即过拟合

 

两种情况都是缺乏泛化力;

所以,要求增加模型复杂度,提高性能,同时兼顾泛化能力,防止过拟合;

于是,采用模型正则化的方法

 

正则化方法:L1范数正则化和L2范数正则化

 

2.1L1范数正则化:

 

目的是提高模型在未知测试数据上的泛化力,避免参数过拟合

方法是在原模型优化目标的基础上,增加对参数的惩罚项,即增加参数向量的L1范数

结果会让参数向量中的许多元素趋向于0,使得大部分特征失去对优化目标的贡献。

这种让有效特征变得稀疏的L1正则化模型通常称为Lasso

 

2.2L2范数正则化:

 

方法是在原模型优化目标的基础上,即增加参数向量的L2范数

结果会让参数向量中的大部分元素都变得很小,压制了参数之间的差异性

这种压制参数之间差异性的L2正则化模型通常称为Ridge

 

 

3、模型检验

 

留一验证

K折交叉验证:保证所有的数据都有被训练和验证的机会,最大可能让优化的模型性能变现更加可信

 

 

4、超参数搜索

 

网格搜索:对超参数组合空间进行暴力搜索

并行搜索:利用多核处理器、分布式资源

 

 

5、XGBoost模型

 

基本思想是把成百上千个分类准确率较低的树模型组合起来,成为一个准确率很高的模型,这个模型的特点是不断迭代,每次迭代就生成一棵新的树,成为一个准确率很高的模型。

 

 

 

 

 

在上面的基础上再总结一下

 

机器学习任务分为有监督学习和无监督学习。

有监督学习又分为分类问题和回归问题,两者都是预测,不同点是分类问题预测目标是离散变量,知道类别数量,回归问题预测目标是连续变量;

 

分类问题的模型中,如果假设特征是线性的,可选LR和SVC,一般可能SVC更好一点,因为它只考虑支持向量对参数的影响,同时计算量小;朴素贝叶斯是根据贝叶斯理论构建的模型,假设是特征之间以及特征和预测变量之间相互独立,那么,它就不适合预测特征之间明显有相关性的数据;

K近邻是无参数算法,不过计算量很大,对于每一个待预测的点都要计算和所有样本的距离才能找出最近的K个点;决策树是一种很好的对特征是非线性关系假设的拟合模型,结果直观,逻辑清晰,知道是如何一步步分类的,且不要求数据标准化,但是稳定性差,不好找最优解;集成模型性能也好,稳定性也好,就是训练过程耗时。

 

回归问题的模型,上述分类问题都基本有对应的回归模型,优缺点基本一致。

 

无监督学习主要是聚类和降维。聚类常用K-means,降维常用主成分。

 

 

在模型性能提升方面,除了选对模型,也涉及数据预处理、模型参数控制和模型优化配置方面

选择合适的特征,进行超参数组合,选出最好的超参数,正则化提高模型泛化能力。

 

 

大概流程为:原始数据,分开训练集、测试集,数据描述、看数据分布、有没有缺失值、特征选择,缺失值处理,特征向量化,选择模型,训练,预测等。

 

 

所涉及的sklearn库中常用的几行代码

[code]#分类学习

#监督学习,分类学习,线性分类器
fromsklearn.linear_modelimportLogisticRegression
fromsklearn.linear_modelimportSGDClassifier
fromsklearn.svmimportLinearSVC

#监督学习,分类学习,朴素贝叶斯
fromsklearn.naive_bayesimportMultinomialNB

#监督学习,K近邻分类器
fromsklearn.neighborsimportKNeighborsClassifier

#监督学习,单一决策树分类器
fromsklearn.treeimportDecisionTreeClassifier

#监督学习,分类学习,集成学习,随机森林分类器
fromsklearn.ensembleimportRandomForestClassifier
#监督学习,分类学习,集成学习,梯度提升决策树
fromsklearn.ensembleimportGradientBoostingClassifier

#分类模型评估结果
fromsklearn.metricsimportclassification_report
print('AccuracyofLRClassifier:',lr.score(X_test,y_test))
print(classification_report(y_test,lr_y_predict,target_names=['Benign','Malignant']))

 

[code]#回归问题

#监督学习,线性回归
fromsklearn.linear_modelimportLinearRegression
fromsklearn.linear_modelimportSGDRegressor
fromsklearn.svmimportSVR

#监督学习,K近邻回归
fromsklearn.neighborsimportKNeighborsRegressor

#监督学习,单一回归树
fromsklearn.treeimportDecisionTreeRegressor

#监督学习,集成模型,普通随机森林,极端随机森林,提升树
fromsklearn.ensembleimportRandomForestRegressor,ExtraTreesRegressor,GradientBoostingRegressor

#回归模型评估结果R方,MSE,MAE
ss_y=StandardScaler()
fromsklearn.metricsimportr2_score,mean_squared_error,mean_absolute_error
r2_score(y_test,lr_y_predict)
mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(lr_y_predict))
mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(lr_y_predict))

 

[code]#无监督学习,聚类
fromsklearn.clusterimportKMeans
#K-means性能评估ARI
fromsklearnimportmetrics
metrics.adjusted_rand_score(y_test,y_predict)
#K-means性能评估轮廓系数
fromsklearn.metricsimportsilhouette_score
sc_score=silhouette_score(X,kmeans_model.labels_,metric='euclidean')

#无监督学习,降维
fromsklearn.decompositionimportPCA

 

  • 点赞
  • 收藏
  • 分享
  • 文章举报
じんじん 发布了27 篇原创文章 · 获赞 2 · 访问量 320 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐