一、鸢尾花数据集(Iris)
- Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性。iris以鸢尾花的特征作为数据来源,常用在分类操作中。该数据集由3种不同类型的鸢尾花的50个样本数据构成。其中的一个种类与另外两个种类是线性可分离的,后两个种类是非线性可分离的。
- 四个属性:
Sepal.Length(花萼长度),单位是cm;
Sepal.Width(花萼宽度),单位是cm;
Petal.Length(花瓣长度),单位是cm;
Petal.Width(花瓣宽度),单位是cm;
from sklearn.datasets import load_iris
if __name__=='__main__':
#鸢尾花数据集
datas = load_iris()
print(datas)
结果:
{'data': array([[5.1, 3.5, 1.4, 0.2],
[4.9, 3. , 1.4, 0.2],
[4.7, 3.2, 1.3, 0.2],
[4.6, 3.1, 1.5, 0.2],
[5. , 3.6, 1.4, 0.2],
[5.4, 3.9, 1.7, 0.4],
....................,
[6.7, 3.3, 5.7, 2.5],
[6.7, 3. , 5.2, 2.3],
[6.3, 2.5, 5. , 1.9],
[6.5, 3. , 5.2, 2. ],
[6.2, 3.4, 5.4, 2.3],
[5.9, 3. , 5.1, 1.8]]), 'target': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
.....................
- 上图即为鸢尾花数据集,原数据data和目标数据target用于后续建立评估模型。
二、代码案例
1、指定k值建立评估模型
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
if __name__=='__main__':
#方法一:单独模型评估,鸢尾花数据集
datas = load_iris()
# 将鸢尾花元数据data作为训练数据集,target目标数据作为训练目标数据集
train,target = datas.data,datas.target
#准备一个乱数的下标序列号
index = np.arange(150)
np.random.shuffle(index)
# 根据给定的乱序的下标到对应的数组中提取对应的数据
# 将data和target中的前100个数据集作为训练数据集,之后的数据作为测试训练集
train,test = datas.data[index[:100]],datas.data[index[100:]]
train_target,real_target = datas.target[index[:100]],datas.target[index[100:]]
#采用KNN算法,训练模型,假设k值为5
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(train,train_target)
#模型评估(预测)
res = knn.predict(test)
print(res)
print('---------------')
print(real_target)
print(1-abs(res-real_target).sum()/len(res))
结果:
[1 0 0 0 1 0 0 2 2 2 2 1 2 0 2 2 2 1 1 2 0 2 1 0 0 2 1 2 0 1 0 2 2 1 1 0 1
2 1 0 2 2 0 0 2 0 1 1 1 0] #评测值
---------------
[1 0 0 0 2 0 0 2 2 2 2 1 2 0 2 2 2 2 1 2 0 2 1 0 0 2 1 2 0 1 0 2 2 1 1 0 1
2 1 0 2 2 0 0 2 0 2 1 1 0] #实际值
0.94 评估准确性
- 结论
上图结果可知,当我把k值设置为5的时候,评测出准确度为0.94,但不一定是最高值,如何推断出k值为多少时,准确性最高呢?就要用到交叉验证。
2、交叉验证
- 在上述的模型中,我们将80%的数据用来训练,20%的数据用来测试,这样会带来一个问题。当20%的数据中有部分数据时异常数据,特别的大或者特别的小,而这20%的数据是没有进行训练的,这样带入到用80%数据训练的模型中进行测试,就会导致较大的误差,准确度降低,所以这就是我们采用交叉验证的原因。
- 交叉验证,就是第一轮取80%的数据进行训练,20%的数据进行测试,第二轮再取80%的数据进行训练,20%的数据进行测试,以此类推,这样就能保证每组数据至少训练一次,测试一次。再从中计算平均值,作为最终的评测结果。这样就能保证模型的准确性。
- 训练和测试数据的比例可以自行定义,下面的案例中我选择的是每次模型建立评估取10份数据,9组训练,1组测试。
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
import matplotlib
方法二:交叉验证模型评估
datas = load_iris()
train, target = datas.data, datas.target
#取k值为1-32,验证k值为多少时,模型最为准确
neighbors = np.arange(1,33)
#创建一个数组,用于存放模型评估的值
y = []
for k in neighbors:
# 训练模型
knn = KNeighborsClassifier(n_neighbors=k)
# 交叉验证模型评估
# cv:表示每次取10份数据,9份训练,1份测试
# scoring:表示该方法最终返回值为准确度
# mean():表示求平均值
ms = cross_val_score(knn, train, target, cv=10, scoring='accuracy').mean()
y.append(ms)
plt.plot(neighbors,y,'r')
for x1,y1 in zip(neighbors,y):
# 在柱状图上显示具体数值, ha参数控制水平对齐方式, va控制垂直对齐方式,rotation字体旋转
plt.text(x1,y1,str(x1),ha='center',va='bottom',fontsize=12,rotation=0)
plt.show()
- 结论
使用交叉验证来建立评估模型,可以发现当我们将k值取为13、18、20的时候,模型的准确性最高,大概为0.98