K 近邻算法(一)

简介: 本文介绍了KNN算法的基本概念、步骤、优缺点,以及在图像识别、文本分类、回归预测、医疗诊断和金融风控等领域的应用。重点讲解了数据预处理、模型训练、评估方法和参数选择策略,包括K值确定、交叉验证和GridSearchCV的使用。

为什么学习KNN算法


KNN是监督学习分类算法,主要解决现实生活中分类问题。


(1)首先准备数据,可以是视频、音频、文本、图片等等


(2)抽取所需要的一些列特征,形成特征向量


(3)将这些特征向量连同标记一并送入机器学习算法中,训练出一个预测模型。


(4)采用同样的特征提取方法作用于新数据,得到用于测试的特征向量。


(5)使用预测模型对这些待测的特征向量进行预测并得到结果。


K近邻是机器学习算法中理论最简单,最好理解的算法,虽然算法简单,但效果也不错。


算法的思想:通过K个最近的已知分类的样本来判断未知样本的类别


  • 图像识别:KNN可以用于图像分类任务,例如人脸识别、车牌识别等。在图像识别领域,KNN通过计算测试图像与训练集中图像的相似度来进行分类。
  • 文本分类:在文本分类方面,KNN算法可以应用于垃圾邮件过滤、情感分析等领域。通过对文本数据的特征提取和距离计算,KNN能够对新文本进行有效的分类。
  • 回归预测:虽然KNN更常用于分类问题,但它也可以用于解决回归问题。在回归任务中,KNN通过找到最近的K个邻居,并根据它们的值来预测连续的输出变量。
  • 医疗诊断:KNN算法可以辅助医生进行疾病的诊断。通过比较患者的临床数据与历史病例数据,KNN有助于识别疾病的模式和趋势。
  • 金融风控:在金融领域,KNN可用于信用评分和欺诈检测。通过分析客户的交易行为和信用历史,KNN可以帮助金融机构评估风险。
  • 推荐系统:KNN还可以用于构建推荐系统,通过分析用户的历史行为和其他用户的行为模式,为用户推荐商品或服务。


Sklearn API


鸢尾花Iris Dataset数据集是机器学习领域经典数据集,鸢尾花数据集包含了150条鸢尾花信息,每50条取自三个鸢尾花中之一:Versicolour、Setosa和Virginica。



from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
 
if __name__ == '__main__':
      
    iris = load_iris() 
 
    # 数据标准化
    transformer = StandardScaler()
    x_ = transformer.fit_transform(iris.data) 
 
    # 模型训练
    estimator = KNeighborsClassifier(n_neighbors=3) # Knn中的K值
    estimator.fit(x_, iris.target) # 调用fit方法 传入特征和目标进行模型训练
 
    result = estimator.predict(x_) 
    print(result)


数据集划分

为了能够评估模型的泛化能力,可以通过实验测试对学习器的泛化能力进行评估,进而做出选择。因此需要使用一个测试集来测试学习器对新样本的判别能力。(2比8)


留出法:将数据集划分成两个互斥的集合:训练集,测试集。


交叉验证:将数据集划分为训练集,验证集,测试集 (验证集用于参数调整)。


留出法:


from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedShuffleSplit
from sklearn.model_selection import ShuffleSplit
from collections import Counter
from sklearn.datasets import load_iris
 
 
def test1():
 
    # 载数据集
    x, y = load_iris(return_X_y=True)
    print('原始类别比例:', Counter(y))
 
    # 留出法(随机分割)
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
    print('随机类别分割:', Counter(y_train), Counter(y_test))
 
    # 留出法(分层分割)
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, stratify=y)
    print('分层类别分割:', Counter(y_train), Counter(y_test))
 
 
def test2():
 
    
    x, y = load_iris(return_X_y=True)
    print('原始类别比例:', Counter(y))
    print('*' * 40)
 
    # 多次划分(随机分割)
    spliter = ShuffleSplit(n_splits=5, test_size=0.2, random_state=0)
    for train, test in spliter.split(x, y):
        print('随机多次分割:', Counter(y[test]))
 
    print('*' * 40)
 
    # 多次划分(分层分割)
    spliter = StratifiedShuffleSplit(n_splits=5, test_size=0.2, random_state=0)
    for train, test in spliter.split(x, y):
        print('分层多次分割:', Counter(y[test]))
 
 
if __name__ == '__main__':
    test1()
    test2()

随机类别分割: Counter({1: 41, 0: 40, 2: 39}) Counter({2: 11, 0: 10, 1: 9})

分层类别分割: Counter({2: 40, 0: 40, 1: 40}) Counter({2: 10, 1: 10, 0: 10})

原始类别比例: Counter({0: 50, 1: 50, 2: 50})

****************************************

随机多次分割: Counter({1: 13, 0: 11, 2: 6})

随机多次分割: Counter({1: 12, 2: 10, 0: 8})

随机多次分割: Counter({1: 11, 0: 10, 2: 9})

随机多次分割: Counter({2: 14, 1: 9, 0: 7})

随机多次分割: Counter({2: 13, 0: 12, 1: 5})

****************************************

分层多次分割: Counter({0: 10, 1: 10, 2: 10})

分层多次分割: Counter({2: 10, 0: 10, 1: 10})

分层多次分割: Counter({0: 10, 1: 10, 2: 10})

分层多次分割: Counter({1: 10, 2: 10, 0: 10})

分层多次分割: Counter({1: 10, 2: 10, 0: 10})


