Hướng dẫn dứt khoát về thuật toán rừng ngẫu nhiên với Python và Scikit-Learn PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Hướng dẫn dứt khoát về thuật toán rừng ngẫu nhiên với Python và Scikit-Learn

Giới thiệu

Thuật toán Random Forest là một trong những thuật toán linh hoạt, mạnh mẽ và được sử dụng rộng rãi nhất để phân loại và hồi quy, được xây dựng như một tập hợp các cây quyết định.

Nếu bạn không quen thuộc với những điều này – đừng lo lắng, chúng tôi sẽ đề cập đến tất cả các khái niệm này.

Trong hướng dẫn thực hành chuyên sâu này, chúng ta sẽ xây dựng một trực giác về cách cây quyết định hoạt động, cách tập hợp tăng cường các bộ phân loại và bộ hồi quy riêng lẻ, rừng ngẫu nhiên là gì và xây dựng bộ phân loại và bộ hồi quy rừng ngẫu nhiên bằng Python và Scikit-Learn, thông qua một dự án nhỏ từ đầu đến cuối và trả lời câu hỏi nghiên cứu.

Hãy xem xét rằng bạn hiện đang là thành viên của một nhóm nghiên cứu đang phân tích dữ liệu về phụ nữ. Nhóm đã thu thập 100 bản ghi dữ liệu và mong muốn có thể sắp xếp những bản ghi ban đầu đó bằng cách chia phụ nữ thành các nhóm: đang mang thai hoặc không mang thai và sống ở nông thôn hay thành thị. Các nhà nghiên cứu muốn biết có bao nhiêu phụ nữ trong mỗi hạng mục.

Có một cấu trúc tính toán thực hiện chính xác điều đó, đó là cây kết cấu. Bằng cách sử dụng cấu trúc cây, bạn sẽ có thể biểu diễn các bộ phận khác nhau cho từng danh mục.

Cây quyết định

Làm thế nào để bạn điền vào các nút của một cây? Đây là đâu cây quyết định đi vào trọng tâm.

Đầu tiên, chúng ta có thể chia hồ sơ theo thời kỳ mang thai, sau đó, chúng ta có thể chia chúng theo nơi sống ở thành thị hay nông thôn. Lưu ý rằng chúng ta có thể thực hiện điều này theo một thứ tự khác, ban đầu chia theo khu vực phụ nữ sống và sau đó chia theo tình trạng mang thai của họ. Từ đó, chúng ta có thể thấy rằng cây có một hệ thống phân cấp vốn có. Bên cạnh việc tổ chức thông tin, một cây tổ chức thông tin theo cách phân cấp – thứ tự mà thông tin xuất hiện quan trọng và kết quả là dẫn đến các cây khác nhau.

Dưới đây, là một ví dụ về cây đã được mô tả:

Trong hình cái cây có 7 ô vuông, ô trên cùng chiếm tổng số 100 phụ nữ, ô trên cùng này được nối với 78 ô bên dưới, chia số phụ nữ theo số lượng 22 người không có thai và 45 người có thai, và từ cả hai hình vuông trước đó có bốn hình vuông; hai kết nối với mỗi ô vuông phía trên phân chia phụ nữ dựa trên khu vực của họ, đối với người không mang thai, 33 người sống ở khu vực thành thị, 14 người ở khu vực nông thôn và đối với người mang thai, 8 người sống ở khu vực nông thôn và XNUMX người sống ở khu vực thành thị. Chỉ cần nhìn vào cây, bạn có thể dễ dàng hiểu được sự phân chia đó và xem mỗi “lớp” được dẫn xuất từ ​​những lớp trước như thế nào, những lớp đó chính là cây niveaux, các mức mô tả chiều sâu của cây:

Hướng dẫn dứt khoát về thuật toán rừng ngẫu nhiên với Python và Scikit-Learn PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Quan sát trong hình trên, cấp độ cây đầu tiên là mức 0 nơi chỉ có một hình vuông, tiếp theo là mức 1 nơi có hai hình vuông, và mức 2 nơi có bốn hình vuông. Đây là một độ sâu 2 cây.

Ở mức 0 là hình vuông bắt nguồn từ cây, cái đầu tiên, được gọi là Nút gốc, gốc này có hai nút con ở cấp độ 1, đó là nút cha đến bốn nút ở cấp độ 2. Hãy xem rằng “các ô vuông” mà chúng ta đã đề cập cho đến nay, thực sự được gọi là các nút; và mỗi nút trước đó là cha của các nút sau, đó là con của nó. Các nút con của mỗi cấp có cùng nút cha được gọi là anh chị em ruột, như có thể thấy trong hình ảnh tiếp theo:

Hướng dẫn dứt khoát về thuật toán rừng ngẫu nhiên với Python và Scikit-Learn PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Trong hình ảnh trước, chúng tôi cũng hiển thị mức 1 là các nút bên trong, một khi chúng nằm giữa nút gốc và nút cuối cùng, đó là nút nút lá. Các đốt lá là phần cuối cùng của cây, nếu chúng ta muốn biết trong 100 phụ nữ ban đầu, có bao nhiêu người đang mang thai và sống ở nông thôn, chúng ta có thể làm điều này bằng cách nhìn vào lá. Vì vậy, con số ở những chiếc lá sẽ trả lời câu hỏi nghiên cứu đầu tiên.

Nếu có hồ sơ mới về phụ nữ và cây trước đây được sử dụng để phân loại họ, giờ được sử dụng để quyết định xem một phụ nữ có thể hoặc không thể tham gia nghiên cứu hay không, liệu nó có còn hoạt động không? Cây sẽ sử dụng các tiêu chí tương tự và một phụ nữ sẽ có thể tham gia nếu đang mang thai và sống ở khu vực nông thôn.

Hướng dẫn dứt khoát về thuật toán rừng ngẫu nhiên với Python và Scikit-Learn PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Nhìn vào hình trên, chúng ta có thể thấy rằng câu trả lời cho các câu hỏi của từng nút cây – “cô ấy có phải là người tham gia không?”, “cô ấy có thai không?”, “cô ấy có sống ở vùng nông thôn không?” - là có, vâng, và vâng, vì vậy có vẻ như cái cây có thể dẫn đến quyết định, trong trường hợp này, rằng người phụ nữ có thể tham gia vào cuộc nghiên cứu.

Đây là bản chất của cây quyết định trong, được thực hiện một cách thủ công. Sử dụng Học máy, chúng tôi có thể xây dựng một mô hình tự động xây dựng cây này cho chúng tôi, theo cách đó để tối đa hóa độ chính xác của các quyết định cuối cùng.

Lưu ý: có một số loại cây trong Khoa học máy tính, chẳng hạn như cây nhị phân, cây tổng quát, cây AVL, cây splay, cây đỏ đen, cây b, v.v. Ở đây, chúng tôi tập trung vào việc đưa ra ý tưởng chung về cây quyết định là gì . Nếu nó phụ thuộc vào câu trả lời của một Vâng or Không câu hỏi cho mỗi nút và do đó mỗi nút có nhất là hai con, khi được sắp xếp sao cho các nút “nhỏ hơn” ở bên trái, điều này sẽ phân loại cây quyết định thành cây nhị phân.

