Cấu trúc cây cô lập

Một phần của tài liệu PHÁT HIỆN DỮLIỆU BẤT THƯỜNG VỚI RỪNG CÔ LẬP (Trang 56)

4.1.1.1. Nút tổng quát

Một cây có thểđược định nghĩa là một tập các nút tạo thành. Trong một cây cô lập, có hai loại nút: nút trong và nút ngoài. Chúng ta có thể tổng quát hóa thành một loại nút chung như sau:

Một nút tổng quát được định nghĩa gồm một nút con bên trái và một nút con phải phải.

4.1.1.2. Nút trong

Nút trong là nút có hai con có thuộc tính cắt và giá trị cắt.

4.1.1.3. Nút ngoài

Nút ngoài là nút không có nút con nên giá trị con bên trái và con bên phải của nó được đặt là rỗng (null). Ngoài ra nút ngoài còn có thuộc tính chỉ ra số thể hiện còn lại tại nút ngoài trong quá trình xây dựng nút.

4.1.2. Cấu trúc rừng cô lập

Một rừng cô lập được tạo nên bởi một tập các cây cô lập cùng với các thuộc tính thể hiện đặc trưng của nó. Các thuộc tính bao gồm thông tin về các điểm dữ liệu dùng để xây dựng rừng như tập thể hiện, số thuộc tính (số chiều) của thể hiện, số thể hiện. Ngoài ra còn có 2 thuộc tính quan trọng như số lượng cây trong rừng,

public class Node {

Node leftChild; Node rightChild; public Node(){ leftChild = null; rightChild = null;} }

public class InNode extends Node{ int splitAtt;

double splitValue;}

public class ExtNode extends Node{

int exSize; public ExtNode() { leftChild=rightChild=null; exSize = 0; } }

kích thước mẫu trong mỗi cây trong rừng. 2 thuộc tính này ảnh hưởng rất lớn đến quá trình xây dựng cây.

4.2. Triển khai một số giải thuật trên rừng cô lập 4.2.1. Lấy mẫu ngẫu nhiên 4.2.1. Lấy mẫu ngẫu nhiên

Trong quá trình xây dựng cây cô lập, một trong các bước quan trọng là chọn ngẫu nhiên tập mẫu từ tập thể hiện ban đầu, sử dụng mẫu được chọn để xây dựng cây. Nhm gim thiu vic s dng b nh, tăng tc độ chương trình, các phần tử trong mẫu ngẫu nhiên sẽđược truy vấn bởi chỉ số trong mảng các thể hiện ban đầu. Như vậy, chỉ có một bản duy nhất thể hiện đầu vào và quá trình lấy mẫu sẽ trả về danh sách chỉ mục vị trí của các phần tử được chọn làm mẫu trong mảng dữ liệu ban đầu.

public class IForest {

double[][] inputData; // tập dữ liệu các phần tử

int numAtt; // số thuộc tính trong dữ liệu

int numInstance; // số lượng phần tử trong tập dữ liệu int numTree; // số lượng cây

int sampleSize; // kích cỡ mẫu trên mỗi cây Node[] iTree; // tập các cây trong rừng

}

