📅  最后修改于: 2020-09-27 09:02:38             🧑  作者: Mango
假设有两个类别,即类别A和类别B,并且我们有一个新的数据点x1,因此此数据点将位于这些类别中的哪个类别中。为了解决这类问题,我们需要一种K-NN算法。借助K-NN,我们可以轻松识别特定数据集的类别或类别。考虑下图:
K-NN的工作可以根据以下算法进行解释:
假设我们有一个新的数据点,我们需要将其放在所需的类别中。考虑下图:
在K-NN算法中选择K的值时,要记住以下几点:
为了执行K-NN算法的Python实现,我们将使用与Logistic回归中相同的问题和数据集。但是这里我们将改善模型的性能。问题描述如下:
K-NN算法的问题:有一家汽车制造商公司制造了一辆新的SUV汽车。该公司希望将广告投放给有兴趣购买该SUV的用户。因此对于这个问题,我们有一个数据集,该数据集包含通过社交网络的多个用户信息。数据集包含大量信息,但是我们将考虑自变量的估计薪资和年龄,而已购买变量则用于因变量。以下是数据集:
实现K-NN算法的步骤:
数据预处理步骤:
数据预处理步骤将与Logistic回归完全相同。下面是它的代码:
# importing libraries
import numpy as nm
import matplotlib.pyplot as mtp
import pandas as pd
#importing datasets
data_set= pd.read_csv('user_data.csv')
#Extracting Independent and dependent Variable
x= data_set.iloc[:, [2,3]].values
y= data_set.iloc[:, 4].values
# Splitting the dataset into training and test set.
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)
#feature Scaling
from sklearn.preprocessing import StandardScaler
st_x= StandardScaler()
x_train= st_x.fit_transform(x_train)
x_test= st_x.transform(x_test)
通过执行上述代码,我们的数据集将导入到我们的程序中并进行了充分的预处理。功能缩放后,我们的测试数据集将如下所示:
从上面的输出图像中,我们可以看到我们的数据已成功缩放。
然后,我们将分类器适合训练数据。下面是它的代码:
#Fitting K-NN classifier to the training set
from sklearn.neighbors import KNeighborsClassifier
classifier= KNeighborsClassifier(n_neighbors=5, metric='minkowski', p=2 )
classifier.fit(x_train, y_train)
输出:通过执行上述代码,我们将获得以下输出:
Out[10]:
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=5, p=2,
weights='uniform')
#Predicting the test set result
y_pred= classifier.predict(x_test)
输出:
上面代码的输出将是:
#Creating the Confusion matrix
from sklearn.metrics import confusion_matrix
cm= confusion_matrix(y_test, y_pred)
在上面的代码中,我们导入了confusion_matrix 函数 ,并使用变量cm对其进行了调用。
输出:通过执行上述代码,我们将得到如下矩阵:
在上图中,我们可以看到有64 + 29 = 93个正确的预测和3 + 4 = 7个错误的预测,而在Logistic回归中,有11个错误的预测。因此,可以说使用K-NN算法可以提高模型的性能。
#Visulaizing the trianing set result
from matplotlib.colors import ListedColormap
x_set, y_set = x_train, y_train
x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01),
nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01))
mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape),
alpha = 0.75, cmap = ListedColormap(('red','green' )))
mtp.xlim(x1.min(), x1.max())
mtp.ylim(x2.min(), x2.max())
for i, j in enumerate(nm.unique(y_set)):
mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1],
c = ListedColormap(('red', 'green'))(i), label = j)
mtp.title('K-NN Algorithm (Training set)')
mtp.xlabel('Age')
mtp.ylabel('Estimated Salary')
mtp.legend()
mtp.show()
输出:
通过执行以上代码,我们将得到下图:
输出图与我们在Logistic回归中出现的图不同。从以下几点可以理解:
#Visualizing the test set result
from matplotlib.colors import ListedColormap
x_set, y_set = x_test, y_test
x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01),
nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01))
mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape),
alpha = 0.75, cmap = ListedColormap(('red','green' )))
mtp.xlim(x1.min(), x1.max())
mtp.ylim(x2.min(), x2.max())
for i, j in enumerate(nm.unique(y_set)):
mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1],
c = ListedColormap(('red', 'green'))(i), label = j)
mtp.title('K-NN algorithm(Test set)')
mtp.xlabel('Age')
mtp.ylabel('Estimated Salary')
mtp.legend()
mtp.show()
输出:
上图显示了测试数据集的输出。从图中可以看出,由于大多数红点位于红色区域,而大多数绿点位于绿色区域,因此预测输出效果很好。
但是,红色区域中的绿点很少,绿色区域中的红点很少。因此,这些是我们在混淆矩阵中观察到的错误观察结果(7错误输出)。