Tải bản đầy đủ (.pdf) (25 trang)

khai phá dữ liệu bằng cây quyết định ID3

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.16 MB, 25 trang )

1

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN






CHUYÊN ĐỀ SIMINAR

CƠ SỞ TRI THỨC VÀ ỨNG DỤNG








KHAI PHÁ DỮ LIỆU BẰNG
CÂY QUYẾT ĐỊNH – ID3







CHUYÊN NGHÀNH: KHOA HỌC MÁY TÍNH


MÃ SỐ: 60 48 01






GIÁO VIÊN HƯỚNG DẪN: GS.TSKH.HOÀNG VĂN KIẾM
HỌC VIÊN THỰC HIỆN: ĐỖ THIỆN VŨ
MÃ HỌC VIÊN: CH1301072
KHOÁ HỌC: 2013





TP.HỒ CHÍ MINH-2013

2


MỤC LỤC





I. TỔNG QUAN VỀ CÂY QUYẾT ĐỊNH 3
1. Giới thiệu chung 3
2. Các kiểu cây quyết định: 3

3. Ưu điểm cây quyết định: 4
II. XÂY DỰNG CÂY QUYẾT ĐỊNH: 4
1. Chọn thuộc tính phân tách: 5
2. Phép kiểm tra để chọn phép phân tách tốt nhất: 7
3. Biến đổi cây quyết định thành luật: 10
III. THUẬT TOÁN PHÂN LỚP HỌC CÂY QUYẾT ĐỊNH ID3: 11
1. Mô hình: 11
2. Giải thuật ID3 11
3. Nhận Xét 12
3.1. Không Gian tìm kiếm 12
3.2. Giải Thuật: 14
4. Tối Ưu Cây Quyết Định Cuối Cùng : 15
5. Khi nào nên sử dụng ID3 16
IV. XÂY DỰNG CHƯƠNG TRÌNH KHAI PHÁ DỮ LIỆU THEO GIẢI THUẬT ID3 17
TÀI LIỆU THAM KHẢO 25


















3





I. TỔNG QUAN VỀ CÂY QUYẾT ĐỊNH
1. Giới thiệu chung
Cây quyết định là cấu trúc được biểu diễn dưới dạng cây gồm các nút, nhánh và
lá. Cây quyết định là phương pháp dùng cho việc khai phá dữ liệu là phân loại và dự
báo. Trong đó, các nút của cây là đại diện cho 1 thuộc tính dữ liệu, các nhánh biểu diễn
các giá trị của thuộc tính và các lá biểu diễn các lớp quyết định. Nút trên cùng gọi là nút
gốc. Cây quyết định phân lớp dữ liệu bằng cách đi từ nút gốc di chuyển theo các nhánh
cho đến khi gặp nút lá. Từ đó ta có thể chuyển đổi về các luật quyết định dạng IF-Then
Tạo cây quyết định chính là quá trình phân tích cơ sở dữ liệu, phân lớp và đưa ra
dự đoán. Cây quyết định được tạo thành bằng cách lần lượt chia (đệ quy) một tập dữ
liệu thành các tập dữ liệu con, mỗi tập con được tạo thành chủ yếu từ các phần tử của
cùng một lớp. Lựa chọn thuộc tính để tạo nhánh thông qua Entropy và Gain.
Học bằng cây quyết định cũng là một phương pháp thông dụng trong khai phá dữ
liệu. Khi đó, cây quyết định mô tả một cấu trúc cây, trong đó, các lá đại diện cho các
phân loại còn cành đại diện cho các kết hợp của các thuộc tính dẫn tới phân loại đó.
Một cây quyết định có thể được học bằng cách chia tập hợp nguồn thành các tập con
dựa theo một kiểm tra giá trị thuộc tính . Quá trình này được lặp lại một cách đệ qui cho
mỗi tập con dẫn xuất. Quá trình đệ qui hoàn thành khi không thể tiếp tục thực hiện việc
chia tách được nữa, hay khi một phân loại đơn có thể áp dụng cho từng phần tử của tập
con dẫn xuất.
Cây quyết định có thể được mô tả như là sự kết hợp của các kỹ thuật toán học và
tính toán nhằm hỗ trợ việc mô tả, phân loại và tổng quát hóa một tập dữ liệu cho trước.

Dữ liệu được cho dưới dạng các bản ghi có dạng:
1 2 3
( , ) ( , , , , , )
k
x y x x x x y
. Biến phụ
thuộc (dependant variable) y là biến mà chúng ta cần tìm hiểu, phân loại hay tổng quát
hóa.
1 2 3
, , x x x
là các biến sẽ giúp ta thực hiện công việc đó.
2. Các kiểu cây quyết định:
Cây quyết định còn có hai tên khác:
4

 Cây hồi quy (Regression tree): ước lượng các hàm giá có giá trị là số thực thay vì
được sử dụng cho các nhiệm vụ phân loại. (ví dụ: ước tính giá một ngôi nhà hoặc khoảng
thời gian một bệnh nhân nằm viện)
 Cây phân loại (Classification tree): nếu y là một biến phân loại như: giới tính (nam
hay nữ), kết quả của một trận đấu (thắng hay thua).
.
3. Ưu điểm cây quyết định:
So với các phương pháp khai phá dữ liệu khác, cây quyết định là phương pháp có
một số ưu điểm:
 Cây quyết định dễ hiểu. Người ta có thể hiểu mô hình cây quyết định sau
khi được giải thích ngắn.
 Việc chuẩn bị dữ liệu cho một cây quyết định là cơ bản hoặc không cần
thiết. Các kỹ thuật khác thường đòi hỏi chuẩn hóa dữ liệu, cần tạo các biến
phụ (dummy variable) và loại bỏ các giá trị rỗng.
 Cây quyết định có thể xử lý cả dữ liệu có giá trị bằng số và dữ liệu có giá

trị là tên thể loại. Các kỹ thuật khác thường chuyên để phân tích các bộ dữ
liệu chỉ gồm một loại biến. Chẳng hạn, các luật quan hệ chỉ có thể dùng cho
các biến tên, trong khi mạng nơ-ron chỉ có thể dùng cho các biến có giá trị
bằng số.
 Cây quyết định là một mô hình hộp trắng. Mạng nơ-ron là một ví dụ về mô
hình hộp đen, do lời giải thích cho kết quả quá phức tạp để có thể hiểu được.
 Có thể thẩm định một mô hình bằng các kiểm tra thống kê. Điều này làm
cho ta có thể tin tưởng vào mô hình.
 Cây quyết định có thể xử lý tốt một lượng dữ liệu lớn trong thời gian ngắn.
Có thể dùng máy tính cá nhân để phân tích các lượng dữ liệu lớn trong một
thời gian đủ ngắn để cho phép các nhà chiến lược đưa ra quyết định dựa trên
phân tích của cây quyết định.
II. XÂY DỰNG CÂY QUYẾT ĐỊNH:
 Việc tạo cây quyết định bao gồm 2 giai đoạn : Tạo cây và tỉa cây .
5

- Để tạo cây ở thời điểm bắt đầu tất cả những ví dụ huấn luyện là ở gốc sau đó phân chia
ví dụ huấn luyện theo cách đệ qui dựa trên thuộc tính được chọn .
- Việc tỉa cây là xác định và xóa những nhánh mà có phần tử hỗn loạn hoặc những phần
tử nằm ngoài (những phần tử không thể phân vào một lớp nào đó) .
 Có rất nhiều biến đổi khác nhau về nòng cốt của thuật toán cây quyết định, mặc
dù vậy chúng vẫn tuân theo những bước cơ bản sau :
- Cây được thiết lập từ trên xuống dưới và theo cách thức chia để trị.
- Ở thời điểm bắt đầu, các mẫu huấn luyện nằm ở gốc của cây
- Thuộc tính được phân loại (Rời rạc hóa các thuộc tính dạng phi số )
- Chọn một thuộc tính để phân chia thành các nhánh. Thuộc tính được chọn dựa trên
độ đo thống kê hoặc độ đo heuristic.
- Tiếp tục lặp lại việc xây dựng cây quyết định cho các nhánh.
 Điều kiện để dừng việc phân chia:
+ Tất cả các mẫu rơi vào một nút thuộc về cùng một lớp (nút lá)

+ Không còn thuộc tính nào có thể dùng để phân chia mẫu nữa
+ Không còn lại mẫu nào tại nút.
1. Chọn thuộc tính phân tách:
Cây quyết định được xây dựng bằng cách phân tách các bản ghi tại mỗi nút dựa
trên một thuộc tính đầu vào. Rõ ràng nhiệm vụ đầu tiên là phải chọn ra xem thuộc tính
nào đưa ra được sự phân tách tốt nhất tại nút đó.
Độ đo được sử dụng để đánh giá khả năng phân tách là độ tinh khiết. Chúng ta
sẽ có những phương pháp xác định để tính toán độ tinh khiết một cách chi tiết, tuy nhiên
chúng đều cố gắng đạt được hiệu quả như nhau. Một sự phân tách tốt nhất là sự phân
tách làm tăng độ tinh khiết của tập bản ghi với số lượng lớn nhất. Một sự phân tách tốt
cũng phải tạo ra các nút có kích cỡ tương tự nhau, hay chí ít cũng không tạo ra các nút
có quá ít bản ghi.



