机器学习基础之K近邻
K近邻 K-NN算法可以说是最简单的机器学习算法,他使用距离预测点最近的点的均值来进行预测。k 近邻算法的输入为实例的特征向量,对应于特征空间的点;输出为实例的类别,可以取多类。k 近邻算法假设给定一个训练数据集,其中的实例类别已定。分类时,对新的实例,根据其k个最近邻的训练实例的类别,通过多数表决等方式进行预测。因此,k近邻算法不具有显式的学习过程。 k近邻算法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。 k值的选择、距离度量以及分类决策规则是k近邻算法的三个基本要素。 K—NN分类K-NN分类使用距离目标点最近的K个点的类别来进行“投票”,得票数多的类别将被标记为预测类别。 KNN算法的伪代码: 对于每一个在数据集中的数据点: 计算目标的数据点(需要分类的数据点)与该数据点的距离将距离排序:从小到大选取前K个最短距离选取这K个中最多的分类类别返回该类别来作为目标数据点的预测值#导入机器学习的包import pandas as pdimport numpy as npimport matplotlib.pyplot as plt%matplotlib inlineimport mglearnimport warningswarnings.filterwarnings('ignore')mglearn.plots.plot_knn_classification(n_neighbors=3) 上图给出了K-NN算法的示例,五角星测试集数据点根据离各自最近的三个训练集点进行投票而分类,下面我们将使用forge数据进行K-NN分类。 #导入数据集from sklearn.model_selection import train_test_splitX,y = mglearn.datasets.make_forge()print('自变量前五行:\n{}'.format(X[:5]))print('因变量:{}'.format(y))自变量前五行:[[ 9.96346605 4.59676542] [11.0329545 -0.16816717] [11.54155807 5.21116083] [ 8.69289001 1.54322016] [ 8.1062269 4.28695977]]因变量:[1 0 1 0 0 1 1 0 1 1 1 1 0 0 1 1 1 0 0 1 0 0 0 0 1 0]from sklearn.neighbors import KNeighborsClassifierX_train,X_test,y_train,y_test = train_test_split(X,y,stratify=y,random_state=42)KNC = KNeighborsClassifier(n_neighbors=5).fit(X_train,y_train)KNC.predict(X_test),y_test(array([1, 0, 1, 0, 0, 0, 0]), array([1, 0, 1, 1, 0, 0, 0]))print('训练集精度:{}'.format(KNC.score(X_train,y_train)))print('测试集精度:{}'.format(KNC.score(X_test,y_test)))训练集精度:0.9473684210526315测试集精度:0.8571428571428571 在这里,train_test_split函数将输入的X,y划分为四部分,X_train,y_train,X_test,y_test,参数stratify=y表示在测试集与训练集划分时,各个部分的数据类型与y中两种类别的数据比例相同,防止分配不均影响模型性能。因此,random_state参数限定了每次运行划分函数都获得同样的结果。因此,影响最终模型精度的因素有: 1)每次数据划分时,划分到不同组别的数据不同。 2)模型参数,即选择的最近邻数量不同。 第一项在训练模型时使用交叉验证的方式尽量降低随机性对模型的影响,下面将通过调整参数n_neigbors调整模型精度。 ...