【统计学习方法】K近邻对鸢尾花(iris)数据集进行多分类

简介: 【统计学习方法】K近邻对鸢尾花(iris)数据集进行多分类

本文摘要

· 理论来源:【统计学习方法】第三章 K近邻

· 技术支持:pandas(读csv)、collections.Counter(统计)、numpy、sklearn.neighbors.KNeighborsClassifier(KNN模型)、KNN思想

· 代码目的:利用手写、sklearn两种KNN模型,对鸢尾花数据集进行多分类

作者:CSDN 征途黯然.

一、鸢尾花(iris)数据集


 Iris 鸢尾花数据集是一个经典数据集,在统计学习和机器学习领域都经常被用作示例。数据集内包含 3 类共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度,可以通过这4个特征预测鸢尾花卉属于(iris-setosa, iris-versicolour, iris-virginica)中的哪一品种。

下载地址:点击此处

二、代码描述


  1、首先,我们手写一个KNN模型,方法有predict(预测)score(评分)

  2、然后,对鸢尾花数据集进行预处理,我们取数据集中的150条数据,每条数据取4个特征,一共3个种类。把数据集分成训练集与测试集。

  3、最后,分别调用自定义KNN模型与sklearn提供的KNN模型,输出评分。

三、python代码(注释详细)


import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from collections import Counter
from sklearn.neighbors import KNeighborsClassifier
# 建立一个类KNN,用于k-近邻的计算
class KNN:
    # 初始化
    def __init__(self, X_train, y_train, n_neighbors=3, p=2):  # 初始化数据,neighbor表示邻近点,p为欧氏距离
        self.n = n_neighbors
        self.p = p
        self.X_train = X_train
        self.y_train = y_train
    def predict(self, X):
        # X为测试集
        knn_list = []
        # 先遍历指定个邻近点,求范数
        for i in range(self.n):
            # 计算训练集和测试集之间的距离,np.linalg.norm求范数
            dist = np.linalg.norm(X - self.X_train[i], ord=self.p)
            knn_list.append((dist, self.y_train[i]))  # 在列表末尾添加一个元素
        # 对于剩下的数据集,求范数,并替换近邻中最大的点
        for i in range(self.n, len(self.X_train)):  # 3-20
            max_index = knn_list.index(max(knn_list, key=lambda x: x[0]))  # 找出列表中距离最大的点
            dist = np.linalg.norm(X - self.X_train[i], ord=self.p)  # 计算训练集和测试集之间的距离
            if knn_list[max_index][0] > dist:  # 若当前数据的距离大于之前得出的距离,就将数值替换
                knn_list[max_index] = (dist, self.y_train[i])
        # 把近邻点中标签提取出
        knn = [k[-1] for k in knn_list]
        # 统计标签的个数,Counter计算数组中每个元素出现的次数
        count_pairs = Counter(knn)
        max_count = sorted(count_pairs, key=lambda x: x)[-1]  # 将标签升序排列
        return max_count
    # 计算测试算法的正确率
    def score(self, X_test, y_test):
        right_count = 0
        n = 10
        for X, y in zip(X_test, y_test):
            label = self.predict(X)
            if label == y:
                right_count += 1
        return right_count / len(X_test)
# 导入数据集
df = pd.read_csv('./iris/Iris.csv', usecols=[1, 2, 3, 4, 5])
# pandas打印表格信息
# print(df.info())
# pandas查看数据集的头5条记录
# print(df.head())
"""数据预处理"""
# 取前100条数据中的:前4个特征+标签,便于训练
data = np.array(df.iloc[:150, [0, 1, 2, 3, -1]])
# 数据类型转换,为了后面的数学计算
X, y = data[:, :-1], data[:, -1]
# 标签不需要是数字,字符串并不影响
# y = np.array([1 if i == 'Iris-setosa' else -1 for i in y])
"""数据集分割"""
# 把数据集分成训练集、测试集,test_size可以限定测试集的个数或占比
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
"""调用自定义kNN算法"""
clf = KNN(X_train, y_train) # 调用KNN算法进行计算
print(clf.score(X_test, y_test)) # 计算正确率
"""调用sklearn提供的kNN算法"""
# 调用
clf_sk = KNeighborsClassifier()
clf_sk.fit(X_train, y_train)
print(clf_sk.score(X_test, y_test)) # 计算正确率
相关文章
|
7月前
|
机器学习/深度学习
数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC(下)
数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC
|
4月前
|
机器学习/深度学习 数据采集
R语言逻辑回归、GAM、LDA、KNN、PCA主成分分类分析预测房价及交叉验证
上述介绍仅为简要概述,每个模型在实施时都需要仔细调整与优化。为了实现高度精确的预测,模型选择与调参是至关重要的步骤,并且交叉验证是提升模型稳健性的有效途径。在真实世界的房价预测问题中,可能还需要结合地域经济、市场趋势等宏观因素进行综合分析。
89 3
|
7月前
|
机器学习/深度学习 数据可视化 计算机视觉
数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC(上)
数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC
|
7月前
|
机器学习/深度学习 数据采集 算法
R语言逻辑回归、GAM、LDA、KNN、PCA主成分分析分类预测房价及交叉验证|数据分享
R语言逻辑回归、GAM、LDA、KNN、PCA主成分分析分类预测房价及交叉验证|数据分享
|
7月前
|
机器学习/深度学习 算法 索引
R语言逻辑回归logistic模型分析泰坦尼克titanic数据集预测生还情况
R语言逻辑回归logistic模型分析泰坦尼克titanic数据集预测生还情况
|
7月前
|
数据可视化 算法 数据挖掘
R语言鸢尾花iris数据集的层次聚类分析
R语言鸢尾花iris数据集的层次聚类分析
|
机器学习/深度学习 移动开发 资源调度
机器学习算法(二): 基于鸢尾花数据集的朴素贝叶斯(Naive Bayes)预测分类
机器学习算法(二): 基于鸢尾花数据集的朴素贝叶斯(Naive Bayes)预测分类
|
7月前
|
机器学习/深度学习 算法 数据挖掘
分类算法中决策树和KNN算法讲解及对iris数据集分类实战(附源码)
分类算法中决策树和KNN算法讲解及对iris数据集分类实战(附源码)
215 0
|
7月前
|
机器学习/深度学习 算法
SVM算法、朴素贝叶斯算法讲解及对iris数据集分类实战(附源码)
SVM算法、朴素贝叶斯算法讲解及对iris数据集分类实战(附源码)
253 0
|
机器学习/深度学习 人工智能 数据挖掘
基于神经网络——鸢尾花识别(Iris)
鸢尾花识别是学习AI入门的案例,这里和大家分享下使用Tensorflow 2框架,编写程序,获取鸢尾花数据,搭建神经网络,最后训练和识别鸢尾花。
330 0