是不是很简单,几步就搞定了 。现在能够分类了,那么这个分类器的决策边界是什么样的呢?
4 看看KNN的决策边界是什么样的绘制决策边界还是相对麻烦的,这里提供一下相关代码:
def plot_2d_separator(classifier, X, fill=False, ax=None, eps=None, alpha=1, cm='viridis', linewidth=None, threshold=None, linestyle="solid"):if eps is None:eps = X.std() / 2.# 获取当前子图if ax is None:ax = plt.gca()# 特征1最值浮动x_min, x_max = X[:, 0].min() - eps, X[:, 0].max() + eps# 特征2最值浮动y_min, y_max = X[:, 1].min() - eps, X[:, 1].max() + eps# 在两个特征之间均匀生成1000个点xx = np.linspace(x_min, x_max, 1000)yy = np.linspace(y_min, y_max, 1000)X1, X2 = np.meshgrid(xx, yy)# 构建网格点矩阵, shape 1000*1000X_grid = np.c_[X1.ravel(), X2.ravel()] # 构建坐标点, 则有1000^2个坐标点,即100万个点chunk_size = 10000Y_result_chunks = []for x_chunk in np.array_split(X_grid, np.arange(chunk_size, X_grid.shape[0], chunk_size, dtype=np.int32),axis=0):# predict_proba返回的是一个 n 行 k 列的数组, 第 i 行 第 j 列上的数值是模型预测 第 i 个预测样本为某个标签的概率,并且每一行的概率和为1 。Y_result_chunks.Append(classifier.predict_proba(x_chunk)) # 分批预测构造的点的结果, 每批1万个数据decision_values = np.concatenate(Y_result_chunks)[:, 1]# 将list中的结果拼接起来, 然后选取一个列别的预测值levels = [.5] if threshold is None else [threshold]fill_levels = [0] + levels + [1]# 填充# 开始绘制边界(类似于等高线)ax.contourf(X1, X2, decision_values.reshape(X1.shape), levels=fill_levels, alpha=alpha, cmap=cm)# 设置坐标轴范围以及对应的数字ax.set_xlim(x_min, x_max)ax.set_ylim(y_min, y_max)ax.set_xticks(())ax.set_yticks(())fig, axes = plt.subplots(1, 3, figsize=(10, 3))for n_neighbors, ax in zip([1, 3, 9], axes):clf = KNeighborsClassifier(n_neighbors=n_neighbors).fit(X, y)# 绘制决策边界plot_2d_separator(clf, X, fill=True, eps=0.5, ax=ax, alpha=0.4)# 原始数据图形ax.scatter(X[y==0][:,0], X[y==0][:,1], marker='o', s=50, label="class 0")ax.scatter(X[y==1][:,0], X[y==1][:,1], marker='^', s=50, label="class 1")ax.set_title("{} neighbor(s)".format(n_neighbors))ax.set_xlabel("feature 0")ax.set_ylabel("feature 1")axes[0].legend(loc=3)
决策边界图像如下:
文章插图
5 用现实中的数据来说话当然上面的例子使用的自己构建的数据,并且数据还比较少,现在我们使用sklearn自带的数据来分类,使用现实世界的乳腺癌数据集进行knn分类 。其操作如下:
from sklearn.datasets import load_breast_cancercancer = load_breast_cancer()X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, stratify=cancer.target, random_state=66)training_accuracy = []test_accuracy = []# n_nighbors取值从1-10neighbors_settings = range(1, 11)for n_neighbors in neighbors_settings:# 构建模型clf = KNeighborsClassifier(n_neighbors=n_neighbors)clf.fit(X_train, y_train)# 记录训练精度training_accuracy.append(clf.score(X_train, y_train))# 记录泛化精度test_accuracy.append(clf.score(X_test, y_test))plt.plot(neighbors_settings, training_accuracy, label="training accuracy")plt.plot(neighbors_settings, test_accuracy, label="test accuracy")plt.ylabel("Accuracy")plt.xlabel("n_neighbors")plt.legend()
文章插图
总结从上面的图形可以看出,并不是选择k越大越好,也不是越小越好,这里选择的就是6最好 。其实你慢慢就会发现,我们开始要根据训练的一些参数曲线,去调整模型的参数啦,这在后面的文章会做进一步的介绍 。当然本部分内容是参考《Python机器学习基础教程》内容并结合自己的理解写出,所以我还是推荐?一下这本书,或者可以在订阅号“AIAS编程有道”中回复“Python机器学习基础教程”获取电子档后决定?是否要购买,建议购买正版书籍 。?
【knn K近邻算法是如何完成分类的?】
推荐阅读
- 分类算法其实也可做回归分析——以knn为例
- 淘宝权重算法公式 淘宝搜索占比公式
- 今日头条算法原理—— 3分钟了解今日头条推荐算法原理
- 推荐算法的物以类聚人以群分
- 厉害了华为!开源自研算法Disout
- 常见加密算法 「asp.net core 系列」12 数据加密算法
- 用Python实现十大经典排序算法-插入、选择、快速、冒泡、归并等
- 基础通俗讲解集成学习算法
- 流行的机器学习算法总结,帮助你开启机器学习算法学习之旅
- 算法专家教你一致性算法:Paxos+Zab+Raft+NWR+Gossip+一致性Hash