public int[] getSample() {

int[] temp = new int[sampleSize]; //mảng chứa chỉ mục của phần tửđược chọn Random generator = new Random();

int j=0; int count =0; while (count<sampleSize) { j= generator.nextInt(numInstance); if (count==0) // phần tửđầu tiên { temp[count]=j; count++; } else {

if (Arrays.binarySearch(temp, 0, count, j)<0) //phần tử chưa được chọn { temp[count]=j; count++; Arrays.sort(temp,0,count); } }

4.2.2. Chọn giá trị cắt ngẫu nhiên

Trong quá trình xây dựng cây, sau khi chọn một thuộc tính cắt, việc chọn giá trị cắt của thuộc tính này là ngẫu nhiên trong đoạn giá trị từ giá trị lớn nhất đến nhỏ nhất của nó.

4.2.3. Xây dựng cây cô lập

Cây cô lập là một tập các nút trong và nút ngoài thõa mãn điều kiện của rừng cô lập. Xây dựng cây cô lập được tiến hành theo phương thức đệ qui trên từng nút. Để xây dựng một nút trên cây cô lập, chúng ta phải có các thông số sau:

- Danh sách các phần tử mẫu dạng chỉ mục (xIndex): Danh sách này chứa chỉ mục các phần tử được chọn, được dùng để tham chiếu đến mảng thể hiện đầu vào.

- Số phần tửđược chọn (noInstance)

- Chiều cao hiện tại của nút (currentHeight) - Chiều cao tối đa cho phép (heightLimit)

public double getSplitValue(int[] xIndex, int attIndex, int noInstance) { Random generator = new Random();

double max,min;

max=min= inputData[xIndex[0]][attIndex]; //Tìm giá trị lớn nhất và nhỏ nhất của thuộc tính cắt for (int i=1;i<noInstance;i++) {

if (inputData[xIndex[i]][attIndex]<min) min=inputData[xIndex[i]][attIndex]; if (inputData[xIndex[i]][attIndex]>max) max=inputData[xIndex[i]][attIndex]; } //Trả về giá trị ngẫu nhiên.

return (generator.nextDouble()*(max-min) + min); }

public Node createITree(int[] xIndex, int noInstance, int currentHeight, int heightLimit) {

if ((currentHeight>=heightLimit) || (noInstance<=1)) // Nút ngoài {

return (new ExtNode(noInstance)); }

Else //Nút trong {

InNode inNode = new InNode();

//Chọn ngẫu nhiên một thuộc tính chia tách Random generator = new Random();

inNode.splitAtt = generator.nextInt(numAtt); //Chọn ngẫu nhiên giá trị chia tách

4.2.4. Xác định độ dài đường dẫn của một thể hiện

Thông số được dùng tính toán điểm số để xác định mức độ bất thường của một thể hiện là độ dài đường đi của thể hiện, khi chúng ta cho thể hiện duyệt qua từ nút gốc đến nút lá theo điều kiện kiểm tra và giá trị kiểm tra tại các nút trong một cây cô lập. Việc xác định độ dài đường dẫn của một thể hiện là quá trình đệ qui từ nút gốc đến khi gặp nút ngoài.

public double getPathLength(double[] x, Node tree, double currentLength) { if (tree instanceof ExtNode) { //Nút ngoài

int xSize=((ExtNode)tree).exSize; double temp=currentLength;

if (xSize>1) temp= currentLength+2*(Math.log(xSize-1)+0.5772156649) -(2*(double)((xSize-1)/xSize)); return temp;

}

else { //Nút trong

int splitAtt=((InNode)tree).splitAtt;

double splitValue = ((InNode)tree).splitValue; if (x[splitAtt]<splitValue) { //Thuộc con bên trái

return getPathLength(x, tree.leftChild, currentLength+1); int[] rxIndex = new int[noInstance];

int[] lxIndex = new int[noInstance]; int rcount=0, lcount=0;

for (int i=0;i<noInstance;i++) { //Con bên trái

if (inputData[xIndex[i]][inNode.splitAtt]<inNode.splitValue) { lxIndex[lcount]=xIndex[i]; lcount++; } //Con bên phải else if (inputData[xIndex[i]][inNode.splitAtt]>=inNode.splitValue) { rxIndex[rcount]=xIndex[i]; rcount++; } } Arrays.sort(lxIndex, 0, lcount); Arrays.sort(rxIndex, 0, rcount); //Gọi đệ qui để tiến hành xây dựng nút cấp thấp hơn. inNode.leftChild=createITree(lxIndex,lcount,currentHeight+1, heightLimit); inNode.rightChild=createITree(rxIndex,rcount,currentHeight+1, heightLimit); return inNode; } }

Do rừng cô lập gồm nhiều cây, việc tính độ dài đường dẫn của một thể hiện sẽđược thực hiện trên các cả các cây và xác định giá trị trung bình.

4.2.5. Tính điểm số bất thường

Sau khi rừng cô lập được xây dựng, nó sẽ được sử dụng để tính điểm số bất thường của các thể hiện.

4.2.6. Sử dụng mô hình rừng cô lập để kiểm tra dữ liệu 4.2.6.1. Dữ liệu đầu vào 4.2.6.1. Dữ liệu đầu vào

Dữ liệu được sử dụng phổ biến trong khai mỏ dữ liệu thường được lưu trữ dưới định dạng CSV (Comma Separated Values). Trong định dạng này, mỗi một hàng là một thể hiện. Trong mỗi hàng, giá trị của các thuộc tính được phân cách bởi dấu phẩy.

Dữ liệu đầu vào được đưa vào mô hình bởi hàm sau đây:

public double getAveragePathLength(double[] x) { double length=0;

if ((numTree<=0) || (!isCreated)) //Cây chưa được tạo return -1;

for (int i=0;i<numTree;i++) //Duyệt qua tất cả các cây để xác định độ dài {

length=length+getPathLength(x,iTree[i],0); }

return (double)(length/numTree); }

public double getScore(double[] x) {

if ((numTree<=0) || (!isCreated)) // Cây chưa được tạo return -1;

// Độ cao trung bình trên cây iTree có n phần tử

double c_n=(double)2*(Math.log(numInstance-1)+0.5772156649) -(2*(double)((numInstance-1)/numInstance)); //Độ cao trung bình trên của thể hiện x

double temp = -(double)(getAveragePathLength(x)/c_n); return Math.pow(2.0, temp);

}

public boolean importDataFromFile(String fileName) { //Chứa dữ liệu tạm thời đọc từ tập tin csv

ArrayList<String> myArr = new ArrayList<String>();

try { BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "UTF-8"));

while (true) { //Đọc toàn bộ nội dung tập tin String line = in.readLine();

if ((line != null) && (!line.isEmpty())) { myArr.add(line);

4.2.6.2. Xây dựng rừng cô lập từ dữ liệu đầu vào

Khi dữ liệu đầu vào đã được nhập, việc xây dựng rừng cô lập sẽ được tiến hành dựa trên thông số về số cây trong rừng và số lượng thể hiện trên mỗi cây. Sau khi rừng được xây dựng, giá trị điểm số bất thường cũng được tính và hiển thị theo thứ tự từ cao đến thấp. } else { in.close(); break; } } } catch (Exception e) { e.printStackTrace(System.out); } if (myArr.size()==0) //Không có dữ liệu return false; else { //Có dữ liệu //Xác định số thể hiện numInstance=myArr.size(); //Chia tách các thuộc tính numAtt= myArr.get(0).split(",").length-1;

inputData = new double[numInstance][numAtt+1]; String[] strList;

for (int i=0;i<numInstance;i++) { //Lưu trữ từng thể hiện vào mảng strList = myArr.get(i).split(",");

for (int j=0;j<=numAtt;j++) {

inputData[i][j]=Double.valueOf(strList[j].trim()); } } return true; } }

private void jBuildButtonActionPerformed(java.awt.event.ActionEvent evt) { //Số lượng cây

int noTree = Integer.parseInt(jNoTreeTextField.getText().trim()); //Số lượng thể hiện trên mỗi cây

int sampleSize = Integer.parseInt(jSampleSizeTextField.getText().trim()); //Thiết lập thông số trên rừng

iForest.setNumTree(noTree); iForest.setSampleSize(sampleSize);

//Xây dựng rừng iForest.createIForest();

//Xác định điểm số bất thường cho mỗi cây int numInstance = iForest.getNumInstance(); int numAtt = iForest.getNumAtt();

currentData = iForest.getInputData();

//Lưu trữđiểm số bất thường cho mỗi thể hiện double[] score = new double[numInstance];

4.2.6.3. Kiểm thử dữ liệu

Sau khi rừng cô lập được xây dựng, việc xác định điểm số bất thường của tập được dùng xây dựng rừng đã được thực hiện và hiển thị. Tuy nhiên, trong một số trường hợp chúng ta muốn kiểm thử dữ liệu khác với dữ liệu được sử dụng xây dựng rừng. Điều này có thể thực hiện bằng hàm sau đây.

4.3. Giới thiệu giao diện của mô hình rừng cô lập:

- Mô hình cho phép người dùng nhận vào một tập dữ liệu có định dạng .csv [4.2.6.1]

score = new Score[numInstance]; for (int i=0;i<numInstance;i++) { score[i] = new Score(); score[i].index=i;

score[i].label = currentData[i][numAtt];

score[i].score= iForest.getScore(currentData[i]); }

//Sắp xếp lại điểm sốđể hiển thị theo thứ tự từ cao đến thấp Arrays.sort(score, new ScoreComp());

display(currentData,score,numInstance,numAtt, true); jTestButton.setEnabled(true);

jFilterButton.setEnabled(true); }

private void jTestButtonActionPerformed(java.awt.event.ActionEvent evt) { //Dữ liệu kiểm tra được đưa vào từ tập tin

String filename = openFile();

if (filename!=null) { //Đọc dữ liệu từ tập tin csv currentData =iForest.readDataFromFile(filename); if (currentData!=null) {//Có dữ liệu

//Xác định số lượng thể hiện int numInstance = currentData.length;

//Tính điểm số bất thường cho các thể hiện score = new Score[numInstance];

for (int i=0;i<numInstance;i++) { score[i] = new Score(); score[i].index=i;

score[i].label = currentData[i][iForest.getNumAtt()]; score[i].score= iForest.getScore(currentData[i]); }

//Sắp xếp theo thứ tự Arrays.sort(score, new ScoreComp());

display(currentData, score, numInstance, iForest.getNumAtt(), true); }

- Nhập vào số cây (No of Trees), kích thước mẫu (Sample size), kế đó chọn Build để xây dựng rừng cô lập. Công việc này được lập lại với số lần không giới hạn.

- Kết quả sau khi dựng rừng cô lập là điểm số bất thường của tất cả các thể hiện trên tập Test (nếu không chọn tập Test khác, thì mặc nhiên tập Test và tập Training là một). Điểm số mặc định được sắp xếp theo thứ tự giảm dần.

- Đểđánh giá hiệu quả của mô hình trên tập dữ liệu đưa vào, người dùng có thể đưa vào ngưỡng chọn bất thường, khi đó sẽ thu được các kết quả là các độ đo TPR và FPR. Công việc này được lập lại với số lần không giới hạn. Hình 4.1 minh hoạ giao diện mô hình rừng cô lập.

CHƯƠNG 5: NỘI DUNG VÀ KẾT QUẢ THỰC NGHIỆM 5.1. Chọn các tập dữ liệu thực nghiệm

iForest là một trong những kỹ thuật phát hiện bất thường dựa trên mô hình unsupervised [8], các kỹ thuật theo loại này đòi hỏi các tập dữ liệu được chọn cho thực nghiệm phải thoả mãn cả 2 giả định: s lượng các th hin bt thường phi ít hơn rt nhiu so vi các th hin bình thường trong tp (giả định 1) và giá tr d

liu ca các th hin bt thường phi thc s khác bit đối vi các th hin bình thường còn li trong tp d liu (giảđịnh 2). Hai giảđịnh này được các tác giả của kỹ thuật rừng cô lập nêu ra như 2 điều kiện tiên quyết khi áp dụng rừng cô lập.

Nếu một trong hai giảđịnh này không đúng thì các kỹ thuật dựa trên mô hình này sẽ có tỉ lệ sai rất cao. Ngoài ra, mô hình chỉ làm việc tốt trên thuộc tính kiểu liên tục (continuous), các kiểu dữ liệu khác (binary, nominal) sẽ không tương thích tốt với quá trình chia tách dữ liệu dựa theo điều kiện (có so sánh giá trị) (3.5.1.2).

Trong phần thực nghiệm, tôi đã nghiên cứu lựa chọn được 5 tập dữ liệu cho thực nghiệm, các tập dữ liệu được chọn vì tính ứng dụng cao của chúng trong đời sống như: dữ liệu về bệnh ung thư vú, bệnh tiểu đường, dịch bệnh rầy trên lúa và thư spam trong email. Ngoài ra, các tập được chọn do có sự đa dạng theo các đặc điểm như: S lượng thuc tính (tập có số thuộc tính ít nhất là 6, và tập có số thuộc tính nhiều nhất đến 57 thuộc tính). S liên quan (ràng buc) nhiều hay ít giữa các thuộc tính với nhau trong cùng một tập dữ liệu. S tách ri (khác bit ln) v d

liu giữa các thể hiện bình thường và bất thường trong tập. S phn t thuc lp bt thường (tập có tỷ lệ bất thường thấp nhất là 10%, cao nhất đến 46%). S lượng phn t ( tập có số phần tử ít nhất là 699 phần tử, tập có số phần tử lớn nhất lên đến 4601 phần tử). Quan sát ban đầu các tập được chọn trình bày ở bảng 5.1.

Bảng 5.1. Các tập dữ liệu chọn thực nghiệm

Tên tập dữ liệu Số thể hiện Số thuộc tính Lớp bất thường Ý nghĩa tập

Breastw 699 11 34.5% Ung thư vú

Spambase 4601 57 39.4% Spam trên Web

Pima 768 9 35% Bệnh tiểu đường

Mammographic 961 6 46.3% Nhũảnh

1) Mô tả tập dữ liệu Breastw (Breast Cancer Wisconsin): Thông tin về tập dữ liệu:

Đây là tập dữ liệu chứa các mẫu bệnh ung thư vú (Breast cancer) [5], các mẫu dữ liệu có được qua những báo cáo định kỳ của Tiến sĩ, bác sĩ Wolberg, trường đại học y Wisconsin, Madison, Wisconsin, USA; Những mẫu bệnh này được thu thập trong quá trình khám chữa bệnh cho các bệnh nhân. Tổng cộng có 699 thể hiện, trong đó lớp bất thường chiếm 34.5%.

Thông tin về thuộc tính (bảng 5.2): gồm 11 thuộc tính, thuộc tính 1 là mã số mẫu bệnh (id number), thuộc tính 11 có 2 giá trị biểu thị cho 2 lớp (lớp 2: mẫu bệnh lành tính, lớp 4 cho mẫu bệnh ác tính), 2 thuộc tính này sẽ bị loại bỏ trước khi đưa tập dữ liệu vào thực nghiệm vì chúng không liên quan đến ý nghĩa phát hiện bất thường. 9 thuộc tính còn lại từ thuộc tính thứ 2 đến 10 là các số nguyên trong khoảng từ 1 đến 10 biểu thị các chỉ số chuyên môn cho việc chuẩn đoán bệnh.

Bảng 5.2: Mô tả các thuộc tính trong tập Breastw

STT thuộc

tính Tên thuộc tính và giá trị

1 2 3 4 5 6 7 8 9 10 11 Mã s ca mu bnh: id number Mức độ dày đặc của các khối u: 1 - 10 Tính đồng dạng của kích thước tế bào: 1 - 10 Tính đồng dạng của hình dáng của tế bào: 1 - 10 Sự dính chặt vào mép tế bào: 1 - 10

Kích thước của các biểu mô đơn lẻ: 1 - 10 Độ xơ hóa của nhân tế bào: 1 - 10

Chất nhiễm sắc thể: 1 - 10 Hạch nhân bình thường: 1 - 10 Sự phân bào có tơ: 1 - 10

Lp: (2 cho lành tính, 4 cho ác tính)

8 mẫu bệnh ngẫu nhiên trong tập Breastw được trình bày ở bảng 5.

Bảng 5.3: 8 thể hiện bất kỳ (ngẫu nhiên) trong tập Breastw

STT phần tử 1 2 3 4 5 6 7 8 9 10 11 1 1018099 4 1 1 3 2 1 3 1 1 2 2 1018561 4 2 1 1 2 1 2 1 1 2 3 1033078 1 1 1 1 1 1 3 1 1 2 4 1000025 2 1 1 1 2 1 2 1 1 2 5 1015425 8 7 5 10 7 9 5 5 4 4 6 1016277 5 1 1 1 2 1 2 1 1 2 7 1017023 10 7 7 3 8 5 7 4 3 4 8 1017122 3 1 2 1 2 1 2 1 1 2

Mô tả sự cô lập nhanh các phần tử bất thường:

Giả sử bảng 5.3 biểu thị cho mẫu sub-sample có kích thước là 8, khi đó chiều cao giới hạn của cây L=log8=3. Hình 5.1 biểu diễn 1 cây ngẫu nhiên được xây dựng từ tập mẫu trên bảng 5.3. 2 phần tử bất thường 5,7 được cô lập gần nút gốc của cây hơn so với các phần tử khác. Quan sát bảng 5.3 cho thấy giá trị của các thuộc tính của 2 mẫu bất thường này khác biệt hơn nhiều (lớn hơn) so với các mẫu còn lại, ví dụ nhưở thuộc tính thứ 2 cho thấy mức độ dày đặc của các khối u ở 2 mẫu 5,7 khá lớn (gần đạt giá trị tối đa là 10), trong khi những mẫu bệnh lành tính (lớp 0) thì giá trị của thuộc tính này tương đối nhỏ (dưới giá trị 5). Tương tự mô tả cho các thuộc tính còn lại.

2) Mô tả tập dữ liệu RayNau Thông tin về tập dữ liệu:

Đây là tập dữ liệu chứa các mẫu bệnh Rầy nâu trên lúa, đây là bệnh phổ biến trên lúa và gây nhiều thiệt hại nghiêm trọng trong sản xuất nông nghiệp. RayNau là tập dữ liệu nhân tạo với các giá trị dữ liệu được tạo theo cách thức tạo số ngẫu nhiên trong đoạn [a,b] theo công thức rand()*(b-a)+a; với rand() tạo số ngẫu nhiên trong đoạn [0,1]. Giả định số liệu trên mỗi mẫu thu được do kỹ thuật viên ghi nhận khi quan sát trên một 1m2 của một cánh đồng cụ thểđang trong giai đọan trổ đồng. Tập

Một phần của tài liệu PHÁT HIỆN DỮLIỆU BẤT THƯỜNG VỚI RỪNG CÔ LẬP (Trang 56)

Tải bản đầy đủ (PDF)

(119 trang)