Trong các ví dụ trước, hãy quan sát cách cây có thể phân loại dữ liệu mới với tư cách là người tham gia hoặc không tham gia, hoặc các câu hỏi cũng có thể được thay đổi thành – “có bao nhiêu người tham gia?”, “bao nhiêu người đang mang thai?”, “bao nhiêu người sống ở khu vực nông thôn?” - giúp chúng tôi tìm ra số lượng, lượng của những người tham gia mang thai sống ở khu vực nông thôn.

Khi dữ liệu được phân loại, điều này có nghĩa là cây đang thực hiện một phân loại nhiệm vụ và khi tìm thấy số lượng dữ liệu, cây đang thực hiện một hồi quy nhiệm vụ. Điều này có nghĩa là cây quyết định có thể được sử dụng cho cả hai nhiệm vụ – phân loại và hồi quy.

Bây giờ chúng ta đã hiểu cây quyết định là gì, nó có thể được sử dụng như thế nào và danh pháp nào được sử dụng để mô tả nó, chúng ta có thể tự hỏi về những hạn chế của nó.

Hiểu rừng ngẫu nhiên

Điều gì xảy ra với quyết định nếu một số người tham gia sống trên sự phân chia giữa thành thị và nông thôn? Cây bổ sung kỷ lục này sẽ mọc ở nông thôn hay thành thị? Có vẻ như khó khớp dữ liệu này với cấu trúc mà chúng tôi hiện có, vì nó khá rõ ràng.

Ngoài ra, nếu một phụ nữ sống trên thuyền tham gia vào nghiên cứu thì điều gì sẽ được coi là nông thôn hay thành thị? Tương tự như trường hợp trước, đây là một điểm dữ liệu đầy thách thức để phân loại xem xét các tùy chọn có sẵn trong cây.

Bằng cách suy nghĩ thêm một chút về ví dụ về cây quyết định, chúng ta có thể thấy nó có thể phân loại chính xác dữ liệu mới vì nó đã tuân theo một mẫu mà cây đã có – nhưng khi có các bản ghi khác với dữ liệu ban đầu đã xác định cây, cấu trúc cây quá cứng nhắc, làm cho các bản ghi không thể phân loại được.

Điều này có nghĩa là cây quyết định có thể nghiêm ngặt và hạn chế về khả năng của nó. Một cây quyết định lý tưởng sẽ linh hoạt hơn và có thể chứa nhiều dữ liệu chưa nhìn thấy nhiều sắc thái hơn.

Giải pháp: Giống như “hai cặp mắt nhìn rõ hơn một”, hai mô hình thường đưa ra câu trả lời chính xác hơn một. Tính đến sự đa dạng trong các biểu diễn tri thức (được mã hóa trong cấu trúc cây), tính cứng nhắc của các cấu trúc hơi khác nhau giữa nhiều cây tương tự không còn là hạn chế nữa, vì những thiếu sót của một cây có thể được “bù đắp” bởi một cây khác. Bằng cách kết hợp nhiều cây cùng nhau, chúng ta có được một rừng.

Về câu trả lời cho câu hỏi ban đầu, chúng ta đã biết rằng nó sẽ được mã hóa trong lá cây – nhưng điều gì sẽ thay đổi khi chúng ta có nhiều cây thay vì một cây?

Nếu các cây được kết hợp để phân loại, kết quả sẽ được xác định bởi phần lớn các câu trả lời, điều này được gọi là biểu quyết đa số; và trong trường hợp hồi quy, con số được đưa ra bởi mỗi cây trong rừng sẽ là tính trung bình.

Ensemble Learning và Model Ensembles

Phương pháp này được gọi là học tập chung. Khi triển khai học tập đồng bộ, bạn có thể kết hợp bất kỳ thuật toán nào với nhau, miễn là bạn có thể đảm bảo rằng đầu ra có thể được phân tích cú pháp và kết hợp với các đầu ra khác (theo cách thủ công hoặc sử dụng các thư viện hiện có). Thông thường, bạn kết hợp nhiều mô hình cùng loại với nhau, chẳng hạn như nhiều cây quyết định, nhưng bạn không bị giới hạn chỉ tham gia các nhóm cùng loại mô hình.

Tập hợp là một cách thực tế được đảm bảo để khái quát hóa tốt hơn cho một vấn đề và để tăng hiệu suất một chút. Trong một số trường hợp, các mô hình tập hợp mang lại một có ý nghĩa tăng sức mạnh dự đoán, và đôi khi, chỉ nhẹ. Điều này phụ thuộc vào tập dữ liệu mà bạn đang đào tạo và đánh giá, cũng như chính các mô hình.

Tham gia các cây quyết định với nhau mang lại năng suất có ý nghĩa tăng hiệu suất so với các cây riêng lẻ. Cách tiếp cận này đã được phổ biến trong các cộng đồng nghiên cứu và học máy ứng dụng, và phổ biến đến mức tập hợp các cây quyết định được đặt tên thông tục là rừngvà loại rừng phổ biến đã được tạo (rừng cây quyết định trên một tập hợp con ngẫu nhiên các tính năng) đã phổ biến tên này rừng ngẫu nhiên.

Với việc sử dụng rộng rãi, các thư viện như Scikit-Learn đã triển khai các hàm bao cho RandomForestRegressors và RandomForestClassifiers, được xây dựng dựa trên việc triển khai cây quyết định của riêng họ, để cho phép các nhà nghiên cứu tránh xây dựng các nhóm của riêng họ.

Hãy đi sâu vào những khu rừng ngẫu nhiên!

Thuật toán rừng ngẫu nhiên hoạt động như thế nào?

Sau đây là các bước cơ bản liên quan khi thực hiện thuật toán rừng ngẫu nhiên:

  1. Chọn một số bản ghi ngẫu nhiên, nó có thể là bất kỳ số nào, chẳng hạn như 4, 20, 76, 150 hoặc thậm chí 2.000 từ tập dữ liệu (được gọi là N Hồ sơ). Con số sẽ phụ thuộc vào độ rộng của tập dữ liệu, càng rộng thì càng lớn N có thể. Đây là nơi ngẫu nhiên một phần trong tên của thuật toán đến từ đâu!
  2. Xây dựng cây quyết định dựa trên những N hồ sơ ngẫu nhiên;
  3. Theo số lượng cây được xác định cho thuật toán hoặc số lượng cây trong rừng, hãy lặp lại bước 1 và 2. Điều này tạo ra nhiều cây hơn từ các tập hợp bản ghi dữ liệu ngẫu nhiên;
  4. Sau bước 3, đến bước cuối cùng, đó là dự đoán kết quả:
    • Trong trường hợp phân loại: mỗi cây trong rừng sẽ dự đoán loại mà bản ghi mới thuộc về. Sau đó, kỷ lục mới được gán cho hạng mục giành được đa số phiếu bầu.
    • Trong trường hợp hồi quy: mỗi cây trong rừng dự đoán một giá trị cho bản ghi mới và giá trị dự đoán cuối cùng sẽ được tính bằng cách lấy trung bình của tất cả các giá trị được dự đoán bởi tất cả các cây trong rừng.

