KNN算法及其在心脏病数据集上的应用

在众多学习类型中,监督学习是一种已经有了正确输出和与之相关的特征集的学习方式。使用一些算法,尝试用现有数据训练它们,然后尝试预测只有特征与之相关的新数据的输出。这就像老师一样,老师教学生一些东西,并告诉他们什么是正确的,然后当他们参加考试时,他们需要知道他们学到了什么,并提供正确的答案。KNN算法既可以用于分类任务,也可以用于回归任务。

KNN算法简介

KNN算法试图在数据集中找到预测变量和值之间的相似性。它使用非参数方法,因为不需要将参数找到特定的函数形式。它不对数据集的特征和输出做任何假设。KNN也被称为懒惰分类器,因为它记住了训练数据,而不是真正学习和固定权重。因此,大部分计算工作发生在分类而不是训练时间。KNN通常通过查看新特征接近哪个类别,然后将其归入最接近的类别来工作。

KNN算法的工作流程

首先,在KNN算法中选择一个K值。然后进行距离度量,这里考虑欧几里得距离。找到k个邻居的欧几里得距离。然后检查所有给定新点的邻居,看哪个最接近点。只检查k-最近邻。然后看看哪个类别获得的票数最多。票数最多的类别被选中,将新点分配给该类别。通过这种方式,使用KNN算法。

KNN中理想的K值

通常选择一个奇数的K值,因为在投票时,看到哪个编号的类别获得更多的票数更好,从而可以将新类别分配给该类别。如果选择太小的k值,可能会过度拟合数据,也就是说,算法可能在训练上表现合理,但在测试数据上表现不佳。而且,如果只使用小的k值,如果数据量大,也可能遇到噪声。确定k的一种方法是查看k的错误图,并运行一组值的循环,与最低错误相关的k值可以用于问题。在心脏病数据的实现中,将执行这些步骤。

KNN算法的优缺点

优点:可以轻松实现算法。它通过平均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算法可以识别相似的文档。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485