【机器学习】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模型做评估

相关推荐
帅次3 分钟前
系统分析师-计算机系统-输入输出系统
人工智能·分布式·深度学习·神经网络·架构·系统架构·硬件架构
皮卡蛋炒饭.19 分钟前
数据结构—排序
数据结构·算法·排序算法
AndrewHZ31 分钟前
【图像处理基石】如何入门大规模三维重建?
人工智能·深度学习·大模型·llm·三维重建·立体视觉·大规模三维重建
5G行业应用35 分钟前
【赠书福利,回馈公号读者】《智慧城市与智能网联汽车,融合创新发展之路》
人工智能·汽车·智慧城市
悟空胆好小44 分钟前
分音塔科技(BABEL Technology) 的公司背景、股权构成、产品类型及技术能力的全方位解读
网络·人工智能·科技·嵌入式硬件
探讨探讨AGV44 分钟前
以科技赋能未来,科聪持续支持青年创新实践 —— 第七届“科聪杯”浙江省大学生智能机器人创意竞赛圆满落幕
人工智能·科技·机器人
cwn_1 小时前
回归(多项式回归)
人工智能·机器学习·数据挖掘·回归
??tobenewyorker1 小时前
力扣打卡第23天 二叉搜索树中的众数
数据结构·算法·leetcode
贝塔西塔1 小时前
一文读懂动态规划:多种经典问题和思路
算法·leetcode·动态规划
聚客AI2 小时前
🔥 大模型开发进阶:基于LangChain的异步流式响应与性能优化
人工智能·langchain·agent