深入浅出Python机器学习3——K最近邻算法

K最近邻算法的原理

       K最近邻算法就是目标数据点在现有数据集中,离哪一部分最近就将其划分为哪一部分。
       而K字母的含义就是近邻的个数。在scikit-learn中,K最近邻算法的K值是通过N_neighbors参数来调节的,默认值是5.
       K最近邻算法可以用于回归,原理和其用于分类是相同的。当我们使用K最近邻回归计算某个数据点的预测值时,模型会选择离该数据点最近的若干个数据集中的点,并将它们的y值取平均值,并把改平均值作为新数据点的预测值。

K最近邻算法的用法
  • K最近邻算法在分类任务中的应用

       在scikit-learn中,内置了若干个玩具数据集(Toy Datasets),还有一些API让我们可以自己动手生成一些数据集。
分类应用
       make_blobs生成的数据集一共有两类,其中一类紫色,而另一类黄色,这两类数据集可以看作机器学习的训练数据集,是已知的数据。我们就是基于这些数据用算法进行模型的训练,然后再对新的未知数据进行分类或者回归。
       下面我们看看最近邻算法来拟合这些数据,

分类任务应用1
分类任务应用2
       图中粉色区域和灰色区域组成的部分。如果有新的数据输入的话,模型就会自动将新数据分到对应的分类中。例如一个数据点的两个特征分别是6.75和4.82。

数据点分类
数据点分类结果
       可以看出数据点被划分为浅色一类。
       下面我们看一下分类结果打印:

打印数据点分类结果

  • K最近邻算法处理多元分类任务

       通过修好make_blobs的centers参数,把数据类型的数量增加到5个,同时修改n_samples参数,把样本数量也增加到500个:

5类分类
       可以看到新的数据集分类数量变成了5个,而其中有两类数据还有一些重合(图片中心位置的点),这时我们用K最近邻算法建立模型拟合这些数据:

K最近邻算法5分类
       可以看出,绝大部分数据点放置于正确的分类中,但是有一小部分数据还是进入了错误分类中,这些分类错误的数据点基本都是互相重合的位于图像中心位置的数据点。下面我们看看模型的正确率:

模型得分
       可以看出K最近邻算法用来分类效果还是不错的。

  • K最近邻算法用于回归分析
           在上次开头的数据集生成器中,可以用make_regression函数来生成数据集进行回归分析:

KNN回归分析
       可以看到,横轴代表的是样本特征的数值,范围大概在-3 ~ 3;纵轴代表样本的测定值,范围大致在-250 ~ 250。我们使用K最近邻算法来进行回归分析:

KNN回归分析结果
       直观来看,模型拟合程度不是很好,有大量的数据点没有被模型覆盖到。下面我们看看模型评分如何:

KNN回归分析模型评分
       可以看出,模型的评分不是很好,我们尝试着减少分类(KNN默认为n_neighbors = 5)试试:

KNN2类模型得分
       从上图可以看出,曲线覆盖了更多的点,也就是说,模型变得更加复杂了。接下来我们看看模型得分:

KNN2类回归得分
       模型得分有所提高,看起来育德的数据会更加准确。

K最近邻算法项目实践——酒的分类
  • 对数据集进行分析

       首先我们把酒的数据集载入项目中并打印,看看数据集中包含了哪些东西。实际上load_wine函数载入的酒数据集,是一种Bunch对象,它包括键(keys)和数值(values):

酒的数据集结构
       从结果当中我们可以看出,酒数据集中包含“data”,目标分类“target”,目标分类名称“target_names”,数据描述“DESCR”,以及特征变量的名称“features_names”
       看看究竟有多少样本(samples),又有多少变量(features),可以用.shape语句来让Python告诉我们数据的大概轮廓:

样本数量
       可以看出,酒数据集中总共有178个样本,每条数据有13个特征变量。进一步通过打印DESCR键来获得:

DESCR
       可以看出,酒数据集中的178个样本被归入3个类别中,分别是class_0,class_1和class_2,其中class_0包含59个样本,class_1中包含71个样本,class_2中包含48个样本等信息。

  • 生成训练数据集合测试数据集

       我们现在要做的是将数据集分为两个部分:一部分称为训练数据集,另一部分称为测试数据集。
       在scikit-learn中,有一个train_test_split函数,它是用来帮助用户把数据集拆分的工具。其工作原理是:train_test_split函数将数据集进行随机排列,在默认情况下将其中75%的数据及所对应的标签划归到训练数据集,并将其余25%的的数据和所对应标签划归到测试数据集。
        注意:我们一般用大写的X表示数据的特征,而用小写的y表示数据对应的标签。这是因为X是一个二维数组,也称为矩阵;而y是一个一维数组,或者说一个向量。
       接下来将数据集进行拆分并打印结果:

数据拆分
       上述代码中,我们看到了一个参数称为random_state,并且将它指定为0,。这是因为train_test_split函数会生成一个伪随机数,并根据这个伪随机数对数据集进行拆分。而我们有时候需要在一个项目中,让多次生成的伪随机数相同,方法就是通过固定random_state参数的数值,相同的random_state参数会一直生成同样的伪随机数,当这个值我们设置为0,或者保持缺省的时候,则每次生成的伪随机数均不同。
       从结果可以看出,样本X数量和其对应的标签y数量均为133个,约占样本总数的74.7%,而测试数据集中的样本X数量和标签y数量均为45个,约占样本总数的25.3%。同时,不论在训练集中,还是在测试数据集中,特征变量都是13个。

  • 使用K最近邻算法进行建模

       K最近邻算法根据训练数据集进行建模,在训练数据集中寻找和新输入的数据最近的数据点,然后把这个数据点的标签分配给新的数据点,以此对新的样本进行分类。
       在上图中,我们给KNeighborsClassifier指定一个参数,n_neighbors=1。正如前面所说的,在scikit-learn中,机器学习模块都是在其固定的类中运行的。而K最近邻分类算法是在neighbors模块中的KNeighborsClassifier类中运行。而我们从一个类中创建对象的时候,就需要指定一个参数。对于KNeighborsClassifier类来说,最关键的参数就是近邻的数量,也就是n_neighbors。而knn则是我们在KNeighborsClassifier类中创建的一个对象。
       接下来我们就要使用这个叫作knn的对象中称为"拟合(fit)"的方法来进行建模,建模的依据就是训练数据集中的样本数据X_train和其对应的标签y_train,代码如下:

KNN拟合
       从图中我们可以看到knn拟合方法把自身作为结果返回给了我们。

  • 使用模型对新样本的分类进行预测

       现在我们可以使用刚刚建好的模型对新的样本分类进行预测,不过在此之前,可以先用测试数据集对模型进行打分,这就是我们创建测试数据集的目的。测试数据集并不参与建模,但是我们可以用模型对测试数据集进行分类,然后和测试数据集中的样本实际分类进行对比,看吻合度有多高,模型的得分越高,说明模型的预测越准确,满分是1.0。

测试数据集得分
       假设一新酒测定的特征变量如下:

1) Alcohol13.2
2) Malic acid2.77
3) Ash2.77
4) Alcalinity of ash2.51
5) Magnesium18.5
6) Totla phenols96.6
7) Flavanoids1.04
8) Nonflavanoid phenols2.55
9) Proanthocyanins1.47
10) Color intensity6.2
11) Hue1.05
12) OD280/OD315 of diluted wines3.33
13) Proline820

       根据建好的模型将新酒进行分类:

新酒分类
       模型把新酒分类预测为 class_2,虽然准确率只有76%,但对于第一个机器学习的实战项目来说,还是相当不错的。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值