Các phương pháp thay thế cho các thuộc tính lựa chọn

Một phần của tài liệu Tiểu luận môn CÔNG NGHỆ TRI THỨC VÀ ỨNG DỤNG ỨNG DỤNG MỘT SỐ THUẬT TOÁN TRONG MÔ HÌNH PHÂN LỚP CÂY QUYẾT ĐỊNH - CÀI ĐẶT CHƯƠNG TRÌNH DEMO THUẬT TOÁN ID3 (Trang 58)

VI. Các vấn đề học trong cây quyết định

4.5.Các phương pháp thay thế cho các thuộc tính lựa chọn

Có một khuynh hướng tự nhiên trong Information gain đó là những thuộc tính được chọn với nhiều giá trị trên những thuộc tính khác với một vài giá trị. Ví dụ, xét thuộc tính Date nó có nhiều những giá trị có thể xảy ra (ví dụ ngày 4 tháng 3 năm 1979). Nếu ta thêm thuộc tính này vào bảng ví dụ về quyết định có Play Tennis hay không, ta thấy rằng thuộc tính này có khả năng phân loại mạnh nhất.

Điều này xảy ra bởi vì thuộc tính Date hoàn toàn độc lập tiên đoán hàm mục tiêu trên dữ liệu đào tạo. Vậy thuộc tính này có bị sai hay không? Thật ra, thuộc tính này đặt ra cho tập dữ liệu có nhiều giá trị mà có thể phân chia tập dữ liệu đào tạo thành những tập rất nhỏ. Do đó, nó sẽ có thu thập thông tin rất cao trên tập dữ liệu đào tạo, mặc dù là một công cụ tiên đoán không tốt của hàm mục tiêu trên những trường hợp khác. Một cách để tránh điều này là chọn lựa những thuộc tính dựa trên một số đánh giá khác hơn là chỉ sử dụng thuộc tính Information gain. Một độ đo sử dụng thành công hơn là Gain Ratio. Phương pháp sử dụng độ đo này cản trở những thuộc tính tương tự Date bằng việc kết hợp một biểu thức gọi là Split Information

Trong đó S1 đến Sc là tập con của c kết quả của những trường hợp từ sự phân hoạch S bằng thuộc tính được đánh giá với c là A. Để ý rằng SplitInformation thực sự chính là entropy của S với với sự liên quan trên những giá trị của thuộc tính A. Điều này ngược với việc sử dụng của Entropy trước đây trong đó chúng ta xem xét chỉ entropy của S với sự liên quan đến giá trị mục tiêu mà những giá trị của nó được tiên đoán bởi cây quyết định.

Đánh giá Gain Ratio được định nghĩa trong biểu thức của đánh giá Gain trước đây cũng như đối với SplitInformation như sau:

4.6. Xử lý huấn luyện đối với những thuộc tính thiếu giá trị

Trong một số trường hợp nhất định dữ liệu có thể thiếu những giá trị đối với một số thuộc tính. Ví dụ, trong y khoa chúng ta mong muốn tiên đoán kết quả bệnh nhân dựa trên nhiều những kiểm tra trong phòng thí nghiệm, nó có thể là kiểm tra thử máu trên một tập những bệnh nhân cho phép. Trong trường hợp như vậy chúng ta thông thường phải ước đoán những giá trị thiếu dựa trên những trường hợp mà thuộc tính này có một giá trị đã biết.

Xét một trường hợp mà trong đó Gain(S,A) được tính toán tại nút n trong cây quyết định để xác định khi nào thuộc tính A là thuộc tính tốt nhất để kiểm tra nút quyết định này. Giả sử rằng (x,c(x)) là một trong những tập dữ liệu đào tạo trong S và giá trị A(x) là không được biết đến. Một trong những chiến thuật liên quan đến thao tác thiếu giá trị thuộc tính là gán cho nó giá trị chiếm hầu hết trong tập dữ liệu huấn luyện tại nút n. Một thủ tục thứ hai phức tạp hơn là gán một kết quả có thể xảy ra cho mỗi một giá trị của A hơn là đơn giản gán một giá trị chung cho A(x). Khả năng có thể nhận được bằng cách quan sát tần số của những giá trị khác nhau cho A trong số những ví dụ tại nút n.

Ví dụ: Giả sử thuộc tính A là một ứng cử cho thuộc tính kiểm tra ở nút n. Ta sẽ phải xử lý như thế nào với ví dụ x không có (thiếu) giá trị đối với thuộc tính A (tức là: xA là không xác định)?

• Gọi Sn là tập các ví dụ học gắn với nút n có giá trị đối với thuộc tính A

Giải pháp 1: xA là giá trị phổ biến nhất đối với thuộc tính A trong số các ví dụ thuộc tập Sn

Giải pháp 2: xA là giá trị phổ biến nhất đối với thuộc tính A trong số các ví dụ thuộc tập Sn có cùng phân lớp với x

Giải pháp 3: Tính xác suất pv đối với mỗi giá trị có thể v của thuộc tính A