6






Dữ liệu gốc


Phép phân tách kém

Phép phân tách kém



Phép phân tách tốt

Thuật toán xây dựng cây quyết định hết sức thấu đáo. Chúng bắt đầu bằng việc
chọn mỗi biến đầu vào chưa được chọn và đo mức độ tăng độ tinh khiết trong các kết
quả ứng với mỗi biến. Sau đó một phép tách tốt nhất sẽ được sử dụng trong phép tách
khởi đầu, để tạo hai hay nhiều nút con. Nếu không phép phân tách nào có khả năng (có
thể do có quá ít bản ghi) hoặc do không có phép phân tách nào làm tăng độ tinh khiết
thì thuật toán kết thúc và nút đó trở thành nút lá.
Phép phân tách trên các biến đầu vào kiểu số: đối với sự phân tách nhị phân
trên một biến đầu vào, mỗi giá trị mà biến đó chứa đều có thể trở thành giá trị dự tuyển.
Phép phân tách nhị phân dựa trên biến đầu vào kiểu số có dạng X < N. Để cải thiện hiệu
năng, một số thuật toán không kiểm tra hết toàn bộ các giá trị của biến mà chỉ kiểm tra
trên tập mẫu giá trị của biến đó.
Phép phân tách trên các biến đầu vào định tính : thuật toán đơn giản nhất trong
việc phân tách trên một biến định tính là ứng với mỗi giá trị của biến đó, ta tạo một
nhánh tương ứng với một lớp được phân loại. Phương pháp này được sử dụng thực sự
trong một số phần mềm nhưng mang lại hiệu quả thấp. Một phương pháp phổ biến hơn
đó là nhóm các lớp mà dự đoán cùng kết quả với nhau. Cụ thể, nếu hai lớp của biến đầu
7

vào có phân phối đối với biến đích chỉ khác nhau trong một giới hạn cho phép thì hai
lớp này có thể hợp nhất với nhau.
Phép phân tách với sự có mặt của các giá trị bị thiếu: một trong những điểm
hay nhất của cây quyết định là nó có khả năng xử lý các giá trị bị thiếu bằng cách coi
giá trị rỗng (NULL) là một nhánh của nó. Phương pháp này được ưa thích hơn so với
việc vứt các bản ghi có giá trị thiếu hoặc cố gắng gắn giá trị nào đó cho nó bởi vì nhiều
khi các giá trị rỗng cũng có ý nghĩa riêng của nó. Mặc dù phép phân tách giá trị rỗng
như là một lớp riêng rẽ khá có ý nghĩa nhưng người ta thường đề xuất một giải pháp
khác. Trong khai phá dữ liêu, mỗi nút chứa vài luật phân tách có thể thực hiện tại nút
đó, mỗi phép phân tách đó dựa vào các biến đầu vào khác nhau. Khi giá trị rỗng xuất

hiên trong biến đầu vào của phép phân tách tốt nhất, ta sử dụng phép phân tách thay thế
trên biến đầu vào có phép phân tách tốt thứ hai.
2. Phép kiểm tra để chọn phép phân tách tốt nhất:
- Độ lợi thông tin (Information gain)
• Information gain là đại lượng được sử dụng để chọn lựa thuộc tính với
information gain lớn nhất.
• Cho P và N là hai lớp và S là một tập dữ liệu có p phần tử lớp P và n phần tử lớp
N .
• Khối lượng thông tin cần thiết để quyết định một mẫu tùy ý có thuộc về lớp P
hay N hay không là:


• Cho các tập {S1, S2 , …, Sv} là một phân hoạch trên tập S, khi sử dụng thuộc
tính A.
• Cho mỗi Si chứa p
i
mẫu lớp P và n
i
mẫu lớp N
• Entropy, hay thông tin mong muốn cần thiết để phân lớp các đối tượng trong tất
cả các cây con Si là:


• Thông tin có được bởi việc phân nhánh trên thuộc tính A là:

22
( , ) ( , ) log log
p n p p n n
Info p n Entropy
p n p n p n p n p n p n

   
     
1
( ) ( , )
ii
ii
i
pn
Entropy A Info p n
pn






