Với nhu cầu thiết thực đó chúng em đã chọn đề tài " Ứng dụng thuật toán cây quyết địnhcho bài toán phân lớp trong xác định khả năng huy động vốn của ngân hàng thông qua tiền gửi có kỳ hạ
Trang 1ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC KINH TẾ KHOA THỐNG KÊ - TIN HỌC
Trang 2Đà Nẵng, tháng 8 năm 2012
LỜI CAM ĐOAN
Em xin cam đoan nội dung trong đề tài này là do em thực hiện dưới sự hướng dẫn trựctiếp của thầy Nguyễn Văn Chức
Mọi tham khảo dùng trong đề tài này đều được trích dẫn rõ ràng tên tác giả
Mọi sao chép không hợp lệ vi phạm quy chế đào tạo em xin chịu hoàn toàn trách nhiệm
Sinh viên thực hiện
Lê Thị Tường Vi
Hà Thị Sau
Trang 3LỜI MỞ ĐẦU
Trong những năm gần đây, việc nắm bắt được thông tin được coi là chìa khóa củakinh doanh Ai thu thập, phân tích và hiểu được thông tin và hành động được nhờ vào nhữngthông tin đó là kẻ thắng cuộc trong thời đại thông tin này Chính vì vậy, việc tạo ra thông tin
và mức tiêu thụ thông tin ngày nay ngày càng gia tăng
Cùng với chức năng khai thác có tính chất tác nghiệp, việc khai thác các cơ sở dữ liệu(CSDL) phục vụ các yêu cầu trợ giúp quyết định ngày càng có ý nghĩa quan trọng và là nhucầu to lớn trong mọi lĩnh vực hoạt động kinh doanh, quản lý Dữ liệu được thu thập và lưutrữ ngày càng nhiều nhưng người ra quyết định trong quản lý, kinh doanh lại cần nhữngthông tin bổ ích, những “tri thức” rút ra từ nguồn dữ liệu đó hơn là chính những dữ liệu đócho việc ra quyết định của mình
Các nhu cầu đó đã được biết đến từ lâu nhưng mới thực sự bùng nổ từ thập niên 90này Do đó, những năm gần đây đã phát triển mạnh mẽ một loạt các lĩnh vực nghiên cứu về
tổ chức các kho dữ liệu và kho thông tin (data warehouse, information warehouse), các hệ trợgiúp quyết định, các phương pháp phát hiện tri thức và khai phá dữ liệu (data mining) Trong
đó, khai phá dữ liệu và phát hiện tri thức đã trở thành một lĩnh vực nghiên cứu sôi động, thuhút sự quan tâm của rất nhiều người trên khắp các lĩnh vực khác nhau như các hệ cơ sở dữliệu, thống kê, chiết xuất thông tin, nhận dạng, học máy, trí tuệ nhân tạo, v.v
Chúng ta đang sống trong thế giới thừa thông tin thiếu tri thức – đó là nhận định củanhiều người trong thời đại bùng nổ thông tin hiện nay
Hàng ngày, chúng ta tiếp nhận nhiều thông tin từ nhiều nguồn khác nhau, kho dữ liệucủa các doanh nghiệp ngày càng lớn dần Trong khi đó, việc khai thác tri thức từ những kho
dữ liệu đó chưa được quan tâm đúng mức Kho dữ liệu phần lớn chỉ được sử dụng để xâydựng các báo cáo mang tính thống kê Trong những năm gần đây, Khai phá tri thức từ dữ liệu(Knowledge Discovery in Database - KDD) và khai phá dữ liệu (Data Mining- DM) đượcxem như một cách tiếp cận mới trong việc tìm kiếm tri thức từ dữ liệu Sử dụng phương phápkhai phá tri thức từ dữ liệu để dự đoán rủi khả năng gửi tiền có kỳ hạn của khách hạn là mộtphương pháp mới nhằm nâng cao khả năng huy động vốn của Ngân hàng
Trang 4Với nhu cầu thiết thực đó chúng em đã chọn đề tài " Ứng dụng thuật toán cây quyết định
cho bài toán phân lớp trong xác định khả năng huy động vốn của ngân hàng thông qua
tiền gửi có kỳ hạn của khách hàng”
Nội dung nghiên cứu gồm 3 phần
Phần 1 : Tổng quan về khai phá dữ liệu
Phần 2 : Giới thiệu kỹ thuật phân lớp trong khai phá dữ liệu
Phần 2 : Triển khai ứng dụng phân lớp dữ liêu
Trong quá trình hoàn thành đề tài chúng em đã gặp phải một số khó khăn do việc tìm hiểu kỹ thuậtkhai phá dữ liệu còn mới mẻ, khối lượng kiến thức trong lĩnh vực khai phá dữ liệu còn nhiều vàliên tục được cập nhật nên chắc chắn không tránh khỏi những sai sót Kính mong sự đóng góp ýkiến của thầy giáo để chúng em cố gắng hoàn thiện tốt hơn
Trang 5CHƯƠNG 1 Tổng quan về khai phá dữ liệu
I Khai phá dữ liệu (Data Mining)
Khai phá dữ liệu (Data mining) là một khái niệm ra đời vào những năm cuối của thập kỷ
80 Nó bao hàm một loạt các kỹ thuật nhằm phát hiện ra các thông tin có giá trị tiềm ẩn trong cáctập dữ liệu lớn trong thực tế Về bản chất, khai phá dữ liệu liên quan đến việc phân tích các dữliệu và sử dụng các kỹ thuật để tìm ra các mẫu hình có tính chính quy (regularities) từ các tập dữliệu lớn nhằm mục đích dự đoán các xu thế, các hành vi trong tương lai, hoặc tìm kiếm nhữngtập thông tin hữu ích mà bình thường không thể nhận diện được Năm 1989, Fayyad, Piatestsky-Shapiro và Smyth đã dùng khái niệm Phát hiện tri thức trong cơ sở dữ liệu (KnowledgeDiscovery in Database-KDD) để chỉ toàn bộ quá trình phát hiện các tri thức có ích từ các tập dữliệu lớn Trong đó, khai phá dữ liệu là một bước đặc biệt trong toàn bộ quá trình, sử dụng cácgiải thuật đặc biệt để chiết xuất ra các mẫu (pattern) hay các mô hình từ dữ liệu
" Khai phá dữ liệu là một quá trình khám phá các thông tin hữu ích từ các tập dữ liệu lớn,
sử dụng phân tích toán học để lấy được các mẫu và các xu hướng tồn tại trong dữ liệu mà thông thường những mẫu này không thể có được bằng khai thác dữ liệu truyền thống bởi vì các mối quan hệ quá phức tạp và lượng dữ liệu quá lớn "
Khai phá dữ liệu nhấn mạnh hai khía cạnh chính đó là khả năng trích xuất thông tin có ích
tự động (Automated) và bán tự động (Semi - Automated) mang tính dự đoán (Predictive) Khaiphá dữ liệu là một lĩnh vực liên ngành, liên quan chặt chẽ đến các lĩnh vực sau:
Statistics (Thống kê) : là một số đo cho một thuộc tính nào đó của một tập mẫu Mỗi giá trịthống kê được tính bằng một hàm nào đó và thông tin của môt thống kê mang tính đại diệncho thông tin của tập mẫu mang lại
Machine Learning (Máy học): là một phương pháp để tạo ra các chương trình máy tính bằngviệc phân tích các tập dữ liệu Máy học có liên quan lớn đến thống kê, vì cả hai lĩnh vực đềunghiên cứu việc phân tích dữ liệu, nhưng khác với thống kê, học máy tập trung vào sự phứctạp của các giải thuật trong việc thực thi tính toán
Databases technology (Công nghệ cơ sở dữ liệu): kho thông tin về một chủ đề, được tổ chức hợp
lý để dễ dàng quản lý và truy tìm
Visualization (Sự trực quan): Biểu diễn giúp dữ liệu dễ hiểu, dễ sử dụng, thuận tiện cho việc tạocác báo cáo, tìm ra các tri thức phục vụ việc ra quyết định và dự đoán của nhà quản lý
Trang 6II Quy trình khai phá dữ liệu
Quy trình khai phá dữ liệu là một chuỗi lặp và tương tác gồm các bước (giai đoạn)bắt đầu với dữ liệu thô (raw data) và kết thúc với tri thức (Knowledge of interest) đáp ứngđược sự quan tâm của người sử dụng
Hình 1.3 Quy trình khai phá dữ liệu.
1 Data cleaning (làm sạch dữ liệu): Là quá trình loại bỏ nhiễu và những phần tử dữ liệu không
nhất quán
2 Data integration (tích hợp dữ liệu): Là quá trình tích hợp dữ liệu từ nhiều nguồn khác nhau
vào một kho dữ liệu
3 Data selection (lựa chọn dữ liệu): Là quá trình trích chọn dữ liệu liên quan đến nhiệm vụ
phân tích được lấy từ cơ sở dữ liệu
4 Data transformation (biến đổi dữ liệu): Là quá trình chuyển đổi dữ liệu, nơi dữ liệu được
hợp nhất thành các dạng thích hợp cho việc khai phá
5 Data mining ( khai phá dữ liệu): Là quá trình chính yếu nơi mà các kỹ thuật khai phá được
sử dụng để phát hiện ra các mẫu (patterns)
6 Pattern evalution (đánh giá mẫu): Quá trình này xác định các mô hình thực sự cần thiết đại
diện cho tri thức (Knowledge) dựa trên các interstingness measures (tính dễ hiểu, phù hợp,hữu ích )
7 Knowledge presentation (biểu diễn tri thức): Là quá trình sử dụng các công cụ trực quan hóa
và các kỹ thuật biểu diễn tri thức để trình bày các tri thức được khai phá cho người sử dụng
Trang 7Các quá trình từ 1 đến 4 là những hình thức khác nhau của quá trình tiền xử lý dữ liệu
(preprocessing), nơi mà dữ liệu được chuẩn bị trước khi đưa vào quá trình khai phá
III Quy trình xây dựng mô hình khai phá dữ liêu (Data Mining Model)
Việc thực hiện một DMM với đầy đủ 4 bước công việc chính của quá trình khai phá dữ liệu là :
Bước 1: Chuẩn bị dữ liệu (Data Preparation); Trong bước này chúng ta thực hiện các công
việc tiền xử lý dữ liệu theo yêu cầu của mô hình như trích chọn thuộc tính, rời rạc hóa dữliệu và cuối cùng là chia dữ liệu nguồn (Data Source) thành 2 tập dữ liệu dùng để huấnluyện mô hình (Training Data) và kiểm tra mô hình (Testing data)
Bước 2: Xây dựng mô hình (Data Modeling); ta sử dụng Training Data vừa tạo ra để xây
dựng mô hình
Bước 3: Đánh giá mô hình (Validation); Sau khi sử dụng Training Data để xây dựng mô
hình, bây giờ ta sử dụng Testing Data để kiểm tra xem mô hình có đủ tốt để sử dụng haykhông? (Nếu chưa đủ tốt thì phải sử dụng Training Data khác để huấn luyện lại) Có 3 kỹthuật chính để kiểm tra mô hình đó là sử dụng Accuracy Chart (Lift Chart), ClassificationMatrix và Profit Chart
Bước 4: Sử dụng mô hình để dự đoán dự liệu trong tương lai (Model Usage); Sau khi mô
hình được kiểm tra (Testing) nếu độ chính xác đáp ứng yêu cầu thì có thể sử dụng model đãxây dựng vào dự đoán các dữ liệu chưa biết
Hình 1.4 Quy trình xây dựng mô hình khai phá dữ liệu.
Trang 8CHƯƠNG 2 Giới thiệu kỹ thuật phân lớp trong khai phá dữ liệu I.Giới thiệu bài toán phân lớp
Phân lớp (Classification) là tập các phương pháp tìm cách xếp các đối tượng vào các lớp đã biếttrước
Dữ liệu của bài toán phân lớp có dạng:
(x,y) = (x1,x2,x3 ,xk,y)
Trong đó:
- x1,x2,x3 ,xk là các thuộc tính đầu vào của đối tượng ( hay gọi là biến độc lập)
- y là lớp các đối tượng (biến phụ thuộc)
Ví dụ mô hình phân lớp dự báo thời tiết có thể cho biết thời tiết ngày mai là mưa hay nắng (biếnphụ thuộc) dựa vào các thông số hay các biến độc lập như độ ẩm, sức gió, nhiệt độ Haytrong lĩnh vực ngân hàng, để biết khách hàng có kế hoạch trả nợ hay không, ngân hàng sẽdựa vào các thuộc tính như tuổi, nghề nghiệp, thu nhập hàng tháng v,v
II.Ứng dụng kỹ thuật cây quyết định trong phân lớp dữ liệu
Cây quyết định (Decision Tree) là một cây phân cấp có cấu trúc được dùng để phân lớp các đốitượng dựa vào dãy các luật (series of rules).Các thuộc tính của đối tượng (ngoại trừ thuộctính phân lớp – Category attribute) có thể thuộc các kiểu dữ liệu khác nhau (Binary,
Nominal, ordinal, quantitative values) trong khi đó thuộc tính phân lớp phải có kiểu dữ liệu
là Binary hoặc Ordinal Tóm lại, cho dữ liệu về các đối tượng gồm các thuộc tính cùng vớilớp (classes) của nó, cây quyết định sẽ sinh ra các luật để dự đoán lớp của các đối tượngchưa biết (unseen data)
Ta có ví dụ như sau; dữ liệu (training data) về 10 đối tượng (người) Mỗi đối tượng được mô tả
bởi 4 thuộc tính là Gender, Car Ownership, Travel Cost/Km, Income Level và 1 thuộc tính phân loại (category attribute) là Transportation mode Trong đó thuộc tính Gender có
kiểu binary, thuộc tính Car Ownership có kiểu Quantitative integer (0,1), Travel Cost/Km
và Income Level có kiểu dữ liệu Ordinal.+
Trang 9Gender Car ownership Travel Cost
($)/km
Income Level Transportation mode
Female 1 Cheap Medium Train
Male 0 Standard Medium Train
Female 1 Standard Medium Train
Female 1 Expensive High Car
Male 2 Expensive Medium Car
Female 2 Expensive High Car
Dựa vào training test trên, ta xây dựng được cây quyết định:
Hình 2.1 Cây quyết định
Chúng ta bắt đầu từ node gốc của cây (root node) từ thuộc tính Travel Cost/Km, ta thấy rằng nếu
Travel Cost/Km là Expensive thì người đó sẽ chọn phương tiện là Car Nếu Travel
Cost/Km là standard thì họ sẽ chọn phương tiện vận chuyển là Train Nếu Travel Cost/Km
Trang 10là Cheap thì cây quyết định cần tới giá trị của trường Gender của người đó, nếu Gender là
Male thì chọn Bus, nếu giới tính là Female thì cây quyết định cần kiểm tra xem người đó có
sử hữu bao nhiêu xe hơi (Car Ownership) Nếu số xe hơi sở hữu là 0 thì người đó sẽ chọn xe
Bus, nếu số xe hơi sở hữu là 1 thì người đó sẽ chọn Train.
Theo cây quyết định trên, các luật (Series of Rules) được sinh ra từ cây quyết định dùng để dựđoán như sau:
Rule 1 : If Travel cost/km is expensive then mode = car
Rule 2 : If Travel cost/km is standard then mode = train
Rule 3 : If Travel cost/km is cheap and gender is male then mode = bus
Rule 4 : If Travel cost/km is cheap and gender is female and she owns no car then mode = bus Rule 5 : If Travel cost/km is cheap and gender is female and she owns 1 car then mode = train
Dựa vào các luật này, việc dự đoán lớp cho các dữ liệu chưa biết (unseen data hay Testing data)
rất đơn giản Trong ví dụ này, Alex có giá trị của thuộc tính Travel Cost/Km là Standard nên sẽ chọn phương tiện là Train (Rule 2) mà không cần quan tâm đến các thuộc tính khác của Alex Buddy có giá trị của thuộc tính Travel Cost/Km là Cheap và Gender của anh ta
là Male nên anh ta sẽ chọn Bus (Rule 3) Cheery cũng có giá trị thuộc tính Travel Cost/Km
là Cheap nhưng Gender là Female và sở hữu 1 xe hơi cho nên theo cây quyết định trên
(Rule 5) cô ta sẽ chọn phương tiện là Train.
Có rất nhiều thuật toán phân lớp như ID3, J48, C4.5, CART (Classification and RegressionTree),…Việc chọn thuật toán nào để có hiệu quả phân lớp cao tùy thuộc vào rất nhiều yếu
tố, trong đó cấu trúc dữ liệu ảnh hưởng rất lớn đến kết quả của các thuật toán Chẳn hạn nhưthuật toán ID3 và CART cho hiệu quả phân lớp rất cao đối với các trường dữ liệu số
(quantitative value) trong khi đó các thuật toán như J48, C4.5 có hiệu quả hơn đối với các
dữ liệu Qualititive value (ordinal, Binary, nominal)
III.Thuật toán xây dựng cây quyết định ID3
Thuật toán ID3 là thuật toán phân lớp dữ liệu dựa trên cây quyết định hiệu quả và phổ biến trongnhững ứng dụng khai phá cơ sở dữ liệu có kích thước nhỏ được phát minh bởiJ.RossQuinlanvào năm 1979.Thuật toán ID3 sử dụng thông tin lý thuyết phát minh bởiShannon trong năm 1948, xây dựng cây quyết định từ trên xuống dưới Gain Infomationđược sử dụng để chọn các thuộc tính hữu ích nhất để phân loại
Trang 11Nếu có n thông điệp có thể xảy ra, thì xác suất p của 1/n và thông tin chuyển tải của một thôngđiệp là
-log2 (p) = log2 (n)
Ví dụ, nếu có 16 tin nhắn, thì ta có log2(16)=4 và chúng ta cần 4 bit để xác định mỗi thông điệp
Nói chung, chúng ta đưa ra một phân bố xác suất P=(p1, p2, , pn) thì các thông tin chuyển tảibởi phân phối , còn được gọi là Entropy của P là:
I(P) = -(p1*log2(p1) + p2*log2(p2) + + pn*log2(pn))
Ví dụ, nếu P là (0.5, 0.5) thì
I(P)= -(0.5*log2(0.5)+ 0.5*log2(0.5)) =1
Nếu P là (0.67, 0.33) thì I(P) là 0.92, nếu P là (1, 0) thì I(P) là 0
Nếu một tập hợp T của bản ghi được phân chia thành các lớp đầy đủ C1, C2, , Ck trên giá trị cơbản của thuộc tính phân loại, thì các thông tin cần thiết để xác định các lớp của một phần tửcủa tập hợp T là Info(T) = I(P), trong đó P là phân phối xác suất của vùng (C1, C2, , Ck):
P = (|C1|/|T|, |C2|/|T|, , |Ck|/|T|)
Trong ví dụ Golf (ví dụ minh họa trang 15), chúng ta có
Info(T) = I(9/14, 5/14) = -(9/14*log2(9/14) +5/14*log2(5/14)) =0.94 nếu chúng ta phân vùng
tập hợp T đầu tiên trên giá trị cơ bản của một thuộc tính không phân loại X vào bộ T1, T2 ,
Tn thì các thông tin cần thiết để xác định các lớp của một phần tử của tập hợp T trở thànhtrọng số trung bình của các thông tin cần thiết để xác định các lớp của một phần tử tập Ti,tức là trọng số trung bình của Info(Ti):
Trong trường hợp ví dụ chơi golf vừa rồi, cho thuộc tính Outlook chúng ta có
Info(Outlook,T) = 5/14*I(2/5,3/5) + 4/14*I(4/4,0) + 5/14*I(3/5,2/5)= 0.694
Hãy xem xét tăng số lượng (X,T) được xác định như sau:
Information gain =(information before split) – (information after split)
Gain(X,T) = Info(T) - Info(X,T)
Điều này thể hiện sự khác biệt giữa các thông tin cần thiết để xác định một phần tử của tập hợp
T và các thông tin cần thiết để xác định một phần tử của T sau khi giá trị của thuộc tính X đãthu được, điều này là thông tin đạt được do thuộc tính X
Trong ví dụ vừa qua, cho các thuộc tính Outlook đạt được là
Trang 12Gain(Outlook,T) = Info(T) - Info(Outlook,T) = 0.94 - 0.694 = 0.246.
Nếu chúng ta thay vì xem xét thuộc tính Windy, chúng ta thấy rằng:
Windy:
True (Play: 3, don’t Play: 3)
False (Play: 6, don’t Play: 2)
Info(Windy,T) =6/14*I(3/6,3/6) + 8/14*I(6/8,2/8)=0.892
và Gain(Windy,T) = Info(T)- Info(Windy, T)=0.94-0.892= 0.048.
Vì vậy, Outlook cung cấp được thông tin lớn hơn so với Windy
Chúng ta có thể sử dụng khái niệm này được xếp hạng thuộc tính và xây dựng cây quyết định tạimỗi nút được đặt thuộc tính với tăng lớn nhất trong số các thuộc tính chưa được coi là trongđường dẫn từ gốc
Tư tưởng thuật toán ID3
Các thuật toán ID3 được sử dụng để xây dựng một cây quyết định, cho một tập hợp của cácthuộc tính không phân loại C1,C2, , Cn, C thuộc tính phân loại,và một training set T củacác bản ghi
Function ID3(R, C, S):
Input:
R: một tập hợp các thuộc tính không-phân loại
C: thuộc tính phân loại
S: một training set
Output:
Quay lại cây quyết định
Begin
Nếu S rỗng, quay lại một nút đơn với giá trị Failure;
Nếu S bao gồm tất cả các giá trị tương tự cho các thuộc tính không phân loại, quay lại 1 nút duy
nhất có giá trị đó ;
Nếu R rỗng, thì trả về nút đơn như giá trị thường gặp nhất của các giá trị của các thuộc tính phân
loại được tìm thấy trong bản ghi của S; [Lưu ý rằng sau đó sẽ có lỗi, có nghĩa là, bản ghi sẽkhông đúng phân loại];
Trang 13Cho D là các thuộc tính với Gain(D,S) lớn nhất trong số các thuộc tính của R;
Cho {dj| j=1,2, , m} là giá trị của thuộc tính D;
Cho {Sj| j=1,2, , m} là tập hợp con của S bao gồm bản ghi tương ứng với dj cho thuộc tính D;
Returns Cây với gốc có nhãn D và nhãn vòng cung d1, d2, , dm sẽ tương ứng với các cây ID3(R-{D}, C, S1), ID3(R-{D}, C, S2), , ID3(R-{D}, C, Sm);
end ID3;
Ví dụ minh họa
Chúng ta có dữ liệu mẫu sau: bao gồm 4 thuộc tính là Outlook, Temperature, Humidity, Windy
và 1 thuộc tính phân lớp có chơi hay không chơi tennis (Play?)
Hình 2.2Dữ liệu cho ví dụ minh họa
Trang 14Khi chọn riêng biệt các thuộc tính ta có dữ liệu sau:
Hình 2.3 Các trường hợp của thuộc tính
Thuộc tính Outlook có 3 nhánh là Sunny, overcast và rainy
Thuộc tính Humidity có 2 nhánh là high và normal
Thuộc tính Windy có 2 nhánh là False và True
Thuộc tính Temperature có 2 nhánh là Hot, Mild và Cold
Trong ví dụ đây, ta lấy thuộc tính OUTLOOK ra xét trường hợp
"Outlook" = "Sunny":
info([2,3]) = entropy(2/5,3/5) = -2/5log2(2/5) - 3/5log2(3/5) = 0,971 bits
"Outlook" = "Overcast"
info([4,0]) = entropy(1,0) = -1log2(1) - 0log2(0) = 0 bits
( Log(0) không được xác định nhưng chúng ta ước lượng 0*log(0) như là 0)
"Outlook" = "Rainy"
info([3,2]) = entropy(3/5,2/5) = -3/5log2(3/5) - 2/5log2(2/5) = 0,971 bits
Thông tin được mong đợi cho thuộc tính
info([3,2]),[4,0],[3,2]) = (5/14) x 0,971 + (4/14) x 0 + (5/14) x 0,971 = 0,693 bits
Tính toán giá trị Infomaiton Gain
Info(T) = I(9/14,5/14) = -(9/14*log2(9/14) + 5/14*log2(5/14)) = 0,94
Trang 15 Infomation gain:
(Infomation before split) - (infomation after split)
gain("Outlook") = info([9,5]) - info([2,3],[4,0],[3,2]) = 0,94 -0,693 = 0,247 bits
Infomation gain cho thuộc tính lấy từ dữ liệu weather:
gain("Outlook") = 0,247 bits
gain("Temperature") = 0,029 bits
gain("Humidity") = 0,152 bits
gian("Windy") = 0,048 bits
Tách liên tục ta được như sau:
Hình 2.4 Quá trình tách liên tục cây quyết định
Cây quyết định hoàn chỉnh cuối cùng: