环境配置
Python 3.x
Scikit-learn库、Numpy库、Matplotlib库
Jupyter Notebook或类似IDE(用于代码编写和结果展示)
数据集
使用Scikit-learn自带的Iris数据集。该数据集包含150条记录,每条记录有4个特征(萼片长度、萼片宽度、花瓣长度、花瓣宽度),属于3个类别之一(Setosa、Versicolor、Virginica)。这是一个典型的多分类数据集,适合进行KNN分类实验。。
步骤
1. 导入必要的库
导入Numpy、Matplotlib和Scikit-learn中的KNN、数据分割和标准化工具。
2. 加载数据集
使用Scikit-Learn的datasets模块加载Iris数据集。显示数据集的基本信息,如样本数量、特征数量和类别标签。
3. 数据预处理
数据标准化:在KNN中,特征尺度差异会影响距离计算,因此需要对特征数据进行标准化。
使用train_test_split函数将数据集分成训练集和测试集(通常比例为80%训练,20%测试)
4. 构建KNN模型
使用KNN算法创建模型,尝试设置不同的K值(例如K=3, 5, 7)。
将训练数据输入模型,使用训练集数据进行模型训练
5. 选择最佳K值,重新训练模型并评估
绘制出不同K值下模型的准确率,以找到最佳的K值。
根据图表找到的最佳K值,重新训练模型并评估其性能。
鸢尾花数据集介绍
Iris数据集是常⽤的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是⼀类多重变量分析的数据集。
获取鸢尾花数据集
iris = load_iris()
print("鸢尾花数据集的返回值:\n", iris)
# 返回值是⼀个继承⾃字典的Bench
print("鸢尾花的特征值:\n", iris["data"])
print("鸢尾花的⽬标值:\n", iris.target)
print("鸢尾花特征的名字:\n", iris.feature_names)
print("鸢尾花⽬标值的名字:\n", iris.target_names)
print("鸢尾花的描述:\n", iris.DESCR)
图片1
查看数据分布:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from sklearn.datasets import load_iris
# 加载数据
iris = load_iris()
iris_d = pd.DataFrame(iris['data'], columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'])
iris_d['Species'] = iris.target
# 设置 matplotlib 使用中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定字体为 SimHei(黑体)
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
def plot_iris(iris, col1, col2):
sns.lmplot(x = col1, y = col2, data = iris, hue = "Species", fit_reg = False)
plt.xlabel(col1)
plt.ylabel(col2)
plt.title('鸢尾花种类分布图')
plt.show()
plot_iris(iris_d, 'Petal_Width', 'Sepal_Length')
图片2
分类代码参考
以下是一个利用Scikit-learn实现KNN分类的代码示例(以Iris数据集为例):
导入必要的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
图片3
加载划分数据集
测试集占20%
数据集划分api
sklearn.model_selection.train_test_split(arrays, *options)
参数:
x 数据集的特征值
y 数据集的标签值
test_size 测试集的⼤⼩,⼀般为float
random_state 随机数种⼦,不同的种⼦会造成不同的随机采样结果。相同的种⼦采样结果相同。
Return:
x_train, x_test, y_train, y_test
iris=load_iris()
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
图片4
数据标准化
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
图片5
设置不同的K值创建KNN模型
求出每个K值下模型的准确率
k_values = range(5, 31)
accuracies = []
for k in k_values:
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(x_train, y_train)
y_pred = knn.predict(x_test)
accuracy = accuracy_score(y_test, y_pred)
accuracies.append(accuracy)
# 绘制出不同K值下模型的准确率,从而找出最佳K值
plt.plot(k_values, accuracies)
plt.xlabel('Number of Neighbors (K)')
plt.ylabel('Accuracy')
plt.title('KNN Accuracy for different K values')
plt.show()
图片6
根据上面找出的最佳K值,重新训练模型并评估
# 假设最佳K值为k_optimal
k_optimal = k_values[accuracies.index(max(accuracies))]
knn_best = KNeighborsClassifier(n_neighbors=k_optimal)
knn_best.fit(x_train, y_train)
y_pred_best = knn_best.predict(x_test)
accuracy_best = accuracy_score(y_test, y_pred_best)
print("得到的最好的k结果是:",k_optimal)
print("最好k值的准确率为:",accuracy_best)
图片7
交叉验证,⽹格搜索(模型选择与调优)
什么是交叉验证(cross validation)
交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成4份,其中⼀份作为验证集。然后经过4次
(组)的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。⼜称4折交叉验证。
分析
我们之前知道数据分为训练集和测试集,但是为了让从训练得到模型结果更加准确。做以下处理
训练集:训练集+验证集
测试集:测试集
图片8
为什么需要交叉验证
交叉验证⽬的:为了让被评估的模型更加准确可信
问题:这个只是让被评估的模型更加准确可信,那么怎么选择或者调优参数呢?
什么是⽹格搜索(Grid Search)
通常情况下,有很多参数是需要⼿动指定的(如k-近邻算法中的K值),这种叫超参数。但是⼿动过程繁杂,所以需要
对模型预设⼏种超参数组合。每组超参数都采⽤交叉验证来进⾏评估。最后选出最优参数组合建⽴模型。
交叉验证,⽹格搜索(模型选择与调优)API:
sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
对估计器的指定参数值进⾏详尽搜索
estimator:估计器对象
param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}
cv:指定⼏折交叉验证
fit:输⼊训练数据
score:准确率
结果分析:
bestscore__:在交叉验证中验证的最好结果
bestestimator:最好的参数模型
cvresults:每次交叉验证后的验证集准确率结果和训练集准确率结果
代码参考
使⽤GridSearchCV构建估计器
estimator=KNeighborsClassifier()
param_grid={"n_neighbors":[11,12,13,14]}
estimator=GridSearchCV(estimator,param_grid=param_grid,cv=5)
estimator.fit(x_train,y_train)
图片9
预测值与真实值的对比
y_pre=estimator.predict(x_test)
print("预测值是:\n",y_pre)
print("预测值与真实值的对比是:\n",y_pre==y_test)
图片10
计算准确率:
score=estimator.score(x_test,y_test)
print("准确率为:\n",score)
图片11
得到结果:
该题中最好的模型k=11
print("在交叉验证中,得到的最好结果是:\n",estimator.best_score_)
print("在交叉验证中,得到的最好的模型是:\n",estimator.best_estimator_)
print("在交叉验证中,得到的模型结果是:\n",estimator.cv_results_)
图片12
标签:KNN,Iris,iris,验证,print,train,test,鸢尾花,数据 From: https://blog.csdn.net/fukase_mio/article/details/143747700