在众多学习类型中,监督学习是一种已经有了正确输出和与之相关的特征集的学习方式。使用一些算法,尝试用现有数据训练它们,然后尝试预测只有特征与之相关的新数据的输出。这就像老师一样,老师教学生一些东西,并告诉他们什么是正确的,然后当他们参加考试时,他们需要知道他们学到了什么,并提供正确的答案。KNN算法既可以用于分类任务,也可以用于回归任务。
KNN算法试图在数据集中找到预测变量和值之间的相似性。它使用非参数方法,因为不需要将参数找到特定的函数形式。它不对数据集的特征和输出做任何假设。KNN也被称为懒惰分类器,因为它记住了训练数据,而不是真正学习和固定权重。因此,大部分计算工作发生在分类而不是训练时间。KNN通常通过查看新特征接近哪个类别,然后将其归入最接近的类别来工作。
首先,在KNN算法中选择一个K值。然后进行距离度量,这里考虑欧几里得距离。找到k个邻居的欧几里得距离。然后检查所有给定新点的邻居,看哪个最接近点。只检查k-最近邻。然后看看哪个类别获得的票数最多。票数最多的类别被选中,将新点分配给该类别。通过这种方式,使用KNN算法。
通常选择一个奇数的K值,因为在投票时,看到哪个编号的类别获得更多的票数更好,从而可以将新类别分配给该类别。如果选择太小的k值,可能会过度拟合数据,也就是说,算法可能在训练上表现合理,但在测试数据上表现不佳。而且,如果只使用小的k值,如果数据量大,也可能遇到噪声。确定k的一种方法是查看k的错误图,并运行一组值的循环,与最低错误相关的k值可以用于问题。在心脏病数据的实现中,将执行这些步骤。
优点:可以轻松实现算法。它通过平均k-最近邻对嘈杂数据非常有效。在大数据情况下表现良好。形成的决策边界可以是任意形状的。
缺点:维度的诅咒:不相关属性对距离的主导。找到正确的k值有时可能耗时。由于其距离度量,计算成本非常高。
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# 导入KNeighborsClassifier进行分类任务
# 从sklearn库中导入,sklearn定义了几乎所有的机器学习分类器,可以调用并使用它们来解决问题
df = pd.read_csv('heart.csv')
df.head()
# 目标告诉这个人是否患有心脏病
sns.countplot(df['target'])
# 将继续进行,因为目标数据没有太多不平衡
x= df.iloc[:,0:13].values
y= df['target'].values
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.25, random_state=0)
from sklearn.preprocessing import StandardScaler
st_x= StandardScaler()
x_train= st_x.fit_transform(x_train)
x_test= st_x.transform(x_test)
# 这是所有ML任务的常见步骤,刚刚分割了数据集并对其进行了缩放以进行进一步处理
error = []
# 计算1到30之间的K值的错误
for i in range(1, 30):
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))
plt.figure(figsize=(12, 6))
plt.plot(range(1, 30), error, color='red', linestyle='dashed', marker='o',
markerfacecolor='blue', markersize=10)
plt.title('Error Rate K Value')
plt.xlabel('K Value')
plt.ylabel('Mean Error')
print("Minimum error:-",min(error),"at K =",error.index(min(error))+1)
# 输出
# => Minimum error:- 0.13157894736842105 at K = 7
classifier= KNeighborsClassifier(n_neighbors=7)
classifier.fit(x_train, y_train)
y_pred= classifier.predict(x_test)
from sklearn.metrics import confusion_matrix
cm= confusion_matrix(y_test, y_pred)
# 输出 =>array([[26, 7],
# [ 3, 40]], dtype=int64)
# 这样可以看到混淆矩阵。这里指定k值为7,因为得到了7的最低平均错误。
accuracy_score(y_test, y_pred)
# 输出 => 0.868421052631579
# 在25%的数据集上得到了86%的准确率,这是一个好兆头。可以通过进行更多的超参数调整来提高它们。
现在知道了KNN以及如何实现它们。让看看KNN的一些应用场景。
1. 音乐推荐系统:可能是任何推荐系统。但在音乐系统的情况下,有大量的音乐进来,有很大的机会得到相同音乐的不同版本被推荐,这些可以通过KNN进行分析。甚至可以使用它来看哪些音乐是人的喜好。
2. 异常检测:KNN有能力识别异常值。
3. 使用KNN算法可以识别相似的文档。