Mỗi cây phù hợp với một tập hợp con ngẫu nhiên các tính năng nhất thiết sẽ không có kiến ​​​​thức về một số tính năng khác, điều này được khắc phục bằng cách tập hợp lại, đồng thời giữ cho chi phí tính toán thấp hơn.

Tư vấn: Vì Rừng ngẫu nhiên sử dụng Cây quyết định làm cơ sở nên việc hiểu cách hoạt động của Cây quyết định và thực hành riêng lẻ với chúng để xây dựng trực giác về cấu trúc của chúng sẽ rất hữu ích. Khi tạo các khu rừng ngẫu nhiên, bạn sẽ đặt các giá trị như độ sâu tối đa của cây, số lượng mẫu tối thiểu cần có ở nút lá, tiêu chí đặt cược để xác định các phân chia bên trong, v.v. để giúp tập hợp phù hợp hơn với một nhóm tập dữ liệu và khái quát hóa các điểm mới. Trong thực tế, thông thường bạn sẽ sử dụng Rừng ngẫu nhiên, Tăng cường độ dốc hoặc Tăng cường độ dốc cực cao hoặc các phương pháp dựa trên cây khác, do đó, việc nắm bắt tốt các siêu tham số của một cây quyết định sẽ giúp xây dựng trực giác mạnh mẽ để điều chỉnh các nhóm.

Với trực giác về cách hoạt động của cây cối và sự hiểu biết về Rừng ngẫu nhiên – điều duy nhất còn lại là thực hành xây dựng, đào tạo và điều chỉnh chúng trên dữ liệu!

Xây dựng và đào tạo các mô hình rừng ngẫu nhiên với Scikit-Learn

Có một lý do cho việc các ví dụ được sử dụng cho đến nay liên quan đến việc mang thai, khu vực sinh sống và phụ nữ.

Vào năm 2020, các nhà nghiên cứu từ Bangladesh nhận thấy rằng tỷ lệ tử vong ở phụ nữ mang thai vẫn còn rất cao, đặc biệt là những phụ nữ sống ở khu vực nông thôn. Do đó, họ đã sử dụng hệ thống giám sát IOT để phân tích nguy cơ sức khỏe bà mẹ. Hệ thống IOT đã thu thập dữ liệu từ các bệnh viện, phòng khám cộng đồng và chăm sóc sức khỏe bà mẹ khác nhau từ các vùng nông thôn của Bangladesh.

Dữ liệu được thu thập sau đó được sắp xếp trong tệp giá trị được phân tách bằng dấu phẩy (csv) và được tải lên Kho lưu trữ máy học của UCI.

Đây là dữ liệu mà chúng tôi sẽ sử dụng để thực hành và cố gắng hiểu liệu một phụ nữ mang thai có thấp, trung bình or cao nguy cơ tử vong.

Chú thích: bạn có thể tải xuống tập dữ liệu tại đây.

Sử dụng rừng ngẫu nhiên để phân loại

Vì chúng tôi muốn biết nếu người phụ nữ có một thấp, trung bình or cao nguy cơ tử vong, điều này có nghĩa là chúng tôi sẽ thực hiện phân loại với ba loại. Khi một vấn đề có nhiều hơn hai lớp, nó được gọi là nhiều thủy tinh vấn đề, trái ngược với một nhị phân vấn đề (nơi bạn chọn giữa hai lớp, thường là 01).

Trong ví dụ đầu tiên này, chúng tôi sẽ triển khai mô hình phân loại đa lớp với trình phân loại Rừng ngẫu nhiên và Scikit-Learn của Python.

Chúng tôi sẽ làm theo các bước học máy thông thường để giải quyết vấn đề này, đó là tải thư viện, đọc dữ liệu, xem thống kê tóm tắt và tạo trực quan hóa dữ liệu để hiểu rõ hơn về nó. Sau đó, tiền xử lý và phân tách dữ liệu, sau đó tạo, đào tạo và đánh giá một mô hình.

Nhập thư viện

Chúng tôi sẽ sử dụng Pandas để đọc dữ liệu, Seaborn và Matplotlib để trực quan hóa dữ liệu và NumPy cho các phương thức tiện ích tuyệt vời:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
Nhập tập dữ liệu

Đoạn mã sau nhập tập dữ liệu và tải nó vào python DataFrame:

dataset = pd.read_csv("../../datasets/random-forest/maternal_health_risk.csv")

Để xem năm dòng đầu tiên của dữ liệu, chúng tôi thực hiện lệnh head() chỉ huy:

dataset.head()

Kết quả này cho ra:

    Age SystolicBP  DiastolicBP BS      BodyTemp    HeartRate   RiskLevel
0   25  130         80          15.0    98.0        86          high risk
1   35  140         90          13.0    98.0        70          high risk
2   29  90          70          8.0     100.0       80          high risk
3   30  140         85          7.0     98.0        70          high risk
4   35  120         60          6.1     98.0        76          low risk

Ở đây chúng ta có thể thấy tất cả các thuộc tính được thu thập trong quá trình nghiên cứu.

  • Tuổi: tuổi tính bằng năm.
  • Huyết áp tâm thu: giá trị trên của Huyết áp tính bằng mmHg, một thuộc tính quan trọng trong thời kỳ mang thai.
  • Huyết áp tâm trương: giá trị thấp hơn của Huyết áp tính bằng mmHg, một thuộc tính quan trọng khác trong thai kỳ.
  • BS: nồng độ đường huyết tính theo nồng độ mol, mmol/L.
  • HeartRate: nhịp tim nghỉ ngơi theo nhịp mỗi phút.
  • RiskLevel: mức độ rủi ro khi mang thai.
  • BodyTemp: nhiệt độ cơ thể.

Bây giờ chúng ta đã hiểu thêm về những gì đang được đo lường, chúng ta có thể xem xét các loại dữ liệu với info():

dataset.info()

Kết quả này trong:


