机器学习 --- KNN算法

机器学习 --- KNN算法


文章目录


一,sklearn机器学习概述

获取数据、数据处理、特征工程后,就可以交给预估器进行机器学习,流程和常用API如下。

bash 复制代码
1.实例化预估器(估计器)对象(estimator), 预估器对象很多,都是estimator的子类
	(1)用于分类的预估器
		sklearn.neighbors.KNeighborsClassifier k-近邻
		sklearn.naive_bayes.MultinomialNB 贝叶斯
		sklearn.linear_model.LogisticRegressioon 逻辑回归
		sklearn.tree.DecisionTreeClassifier 决策树
		sklearn.ensemble.RandomForestClassifier 随机森林
	(2)用于回归的预估器
		sklearn.linear_model.LinearRegression线性回归
		sklearn.linear_model.Ridge岭回归
	(3)用于无监督学习的预估器
		sklearn.cluster.KMeans 聚类
2.进行训练,训练结束后生成模型
	estimator.fit(x_train, y_train)
3.模型评估
	(1)方式1,直接对比
		y_predict = estimator.predict(x_test)
		y_test == y_predict
  	(2)方式2, 计算准确率
  		accuracy = estimator.score(x_test, y_test)
4.使用模型(预测)
y_predict = estimator.predict(x_true)

二,KNN算法---分类

2.1样本距离判断

  • 欧氏距离
  • 曼哈顿距离

2.2 KNN算法原理

K-近邻算法(K-Nearest Neighbors,简称KNN),根据K个邻居样本的类别来判断当前样本的类别;

如果一个样本在特征空间中的k个最相似(最邻近)样本中的大多数属于某个类别,则该类本也属于这个类别

比如: 有10000个样本,选出7个到样本A的距离最近的,然后这7个样本中假设:类别1有2个,类别2有3个,类别3有2个.那么就认为A样本属于类别2,因为它的7个邻居中 类别2最多(近朱者赤近墨者黑)

2.3 KNN缺点

​ 对于大规模数据集,计算量大,因为需要计算测试样本与所有训练样本的距离。

​ 对于高维数据,距离度量可能变得不那么有意义,这就是所谓的"维度灾难"

​ 需要选择合适的k值和距离度量,这可能需要一些实验和调整

2.4 API

bash 复制代码
class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, algorithm='auto')
参数:                                             
(1)n_neighbors: 
		int, default=5, 默认情况下用于kneighbors查询的近邻数,就是K
(2)algorithm:
	{'auto', 'ball_tree', 'kd_tree', 'brute'}, default='auto'。找到近邻的方式,注意不是计算距离		的方式,与机器学习算法没有什么关系,开发中请使用默认值'auto'
方法:
 (1) fit(x, y) 
        使用X作为训练数据和y作为目标数据  
 (2) predict(X)	预测提供的数据,得到预测数据 
                                                                           

2.5 使用sklearn中鸢尾花数据集实现KNN

bash 复制代码
# 引入数据集
from sklearn.datasets import load_iris
# 引入KNN算法
from sklearn.neighbors import KNeighborsClassifier
# 引入标准化工具
from sklearn.preprocessing import StandardScaler
#引入数据集划分
from sklearn.model_selection import train_test_split
#引入joblib
import joblib


#训练函数
def train():
    #加载数据
    iris = load_iris()#加载鸢尾花数据集
    X = iris.data#鸢尾花特征数据
    y = iris.target#鸢尾花标签数据
    #数据集划分
    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=22)
    #数据标准化
    transfer = StandardScaler()
    X_train = transfer.fit_transform(X_train)
    #创建knn模型
    model = KNeighborsClassifier(n_neighbors=5)
    #使用训练集训练模型
    model.fit(X_train,y_train)

    #测试集的预测结果
    X_test = transfer.transform(X_test)
    score = model.score(X_test,y_test)
    print("准确率:",score)
    #保存模型
    if score  > 0.9:
        joblib.dump(model,"./model/knn.pkl")
        joblib.dump(transfer,"./model/transfer.pkl")
    else:
        print("模型效果不佳,重新训练")


    
# 推理函数
# 新数据预测
def detect():
    #加载数据
    model = joblib.load("./model/knn.pkl")
    transfer = joblib.load("./model/transfer.pkl")
    #新数据推理
    x_new = [[1,2,3,4]]
    x_new = transfer.transform(x_new)
    y_pred = model.predict(x_new)
    print("预测结果:",y_pred)
   

if __name__ == '__main__':
    train()
    detect()
复制代码
准确率: 0.9333333333333333
预测结果: [1]
相关推荐
m0_7202450119 小时前
1543.统计好三元组(简单)
开发语言·算法
To_OC20 小时前
LC 560 和为 K 的子数组:前缀和配哈希表,这对组合我是真的服了
javascript·算法·程序员
To_OC20 小时前
别死磕 Prompt 了!我用 Harness 流水线,让大模型自动产出高质量代码
人工智能·llm·agent
恒拓高科WorkPlus20 小时前
企业级即时通讯与数字协同平台:BeeWorks如何连接沟通、文档、业务与AI
人工智能
XGeFei20 小时前
【AI应用/Agent智能体搭建平台2】Dify——自部署
人工智能·笔记·学习
hans汉斯20 小时前
《软件工程与应用》期刊推荐&10月版面征稿中
图像处理·人工智能·深度学习·算法·音视频·软件工程
前端开发江鸟20 小时前
为了实现“小说自由”,我搭了一套 AI 小说工作流,结果却不如回家种田
人工智能
叠层归一研究院21 小时前
AGI 系统(八):符号范畴嵌入函子 — SymCat ↪ C_M107 严格化
c语言·开发语言·人工智能·算法·transformer·agi
2601_9648402721 小时前
4G云门禁普惠化技术实践:基于边缘计算破解成本、隐私、部署三大行业瓶颈
大数据·人工智能·边缘计算
明朝百晓生21 小时前
Deep RL learning[2026/8]
开发语言·javascript·人工智能