机器学习-KNN算法详解&iris数据集的分类

微信公众号:龙跃十二

我是小玉,一个平平无奇的小天才。

最近在研究机器学习的一些算法,说到这里,最先少不了的就是监督学习里的一些分类算法,比如:朴素贝叶斯(naive_bayes)、KNN、决策树、随机森林、SVM。我也把最近学的这些算法用来练练手,做一个数据集的分类,以下代码仅供参考奥!

这里是重点!!!

今天先来讲讲利用KNN算法来做一个wine数据集的分类,后边还会持续更新每一个算法哦,多多关注我的博客,也欢迎大家关注小玉和龙叔的微信公众号【龙跃十二】,更多干货持续更新,只为和你一起学习,共同进步。

KNN算法:

什么是KNN算法,你可别被这几个简单的字母吓到了,KNN其实是指K-Nearest Neighbor,字面意思就是最近的邻居,它是机器学习算法中最基础、最简单的算法之一。它既能用于分类,也能用于回归。我们来看一张图:

机器学习-KNN算法详解&iris数据集的分类_第1张图片

从图中我们可以看出,要想知道蓝衣男孩的位置,我们需要计算跟他临近的四个邻居之间的距离,这样一来,我们就可以间接确定蓝衣男孩的具体位置。

关于KNN算法,总结起来就一句话:根据你的邻居来判断你的类型。

原理:

  • 定义:KNN算法最早是由Cover和Hart提出的一种分类算法。如果一个样本在特征空间的K个最相似的样本中大多数属于某一类别,则这个样本也属于这一类别。

就上边这一句话很好的阐述了KNN算法的精华,你仔细品品。

关于距离的计算:

我们平时主要用到三种距离公式:

  • 欧式距离
  • 曼哈顿距离
  • 明可夫斯基距离

这三种距离的计算我就不多说了,都是一些简单的数学问题,不明白的小伙伴baidu一下去!

注意:

1、K的取值:

  • k取值过大,更易受样本不均衡的影响。

  • k取值过小,更容易受异常点的影响。

    为了解决这个问题,我们往往在运用该算法解决实际问题的时候,会使机器进行自动选择最优的K值,一会在后边的实例中给大家详解哦

2、优点与缺点:

​ 优点:简单,算法核心易于理解,且在使用过程中不用训练模型。

​ 缺点:K的取值非常麻烦

​ KNN算法属于一种懒惰算法,当测试样本过大时,该算法所占用的内存开销过大,时间复杂度也很高。

实例:

​ ——基于KNN算法对鸢尾花iris数据集进行分类

数据集来源:可以在uci或者kaggle上下载,也可以直接在sklearn中直接调取。以下使用的是在sklearn中直接load

鸢尾花灰Iris数据集中有150个样本,每个样本有4个特征,1个标签。其中,鸢尾花种类可取0、1、2,分别代表山鸢尾setosa、变色鸢尾versicolor、维吉尼亚鸢尾virginica。

# 导入数据
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV



def knn_iris_gscv():
        #添加网格搜索和交叉验证
        iris = load_iris()

        # 数据集打乱划分为训练集和测试机

        X_train, X_test, y_train, y_test = train_test_split(iris['data'],
                                                            iris['target'],
                                                            test_size=0.25,
                                                            random_state=14)
        # 标准化处理:
        transfer = StandardScaler()
        X_train = transfer.fit_transform(X_train)
        X_test = transfer.transform(X_test)


        estimator = KNeighborsClassifier()
        #加入网格搜索和交叉验证:
        estimator = GridSearchCV(estimator = estimator,param_grid={'n_neighbors':[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]},cv= 10)
        estimator.fit(X_train, y_train)

        # <1>直接对比真实值与预测值
        y_pred = estimator.predict(X_test)  # 1 X 20 向量
        print("预测值为:\n {}", y_pred)
        print("真实值和预测值", y_test == y_pred)
        # <2>计算准确率:
        score = estimator.score(X_test, y_test)
        print("准确率为:\n", score)
        # <3>查看最佳结果:
        print("最佳参数:\n",estimator.best_params_)
        print("最佳结果:\n", estimator.best_score_)
        print("最佳估计器:\n", estimator.best_estimator_)
        print("交叉验证结果:\n", estimator.cv_results_)
        return None

if __name__ == "__main__":
        knn_iris_gscv()

在上边,我们通过添加网格搜索和交叉验证,来达到一个使K值不断循环,最后取最优K值的目的,这样做的目的也可以进一步的提升识别率。

我们使用了sklearn 中的很多封装好的函数,其具备的功能都非常全面,在这里,我建议大家可以多看看sklearn的一下函数和包,会有利于后边的编程速度。

关于上边的内容,大家有什么问题可以随时给我留言哦。也可以关注小玉和龙叔的微信公众号【龙跃十二】,添加小玉微信,和小玉一起学习。

我是小玉,一个平平无奇的小天才。

你可能感兴趣的:(机器学习)