ML学习笔记-2021-08-24-分类算法-KNN

1.sklearn转换器和预估器

1.1 转换器

  1. 实例化(实例化的是一个转换器类Transformer)

  2. 调用fit_transform(对于文档建立分类词频矩阵,不能同时调用)
    标准化:

     (x - mean) / std
     fit_transform() 
     	fit()                # 计算每一列的平均值和方差
     	transform()   # (x - mean) / std 根据公式进行最终转换
    

1.2 估计器

在这里插入图片描述

  1. 实例化一个estimator
  2. estimator.fit(x_train, y_train) 计算
    ——调用完毕,模型生成
  3. 模型评估:
    1)直接对比真实值和预测值
    y_predict = estimator.predict(x_test)
    y_test == y_predict
    2)计算转确率
    acc = y_predict(x_test, y_test)

2. KNN算法

  1. 什么是K-近邻算法:根据邻居来计算类别
  2. 原理:如果一个样本在特征空间中的K个最相似(既特征空间中最近邻)的样本中大多属于某一个类别,则该样本也属于这个类别。
  3. 如果K=1:容易受到异常值的影响
    4.确定谁是邻居:距离公式。
    如欧式距离
    在这里插入图片描述

曼哈顿距离(绝对值距离)
在这里插入图片描述

明可夫斯基距离
在这里插入图片描述

  1. 电影类型分析
    在这里插入图片描述
    当 K=1 爱情片
    当 K=2 爱情片

    当 K= 6 无法确定
    若我们增加一个动作片,那么数据就包含3个爱情片,4个动作片
    当k=7 动作片 但是?电影接吻镜头明显大于动作片 所以分错了
    所以K值过大,容易分错,收到了样本分布不均匀的影响

  2. 结合之前的数据处理,分析K近邻算法需要对数据进行的处理
    无量纲化处理——标准化,因为归一化依然容易受到异常值的影响。

  3. API
    在这里插入图片描述
    n-neighbors : K值

  4. 案例1:鸢尾花种类预测
    1)获取数据
    2)数据集划分
    3)特征工程:标准化
    4)KNN预估器流程
    5)模型评估流程

from sklearn import datasets
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
"""
# KNN也叫K近邻算法(简单容易的算法)
# K值如果过小, 容易受到异常值的影响,
# K值过大容易受到样本不均衡的情况的影响
原理: 
    如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)
    的样本中的大多数属于某一个类别,则该样本也属于这个类别
"""


def load_data():
    iris = datasets.load_iris()
    x_train, x_test, y_train, y_test = \
        train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train) # 由于fit获取的是x_train的均值,方差,最大值,最小值,然后在进行标准化等转换
    x_test = transfer.transform(x_test)  # 所以测试集不要用fit, 因为要保持和训练集处理方式一致,直接根据x_train的属性进行相同操作
    return x_train, x_test, y_train, y_test


def KNN_test():
    x_train, x_test, y_train, y_test = load_data()

    # KNN算法预估器
    estimator = KNeighborsClassifier(n_neighbors=3)
    estimator.fit(x_train, y_train)

    # 传入测试值通过前面的预估器获得预测值
    y_predict = estimator.predict(x_test)
    print("预测值为:", y_predict, "\n真实值为:", y_test, "\n比较结果为:", y_test == y_predict)
    score  = estimator.score(x_test, y_test)
    print("准确率为: ", score)
    return None
if __name__ == '__main__':
    KNN_test()
  1. 总结
    优点:简单,易于理解,易于实现,无需训练
    缺点:
    1)必须指定K值,K值得选择可能会使精度无法得到保障,
    2)懒惰算法,对于测试样本分类时,计算量大,内存开销大
    使用场景:小数据场景,几千~几万样本,具体场景,具体业务去测试模型,并选择调优。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值