RangeIndex: 1014 entries, 0 to 1013
Data columns (total 7 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   Age          1014 non-null   int64  
 1   SystolicBP   1014 non-null   int64  
 2   DiastolicBP  1014 non-null   int64  
 3   BS           1014 non-null   float64
 4   BodyTemp     1014 non-null   float64
 5   HeartRate    1014 non-null   int64  
 6   RiskLevel    1014 non-null   object 
dtypes: float64(2), int64(4), object(1)
memory usage: 55.6+ KB

Từ việc nhìn vào RangeIndex dòng, chúng ta có thể thấy rằng có 1014 bản ghi và cột Non-Null Count thông báo rằng dữ liệu không có bất kỳ giá trị nào bị thiếu. Điều này có nghĩa là chúng tôi sẽ không cần thực hiện bất kỳ biện pháp xử lý nào đối với dữ liệu bị thiếu!

Trong tạp chí Dtype cột, chúng ta có thể thấy loại của từng biến. Hiện nay, float64 cột như vậy BSBodyTemp có các giá trị số có thể thay đổi trong bất kỳ phạm vi nào, chẳng hạn như 15.0, 15.51, 15.76, 17.28, khiến chúng số liên tục (bạn luôn có thể thêm 0 vào số dấu phẩy động, quảng cáo vô hạn). Mặt khác, các biến như Age, SystolicBP, DiastolicBPHeartRate thuộc loại int64, điều này có nghĩa là các con số chỉ thay đổi theo đơn vị, chẳng hạn như 11, 12, 13, 14 – chúng ta sẽ không có nhịp tim là 77.78, mà là 77 hoặc 78 – đó là số rời rạc các giá trị. Và chúng tôi cũng có RiskLevel với một object loại, điều này thường chỉ ra rằng biến là một văn bản và có thể chúng ta sẽ cần chuyển đổi nó thành một số. Vì mức độ rủi ro tăng dần từ thấp lên cao, nên có một thứ tự ngụ ý trong các danh mục, điều này cho thấy đó là một phân loại theo thứ tự biến.

Chú thích: điều quan trọng là phải xem xét loại của từng dữ liệu và xem liệu nó có hợp lý theo ngữ cảnh của nó hay không. Chẳng hạn, không có nghĩa là có một nửa đơn vị nhịp tim, vì vậy điều này có nghĩa là loại bộ chuyển đổi phù hợp với một giá trị riêng biệt. Khi điều đó không xảy ra, bạn có thể thay đổi loại dữ liệu bằng Pandas' astype() tài sản – df['column_name'].astype('type').

Sau khi xem xét các loại dữ liệu, chúng ta có thể sử dụng describe() để lấy đỉnh ở một số thống kê mô tả, chẳng hạn như giá trị trung bình của từng cột, độ lệch chuẩn, lượng tử, giá trị dữ liệu tối thiểu và tối đa:

dataset.describe().T 

Đoạn mã trên hiển thị:

            count   mean        std         min     25%     50%     75%     max
Age         1014.0  29.871795   13.474386   10.0    19.0    26.0    39.0    70.0
SystolicBP  1014.0  113.198225  18.403913   70.0    100.0   120.0   120.0   160.0
DiastolicBP 1014.0  76.460552   13.885796   49.0    65.0    80.0    90.0    100.0
BS          1014.0  8.725986    3.293532    6.0     6.9     7.5     8.0     19.0
BodyTemp    1014.0  98.665089   1.371384    98.0    98.0    98.0    98.0    103.0
HeartRate   1014.0  74.301775   8.088702    7.0     70.0    76.0    80.0    90.0
RiskLevel   1014.0  0.867850    0.807353    0.0     0.0     1.0     2.0     2.0

Lưu ý rằng đối với hầu hết các cột, nghĩa là các giá trị khác xa với độ lệch chuẩn (std) – điều này cho thấy rằng dữ liệu không nhất thiết phải tuân theo phân phối thống kê hoạt động tốt. Nếu có, nó sẽ giúp ích cho mô hình khi dự đoán rủi ro. Điều có thể làm ở đây là tiền xử lý dữ liệu để làm cho dữ liệu mang tính đại diện hơn như thể đó là dữ liệu từ toàn bộ dân số thế giới hoặc hơn thế nữa bình thường hóa. Tuy nhiên, một lợi thế khi sử dụng mô hình Random Forest cho phân loại, là cấu trúc cây cố hữu có thể xử lý tốt dữ liệu chưa được chuẩn hóa, một khi nó chia nó cho giá trị ở mỗi cấp độ cây cho mỗi biến.

Ngoài ra, vì chúng tôi đang sử dụng cây và lớp kết quả sẽ thu được bằng cách bỏ phiếu, chúng tôi vốn không so sánh giữa các giá trị khác nhau, chỉ so sánh giữa các loại giá trị giống nhau, do đó, việc điều chỉnh các tính năng theo cùng tỷ lệ là không cần thiết trong trường hợp này . Điều này có nghĩa là mô hình phân loại Random Forest là tỉ lệ không thay đổivà bạn không cần thực hiện chia tỷ lệ đối tượng.

Trong trường hợp này, bước tiền xử lý dữ liệu mà chúng ta có thể thực hiện là chuyển đổi phân loại RiskLevel cột thành một số.

Trực quan hóa dữ liệu

Trước khi chuyển đổi RiskLevel, chúng ta cũng hãy nhanh chóng trực quan hóa dữ liệu bằng cách xem xét các tổ hợp điểm cho từng cặp đối tượng địa lý bằng Biểu đồ phân tán và cách các điểm được phân bổ bằng cách trực quan hóa đường cong biểu đồ. Để làm điều đó, chúng tôi sẽ sử dụng Seaborn's pairplot() trong đó kết hợp cả hai lô. Nó tạo cả hai biểu đồ cho từng tổ hợp tính năng và hiển thị các điểm được mã hóa màu theo mức độ rủi ro của chúng với hue bất động sản:

g = sns.pairplot(dataset, hue='RiskLevel')
g.fig.suptitle("Scatterplot and histogram of pairs of variables color coded by risk level", 
               fontsize = 14, 
               y=1.05); 

Đoạn mã trên tạo ra:

Hướng dẫn dứt khoát về thuật toán rừng ngẫu nhiên với Python và Scikit-Learn PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Khi nhìn vào cốt truyện, tình huống lý tưởng sẽ là có sự tách biệt rõ ràng giữa các đường cong và dấu chấm. Như chúng ta có thể thấy, ba loại phân loại rủi ro hầu hết được trộn lẫn với nhau, vì bên trong cây vẽ các đường khi phân định khoảng cách giữa các điểm, chúng ta có thể đưa ra giả thuyết rằng nhiều cây hơn trong rừng có thể hạn chế nhiều khoảng trống hơn và phân loại các điểm tốt hơn.

Với việc phân tích dữ liệu khám phá cơ bản được thực hiện, chúng ta có thể tiền xử lý RiskLevel cột.

Tiền xử lý dữ liệu để phân loại

Để chắc chắn rằng chỉ có ba loại RiskLevel trong dữ liệu của chúng tôi và không có giá trị nào khác bị thêm nhầm, chúng tôi có thể sử dụng unique() để hiển thị các giá trị duy nhất của cột:

dataset['RiskLevel'].unique()

Kết quả này cho ra:

array(['high risk', 'low risk', 'mid risk'], dtype=object)

Các lớp đã được kiểm tra, bây giờ bước tiếp theo là chuyển đổi từng giá trị thành một số. Vì có thứ tự giữa các phân loại nên chúng ta có thể sử dụng các giá trị 0, 1 và 2 để biểu thị thấp, trung bìnhcao rủi ro. Có nhiều cách để thay đổi giá trị cột, theo Python's đơn giản là tốt hơn mà phức tạp phương châm, chúng tôi sẽ sử dụng .replace() và chỉ cần thay thế chúng bằng các biểu diễn số nguyên của chúng:

dataset['RiskLevel'] = dataset['RiskLevel'].replace('low risk', 0).replace('mid risk', 1).replace('high risk', 2)

Sau khi thay thế các giá trị, chúng ta có thể chia dữ liệu thành những gì sẽ được sử dụng để huấn luyện mô hình, Tính năng, đặc điểm or X, và những gì chúng ta muốn dự đoán, nhãn or y:

y = dataset['RiskLevel']
X = dataset.drop(['RiskLevel'], axis=1)

Một khi các Xy đã sẵn sàng, chúng ta có thể sử dụng Scikit-Learn's train_test_split() phương pháp để tiếp tục chia chúng thành tập huấn luyện và kiểm tra:

from sklearn.model_selection import train_test_split

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

Khuyên bảo: hãy nhớ sử dụng hạt giống trạng thái ngẫu nhiên nếu bạn muốn làm cho kết quả có thể lặp lại được. Chúng tôi đã sử dụng hạt giống trạng thái ngẫu nhiên để bạn có thể tạo lại kết quả tương tự như từ hướng dẫn.

Ở đây, chúng tôi đang sử dụng 20% ​​dữ liệu để thử nghiệm và 80% để đào tạo.

Đào tạo RandomForestClassifier

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ó!

Scikit-Learn triển khai tập hợp dưới sklearn.ensemble mô-đun. Một tập hợp các cây quyết định được sử dụng để phân loại, trong đó đa số phiếu bầu được thực hiện như là RandomForestClassifier.

Có tập huấn luyện và kiểm tra, chúng ta có thể nhập RandomForestClassifier lớp và tạo mô hình. Để bắt đầu, hãy tạo một khu rừng với ba cây, bằng cách thiết lập n_estimators tham số là 3 và với mỗi cây có ba cấp độ, bằng cách đặt max_depthđến 2:

from sklearn.ensemble import RandomForestClassifier

rfc = RandomForestClassifier(n_estimators=3, 
                             max_depth=2,
                             random_state=SEED)

Lưu ý: Giá trị mặc định cho n_estimators is 100. Điều này làm tăng sức mạnh dự đoán và khả năng khái quát hóa của nhóm, nhưng chúng tôi đang tạo một nhóm nhỏ hơn để giúp hình dung và kiểm tra dễ dàng hơn. Chỉ với 3 cây – chúng ta có thể hình dung và kiểm tra chúng thủ công để tiếp tục xây dựng trực giác của chúng ta về cả từng cây riêng lẻ và sự đồng phụ thuộc của chúng. Điều tương tự cũng áp dụng cho max_depth, Đó là None, nghĩa là cây có thể ngày càng sâu hơn để phù hợp với dữ liệu theo yêu cầu.

Để phù hợp với mô hình xung quanh dữ liệu - chúng tôi gọi fit() phương pháp, vượt qua các tính năng và nhãn đào tạo:


rfc.fit(X_train, y_train)

y_pred = rfc.predict(X_test)

Bây giờ chúng ta có thể so sánh các nhãn được dự đoán với các nhãn thực để đánh giá mô hình hoạt động tốt như thế nào! Trước khi đánh giá mô hình, chúng ta hãy xem xét toàn bộ.

Để tìm hiểu sâu hơn một chút về mô hình, chúng ta có thể hình dung từng cây và cách chúng phân chia dữ liệu. Điều này có thể được thực hiện bằng cách sử dụng tree mô-đun được tích hợp trong Scikit-Learn, sau đó lặp qua từng công cụ ước tính trong nhóm:


from sklearn import tree

features = X.columns.values 
classes = ['0', '1', '2'] 



for estimator in rfc.estimators_:
    print(estimator)
    plt.figure(figsize=(12,6))
    tree.plot_tree(estimator,
                   feature_names=features,
                   class_names=classes,
                   fontsize=8, 
                   filled=True, 
                   rounded=True)
    plt.show()

Đoạn mã trên hiển thị các ô cây:

Hướng dẫn dứt khoát về thuật toán rừng ngẫu nhiên với Python và Scikit-Learn PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
Hướng dẫn dứt khoát về thuật toán rừng ngẫu nhiên với Python và Scikit-Learn PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.
Hướng dẫn dứt khoát về thuật toán rừng ngẫu nhiên với Python và Scikit-Learn PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Chú ý ba cây khác nhau như thế nào. Cái đầu tiên bắt đầu với BS tính năng, thứ hai với DiastolicBP, và thứ ba với BS lại. Mặc dù thứ ba xem xét một số lượng mẫu khác nhau. Ở nhánh bên phải, hai cây đầu tiên cũng quyết định sử dụng Age ở cấp độ lá, trong khi cây thứ ba kết thúc bằng BS tính năng. Chỉ với ba công cụ ước tính, rõ ràng việc mở rộng quy mô mang lại sự thể hiện kiến ​​thức đa dạng, phong phú có thể được tập hợp thành công thành một mô hình có độ chính xác cao như thế nào.

Càng nhiều cây trong rừng, mô hình càng đa dạng. Tuy nhiên, có một điểm lợi nhuận giảm dần, vì với nhiều cây phù hợp với một tập hợp con ngẫu nhiên các tính năng, sẽ có một số cây tương tự không mang lại nhiều sự đa dạng trong quần thể và sẽ bắt đầu có quá nhiều quyền biểu quyết và làm cho tập hợp trở nên quá khớp trên tập dữ liệu huấn luyện, làm ảnh hưởng đến khả năng khái quát hóa đối với tập hợp xác thực.

Có một giả thuyết được đưa ra trước đó về việc có nhiều cây xanh hơn và cách nó có thể cải thiện kết quả mô hình. Hãy xem kết quả, tạo một mô hình mới và xem liệu giả thuyết có đúng không!

Đánh giá RandomForestClassifier

Scikit-Learn giúp dễ dàng tạo đường cơ sở bằng cách cung cấp DummyClassifier, đưa ra dự đoán mà không cần sử dụng các tính năng đầu vào (đầu ra hoàn toàn ngẫu nhiên). Nếu mô hình của bạn tốt hơn mô hình DummyClassifier, một số học tập đang diễn ra! Để tối đa hóa việc học - bạn có thể tự động kiểm tra các siêu đường kính khác nhau bằng cách sử dụng RandomizedSearchCV or GridSearchCV. Bên cạnh việc có đường cơ sở, bạn có thể đánh giá hiệu suất mô hình của mình từ lăng kính của một số chỉ số.

Một số chỉ số phân loại truyền thống có thể được sử dụng để đánh giá thuật toán là độ chính xác, độ thu hồi, điểm f1, độ chính xác và ma trận nhầm lẫn. Dưới đây là một lời giải thích ngắn gọn về mỗi người trong số họ:

  1. Độ chính xác: khi mục đích của chúng tôi là hiểu giá trị dự đoán chính xác nào được bộ phân loại của chúng tôi coi là chính xác. Độ chính xác sẽ chia các giá trị dương thực đó cho các mẫu được dự đoán là dương;

$$
precision = frac{text{true positives}}{text{true positives} + text{false positive}}
$$

  1. Nhớ lại: thường được tính toán cùng với độ chính xác để hiểu có bao nhiêu kết quả dương tính thực sự đã được bộ phân loại của chúng tôi xác định. Việc thu hồi được tính bằng cách chia các kết quả tích cực thực sự cho bất kỳ điều gì đáng lẽ phải được dự đoán là tích cực.

$$
thu hồi = frac{text{true positives}}{text{true positives} + text{false negatives}}
$$

  1. Điểm F1: là cân bằng hoặc trung bình hài hòa độ chính xác và thu hồi. Giá trị thấp nhất là 0 và cao nhất là 1. Khi f1-score bằng 1, điều đó có nghĩa là tất cả các lớp đã được dự đoán chính xác - đây là một số điểm rất khó có được với dữ liệu thực (hầu như luôn tồn tại các trường hợp ngoại lệ).

$$
text {f1-score} = 2 * frac {text {precision} * text {summon}} {text {precision} + text {summon}}
$$

  1. Ma trận hỗn loạn: khi chúng tôi cần biết chúng tôi lấy đúng hay sai bao nhiêu mẫu mỗi lớp. Các giá trị đúng và được dự đoán chính xác được gọi là mặt tích cực thực sự, những cái được dự đoán là dương nhưng không phải là dương được gọi là dương tính giả. Cùng một danh pháp của phủ định thực sựphủ định sai được sử dụng cho các giá trị âm;

  2. tính chính xác: mô tả có bao nhiêu dự đoán mà bộ phân loại của chúng tôi đã đúng. Giá trị độ chính xác thấp nhất là 0 và cao nhất là 1. Giá trị đó thường được nhân với 100 để thu được tỷ lệ phần trăm:

$$
độ chính xác = frac {văn bản {số dự đoán đúng}} {văn bản {tổng số dự đoán}}
$$

Lưu ý: Thực tế là không thể đạt được độ chính xác 100% trên bất kỳ dữ liệu thực nào mà bạn muốn áp dụng học máy. Nếu bạn thấy một bộ phân loại chính xác 100% hoặc thậm chí là kết quả gần 100% – hãy nghi ngờ và thực hiện đánh giá. Một nguyên nhân phổ biến cho những vấn đề này là rò rỉ dữ liệu (rò rỉ một phần của bài kiểm tra huấn luyện thành một tập kiểm tra, trực tiếp hoặc gián tiếp). Không có sự thống nhất về “độ chính xác tốt là gì”, chủ yếu là do nó phụ thuộc vào dữ liệu của bạn – đôi khi, độ chính xác 70% sẽ cao! Đôi khi, đó sẽ là một độ chính xác thực sự thấp. Nói chung, trên 70% là đủ cho nhiều mô hình, nhưng điều này tùy thuộc vào nhà nghiên cứu miền để xác định.

Bạn có thể thực thi đoạn script sau để nhập các thư viện cần thiết và xem kết quả:

from sklearn.metrics import classification_report, confusion_matrix

cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d').set_title('Maternal risks confusion matrix (0 = low risk, 1 = medium risk, 2 = high risk)')

print(classification_report(y_test,y_pred))

Đầu ra sẽ giống như sau:

                precision    recall  f1-score   support

           0       0.53      0.89      0.66        80
           1       0.57      0.17      0.26        76
           2       0.74      0.72      0.73        47

    accuracy                           0.58       203
   macro avg       0.61      0.59      0.55       203
weighted avg       0.59      0.58      0.53       203

Hướng dẫn dứt khoát về thuật toán rừng ngẫu nhiên với Python và Scikit-Learn PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Trong báo cáo phân loại, quan sát thấy rằng khả năng thu hồi cao, 0.89 đối với loại 0, cả độ chính xác và khả năng thu hồi đều cao đối với loại 2, 0.74, 0.72 – và đối với loại 1, chúng thấp, đặc biệt là khả năng thu hồi 0.17 và độ chính xác 0.57 . Mối quan hệ giữa thu hồi và độ chính xác cho cả ba lớp riêng lẻ được ghi lại trong F1 điểm, là giá trị trung bình hài hòa giữa thu hồi và độ chính xác – mô hình đang hoạt động được cho lớp 0, khá tệ cho lớp 1 và khá cho lớp 2.

Mô hình đang gặp khó khăn khi xác định trường hợp rủi ro trung bình.

Độ chính xác mà bộ phân loại rừng ngẫu nhiên của chúng tôi chỉ với 3 cây đạt được là 0.58 (58%) – điều này có nghĩa là nó đang làm đúng hơn một nửa kết quả. Đây là độ chính xác thấp và có lẽ có thể được cải thiện bằng cách thêm nhiều cây hơn.

Bằng cách nhìn vào ma trận nhầm lẫn, chúng ta có thể thấy rằng hầu hết các sai lầm là khi phân loại 52 hồ sơ có rủi ro trung bình thành rủi ro thấp, điều này mang lại cái nhìn sâu sắc hơn về khả năng thu hồi thấp của loại 1. Nó thiên về phân loại bệnh nhân có rủi ro trung bình là thấp bệnh nhân nguy cơ.

Một điều khác có thể được kiểm tra để tạo ra cái nhìn sâu sắc hơn nữa là những tính năng nào được bộ phân loại xem xét nhiều nhất khi dự đoán. Đây là một bước quan trọng cần thực hiện để hệ thống học máy có thể giải thích, đồng thời giúp xác định và giảm thiểu sai lệch trong các mô hình.

Để thấy điều đó, chúng ta có thể truy cập vào feature_importances_ thuộc tính của bộ phân loại. Điều này sẽ cung cấp cho chúng tôi danh sách tỷ lệ phần trăm, vì vậy chúng tôi cũng có thể truy cập vào feature_names_in_ property để lấy tên của từng tính năng, sắp xếp chúng trong một khung dữ liệu, sắp xếp chúng từ cao nhất đến thấp nhất và vẽ kết quả:


features_df = pd.DataFrame({'features': rfc.feature_names_in_, 'importances': rfc.feature_importances_ })


features_df_sorted = features_df.sort_values(by='importances', ascending=False)


g = sns.barplot(data=features_df_sorted, x='importances', y ='features', palette="rocket")
sns.despine(bottom = True, left = True)
g.set_title('Feature importances')
g.set(xlabel=None)
g.set(ylabel=None)
g.set(xticks=[])
for value in g.containers:
    g.bar_label(value, padding=2)

Hướng dẫn dứt khoát về thuật toán rừng ngẫu nhiên với Python và Scikit-Learn PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Lưu ý cách trình phân loại chủ yếu xem xét đường huyết, sau đó là một chút áp suất tâm trương, nhiệt độ cơ thể và chỉ cần một chút tuổi để đưa ra quyết định, điều này cũng có thể liên quan đến khả năng thu hồi thấp ở loại 1, có thể dữ liệu rủi ro trung bình liên quan đến các tính năng không được được xem xét nhiều bởi mô hình. Bạn có thể thử tìm hiểu thêm về tầm quan trọng của tính năng để điều tra điều này và xem liệu các thay đổi trên mô hình có ảnh hưởng đến các tính năng đang được sử dụng hay không, nếu có mối quan hệ đáng kể giữa một số tính năng và các lớp được dự đoán.

Cuối cùng cũng đến lúc tạo một mô hình mới với nhiều cây hơn để xem nó ảnh hưởng đến kết quả như thế nào. Hãy tạo ra rfc_ rừng 900 cây, 8 cấp, giống. Kết quả sẽ được cải thiện?

rfc_ = RandomForestClassifier(n_estimators=900, 
                             max_depth=7,
                             random_state=SEED)
rfc_.fit(X_train, y_train)
y_pred = rfc_.predict(X_test)

Tính toán và hiển thị các số liệu:

cm_ = confusion_matrix(y_test, y_pred)
sns.heatmap(cm_, annot=True, fmt='d').set_title('Maternal risks confusion matrix (0 = low risk, 1 = medium risk, 2 = high risk) for 900 trees with 8 levels')

print(classification_report(y_test,y_pred))

Kết quả này cho ra:

                precision    recall  f1-score   support

           0       0.68      0.86      0.76        80
           1       0.75      0.58      0.65        76
           2       0.90      0.81      0.85        47

    accuracy                           0.74       203
   macro avg       0.78      0.75      0.75       203
weighted avg       0.76      0.74      0.74       203

Hướng dẫn dứt khoát về thuật toán rừng ngẫu nhiên với Python và Scikit-Learn PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Điều này cho thấy việc thêm nhiều cây hơn và nhiều cây chuyên biệt hơn (cấp độ cao hơn) đã cải thiện các chỉ số của chúng tôi như thế nào. Chúng tôi vẫn có khả năng thu hồi thấp đối với loại 1, nhưng độ chính xác hiện là 74%. Điểm F1 khi phân loại các trường hợp rủi ro cao là 0.85, có nghĩa là các trường hợp rủi ro cao hiện được xác định dễ dàng hơn so với 0.73 trong mô hình trước đó!

Trong một dự án hàng ngày, việc xác định các trường hợp rủi ro cao có thể quan trọng hơn, chẳng hạn như với một số liệu tương tự như độ chính xác, còn được gọi là nhạy cảm trong thống kê. Hãy thử điều chỉnh một số tham số mô hình và quan sát kết quả.

Cho đến nay, chúng ta đã có được hiểu biết tổng thể về cách sử dụng Rừng ngẫu nhiên để phân loại dữ liệu – trong phần tiếp theo, chúng ta có thể sử dụng cùng một tập dữ liệu theo một cách khác để xem cùng một mô hình dự đoán các giá trị bằng hồi quy như thế nào.

Sử dụng rừng ngẫu nhiên để hồi quy

Trong phần này, chúng ta sẽ nghiên cứu cách sử dụng thuật toán Rừng ngẫu nhiên để giải các bài toán hồi quy bằng Scikit-Learn. Các bước tiếp theo để thực hiện thuật toán này gần giống với các bước được thực hiện để phân loại, bên cạnh loại mô hình và loại dữ liệu dự đoán – bây giờ sẽ là các giá trị liên tục – chỉ có một điểm khác biệt trong việc chuẩn bị dữ liệu.

Vì hồi quy được thực hiện cho Giá trị kiểu số – hãy chọn một giá trị số từ tập dữ liệu. Chúng tôi đã thấy rằng lượng đường trong máu đóng vai trò quan trọng trong việc phân loại, do đó, nó có thể dự đoán được dựa trên các đặc điểm khác (vì nếu nó tương quan với một số đặc điểm thì đặc điểm đó cũng tương quan với đặc điểm đó).

Theo những gì chúng tôi đã thực hiện để phân loại, trước tiên hãy nhập các thư viện và cùng một tập dữ liệu. Nếu bạn đã làm điều này cho mô hình phân loại, bạn có thể bỏ qua phần này và chuyển trực tiếp đến phần chuẩn bị dữ liệu để huấn luyện.

Nhập thư viện và dữ liệu
import pandas as pd
import numpy as np
import maplotlib.pyplot as plt
import seaborn as sns

dataset = pd.read_csv("../../datasets/random-forest/maternal_health_risk.csv")
Tiền xử lý dữ liệu cho hồi quy

Đây là một nhiệm vụ hồi quy, vì vậy thay vì dự đoán các lớp, chúng ta có thể dự đoán một trong các cột số của tập dữ liệu. Trong ví dụ này, các BS cột sẽ được dự đoán. Điều này có nghĩa là y dữ liệu sẽ chứa dữ liệu đường huyếtX dữ liệu sẽ chứa tất cả các tính năng ngoài lượng đường trong máu. Sau khi tách các Xy dữ liệu, chúng ta có thể chia tập huấn luyện và kiểm tra:

from sklearn.model_selection import train_test_split

SEED = 42

y = dataset['BS']
X = dataset.drop(['BS'], axis=1) 

X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    random_state=SEED)
Đào tạo một RandomForestRegressor

