Scikit-learn K临近算法

K近邻算法是一种基本的分类与回归的方法。
简单来讲,这个算法就是遵循近朱者赤近墨者黑的道理,对于需要判断的点来说,并不需要去找一个模型来给出这个点的答案,而只是需要知道一个点集的所有点的答案,然后观察这个点附近的K个点是什么,然后这个K个点来投票决定我的这个点到底是什么来的。

这个算法是没有显示的学习过程,只是利用了训练集的特征向量空间进行划分,其实这个就是K临近算法的模型了。

对于这个K临近算法,它的三要素如下:
1、K值的选择,如果K太大(就像K和数据集差不多大)那模型就太简单了,以至于会忽略掉训练集中很多信息,如果K太小,模型又会太敏感,很容易受一些错误的点影响。
2、距离度量,对于一个点来说,要如何判断离它最近的K的点呢?那就需要有一个计算点与点之间距离的一个公式,常用的有欧式距离,曼哈顿距离,以及Minkowski距离
3、分类决策规则:这个就是采用的多数表决,也即是从最邻近的K个点当中,由最多的一个类别来决定。

在Scikit-learn中给的K临近算法中,在算法选择上给出了Brute Force, K-Dtree, Ball-tree和auto这几种选择,我只对KD-tree有所了解。
KD-tree的话就是一颗二叉树,只不过这是一棵按照严格规定实现的二叉树。KD-tree可以保持这棵树的平衡,简单来讲,就是无论我在这棵树上寻找哪个哪个点的K近邻,我花费的时间都不会相差太多,而且平均时间也很客观。KD-tree的建立就是通过每一层以不同的关键字来选取平衡轴,比如我的数据是二维坐标,那我的树的第一层是以 深度%2 + 1 (也就是我二维坐标的x坐标)这个数据来找平衡中心,由此类推,知道最后所有数据都分配到树上。再寻找的时候先顺着树往下找,找到当前最近的点,然后往上回退,看看再另一个节点中有没有比当前更小的,有就加入到K个临近点中,没有就继续往上回退,知道最后到达根节点。

下面讲讲使用Scikit-learn中的KNN算法:

from sklearn.neighbors import KNeighborsClassifier  #这是调用库

knn = KNeighborsClassifier(n_neighbors=3,weights='distance',algorithm='kd_tree')
#这里就是建立一个KNN模型,使用了KD_TREE作为算法,这里的weights参数是用来给距离加权的,越远的权重会越小
#n_neighbors就是所谓的K了

knn.fit(X_train, y_train)
#训练模型

knn.predict(X_test)
#做出预测,返回类别

knn.predict_proba(X_test)
#这个预测出来的是每一个类别的概率,可以进行叠加
#可以通过numpy来转化成类别
#predict_label = np.array(y_pre[i]).argsort()[-1]   也就是这样

这次用KNN跑数据分类的结果是:
验证集:0.540188029
测试集:0-579220779
参考:李航《统计学习方法》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值