( ) ( , ) ( )Gain A Info p n Entropy A
8



Ví dụ: Với bảng dữ liệu:
Dữ liệu chơi golf
Các biến độc lập
Biến phụ thuộc
Quang cảnh
Nhiệt độ
Độ ẩm
Gió
Chơi

Nắng
Nóng
Cao
Nhẹ
Không
Nắng
Nóng
Cao
Mạnh
Không
Âm u
Nóng
Cao
Nhẹ

Mưa
Ấm áp
Cao
Nhẹ

Mưa
Mát
Trung bình
Nhẹ

Mưa
Mát
Trung bình
Mạnh
Không

Âm u
Mát
Trung bình
Mạnh

Nắng
Ấm áp
Cao
Nhẹ
Không
Nắng
Mát
Trung bình
Nhẹ

Mưa
Ấm áp
Trung bình
Nhẹ

Nắng
Ấm áp
Trung bình
Mạnh

Âm u
Ấm áp
Cao
Mạnh


Âm u
Nóng
Trung bình
Nhẹ

Mưa
Ấm áp
Cao
Mạnh
không

• Lớp P: Chơi_tennis = “Có”
• Lớp N: Chơi_tennis = “Không”
• Thông tin cần thiết để phân lớp một mẫu được cho là:


 Xét thuộc tính ‘Quang cảnh’ ta có :
22
9 9 5 5
( , ) (9,5) - log - log 0.940
14 14 14 14
Info p n Info  
9

○ ‘Quang cảnh’ = ‘Nắng’:
Info ([2,3]) = entropy (2/5, 3/5) = – 2/5log
2
(2/5) – 3/5log
2
(3/5) = 0.971

○ ‘Quang cảnh’ = ‘Âm u’:
Info ([4,0]) = entropy (1, 0) = – 1log
2
(1) – 0log
2
(0) = 0
Do không có log
2
(0) nên ta quy ước nó bằng 0
○ ‘Quang cảnh’ = ‘Mưa’:
Info ([3,2]) = entropy (3/5, 2/5) = – 3/5log
2
(3/5) – 2/5log
2
(2/5) = 0.971
○ Entropy cho phép phân tách trên thuộc tính « Quang cảnh» :


= (5/14) * 0.971 + (4/14) * 0 + (5/14) * 0.971 = 0.694
Do đó ta có:

= 0.940 – 0.694= 0.246
 Xét thuộc tính ‘Độ ẩm’ ta có :
○ ‘Độ ẩm’ = ‘Cao’:
Info ([3,4]) = entropy (3/7, 4/7) = – 3/7log
2
(3/7) – 4/7log
2
(4/7) = 0.985
○ ‘Độ ẩm’ = ‘Trung bình’:

Info ([6,1]) = entropy (6/7, 1/7) = – 6/7log
2
(6/7) – 1/7log
2
(1/7) = 0.592
Entropy(Độ ẩm)= 7/14 Info(3,4) + 7/14 Info(6,1)
= 7/14* 0.985 + 7/14* 0.592 = 0.789
Gian(Độ ẩm) = Info(9,5) – Entropy(Độ ẩm)
= 0.940 – 0.798 = 0.151
Tương tự cho các thuộc tính còn lại ta có:



5 4 5
( ) (2,3) (4,0) (3,2)
14 14 14
Entropy Quang canh Info Info Info  
( ) (9,5) ( )Gain Quang canh Info Entropy Quang canh
( ) 0.246
( ) 0.151
( ) 0.048
( ) 0.029
Gain Quang canh
Gain Do am
Gain Gio
Gain Nhiet do





10


Rõ ràng ban đầu ta sẽ chọn thuộc tính ‘Quang cảnh’ để phân tách. Sau đó làm tương tự
ta sẽ được cây quyết định cuối cùng có dạng :














Cây quyết định cuối cùng
3. Biến đổi cây quyết định thành luật:
- Biểu diễn tri thức dưới dạng luật IF-THEN .
- Mỗi luật tạo ra từ mỗi đường dẫn từ gốc đến lá.
- Mỗi cặp giá trị thuộc tính dọc theo đường dẫn tạo nên phép kết (phép AND
– và biểu diễn bằng dấu “,”)
- Các nút lá mang tên của lớp
Xét ví dụ trên ta được các luật sau:
R
0
: If {Quang cảnh=Nắng,Độ ẩm=Cao,) Then {Không}

R
1
: If {Quang cảnh=Nắng,Độ ẩm=Trung bình,} Then {Có}
Không


Không
Cao
Mạnh
Nhẹ
Quang cảnh

Độ ẩm
Gió
Nắng
Mưa
TB

Âm u
11

R
2
: If {Quang cảnh=Âm u,} Then {Có}
R
3
: If {Quang cảnh=Mưa, Gió=Mạnh,} Then {Không}
R
4
: If {Quang cảnh=Mưa, Gió=Nhẹ) Then {Có}

III. THUẬT TOÁN PHÂN LỚP HỌC CÂY QUYẾT ĐỊNH ID3:
1. Mô hình:
Giải thuật quy nạp cây ID3 (gọi tắt là ID3) là một giải thuật học đơn giản nhưng đã
và đang được áp dụng thành công trong nhiều lĩnh vực.
 Đầu vào: Một tập hợp các ví dụ. Mỗi ví dụ bao gồm các thuộc tính mô tả
một tình huống, hay một đối tượng nào đó, và một giá trị phân loại của nó.
 Đầu ra: Cây quyết định có khả năng phân loại đúng đắn các ví dụ trong tập
dữ liệu rèn luyện, và hy vọng là phân loại đúng cho cả các ví dụ chưa gặp
trong tương lai.
.
2. Giải thuật ID3
ID3 xây dựng cây quyết định (cây QĐ) theo cách từ trên xuống ID3 chọn một thuộc
tính để kiểm tra tại nút hiện tại của cây và dùng trắc nghiệm này để phân vùng tập hợp
các ví dụ; thuật toán khi đó xây dựng theo cách đệ quy một cây con cho từng phân vùng.
Việc này tiếp tục cho đến khi mọi thành viên của phân vùng đều nằm trong cùng một
lớp; lớp đó trở thành nút lá của cây.
Vì thứ tự của các trắc nghiệm là rất quan trọng đối với việc xây dựng một cây QĐ
đơn giản, ID3 phụ thuộc rất nhiều vào tiêu chuẩn chọn lựa trắc nghiệm để làm gốc của
cây.
12

* ID3 xây dựng cây quyết định theo giải thuật sau:
Function TreeNode(tập_ví_dụ, tập_thuộc_tính)
begin
Bước 1:
if mọi ví dụ trong tập_ví_dụ đều nằm trong cùng một lớp then
return một nút lá được gán nhãn bởi lớp đó
else if tập_thuộc_tính là rỗng then
return nút lá được gán nhãn bởi tuyển của tất cả các lớp trong tập_ví_dụ
else

Bước 2:
begin
2.1. Chọn một thuộc tính P, lấy nó làm gốc cho cây hiện tại;
2.2 Xóa P ra khỏi tập_thuộc_tính;
2.3. Với mỗi giá trị V của P
begin
2.3.1 Tạo một nhánh của cây gán nhãn V;
2.3.2. Đặt vào phân_vùngV các ví dụ trong tập_ví_dụ có giá trị V tại
thuộc tính P;
2.3.3. Gọi TreeNode(phân_vùngV, tập_thuộc_tính), gắn kết quả vào
nhánh V (đệ qui)
end
end
end


3. Nhận Xét
3.1. Không Gian tìm kiếm
Cũng như các phương pháp học quy nạp khác, ID3 cũng tìm kiếm trong một không
gian các giả thuyết một giả thuyết phù hợp với tập dữ liệu rèn luyện. Không gian giả
thuyết mà ID3 tìm kiếm là một tập hợp các cây quyết định có thể có. ID3 thực hiện một
phép tìm kiếm từ đơn giản đến phức tạp, theo giải thuật leo-núi (hill climbing), bắt đầu
từ cây rỗng, sau đó dần dần xem xét các giả thuyết phức tạp hơn mà có thể phân loại
13

đúng các ví dụ rèn luyện. Hàm đánh giá được dùng để hướng dẫn tìm kiếm leo núi ở
đây là phép đo lượng thông tin thu được.
Từ cách nhìn ID3 như là một giải thuật tìm kiếm trong không gian các giả thuyết, ta
có một số nhận xét như sau:
 Không gian giả thuyết các cây quyết định của ID3 là một không gian đầy

đủ các cây quyết định trên các thuộc tính đã cho trong tập rèn luyện. Điều
này có nghĩa là không gian mà ID3 tìm kiếm chắc chắn có chứa cây quyết
định cần tìm.
 Trong khi tìm kiếm, ID3 chỉ duy trì một giả thuyết hiện tại. Vì vậy, giải
thuật này không có khả năng biểu diễn được tất cả các cây quyết định khác
nhau có khả năng phân loại đúng dữ liệu hiện có.

 Vì ID3 sử dụng tất cả các ví dụ ở mỗi bước để đưa ra các quyết định dựa
trên thống kê, nên kết quả tìm kiếm của ID3 rất ít bị ảnh hưởng bởi một vài
dữ liệu sai (hay dữ liệu nhiễu).
 Trong quá trình tìm kiếm, giải thuật ID3 thường là có xu hướng chọn cây
quyết định ngắn hơn là những cây quyết định dài.
14

3.2. Giải Thuật:
Theo giải thuật ID3 trên thì cây ID3 được hình thành từ các giá trị sàng lọc dần của
mẫu ví dụ nhưng trong quá trình hình thành cây trong một số hiếm trường hợp sẽ tạo ra cây
sẽ có nút là độc lập không bị ảnh hưởng của quyết định. Cụ thể ta xét ví dụ sau:
Ví dụ khảo sát 8 người qua các thuộc tính việc làm, tuổi, giới tính để đi đến quyết
định hôn nhân hay không.


Ta có các giá trị Gain lần lượt như sau:

Xét Tất Cả Thuộc Tính
* Gain(Tất Cả Thuộc Tính,việc_làm) = 0.0487949406953985
* Gain(Tất Cả Thuộc Tính,tuổi) = 0.311278124459133
* Gain(Tất Cả Thuộc Tính,giới_tính) = 0
> Best Gain : tuổi (chọn làm nút gốc P của cây hiện tại b.2.1 )
Xét 18

* Gain(18,việc_làm) = 0
* Gain(18,giới_tính) = 0.251629167387823
> Best Gain : giới_tính (chọn làm nút gốc P của cây hiện tại b.2.1 )
Xét nam
Tất cả các mẫu đều phủ định => Trả về nút gốc với nhãn No (b.1)
Xét nữ
* Gain(nữ,việc_làm) = 0
> Best Gain : việc_làm
Xét Không là No
Các thuộc tính rỗng => Trả về nút gốc có giá trị phổ biến nhất là No(b.1)
Xét 22 là No (b1)
Xét 30
Tất cả các mẫu đều khẳng định => Trả về nút gốc với nhãn Yes (b.1)
Xét 25
Tất cả các mẫu đều khẳng định => Trả về nút gốc với nhãn Yes(b.1)

Theo giải thuật ID3 trên ta được cây sau:
15



Từ cây tổng thể được tạo ra ta thấy thuộc tính giới_tính là nút độc lập của cây vì tất cả
các giá trị của nó (nhánh) đều nằm trong cùng 1 lớp. Vì vậy ta có thể rút ngắn cây (tối
ưu) bằng cách xoá nút thừa này đi và gán nhãn (lá) của nó cho nút cha ở trên nó.
Vấn đề để rút ngắn cây quyết định cuối cùng là ta có thể thêm 1 hàm kiểm tra
và xoá nút thừa vào bước cuối cùng của giải thuật ID3 hoặc xây dựng hàm tối ưu
riêng sau khi hình thành cây quyết định cuối cùng.

4. Tối Ưu Cây Quyết Định Cuối Cùng :
- Tối ưu cây quyết định cuối cùng là quá trình rút ngắn cây bằng cách loại bỏ những

nút thừa như trình bày ở mục trên. Ở đây ta xây dựng 1 hàm riêng để kiểm tra lần lượt tất cả
các nhánh của cây quyết định cuối cùng từ gốc đến lá. Nếu nút cuối cùng của nhánh là thừa
thì gán nhãn (lá) của nó cho nút cha liền ở trên nó. Sau đó gọi lại hàm đến khi cây không còn
rút ngắn rút được (cây không thay đổi).
- Đầu vào: Cây quyết định cuối cùng đã được phân lớp bằng giải thuật ID3.
16

- Đầu ra: Cây đã được loại bỏ các nút thừa.
- Code: trình bày phần sau



5. Khi nào nên sử dụng ID3
Giải thuật ID3 là một giải thuật học đơn giản nhưng nó chỉ phù hợp với một lớp các
bài toán hay vấn đề có thể biểu diễn bằng ký hiệu. Chính vì vậy, giải thuật này thuộc
tiếp cận giải quyết vấn đề dựa trên ký hiệu (symbol – based approach).
Tập dữ liệu rèn luyện ở đây bao gồm các ví dụ được mô tả bằng các cặp “Thuộc tính
– giá trị”, như trong ví dụ ‘Chơi tennis’ trình bày trong suốt chương này, đó là ‘Gió –
mạnh’, hay ‘Gió – nhẹ’,… và mỗi ví dụ đều có một thuộc tính phân loại, ví dụ như
‘chơi_tennis’, thuộc tính này phải có giá trị rời rạc, như có, không.
Tuy nhiên, khác với một số giải thuật khác cũng thuộc tiếp cận này, ID3 sử dụng
các ví dụ rèn luyện ở dạng xác suất nên nó có ưu điểm là ít bị ảnh hưởng bởi một vài
dữ liệu nhiễu. Vì vậy, tập dữ liệu rèn luyện ở đây có thể chứa lỗi hoặc có thể thiếu một
vài giá trị ở một số thuộc tính nào đó. Vấn đề này có thể khắc phục ở giai đoạn tiền xử
lý.










17


IV. XÂY DỰNG CHƯƠNG TRÌNH KHAI PHÁ DỮ LIỆU
THEO GIẢI THUẬT ID3.
Chương trình viết trên nền C# visual Studio 2010, NetFramWork 4.0

Giao diện chương trình sau khi nạp dữ liệu ví dụ khảo sát hôn nhân và chạy giải thuật ID3:


Giao diện chương trình sau khi nạp dữ liệu ví dụ dự báo thời tiết và chạy giải thuật ID3:


Giao diện chạy tác vụ tối ưu:
18





Source Code Project của chương trình lưu tại trang:


Code Class chính của chương trình:

namespace TieuLuanCoSoTriThuc

{
class ID3_ALG

{
List<List<string>> Examples;
List<Attribute> Attributes;
public List<string> RuleID3=new List<string>();
19

TreeNode _tree;
int _depth;
public int RuleCount;
public int temp;
string _solution;
string _solution1;
string _Rule;

internal TreeNode Tree
{
get { return _tree; }
set { _tree = value; }
}

public int Depth
{
get { return _depth; }
set { _depth = value; }
}

public string Solution

{
get { return _solution; }
set { _solution = value; }
}


public string Solution1
{
get { return _solution1; }
set { _solution1 = value; }
}

public string Rule
{
get { return _Rule; }
set { _Rule = value; }
}
public ID3_ALG(List<List<string>> Examples, List<Attribute> Attributes)
{
this.Examples = Examples;
this.Attributes = Attributes;
this.Tree = null;
Depth = 0;
}

// tính entroypy

private double 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;
}
20


// tính Gain(bestat,A);

private double Gain(List<List<string>> Examples, Attribute A, string bestat)
{
double result;
int CountPositives = 0;
int[] CountPositivesA = new int[A.Value.Count];
int[] CountNegativeA = new int[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]=="yes")
{
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;
}

// giải thuật ID3

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

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

if (CheckAllPositive(Examples))
{
Solution += "\n Tất cả các mẫu đều khẳng định => Trả về nút gốc với
nhãn Yes";
return new TreeNode(new Attribute("Yes"));
}
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
No";
return new TreeNode(new Attribute("No"));
}
if (Attribute.Count == 0)
21

{
return new TreeNode(new Attribute(GetMostCommonValue(Examples)));
}
Attribute BestAttribute = GetBestAttribute(Examples, Attribute, bestat);
int LocationBA = Attributes.IndexOf(BestAttribute);
TreeNode Root = new TreeNode(BestAttribute);
for (int i = 0; i < BestAttribute.Value.Count; i++)
{
List<List<string>> Examplesvi = new List<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 += "\n Các thuộc tính rỗng => Trả về nút gốc có giá trị
phổ biến nhất ";
return new TreeNode(new
Attribute(GetMostCommonValue(Examplesvi)));
}
else
{
Solution += "\n";
Attribute.Remove(BestAttribute);
Root.AddNode(ID3(Examplesvi, Attribute,BestAttribute.Value[i]));
}
}
return Root;
}

// lấy thuật tính có Gain cao nhất (bestat)

private Attribute 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;
}
}
Solution = Solution + "\n\t > Best Gain : " + Attributes[Max].Name ;
return Attributes[Max];
}

// lấy giá trị phổ biến nhất của tập đích

private string GetMostCommonValue(List<List<string>> Examples)
{
int CountPositive = 0;
for (int i = 0; i < Examples.Count; i++)
{
if (Examples[i][Examples[0].Count - 1]=="yes")
CountPositive++;
}
22

int CountNegative = Examples.Count - CountPositive;
string Label;
if (CountPositive > CountNegative)
Label = "Yes";
else
Label = "No";
Solution = Solution + " là " + Label;
return Label;
}


