day3 KNN算法

KNN算法

一、KNN

KNN分类算法(K-Nearest-Neighbors Classification),又叫K邻近算法,是一个概念极其简单,而效果有很优秀的分类算法。
核心思想:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

二、KNN方法三个核心要素
  1. K值
    • k值过小,模型复杂,容易过拟合。
    • k值过大,近似误差大,分类模糊。
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MHxZX1qO-1671292858944)(KNN1.png)]
    • 算法评价:
      准确率和召回率:
      准确率§ = 正确识别的个数 / 识别出的个体总数 查准
      召回率® = 正确识别的个数 / 测试集中存在的个体总数 查全
    # 测试准确率
    from sklearn.metrics import classification_report
    y_true = [0,1,2,2,2]  #真实值
    y_pred = [0,0,2,2,1]  #预测值
    print(classification_report(y_true,y_pred))
    
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vAMS2CYQ-1671292858946)(KNN2.png)]
    调和平均值:2*(1/(1/p+1/r))
    Q1:为什么这2的precision为1呢???
  2. 距离的度量
    有不同的距离度量可供选择,不同的距离所确定的最近邻点不同
    • 欧式距离:ρ=根号((x2-x1)^2) + (y2-y1)^2)
  3. 分类决策的规则
    往往采用多数表决。由输入实例的k个最邻近的训练实例中的多数类决定输入实例的类别
    KNN是一个简单高效的分类算法,可用于多个类别的分类,还可以用于回归。
三、机器学习的一般流程
  • 分析问题
  • 获取数据
    可以使用数据文件,sklean中也提供了数据集,如鸢尾花、波士顿房价数据集等。
    使用方法:
    from sklearn.datasets import load_boston
    boston = load_boston()
    
    数据集目录:anacnda3\Lib\site-packages\sklearn\datasets\data
  • 模型训练
  • 测试模型
    !!!综合实验:鸢尾花数据集的查看
    • step1:查看数据集
      from sklearn.datasets import load_iris
      iris_dataset = load_iris()
      iris_da
      #下面是查看数据的各项属性
      print("数据集的Keys:\n",iris_dataset.keys()) #查看数据集的keys。
      print("特征名:\n",iris_dataset['feature_names']) #查看数据集的特征名称
      print("数据类型:\n",type(iris_dataset['data'])) #查看数据类型
      print("数据维度:\n",iris_dataset['data'].shape) #查看数据的结构
      print("前五条数据:\n{}".format(iris_dataset['data'][:5]))#查看前5条数据
      #查看分类信息
      print("标记名:\n",iris_dataset['target_names']) 
      print("标记类型:\n",type(iris_dataset['target']))
      print("标记维度:\n",iris_dataset['target'].shape)
      print("标记值:\n",iris_dataset['target'])   
      #查看数据集的简介
      print('数据集简介:\n',iris_dataset['DESCR'][:20] + "\n.......")#查看数据集的简介的前20个字符。
      
    • step2: 数据集拆分
      可以使用train_test_split函数。属于sklearn.model_selection类中的交叉验证功能,能随机地将样本数据集拆分成训练集和测试集。格式为:
      X_train,X_test,y_train,y_test = cross_validation.train_test_split(train_data,train_target,test_size=0.4,random_state=0)
      #变量:训练集数据、测试集数据、训练集标签、测试集标签
      #参数:样本特征集、样本结果、样本占比(默认为0.25)、随机数的种子(填0或不填,每次结果会不一样)

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nNvoPfS8-1671292858946)(KNN3.png)]
    # 拆分数据集
    from sklearn.datasets import load_iris
    form sklearn.model_selection import train_test_split
    irsi_dataset = load_iris()
    X_train,X_test,y_train,y_test = train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=2)
    print("X_train",X_train)
    print("y_train",y_train)
    print("X_test",X_test)
    print("y_test",y_test)
    print("X_train shape: {}".format(X_train.shape))
    print("X_test shape: {}".format(X_test.shape))
    
    • step3:使用散点矩阵查看数据特征关系
      函数格式:
      scatter_matrix(frame,alpha=0.5,c,figsize=None,ax=None,diagonal=‘hist’,marker=‘.’,density_kwds=None,hist_kwds=None,range_padding=0.05,**kwds)
      主要参数:
      frame: pandas DataFrame对象
      alpha: 图像透明度,一般取(0,1)
      figsize: 以英寸为单位的图像大小,一般以元组(width,height)形式设置。
      Diagonal: 关键参数,必须在{‘hist’,‘kde’}中选择,表示直方图、核密度估计
      import pandas as pd
      iris_dataframe = pd.DataFrom(X_train,columns=iris.dataset.feature_names)
      pd.plotting.scatter_matrix(iris_dataframe,alpha=0.8,c=y_train,figsize=(15,15),marker='o',hist_kwd={'bins':20},s=60) #bins 参数的含义是所画出的直方图的“柱”的个数;每个“柱”的值为其跨越的值的个数和。
      
    • step4:建立KNN模型
      在python中,实现KNN方法使用的是KNeighborsClassifier类,属于scikit-lear的nighbors包
      !KNeighborsClassifier使用很简单,核心操作包括三步:
      • 创建KNeighborsClassifier对象,并进行初始化。
        sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=‘uniform’, alogrithm=‘auto’, leaf_size=30,p=2,metric=‘minkowski’, metric_params=None, n_jobs=None, **kwargs)
        #主要参数:
        n_neighbors: int,可选,缺省值为5.表示KNN中近邻数量K值。
        weights:计算距离时使用的权重,缺省值为‘unnform’.表示平等权重。‘distance’.表示按距离的远近设置不同权重。还可自主设计加权方式,以函数形式调用。
        metric:距离的计算,缺省值为’minkowski’.当p=2,metric缺省,使用的是欧式距离。p=1时为曼哈顿距离。
      • 调用fit方法,对数据集进行训练。
        fit(x,y)
        说明:以x为训练集,以y为测试集对模型进行训练
      • 调用predict函数,对测试机进行预测。
        predict(x)
        说明:根据给定的数据,预测其所属的类别标签。
