使用Python实现基于KNN的鸢尾花分类
免费快速起号(微信号)
QSUtG1U
机器学习作为一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。使用它可以通过构建模型对数据进行预测和分类。在众多机器学习算法中,K近邻(K-Nearest Neighbors, KNN)算法是一种简单直观的监督学习方法。本文将通过Python语言实现一个基于KNN的鸢尾花分类案例。
数据准备
1. 鸢尾花数据集简介
鸢尾花数据集(Iris Dataset)是机器学习领域中最著名的数据集之一。该数据集由Ronald Fisher于1936年收集整理,包含150个样本,分为三个类别(Setosa、Versicolour、Virginica),每个类别各有50个样本。每个样本有四个特征:萼片长度、萼片宽度、花瓣长度和花瓣宽度。
2. 加载数据集
from sklearn.datasets import load_irisimport pandas as pd# 加载鸢尾花数据集iris = load_iris()# 将数据转换为DataFrame格式方便查看df = pd.DataFrame(data=iris.data, columns=iris.feature_names)df['target'] = iris.targetprint(df.head())
上述代码展示了如何从sklearn
库加载鸢尾花数据集,并将其转换为Pandas的DataFrame格式以方便后续处理。通过打印前几行可以看到数据的基本结构。
数据预处理
在进行任何机器学习任务之前,都需要对原始数据进行适当的预处理。对于鸢尾花数据集来说,主要包括以下几个步骤:
标准化:由于各个特征的量纲不同,为了消除这种差异带来的影响,在训练模型之前通常需要对数据进行标准化。划分训练集与测试集:为了评估模型性能,需要将数据划分为训练集和测试集两部分。from sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScaler# 划分特征X和标签yX = df.drop('target', axis=1).valuesy = df['target'].values# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 标准化scaler = StandardScaler()X_train_scaled = scaler.fit_transform(X_train)X_test_scaled = scaler.transform(X_test)print("训练集大小:", X_train_scaled.shape)print("测试集大小:", X_test_scaled.shape)
这段代码实现了对数据集的标准化处理以及训练集和测试集的划分。其中,train_test_split()
函数用于随机抽取一定比例的数据作为测试集,而StandardScaler()
则负责对特征值进行标准化操作。
构建KNN模型
KNN算法的核心思想是:给定一个测试样本,根据其k个最近邻居的类别来确定该样本所属的类别。这里我们将使用sklearn.neighbors
模块中的KNeighborsClassifier
类来构建KNN分类器。
from sklearn.neighbors import KNeighborsClassifierfrom sklearn.metrics import accuracy_score, classification_report# 初始化KNN分类器knn = KNeighborsClassifier(n_neighbors=3)# 训练模型knn.fit(X_train_scaled, y_train)# 预测y_pred = knn.predict(X_test_scaled)# 评估模型accuracy = accuracy_score(y_test, y_pred)print(f"Accuracy: {accuracy:.4f}")# 打印分类报告report = classification_report(y_test, y_pred, target_names=iris.target_names)print(report)
上面的代码首先初始化了一个KNN分类器实例,指定n_neighbors=3
表示选择距离最近的3个邻居来进行投票。然后利用训练集数据训练模型,并用测试集数据进行预测。最后通过计算准确率以及输出详细的分类报告来评估模型性能。
模型优化
虽然我们已经得到了一个初步可用的KNN模型,但还可以进一步优化。例如,可以尝试调整超参数n_neighbors
的值,或者采用交叉验证的方法寻找最优参数组合。
from sklearn.model_selection import GridSearchCV# 定义参数网格param_grid = {'n_neighbors': [1, 3, 5, 7, 9]}# 初始化GridSearchCVgrid_search = GridSearchCV(KNeighborsClassifier(), param_grid, cv=5, scoring='accuracy')# 执行搜索grid_search.fit(X_train_scaled, y_train)# 输出最佳参数及对应的准确率print("Best parameters found:", grid_search.best_params_)print("Best cross-validation accuracy:", grid_search.best_score_)# 使用最佳参数重新训练并评估模型best_knn = grid_search.best_estimator_y_pred_best = best_knn.predict(X_test_scaled)accuracy_best = accuracy_score(y_test, y_pred_best)print(f"Test set accuracy with best parameters: {accuracy_best:.4f}")
这段代码通过GridSearchCV
进行了网格搜索,遍历了指定范围内的所有可能参数组合,并通过交叉验证选择了使模型性能最优的那一组参数。最终结果显示,经过优化后的模型在测试集上的准确率有所提升。
总结
本文详细介绍了如何使用Python实现基于KNN算法的鸢尾花分类任务。从数据加载到预处理,再到模型构建与优化,每个环节都给出了具体的代码实现。通过这个案例,读者不仅能够加深对KNN算法的理解,还能掌握一些常见的机器学习工作流程和技术手段。当然,在实际应用中还需要根据具体问题的特点灵活调整策略,不断探索更有效的解决方案。