1. 程式人生 > >UCI資料集整理(附論文常用資料集)

UCI資料集整理(附論文常用資料集)

摘要:UCI資料集作為標準測試資料集經常出現在許多機器學習的論文中,為了更方便使用這些資料集有必要對其進行整理,這裡整理了論文中經常出現的資料集,並詳細介紹如何使用MATLAB將資料集檔案整理成自己需要的格式以及如何使用資料集檔案。要點如下

1. 前言

UCI資料集是一個常用的機器學習標準測試資料集,是加州大學歐文分校(University of CaliforniaIrvine)提出的用於機器學習的資料庫。機器學習演算法的測試大多采用的便是UCI資料集了,其重要之處在於“標準”二字,新編的機器學習程式可以採用UCI資料集進行測試,類似的機器學習演算法也可以一較高下。其官網地址如下:

website: UCI Machine Learning Repository

儘管從UCI資料集官網可以很容易找到許多想要的資料集,但要將其提供給自己的程式使用還需要了解資料的詳細資訊。UCI資料集中並非所有資料集都是以相同格式存於檔案中的,讀取和使用檔案方式不一,因此有必要對資料檔案稍作整理,特此總結。

2. UCI資料集介紹

2.1 簡要認識

要使用資料集中的資料首先需要分清標記和屬性值。如點選進入資料集官網:UCI資料集官網選取資料集Iris

該資料集詳情頁面如下,從表中資料顯示該資料集的資料量為150,屬性數為4

而再往下的Data Set information 中則介紹了該資料集的詳細資訊,下面的Attribute Information

(屬性資訊)是我們需要關注的,如下圖

其中1-4分別說明了四個屬性所代表的實際意義,而5則說明了該資料集分為三類:Iris Setosa、Iris VersicolourIris Virginica。認識到這些,再去看具體的Iris檔案中的資料便清楚明瞭了,點選標題Iris Data Set下方的Data Folder進入檔案位置頁面,選擇iris.data(該檔案為Iris資料集資料存放檔案)

進入到資料詳情頁面,如下圖。可以看到文字的排列:每行5個數以逗號分隔,共150行,每行的前4列(紅框內的數)分別對應4個屬性值,而最後一列(綠色框內)為每個資料所屬類別(或稱標記)。當前看到的都是“Iris-setosa

”一類的資料,往下翻則可看到”Iris-versicolour“和”Iris-virginica

  • 其他的資料集的情況與iris相似,而各個資料集屬性數或類別數各有差異。值得注意的是,有些資料集每行資料中間的分隔符並非都是“ ,”(逗號),還有可能是“ ”(空格);有些資料集的標記可能是用數字表示的,如1,2,… 其位置也可能出現在第1列(也可能檔案中未給出標記,需自行加上);還有的可能屬性值都是英文字元,分別如下所示的wine資料集heart-disease資料集adult資料集。要想以統一的程式使用這樣內部格式不一的資料集,就需要在程式使用前根據實際情況對資料集進行調整了。
    總之,各資料集可能各有差異,按照上面的步驟瞭解了各自的註釋資訊,找到屬性數、分類數、標記等重要資訊使用起來便順利得多。

2.2 下載資料

要儲存網站上的資料檔案,可以進入某個資料集的檔案位置頁面,如Iris檔案位置,選擇“iris.data”,右鍵,連結另存為,即可下載該資料集檔案。如下所示,當前儲存的檔案格式為“.data”檔案。

  • 如若想儲存文字檔案(.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()讀取資料data15 cell* 的元胞陣列,每個元素是1501 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檔案,不過裡面資料的格式稍有不同,讀者可以自行嘗試一下。整理前後的檔案對比情況如下圖所示。參照以上程式碼對於其他資料集的整理程式可在此之上根據實際需要稍作修改。

4. 如何使用資料集檔案

整理好了資料檔案,使用起來就比較簡單了,其實前面的程式碼中已經讀取過檔案中的資料了。經過整理現在檔案中的資料都是數字形式,在MATLAB中可以通過*load( )*函式直接讀取了,如下程式碼

iris_data=load('iris1.txt');
lable_iris=iris_data(:,1);
attributes_iris=iris_data(:,2:end);

iris_data包含了標記和屬性值的全部資料,lable_irisiris_data的第一列所有元素,即每個資料的標記,attributes_iris取自其後的所有列上的元素,即所有屬性值的陣列。具體的使用UCI資料集的機器學習演算法例項可參考本人前面一篇博文Kmeans聚類演算法詳解,後面也會繼續介紹。

  • 論文中經常出現的資料集本人已經按照以上方法整理完成,現將其一併分享給大家。整理好的資料集如下表所示,每個資料集檔案都儲存了*.mat、.data、.txt*三種檔案格式方便大家選擇下載,以下是下載連結

【下載連結】

另外在整理過程中搜集了許多其他的UCI資料集,檔案都是mat格式方便使用,下圖是壓縮包內的檔案詳情,有需要的可以下載,下載連結如下

5. 結束語

由於博主能力有限,博文中提及的方法與程式碼即使經過測試,也難免會有疏漏之處。希望您能熱心指出其中的錯誤,以便下次修改時能以一個更完美更嚴謹的樣子,呈現在大家面前。同時如果有更好的實現方法也請您不吝賜教。