实例1:使用KNN模型解决鸢尾花分类问题
  from sklearn import datasets
  from sklearn.neighbors import KNeighborsClassifier
  from sklearn.model_selection import train_test_split
  #导入数据,查看数据特征
  iris = datasets.load_iris()
  print('数据集结构:',iris.data.shape)
  #获取属性
  iris_X = iris.data
  #获取类别
  iris_y = iris.target
  #划分成测试集和训练集
  X_train,X_test,y_train,y_test = train_test_split(iris_X,iris_y,test_size=0.2,random_state=0)
  #分类器初始化
  knn = KNeighborsClassifier()
  # 对训练集进行训练
  knn.fit(X_train,y_train)
  # 对测试集数据进行预测
  predict_result = knn.predict(X_test)
  print('测试集大小:',X_test.shape)
  print('真实结果:',y_test)
  print('预测结果:',predict_result)
  print('预测精确率',knn.score(X_test,y_test))
EXE,使用KNN实现手写数字识别
Homework 水果数据集测试
#因为本题是将所有数据作为训练集,测试集仅单独指出,所以省略出 拆分数据集。
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
fruits = np.loadtxt("fruit_data.txt")
X_train = fruits[:,1:]
y_train = fruits[:,0]
X_test = [[192,8.4,7.3,0.55],[200,7.3,10.5,0.72]]
knn = KNeighborsClassifier(weights='distance') #k值为5 按距离远近设置权重 1 4
#knn = KNeighborsClassifier(3,weights='distance') # 1 4
#knn = KNeighborsClassifier()#5,uniform 平等权重 4 4
knn.fit(X_train,y_train)
print('预测结果:',knn.predict(X_test))
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
fruits = np.loadtxt("fruit_data.txt")
X_train,X_test,y_train,y_test = train_test_split(fruits[:,1:],fruits[:,0],test_size=0.15,random_state=0)
# X_train = fruits[:,1:]
# y_train = fruits[:,0]
# X_test = [[192,8.4,7.3,0.55],[200,7.3,10.5,0.72]]
knn = KNeighborsClassifier(weights='distance') #k值为5 按距离远近设置权重 1 4
# knn = KNeighborsClassifier(3,weights='distance')   #1 4
knn.fit(X_train,y_train)
print('真实结果:',y_test)
print('预测结果:',knn.predict(X_test))

print(knn.predict([[192,8.4,7.3,0.55]]))
print(knn.predict([[200,7.3,10.5,0.72]]))
fit(X_train,y_train)
print('真实结果:',y_test)
print('预测结果:',knn.predict(X_test))

print(knn.predict([[192,8.4,7.3,0.55]]))
print(knn.predict([[200,7.3,10.5,0.72]]))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值