KNN算法实践后的总结

问题简述:我有一组数据,数据量是五百多,维度是30,分类有两种,要使用knn算法对数据进行预测。

一、伪代码

(1)整个过程的伪代码

Begin:

    Input: 数据集datasets, k值数组;

 

Do:

对datasets进行归一化,并将其按照7:3的比例划分成训练集和测试集

利用训练集的数据,根据k折交叉验证,获取最优k值

确定k值后使用knn算法对测试集的数据进行预测

 

    Output: 测试集中各个数据所属的类别。

End

 

(2)knn算法伪代码

Begin:

Input: 数据集a,待测数据b,k

 

Do:

测量b与a中所有点的欧氏距离,得到从根据距离从近到远排列的列表list,返回其中前k个元素

对k个元素的标签进行分析,得到各种标签的数量,根据投票法,数量最大的标签就是b的标签

Output:b的标签

二、knn算法

       工作原理:一个样本数据集合,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类对应的关系。输入没有标签的数据后,将新数据中的每个特征与样本集中数据对应的特征进行比较,提取出样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k近邻算法中k的出处,通常k是不大于20的整数。最后选择k个最相似数据中出现次数最多的分类作为新数据的分类。Knn算法属于懒惰学习,不会预先进行训练,而是在使用时才会训练。

三、数据的处理

1、数据的预处理

(1)数据归一化

       当数据存在多个特征时,其中某些特征数量级较大,其他较小时最后的分类结果会被该特征所主导,而弱化了其他特征的影响,这是因为各个特征的量纲不同所致,需要将数据进行归一化。我采用的是离差标准化,是对原始数据的线性变换,使结果落到[0,1]区间。
(2)数据的随机化

       原始数据的不合理的排序有可能导致最后出现过拟合的问题,因此,在训练和测试之前,必须进行随机化,我使用的是random.shuffle()方法进行随机化。

四、交叉验证得到k的最优值

       K值在本实验中至关重要,k的取值直接回影响到预测的准确性。那么如何取最优k值?

       我采用了k折交叉验证法,将数据集等分成几部分,每一部分轮流作为测试集和训练集。每个k值都会进行多次预测,预测结果的正确率取平均值就基本上代表了采用这个k值的的预测效率。

五、进行预测

       每一次预测的准确率不一定相同,但波动并不大,这是正常现象。

六、思考

       在编码过程中,我想到了几个问题或者是需要改进的地方:一是数据的降维问题,维数太多可能出现维度灾难,那么在维度达到多少的时候需要降维(这次我没有降维)。二是投票法的问题,当两种标签的训练数据量差别较大时,单纯使用投票法很可能得到错误的标签,应该考虑加权。第三点跟第二点有一定联系,就是两种标签的数据量差距很大的时候,怎样避免过拟合的情况发生。

 

 

猜你喜欢

转载自blog.csdn.net/demodog/article/details/90042778