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

相关推荐
ROBIN__dyc2 分钟前
数组
算法
正义的彬彬侠10 分钟前
CatBoost 中对分类特征进行目标变量统计编码 公式解析
人工智能·机器学习·集成学习·boosting·catboost
字节跳动数据平台14 分钟前
火山引擎 VeDI 平台以 AIGC 技术,助力企业提效营销、快速增长
人工智能
Chef_Chen29 分钟前
从0开始学习机器学习--Day22--优化总结以及误差作业(上)
人工智能·学习·机器学习
Mr.简锋34 分钟前
opencv常用api
人工智能·opencv·计算机视觉
华清元宇宙实验中心38 分钟前
【每天学点AI】前向传播、损失函数、反向传播
深度学习·机器学习·ai人工智能
手握风云-39 分钟前
零基础Java第十六期:抽象类接口(二)
数据结构·算法
DevinLGT1 小时前
6Pin Type-C Pin脚定义:【图文讲解】
人工智能·单片机·嵌入式硬件
宋一诺331 小时前
机器学习—高级优化方法
人工智能·机器学习
龙的爹23331 小时前
论文 | The Capacity for Moral Self-Correction in LargeLanguage Models
人工智能·深度学习·机器学习·语言模型·自然语言处理·prompt