K近邻(K-NN)算法可以说是最简单的机器学习算法。构建模型只需要保存训练集即可。想要对新数据进行预测,算法会在训练数据集中找到最近的数据点,也就是他们的“邻居”。根据选取的邻居个数不同,其预测精度可能不一样,最简单的模型就是指选取一个邻居。
1、单一(或者10个)最近邻模型对forge数据集的预测结果代码和图形如下:
importmglearn
mglearn.plots.plot_knn_classification(n_neighbors=1)
mglearn.plots.plot_knn_classification(n_neighbors=10)
运行后生成的图形如下:
由此可见,选择的近邻个数不同,预测结果有所变化。
2、下面,我们来看下分别使用1,2,8个近邻对forge数据进行分析预测,对应的代码如下:
importmatplotlib.pyplotasplt
importmglearn
importnumpyasnp
fromsklearn.model_selectionimporttrain_test_split
x,y=mglearn.datasets.make_forge()
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=0)
fromsklearn.neighborsimportKNeighborsClassifier
clf=KNeighborsClassifier(n_neighbors=3)
clf.fit(x_train,y_train)
print(Testsetpredicitons:{}.format(clf.predict(x_test)))
print(Testsetaccuracy:{:.2f}.format(clf.score(x_test,y_test)))
fig,axes=plt.subplots(1,3,figsize=(10,3))
forn_neighbors,axinzip([1,2,8],axes):
#fit方法返回对象本身,所以我们可以将实例化和拟合放在一行代码中
clf=KNeighborsClassifier(n_neighbors=n_neighbors).fit(x,y)
mglearn.plots.plot_2d_separator(clf,x,fill=True,eps=0.5,ax=ax,alpha=.4)
mglearn.discrete_scatter(x[:,0],x[:,1],y,ax=ax)
ax.set_title({}neighbor(s).format(n_neighbors))
ax.set_xlabel(feature0)
ax.set_ylabel(feature1)
axes[0].legend(loc=3)
运行后的带的决策辩解结果如下:
如上分析,我们发现使用的近邻个数越多,则分类的曲线越平滑,也就是说,使用的紧邻越少对应越高的复杂度,使用的近邻个数越多对应越低的复杂度。
假如考虑极端情况,也就是近邻个数等于训练集中所有的数据点个数,那么每个测试点的邻居都完全相同(即所有训练点),所有预测的结果也完全相同(训练接种出现次数最多的类别)。
下节我们将使用乳腺癌数据集对上述推论进行论证,如果对此节内有什么疑问或建议,欢迎留言讨论!喜欢此类内容就请