正如俗话说----近朱者赤,近墨者黑,想象一下我们的数据集里面有一半是“朱”,一半是“墨”,现在有了一个新数据点,我们怎么判断它属于哪一个分类?
下面就引出了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)
import numpy as np
x, y = data
#将生成的数据集进行可视化
plt.scatter(x[:,0],x[:,1],c=y,cmap=plt.cm.spring,edgecolor='k')
plt.show
#使用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()
#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()
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()
#那么模型的正确率有多高呢?
clf.score(x2, y2)
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()
下面使用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()
对模型进行评分
为了提高分数,我们将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(
我们再来看看评分
KNN项目实战----酒的分类
from sklearn.datasets import load_wine
#从datasets中载入酒的数据集
wine_dataset = load_wine()
实际上load_wine()函数载入的数据集是一种Bunch对象,它包括keys和values
我们看看数据集中究竟有多少样本和变量
打印酒的数据集中的简短描述
生成训练数据集和测试数据集
#导入数据集拆分工具
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)
下面看看拆分后的数据集大概是个什么情况
使用KNN进行建模
#导入KNN分类模型
from sklearn.neighbors import KNeighborsClassifier
#指定模型的n_neighbors参数值为1
knn = KNeighborsClassifier(n_neighbors = 1)
接下来我们要使用knn对象中称为拟合(fit)的方法来进行建模,建模的 依据就是x_train和y_train
使用模型对新样本的分类进行预测
#下面我们用建好的模型对新酒做出分类预测
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]
结果分析:模型把新酒的分类预测为class_2,虽然准确率只有76%,但对于我们机器学习新手入门实战项目来说,还是相当不错的