// kiểm tra xem tất cả tập có phải là positive không

private bool CheckAllPositive(List<List<string>> Examples)
{
for (int i = 0; i < Examples.Count; i++)
{
if (Examples[i][Examples[0].Count - 1].ToString()=="no")
return false;
}
return true;
}

// kiểm tra xem tất cả tập có phải là Negative không

private bool CheckAllNegative(List<List<string>> Examples)
{
for (int i = 0; i < Examples.Count; i++)
{
if (Examples[i][Examples[0].Count - 1]=="yes")
return false;
}
return true;
}

// xây dựng cây

public void GetTree()
{
Solution = "";

List<Attribute> at = new List<Attribute>();
for (int i = 0; i < Attributes.Count; i++)
{
at.Add(Attributes[i]);
}
Tree = ID3(Examples, at, "Tất Cả Thuộc Tính");
Depth = GetDepth(Tree);
}



// Tìm luật
public void SearchRule(TreeNode Rule)
{
if (Rule.Attributes.Value.Count == 0)
{
}
else
{
string temp1="";
Solution1 += Rule.Attributes.Name + " = ";
temp1 += Solution1+ " ";
for (int i = 0; i < Rule.Attributes.Value.Count; i++)
23

{
string temp2 = "";
temp2 = temp1 + Rule.Attributes.Value[i] + ", ";
if (Rule.Childs[i].Attributes.Value.Count == 0)
{

RuleCount++;
Solution1 = temp2 + "} THEN
{"+Rule.Childs[i].Attributes.Label+"}";
RuleID3.Add(Solution1);
}
else
{
if (Rule.Attributes.Value.Count == 0)
{
SearchRule(Rule.Childs[i]);
}
else
{
Solution1 = temp2;
SearchRule(Rule.Childs[i]);
}

}
}
}
}

public void GetRule(TreeNode tree)
{
Solution1 = "";
Rule += " RÚT RA LUẬT TỪ CÂY QUYẾT ĐỊNH ID3 \n\n";
SearchRule(tree);
for (int i = 0; i < RuleCount; i++)
Rule += " Rule [" +i+ "]: IF {"+RuleID3[i]+ "\n";
Rule+= "\n Tổng Số Luật: "+ RuleCount;

RuleCount = 0;
}

//Tối Ưu Cây Quyết Định.

public bool CheckAllLabelNegative(TreeNode tree)
{
int test=0;
string temp;
temp = "No";

for (int i = 0; i < tree.Attributes.Value.Count; i++)
{
if (tree.Childs[i].Attributes.Label == temp)
test++;
}

if ((test > 1) && (test == tree.Attributes.Value.Count))
return true;
else
return false;

}

public bool CheckAllLabelPositive(TreeNode tree)
{
int test=0;
24

string temp;

temp = "Yes";
for (int i = 0; i < tree.Attributes.Value.Count; i++)
{
if (tree.Childs[i].Attributes.Label == temp)
test++;
}
if ((test>1)&&(test == tree.Attributes.Value.Count))
return true;
else
return false;
}

public void DeleteTree(TreeNode tree) // hàm làm cây rỗng.
{
tree.Attributes.Name="";
//tree.Attributes.Label=null;
tree.Attributes.Value.Clear();
}

public void OptimizeTree(TreeNode tree)
{
for (int i = 0; i < tree.Attributes.Value.Count; i++)
{

if (tree.Attributes.Value.Count > 1)
{
if (CheckAllLabelPositive(tree))
{
tree.Attributes.Label = "Yes";
DeleteTree(tree);

}
else
OptimizeTree(tree.Childs[i]);

if (CheckAllLabelNegative(tree))
{
tree.Attributes.Label = "No";
DeleteTree(tree);
}
else
OptimizeTree(tree.Childs[i]);
}
}

}



// lấy độ sâu của cây

private int GetDepth(TreeNode tree)
{
int depth;
if (tree.Childs.Length == 0)
return 1;
else
{
depth = GetDepth(tree.Childs[0]);
for (int i = 1; i < tree.Childs.Length; i++)
{

int depthchild = GetDepth(tree.Childs[i]);
25

if (depth < depthchild)
depth = depthchild;
}
depth++;
}
return depth;
}

}
}






TÀI LIỆU THAM KHẢO



1. GS.TSKH.Hoàng Văn Kiếm(2013), Bài giảng và Slide môn Công Nghệ Tri Thức –
Ứng Dụng
2. Nguồn Internet:











/>id3.html




×