Hướng dẫn này minh họa cách tính tạp chất và mức tăng thông tin trong Python bằng cách sử dụng các mô-đun
probs = fruits.value_counts[normalize=True] probs2 và
probs = fruits.value_counts[normalize=True] probs3 cho máy học dựa trên thông tin. Các phương pháp tính toán tạp chất được mô tả ở đây như sau
- Sự hỗn loạn
- chỉ số Gini
Chúng ta bắt đầu với một ví dụ đơn giản, tiếp theo là ví dụ về Thực vật trong Chương "Học tập dựa trên thông tin" trong sách giáo khoa
Một ví dụ đơn giản
Giả sử bạn đang đi dã ngoại và bạn đang chuẩn bị một giỏ trái cây ngon
Trong 1]
import warnings warnings.filterwarnings["ignore"] import pandas as pd import numpy as np
Trong 2]
lst = ['apple']*3 + ['orange']*2 + ['banana']*2 fruits = pd.Series[lst] print[fruits]
0 apple 1 apple 2 apple 3 orange 4 orange 5 banana 6 banana dtype: object
Đây là tần suất tương đối của từng quả trong rổ, có thể coi đây là phân phối xác suất của các quả
Trong 3]
probs = fruits.value_counts[normalize=True] probs
Ra[3]
apple 0.428571 orange 0.285714 banana 0.285714 dtype: float64
Nếu thích, bạn có thể tự định nghĩa phân phối xác suất như bên dưới
Trong [4]
probs_by_hand = [3/7, 2/7, 2/7] print[probs_by_hand]
________số 8
Nhớ lại rằng mô hình của Shannon định nghĩa entropy là $$H[x]. = - \sum_{i=1}^{\ell}[P[t=i] \times \log_{2}[P[t=i]]$$ Ý tưởng về entropy là a càng không đồng nhất và không tinh khiết đặc điểm là, entropy càng cao. Ngược lại, một tính năng càng đồng nhất và thuần khiết thì entropy càng thấp.
Phép tính sau đây cho thấy cách tính tạp chất của giỏ trái cây này bằng cách sử dụng tiêu chí entropy
Trong [5]
entropy = -1 * np.sum[np.log2[probs] * probs] entropy
Ra[5]
probs = fruits.value_counts[normalize=True] probs0
Chỉ số tạp chất gini được xác định như sau. $$ \mbox{Gini}[x]. = 1 - \sum_{i=1}^{\ell}P[t=i]^{2}$$ Ý tưởng về chỉ số Gini cũng giống như trong entropy theo nghĩa là một tính năng càng không đồng nhất và không tinh khiết thì , chỉ số Gini càng cao
Một thuộc tính hay của chỉ số Gini là nó luôn nằm trong khoảng từ 0 đến 1 và điều này có thể giúp so sánh các chỉ số Gini qua các tính năng khác nhau dễ dàng hơn
Tạp chất của giỏ trái cây của chúng tôi sử dụng chỉ số Gini được tính như sau
Trong [6]
probs = fruits.value_counts[normalize=True] probs1
Ra[6]
lst = ['apple']*3 + ['orange']*2 + ['banana']*2 fruits = pd.Series[lst] print[fruits]0
Để so sánh, hãy tính tạp chất của một rổ quả khác có 7 quả khác nhau với tần suất bằng nhau
Trong [7]
lst = ['apple']*3 + ['orange']*2 + ['banana']*2 fruits = pd.Series[lst] print[fruits]1
lst = ['apple']*3 + ['orange']*2 + ['banana']*2 fruits = pd.Series[lst] print[fruits]2
Ra[7]
lst = ['apple']*3 + ['orange']*2 + ['banana']*2 fruits = pd.Series[lst] print[fruits]3
Trong [8]
lst = ['apple']*3 + ['orange']*2 + ['banana']*2 fruits = pd.Series[lst] print[fruits]4
Ra[8]
lst = ['apple']*3 + ['orange']*2 + ['banana']*2 fruits = pd.Series[lst] print[fruits]5
Trong [9]
lst = ['apple']*3 + ['orange']*2 + ['banana']*2 fruits = pd.Series[lst] print[fruits]6
Ra[9]
lst = ['apple']*3 + ['orange']*2 + ['banana']*2 fruits = pd.Series[lst] print[fruits]7
Đúng như dự đoán, cả chỉ số entropy và Gini của giỏ trái cây thứ hai đều cao hơn giỏ trái cây thứ nhất
Ví dụ thực vật
Bây giờ chúng ta cùng tìm hiểu chi tiết các phép tính tạp chất cho bộ dữ liệu Thực vật ở Chương 5 trong sách giáo khoa
Trước tiên hãy nhập tập dữ liệu từ Đám mây
Trong [10]
lst = ['apple']*3 + ['orange']*2 + ['banana']*2 fruits = pd.Series[lst] print[fruits]8
Ra[10]
suốidốcđộ caothực vật0Dốc sai caochapparal1Đúngtrung bìnhthấp ven sông2Dốc đúngtrung bìnhven sông3Saidốctrung bìnhchapparal4Sai bằng phẳngcaocây lá kim5Truestepcao nhấtcây lá kim6Truestepcaochapparal
Để thuận tiện, chúng tôi định nghĩa một hàm có tên là
probs = fruits.value_counts[normalize=True] probs4 để tính toán tạp chất của một tính năng bằng cách sử dụng chỉ số entropy hoặc gini
Trong [11]
lst = ['apple']*3 + ['orange']*2 + ['banana']*2 fruits = pd.Series[lst] print[fruits]9
0 apple 1 apple 2 apple 3 orange 4 orange 5 banana 6 banana dtype: object0
Hãy tính entropy của tính năng mục tiêu "thực vật" bằng cách sử dụng chức năng mới của chúng tôi
Trong [12]
0 apple 1 apple 2 apple 3 orange 4 orange 5 banana 6 banana dtype: object1
Ra[12]
0 apple 1 apple 2 apple 3 orange 4 orange 5 banana 6 banana dtype: object2
Hãy tính toán mức tăng thông tin cho việc chia nhỏ dựa trên một tính năng mô tả để tìm ra tính năng tốt nhất để chia nhỏ. Đối với nhiệm vụ này, chúng tôi làm như sau
- Tính toán tạp chất của tính năng mục tiêu [sử dụng chỉ số entropy hoặc gini]
- Phân vùng tập dữ liệu dựa trên các giá trị duy nhất của tính năng mô tả
- Tính toán tạp chất cho mỗi phân vùng
- Tính tạp chất còn lại dưới dạng tổng trọng lượng của tạp chất của mỗi phân vùng
- Tính toán mức tăng thông tin dưới dạng chênh lệch giữa tạp chất của tính năng mục tiêu và tạp chất còn lại
Chúng tôi sẽ xác định một chức năng khác để đạt được điều này, được gọi là
probs = fruits.value_counts[normalize=True] probs5
Ví dụ, chúng ta hãy xem các cấp độ của tính năng "độ cao"
Trong [13]
0 apple 1 apple 2 apple 3 orange 4 orange 5 banana 6 banana dtype: object3
Ra[13]
0 apple 1 apple 2 apple 3 orange 4 orange 5 banana 6 banana dtype: object4
Hãy xem các phân vùng trông như thế nào đối với tính năng này và cách tính toán tương ứng đang sử dụng tiêu chí phân chia entropy
Trong [14]
0 apple 1 apple 2 apple 3 orange 4 orange 5 banana 6 banana dtype: object5
0 apple 1 apple 2 apple 3 orange 4 orange 5 banana 6 banana dtype: object6
Ý tưởng ở đây là, đối với mỗi một trong 4 phân vùng dữ liệu ở trên,
- Chúng tôi tính toán tạp chất của chúng đối với tính năng mục tiêu dưới dạng tập dữ liệu độc lập
- Chúng tôi cân nhắc các tạp chất này với số lượng quan sát tương đối trong mỗi phân vùng. Số lượng quan sát tương đối được tính bằng số lượng quan sát trong phân vùng chia cho tổng số quan sát trong toàn bộ tập dữ liệu. Chẳng hạn, trọng số của phân vùng đầu tiên là 3/7
- Chúng tôi cộng các tạp chất có trọng lượng này và gọi nó là tạp chất còn lại cho tính năng này
Chẳng hạn, tạp chất còn lại được đo bằng entropy cho tính năng độ cao là 0. 918 x [3/7] + 1. 0 x [2/7] = 0. 679
Mức tăng thông tin sau đó được tính là 1. 557 - 0. 679 = 0. 878
Bây giờ chúng tôi đã sẵn sàng để xác định chức năng của chúng tôi. Có một chút mã hóa ở đây, nhưng chúng tôi có thể đảm bảo với bạn rằng việc cố gắng tìm hiểu cách mọi thứ hoạt động ở đây sẽ rất bổ ích để cải thiện kỹ năng lập trình Python của bạn
Trong [15]
0 apple 1 apple 2 apple 3 orange 4 orange 5 banana 6 banana dtype: object7
Bây giờ chức năng của chúng tôi đã được xác định, chúng tôi sẽ gọi nó cho từng tính năng mô tả trong tập dữ liệu. Trước tiên, hãy gọi nó bằng cách sử dụng tiêu chí phân chia entropy
Trong [16]
0 apple 1 apple 2 apple 3 orange 4 orange 5 banana 6 banana dtype: object8
0 apple 1 apple 2 apple 3 orange 4 orange 5 banana 6 banana dtype: object9
Bây giờ, hãy gọi nó bằng cách sử dụng tiêu chí phân chia chỉ số gini
Trong [17]
probs = fruits.value_counts[normalize=True] probs0
probs = fruits.value_counts[normalize=True] probs1
Chúng tôi quan sát thấy rằng, với cả tiêu chí phân chia chỉ số entropy và gini, mức thu được thông tin cao nhất xảy ra với tính năng "độ cao"
Đây là phần tách tại nút gốc của cây quyết định tương ứng. Trong các lần phân tách tiếp theo, quy trình trên được lặp lại với tập hợp con của toàn bộ tập dữ liệu trong nhánh hiện tại cho đến khi đạt được điều kiện kết thúc