Nhận tầm quan trọng của tính năng đối với các khu rừng ngẫu nhiên bằng Python và Scikit-Tìm hiểu thông tin dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Nhận được tầm quan trọng của tính năng cho các khu rừng ngẫu nhiên với Python và Scikit-Learn

Giới thiệu

Sản phẩm Rừng ngẫu nhiên thuật toán là một thuật toán học tập có giám sát dựa trên cây sử dụng một tập hợp các dự đoán của nhiều cây quyết định, để phân loại một điểm dữ liệu hoặc xác định giá trị gần đúng của nó. Điều này có nghĩa là nó có thể được sử dụng để phân loại hoặc hồi quy.

Khi áp dụng để phân loại, lớp của điểm dữ liệu được chọn dựa trên lớp được nhiều cây bình chọn nhất; và khi được áp dụng cho hồi quy, giá trị của điểm dữ liệu là giá trị trung bình của tất cả các giá trị do cây xuất ra.

Một điều quan trọng cần nhớ khi sử dụng Rừng ngẫu nhiên là số lượng cây là một siêu tham số và nó sẽ được xác định trước khi chạy mô hình.

Khi làm việc trong lĩnh vực khoa học dữ liệu, một trong những lý do tại sao mô hình Rừng ngẫu nhiên được chọn cho một dự án cụ thể có thể liên quan đến khả năng nhìn vào các cây được tập hợp và hiểu tại sao một phân loại đã được thực hiện, hoặc tại sao một giá trị đã được đưa ra - giá trị này được gọi là khả năng giải thích.

Xem xét các thuật toán dựa trên cây, việc cố gắng giải thích một mô hình có thể được thực hiện theo một số cách, bằng cách hiển thị và xem xét từng cây (có thể khó nếu mô hình có 200 cây trở lên), sử dụng Giá trị Shapley (hoặc SHAP), xem xét các tính năng được mô hình xem xét nhiều nhất, sử dụng GIỚI HẠN để điều tra các mối quan hệ giữa đầu vào và đầu ra của mô hình, v.v. Thông thường, sự kết hợp của tất cả các phương pháp được sử dụng.

Trong hướng dẫn nhanh này, chúng tôi sẽ tập trung vào việc tạo biểu đồ về các đặc điểm được coi là quan trọng để mô hình đưa ra quyết định khi phân loại chim cánh cụt. Điều này được gọi là điều tra tầm quan trọng của tính năng, và có thể được truyền đạt cho các thành viên khác của nhóm (phi kỹ thuật và phi kỹ thuật) để cung cấp cái nhìn sơ lược về cách đưa ra quyết định.

Để thực hiện việc này, hãy nhập các thư viện cần thiết, tải tập dữ liệu Palmer Penguins, chia nhỏ dữ liệu, tạo mô hình, lấy các nhập tính năng và sử dụng Seaborn để vẽ chúng! Chúng tôi sẽ không nghiên cứu nhiều về dữ liệu, EDA hoặc bản thân mô hình - đó là chủ đề của hướng dẫn chuyên dụng.

Lưu ý: Bạn có thể tải xuống tập dữ liệu từ GitHub hoặc trực tiếp từ mã.

Nhập thư viện

Hãy bắt đầu bằng cách nhập một vài thư viện mà chúng ta sẽ sử dụng:


import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier


raw_data_url = "https://gist.githubusercontent.com/cassiasamp/197b4e070f5f4da890ca4d226d088d1f/raw/38c9d4906ed121481b4dc201fa2004f2b3d0065f/penguins.csv"
df = pd.read_csv(raw_data_url)

Tách dữ liệu

Hãy chia nhỏ dữ liệu để đào tạo và thử nghiệm:


df = df.dropna().drop("rowid", axis=1)


y = df["species"]
X = df[["bill_length_mm", "bill_depth_mm", "flipper_length_mm"]]


X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

Đạt được tầm quan trọng của tính năng

Cuối cùng - chúng ta có thể đào tạo một mô hình và xuất các tính năng nhập khẩu với:


rf = RandomForestClassifier()


rf.fit(X_train, y_train)


rf.feature_importances_

Kết quả này cho ra:

array([0.41267633, 0.30107056, 0.28625311])

Đó là các giá trị tính năng, để xem tên tính năng, hãy chạy:


rf.feature_names_in_

Điều này dẫn đến tên tương ứng của từng đối tượng địa lý:

array(['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm'],
      dtype=object)

Điều này có nghĩa là tính năng quan trọng nhất để quyết định các lớp peguin cho mô hình cụ thể này là bill_length_mm!

Tầm quan trọng liên quan đến thước đo mức độ dữ liệu được phân tách trong mỗi lần tách nút - trong trường hợp này, thước đo được đưa ra bởi Chỉ số Gini - giá trị gini sau đó được tính theo số hàng đã được tách ra khi sử dụng bill_length_mm tính năng và tính trung bình trên 100 cây trong quần thể. Kết quả của các bước đó giải thích cho 0.41267633, hoặc hơn 40% trong trường hợp này.

Hình dung tầm quan trọng của tính năng

Một cách phổ biến để biểu thị các giá trị quan trọng là sử dụng cuộc trò chuyện thanh. Trước tiên, hãy tạo một khung dữ liệu với tên các đối tượng địa lý và các mục nhập tương ứng của chúng, sau đó trực quan hóa chúng bằng cách sử dụng Seaborn's barplot():


importances_df = pd.DataFrame({"feature_names" : rf.feature_names_in_, 
                               "importances" : rf.feature_importances_})
                             

g = sns.barplot(x=importances_df["feature_names"], 
                y=importances_df["importances"])
g.set_title("Feature importances", fontsize=14);                          

Khuyên bảo: Một thực hành tốt khi trình bày thông tin là sắp xếp các giá trị theo thứ tự tăng dần hoặc giảm dần. Trong trường hợp này, dữ liệu đã được sắp xếp thứ tự, với giá trị đầu tiên là giá trị đầu tiên chúng ta muốn biết. Trong trường hợp này, bạn có thể đặt hàng khung dữ liệu với sort_values. Điều này có thể được thực hiện trên bất kỳ cột nào theo thứ tự tăng dần hoặc giảm dần: importances_df.sort_values(by="importances", ascending=False).

Khi nhìn vào cốt truyện đầu tiên này, thật khó để diễn giải giá trị tầm quan trọng của từng tính năng. Rõ ràng là chiều dài hóa đơn lớn hơn hai thanh còn lại, nhưng không chính xác rằng bill_depth_mm tương đương với 0.30107056và đó là flipper_length_mm là 0.28625311. Vì vậy, biểu đồ đầu tiên này có thể được cải thiện bằng cách hiển thị giá trị của mỗi thanh. Điều này có thể được thực hiện bằng cách truy cập Seaborn's containers sự vật. Nó lưu trữ thông tin từng thanh và chuyển các giá trị dưới dạng nhãn thanh:

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

Nhận tầm quan trọng của tính năng đối với các khu rừng ngẫu nhiên bằng Python và Scikit-Tìm hiểu thông tin dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Bây giờ, chúng ta có thể thấy từng giá trị quan trọng một cách rõ ràng, hoặc gần như rõ ràng, bởi vì bill_length_mm giá trị đang bị cắt bởi một đường thẳng đứng là một phần của đường viền bên ngoài biểu đồ. Các đường viền được sử dụng để bao quanh một khu vực như một phương tiện để tập trung sự chú ý hơn vào nó, nhưng trong trường hợp này, chúng ta không cần bao quanh, vì chỉ có một biểu đồ. Hãy xóa đường viền và cải thiện khả năng đọc của các con số:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
                

sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

Nhận tầm quan trọng của tính năng đối với các khu rừng ngẫu nhiên bằng Python và Scikit-Tìm hiểu thông tin dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Biểu đồ có vẻ dễ đọc hơn, nhưng các dấu tích trên trục X dường như đang trôi nổi và chúng tôi đã có các giá trị cùng với các thanh, vì vậy chúng tôi có thể xóa xticks:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
sns.despine(bottom=True, left=True)


g.set(xticks=[])
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

Nhận tầm quan trọng của tính năng đối với các khu rừng ngẫu nhiên bằng Python và Scikit-Tìm hiểu thông tin dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Lưu ý rằng sau khi loại bỏ dấu tích, nhãn Y và X hơi khó đọc. Nhãn Y, feature_names, thẳng đứng và trong trục X, chỉ có importances. Vì tiêu đề đã nói rằng biểu đồ là của Tính năng nhập khẩu, chúng tôi cũng có thể xóa các nhãn trục:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])


g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value)

Nhận tầm quan trọng của tính năng đối với các khu rừng ngẫu nhiên bằng Python và Scikit-Tìm hiểu thông tin dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Bạn có thể thấy biểu đồ này rõ ràng hơn, dễ đọc và dễ hiểu khi so sánh với biểu đồ đầu tiên. Vẫn còn một số điều chúng ta có thể làm. Quan sát rằng các con số thực sự gần với các vạch, sẽ dễ đọc hơn nếu có thêm một chút khoảng trống giữa chúng.

Một yếu tố khác trong cốt truyện này là màu sắc, khi các màu tương phản được sử dụng, nó truyền tải ý tưởng về sự tách biệt, ngược lại, khi các màu tương tự được sử dụng, chúng truyền tải ý tưởng về sự thống nhất hoặc các phần của tổng thể. Vì tất cả các tính năng đều là một phần của chim cánh cụt, chúng tôi có thể sử dụng màu sắc làm cho mỗi thanh trở nên khác biệt trong khi duy trì sự thống nhất:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names",
                
                
                palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value, 
                padding=2) 

Nhận tầm quan trọng của tính năng đối với các khu rừng ngẫu nhiên bằng Python và Scikit-Tìm hiểu thông tin dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Nếu bạn muốn làm cho kết quả trực tiếp hơn, bạn có thể thay đổi tiêu đề và thêm phần kết luận. Điều được biết là độ dài hóa đơn được coi là đặc điểm quan trọng nhất theo các tiêu chí mà chúng ta đã thảo luận trước đây. Đây có thể là thông tin đầu tiên cho một người nào đó nhìn vào cốt truyện, chúng tôi có thể nói rằng chiều dài mỏ của chim cánh cụt là đặc điểm quan trọng nhất để phân loại loài trong mô hình cơ sở Rừng ngẫu nhiên (RF) :

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names", 
                palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("The penguin's bill length was the most important feature for species classification (RF base model)", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value, padding=2)

Đây là kết quả cuối cùng của biểu đồ nhập tính năng:

Nhận tầm quan trọng của tính năng đối với các khu rừng ngẫu nhiên bằng Python và Scikit-Tìm hiểu thông tin dữ liệu PlatoBlockchain. Tìm kiếm dọc. Ái.

Kết luận

Trong hướng dẫn này - chúng tôi đã xây dựng Bộ phân loại rừng ngẫu nhiên - và kiểm tra các điểm nhập của tính năng được sử dụng để đào tạo mô hình nhằm cố gắng giải thích những gì một mô hình đã học được và những gì ảnh hưởng đến lý luận của nó.

Dấu thời gian:

Thêm từ xếp chồng lên nhau