ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

机器学习原理与应用(一)

机器学习原理与应用(一) 一、机器学习概述学习目标了解机器学习的定义掌握机器学习的基本原理、关键术语与数学本质掌握python编程及机器学习相关库1、机器学习的定义机器学习是利用特定方法从历史或观测数据中发现规律或知识并利用所发现规律或知识对新数据相关问题的求解结果进行预测的技术。由于数据中蕴含的规律或知识在数学形式上可表示为特定的函数或模型因而机器学习所解决的问题可表述为利用已知数据求解特定或未知数学模型的问题。2、机器学习的关键术语在机器学习中数据泛指可输入机器中的客观对象 (如文字、图像、视频等)数据集则是相关数据的集合。模型是对数据规律的数学表示参数是模型内部需要学习的变量超参数则是在训练前人为设定的配置如学习率和迭代次数。1特征原始数据通常并不以连续变量或离散变量的形式存在或并非全部可用于对模型的求解此时需要根据当前问题所涉及的对象抽取原始数据中具有代表性的部分进而将多个可以表征原始数据的数值型特征组合为向量的形式称为特征向量用于模型求解。通过提取特征向量可以在一定程度上降低数据维度以降低模型复杂度。2样本样本是数据集中的每一条记录通常由特征和标签组成。特征Feature是描述样本属性的变量例如预测房价时的面积、地段和楼层标签Label则是我们希望预测的目标值例如房价本身。训练样本用于训练模型数量总样本量的一半验证样本用于衡量模型训练或模型参数优化时的性能变化测试样本用于衡量最终模型的性能3监督学习无监督学习监督学习利用带有标签的训练数据学习输入到输出的映射关系典型任务包括分类和回归无监督学习则在无标签数据上发现内在结构典型任务包括聚类和降维半监督学习仅利用部分已标注的观测数据实现模型的求解强化学习通过智能体与环境交互依据奖励信号学习最优策略。4判别函数判别函数输出值为0的点构成超平面。特征向量在特征空间表现为一个点为了对特征空间中的点进行分类需要确定一个超平面将特征空间分为互不重叠的子区间。5模型训练步骤特征提取、划分样本、模型构建、测试模型、优化模型。损失函数衡量模型预测与真实标签之间的差距优化算法如梯度下降通过迭代更新参数以最小化损失。过拟合指模型在训练集上表现优异但在新数据上泛化较差欠拟合则指模型过于简单而无法捕捉数据中的规律。泛化能力是模型对未见数据的预测能力是评估模型质量的核心指标。3、python基础数据类型数字 int float complex字符串 str列表 list [1,2,3]元组 tuple (1,2,3)字典 dict {Name:zhangsan,Age:17}集合 set {a,b,c}python支持格式化字符串的输出。格式化处理主要用来将变量的值填充到字符串中对字符串进行格式化显示。常用的格式化输出有两种占位符格式化和format()格式化。字符串常用基本运算运算符实例结果a bHelloPython*a * 2HelloHello[]a[1]e[:]a[1:4]ellinH in aTruenot inM not in aTrueis用于判断两个变量引用的对象是否为同一个而用于判断引用变量的值是否相等。列表删除列表元素添加列表元素列表的嵌套列表运算元组元组是只读的列表基本上关于列表的嵌套以及in、not in等运算都适用于元组但会导致列表发生改变的函数则不行元组与列表可相互转化字典字典是包含若干“键值”元素的无序可变序列字典中的每个元素包含“键”和“值”两个部分表示一种映射关系。字典中的“键”可以是python中的任意不可变数据e.g.整数、复数、字符串、元组。“键”必须是唯一的而“值”是可以重复的。字典元素的增删改查一些函数和运算符在字典中的运用集合集合对象的创建与删除集合元素的增加与删除集合运算程序控制结构选择结构循环结构pass语句表示一个占位符一般用作占位语句break语句和continue语句函数函数参数位置参数关键字参数默认值参数调用函数时如果没有传递参数程序就会使用默认值不定长参数4、常用库机器学习算法的设计及相关数据的处理需用到科学计算库NumPy、机器学习库scikit-learn、绘图库Matplotlib和图像处理库。科学计算库import numpy as np a np.array([2,3]) b np.array([4,5]) c np.add(a,b) #数组相加 print(c) #[6 8] c np.subtract(a,b) #数组相减 print(c) #[-2 -2] c np.multiply(a,b) #数组相乘 print(c) #[ 8 15] c np.dot(a,b) #矩阵相乘规则 print(c) #23 c np.divide(a,b) #数组相除 print(c) #[0.5 0.6] d np.power(a,2) #求幂 print(d) #[4 9] d np.mod(a,3) #求余数 print(d) #[2 0] d np.sqrt(a) #求平方根 print(d) #[1.41421356 1.73205081] array1np.array([[2,10],[1,5]]) array2np.sum(array1) #元素之和 print(array2) #18 array2np.sum(array1,axis0) #axis0表示对每一列(或称0维度)进行操作 print(array2) #[ 3 15] array2np.sum(array1,axis1) #axis1表示对每一行(或称1维度)进行操作 print(array2) #[12 6] array2np.min(array1) #求所有元素中的最小值 print(array2) #1 array2np.min(array1,axis0) #axis0表示对每一列进行操作 print(array2) #[1 5] array2np.min(array1,axis1) #axis1表示对每一行进行操作 print(array2) #[2 1] array2np.max(array1) #max()是求最大值操作方式与min()类似 print(array2) #10 array2np.max(array1,axis0) print(array2) #[ 2 10] array2np.max(array1,axis1) print(array2) #[10 5] array3[0.45, 5.456, 4.2225, 9.655] array4np.around(array3) #对值进行四舍五入取整 print(array4) #[ 0. 5. 4. 10.] array4np.floor(array3) #向下取整 print(array4) #[0. 5. 4. 9.] array4np.ceil(array3) #向上取整 print(array4) #[ 1. 6. 5. 10.]二、特征工程针对特定的分类或回归问题在已知数据的基础上构建相应机器学习模型的关键在于特征提取的有效性和模型求解方法的可靠性。其中特征设计是基础模型求解是关键。学习目标掌握scikit-learn库特征预处理方法掌握scikit-learn库特征过滤、特征包装、特征嵌入等特征选择方法掌握scikit-learn库主成分分析、线性判别分析等特征提取方法1、基本原理在特征设计中需结合当前拟解决问题的特点对影响问题求解质量的特征进行提取与选择最大可能地剔除无关特征与冗余特征。2、特征预处理在初步采集特征时需要找出所有可能会对拟解决问题的求解有影响或相关联的因素通常采用获取率、覆盖率与准确率对初步采集到的特征进行评估。获取率表示特征获取的可行性涉及隐私的特征不易获取覆盖率表示特征获取的完整性特征并非所有数据都具备准确率表示所获取特征的可靠性。在初步设计与采集特征后需对其进行异常值检测、数据采样、规范化等预处理操作让其转化为利于模型求解的形式。异常值检测初步设计与采集的特征通常包含少量异常值异常值检测的目的在于检出这些异常值以保证特征取值的规整性与合理性。异常值检测常用方法统计分析聚类分析距离计算数据采样数据采样是从总体中选取一部分样本以代表整体的过程。数据采集旨在解决样本不均衡问题。规范化数据规范化是将原始数据转换为统一尺度的过程使不同量纲或取值范围的数据具备可比性。例数据归一化对于归一化结果也可进行还原同理通过设置MinMaxScaler对象的参数feature_range可实现到指定区间的映射Scaler MinMaxScaler(feature_range(5,10)) #实例化并指定映射区间例数据标准化——将原特征取值分布变换为正态分布形式对标准化后数据进行还原离散化为解决特定分类问题或降低分类模型的复杂度有时需要采用特定标记将原特征取值进行离散化处理。特征编码特征编码旨在将特定性表述的特征取值转化为机器学习模型所能处理的形式。常用的特征编码方式有序数编码、独热编码、哑编码。序数编码采用特定的有序数字表示指定特征的取值。例如采用0、1、2表示苹果、梨、香蕉用0、1表示小猫、小狗则可生成[0,0]、[1,0]、[2,0]等六个样本。独热编码若特征有K个取值则采用K位由0与1组成且仅有一位为1的二元数字串对其进行编码。例如籍贯有001010100三个取值学历有01、10两个取值最终可生成[0,0,1,0,1]、[0,1,0,1,0]、[1,0,0,1,0]等六个样本。哑编码由于指定独热编码位的二进制可表达的信息通常大于特征的可能取值为了精简编码长度可将独热编码位去除1位。例如籍贯的三种取值可表示为01、10、11。3、特征选择在特征设计中需结合当前拟解决问题的特点对影响问题求解质量的特征进行提取与选择最大可能地剔除无关特征与冗余特征。特征选择不仅可有效剔除不相关或冗余的特征以避免维数过多不易计算与提高模型训练效率还可降低模型复杂度、提高模型的泛化能力。特征选择的方法特征过滤特征过滤方法是按照统计学准则对各个特征进行评分并排序然后采用设置阈值的方式选出对拟解决问题影响较大的特征。理论而言此类方法仅根据各种统计检验中的分数及相关指标对每个特征进行单独度量而未考虑特征之间的依赖性、相关性以及机器学习算法因而可能会选出性能不佳的特征子集或者把有用的特征滤除。结果→ 选出一堆看起来不错、放一起却效果差的特征→ 或是把 “单独不起眼、组合很关键” 的特征给删掉了。方差过滤方差过滤的目的在于移除所有方差不满足指定阈值的特征。实际上如果某特征的取值较为集中或变化较小则该特征对问题的求解作用不大如95%以上的样本该特征取值均相同不利于区分两个类别应当删除。问题描述已知样本“肤色” 特征0 与 1 分别表示黄色与白色。“语言” 特征0 与 1 分别表示英语与汉语。“国籍” 特征0 与 1 分别表示美国与中国。通过方差过滤剔除特征值为 0 或 1 且比例超过 80% 的特征。样本肤色语言国籍100120103100401150106011皮尔逊相关系数皮尔逊相关系数是一种有助于理解特征与目标变量之间关系的方法其通过[-11]的值衡量变量之间的线性相关性-1表示完全负相关1表示完全正相关0表示无线性相关性。缺点只对具有线性关系的变量有效对于非线性关系即便两个变量具有一一对应关系皮尔逊相关性也可能会接近0。问题描述给定由 3 个特征构成的 1000 个样本与相关分类标记判断 3 个特征中哪个特征最重要。由结果可知3个特征中第2个特征最重要相关系数最大。卡方检验卡方检验的思想在于通过观察实际值与理论值的偏差判断理论值是否正确。具体而言先假设两个变量相互独立通过观测实际值和理论值之间的偏差程度来判断是否相关。若偏差值小说明假设成立——两个变量相互独立反之则说明两者相关。问题描述针对鸢尾花数据集采用卡方检验选择相关性最大的两个特征。互信息和最大信息系数互信息用于度量两个随机变量相互依赖的程度或者两个随机变量共享信息的程度。在实际中由于互信息不利于归一化、联合概率难以计算等问题而不易用于特征的选择因而更为常用的相关度量是根据互信息演化而成的最大信息系数。最大信息系数是用于衡量X和Y之间的关联程度其基本思想在于将两个变量相应的二维空间进行离散化并使用离散图表示进而通过度量散点落入离散方格的情况计算联合概率。特征包装特征包装方法将特征选择问题视为最优特征子集搜索问题。相对于特征过滤方法特征包装方法考虑到了特征之间相关性以及特征组合对模型性能的影响。特征包装流程搜索策略根据原特征生成特征子集的过程评估函数评估特征子集优劣程度的标准终止条件与评估函数相关的特定阈值验证过程验证所选特征子集的实际效果整体而言特征包装方法首先从原特征中选择一个特征子集然后采用评估函数对该特征子集进行评估并判断是否满足终止条件若满足终止条件则将当前特征子集作为最优特征子集否则继续重复特征子集的生成与评估。此外最优特征子集的实际性能还需利用特定样本进行验证。问题描述利用递归特征消除方法从鸢尾花数据集中选择最佳特征子集要求采用 Logistic 回归评估特征子集的性能并输出每个特征的重要性排名、所选择的特征数量与特征名称。从输出结果可以看出鸢尾花数据集的 4 个特征中的 2 个特征petal length (cm)和petal width (cm)对区分鸢尾花种类时更加重要因而被选择作为最优特征子集。特征嵌入特征嵌入方法的主要特点是特征选择与模型训练同时进行。首先利用模型确定各特征的权重然后根据权重大小从原特征中选择最有用的特征。此方法不仅考虑到了模型的整体性能还考虑到了特征对模型的贡献因此无关的特征需要相关性过滤的特征和无区分度的特征需要方差过滤的特征均会被删除。特征嵌入的缺点在于采用的权重并不具有明确的统计含义若有较多特征对模型均有贡献且贡献不一则不易确定相应的阈值进行判别。问题描述利用惩罚项对鸢尾花数据集进行特征选择。从运行结果来看该模型选择了鸢尾花数据集4个特征中的3个。问题描述利用随机森林对鸢尾花数据集进行特征选择最终可获得每个特征的重要性并从中选择了2个重要的特征。4、特征提取主成分分析核心思想通过线性变换将原始高维数据投影到低维空间同时尽可能保留原始数据中的主要信息。该方法基于数据的方差最大化原则寻找能够解释数据最大变异方向的新坐标轴。问题描述利用主成分分析进行特征提取利用主成分分析方法将鸢尾花数据4 维降至 2 维并将降维后的 3 类鸢尾花数据进行可视化。降维后的特征在数值上与原特征完全不同但表达了原特征的主要信息。降维后的特征只有 2 维相对于原特征其在训练模型时具有更高的效率。可视化结果不同颜色的点表示不同种类的鸢尾花versicolor 与 virginica 两种鸢尾花之间存在少许交叠setosa 种类的鸢尾花则较为孤立降维后的 3 类鸢尾花数据整体上更易于分类或更有利于提高后续分类模型构建的可靠性。为进一步分析主成分分析的特性可通过以下代码查看降维后的特征贡献率从结果来看降维后的第一个特征的信息量及可解释性方差贡献远大于第二个特征的原特征的大部分信息主要集中于降维后的第一个特征。此外降维后两特征可解释性方差贡献率之和接近97.77%较好地保留了原特征的主要信息。问题描述主成分分析中特征维度的确定scikit‑learn 库中的糖尿病数据集包含 442 个样本每个样本具有年龄、性别、体重指数、平均血压及 6 个疾病指标等 10 个特征即[age,sex,bmi,bp,s1,s2,s3,s4,s5,s6]请使用主成分分析方法对糖尿病数据集进行降维处理并确定合理的新特征维度。为确定合理的新特征可用以下三种方法利用累积可解释性方差贡献率曲线确定新特征维度pca_opt PCA(n_components10).fit(X) #查看可解释性方差贡献率 print(pca_opt.explained_variance_ratio_) #累积可解释性方差贡献率并绘制变化曲线 plt.plot([1,2,3,4,5,6,7,8,9,10],np.cumsum(pca_opt.explained_variance_ratio_)) plt.xticks([1,2,3,4,5,6,7,8,9,10]) plt.xlabel(Number of components) plt.ylabel(Cumulative explained variance) plt.show() plt.grid(True)从累积贡献率曲线可以看出当n_components取值为 8 或者 9 时可解释性方差贡献率累积值达到最大因此可将其设置为 8 或 9利用最大似然估计确定新特征维度pca_mle PCA(n_componentsmle) X_new pca_mle.fit_transform(X) #查看特征维度 print(X_new.shape) #查看新特征对应的累积可解释性方差贡献率 print(pca_mle.explained_variance_ratio_.sum())从输出结果可以看出采用最大似然估计方法自动选择的新特征维度为 9这 9 个特征所包含的信息量占原特征信息量的 99.91% 左右按信息量占比确定新特征维度pca_percent PCA(n_components0.90) X_new pca_percent.fit_transform(X) print(X_new.shape) print(pca_percent.explained_variance_ratio_.sum())将n_components参数值设置为 0.90表明新特征累积可解释性方差贡献率应大于 90%进而确定了 7 个新特征这 7 个特征所包含的信息量占原特征信息量的 94.79% 左右。线性判别分析主成分分析只是降低了特征的维度而未考虑降维后特征的分类或拟合性能为解决此问题线性判别分析的核心目标是将高维数据投影到低维空间使得不同类别在投影后尽可能分开而同一类别内部的数据点尽可能紧凑。线性判别分析适用于两类分类问题的求解当推广至多类分类问题时可采用类似的类间距离最大而类内距离最小的思想进行求解。问题描述采用线性判别分析方法对鸢尾花数据相应特征进行降维维度设为 2处理并可视化降维后的样本。import matplotlib.pyplot as plt from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn import datasets # 加载鸢尾花数据集 Iris datasets.load_iris() X Iris.data # 特征数据 y Iris.target # 标签数据 # 查看样本数量与原始特征维度 print(X.shape) # 实例化线性判别分析对象指定降维后的特征维度为2 lda LinearDiscriminantAnalysis(n_components2) # 拟合模型并执行特征变换完成降维 X_new lda.fit(X, y).transform(X) # 查看降维后的样本数与新特征维度 print(X_new.shape) # 查看降维后特征累积可解释性方差贡献率 print(lda.explained_variance_ratio_.sum()) plt.figure() # 绘制样本散点图 plt.scatter(X_new[y0, 0], X_new[y0, 1], cred, labelIris.target_names[0]) plt.scatter(X_new[y1, 0], X_new[y1, 1], cblue, labelIris.target_names[1]) plt.scatter(X_new[y2, 0], X_new[y2, 1], corange, labelIris.target_names[2]) plt.xlabel(x1_lda) plt.ylabel(x2_lda) plt.legend() plt.show()利用线性判别分析方法对原特征进行降维处理后获得的 2 个新特征基本包含了原特征的信息量降维后的 3 类鸢尾花样本点较易于分类整体效果较好。线性判别分析不但可以用于进行特征降维还可直接用于分类问题的求解线性判别分析 (LDA) vs 主成分分析 (PCA)PCA主成分分析无监督降维 只看特征本身数据分布不使用标签 y。目标找到新坐标轴保留原始数据最大方差保留最多信息。只关心数据本身不关心样本属于哪一类。LDA线性判别分析有监督降维 同时用特征 X 类别标签 y。目标投影后同类样本尽量靠近、不同类样本尽量远离为分类服务。核心目标让类别更容易分开。
返回列表