K最近邻分类器示例

本教程将指导如何使用K最近邻分类器iris数据集进行训练,并观察不同权重参数下决策边界的变化。通过这个示例,将了解如何加载数据、训练模型以及如何可视化决策边界。

加载数据

在这个示例中,将使用iris数据集。首先,需要将数据集分为训练集和测试集。

from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split iris = load_iris(as_frame=True) X = iris.data[["sepal length (cm)", "sepal width (cm)"]] y = iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)

K最近邻分类器

将使用一个包含11个数据点的K最近邻分类器。由于模型使用欧几里得距离来寻找最近的邻居,因此在训练模型之前对数据进行标准化是非常重要的。

from sklearn.neighbors import KNeighborsClassifier from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler clf = Pipeline(steps=[("scaler", StandardScaler()), ("knn", KNeighborsClassifier(n_neighbors=11))])

决策边界

现在,将使用不同权重参数的两个分类器,并绘制每个分类器的决策边界以及原始数据集,以观察差异。

import matplotlib.pyplot as plt from sklearn.inspection import DecisionBoundaryDisplay _, axs = plt.subplots(ncols=2, figsize=(12, 5)) for ax, weights in zip(axs, ("uniform", "distance")): clf.set_params(knn__weights=weights) clf.fit(X_train, y_train) disp = DecisionBoundaryDisplay.from_estimator(clf, X_test, response_method="predict", plot_method="pcolormesh", xlabel=iris.feature_names[0], ylabel=iris.feature_names[1], shading="auto", alpha=0.5, ax=ax) scatter = disp.ax_.scatter(X.iloc[:, 0], X.iloc[:, 1], c=y, edgecolors="k") disp.ax_.legend(scatter.legend_elements()[0], iris.target_names, loc="lower left", title="Classes") disp.ax_.set_title(f"3-Class classification\n(k={clf[-1].n_neighbors}, weights={weights!r})") plt.show()

观察到权重参数对决策边界有影响。当权重参数设置为“uniform”时,所有最近邻居对决策的影响是相同的。而当权重参数设置为“distance”时,每个邻居的权重与该邻居到查询点的距离成反比。在某些情况下,考虑距离可能会提高模型的性能。

脚本总运行时间

  • 最近邻回归
  • 比较有无邻域成分分析的最近邻
  • 缓存最近邻居
  • iris数据集上训练的决策树的决策面图
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485