K最近邻算法(KNN)

正如俗话说----近朱者赤,近墨者黑,想象一下我们的数据集里面有一半是“朱”,一半是“墨”,现在有了一个新数据点,我们怎么判断它属于哪一个分类?

下面就引出了KNN的原理:新数据点离谁最近,就和谁属于同一类

所以说KNN是非常简单的算法,也是新手入门机器学习的简单算法

 

#导入数据集生成器

from sklearn.datasets import make_blobs

#导入KNN分类器

from sklearn.neighbors import KNeighborsClassifier

#导入画图工具

import matplotlib.pyplot as plt

#导入数据集拆分工具

from sklearn.model_selection import train_test_split

#生成数据集为200,分类为2的数据集

data = make_blobs(n_samples=200,centers=2,random_state=8)

 

K最近邻算法(KNN)

 

import numpy as np

x, y = data

#将生成的数据集进行可视化

plt.scatter(x[:,0],x[:,1],c=y,cmap=plt.cm.spring,edgecolor='k')

plt.show

K最近邻算法(KNN)

 

#使用KNN来拟合这些数据,也叫做创建分类模型

clf = KNeighborsClassifier()

clf.fit(x,y)

#下面的代码用于画图

x_min, x_max = x[:, 0].min() - 1, x[:, 0].max() + 1

y_min, y_max = x[:, 0].min() - 1, x[:, 1].max() + 1

xx, yy = np.meshgrid(np.arange(x_min, x_max, .02),

                    np.arange(y_min, y_max, .02))

z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

z = z.reshape(xx.shape)

plt.pcolormesh(xx, yy, z, cmap=plt.cm.Pastel1)

plt.scatter(x[:, 0], x[:, 1], c=y, cmap=plt.cm.spring, edgecolor='k')

plt.xlim(xx.min(), xx.max())

#plt.ylim(yy.min(), yy.max())

plt.title("Classifier:KNN")

#把新的数据点用五星表示出来

plt.scatter(6.75, 4.82, marker='*', c='r', s=200)

plt.show()

 

K最近邻算法(KNN)

 

K最近邻算法(KNN)

#KNN处理多元分类任务

#生成样本数为500,分类数为5的数据集

data2 = make_blobs(n_samples=500, centers=5, random_state=8)

x2, y2 = data2

plt.scatter(x2[:, 0], x2[:, 1], c = y2, cmap = plt.cm.spring, edgecolor = 'k')

plt.show()

K最近邻算法(KNN)

 

clf = KNeighborsClassifier()

clf.fit(x2, y2)

#下面的代码用于画图

x_min, x_max = x2[:, 0].min() - 1, x2[:, 0].max() + 1

y_min, y_max = x2[:, 0].min() - 1, x2[:, 1].max() + 1

xx, yy = np.meshgrid(np.arange(x_min, x_max, .02),

                     np.arange(y_min, y_max, .02))

z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

z = z.reshape(xx.shape)

plt.pcolormesh(xx, yy, z, cmap=plt.cm.Pastel1)

plt.scatter(x2[:, 0], x2[:, 1], c = y2, cmap = plt.cm.spring, edgecolor = 'k')

plt.xlim(xx.min(), xx.max())

plt.ylim(yy.min(), yy.max())

plt.title("Classifier:KNN")

plt.show()

K最近邻算法(KNN)

#那么模型的正确率有多高呢?

clf.score(x2, y2)

K最近邻算法(KNN)

KNN用于回归分析

#导入make_regression数据集生成器

from sklearn.datasets import make_regression

#生成特征数量为1,噪音为50的数据集

x, y = make_regression(n_features = 1, n_informative = 1, noise = 50, random_state = 8)

plt.scatter(x, y, c = 'orange', edgecolor = 'k')

plt.show()

K最近邻算法(KNN)

下面使用KNN进行回归分析

#导入回归分析KNN模型

from sklearn.neighbors import KNeighborsRegressor

reg = KNeighborsRegressor()

#用KNN模型拟合数据

reg.fit(x, y)

#把预测结果用图像进行可视化

z = np.linspace(-3, 3, 200).reshape(-1, 1)

plt.scatter(x, y, c = 'orange', edgecolor = 'k')

plt.plot(z, reg.predict(z), c = 'k', linewidth = 3)

plt.title('KNN Regressor')

plt.show()

K最近邻算法(KNN)

对模型进行评分

K最近邻算法(KNN)

为了提高分数,我们将KNN的n_neighbors(近邻数)减少, 近邻数默认为5

from sklearn.neighbors import KNeighborsRegressor

reg2 = KNeighborsRegressor(n_neighbors=2)

reg2.fit(x, y)

plt.scatter(x, y, c = 'orange', edgecolor = 'k')

plt.plot(z, reg2.predict(z), c = 'k', linewidth = 3)

plt.title('KNN Regressor: n_neighbors=2')

plt.show(

K最近邻算法(KNN)

我们再来看看评分

K最近邻算法(KNN)

KNN项目实战----酒的分类

from sklearn.datasets import load_wine

#从datasets中载入酒的数据集

wine_dataset = load_wine()

实际上load_wine()函数载入的数据集是一种Bunch对象,它包括keys和values

K最近邻算法(KNN)

我们看看数据集中究竟有多少样本和变量

K最近邻算法(KNN)

打印酒的数据集中的简短描述

K最近邻算法(KNN)

生成训练数据集和测试数据集

#导入数据集拆分工具

from sklearn.model_selection import train_test_split

#将数据集拆分为训练数据集和测试数据集

x_train, x_test, y_train, y_test = train_test_split(wine_dataset['data'], wine_dataset['target'], random_state=0)

下面看看拆分后的数据集大概是个什么情况

K最近邻算法(KNN)

使用KNN进行建模

#导入KNN分类模型

from sklearn.neighbors import KNeighborsClassifier

#指定模型的n_neighbors参数值为1

knn = KNeighborsClassifier(n_neighbors = 1)

接下来我们要使用knn对象中称为拟合(fit)的方法来进行建模,建模的 依据就是x_train和y_train

K最近邻算法(KNN)

使用模型对新样本的分类进行预测

K最近邻算法(KNN)

#下面我们用建好的模型对新酒做出分类预测

import numpy as np

#输入新的数据点

x_new = np.array([[13.2, 2.77, 2.51, 18.5, 96.6, 1.04, 2.55, 0.57, 1.47, 6.2, 1.05, 3.33, 820]])

#使用predict()进行预测

prediction = knn.predict(x_new)

#接下来看新酒属于哪个分类

wine_dataset['target_names'][prediction]

K最近邻算法(KNN)

结果分析:模型把新酒的分类预测为class_2,虽然准确率只有76%,但对于我们机器学习新手入门实战项目来说,还是相当不错的