ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

机器学习——Day05

机器学习——Day05 一、K-近邻算法1.K-近邻算法简介1.1什么是K-近邻算法根据你的“邻居”来推断出你的类型是一种分类算法1.2K-近邻算法KNN概念定义如果一个样本在特征空间中的k个最相似即特征空间中最邻近的样本中的大多数属于某一个类别则该样本也属于这个类别距离公式一般使用欧氏距离2.K-近邻算法api初步使用使用Scikit-learnsklearn.neighbors.KNeighborsClassifier(n_neighbors5) n_neighbors选定参考几个邻居 int默认是5 k_neighbors查询默认使用的邻居数2.1代码实现过程from sklearn.neighbors import KNeighborsClassifier #构造数据集 x [[0],[1],[2],[3]] y [0,0,1,1,] #模型训练 ##实例化API estimator KNeighborsClassifier(n_neighbors2) ##使用fit方法进行训练 estimator.fit(x,y) estimator.predict([[1]])3.距离度量3.1 欧氏距离3.2 曼哈顿距离3.3 切比雪夫距离3.4 闵可夫斯基距离缺点将各个分量的单位没有区分未考虑到各个分量的分布期望、方差等可能是不同的3.5 标准化欧氏距离针对欧氏距离的缺点而改进的3.6 余弦距离3.7 汉明距离两个等长字符串s1和s2的汉明距离为将其中一个变为另一个所需要做的最小字符替换次数汉明重量是字符串相对于同样长度的零字符串的汉明距离也就是说他是字符串中非零的元素个数。因此向量空间中的元素a和b之间的汉明距离等于他们汉明重量的差a-b3.8 杰卡德距离3.9 马氏距离与单位无关排除变量之间的相关性干扰计算建立在总体样本的基础上如果拿同样的两个样本放入不同的总体中最后计算得出的两个样本间的马氏距离通常是不相同的除非两个总体的协方差矩阵碰巧相同计算过程中要求总体样本数大于样本的维数否则得到的总体样本协方差矩阵逆矩阵不存在二、K值选择近似误差对现有训练集的训练误差关注训练集如果近似误差过小可能会出现过拟合现象对现有的训练集能有很好的预测但对未知的测试样本将会出现较大误差的预测。模型本身不是最接近最佳模型估计误差对测试机的测试误差关注测试集估计误差小说明对未知数据的预测能力好模型本身最接近最佳模型1.K值过小相当于用较小的领域中的训练实例进行预测“学习”近似误差会减小只有与输入实例较近或相似的训练实例才会对预测结果起作用与此同时带来的问题是“学习”的估计误差会增大即K值的减小意味着整体模型变得复杂容易发生过拟合2.K值过大有点事可以减少学习的估计误差但缺点是学习的近似误差会增大。这时候与输入实例较远不相似的训练实例也会对预测起作用使预测发生错误并且K值的增大意味着整体模型变得简单3.KNN为训练样本数完全不足取因为此时无论输入实例是什么都只是简单的预测它属于在训练实例中最多的类模型过于简单忽略了训练实例中大量有用信息三、kd树1.kd树简介1.1 什么是kd树根据KNN每次需要预测一个点时我们都需要计算训练数据集里每个点到这个点的距离然后选出距离最近的K个点进行投票当数据集很大时计算成本很高针对N个样本D个特征的数据集其算法复杂度为O(DN^2)kd树为了避免每次都重新计算一遍距离算法会把距离信息保存在一颗树里这样在计算之前从梳理查询距离信息尽量避免重新计算。其基本原理是如果A和B距离很远B和C距离很近那么A和C的距离也很远。有了这个信息就可以在合适的时候跳过距离远的点1.2 原理2.构造方法构造根节点是根节点对应于K维空间中包含所有实例点的超矩形区域通过递归的方法不断对K维空间进行切分生成子节点。再超巨星区域上选择一个坐标轴和在此坐标轴上的一个切分点确定一个超平面这个超平面通过选定的切分点并垂直于选定的坐标轴将当前超巨星区域切分为左右两个子区域子结点这是实例被分到两个子区域上述过程直到子区域内没有实例时终止终止时的结点为叶结点。在此过程中将实例保存在相应的节点上通常循环的选择坐标轴对空间切分选择训练实例点在坐标轴上的中位数为切分点这样得到的kd树是平衡的平衡二叉树它是一棵空树或其左子树和右子树的深度值差的绝对值不超过1且它的左子树和右子树都是平衡二叉树2.1选择向量的哪一维进行划分随机选择某一维或按顺序选择但更好的方法是在数据比较分散的那一维进行划分分散程度可以根据方差来衡量。好的划分方法可以使构建的数比较平衡可以每次选择中位数来进行划分3.kd树搜索3.1 最近邻域搜索在本域内没有进行跨域搜索要跨到其他域搜索四、案例1.scikit_learn数据集API介绍sklearn.datasets # 获取小规模数据集数据包含在datasets里 datasets.load() # 获取大规模数据集需要从网络上下载 datasets.fetch_20newsgroups(data_homeNone, subsettrain) data_home:数据集下载的目录默认是~/scikit_learn_data/ subset:train训练集的“训练”或者test测试集的“测试”,all两者的全部,可选选择要加载的数据集2.sklearn数据集返回值介绍# load和fetch返回的数据类型datasets.base.Bunch(字典格式) data特征数据数组是[n_samples *n_features]的二维numpy.ndarray数组 target标签目标数组是n_samples的一位numpy.ndarray数组 DESCR数据描述 feature_names特征名 target_names标签目标名3.查看数据分布3.1 seaborn介绍seaborn是基于Matplotlib核心库进行了更高级的API封装安装pip install seaborn# 绘制二维散点图时自动完成回归拟合 seaborn.lmplot() x,y分别代表横纵坐标的列名 data 关联到数据集 hue 代表按照species即花的类别分类显示 fit_reg 是否进行线性拟合3.2 数据可视化import seaborn as sns import matplotlib.pyplot as plt import pandas as pd from sklearn.datasets import load_iris,fetch_20newsgroups iris load_iris() iris_data pd.DataFrame(data iris.data, columns[Sepal_Length,Sepal_Width,Petal_Length,Petal_Width]) iris_data[target] iris.target def iris_plot(data, col1, col2): sns.lmplot(xcol1, ycol2, datadata, huetarget, fit_regFalse) plt.xlabel(col1) plt.ylabel(col2) plt.show() iris_plot(iris_data, Sepal_Length, Petal_Width) iris_plot(iris_data, Sepal_Width, Petal_Length)3.3 数据集划分sklearn.model_selection.train_test_split(arrays, *options) x数据集的特征值 y数据集的标签值 test_size测试集的大小一般为float random_state随机数种子不同的种子会造成不同的随机采样结果相同的种子采样结果相同 return训练集特征值、测试集特征值、训练集标签、测试集标签默认随机取from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test train_test_split(iris.data, iris.target, test_size 0.2, random_state2) print(训练集的特征值是\n,x_train) print(测试集的特征值是\n,x_test) print(训练集的标签是\n,y_train) print(测试集的标签是\n,y_test) x_train1, x_test1, y_train1, y_test1 train_test_split(iris.data, iris.target, test_size 0.2, random_state20) x_train2, x_test2, y_train2, y_test2 train_test_split(iris.data, iris.target, test_size 0.2, random_state20) print(训练集的标签是\n,y_test1) print(训练集的标签是\n,y_test2)五、特征工程-特征预处理1.什么是特征预处理1.1 特征预处理定义通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程为什么要进行归一化特征的单位或大小相差较大或者某特征的方差相比其他的特征要大出几个数量级容易影响支配目标结果使得一些算法无法学习到其他的特征1.2 包含内容数值型数据的无量纲化归一化标准化1.3 特征预处理APIsklearn.preprocessing2.归一化2.1 定义通过对原始数据进行变换把数据映射到默认为[01]之间2.2 公式mx、mi分别为指定区间默认mx为1mi为02.3 APIsklearn.preprocessing.MinMaxScaler(feature_range(0,1)...) feature_range自己指定范围默认0-1from sklearn.preprocessing import MinMaxScaler import pandas as pd data pd.read_csv(D:\major\myjupyter\MachineLearning\data\dating.txt) print(data) # 1.归一化 # 1.1实例化一个转换器 transfer MinMaxScaler(feature_range(0,1)) # 1.2调用fit_transform方法 minmax_data transfer.fit_transform(data[[milage,Liters,Consumtime]]) print(经过归一化处理之后的数据为\n,minmax_data)2.4 归一化总结最大值最小值是变化的最大值与最小值非常容易受异常点影响所以这种方法鲁棒性较差只适合传统精确小数据场景3.标准化3.1 定义通过对原始数据进行变换把数据变换到均值为0标准差为1范围内3.2 公式作用域每一列mean为平均值分母为标准差3.3 APIsklearn.preprocessing.StandardScaler()from sklearn.preprocessing import StandardScaler import pandas as pd # 2.标准化 # 2.1实例化一个转换器 transfer StandardScaler() # 2.2调用fit_transform方法 minmax_data transfer.fit_transform(data[[milage,Liters,Consumtime]]) print(经过标准化处理之后的数据为\n,minmax_data)六、鸢尾花种类预测——流程实现1.再识K-近邻算法sklearn.neighbors.KNeighboresClassifier(n_neighbors5, algorithmauto) n_neighborsint可选默认5k_neighbors查询默认使用的邻居数 algorithm{auto,ball_tree,kd_tree,brute} 快速k近邻搜索算法默认参数为auto可以理解为算法自己决定适合的搜索算法 brute蛮力搜索即线性扫描当训练集很大时计算非常耗时 kd_tree构造kd树存储数据以便对其进行快速检索的树形数据结构kd树也就是数据结构中的二叉树。以种植切分构造的书每个节点是一个超巨星在维数小于20时效率高 ball_tree为了克服kd树高维失败而发明的其构造过程是以质心C和半径r分割样本空间每一个节点是一个超球体2.案例鸢尾花种类预测2.1 数据集介绍2.2 步骤分析获取数据集数据基本处理特征工程机器学习模型训练模型评估2.3 代码过程from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier # 1.获取数据集 iris load_iris() # 2.数据基本处理 # 2.1 数据分割 x_train, x_test, y_train, y_test train_test_split(iris.data, iris.target, test_size 0.2, random_state22) # 3.特征工程 # 3.1 实例化一个转换器 transfer StandardScaler() # 3.2 调用fit_transform方法 x_train transfer.fit_transform(x_train) x_test transfer.fit_transform(x_test) # 4.机器学习模型训练 # 4.1 实例化一个估计器 estimator KNeighborsClassifier(n_neighbors5) # 4.2 模型训练 estimator.fit(x_train, y_train) # 5.模型评估 # 5.1 输出预测值 y_pre estimator.predict(x_test) print(预测值是\n, y_pre) print(真实值和预测值对比\n, y_pre y_test) # 5.2 输出准确率 ret estimator.score(x_test, y_test) print(准确率是\n,ret)七、交叉验证和网格搜索1.什么是交叉验证将拿到的训练数据分为训练和验证集1.1 分析1.2 为什么需要交叉验证为了让被评估的模型更加准确可信2.什么是网格搜索3.交叉验证、网格搜索模型选择与调优APIsklearn.model_selection.GridSearchCV(estimator, param_gridNone, cvNone) estimator估计器对象 param_grid估计器参数(dict){n_neighbors:[1,3,5]}即需要传递的超参数 cv指定几折交叉验证 fit输入训练数据 score准确率 结果分析 best_score_在交叉验证中的最好结果 best_estimator_最好的参数模型 cv_results_每次交叉验证后的验证集准确率结果和训练集准确率结果4.鸢尾花案例增加K值调优from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split,GridSearchCV from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier # 1.获取数据集 iris load_iris() # 2.数据基本处理 # 2.1 数据分割 x_train, x_test, y_train, y_test train_test_split(iris.data, iris.target, test_size 0.2, random_state22) # 3.特征工程 # 3.1 实例化一个转换器 transfer StandardScaler() # 3.2 调用fit_transform方法 x_train transfer.fit_transform(x_train) x_test transfer.fit_transform(x_test) # 4.机器学习模型训练 # 4.1 实例化一个估计器 estimator KNeighborsClassifier(n_neighbors1) # 4.2 调用交叉验证网格搜索模型 param_grid {n_neighbors:[1,3,5,7,9]} estimator GridSearchCV(estimator, param_grid param_grid, cv10, n_jobs-1) # 4.3 模型训练 estimator.fit(x_train, y_train) # 5.模型评估 # 5.1 输出预测值 y_pre estimator.predict(x_test) print(预测值是\n, y_pre) print(真实值和预测值对比\n, y_pre y_test) # 5.2 输出准确率 ret estimator.score(x_test, y_test) print(准确率是\n,ret) # 5.3 其他评价指标 print(最好的模型\n,estimator.best_params_) print(最好的结果\n,estimator.best_score_) print(整体模型结果\n,estimator.cv_results_)八、案例2预测FaceBook签到位置1.数据集介绍2.流程分析2.1 获取数据集2.2 基本数据处理缩小数据范围选择时间特征去掉签到较少的地方确定特征值和目标值分割数据集2.3 特征工程——特征预处理标准化2.4 机器学习——knncv2.5 模型评估
返回列表