Bây giờ chúng tôi đã mở rộng tập dữ liệu của mình, đã đến lúc đào tạo thuật toán của chúng tôi để giải quyết vấn đề hồi quy này, để thay đổi nó một chút – chúng tôi sẽ tạo một mô hình có 20 cây trong rừng và mỗi cây có 4 cấp độ. Để làm điều đó, bạn có thể thực thi đoạn mã sau:

from sklearn.ensemble import RandomForestRegressor

rfr = RandomForestRegressor(n_estimators=20, 
                            max_depth=3, 
                            random_state=SEED)

rfr.fit(X_train, y_train)
y_pred = rfr.predict(X_test)

Bạn có thể tìm thấy chi tiết cho tất cả các thông số của RandomForestRegressor trong tài liệu chính thức.

Vì việc vẽ sơ đồ và xem xét 20 cây sẽ cần một chút thời gian và sự cống hiến, chúng ta có thể chỉ vẽ sơ đồ cây đầu tiên để xem nó khác với cây phân loại như thế nào:

from sklearn import tree

features = X.columns

first_tree = rfr.estimators_[0]

plt.figure(figsize=(15,6))
tree.plot_tree(first_tree,
               feature_names=features,
               fontsize=8, 
               filled=True, 
               rounded=True);

Hướng dẫn dứt khoát về thuật toán rừng ngẫu nhiên với Python và Scikit-Learn PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Lưu ý rằng cây hồi quy đã có một giá trị được gán cho dữ liệu nằm trên mỗi nút. Đó là những giá trị sẽ được tính trung bình khi kết hợp 20 cây. Theo những gì chúng ta đã làm với phân loại, bạn cũng có thể vẽ biểu đồ tầm quan trọng của tính năng để xem biến nào mà mô hình hồi quy đang xem xét nhiều hơn khi tính giá trị.

Đã đến lúc tiến hành bước cuối cùng và cuối cùng khi giải quyết vấn đề học máy và đánh giá hiệu suất của thuật toán!

Đánh giá một RandomForestRegressor

Đối với các vấn đề hồi quy, các số liệu được sử dụng để đánh giá một thuật toán là lỗi tuyệt đối trung bình (MAE), lỗi bình phương trung bình (MSE) và lỗi bình phương trung bình gốc (RMSE).

  1. Lỗi tuyệt đối trung bình (MAE): khi chúng tôi trừ các giá trị dự đoán khỏi các giá trị thực tế, thu được các lỗi, tính tổng các giá trị tuyệt đối của các lỗi đó và lấy ý nghĩa của chúng. Số liệu này đưa ra khái niệm về sai số chung cho mỗi dự đoán của mô hình, càng nhỏ (gần 0) càng tốt.

$$
mae = (frac {1} {n}) sum_ {i = 1} ^ {n} left | Thực tế - Dự đoán đúng |
$$

Lưu ý: Bạn cũng có thể gặp phải yŷ ký hiệu trong các phương trình. Các y đề cập đến các giá trị thực tế và ŷ đến các giá trị dự đoán.

  1. Lỗi bình phương trung bình (MSE): nó tương tự như số liệu MAE, nhưng nó bình phương các giá trị tuyệt đối của lỗi. Ngoài ra, như với MAE, càng nhỏ hoặc càng gần 0 thì càng tốt. Giá trị MSE được bình phương để làm cho các lỗi lớn thậm chí còn lớn hơn. Một điều cần hết sức chú ý là nó thường là một số liệu khó diễn giải do kích thước của các giá trị của nó và thực tế là chúng không ở cùng một tỷ lệ dữ liệu.