o Gán phần (fraction) pv của ví dụ x đối với nhánh tương ứng của nút n

o Những ví dụ một phần (fractional instances) này được sử dụng để tính giá trị

4.7. Xử lý các thuộc tính có chi phí khác nhau

Trong một số những công đoạn của việc học những thuộc tính của thực thể có sự liên hệ đến giá. Giả sử một bác sĩ cần phân loại hoặc chuẩn đoán một căn bệnh, vấn đề đặt ra là bác sĩ phải cho bệnh nhân của mình thực hiện những kiểm tra hoặc xét nghiệm nào mà chi phí là nhỏ nhất. Những kiểm tra hoặc xét nghiệm này chính là những thuộc tính cần phải xét đến trong cây quyết định.

Khi đó, cần sử dụng những cách đánh giá khác InformationGain nhằm xác định các thuộc tính kiểm tra

Trong những trường hợp như vậy, ta sẽ ưu tiên những cây quyết định sử dụng những thuộc tính chi phí thấp, dựa trên những thuộc tính có giá cao chỉ khi cần tạo ra những sự phân loại đáng tin cậy. ID3 có thể sửa đổi để chuyển thành thuộc tính tính toán phải trả bằng việc đưa ra một biểu thức giá trị sang định lượng lựa chọn thuộc tính.

V. Chương trình thực nghiệm thuật toán ID35.1. Cài đặt chương trình 5.1. Cài đặt chương trình

Chương trình được cài đặt môi trường .NET bằng ngôn ngữ C#, dựa trên cơ sở lý thuyết được trình bày mục 3.2

Một số hàm chính:

Hàm tính Entropy:

• Công thức:

Entropy (S) = - p+ log2 p+ - p- log2 p-

• Code:

privatedouble GetEntropy(int Positives , int Negatives) { if (Positives == 0) return 0; if (Negatives == 0) return 0; double Entropy;

int total = Negatives + Positives;

double RatePositves = (double)Positives / total; double RateNegatives = (double)Negatives / total;

Entropy = -RatePositves * Math.Log(RatePositves, 2) - RateNegatives *

Math.Log(RateNegatives, 2); return Entropy;

} (adsbygoogle = window.adsbygoogle || []).push({});

Hàm tính Gain:

• Công thức:

Gain(S, A) = Entropy(S) - Entropy (Sv)

• Code:

privatedouble Gain(List<List<string>> Examples, Attribute A, string bestat) {

double result;

int CountPositives = 0;

int[] CountPositivesA = newint[A.Value.Count]; int[] CountNegativeA = newint[A.Value.Count]; int Col = Attributes.IndexOf(A);

for (int i = 0; i < A.Value.Count; i++) {

CountPositivesA[i] = 0; CountNegativeA[i] = 0; }

for (int i = 0; i < Examples.Count; i++) { int j = A.Value.IndexOf(Examples[i][Col].ToString()); if (Examples[i][Examples[0].Count - 1]=="co") { CountPositives++; CountPositivesA[j]++; } else { CountNegativeA[j]++; } }

result = GetEntropy(CountPositives, Examples.Count - CountPositives); for (int i = 0; i < A.Value.Count; i++)

{

double RateValue = (double)(CountPositivesA[i] + CountNegativeA[i]) / Examples.Count;

result = result - RateValue * GetEntropy(CountPositivesA[i], CountNegativeA[i]); }

Solution = Solution + "\n * Gain(" + bestat + "," + A.Name + ") = " + result.ToString();

return result; }

Hàm chọn đặc tính tốt nhất:

• Phương pháp:

Dựa vào giá trị gain của các đặc tính, đặc tính nào có Gain lớn nhất.

 Chọn đặc tính đó – đặc tính tốt nhất.

• Code:

privateAttribute GetBestAttribute(List<List<string>> Examples, List<Attribute> Attributes, string bestat)

{

double MaxGain = Gain(Examples, Attributes[0], bestat); int Max = 0;

for (int i = 1; i < Attributes.Count; i++) {

double GainCurrent = Gain(Examples, Attributes[i], bestat); if (MaxGain < GainCurrent) { MaxGain = GainCurrent; Max = i; } } return Attributes[Max]; }

Hàm thực hiện giải thuật ID3:

• Giải thuật:

Tạo nút Root của cây quyết định (adsbygoogle = window.adsbygoogle || []).push({});

If tất cả các ví dụ của Training_Set thuộc cùng lớp c

Return Cây quyết định có nút Root được gắn với (có nhãn) lớp c

If Tập thuộc tính Attributes là rỗng

Return Cây quyết định có nút Root được gắn với nhãn lớp ≡ Majority_Class_Label(Training Set)

A ← Thuộc tính trong tập Attributes có khả năng phân loại “tốt nhất” đối với Training_Set

Thuộc tính kiểm tra cho nút Root ← A

For each Giá trị có thể v của thuộc tính A

Bổ sung một nhánh cây mới dưới nút Root, tương ứng với trường hợp: “Giá trị của A là v”

