手机网站在哪里找到,网上能免费做网站发布叼,做网站的价格表,吉林省软环境建设办公室网站目录
初识K-近邻算法
距离度量
K值选择
kd树
数据集划分
特征预处理
莺尾花种类预测(实操)
交叉验证与网格搜索 初识K-近邻算法
K-近邻算法#xff08;K-Nearest Neighbor#xff0c;KNN#xff09;是一种基本的分类和回归算法。它的基本思想是通过找出与新对象最近…目录
初识K-近邻算法
距离度量
K值选择
kd树
数据集划分
特征预处理
莺尾花种类预测(实操)
交叉验证与网格搜索 初识K-近邻算法
K-近邻算法K-Nearest NeighborKNN是一种基本的分类和回归算法。它的基本思想是通过找出与新对象最近邻的 K 个训练数据在分类时将新对象归类为出现频率最高的类别。这个算法是机器学习里面一个比较经典的算法总体来说KNN算法是相对比较容易理解的算法。 定义如果一个样本在特征空间中的k个最相似(即特征空间中最邻近的样本中的大多数属于某一个类别则该样本也属于这个类别。 距离公式两个样本的距离可以通过如下公式计算又叫欧式距离。 KNN算法流程总结 1计算已知类别数据集中的点与当前点之间的距离。 2按距离递增次序排序。 3选取与当前点距离最小的k个点。 4统计前k个点所在的类别出现的频率。 5返回前k个点出现频率最高的类别作为当前点的预测分类。 关于K-近邻算法API的使用要知道我们机器学习的流程是 1获取数据集 2数据基本处理 3特征工程 4机器学习 5模型评估 接下来我们开始使用机器学习的算法库Scikit-learn。其包括许多知名的机器学习算法的实现文档完善、容易上手、具有丰富的API。其包含的内容分类、聚类、回归、特征工程、模型选择、调优等功能非常适合新手小白上手操作。接下来我们终端执行如下命令开始对其进行安装
pip install scikit-learn -i https://pypi.mirrors.ustc.edu.cn/simple
接下来通过代码演示如何使用KNeighborsClassifier类构建一个基本的K-近邻分类器并进行数据预测
from sklearn.neighbors import KNeighborsClassifier# 构造数据
x [[1], [2], [10], [20]]
y [0, 0, 1, 1]# 模型训练
estimator KNeighborsClassifier(n_neighbors1) # 实例化一个估计器对象
estimator.fit(x, y) # 调用fit方法进行训练# 数据预测
ret1 estimator.predict([[-1000]]) # 它与训练点[1]的距离最近标记为[0]
print(ret1)ret2 estimator.predict([[1000]]) # 它与训练点[20]的距离最近标记为[1]
print(ret2)
最终呈现的结果如下所示 距离度量
距离度量是用来衡量数据对象之间相似性或差异性的方法。它通常用于K-近邻算法、聚类分析、降维算法等各种机器学习任务中。
在机器学习过程中对于函数dist(.,.,)若它是一“距离度量”则需要满足一些基本性质 常见的距离度量包括欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准化欧式距离、余弦距离、杰卡德距离等。这些距离度量方法可以根据数据的特点和应用场景进行选择以便更准确地描述数据对象之间的相似性或差异性。 1欧氏距离是最常见的距离度量方式用于衡量数据空间中两点之间的直线距离。 2曼哈顿距离衡量的是两点在各个坐标轴上的距离总和也称为城市街区距离。 3切比雪夫距离也称为棋盘距离是一种用于衡量向量和点之间的距离的度量方式。 4闵可夫斯基距离是这两者的泛化可以根据具体需要调整参数p来实现不同的距离度量方式。 5标准化欧式距离是一种对欧式距离进行标准化处理的方法通常用于数据的相似性度量。 6余弦距离是一种衡量向量之间相似性的度量方式常用于文本挖掘、信息检索等领域。 7杰卡德距离是一种用于衡量集合之间差异性的度量方式常用于计算两个集合的相似性或差异程度。 合适的距离度量方式可以帮助机器学习算法更好地理解和处理数据从而提高模型的性能和准确度。在实际应用中选择合适的距离度量方式是非常重要的因为它直接影响着模型的表现和结果的准确性。
K值选择
在机器学习中K 值通常用于 K 近邻算法K-Nearest Neighbors, KNN中代表着最近邻的数量。KNN 是一种基本的分类和回归算法其基本思想是根据样本间的距离来判断新样本的类别或数值。
KNN 算法的工作原理是对于一个待分类的样本它的类别取决于其 K 个最近邻样本中最常见的类别。K 值的选择会直接影响到 KNN 的性能和结果。
K 值的选择对 KNN 算法的影响主要体现在以下两个方面 1容易受噪声数据影响当 K 值较小时模型更容易受到噪声数据的干扰。如果 K1那么分类结果完全取决于最近邻的类别这可能导致对噪声数据过度敏感。而当 K 值较大时模型对噪声数据的影响会减小。 2模型的复杂度和偏差-方差权衡较小的 K 值会使得模型更加复杂因为它需要考虑更多的最近邻数据点。这可能导致模型过拟合出现高方差的情况。而较大的 K 值会使得模型更简单可能会导致欠拟合出现高偏差的情况。 因此在选择 K 值时需要进行适当的调整和折衷。一般来说K 值的选择可以通过交叉验证或网格搜索等方法进行模型选择和调优。具体选择哪个 K 值取决于数据集的大小、类别的平衡性、噪声数据的程度以及模型的复杂度等因素。在实际应用中可以通过尝试不同的 K 值并评估模型的性能来选择最优的 K 值。
K 值的选择问题 1选择较小的K值就相当于用较小的领域中的训练实例进行预测“学习近似误差会减小只有与输入实例较近或相似的训练实例才会对预测结果起作用与此同时带来的问题是“学习的估计误差会增大换句话说K值的减小就意味着整体模型变得复杂容易发生过拟合 2选择较大的K值就相当于用较大领域中的训练实例进行预测其优点是可以减少学习的估计误差但缺点是学习的近似误差会增大。这时候与输入实例较远不相似的训练实例也会对预测器作用使预测发生错误且K值的增大就意味着整体的模型变得简单。 3KNN为训练样本个数则完全不足取因为此时无论输入实例是什么都只是简单的预测它属于在训练实例中最多的类模型过于简单忽略了训练实例中大量有用信息。 名词解释 近似误差 1对现有训练集的训练误差关注训练集。 2如果近似误差过小可能会出现过拟合的现象对现有的训练集能有很好的预测但是对未知的测试样本将会出现较大偏差的预测。 3模型本身不是最接近最佳模型。 估计误差 1可以理解为对测试集的测试误差关注测试集。 2估计误差小说明对未知数据的预测能力好。 3模型本身最接近最佳模型。 在实际应用中K值一般取一个比较小的数值例如采用交叉验证法简单来说就是把训练数据在分成两组训练集和验证集来选择最优的K值。
kd树
KD 树(KD-Tree)是一种用于快速查找多维空间中最近邻点的数据结构。它是一种二叉树每个节点代表一个超矩形区域并且树的每一级都以不同的轴对数据进行分割。 为了避免每次都重新计算一遍距离算法会把距离信息保存在一棵树里这样在计算之前从树里查询距离信息尽量避免重新计算。其基本原理是如果A和B距离很远B和C距离很近那么A和C的距离也很远。有了这个信息就可以在合适的时候跳过距离远的点。
根据KNN每次需要预测一个点时我们都需要计算训练数据集里每个点到这个点的距离然后选出距离最近的k个点进行投票。当数据集很大时这个计算成本非常高。 最近邻域搜索 kd树K-dimensiontree是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。kd树是一种二叉树表示对k维空间的一个划分构造kd树相当于不断地用垂直于坐标轴的超平面将K维空间切分构成一系列的K维超矩形区域。kd树的每个结点对应于一个k维超矩形区域。利用kd树可以省去对大部分数据点的搜索从而减少搜索的计算量。 kd树的构造 1构造根结点使根结点对应于K维空间中包含所有实例点的超矩形区域 2通过递归的方法不断地对k维空间进行切分生成子结点。在超矩形区域上选择一个坐标轴和在此坐标轴上的一个切分点确定一个超平面这个超平面通过选定的切分点并垂直于选定的坐标轴将当前超矩形区域切分为左右两个子区域子结点这时实例被分到两个子区域。 3上述过程直到子区域内没有实例时终止终止时的结点为叶结点。在此过程中将实例保存在相应的结点上。 4通常循环的选择坐标轴对空间切分选择训练实例点在坐标轴上的中位数为切分点这样得到的kd树是平衡的平衡二叉树它是一棵空树或其左子树和右子树的深度之差的绝对值不超过1且它的左子树和右子树都是平衡二叉树。 KD树中每个节点是一个向量和二叉树按照数的大小划分不同的是KD树每层需要选定向量中的某一维然后根据这一维按左小右大的方式划分数据。在构建KD树时关键需要解决2个问题 1选择向量的哪一维进行划分 是随机选择某一维或按顺序选择但是更好的方法应该是在数据比较分散的那一维进行划分分散的程度可以根据方差来衡量 2如何划分数据 可以使构建的树比较平衡可以每次选择中位数来进行划分。 数据集划分
机器学习一般的数据集会划分为两个部分 1训练数据用于训练构建模型 2测试数据在模型校验时使用用于评估模型是否有效 划分比例 训练集70%、80%、75% 测试集30%、20%、25% API划分 参数 1数据集的特征值 2数据集的标签值 3test_size测试集的大小一般为float 4random_state随机数种子不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。 return x_train、x_test、y_train、y_test 下面这段代码是用于将数据集iris.data 和 iris.target划分为训练集和测试集的工具。如下 train_test_split 函数是来自 scikit-learn 库中的一个方法用于将数据集划分为训练集和测试集。iris.data 是输入的特征数据其中包含了花朵的四个特征值萼片长度、萼片宽度、花瓣长度、花瓣宽度。iris.target 是目标数据其中包含了对应每个样本的分类标签0、1、2 分别代表三个不同的鸢尾花品种。test_size0.2 指定了测试集的大小这里是将数据集的 20% 分配给测试集剩余 80% 作为训练集。random_state22 是为了保证每次运行代码时都得到相同的划分结果它指定了随机数种子。 函数的返回值是四个数组x_train、x_test、y_train 和 y_test。其中x_train 和 y_train 是训练集的特征和标签数据x_test 和 y_test 是测试集的特征和标签数据。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split# 小数据集获取
iris load_iris()# 数据集划分
x_train, x_test, y_train, y_test train_test_split(iris.data, iris.target, test_size0.2, random_state22)
print(训练集的特征值是\n, x_train)
print(训练集的目标值是\n, y_train)
print(测试集的特征值是\n, x_test)
print(测试集的目标值是\n, y_test)print(训练集的目标值的形状是\n, y_train.shape)
print(测试集的目标值的形状是\n, y_test.shape)
通过将数据集划分为训练集和测试集我们可以使用训练集来训练机器学习模型然后使用测试集来评估模型的性能和准确度。这样可以帮助我们了解模型的泛化能力和预测能力。 特征预处理
特征预处理(Feature Preprocessing)是指对原始数据进行清洗、转换和归一化等操作以使其适合机器学习算法的输入要求和提高算法的性能。 在进行机器学习任务之前通常需要对原始数据进行预处理因为原始数据可能存在以下问题 1缺失值数据中可能存在缺失值即某些属性的取值为空。缺失值可能会影响模型的训练和预测因此需要进行缺失值处理可以通过填充均值、中位数、众数或者使用插值方法来处理缺失值。 2异常值数据中可能存在异常值即与其他样本明显不同的极端取值。异常值可能是由于测量误差或数据录入错误引起的需要进行异常值检测和处理可以通过删除异常值或用合理的取值替代异常值。 3数据类型转换数据可能包含不同的数据类型如文本、类别型数据、数值型数据等。不同的算法对于不同的数据类型有不同的处理方式因此需要将数据转换为适合算法处理的数据类型。 4特征缩放不同的特征可能具有不同的取值范围和单位这会对某些机器学习算法产生影响。为了避免某些特征对模型的影响过大需要对特征进行缩放常见的缩放方法包括标准化和归一化。 5特征选择在原始数据中可能存在冗余或无关的特征这些特征可能会增加模型的复杂度降低模型的泛化能力。因此需要对特征进行选择选取对目标变量有较强相关性的特征。 通过特征预处理可以使数据更加干净、可靠并为机器学习算法提供更有用和可解释的特征从而提高模型的准确性和性能。这里博主不可能全部讲解到上面的内容这里就拿特征缩放进行举例
标准化通过对原始数据进行变换把数据变换到均值为0标准差为1范围内 对于标准化来说如果出现异常点由于具有一定数据量少量的异常点对于平均值的影响并不大从而方差改变较小。 下面这段代码的核心是利用 StandardScaler 对象对数据进行标准化处理并打印出标准化后的数据、每一列的方差和每一列的平均值。
import pandas as pd
from sklearn.preprocessing import StandardScalerdef stand():# 标准化演示data pd.read_csv(dating.txt, sep\t)print(data)# 实例化transfer StandardScaler()# 进行转换调用fit_transformret_data transfer.fit_transform(data[[milage, Liters, Consumtime]])print(标准化之后的数据为\n, ret_data)print(每一列的方差为\n, transfer.var_)print(每一列的平均值为\n, transfer.mean_)stand()
最终呈现的结果为 归一化通过对原始数据进行变换把数据映射到默认为[0,1]之间。其公式如下 对于归一化来说如果出现异常点影响了最大值和最小值那么结果显然会发生改变。这里通过下面的这个例子来理解上面的过程 下面这段代码的核心是利用 MinMaxScaler 对象对数据进行归一化处理从而将数据缩放到指定的特征范围内这在机器学习和数据分析中是非常常见的预处理步骤。
import pandas as pd
from sklearn.preprocessing import MinMaxScalerdef minmax():# 归一化演示data pd.read_csv(dating.txt, sep\t)print(data)# 实例化transfer MinMaxScaler(feature_range(3, 5)) # 指定归一化后的特征范围# # 进行转换调用fit_transformret_data transfer.fit_transform(data[[milage, Liters, Consumtime]])print(归一化之后的数据为\n, ret_data)minmax()
最终呈现的效果如下 莺尾花种类预测(实操)
导入模块
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
获取数据
iris load_iris()
数据基本处理这段代码的主要作用是将数据集划分为训练集和测试集以便在机器学习模型的训练和评估过程中使用。通过将数据集划分为独立的训练集和测试集可以更好地评估模型对新数据的泛化能力。其中设置的随机种子 random_state22 保证了每次划分的结果都是固定的有助于结果的复现性。
x_train, x_test, y_train, y_test train_test_split(iris.data, iris.target, test_size0.2, random_state22)
特征工程特征预处理在这段代码中首先在训练集上调用 fit_transform() 方法计算并应用标准化转换得到标准化后的训练集特征数据 x_train。然后在测试集上调用 transform() 方法使用训练集上计算得到的均值和标准差来进行标准化转换得到标准化后的测试集特征数据 x_test。
transfer StandardScaler()
x_train transfer.fit_transform(x_train) # 计算均值和标准差
x_test transfer.transform(x_test)
机器学习-KNN在这段代码中首先通过创建 KNeighborsClassifier 对象来实例化一个 K 近邻分类器然后使用 fit() 方法对该分类器进行训练。训练过程就是让分类器从训练集中学习特征与标签之间的关系从而构建一个能够进行分类预测的模型。
estimator KNeighborsClassifier(n_neighbors5) # 实例化一个估计器
estimator.fit(x_train, y_train) # 模型训练
模型评估这段代码的主要作用是评估训练好的 K 近邻分类器在测试集上的表现。首先通过 predict() 方法进行预测然后通过比较预测值与真实值来评估分类器的准确率。最终输出预测值、预测值与真实值的对比结果以及分类器在测试集上的准确率。
y_pre estimator.predict(x_test) # 预测值结果输出
print(预测值是: \n, y_pre)
print(预测值与真实值的对比是: \n, y_pre y_test)score estimator.score(x_test, y_test) # 准确率计算
print(准确率为: \n, score)
当然我们可以关闭随机数种子让准确率发生变化最终呈现的效果如下 总结 交叉验证与网格搜索
交叉验证将拿到的训练数据分为训练和验证集。以下图为例将数据分成4份其中一份作为验证集。然后经过4次(组)的测试每次都更换不同的验证集。即得到4组模型的结果取平均值作为最终结果。又称4折交叉验证。
我们之前知道数据分为训练集和测试集但是为了让从训练得到模型结果更加准确。做以下处理 训练集训练集验证集测试集测试集 交叉验证的目的为了让被评估的模型更加准确可信。这个只是让被评估的模型更加准确可信那么怎么选择或者调优参数呢这里需要用到下面的网格搜索
网格搜索通常情况下有很多参数是需要手动指定的如k-近邻算法中的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.数据基本处理
x_train, x_test, y_train, y_test train_test_split(iris.data, iris.target, test_size0.2, random_state22)# 3.特征工程特征预处理
transfer StandardScaler()
x_train transfer.fit_transform(x_train) # 计算均值和标准差
x_test transfer.transform(x_test)# 4.机器学习-KNN
estimator KNeighborsClassifier() # 实例化一个估计器
estimator.fit(x_train, y_train) # 调用 fit 方法进行训练# 4.1 模型调优-交叉验证网格搜索
param_grid {n_neighbors: [1, 3, 5, 7]}
grid_search GridSearchCV(estimator, param_gridparam_grid, cv5)
grid_search.fit(x_train, y_train) # 对已经训练过的分类器应用 GridSearchCV# 5.模型评估
y_pre grid_search.predict(x_test) # 预测值结果输出
print(预测值是: \n, y_pre)
print(预测值与真实值的对比是: \n, y_pre y_test)score grid_search.score(x_test, y_test) # 准确率计算
print(准确率为: \n, score)# 查看交叉验证网格搜索的一些属性
print(在交叉验证中得到的最好结果是: \n, grid_search.best_score_)
print(在交叉验证中得到的最好模型是: \n, grid_search.best_estimator_)
print(在交叉验证中得到的模型结果是: \n, grid_search.cv_results_)
最终呈现的结果为