$$
mse = sum_ {i = 1} ^ {D} (Thực tế - Dự đoán) ^ 2
$$

  1. Lỗi bình phương trung bình gốc (RMSE): cố gắng giải quyết vấn đề diễn giải nảy sinh với MSE bằng cách lấy căn bậc hai của giá trị cuối cùng của nó, để thu nhỏ nó trở lại cùng đơn vị dữ liệu. Sẽ dễ hiểu hơn và tốt hơn khi chúng ta cần hiển thị hoặc hiển thị giá trị thực của dữ liệu có lỗi. Nó cho biết mức độ thay đổi của dữ liệu, vì vậy, nếu chúng ta có RMSE là 4.35, thì mô hình của chúng ta có thể mắc lỗi vì nó đã thêm 4.35 vào giá trị thực hoặc cần 4.35 để có được giá trị thực. Càng gần 0 càng tốt.

$$
rmse = sqrt {sum_ {i = 1} ^ {D} (Thực tế - Dự đoán) ^ 2}
$$

Chúng tôi có thể sử dụng bất kỳ số liệu nào trong số ba chỉ số đó để so sánh mô hình (nếu chúng ta cần chọn một). Chúng ta cũng có thể so sánh cùng một mô hình hồi quy với các giá trị đối số khác nhau hoặc với các dữ liệu khác nhau và sau đó xem xét các chỉ số đánh giá. Điều này được gọi là điều chỉnh siêu tham số - điều chỉnh các siêu tham số ảnh hưởng đến thuật toán học tập và quan sát kết quả.

