鸢尾花数据集保存在sklearn.datasets模块中,我们可以用load_iris函数加载数据,这个函数返回的iris对象是一个Bunch对象,与字典相似,包括键和值
此处打印出iris数据集中的键值
from sklearn.datasets import load_iris
iris_dataset=load_iris()
print("keys of iris_dataset:n{}".format(iris_dataset.keys()))
keys of iris_dataset:
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])
1、data:数据,表示iris数据集中的所有数据,因为数据较多,所以只截取了前20组数据。shape中第一个数字表示包含多少朵不同花的测量数据,第二个数表示特征名,此处有4个特征
from sklearn.datasets import load_iris
iris_dataset=load_iris()
print("data:{}".format(iris_dataset['data'][:20]))
print("shape of data:{}".format(iris_dataset['data'].shape))
data:[[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]
[4.6 3.4 1.4 0.3]
[5. 3.4 1.5 0.2]
[4.4 2.9 1.4 0.2]
[4.9 3.1 1.5 0.1]
[5.4 3.7 1.5 0.2]
[4.8 3.4 1.6 0.2]
[4.8 3. 1.4 0.1]
[4.3 3. 1.1 0.1]
[5.8 4. 1.2 0.2]
[5.7 4.4 1.5 0.4]
[5.4 3.9 1.3 0.4]
[5.1 3.5 1.4 0.3]
[5.7 3.8 1.7 0.3]
[5.1 3.8 1.5 0.3]
shape of data:(150, 4)
2、target:样本的标签,每一个数字代表不同花的品种,0,1,2分别代表不同的品种
from sklearn.datasets import load_iris
iris_dataset=load_iris()
print("target:{}".format(iris_dataset['target']))
print("shape of target:{}".format(iris_dataset['target'].shape))
data:[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 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
shape of data:(150,)
3、target_names:标签名称,一共有三种花,根据上面的target来看0代表‘setosa’,1代表‘versicolor’,2代表‘virginica’
from sklearn.datasets import load_iris
iris_dataset=load_iris()
print("target_names:{}".format(iris_dataset['target_names']))
target_names:['setosa' 'versicolor' 'virginica']
4、DESCR:数据集简要说明,因为都是一些说明信息在此不做展示
5、feature_names:特征名称。此处共有四种特征,分别是花萼长度,花萼宽度,花瓣长度,花瓣宽度
from sklearn.datasets import load_iris
iris_dataset=load_iris()
print("feature_names:{}".format(iris_dataset['feature_names']))
feature_names:['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
6、filename:文件名称,数据集文件的位置
from sklearn.datasets import load_iris
iris_dataset=load_iris()
print("filename:{}".format(iris_dataset['filename']))
filename:D:anacondalibsite-packagessklearndatasetsdatairis.csv
1、train_test_split 函数可以打乱数据集并进行拆分,这个函数将75%的行数据及对应标签作为训练集,剩下的25%的数据及其标签作为测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=0)
print("X_train shape:{}".format(X_train.shape))
print("X_train shape:{}".format(y_train.shape))
print("X_train shape:{}".format(X_test.shape))
print("X_train shape:{}".format(y_test.shape))
X_train shape:(112, 4)
X_train shape:(112,)
X_train shape:(38, 4)
X_train shape:(38,)
random_state参数指定了随机数生成器的种子,这样函数输出就是固定不变的,所以代码的输出始终相同
检查数据的最佳方法之一就是将其可视化
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
import mglearn
iris_dataset=load_iris()
X_train,X_test,y_train,y_test = train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=0)
iris_dataframe=pd.DataFrame(X_train,columns=iris_dataset.feature_names)
grr=pd.scatter_matrix(iris_dataframe,c=y_train,figsize=(15,15),marker='o',hist_kwds={'bins':20},s=60,alpha=.8,cmap=mglearn.cm3)
这里解读一下函数中的参数
(1)、iris_dataframe=pd.DataFrame(X_train,columns=iris_dataset.feature_names)
在第一节里面已经提到,pd.DataFrame表示绘制表格,其中引入的数据集为X_train的数据集,后一个参数表示属性名称,显示在表格的左边和下边,每一个表格都有两个相对的属性
(2)、grr=pd.scatter_matrix(iris_dataframe,c=y_train,figsize=(15,15),marker='o',hist_kwds={'bins':20},s=60,alpha=.8,cmap=mglearn.cm3)
scatter_matrix是pandas绘制散点图矩阵的函数,为了更好的对比,在此每添加一个参数,都已截图,便于观察,对角线是每个特征的直方图
iris_dataframe:上面的数据集
c=y_train:表示以y_train着色,也就是以标签着色,不同的标签着不同的颜色
figsize=(15,15):表示每个图像块的大小
marker='o':标记符号
hist_kwds={'bins':20}:与hist相关的字典参数(表示散 布 矩阵的对角线上的图形为数据集各特征的直方图。直方图是一 种可对值频率进行离散化显示的柱 状图,数据点被拆分到离散 的,间隔均匀的面元中,绘制的是各面元中数据点的数量),细化直方图,更加精细
s=60:扩大点的大小
alpha=.8:表示透明度,范围在(0,1]
cmap=mglearn.cm3:彩电三原色,光子束,荧光屏,红绿蓝
除此之外,scatter_matrix()中还有一些参数,如:
diagonal,必须且只能在{‘hist’, ‘kde’}中选择1个,’hist’表示直方图(Histogram plot),’kde’表示核密度估计(Kernel Density Estimation);该参数是scatter_matrix函数的关键参数 。本例中用到的是hist直方图,若为kde则如下图
range_padding。(float, 可选),图像在x轴、y轴原点附近的留白(padding),该值越大,留白距离越大,图像远离坐标原点
此处设置range_padding=1,可以看出当值越大时,点越密集
k近邻算法是一个相对容易理解的算法,构建此模型只需要保存训练集即可,要对一个新的数据点做出预测,算法会在训练集中寻找与这个新数据点距离最近,然后将找到的数据点的标签赋值给这个新的数据点。
k的含义是,我们可以考虑训练集中与新数据点最近的任意k个邻居(比如三或五个),而不是只考虑最近的那一个。之后我们可以用这些另据中数量最多的类别做出预测。此节中只考虑1个邻居
k近邻分类算法是在 neighbors 模块的 KNeighborsClassifier 类中实现的
当然在使用k近邻算法时也要导入它所需要的包
from sklearn.neighbors import KNeighborsClassifier
knn=KNeighborsClassifier(n_neighbors=1)
knn对象对算法进行了封装,既包括用训练集数据构建模型的算法,也包括对新数据点进行预测的算法,它还包括算法从训练集数据中提取的信息,对于KNeighborsClassifier来说,里面只保存了训练集
想要基于训练集来构建模型,需要调用knn对象的fit方法,两者都是Numpy数组,前者包含训练数据,后者包含相应的训练标签
knn.fit(X_train,y_train)
fit方法返回的是knn对象本身并做原处修改,因此我们得到了分类器的字符串表示
我们先将一朵花萼长5cm宽2.9cm,花瓣1cm宽0.2cm的鸢尾花预测一下,看看是属于什么品种
首先将数据存入到Numpy数组中,注意,scilit-learn的输入数据必须是二维数组
之后我们调用knn对象的predict方法来进行预测
import numpy as np
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
knn=KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train,y_train)
iris_dataset=load_iris()
X_new=np.array([[5,2.9,1,0.2]])
print("X_new.shape:{}".format(X_new.shape))
prediction=knn.predict(X_new)
print("Prediction:{}".format(prediction))
print("Predicted target name:{}".format(iris_dataset['target_names'][prediction]))
X_new.shape:(1, 4)
Prediction:[0]
Predicted target name:['setosa']
根据预测的结果来看,改鸢尾花属于类别0,也就是setaosa品种
这里需要用到之前创建的测试集,这些数据没有用于构建模型,但我们知道测试集中梅朵鸢尾花的实际品种,因此,我们可以对测试数据的每朵鸢尾花进行预测,并将预测结果与标签进行对比。我可以通过计算精度来衡量模型的优劣,精度就是品种预测正确的话所占的比例
np.mean()得到的是算术平均值,沿轴相等的数除以总数
import numpy as np
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
knn=KNeighborsClassifier(n_neighbors=1)
X_train,X_test,y_train,y_test=train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=0)
knn.fit(X_train,y_train)
iris_dataset=load_iris()
y_pred=knn.predict(X_test)
print("Test set prediction:n{}".format(y_pred))
print("Test set score:{:.2f}".format(np.mean(y_pred==y_test)))
Test set prediction:
[2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0 2 1 0 2 2 1 0
2]
Test set score:0.97
也可以方法用knn.score()来求精度,结果是相同的,使用这个方法可以减少部分代码量
import numpy as np
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=0)
knn=KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train,y_train)
iris_dataset=load_iris()
print("Test set score:{:.2f}".format(knn.score(X_test,y_test)))
Test set score:0.97
相关知识
Python机器学习基础教程
[Python机器学习]鸢尾花分类 机器学习应用
机器学习案例:鸢尾花分类——基于Scikit
Python机器学习基础教程——1.7第一个应用:鸢尾花分类——学习笔记
[机器学习基础][笔记] 一、鸢尾花分类
python机器学习
【机器学习】鸢尾花分类
【机器学习】鸢尾花分类:机器学习领域经典入门项目实战
第一个机器学习项目(鸢尾花分类问题)
机器学习(三):感知器算法实现鸢尾花分类项目实战
网址: Python机器学习基础教程 鸢尾花分类 https://m.huajiangbk.com/newsview463391.html
上一篇: 探究仙人掌的植物学分类(解析仙人 |
下一篇: 完整园艺通论试题及答案 |