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

相关推荐
深圳南柯电子10 分钟前
深圳南柯电子|电子设备EMC测试整改:常见问题与解决方案
人工智能
Kai HVZ11 分钟前
《OpenCV计算机视觉》--介绍及基础操作
人工智能·opencv·计算机视觉
_WndProc12 分钟前
C++ 日志输出
开发语言·c++·算法
biter008816 分钟前
opencv(15) OpenCV背景减除器(Background Subtractors)学习
人工智能·opencv·学习
吃个糖糖22 分钟前
35 Opencv 亚像素角点检测
人工智能·opencv·计算机视觉
努力学习编程的伍大侠26 分钟前
基础排序算法
数据结构·c++·算法
qq_5290252940 分钟前
Torch.gather
python·深度学习·机器学习
XiaoLeisj1 小时前
【递归,搜索与回溯算法 & 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(二)
数据结构·算法·leetcode·决策树·深度优先·剪枝
IT古董1 小时前
【漫话机器学习系列】017.大O算法(Big-O Notation)
人工智能·机器学习