Khi lựa chọn giữa các mô hình, những mô hình có lỗi nhỏ nhất, thường hoạt động tốt hơn. Khi theo dõi mô hình, nếu các chỉ số trở nên tồi tệ hơn, thì phiên bản trước của mô hình đó tốt hơn hoặc có một số thay đổi đáng kể trong dữ liệu khiến mô hình hoạt động kém hơn so với hoạt động của nó.

Bạn có thể mã sau đây để tìm các giá trị này:

from sklearn.metrics import mean_absolute_error, mean_squared_error

print('Mean Absolute Error:', mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:', np.sqrt(mean_squared_error(y_test, y_pred)))

Đầu ra phải là:

Mean Absolute Error: 1.127893702896059
Mean Squared Error: 3.0802988503933326
Root Mean Squared Error: 1.755078018320933

Với 20 cây, sai số bình phương trung bình gốc là 1.75, thấp, nhưng ngay cả như vậy – bằng cách tăng số lượng cây và thử nghiệm với các tham số khác, sai số này có thể còn nhỏ hơn nữa.

Ưu điểm của việc sử dụng Random Forest

Như với bất kỳ thuật toán nào, có những ưu điểm và nhược điểm khi sử dụng nó. Trong hai phần tiếp theo, chúng ta sẽ xem xét những ưu và nhược điểm của việc sử dụng rừng ngẫu nhiên để phân loại và hồi quy.

  1. Thuật toán rừng ngẫu nhiên không thiên vị, vì có nhiều cây và mỗi cây được huấn luyện trên một tập con dữ liệu ngẫu nhiên. Về cơ bản, thuật toán rừng ngẫu nhiên dựa vào sức mạnh của “đám đông”; do đó, mức độ sai lệch tổng thể của thuật toán bị giảm.
  2. Thuật toán này rất ổn định. Ngay cả khi một điểm dữ liệu mới được đưa vào tập dữ liệu thì thuật toán tổng thể không bị ảnh hưởng nhiều vì dữ liệu mới có thể tác động đến một cây, nhưng rất khó để nó tác động đến tất cả các cây.
  3. Thuật toán rừng ngẫu nhiên hoạt động tốt khi bạn có cả các tính năng phân loại và số.
  4. Thuật toán rừng ngẫu nhiên cũng hoạt động tốt khi dữ liệu bị thiếu giá trị hoặc chưa được chia tỷ lệ.

Nhược điểm của việc sử dụng Random Forest

  1. Nhược điểm chính của rừng ngẫu nhiên nằm ở sự phức tạp của chúng. Chúng đòi hỏi nhiều tài nguyên tính toán hơn, do số lượng lớn các cây quyết định được kết hợp với nhau, khi đào tạo các tập hợp lớn. Mặc dù vậy – với phần cứng hiện đại, việc đào tạo ngay cả một khu rừng lớn ngẫu nhiên cũng không mất nhiều thời gian.

Tiến xa hơn – Hand-Holded End-to-End Project

Bản tính ham học hỏi của bạn khiến bạn muốn tiến xa hơn? Chúng tôi khuyên bạn nên kiểm tra Dự án có hướng dẫn: “Dự đoán giá nội bộ thực hành - Máy học bằng Python”.

Hướng dẫn dứt khoát về thuật toán rừng ngẫu nhiên với Python và Scikit-Learn PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Trong dự án có hướng dẫn này - bạn sẽ học cách xây dựng các mô hình học máy truyền thống mạnh mẽ cũng như các mô hình học sâu, sử dụng Ensemble Learning và theo dõi những người học tổng hợp để dự đoán giá nhà từ một loạt các mô hình Scikit-Learn và Keras.

Sử dụng Keras, API học sâu được xây dựng trên Tensorflow, chúng tôi sẽ thử nghiệm với các kiến ​​trúc, xây dựng một nhóm các mô hình xếp chồng lên nhau và đào tạo người học meta mạng nơ-ron (mô hình cấp 1) để tìm ra giá của một ngôi nhà.

Học sâu thật tuyệt vời - nhưng trước khi sử dụng nó, bạn cũng nên thử giải quyết vấn đề bằng các kỹ thuật đơn giản hơn, chẳng hạn như với học tập nông cạn các thuật toán. Hiệu suất cơ bản của chúng tôi sẽ dựa trên Hồi quy rừng ngẫu nhiên thuật toán. Ngoài ra - chúng ta sẽ khám phá việc tạo các cụm mô hình thông qua Scikit-Learn thông qua các kỹ thuật như đóng baobiểu quyết.

Đây là một dự án end-to-end và giống như tất cả các dự án Machine Learning, chúng ta sẽ bắt đầu - với Phân tích dữ liệu thăm dò, theo dõi bởi Xử lý dữ liệu và cuối cùng Xây dựng nôngMô hình học sâu để phù hợp với dữ liệu chúng tôi đã khám phá và làm sạch trước đây.

Dấu thời gian:

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