![](https://i-blog.csdnimg.cn/blog_migrate/e0e0b856c70d9b567c64a6c8392039e3.gif)
摘要:UCI数据集作为标准测试数据集经常出现在许多机器学习的论文中,为了更方便使用这些数据集有必要对其进行整理,这里整理了论文中经常出现的数据集,并详细介绍如何使用MATLAB将数据集文件整理成自己需要的格式以及如何使用数据集文件。要点如下,博主另一篇博文UCI数据集详解及其数据处理(附148个数据集及处理代码)有更加详细的介绍。
![](https://i-blog.csdnimg.cn/blog_migrate/1719b5964ed673da0d50a170e9844c5a.png)
UCI数据集整理与MATLAB实现
代码介绍及演示视频链接:https://www.bilibili.com/video/BV1wS4y1Y7Sn/(正在更新中,欢迎关注博主B站视频)
1. 前言
UCI数据集是一个常用的机器学习标准测试数据集,是加州大学欧文分校(University of CaliforniaIrvine)提出的用于机器学习的数据库。机器学习算法的测试大多采用的便是UCI数据集了,其重要之处在于“标准”二字,新编的机器学习程序可以采用UCI数据集进行测试,类似的机器学习算法也可以一较高下。其官网地址如下:
website: UCI Machine Learning Repository
尽管从UCI数据集官网可以很容易找到许多想要的数据集,但要将其提供给自己的程序使用还需要了解数据的详细信息。UCI数据集中并非所有数据集都是以相同格式存于文件中的,读取和使用文件方式不一,因此有必要对数据文件稍作整理,特此总结。
2. UCI数据集介绍
2.1 简要认识
要使用数据集中的数据首先需要分清标记和属性值。如点击进入数据集官网:UCI数据集官网选取数据集Iris
![](https://i-blog.csdnimg.cn/blog_migrate/d55cf35898a563043f7534c645bce451.png)
该数据集详情页面如下,从表中数据显示该数据集的数据量为150,属性数为4
![](https://i-blog.csdnimg.cn/blog_migrate/872d9f7fa10e89971edd759291977187.png)
而再往下的Data Set information 中则介绍了该数据集的详细信息,下面的Attribute Information(属性信息)是我们需要关注的,如下图
![](https://i-blog.csdnimg.cn/blog_migrate/1f7e23f2b96c003e567565c8d3ca132c.png)
其中1-4分别说明了四个属性所代表的实际意义,而5则说明了该数据集分为三类:Iris Setosa、Iris Versicolour和Iris Virginica。认识到这些,再去看具体的Iris文件中的数据便清楚明了了,点击标题Iris Data Set下方的Data Folder进入文件位置页面,选择iris.data(该文件为Iris数据集数据存放文件)
![](https://i-blog.csdnimg.cn/blog_migrate/80bec0c41e25c4c6e3ffc3d30ef4b52c.png)
进入到数据详情页面,如下图。可以看到文本的排列:每行5个数以逗号分隔,共150行,每行的前4列(红框内的数)分别对应4个属性值,而最后一列(绿色框内)为每个数据所属类别(或称标记)。当前看到的都是“Iris-setosa”一类的数据,往下翻则可看到”Iris-versicolour“和”Iris-virginica”
![](https://i-blog.csdnimg.cn/blog_migrate/629d5a8c10633018850326c106717f95.png)
- 其他的数据集的情况与iris相似,而各个数据集属性数或类别数各有差异。值得注意的是,有些数据集每行数据中间的分隔符并非都是“ ,”(逗号),还有可能是“ ”(空格);有些数据集的标记可能是用数字表示的,如1,2,… 其位置也可能出现在第1列(也可能文件中未给出标记,需自行加上);还有的可能属性值都是英文字符,分别如下所示的wine数据集、heart-disease数据集、adult数据集。要想以统一的程序使用这样内部格式不一的数据集,就需要在程序使用前根据实际情况对数据集进行调整了。
总之,各数据集可能各有差异,按照上面的步骤了解了各自的注释信息,找到属性数、分类数、标记等重要信息使用起来便顺利得多。
![](https://i-blog.csdnimg.cn/blog_migrate/5178242123a685a0e1f47b6c468268c1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3e654a171443a999c400398ec7b982b5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3becc7bd41425b89d6f19a5513647c66.png)
2.2 下载数据
要保存网站上的数据文件,可以进入某个数据集的文件位置页面,如Iris文件位置,选择“iris.data”,右键,链接另存为,即可下载该数据集文件。如下所示,当前保存的文件格式为“.data”文件。
![](https://i-blog.csdnimg.cn/blog_migrate/cb7745be794f693604be6a4833b3621d.png)
- 如若想保存文本文件(.txt),可先自行新建一个文本文件,直接点击iris.data进入数据详情页面,直接全选所有数据将数据粘贴到自己新建的文本文件中。至于其他文件格式如.mat,.xls则可借助MATLAB先读取文件数据然后转存为其他格式,在后面章节也会介绍。
3. 用程序整理数据集
本节介绍如何使用MATLAB对数据集进行整理,下面以对Iris数据集的整理为例介绍。
首先从官网下载数据集,例如前面下载的iris.data或者自行复制的txt文件(自命名iris.txt),在文件所在文件夹新建一个.m文件。整理程序的功能是读取原文件数据将最后一列的英文标记按每类改为1-3的数字并将标记放在第一列,重新存储到新的txt文件,顺便另存为.mat以及.xls文件。
从前面可知,iris文件的最后列为英文字母,如果直接采用MATLAB的load( )函数将导致最后一列文本未知错误,所以这里采用textscan( )函数。textscan( )函数调用方式如下
textscan( ): 读取任意格式的文本文件。通过此函数,能够以一次读取一个块的方式读取文件,并且每个块可以具有不同的格式。
使用方法:首先打开文本文件以进行读取,fopen 返回文件标识符。
fileID = fopen('test80211.txt','r');
读取 4 个简介行,这些行是由换行符分隔的字符串。
Intro = textscan(fileID,'%s',4,'Delimiter','\n')
Intro = 1x1 cell array{4x1 cell} textscan 返回一个 1x1 元胞数组,其中包含由字符串组成的一个 4×1 元胞数组。
然后读取每个块的内容即可取出数据了,最后关闭文件。
fclose(fileID);
—— 引自 《MATLAB中文文档》
对Iris数据集进行整理的MATLAB程序如下。首先利用textscan()读取数据data为 1 * 5 cell 的元胞数组,每个元素是150*1 double 的数组,存储了一列上的所有数据。明显地,最后一个元素就是全部的标记数组,我们遍历这些标记并把带同一类标记的数据的索引记录下来。根据记录下的每类所有数据的索引便可取出每一类的数据并重新加上数字的标记。
- textscan()也可以读取txt的文件数据,所以第6行的代码中的文件名同样可以是txt文件,如第5行代码所示。
clear
clc
% 整理iris数据集
% f=fopen('iris.txt');
f=fopen('iris.data');% 打开文件
data=textscan(f,'%f,%f,%f,%f,%s'); % 读取数据
D=[];% D中存放属性值
for i=1:length(data)-1
D=[D data{1,i}];
end
fclose(f);
lable=data{1,length(data)};
n1=0;n2=0;n3=0;
% 找到每类数据的索引
for j=1:length(lable)
if strcmp(lable{j,1},'Iris-setosa')
n1=n1+1;
index_1(n1)=j;% 记录下属于“Iris-setosa”类的索引
elseif strcmp(lable{j,1},'Iris-versicolor')
n2=n2+1;
index_2(n2)=j;
elseif strcmp(lable{j,1},'Iris-virginica')
n3=n3+1;
index_3(n3)=j;
end
end
% 按照索引取出每类数据,重新组合
class_1=D(index_1,:);
class_2=D(index_2,:);
class_3=D(index_3,:);
Attributes=[class_1;class_2;class_3];
I=[1*ones(n1,1);2*ones(n2,1);3*ones(n3,1)];
Iris=[I Attributes];% 为各类添加数字标记
save Iris.mat Iris % 保存.mat文件
save Iris -ascii Iris; % 保存data文件
f=fopen('iris1.txt','w');
[m,n]=size(Iris);
for i=1:m
for j=1:n
if j==n
fprintf(f,'%g \n',Iris(i,j));
else
fprintf(f,'%g,',Iris(i,j));
end
end
end
fclose(f);
% save iris.txt -ascii Iris
% dlmwrite('iris.txt',Iris);
经过代码1-42行的操作,原来带有的英文标记的数据便由相应的数字标记代替了并放在了第一列的位置上。这里原来标记为Iris-setosa的数据重新标记为1,Iris-versicolor标记为2,Iris-virginica标记为3。
代码45行和46行分别将整理好的数据保存为.mat文件和.data文件;第49-61行是通过文件操作的方式利用循环逐行逐列将数据打印到txt文件中,每个数据中间由逗号分隔,每行5个数据打印完则回车至下一行。
当然也可以采用64行或65行的方式保存txt文件,不过里面数据的格式稍有不同,读者可以自行尝试一下。整理前后的文件对比情况如下图所示。参照以上代码对于其他数据集的整理程序可在此之上根据实际需要稍作修改。
![](https://i-blog.csdnimg.cn/blog_migrate/d712c5cd083d86f3d46f3f6dc61996cd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bca0e2a0bd85d8f7fa176ad50cb51afc.png)
4. 如何使用数据集文件
整理好了数据文件,使用起来就比较简单了,其实前面的代码中已经读取过文件中的数据了。经过整理现在文件中的数据都是数字形式,在MATLAB中可以通过load( )函数直接读取了,如下代码
iris_data=load('iris1.txt');
lable_iris=iris_data(:,1);
attributes_iris=iris_data(:,2:end);
iris_data包含了标记和属性值的全部数据,lable_iris是iris_data的第一列所有元素,即每个数据的标记,attributes_iris取自其后的所有列上的元素,即所有属性值的数组。具体的使用UCI数据集的机器学习算法实例可参考本人前面一篇博文Kmeans聚类算法详解,后面也会继续介绍。
![](https://i-blog.csdnimg.cn/blog_migrate/b403628e3f8964276dae3f2ecf67f62f.png)
5. 下载链接
论文中经常出现的数据集本人已经按照以上方法整理完成,现将其一并分享给大家。整理好的数据集如下表所示,每个数据集文件都保存了.mat、.data、.txt三种文件格式方便大家选择下载,另外在整理过程中搜集了许多其他的UCI数据集,文件都是mat格式方便使用,下图是压缩包内的文件详情,具体可见如下参考文章或参考视频。
![](https://i-blog.csdnimg.cn/blog_migrate/4f7af7547e750d3a8fcc19e907242c11.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c183d67aea9d3311306f17da03b1c5bb.png)
参考文章:https://zhuanlan.zhihu.com/p/568797582
参考视频:https://www.bilibili.com/video/BV1wS4y1Y7Sn/
本人微信公众号已创建,点击文末卡片关注“AI技术研究与分享”,后回复“UC20180830”即可获取全部资源文件详细信息。
由于博主能力有限,博文中提及的方法与代码即使经过测试,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。