phân tìm kiếm (Binary Search Tree -BST).
iTree là một cây nhị phân với mỗi nút có chính xác hai nút con hoặc không con. Giả sử rằng tất cả các thể hiện trong tập dữ liệu đều phân biệt nhau, mỗi thể hiện được cô lập đến nút ngoài, khi đó iTree là cây nhị phân hoàn chỉnh, trong trường hợp này số nút ngoài của cây là n; số nút trong là n-1; tổng số nút trên iTree là 2n-1; vì thế yêu cầu về bộ nhớ thì bị giới hạn theo n và chỉ tăng một cách tuyến tính theo n.
Trên thực tế, do tính chất “ít và khác” của các thể hiện bất thường nên chúng dễ bị cô lập gần nút gốc của cây, vì thế trong quá trình xây dựng cây, một trong những điều kiện dừng việc phát triển cây là khi cây đạt đến chiều cao giới hạn (tương đương với thời gian tìm kiếm trung bình trên BST là O(log n)) [30].
iTree có cấu trúc tương tự như cấu trúc của cây BST (quan sát bảng 3.4), ước lượng độ dài đường dẫn trung bình h(x) cho một nút ngoài giống như việc tìm kiếm không thành công trên BST.
Bảng 3.4: Một số tương quan về cấu trúc và hoạt động trên cây iTree và BST
iTree BST
Cây nhị phân đích thực Cây nhị phân đích thực
Nút kết thúc ngoài của iTree Tìm kiếm không thành công trên BST Không thểứng dụng được Tìm kiếm thành công
Mượn phân tích của BST vềước lượng độ dài đường dẫn trung bình của tìm kiếm không thành công trên BST để tính giá trị tại nút kết thúc ngoài có kích thước size.
Tính c(size) tại nút kết thúc ngoài (nút đã đạt đến chiều cao giới hạn logn), với size là số thể hiện trên nút này.
CHƯƠNG 4
CÀI ĐẶT MÔ HÌNH RỪNG CÔ LẬP 4.1. Xây dựng rừng cô lập
4.1.1. Cấu trúc cây cô lập 4.1.1.1. Nút tổng quát 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. Nhằm giảm thiểu việc sử dụng bộ nhớ, tăng tốc độ 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ể hiện bất thường phải ít hơn rất nhiều so với các thể hiện bình thường trong tập (giả định 1) và giá trị dữ
liệu của các thể hiện bất thường phải thực sự khác biệt đối với các thể hiện bình thường còn lại trong tập dữ liệu (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 thuộc 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 buộc) 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 rời (khác biệt lớn) về dữ
liệu giữa các thể hiện bình thường và bất thường trong tập. Số phần tử thuộc lớp bất 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 phần 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ố của mẫu bệnh: 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
Lớp: (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.