【KNN算法】对鸢尾花分类

📅 2026/7/4 4:19:25
【KNN算法】对鸢尾花分类
要分的三类鸢尾花0、导包# 导包 import seaborn as sns import pandas import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split # 分割训练集的测试集 from sklearn.preprocessing import StandardScaler # 数据标准化 from sklearn.metrics import accuracy_score # 模型评估计算模型预测的准确率 from sklearn.neighbors import KNeighborsClassifier # KNN算法 from sklearn.datasets import load_iris # 加载鸢尾花测试集1、查看数据集# 定义函数加载鸢尾花数据集并查看数据集 def dm01_loadiris(): # 加载鸢尾花数据集 iris_data load_iris() # 查看数据集 print(iris_data) # 字典形态 # print(fdata type:{type(iris_data)}) # 查看数据集的键 print(f数据集的键{iris_data.keys()}) #dict_keys([data, target, frame, target_names, DESCR, feature_names, filename, data_module]) # 键对应的值 print(f具体的数据{iris_data.data[:5]}) # 前五条,其中一条 [[5.1 3.5 1.4 0.2]...] 有4个特征 print(f具体的标签{iris_data.target[:5]}) #[0 0 0 0 0] print(f标签对应的名称{iris_data.target_names}) # [setosa versicolor virginica] print(f特征对应的名称{iris_data.feature_names}) #[sepal length (cm), sepal width (cm), petal length (cm), petal width (cm)] if __name__ __main__: dm01_loadiris()运行结果2、绘制鸢尾花的散点图# 定义函数绘制鸢尾花的散点图 def dm02_show_iris(): # 加载数据集 iris_data load_iris() # 把数据集中的 data 封装成DataFrame对象 iris_df pd.DataFrame(iris_data.data, columnsiris_data.feature_names) # 给df对象新增label列 iris_df[label] iris_data.target print(iris_df) # 绘制散点图 # 参1数据集 参2X轴 参3y轴 参4分组字段 参5是否显示拟合回归线 sns.lmplot(datairis_df, xsepal length (cm), ysepal width (cm), huelabel, fit_regFalse) # 设置标题显式 plt.title(iris data) plt.tight_layout() # 自动调整子图参数以使整个图像的边界与子图匹配 plt.show() if __name__ __main__: # dm01_loadiris() dm02_show_iris()运行结果3、数据集划分主要是用到 from sklearn.model_selection import train_test_split# 定义函数切分训练集和测试集 def dm03_split_train_test(): # 加载数据 iris_data load_iris() # 共150条特征和标签 # 数据的预处理 # 参1特征数据 参2标签数据 参3测试集比例 参4随机种子种子一致每次生成的随机数据集都是固定的 # 返回值训练集、测试集的特征数据训练集、测试集的标签数据 x_train, x_test, y_train, y_test train_test_split(iris_data.data, iris_data.target, test_size0.2, random_state23) # 打印切割后的结果 print(f训练集的特征{x_train},个数{len(x_train)}) print(f测试集的特征{x_test},个数{len(x_test)}) print(f训练集的标签{y_train},个数{len(y_train)}) print(f训练集的标签{y_test},个数{len(y_test)}) if __name__ __main__: dm03_split_train_test()运行结果4、实现鸢尾花完整案例重点都在注释里了。# 定义函数实现鸢尾花完整案例 -- 加载数据、数据预处理、特征工程、模型训练 def dm04_complite(): # 加载数据 iris_data load_iris() # 数据预处理 x_train, x_test, y_train, y_test train_test_split(iris_data.data, iris_data.target, test_size0.2, random_state23) # 特征工程 # 思考1: 特征提取: 因为源数据只有四个特征列且都是我们用的所以这里无需做特征提取 # 思考2: 特征预处理因为源数据4列特征的量纲差别不大无需做特征处理。但为了理解步骤这里还是加上了标准化 # 对数据进行标准化 # 1.创建标准化对象 transfer StandardScaler() # 2.特征列进行标准化即x_train 和 x_test # 2.1 对训练集进行标准化 # fit_transform: 兼具fit和transform的功能即训练转换。一般适用于第一次进行标准化一般是处理训练集。 x_train transfer.fit_transform(x_train) # 2.2 对测试集进行标准化 # transform只有转换。该函数适用于重复进行标准化动作是使用一般用于测试集。 x_test transfer.transform(x_test) # 模型训练 # 创建模型对象 estimator KNeighborsClassifier(n_neighbors3) # 具体的训练动作 estimator.fit(x_train,y_train) # 模型预测 # 场景1对刚才切分的测试集进行测试 y_pred_1 estimator.predict(x_test) print(f测试集的预测结果为{y_pred_1}) # 场景2对新的数据集进行测试 # 自定义测试数据集 my_data [[7.8,2.2,3.9,1.6]] # 注意 要对数据进行标准化处理 my_data transfer.transform(my_data) # 进行预测 y_pred_2 estimator.predict(my_data) print(f自定义数据集的预测结果为{y_pred_2}) # 模型评估 # 方式1直接评分基于测试集的特征 和 测试集的标签 print(f正确率{estimator.score(x_test,y_test)}) # 方式2基于 测试集的特征 和 预测结果 print(f正确率{accuracy_score(y_test,y_pred_1)}) if __name__ __main__: dm04_complite()运行结果: