II. Một số thuật toán xây dựng cây
3. Thuật toán C4.5
Thuật toán C4.5 được phát triển và công bố bởi Quinlan vào năm 1996. Thuật toán C4.5 là một thuật toán được cải tiến từ thuật toán ID3 với việc cho phép xử lý trên tập dữ liệu có các thuộc tính số (numeric atributes) và làm việc được với tập dữ liệu bị thiếu, bị nhiễu. Nó thực hiện phân lớp tập mẫu dữ liệu theo chiến lược ưu tiên theo chiều sâu (Depth - First).
Thuật toán xây dựng cây quyết định C4.5
Mô tả thuật toán dưới dạng giả mã như sau [1]:
Function xay_dung_cay(T) {
1. <Tính toán tần xuất các giá trị trong các lớp của T>;
2. If <Kiểm tra các mẫu, nếu thuộc cùng một lớp hoặc có rất ít mẫu khác lớp>Then <Trả về 1 nút lá>
Else <Tạo một nút quyết định N>;
3. For <Với mỗi thuộc tính A> Do <Tính giá trị Gain(A)>;
4. <Tại nút N, thực hiện việc kiểm tra để chọn ra thuộc tính có giá trị Gain tốt nhất (lớn nhất). Gọi N.test là thuộc tính có Gain lớn nhất>;
5. If <Nếu N.test là thuộc tính liên tục> Then <Tìm ngưỡng cho phép tách của N.test>;
6. For <Với mỗi tập con T` được tách ra từ tập T> Do ( T` được tách ra theo quy tắc:
- Nếu N.test là thuộc tính liên tục tách theo ngưỡng ở bước 5 - Nếu N.test là thuộc tính phân loại rời rạc tách theo các giá trị của thuộc tính này.
)
7. { If <Kiểm tra, nếu T' rỗng>} Then
<Gán nút con này của nút N là nút lá>; Else
8. <Gán nút con này là nút được trả về bằng cách gọi đệ qui lại đối với hàm xay_dung_cay(T'), với tập T'>;
}
9. <Tính toán các lỗi của nút N>; <Trả về nút N>;
}
T là tập dữ liệu ban đầu, số lượng mẫu được ký hiệu là |T|. Quá trình xây dựng cây được tiến hành từ trên xuống. Đầu tiên ta xác định nút gốc, sau đó xác định các nhánh xuất phát từ gốc này. Tập T được chia thành các tập con theo các giá trị của thuộc tính được xét tại nút gốc. Nếu T có m thuộc tính thì có m khả năng để lựa chọn thuộc tính. Một số thuật toán thì trong quá trình xây dựng cây mỗi thuộc tính chỉ được xét một lần, nhưng với thuật toán này một thuộc tính có thể được xét nhiều lần.
Xét thuộc tính X có n giá trị lần lượt là L1,L2,..Ln. Khi đó, ta có thể chia tập T ra thành n tập con Xi(i=1..n ) theo các giá trị của X. Tần xuất freq (Cj,T) là số lượng mẫu của tập T nào đó được xếp vào lớp con Cj. Xác xuất để một mẫu được lấy bất kỳ từ T thuộc lớp Cj là:
(3.4) Khi đó Information (T) được tính theo công thức sau:
(3.5) Công thức này đánh giá số lượng thông tin trung bình cần thiết để phân lớp các mẫu trong tập hợp T. Khi đó:
(3.6)
Thuộc tính được lựa chọn tại một nút là thuộc tính có Gain lớn nhất. Thuộc tính được chọn sẽ được dùng để phân lớp tập mẫu dữ liệu tại nút đó. Quá trình phân chia được tiếp tục cho đến khi các mẫu trong tập dữ liệu được phân lớp hoàn toàn.
Một số cải tiến của thuật toán C4.5:
1.Làm việc được với các thuộc tính số:
Nếu X là một thuộc tính liên tục (thuộc tính số) thì cần chọn một ngưỡng (Threshold) nào đó để so sánh giá trị trong thuộc tính. Giả sử, X là thuộc tính số có tập hợp giá trị hữu hạn phân biệt: v1,v2,…vn. Trước tiên, các giá trị của thuộc tính được sắp xếp bằng thuật toán QuickSort (sao cho v1<v2<…<vn). Sau đó chọn một giá trị bất kỳ giữa vi và vi+1 để chia các mẫu T thành hai tập hợp. Thông thường chọn giá trị trung bình của vi và vi+1
(3.8)
Chia T thành 2 tập T1 và T2 như sau: T1 = {vj | vj <=THi} và T2 = {vj | vj
>THi}. Ứng với mỗi giá trị v như thế, ta tính được giá trị gain tương ứng. Thuộc tính được lựa chọn là thuộc tính có giá trị gain lớn nhất.
2. Làm việc với thuộc tính đa trị
Với cách tính giá trị Gain như công thức (3.7) thì thuật toán sẽ không phù hợp với thuộc tính có rất nhiều giá trị. Để khắc phục vấn đề này, năm 1996 Quinlan đã đưa ra hàm GainRatio thay cho hàm Gain. Công thức tính như sau:
( ) ( ) Info(X) Gain X GainRatio X Split (3.9) Với: n i 2 i=1 T Info (X) =- log T i T Split T (3.10)
SplitInfo là đại lượng đánh giá thông tin tiềm năng thu thập được khi phân chia tập T thành n tập hợp con
GainRatio là tiêu chuẩn để đánh giá việc lựa chọn thuộc tính phân loại (thuộc tính được chọn là thuộc tính có GainRatio lớn nhất)
3. Làm việc với dữ liệu bị thiếu
Quinlan đã đưa ra cách tính giá trị Gain và GainRatio đối với dữ liệu có các thuộc tính bị thiếu giá trị như sau:
x | | ( ) (Info(T)-Info ( )) | | T U Gain X T T (3.11) Trong đó: (3.12) (3.13)
Tức là khi tính tần số freq (Cj, T) ta chỉ tính riêng các mẫu mà giá trị trên thuộc tính L đã xác định.
Giả sử phép thử X có các giá trị O1,O2,….On được lựa chọn theo tiểu chuẩn (3.11), các dữ liệu bị thiếu sẽ được xử lý như thế nào? Giả sử mẫu từ tập hợp T với đầu ra là Oi có liên quan đến tập hợp Ti thì khả năng mẫu đó thuộc tập hợp Ti là 1.
Giả sử mỗi mẫu trong Ti có một chỉ số xác định, xác suất thuộc tập hợp Ti. Nếu mẫu có giá trị thuộc tính L thì có trọng số bằng 1. Nếu trong trường hợp ngược lại, thì mẫu này liên quan đến tập con T1,T2,…Tn với xác xuất tương ứng là : 1 , 2 ,..., | | | | | | n T T T T U T U T U
Ta có thể dễ dàng thấy được rằng tổng các xác xuất này bằng 1. 1 1 n i i T T U
Tóm lại giải pháp này được phát biểu như sau: xác suất xuất hiện của các giá trị bị thiếu tỷ lệ thuận với xác suất xuất hiện của các giá trị không thiếu.
Khi đó GainRatio vẫn được tính như công thức (3.9)
Ví dụ: Xét tập dữ liệu T là bảng thống kê mối quan hệ mức độ nguy hiểm khi lái xe được cho trong bảng sau:
ID Age CarType Risk
1 23 Family High 2 18 Sport High 3 43 Sport High 4 64 Family Low 5 32 Truck Low 6 20 Family High 7 43 Family Low 8 32 Sport High 9 43 Truck Low
Bảng 3.3. Bảng thống kê mức độ nguy hiểm khi lái xe
Trong đó:
Thuộc tính định danh là ID
Thuộc tính ứng viên: Age (Tuổi), CarType(loại xe) Thuộc tính phân lớp: Risk (mức độ nguy hiểm)
Số mẫu là 9 ( 5 mẫu có giá trị High (+), 4 mẫu có giá trị Low(-)) Ký hiệu T = [5+,4-]
Ta có:
Entropy(T) = Entropy([5+, 4-]) = -(5/9)log2(5/9) – (4/9)log2(4/9) = 0.991
Chọn thuộc tính: + Age: có các giá trị 18, 20, 23, 32, 43, 64 Giá trị của Age 18 20 23 32 43 64 Số lượng 1 1 1 2 3 1 [High; Low] [1;0] [1;0] [1;0] [1;1] [1;2] [0;1]
Khi v = 18 có: Entropy(T age=18 ) = Entropy([1+ ,0- ]) = -(1/1)log2(1/1)=0 Khi v = 20 có: Entropy(T age=20 ) = 0
Khi v = 23 có: Entropy(T age=23 ) = 0 Khi v = 32 có: Entropy(T age=32 ) = 1
Khi v = 43 có: Entropy(T age=43 ) = 0.918 Khi v = 64 có: Entropy(T age=64 ) = 0 Từ đó ta tính được
Gain (T, Age) = Entropy(T) - (1/9)*Entropy(T age=18 ) - (1/9)*Entropy(T age=20 ) - (1/9)*Entropy(T age=23 ) - (2/9)*Entropy(T age=32 ) - (3/9)*Entropy(T age=43 ) - (1/9)*Entropy(T age=64 ) = 0.463 n i 2 i=1 T Info (X) =- log T i T Split T = – (1/9)*log2(1/9) – – (1/9)*log2(1/9) – – (1/9)*log2(1/9) – –(2/9)*log2(2/9) – –(3/9)*log2(3/9) – –(1/9)*log2(1/9) = 2.419
Suy ra :
GainRatio (T,Age) = Gain (T,Age) / SplitInfo (T,Age) = 0.463/2.419 = 0.191
+ Xét thuộc tính CarType: Family, Sports, Truck
Giá trị của CarType Family Sports Truck
Số lượng 4 3 2
[High; Low] [2; 2] [3; 0] [0; 2]
Khi Cartype = Family có:
Entropy(T cartype = Family) = Entropy([2+, 2-]) = -(2/4)*log2(2/4)-(2/4)*log2(2/4) = 1 Tương tự ta tính được :
Entropy(T cartype = Sport) = 0 Entropy(T cartype = Truck) = 0 Suy ra :
Gain(T, Cartype) = Entropy(T) – (4/9)*Entropy(T cartype = Family) – (3/9)*Entropy(T cartype = Sport) – (2/9)*Entropy(T cartype = Truck) = 0.991 – (4/9)*1 = 0.547
SplitInfo (T, Cartype) = – (4/9)*log2(4/9) – – (3/9)*log2(3/9) – – (2/9)*log2(2/9) = 1.531
Ta có :
= 0.547/1.531 = 0.357
Vậy GainRatio(T, CarType) > GainRatio(T, Age) → chọn thuộc tính CarType làm thuộc tính phân chia, ta được
Hình 3.4
Các mẫu không cùng một lớp, chọn thuộc tính Age để mở rộng. Xét nút Age: Gọi tập dữ liệu mẫu tại nút là T=TAge=Family Age có các giá trị 20, 23, 43, 64
Giá trị của Age 20 23 43 64
Số lượng 1 1 1 1
Tổng số mẫu: |T| = 4, trong đó 2 mẫu có giá trị High(+), 2 mẫu có giá trị Low(-) Ký hiệu: T = [2+,2-], ta có
Entropy(T) = Entroy([2 ,2 ])= -(2/4)*log2(2/4) - (2/4)*log2(2/4) = 1 Thuộc tính Age là thuộc tính số, tìm ngưỡng cho phép tách:
Giá trị của Age 20 23 43 64
Số lượng 1 1 1 1 [High;Low] [1;0] [0;1] [1;0] [1;0] TH=(vi+vi+1)/2 21.5 33 53.5 <= > <= > <= > Số lượng 1 3 2 2 3 1 [High;Low] [1;0] [1;2] [2;0] [0;2] [2;1] [0;1]
Xét Tại ngưỡng v =21.5, tập dữ liệu tại nút này được phân thành 2 tập T1,T2 T1 = {vj| vj ≤ 21.5}; T2 = {vj| vj > 21.5};
= 1-(1/4)*0-(3/4)*0.918=0.311
Entropy(T ) = Entropy(TAge <= 21.5 )=Entropy([1 ,0 ])= -(1/1)Log2 (1/1) = 0
Entropy(T ) = Entropy(TAge>21.5)=Entropy([1 ,2 ])=-(1/3)log2 (1/ 3) - (2 / 3)log2(2/3)
= 0.918
SplitInfo(T,Tv=21.5) = (1/ 4)*log2 (1/ 4) - (3/ 4)*log2 (3/ 4) = - (1/ 4)*(- 2) - (3/ 4)*( - 0.415) = 0.811
GainRatio(T,Tv=21.5) = Gain(T, T v=21.5) / SplitInfo(T,Tv=21.5) = 0.311/ 0.811 = 0.383
Tương tự xét tại ngưỡng v=33 ta thu được:
GainRatio(T,Tv=33) = 1
GainRatio(T,Tv=53.5) = 0.383
Hình 3.5
Xét các nút con của nút Age:
Các mẫu [1,6] đều thuộc cùng lớp High => nút có tập mẫu là [1,6] là nút lá có nhãn
là High.
Các mẫu [4,7] đều thuộc cùng một lớp Low => nút có tập mẫu là [4,7] là nút lá có
nhãn là Low.
Với nút N2: Các mẫu [2,3,8] thuộc cùng lớp High => N2 là nút lá có nhãn là High.
Với nút N3: Các mẫu [5,9] thuộc cùng lớp Low => N3 là nút lá có nhãn Low. Vậy ta có cây kết quả như hình sau:
Hình 3.6