当前位置: 首页 > 科技观察

K-NearestNeighbors监督学习机算法深度剖析_0

时间:2023-03-18 13:42:45 科技观察

译者|朱宪忠校对|梁策孙淑娟的回归和分类任务。KNN可以根据当前训练数据点的特征对测试数据集进行预测。这是通过计算测试数据和训练数据之间的距离来实现的,假设相似的事物存在于近距离内。该算法存储学习到的数据,使其更有效地预测和分类新数据点。当输入一个新的数据点时,KNN算法能够学习该数据的特征。然后,它将这个新数据点放置在更靠近那些共享相同特征的当前训练数据点的位置。1.KNN中K的含义一般来说,KNN中的“K”是一个参数,表示最近邻的个数。K为正整数,通常很小,建议指定为奇数。K值为数据点创建了一个环境,这使得指定哪个数据点属于哪个类别变得更容易。下面的示例显示了3个图表。首先,第一张图负责完成数据的初始化,实现了绘制数据点并将其分配到不同的类别(A和B),给出了一个新的待分类样本。第二张图负责完成距离计算。在这个图中,计算从新的样本数据点到最近的训练数据点的距离。但是,这仍然没有完成对新样本数据点的分类。因此,使用K值实质上会创建一个邻域,我们可以在其中对新的样本数据点进行分类。因此,我们可以说当k=3时,新的数据点属于B类。因为与新数据点具有相似特征的B类训练数据点多于A类数据点。图表来源:datacamp.com如果我们将K值增加到7,则新数据点将是A类数据点。因为有与新数据点具有相似特征的A类训练数据点比B类数据点更多。图源:datacamp.comK值通常是一个很小的数字,因为随着K值的增加,错误率也会增加。下图说明了这一点:图源:analyticsvidhya但是,如果K的值很小,会导致低偏差但高方差,导致模型过拟合。此外,我们还建议将K值指定为奇数。因为如果我们试图对一个新的数据点进行分类,而我们只有偶数个类型(比如类型A和类型B),它可能会产生不准确的输出。因此,强烈建议选择奇数的K值,避免出现“平局”的情况。2.计算距离KNN会计算数据点之间的距离,以便对新的数据点进行分类。KNN中计算该距离最常用的方法有欧几里德法、曼哈顿法和闵可夫斯基法。欧式距离是利用两点之间直线的长度来计算两点之间的距离。欧几里德距离的公式是新数据点(x)与现有训练数据点(y)之间的平方差之和的平方根。曼哈顿距离是两点之间的距离,作为它们笛卡尔坐标的绝对差之和。曼哈顿距离的公式是利用坐标轴上的线段来计算新数据点(x)和现有训练数据点(y)之间的长度之和。闵可夫斯基距离是赋范向量空间中两点之间的距离,是欧氏距离和曼哈顿距离的推广。在p=2的Minkowski距离公式中,我们得到欧氏距离,也称为L2距离。当p=1时,我们得到曼哈顿距离,也称为L1距离,或者城市街区距离,也称为LASSO距离。下图给出了相应的公式:下图解释了三者的区别:图源:Packt订阅3.KNN算法的工作原理使用奇数来避免平局的情况。计算新数据点与相邻的现有训练数据点之间的距离。找到新数据点的第K个最近的邻居。下图概括了这些步骤:图表来源:kdnuggets.com4.KNN算法分类任务应用示例以下是借助Iris数据集在分类任务中使用KNN算法的示例:1.导入库importnumpy作为npimportmatplotlib.pyplot作为pltimportpandas作为pd2。加载Iris数据集url="https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"#Specifycolumnnamenames=['sepal-length','sepal-width','petal-length','petal-width','Class']#读入数据集dataset=pd.read_csv(url,names=names)目前执行结果如下:3.数据预处理是为了将数据集拆分为属性和标签。X变量将包含数据集的前四列,我们将其称为属性,y变量将包含最后一列,我们将其称为标签。X=数据集.iloc[:,:-1].valuesy=数据集.iloc[:,4].values4。划分训练集和测试集在这一步中,我们将数据集划分为训练和测试部分,这样可以了解算法在训练数据上的学习情况,以及在测试数据上的表现情况。fromsklearn.model_selectionimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.20)5.特征缩放特征缩放是预测前数据预处理的重要步骤。下面的方法用于归一化数据的特征范围。fromsklearn.preprocessingimportStandardScalerscaler=StandardScaler()scaler.fit(X_train)X_train=scaler.transform(X_train)X_test=scaler.transform(X_test)6.使用KNN进行预测首先,我们需要从sklearn.neighbors库中导入KNeighborsClassifier类,然后选择K值。在此示例中,我选择了7(请记住,强烈建议选择奇数以避免平局)。fromsklearn.neighborsimportKNeighborsClassifierclassifier=KNeighborsClassifier(n_neighbors=7)classifier.fit(X_train,y_train)然后我们继续对测试数据集进行预测。y_pred=classifier.predict(X_test)7.算法准确率评估借助sklearn.metrics库,我们可以通过分类报告来评估算法的准确率,查看precision、recall和F1score。fromsklearn.metricsimportclassification_reportprint(classification_report(y_test,y_pred))下面给出代码的执行结果:由此可见,KNN算法对30个数据点进行了分类,平均总准确率为95%,recall率为93%,F1分数为94%。8.找到正确的K值在这个例子中,我选择了7的K值。如果我们想检查最优的K值是多少,我们可以生成一个图表来显示不同的K值以及由此产生的错误率。我将查看1到30之间的K值。为此,我们需要在1到30之间执行一个循环,在每个循环期间计算平均误差并将其添加到误差列表中。相关代码如下:error=[]#为iinrange(1,30)计算1到30之间K个值的错误率:knn=KNeighborsClassifier(n_neighbors=i)knn.fit(X_train,y_train)pred_i=knn.predict(X_test)error.append(np.mean(pred_i!=y_test))绘制K值错误率图:plt.figure(figsize=(12,5))plt.plot(range(1,30),error,color='red',marker='o',markerfacecolor='yellow',markersize=10)plt.title('错误率K值')plt.xlabel('K值')plt.ylabel('MeanError')输出图形如下:图形来源:作者例程的输出结果。从上图可以看出,平均误差为0的k值主要在k值13-23之间。五、总结KNN是一种简单的机器学习算法,易于实现,可用于在机器学习过程中执行回归和分类任务。其中,K值是表示最近邻值的参数。在实际应用中,建议指定K值为奇数。此外,在KNN算法中,您可以选择不同的距离度量算法(最常用的是欧氏距离、曼哈顿距离和闵可夫斯基距离)。原文链接:https://www.kdnuggets.com/2022/04/nearest-neighbors-classification.html译者简介朱宪忠,51CTO社区编辑,51CTO专家博主,讲师,潍坊某高校计算机教师,自由老手编程一件。早期专注于各种微软技术(编译成三本与ASP.NETAJX和Cocos2d-X相关的技术书籍)。/ESP32/RaspberryPi等物联网开发技术和Scala+Hadoop+Spark+Flink等大数据开发技术。