Xác định Training_Setv = {ví dụ x | x ⊆ Training_Set, xA=v}

If (Training_Setv là rỗng) Then

Tạo một nút lá với nhãn lớp ≡ Majority_Class_Label(Training_Set) Gắn nút lá này vào nhánh cây mới vừa tạo

Else Gắn vào nhánh cây mới vừa tạo một cây con sinh ra bởi ID3_algorithm(Training_Setv, Class_Labels, {Attributes \ A})

Return Root

• Code:

privateTreeNode ID3(List<List<string>> Examples, List<Attribute> Attribute,string bestat) {

Solution = Solution + "--- Xét " + bestat + " ---";

if (CheckAllPositive(Examples)) {

returnnewTreeNode(newAttribute("Có")); }

if (CheckAllNegative(Examples)) {

Solution += "\n Tất cả các mẫu đều phủ định => Trả về nút gốc với nhãn Không"; returnnewTreeNode(newAttribute("Không"));

}

if (Attribute.Count == 0) {

Solution += "\n Các thuộc tính rỗng => Trả về nút gốc có giá trị phổ biến nhất ";

returnnewTreeNode(newAttribute(GetMostCommonValue(Examples)));

}

Attribute BestAttribute = GetBestAttribute(Examples, Attribute, bestat); int LocationBA = Attributes.IndexOf(BestAttribute);

TreeNode Root = newTreeNode(BestAttribute); for (int i = 0; i < BestAttribute.Value.Count; i++) {

List<List<string>> Examplesvi = newList<List<string>>(); for (int j = 0; j < Examples.Count; j++)

{ if (Examples[j][LocationBA].ToString() == BestAttribute.Value[i].ToString()) Examplesvi.Add(Examples[j]); } if (Examplesvi.Count==0) {

Solution +="\nCác thuộc tính rỗng => Trả về nút gốc có giá trị phổ biến nhất"; (adsbygoogle = window.adsbygoogle || []).push({});

returnnewTreeNode(newAttribute(GetMostCommonValue(Examplesvi)));

} else { Solution += "\n"; Attribute.Remove(BestAttribute); Root.AddNode(ID3(Examplesvi, Attribute,BestAttribute.Value[i])); } } return Root; }

5.2. Giao diện chương trình

Các bước chạy chương trình:

- Đầu tiên, nạp dữ liệu vào chương trình bằng nút Load dữ liệu”. Dữ liệu được đưa lên bảng.

- Sau đó, nhấn nút Run”chạy giải thuật. Các bước giải sẽ được hiện ra.

Cây sẽ được vẽ ra. Giao diện chương trình:

Bảng dữ liệu:

Kết quả thuật giải:

VI. Tổng kết

Công nghệ phân lớp dữ liệu đã, đang và sẽ phát triển mạnh mẽ trước những khao khát tri thức của con người. Trong những năm qua, phân lớp dữ liệu đã thu hút sự quan tâm của các nhà nghiên cứu trong nhiều lĩnh vực khác nhau như máy học (machine

learning), hệ chuyên gia (expert system), thống kê (statistics)... Công nghệ này cũng ứng

dụng trong nhiều lĩnh vực thực tế như: thương mại, nhà băng, maketing, nghiên cứu thị trường, bảo hiểm, y tế, giáo dục...

Trong khuôn khổ tìm hiểu và nghiên cứu của đề tài này, bài thu hoạch này tiến hành nghiên cứu về công nghệ phân lớp dữ liệu dựa trên cây quyết định đồng thời còn phân tích, đánh giá các thuật toán phân lớp dữ liệu ID3, C4.5… dựa trên cây quyết định. Từ đó giúp chúng ta có cái nhìn tổng quan hơn về ưu nhược điểm cũng như khả năng ứng dụng của từng thuật toán.

VII. Tài liệu tham khảo

[1] GS.TSKH Hoàng Văn Kiếm, Bài giảng môn Công nghê tri thức và ứng dụng, Đại học Công nghê thông tin, 2014.

[2] GS.TSKH. Hoàng Kiếm, TS. Đỗ Phúc, TS. Đỗ Văn Nhơn, Giáo trình các hệ cơ sở tri thức. Đại học quốc gia TPHCM – 2009.

[3] TS. Hoàng Thị Lan Giao, Bài giảng Khai phá dữ liệu- Cây quyết định.

[4] Wikipedia - Bách khoa toàn thư mở - Cây quyết định. Wikipedia – Bách khoa toàn thư mở - Cây quyết định http://en.wikipedia.org/wiki/Decision_tree

[5] Roosevelt dos Santos Júnior. ID3 Decision Tree Algorithm in C#.

Một phần của tài liệu Tiểu luận môn CÔNG NGHỆ TRI THỨC VÀ ỨNG DỤNG ỨNG DỤNG MỘT SỐ THUẬT TOÁN TRONG MÔ HÌNH PHÂN LỚP CÂY QUYẾT ĐỊNH - CÀI ĐẶT CHƯƠNG TRÌNH DEMO THUẬT TOÁN ID3 (Trang 58)