1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【统计学习方法】K近邻对鸢尾花(iris)数据集进行多分类

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

时间:2019-10-26 18:00:47

相关推荐

【统计学习方法】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 pdimport numpy as npfrom sklearn.model_selection import train_test_splitfrom collections import Counterfrom 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_neighborsself.p = pself.X_train = X_trainself.y_train = y_traindef 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-20max_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 = 0n = 10for X, y in zip(X_test, y_test):label = self.predict(X)if label == y:right_count += 1return 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)) # 计算正确率

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。