1. 需求说明
基于鸢尾花数据集,使用 KNN 实现 3 类鸢尾花自动分类。
2. 数据集简介
- 来源:经典公开数据集,sklearn 内置。
- 样本:共 150 条,分 3 类鸢尾花(山鸢尾、变色鸢尾、维吉尼亚鸢尾),每类各 50 条。
- 特征:4 个数值特征:花萼长、花萼宽、花瓣长、花瓣宽。
- sepal length (cm):花萼长度
- sepal width (cm):花萼宽度
- petal length (cm):花瓣长度
- petal width (cm):花瓣宽度
- 标签:3 种花卉类别,无缺失、无异常值,数据干净,适合 KNN 等基础分类算法测试。
- 0:setosa 山鸢尾
- 1:versicolor 变色鸢尾
- 2:virginica 维吉尼亚鸢尾
3. KNN算法实现
3.1 导包
from sklearn.datasets import load_iris # 导入数据集 from sklearn.model_selection import train_test_split, GridSearchCV # 划分数据集, 交叉验证+网格搜索 from sklearn.neighbors import KNeighborsClassifier # 创建模型对象 from sklearn.metrics import accuracy_score # 模型评估 from sklearn.preprocessing import StandardScaler # 标准化对象 import seaborn as sns import pandas as pd import matplotlib.pyplot as plt3.2 获取数据
# 1. 加载数据集 data = load_iris() # 2. 查看数据集 # print(data.keys()) # 获取数据集所有的key print(data.data[:5]) # 数据集的前5行 print(data.target[:5]) # 数据集的标签的前5行 print(data.target_names) # 数据集的标签名 print(data.feature_names) # 数据集的属性名 # print(data.DESCR) # 数据集的描述 # print(data.frame) # 数据集的DataFrame格式 # print(data.filename) # 数据集的文件名 # print(data.data_module) # 数据集的模块 # 3. 可视化 data_df = pd.DataFrame(data.data, columns=data.feature_names) data_df['target'] = data.target # 散点图 sns.lmplot(x='sepal length (cm)', y='sepal width (cm)', hue='target', data=data_df, fit_reg=False) plt.title('iris data') plt.tight_layout() # 自动调整子图参数,使之填充整个图像 plt.show()3.3 数据预处理
缺失值、异常值处理(这里不用);划分数据集
# 划分数据集 # 参数解释: # test_size:测试集所占的比例,默认为0.25 # random_state:随机数种子,可以指定一个整数,从而保证每次运行时,数据集的划分都是固定的 # 返回值:x_train, x_test, y_train, y_test x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=22) # 打印划分后的数据集 print(f"训练集特征的大小: {x_train.shape}") print(f"测试集特征的大小: {x_test.shape}") print(f"训练集标签的大小: {y_train.shape}") print(f"测试集标签的大小: {y_test.shape}")3.4 特征工程
3.4.1 特征提取
这里不用
3.4.2 特征预处理
标准化
scaler = StandardScaler() x_train = scaler.fit_transform(x_train) # 方法解释:fit_transform(),兼具训练和转换的功能,先训练,再转换,适用于第一次进行标准化,一般用于训练集 x_test = scaler.transform(x_test) # 方法解释:transform(),只转换,适用于已经训练的模型进行转换3.5 模型训练
网格搜索+交叉验证
# 创建模型对象 estimator = KNeighborsClassifier() # 网格搜索+交叉验证 param_dict = {'n_neighbors': [i for i in range(1, 11)]} # 超参数字典, 超参可能出现的值 estimator = GridSearchCV(estimator, param_grid=param_dict, cv=5) # 创建GridSearchCV模型对象 estimator.fit(x_train, y_train) # 交叉验证前的模型训练 # 打印结果 print(f'最优评分为:{estimator.best_score_}') print(f"最优超参组合为:{estimator.best_params_}") print(f"最优的估计器对象为:{estimator.best_estimator_}") print(f"具体的交叉验证结果为:{estimator.cv_results_}")3.6 模型评估
# (1)获取最优超参的模型对象 estimator = estimator.best_estimator_ # (2)模型训练 estimator.fit(x_train, y_train) # (3)模型预测 y_pre = estimator.predict(x_test) # (4)模型评估 print(f"准确率:{accuracy_score(y_test, y_pre)}")3.7 模型预测
# 样本外预测 x # 要预测的数据集 y_pre = estimator.predict(x) print(y_pre)附件
1. 完整代码(这里准备放一个KNN万能建模.py文件,还没整理好~)