到目前为止,我们已经很好地掌握了回归和分类方面的工作原理。今天,让我们回顾一下最早的ML算法之一,即KNN或K近邻算法。该算法背后的想法是非常简单明了的。但它并不值得低估,而是值得期待的东西。最后,我还为KNN准备了一个有趣的用例。让我们看看你是否能猜到它是什么。如果你还没有,请看看我列表中的pandas教程。
K最近的邻居的直觉
正如我所说,KNN是一个非常直接的算法。它实际上是唯一具有O(1)训练复杂度和没有训练过程的算法。什么!这没有意义,但如果它不训练,它怎么知道要预测什么?这是一个绝对有效的问题,毕竟从我们研究的所有内容来看,我们是通过数据集来训练我们的模型。如果我们不训练它们,我们怎么能得出正确的推断呢?答案就在于KNN用来预测结果的技术。是的,它没有训练过程,但这意味着它也有一个更长的预测过程。让我们通过一个例子来理解它。
KNN算法的例子
假设我们有一个叫Garry的朋友,他想在一个小区里买房子。问题是Garry有一个习惯,无论价格多高,他都会同意最初的价格,而经纪人知道这一点并试图利用这种情况。你知道了这件事,要求加里让你代替他出价。你注意到的是,整个地区有一个模式,即相互靠近的房子有类似的价格。了解到这一点后,你想出了一个办法,以正确的价格出价。
你们三个人找了一阵子,到最后,加里找到了他很喜欢的房子。经纪人告诉了他要定的价格,贪婪的他说了一个5万美元的价格,这很牵强。你否认了房子这么贵的说法,经纪人看起来很生气,问你觉得多少钱。你知道附近三个房子的价格,即2万、3万和2.5万。所以你提出了这些房子的平均价格,即2.5万。经纪人看起来很震惊,并为欺骗Garry而道歉。加里对你表示感谢,并请你去一家不错的餐厅吃饭,以感谢你的帮助。
K最近的邻居的工作
上面的例子与KNN的工作非常相似。KNN所做的是,它在训练集中找到与你想预测的目标点相近的点,并根据你要解决的问题的类型,即分类或回归,给出这些点的多数类或目标的平均数值。但是,K在哪里起作用?更重要的是它是什么?
之前我说过,KNN会找到与我们想要预测的点相近的点,但是我们要找到多少个点的多数或平均值?例如,如果k=5,这意味着我们将从最近的5个点中推断出数值。这个名字是有意义的,因为它要考虑到k个最近的点来推断数值。
那么,这个k是如何影响推断的呢?k的值越小,就越容易过度拟合。k的值越高,越容易受到异常值的影响。因此,找到k的最佳值是很重要的。让我们来看看我们如何做到这一点。
建立K-NN算法的步骤
K-NN工作可以建立在以下算法的基础上
第一步:选择邻居的数量K。没有特别的方法来确定 "K "的最佳值,所以我们需要尝试一些值来找到其中的最佳选择。最理想的K值是5。一个非常低的K值,如K=1或K=2,可能会有噪音,并导致模型中的异常值的影响。大的K值是好的,但它可能会发现一些困难。
第二步:接下来,计算数据点之间的欧氏距离。欧氏距离是两点之间的距离,这一点我们在几何学中已经研究过了。
第三步:根据计算出的欧氏距离,选择K个最近的邻居。找到最佳K值的一些方法是
- 平方根法: ,取k为训练点数量的平方根。k通常取奇数,所以如果使用这个方法是偶数,就用+/-1使其成为奇数。
- 超参数调谐:应用超参数调整来找到k的最佳值。
- 施瓦兹准则: 你能做的最狂热和最夸张的事情。它的作用是最小化失真+λDklogN。我们不要再谈论它了!
第四步:在这k个邻居中,计算每一类数据点的数量。KNN假设相似的点彼此之间更接近。
第五步:之后,让我们把新的数据点分配到邻居数量最多的那个类别中。它被分组到靠近数据点的类别中。
第六步:就这样,我们的KNN模型已经准备好了。
使用sklearn实现KNN
这就是我所说的惊喜,如果你猜对了,恭喜你。对于以前的教程,演练变得有点单调,所以我想给事情加点料。因此,让我们开始这个教程,我们将识别存在于sklearn的数据集中的Olivetti面孔。让我们从导入所需的库开始,然后再导入我们的数据。
#Importing the required libraries
import numpy as np
from sklearn.datasets import fetch_olivetti_faces
from sklearn.metrics import accuracy_score
#Importing the data
data = fetch_olivetti_faces()
X = data.data
Y = data.target
现在我们有了数据,让我们来分割它,但我们看到的一件事是,有40张不同的脸,每张脸有10张图片,所以当我们分割时,我们希望两组中都有所有的图片。确保这一点的一个方法是使用stratify参数,以确保目标类别的比例在分裂中是相同的。
#Splitting the data into train and test data
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, stratify = Y)
我们来训练我们的模型
#Import knearest neighbors Classifier model
from sklearn.neighbors import KNeighborsClassifier
#Training the model
clf = KNeighborsClassifier(n_neighbors=3)
#Train the model using the training sets
clf.fit(X_train, Y_train)
#Predict the response for test dataset
Y_pred = clf.predict(X_test)
让我们找出准确率,在这种情况下,准确率达到了0.86。
#Import scikit-learn metrics module for accuracy calculation
from sklearn import metrics
# Calculating the Model Accuracy
print("Accuracy:",metrics.accuracy_score(Y_test, Y_pred))
耶!你创建了一个人脸识别模型,如此轻松和庆祝。而且,鉴于相同的面孔一定会有类似的点,使它们聚集在一起,相互靠近,所以KNN相当适合它。
K近邻的优点
- 没有训练期 它在训练期不学习任何东西。它不会从训练数据中得出任何判别功能。
- 数据很容易被更新,不会影响算法的准确性。
- KNN算法很容易实现
K近似值的缺点
- 归一化数据很重要,否则有可能导致不好的预测结果。
- 这种算法在大型数据集上效果不好。
- 它不能很好地处理高维数据集。
总结
希望你喜欢这篇关于KNN算法的文章。