【机器学习】KNN算法及鸢尾花案例练习

KNN 算法

knn算法思想 : K-近邻算法(K Nearest Neighbor,简称KNN)。比如:根据你的"邻居"来推断出你的类别

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

常见距离公式

欧氏距离 (直角坐标系中两点之间线段长度)

曼哈顿距离(城市街区距离)(只能上下左右走)

  • 也叫城市街区距离
  • 特点: 横平竖直

切比雪夫距离(上下左右斜线八个方向)

闵可夫斯基距离 (闵氏距离)

​ 闵可夫斯基距离 Minkowski Distance 闵氏距离,不是一种新的距离的度量方式。而是距离的组合 是对多个距离度量公式的概括性的表述

特征的预处理

​ 特征的单位或者大小相差较大, 或者某特征方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些模型(算法)无法学习到其他的特征

  • 归一化 : 通过对原始数据进行变换 把数据映射到 mi,mx默认0,1之间

    • 公式

    • 弊端 : 容易受到最大值 最小值的影响 若他们差值过大 影响整体效果

    API实现:

    复制代码
    sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)... )
  • 标准化: 对原始数据做处理 转化为 均值为 0 标准差为 1 的标准正态分布序列

    • 公式: x' = (x - 该列的平均值mean) / 该列的标准差
    • 标准化适用于 大数据集的 特征预处理
    • sklearn.preprocessing.StandardScaler

    API实现:

    复制代码
    sklearn.preprocessing. StandardScaler()
    
    # 1.导入工具包
    from sklearn.preprocessing import MinMaxScaler,StandardScaler
    
    # 2.数据(只有特征)
    x = [[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]
    
    # 3.实例化(归一化,标准化)
    # process =MinMaxScaler()
    process =StandardScaler()
    
    # 4.fit_transform 处理1
    data =process.fit_transform(x)
    # print(data)
    
    print(process.mean_)
    print(process.var_)

KNN算法实现鸢尾花分类

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

代码实现:

python 复制代码
# 0.导入工具包
from sklearn.datasets import load_iris
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 1.加载数据集
iris_data = load_iris()
# print(iris_data)
# print(iris_data.target)


# 2.数据展示
iris_df = pd.DataFrame(iris_data['data'], columns=iris_data.feature_names)
iris_df['label'] = iris_data.target
# print(iris_data.feature_names)
# sns.lmplot(x='sepal length (cm)',y='sepal width (cm)',data = iris_df,hue='label')
# plt.show()


# 3.特征工程(预处理-标准化)
# 3.1 数据集划分
x_train, x_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size=0.3, random_state=22)
print(len(iris_data.data))
print(len(x_train))
# 3.2 标准化
process = StandardScaler()
x_train = process.fit_transform(x_train)
x_test = process.transform(x_test)
# 4.模型训练
# 4.1 实例化
model = KNeighborsClassifier(n_neighbors=3)
# 4.2 调用fit法
model.fit(x_train,y_train)
# 5.模型预测
x = [[5.1, 3.5, 1.4, 0.2]]
x=process.transform(x)
y_predict =model.predict(x_test)
print(model.predict_proba(x))

# 6.模型评估(准确率)
# 6.1 使用预测结果
acc =accuracy_score(y_test,y_predict)
print(acc)

# 6.2 直接计算
acc = model.score(x_test,y_test)
print(acc)

超参数选择方法

交叉验证是一种数据集的分割方法,将训练集划分为 n 份,其中一份做验证集、其他n-1份做训练集集

交叉验证法原理:将数据集划分为 cv=10 份:

1.第一次:把第一份数据做验证集,其他数据做训练

2.第二次:把第二份数据做验证集,其他数据做训练

3... 以此类推,总共训练10次,评估10次。

4.使用训练集+验证集多次评估模型,取平均值做交叉验证为模型得分

5.若k=5模型得分最好,再使用全部训练集(训练集+验证集) 对k=5模型再训练一边,再使用测试集对k=5模型做评估

相关推荐
IT_陈寒3 分钟前
Redis缓存雪崩把我坑惨了,这次长记性了
前端·人工智能·后端
百胜软件@百胜软件10 分钟前
百胜软件入选“828精选AI解决方案图谱”,胜券AI助力零售品牌构建专属智能体
大数据·人工智能·零售
ai小陈26 分钟前
Hunyuan3D-2云端部署实战:图生3D、文生3D怎么跑更稳
人工智能·科技·3d·ai·音视频·gpu算力
智驭未来掌门人28 分钟前
别再让员工偷偷用 ChatGPT 了:用一台内网网关,把大模型变成"自来水"
人工智能
阿里云大数据AI技术29 分钟前
EMR Serverless Spark多模态 Daft 算子市场免费公测 | 10分钟极速实战(附视频教程)
人工智能·spark
船厂电气自动化ai大模型32 分钟前
AI大模型与数学/第63课:矩阵定义、矩阵加法、标量乘法(逐级精讲)
数据结构·人工智能·深度学习·线性代数·算法
小婉42 分钟前
我用 Next.js + React Flow 从零搭建了一个可视化 AI 工作流编排平台
前端·人工智能·node.js
AI行业说43 分钟前
誉财自动化YC-18-M8045怎么选?2026中小服装工厂模板机选型指南
人工智能·机器人·自动化
余额瞒着我当琳1 小时前
算法修炼 chapter 2 双指针进阶、盛最多水的容器、有效三角形的个数、两数之和、三数之和、四数之和
算法
Waiky1 小时前
给 AI Agents 一双「眼睛」:CrawlEyes 开源了
人工智能