一、内容实现概述
本文主要讲述使用scikit-learn库内置的kNN模型,实现鸢尾花分类。具体实现过程如下:
- 1. 导入所需库:预先导入scikit-learn库
- 2. 导入数据:调用sklearn库内置的加载数据的方法load_iris(),导入鸢尾花数据
- 3. 数据预处理:对鸢尾花数据进行预处理,获得特征数据与目标数据
- 4. 数据分割:使用sklearn库的数据分割方法对步骤3中的数据进行比例分割,得到训练集和测试集数据
- 5. 构建kNN模型:调用sklearn库的分类模型类KNeighborsClassifier构建模型(本实现已手动设置预测样本结果的邻居值为3,因为该训练样本中最多只有3个鸢尾花类别)
- 6. 训练模型:调用sklearn库的fit()方法对训练集数据进行训练
- 7. 预测模型:调用sklearn库的predict()方法对测试集数据进行预测
- 8. 评估模型:由于该模型是分类模型,所以调用sklearn库的准确率评估方法
accuracy_score()
进行评估
注:
- 在Python中使用(导入)scikit-learn框架时,需要先安装,本实现使用的是pip命令安装 pip install -U scikit-learn
- Scikit-Learn官方教程
二、代码实现
注:源代码地址
# 主题:使用kNN(k-近邻)算法实现鸢尾花类别分类 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # 第一、二步:导入鸢尾花数据并进行数据预处理 X, y = load_iris(return_X_y=True) # 第三步:分割数据集 # 设置这个随机状态(random_state)是为了保证数据集的“不随机”。 # 因为设置random_state的目的就是确保每次运行分割程序时,获得完全一样的训练集和测试集。否则,同样的算法模型在不同的训练集和测试集上的效果不一样。如果每次都随机抽样,那么在确定模型和初始参数后,你会发现,模型每运行一次,就会得到不同的预测准确率(因为模型性能通常都对训练集敏感),从而使得调参无法有效进行 # 可以这样理解,每个随机状态(random_state,即某个整数值)都代表一批不同的训练集和测试集。如果它的值不变,无论程序运行多少次,获取的都是固定的一批训练集和测试集,这种稳定性为我们进行模型调参提供了方便 # 一旦模型调参完毕,这个值就不需要设置了。如果不设置这个值,就会启用它的默认值None。一旦这个值被设置为None,就启用np.random作为随机种子,即默认以系统时间为随机种子。我们知道,时光荏苒,每时每刻的系统时间都不同,反而让样本的抽取更趋近随机抽样状态。 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=123) # 第四步:导入K-近邻算法模型 knn_model = KNeighborsClassifier(n_neighbors=3) # 第五步:训练模型 knn_model.fit(X_train, y_train) # 第六步:预测模型 y_train_pred = knn_model.predict(X_train) y_pred = knn_model.predict(X_test) # 第七步:绘制预测结果 # 第八步:评估模型 # 由于目标值是离散的,因此可直接使用准确率进行评估 acc_score = accuracy_score(y_test, y_pred) # 其自定义的实现为:sum(y_pred == y_test) / len(y_test) * 100 train_acc_score = accuracy_score(y_train, y_train_pred) print("Accuracy: {:.2f}%".format(100 * acc_score)) print("Train accuracy score: {:.2f}%".format(100 * train_acc_score))
三、运行结果
标签:kNN,score,模型,分类,train,test,鸢尾花,sklearn From: https://www.cnblogs.com/xl1164191281/p/18677289