train_test_split 是一个函数,它用于将数据集划分为训练集和测试集。它可以随机地将数据集划分为两个子集,并可以指定划分的比例或数量。这个方法适用于大多数机器学习任务,特别是需要将数据集划分为训练集和测试集的情况。


而 ShuffleSplit 是一个类,它用于生成多个独立的训练/测试数据划分。与 train_test_split 不同,ShuffleSplit 会随机打乱数据集的顺序,然后根据指定的参数进行划分。这个方法适用于交叉验证的场景,特别是在需要多次划分数据集以评估模型性能的情况下。


总结来说,train_test_split 是一个简单的函数,用于将数据集划分为训练集和测试集;而 ShuffleSplit 是一个类,用于生成多个独立的训练/测试数据划分,适用于交叉验证的场景。


交叉验证法



K-Fold交叉验证,将数据随机且均匀地分成k分


  • 第一次使用标号为0-8的共9份数据来做训练,而使用标号为9的这一份数据来进行测试,得到一个准确率
  • 第二次使用标记为1-9的共9份数据进行训练,而使用标号为0的这份数据进行测试,得到第二个准确率
  • 以此类推,每次使用9份数据作为训练,而使用剩下的一份数据进行测试,共进行10次训练,最后模型的准确率为10次准确率的平均值


from sklearn.model_selection import KFold
from sklearn.model_selection import StratifiedKFold
from collections import Counter
from sklearn.datasets import load_iris
 
def test():
 
    
    x, y = load_iris(return_X_y=True)
    print('原始类别比例:', Counter(y))
    print('*' * 40)
 
    #  随机交叉验证
    spliter = KFold(n_splits=5, shuffle=True, random_state=0)
    for train, test in spliter.split(x, y):
        print('随机交叉验证:', Counter(y[test]))
 
    print('*' * 40)
 
    # 分层交叉验证
    spliter = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
    for train, test in spliter.split(x, y):
        print('分层交叉验证:', Counter(y[test]))


随机交叉验证: Counter({1: 13, 0: 11, 2: 6})

随机交叉验证: Counter({2: 15, 1: 10, 0: 5})

随机交叉验证: Counter({0: 10, 1: 10, 2: 10})

随机交叉验证: Counter({0: 14, 2: 10, 1: 6})

随机交叉验证: Counter({1: 11, 0: 10, 2: 9})

****************************************

分层交叉验证: Counter({0: 10, 1: 10, 2: 10})

分层交叉验证: Counter({0: 10, 1: 10, 2: 10})

分层交叉验证: Counter({0: 10, 1: 10, 2: 10})

分层交叉验证: Counter({0: 10, 1: 10, 2: 10})

分层交叉验证: Counter({0: 10, 1: 10, 2: 10})



K 近邻算法(二)+https://developer.aliyun.com/article/1544596?spm=a2c6h.13148508.setting.33.2a1e4f0enzfh9f

相关文章
|
8天前
|
机器学习/深度学习 存储 算法
K 近邻算法(二)
K-近邻(KNN)算法是一种监督学习方法,用于分类和回归。关键步骤包括计算新样本与训练样本的距离,选择合适的邻近样本数K,基于K个邻居的多数类别或平均值做出预测。K值的选择影响模型性能:小K易受噪声影响(过拟合),大K可能导致模型过于简单(欠拟合)。评估模型通常使用测试集的预测准确率,如sklearn.metrics.accuracy_score。最优K值可通过交叉验证,如GridSearchCV,来确定,但它可能计算密集。KNN常用于手写数字识别等任务,如MNIST数据集。
|
19天前
|
算法
使用k-近邻算法构建手写识别系统(kNN)
使用k-近邻算法构建手写识别系统(kNN)
22 9
|
19天前
|
算法 Python
使用k-近邻算法改进约会网站的配对效果(kNN)
使用k-近邻算法改进约会网站的配对效果(kNN)
23 6
|
19天前
|
存储 算法 索引
k-近邻算法(kNN)
k-近邻算法(kNN)
20 5
|
6天前
|
机器学习/深度学习 算法 搜索推荐
KNN算法(k近邻算法)原理及总结
KNN算法(k近邻算法)原理及总结
|
11天前
|
机器学习/深度学习 算法 搜索推荐
【机器学习】近邻类模型:KNN算法在数据科学中的实践与探索
【机器学习】近邻类模型:KNN算法在数据科学中的实践与探索
34 0
|
2月前
|
机器学习/深度学习 数据采集 存储
【机器学习】K-近邻算法(KNN)全面解析
K-近邻算法(K-Nearest Neighbors, KNN)是一种基于实例的学习方法,属于监督学习范畴。它的工作原理简单直观:给定一个训练数据集,对新的输入实例,KNN算法通过计算其与训练集中每个实例的距离,找出距离最近的K个邻居,然后根据这些邻居的类别(对于分类任务)或值(对于回归任务)来预测新实例的类别或值。KNN因其简单高效和无需训练过程的特点,在众多领域中得到广泛应用,如模式识别、推荐系统、图像分类等。
182 0
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
|
2月前
|
机器学习/深度学习 自然语言处理 算法
机器学习--K-近邻算法常见的几种距离算法详解
机器学习--K-近邻算法常见的几种距离算法详解
|
2月前
|
机器学习/深度学习 算法 数据挖掘
机器学习--K近邻算法,以及python中通过Scikit-learn库实现K近邻算法API使用技巧
机器学习--K近邻算法,以及python中通过Scikit-learn库实现K近邻算法API使用技巧