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.
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 có tổng cộng 1000 phần tử, trong đó số phần tử bất thường chiếm 10%.
Thông tin về thuộc tính: Tập RayNau có tổng cộng 6 thuộc tính, thuộc tính 1 là mã số mẫu bệnh (id number), thuộc tính cuối là thuộc tính có 2 giá trị nhị phân (1: mẫu bệnh cần can thiệp thuốc, 0: mẫu không cần can thiệp thuốc), 4 thuộc tính
1,2,3,4,5,6,7,8 1,2,3,4,6,7,8 5 1,2,3,4,6,8 1,2,3,4,6 7 8 q=5 p=7.23 q=7 p=2.04 q=4 p=1.62 exNode (size=1) exNode (size=1) exNode (size=1) exNode (size=5)
còn lại từ 2 đến 5 có giá trị như mô tả trên bảng 5.3 biểu thị cho các chỉ sốđánh giá mức độ bệnh Rầy trên đồng ruộng.
Tất cả các thể hiện đều được lấy ngẫu nhiên theo giá trị bình thường, còn 10% thể hiện bất thường thì được lấy ngẫu nhiên trong vùng giá trị bất thường. Quan sát ở bảng 5.4 cho 8 thể hiện đầu trong tập RayNau.
Bảng 5.4: Mô tả các thuộc tính của tập RayNau
STT thuộc tính Tên thuộc tính và giá trị 1 2 3 4 5 6 Mã số mẫu bệnh: id number
Trung bình số lá bệnh trên cây: 0-8 Tổng số cây bị nhiễm bệnh: 1-120
Chiều cao trung bình của cây lúa: 30-80 cm Số lá trung bình của cây lúa: 3-8
Mẫu bệnh cần phun thuốc diệt rầy: 1, ngược lại là 0 Bảng 5.5: 8 thể hiện bất kỳ (ngẫu nhiên) trong tập RayNau
1 2 3 4 5 6 KSB0119 1.00 10.00 73.00 7.00 0 KSA1109 1.00 11.00 72.00 6.00 0 KSA1211 2.00 9.00 76.00 6.00 0 KSA1112 0.00 8.00 76.00 7.00 0 KSB1211 0.00 15.00 73.00 7.00 0 KSA1102 2.00 20.00 76.00 7.00 0 KSB1119 1.00 14.00 73.00 7.00 0