sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) Species 137 6.4 3.1 5.5 1.8 virginica 84 5.4 3.0 4.5 1.5 versicolor 27 5.2 3.5 1.5 0.2 setosa 127 6.1 3.0 4.9 1.8 virginica 132 6.4 2.8 5.6 2.2 virginica .. ... ... ... ... ... 9 4.9 3.1 1.5 0.1 setosa 103 6.3 2.9 5.6 1.8 virginica 67 5.8 2.7 4.1 1.0 versicolor 117 7.7 3.8 6.7 2.2 virginica 47 4.6 3.2 1.4 0.2 setosa [120 rows x 5 columns]
在学习深度学习的时候,前期最重要的就是对数据集的处理,先抛开数据增强等过程,单单数据集的加载也是很重要的,只有正确处理好数据集才能送入网络进行训练。前面我有写过关于VOC数据集的处理方式
但数据集往往有多种多样的,还有类似COCO等格式,而且在不同的学科领域有不同的数据集。这篇文章我将用pandas来处理鸢尾花数据集【我的同学有研究通信领域的,还有光学领域的,在他们那里我也见到了类似的数据集格式,所以也是可以按这种方式处理的】
用到的工具:
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler import pandas as pd import matplotlib.pyplot as plt import numpy as np import seaborn as sns
在sklearn中我们可以直接加载鸢尾花数据集,方式为:
from sklearn.datasets import load_iris data = load_iris()
数据集是用字典的形式存储的,我们可以打印一下数据集看看有什么东西,看看这数据集包含了什么东西。可以看到data字典中包含以下字典。
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'])
其中字典中data是图像数据;target对应的标签[用数字表示的,有3个类],
data.target_names # 类的名字 ['setosa' 'versicolor' 'virginica'] data.feature_names # 特征名字 ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] data.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]......
上面就是我们读到的数据集,但这样的数据还是很乱,我们需要进一步处理,我们可以用pandas工具,将数据集整理成表格的形式,就像mysql数据库中的表一样。
# 通过DataFrame()对数据进行结构化 df = pd.DataFrame(data.data)
In [7]: df Out[7]: 0 1 2 3 0 5.1 3.5 1.4 0.2 1 4.9 3.0 1.4 0.2 2 4.7 3.2 1.3 0.2 3 4.6 3.1 1.5 0.2 4 5.0 3.6 1.4 0.2 .. ... ... ... ... 145 6.7 3.0 5.2 2.3 146 6.3 2.5 5.0 1.9 147 6.5 3.0 5.2 2.0 148 6.2 3.4 5.4 2.3 149 5.9 3.0 5.1 1.8 [150 rows x 4 columns]
这样我们可以清楚的看到,数据集共有150行,每行4种特征【这四个特征就是鸢尾花的特征值,即data.feature_names】
然后我们在进一步处理, 将列上面的0,1,2,3替换成data.feature_names的文字信息,现在的数据集将会长这样:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) 0 5.1 3.5 1.4 0.2 1 4.9 3.0 1.4 0.2 2 4.7 3.2 1.3 0.2 3 4.6 3.1 1.5 0.2 4 5.0 3.6 1.4 0.2 .. ... ... ... ... 145 6.7 3.0 5.2 2.3 146 6.3 2.5 5.0 1.9 147 6.5 3.0 5.2 2.0 148 6.2 3.4 5.4 2.3 149 5.9 3.0 5.1 1.8 [150 rows x 4 columns]
是不是这样以来更每一列是代表什么特征更清楚了呢。
在鸢尾花中,有3类,data.target_names中为:['setosa', 'versicolor', 'virginica'],对应于data.target为[0,1,2],那么我们将这两者一一对应。现在的数据集就会长这样:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) Species 0 5.1 3.5 1.4 0.2 setosa 1 4.9 3.0 1.4 0.2 setosa 2 4.7 3.2 1.3 0.2 setosa 3 4.6 3.1 1.5 0.2 setosa 4 5.0 3.6 1.4 0.2 setosa .. ... ... ... ... ... 145 6.7 3.0 5.2 2.3 virginica 146 6.3 2.5 5.0 1.9 virginica 147 6.5 3.0 5.2 2.0 virginica 148 6.2 3.4 5.4 2.3 virginica 149 5.9 3.0 5.1 1.8 virginica [150 rows x 5 columns]
然后我们还可以对数据集进行一个可视化,看看各类数据集分布是否平衡。可以看到三个类各有50张,共150张,数据分布均匀。
# 对各类数据分布进行可视化,看看分布的是否均匀 df_count = df['Species'].value_counts().reset_index() sns.barplot(data=df_count, x='index', y='Species') plt.show()
然后我们就可以针对上面处理的数据集划分成训练集和验证集了,这里我们要用到的工具是,
from sklearn.model_selection import train_test_split
将数据集df进行划分,训练集80%,验证集20%【并且是随机打乱的】
df_train, df_val = train_test_split(df, train_size=0.8, random_state=0)
可以得到训练集,共有120个样本【注意,这里写的是5列,但你数的时候会是6列,最前面的序号那列不要算进去!所以是5列】
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) Species 137 6.4 3.1 5.5 1.8 virginica 84 5.4 3.0 4.5 1.5 versicolor 27 5.2 3.5 1.5 0.2 setosa 127 6.1 3.0 4.9 1.8 virginica 132 6.4 2.8 5.6 2.2 virginica .. ... ... ... ... ... 9 4.9 3.1 1.5 0.1 setosa 103 6.3 2.9 5.6 1.8 virginica 67 5.8 2.7 4.1 1.0 versicolor 117 7.7 3.8 6.7 2.2 virginica 47 4.6 3.2 1.4 0.2 setosa [120 rows x 5 columns]
得到验证集,
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) Species 114 5.8 2.8 5.1 2.4 virginica 62 6.0 2.2 4.0 1.0 versicolor 33 5.5 4.2 1.4 0.2 setosa 107 7.3 2.9 6.3 1.8 virginica 7 5.0 3.4 1.5 0.2 setosa 100 6.3 3.3 6.0 2.5 virginica 40 5.0 3.5 1.3 0.3 setosa 86 6.7 3.1 4.7 1.5 versicolor 76 6.8 2.8 4.8 1.4 versicolor 71 6.1 2.8 4.0 1.3 versicolor 134 6.1 2.6 5.6 1.4 virginica 51 6.4 3.2 4.5 1.5 versicolor 73 6.1 2.8 4.7 1.2 versicolor 54 6.5 2.8 4.6 1.5 versicolor 63 6.1 2.9 4.7 1.4 versicolor 37 4.9 3.6 1.4 0.1 setosa 78 6.0 2.9 4.5 1.5 versicolor 90 5.5 2.6 4.4 1.2 versicolor 45 4.8 3.0 1.4 0.3 setosa 16 5.4 3.9 1.3 0.4 setosa 121 5.6 2.8 4.9 2.0 virginica 66 5.6 3.0 4.5 1.5 versicolor 24 4.8 3.4 1.9 0.2 setosa 8 4.4 2.9 1.4 0.2 setosa 126 6.2 2.8 4.8 1.8 virginica 22 4.6 3.6 1.0 0.2 setosa 44 5.1 3.8 1.9 0.4 setosa 97 6.2 2.9 4.3 1.3 versicolor 93 5.0 2.3 3.3 1.0 versicolor 26 5.0 3.4 1.6 0.4 setosa
因为我们要送入网络训练的时候,需要提取的是特征,在该类型数据集已经把特征以数值的方式列出来了,所以我们需要把这四类特征提取出来(不含类,即只显示前4列)
X_train = df_train.drop(['Species'], axis=1) X_val = df_val.drop(['Species'], axis=1) X_train0 = X_train.copy() X_train0 = X_train0.reset_index().drop(['index'], axis=1)
现在得到的特征就会长这样:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) 137 6.4 3.1 5.5 1.8 84 5.4 3.0 4.5 1.5 27 5.2 3.5 1.5 0.2 127 6.1 3.0 4.9 1.8 132 6.4 2.8 5.6 2.2 .. ... ... ... ... 9 4.9 3.1 1.5 0.1 103 6.3 2.9 5.6 1.8 67 5.8 2.7 4.1 1.0 117 7.7 3.8 6.7 2.2 47 4.6 3.2 1.4 0.2 [120 rows x 4 columns]
我们可以看一下sepal length这个特征值的分布可视化:
1. # 特征分布的可视化 2. plt.plot(X_train0["sepal length (cm)"],".", label="sepal length (cm)") 3. plt.legend() 4. plt.show()
上面我们已经提取完特征了,在监督学习中,我们还需要标签,这里的标签就我们数据中的类,即Species这个值
1. # 提取类别 2. Y_train = df_train['Species'] 3. Y_val = df_val['Species']
得到标签长这样:
137 virginica 84 versicolor 27 setosa 127 virginica 132 virginica ... 9 setosa 103 virginica 67 versicolor 117 virginica 47 setosa Name: Species, Length: 120, dtype: object