kNN算法是监督学习中的一个重要部分,它用于近似求解实际或离散值的目标函数。这种算法的特点是存储训练样本,并在测试样本输入时寻找最匹配的样本。kNN算法也被称为基于实例的学习或记忆基础学习。常见的实例基础学习算法包括kNN、RBF(径向基函数)网络和核机器。本文将讨论kNN算法及其实际实现。
kNN是一种监督学习算法,既可用于分类任务,也可用于回归任务。由于它在预测之前不做任何工作,直到确切知道需要预测的内容和变量类型,因此kNN常被称为懒惰学习算法。它是一个非常有效的交叉验证工具,对许多用户来说,这是一种易于理解的学习方法。kNN支持解释和训练,并且可以使用任何距离度量。
与基于记忆的学习相关的缺点包括维度的诅咒、运行时间成本随着训练集大小的增加而增加、大型训练集无法适应内存,以及在回归情况下预测值不连续。
1. 在训练阶段,算法保存训练样本。
2. 在预测阶段,算法在训练样本中找到与测试样本最接近的k个样本,然后预测这些样本中最常见的类别。
欧几里得距离是用于计算的常用度量之一,它用于找出k个最近邻和进行预测。当属性的尺度和差异相似,且属性尺度相等范围或方差时,欧几里得距离给予所有属性相等的权重,并假设类别是球形的。
‘k’代表最近邻的数量。在上图中,可以看到一些圆形和一些正方形,它们是分类。星号是测试样本,它要么被归类为圆形,要么被归类为正方形。如果k=3,星号被分配给圆形,因为有两个圆形和一个正方形。在另一个例子中,如果k=5,星号被归类为正方形,因为有三个正方形和两个圆形。通过这种方式,kNN分类完成。‘k’的值需要仔细选择,太大和太小的k值的影响如下概述。
1. 对噪声不太敏感,尤其是噪声。
2. 对离散类别有更好的概率估计。
3. 较大的训练集允许较大的k值。
1. 更好地捕捉问题空间的细结构。
2. 在小型训练集中是必要的。
这个算法的一个重要方面是,随着训练集接近无穷大,k值增大,kNN变得最优。
1.推荐系统- 亚马逊和Flipkart通过目标营销工具推荐产品,这些产品基于搜索历史和喜好,最有可能购买。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 导入numpy, pandas, 和matplotlib.pyplot包
df=pd.read_csv('heart.csv')
df是数据框架,其中加载了‘heart’数据集。
df.head()
df.shape
df.info()
df.describe().T
df.isnull().sum()
# 加载数据集后,使用head()函数读取数据集的前5行,
# shape函数用于查找行数和列数,在这种情况下,它是303行和14列,
# info()函数给提供了数据类型、列、空值计数、内存使用等信息。然后,
# describe()函数被用来生成数据集的描述性统计。
T是用于转置df数据框架的索引和列。为了确保数据集是干净的,使用isnull()函数,
发现没有空值。让进一步编码
import seaborn as sns
sns.pairplot(df,hue='target')
导入了基于matplotlib的数据可视化seaborn库,并创建了一个成对图。成对图有助于创建联合关系的散点图和单变量分布的直方图。让进一步分析数据集
plt.figure(figsize=(14,12))
sns.heatmap(df.corr(), annot=True,cmap ='RdYlGn')
为了找到两个量之间的关系,使用了皮尔逊相关系数,这也将测量两个变量之间的关联强度。此外,使用了热图来生成信息的二维表示,使用颜色。现在,来到建模数据的重要部分,这将给预测的力量。
from sklearn.preprocessing import StandardScaler
X = pd.DataFrame(StandardScaler().fit_transform(df.drop(['target'],axis = 1)),
columns=['age', 'sex', 'cp', 'trestbps', 'chol','fbs', 'restecg', 'thalach','exang','oldpeak','slope','ca','thal'])
X.head()
# 导入了scikit-learn机器学习库软件中的standard scaler。缩放数据对于kNN很重要,
# 因为将所有特征带到同一尺度上是推荐的应用基于距离的算法。
X = df.drop('target',axis=1).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.35,random_state=5)
from sklearn.neighbors import KNeighborsClassifier
neighbors = np.arange(1,14)
train_accuracy =np.empty(len(neighbors))
test_accuracy = np.empty(len(neighbors))
for i,k in enumerate(neighbors):
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
train_accuracy[i] = knn.score(X_train, y_train)
test_accuracy[i] = knn.score(X_test, y_test)
plt.title('k-NN Varying number of neighbors')
plt.plot(neighbors, test_accuracy, label='Testing Accuracy')
plt.plot(neighbors, train_accuracy, label='Training accuracy')
plt.legend()
plt.xlabel('Number of neighbors')
plt.ylabel('Accuracy')
plt.show()
# 最初,为特征和目标创建了numpy数组。然后,从scikit-learn导入了train_test_split,
# 将数据分成训练和测试数据集。创建了一个35%的测试大小。然后,使用k-最近邻算法创建了一个分类器。
# 然后,观察了不同k值的准确性,可以看到k=7时,测试准确性最高。
knn = KNeighborsClassifier(n_neighbors=7)
knn.fit(X_train,y_train)
knn.score(X_test,y_test)
# 设置knn分类器为n_neighbor=7后,拟合了模型。然后,得到了70.09%的准确度分数。
from sklearn.metrics import confusion_matrix,accuracy_score
y_pred = knn.predict(X_test)
confusion_matrix(y_test,y_pred)
# 混淆矩阵或错误矩阵是一个表格,它识别出真正的预测值,并被分类为真正的阳性、真正的阴性、假阳性和假阴性。
# 通过pandas的crosstab方法,它将更加清晰。
pd.crosstab(y_test, y_pred, rownames=['True'], colnames=['Predicted'], margins=True)
# 在上述输出中,0表示没有心脏病,1表示有心脏病。37个受试者是0~0意味着真正的阴性;38个受试者是1~1意味着真正的阳性;
# 13个受试者是0~1意味着假阳性,19个受试者是1~0意味着假阴性。这意味着在107个样本中,有75个被正确分类,其余的被错误分类。让得到完整的分类报告
from sklearn.metrics import classification_report
print(classification_report(y_test,y_pred))