K Nearest Neighbor算法

这个算法是机器学习里面比较经典的算法,也叫做KNN算法,总体来说KNN算法是相对比较容易理解的算法

  • 算法定义:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别

  • 距离公式(一般要处理数据如标准化后再计算距离)
    欧式距离
    曼哈顿距离
    明可夫斯基距离

  • KNN算法中K取值的分析

    1. K取的过小,容易受到异常点的影响;
    2. K取的过大,容易受到样本不均衡的影响;
  • KNN算法的API

sklearn .neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
	1. n_neighbors:int(默认为5),k_neighbors:查询默认使用邻居使用的邻居数
	2. algorithm:{'auto','ball_tree','kd_tree','brute'},可选用于计算最近邻居的算法:'ball_tree'将会使用BallTree,'kd_tree'将使用KDTree。'auto'将尝试根据传递的方式给fit方法的值来决定适合的算法,不同实现方式影响效率
  • 案列1:莺尾花种类预测
  1. 数据介绍:Iris数据集是常用的分类实验数据集,有Fisher,1936收集整理。Iris也称莺尾花卉数据集,是一类多重变量分析的数据。具体介绍点击该处
  2. 步骤分析
    获取数据—>数据集的划分---->特征工程(标准化)---->KNN预估器流程---->模型评估
  3. 代码实例
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
def knn_iris():
    """
    用KNN算法对莺尾花进行分类
    :return:
    """
    # 1)获取数据
    iris = load_iris()
    # 2)数据划分
    x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=6)
    # 3)特征工程(标准化)
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test) # 上一步的fit已经计算出来了mean和std,在对x_test进行归一化的时候必须使用和x_train相同的mean和std,故这里只能transform
    # 4)KNN预估器流程
    estimator = KNeighborsClassifier(n_neighbors=3) # 这里就是K值,可以修改查看精度的变化
    estimator.fit(x_train,y_train)
    # 5)模型评估
    """评估方法1:直接比对真实值和预测值"""
    y_predict = estimator.predict(x_test)
    print("y_predict:\n",y_predict)
    print("直接比对真实值和预测值:\n",y_test == y_predict)
    """评估方法2:计算准确率"""
    score = estimator.score(x_test,y_test)
    print("准确率:\n",score)
    return



if __name__ == '__main__':
    knn_iris()
  • KNN算法的优缺点
  1. 优点
    简单,易于理解,易于实现,无需训练
  2. 缺点
    懒惰算法,对测试样本分类时计算量大,内存开销大
    必须指定K值,K值选择不当则分类的精度也不能保证
  3. 使用场景
    小数据场景,几千~几万样本,具体场景具体业务去测试

项目实战

机器学习案列【预测facebook签到位置】

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