数据挖掘实验-BIOS
1.数据预处理
1.1读取、合并数据集
分别读取四个数据集:
合并:
总的数据集为:14543*19,最后一列数据为场景类别species
1.2数据清洗
缺失值检查:用isnull().sum()判断数据集是否存在缺失值,同时统计缺失值的个数。
统计发现,所有数据集都存在,无缺失值。
异常值处理:数据集中存在某些不可控的因素,存在一些异常的数据
在进行异常值处理之前,我希望观察到各个数据的散点图,这样可以让我们更加合理地判断什么是异常值。比如用箱线图判断和用正态分布判断是不一样的。但是这样会比较困难,因为数据较多。
这里采用核密度估计图 Kernel Density Estimation plot来看每个类别数据的概率分布。
为了统计fio各个参数中每个值出现的频率,从直方图’bar’引申到核密度估计图’kde’。
绘制fio各个类别的和核密度图(kde):
通过数据集的各个类别的分布情况:
linpack,mlc,tpc数据集也进行同样操作。从核密度图中可以看出,数据基本都几种的分布,故可以用3倍标准差、去除极端值的方法进行清洗。
将异常值定义为各特征数据与该特征的平均值偏差超过三倍标准差的数据,逐一对每个场景的原始数据进行异常值检测。
数据平均值:
数据标准差:
fio去除极端值:当前值-平均值 > 3倍标准差
的数据中,将其值赋值为nan,然后通过dropna方法去掉。
fio去除异常值后的数据:(同时保存为’fio_removed.csv’文件)
linpack,mlc,tpc数据集也进行同样的清洗操作。
1.3数据集成
清洗后再次合并数据集:发现一共删除了1546条数据
参数间关系:画出热力图
高度相关的类别可以去掉,从而减少数据集的维度,方便后面的计算。
由热力图发现TasksTotal和Tasksleeping,MemFree,MemUsed,SwapAvail是线性关系。
MemFree和TasksTotal,MemUsed,SwapAvail是线性关 Sysint与SysCsw互为线性关系。
对上面热力图分析后,剔除TasksRuning, TsaksSleeping, MemFree, MemUsed, SwapAvail,
SysCsw,降维,对剩余12个类别进行热力图相关性分析。剔除后的数据集如下:只剩13维。
重新画出剔除后的数据集的热力图如下:
1.4数据转换
用箱型图反应10个场景下各特征的数值分布:并保存‘Average1_boxplot.png’
图中可以发现:各个特征数量数量级相差很大。
样本各特征的量纲和数量级不均衡,在使用梯度下降算法时,不同的特征对模型参数的影响程度就会不一样。数据变换让不同的特征具有相同的尺度,这样在进行训练时各特征就能公平的调整模型参数。
将数据集进行标准差标准化法:得到标准化后的数据集。
1.5数据均衡处理
观察数据集中4种场景分别的数据集的数量:
发现场景‘tpc’数量最多,大概为其他场景的两倍,其他场景分别比较均匀。
故可以对场景‘tpc’
进行随机采样,只对它进行一半数量的采样即可。我们采用随机欠采样方法,即对数量较多的一类进行随机删除。
采样后数据集如下:发现各个场景数据集比较均衡了。
由于后面的训练集和测试集遵从8:2的划分,所以要先对数据集进行打乱,防止测试集或者训练集的场景不统一。打乱顺序如下:
1.6数据准备
标签编码:
方法一:采样one-hot编码:
方法二:直接编码
由于只有4个场景,所以我们采用直接编码的方式。
到此数据预处理已经完成,保存数据如下:
2.分类建模
2.1设计分类模型
我们采用DNN分类模型:采用pytorch中的DNN网络。
设计方案如下:
采用2层隐层的DNN模型,含有20个节点,激活函数选择relu函数。优化器选择梯度下降优化器,学习率选择为0.001,损失函数为交叉熵。迭代次数为30次(由于迭代次数增多,准确率越来越高),每次迭代抽取500组数据(batch=500)。采用torch中的cuda进行加速训练。
部分代码如下:具体在jupyter文件中
该方案的结果如下:
可以看出,随着epoch的增加,准确率在提高。
同时对于测试集,其预测结果如下:
对应的识别准确率、精确率、召回率、F1值:
对应的混淆矩阵如下:
由实验结果可以看出,其DNN分类模型对着4个场景的分类效果很好。
2.2不同DNN分类模型参数的比较
在上面设计方案中只改变激活函数,对应的准确率如下:
激活函数 | sigmoid | tanh | reLu |
---|---|---|---|
准确率 | 97.42% | 99.95% | 99.95% |
激活函数选择relu,只改变学习率:
学习率 | 0.1 | 0.01 | 0.001 |
---|---|---|---|
准确率 | 100% | 100% | 99.95% |
激活函数选择rule,学习率选择0.001,只改变batch:
Batch_size | 2000 | 500 | 100 |
---|---|---|---|
准确率 | 99.03% | 99.95% | 100.00% |
激活函数选择relu,学习率选择0.001,batch选择2000,只改变隐藏节点的数量:
Hidden_nodes | 50 | 20 | 5 | 2 |
---|---|---|---|---|
准确率 | 98.88% | 98.95% | 99.78% | 99.90% |
注:以上的结果均为epoch=30的情况下进行,如果epoch减小,则准确率会相应的减小。
最终实验结果: