Scikit Learn - Cây quyết định ngẫu nhiên

Chương này sẽ giúp bạn hiểu cây quyết định ngẫu nhiên trong Sklearn.

Thuật toán cây quyết định ngẫu nhiên

Như chúng ta biết rằng DT thường được đào tạo bằng cách chia nhỏ dữ liệu một cách đệ quy, nhưng dễ bị quá tải, chúng đã được chuyển đổi thành các khu rừng ngẫu nhiên bằng cách đào tạo nhiều cây trên các ví dụ con khác nhau của dữ liệu. Cácsklearn.ensemble mô-đun đang tuân theo hai thuật toán dựa trên cây quyết định ngẫu nhiên -

Thuật toán Rừng ngẫu nhiên

Đối với mỗi tính năng đang được xem xét, nó sẽ tính toán tổ hợp tính năng / phân tách tối ưu cục bộ. Trong Rừng ngẫu nhiên, mỗi cây quyết định trong nhóm được xây dựng từ một mẫu được rút ra với sự thay thế từ tập huấn luyện, sau đó lấy dự đoán từ mỗi người trong số họ và cuối cùng chọn giải pháp tốt nhất bằng cách bỏ phiếu. Nó có thể được sử dụng cho cả nhiệm vụ phân loại cũng như hồi quy.

Phân loại với Rừng ngẫu nhiên

Để tạo bộ phân loại rừng ngẫu nhiên, mô-đun Scikit-learning cung cấp sklearn.ensemble.RandomForestClassifier. Trong khi xây dựng bộ phân loại rừng ngẫu nhiên, các tham số chính mà mô-đun này sử dụng là‘max_features’‘n_estimators’.

Đây, ‘max_features’là kích thước của các tập hợp con ngẫu nhiên của các đối tượng cần xem xét khi tách một nút. Nếu chúng ta chọn giá trị của tham số này là không thì nó sẽ xem xét tất cả các tính năng hơn là một tập hợp con ngẫu nhiên. Mặt khác,n_estimatorslà số lượng cây trong rừng. Số lượng cây càng nhiều thì kết quả càng tốt. Nhưng cũng sẽ mất nhiều thời gian hơn để tính toán.

Ví dụ triển khai

Trong ví dụ sau, chúng tôi đang xây dựng bộ phân loại rừng ngẫu nhiên bằng cách sử dụng sklearn.ensemble.RandomForestClassifier và cũng kiểm tra độ chính xác của nó bằng cách sử dụng cross_val_score mô-đun.

from sklearn.model_selection import cross_val_score
from sklearn.datasets import make_blobs
from sklearn.ensemble import RandomForestClassifier
X, y = make_blobs(n_samples = 10000, n_features = 10, centers = 100,random_state = 0) RFclf = RandomForestClassifier(n_estimators = 10,max_depth = None,min_samples_split = 2, random_state = 0)
scores = cross_val_score(RFclf, X, y, cv = 5)
scores.mean()

Đầu ra

0.9997

Thí dụ

Chúng tôi cũng có thể sử dụng bộ dữ liệu sklearn để xây dựng bộ phân loại Rừng Ngẫu nhiên. Như trong ví dụ sau, chúng tôi đang sử dụng tập dữ liệu mống mắt. Chúng tôi cũng sẽ tìm thấy điểm chính xác và ma trận nhầm lẫn của nó.

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score

path = "https://archive.ics.uci.edu/ml/machine-learning-database
s/iris/iris.data"
headernames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
dataset = pd.read_csv(path, names = headernames)
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 4].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30)
RFclf = RandomForestClassifier(n_estimators = 50)
RFclf.fit(X_train, y_train)
y_pred = RFclf.predict(X_test)
result = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(result)
result1 = classification_report(y_test, y_pred)
print("Classification Report:",)
print (result1)
result2 = accuracy_score(y_test,y_pred)
print("Accuracy:",result2)

Đầu ra

Confusion Matrix:
[[14 0 0]
[ 0 18 1]
[ 0 0 12]]
Classification Report:
                  precision recall f1-score support
Iris-setosa       1.00        1.00  1.00     14
Iris-versicolor   1.00        0.95  0.97     19
Iris-virginica    0.92        1.00  0.96     12

micro avg         0.98        0.98  0.98     45
macro avg         0.97        0.98  0.98     45
weighted avg      0.98        0.98  0.98     45

Accuracy: 0.9777777777777777

Hồi quy với Rừng ngẫu nhiên

Để tạo một hồi quy rừng ngẫu nhiên, mô-đun Scikit-learning cung cấp sklearn.ensemble.RandomForestRegressor. Trong khi xây dựng bộ hồi quy rừng ngẫu nhiên, nó sẽ sử dụng các tham số giống như được sử dụng bởisklearn.ensemble.RandomForestClassifier.

Ví dụ triển khai

Trong ví dụ sau, chúng tôi đang xây dựng một công cụ hồi quy rừng ngẫu nhiên bằng cách sử dụng sklearn.ensemble.RandomForestregressor và cũng dự đoán cho các giá trị mới bằng cách sử dụng phương thức dự đoán ().

from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import make_regression
X, y = make_regression(n_features = 10, n_informative = 2,random_state = 0, shuffle = False)
RFregr = RandomForestRegressor(max_depth = 10,random_state = 0,n_estimators = 100)
RFregr.fit(X, y)

Đầu ra

RandomForestRegressor(
   bootstrap = True, criterion = 'mse', max_depth = 10,
   max_features = 'auto', max_leaf_nodes = None,
   min_impurity_decrease = 0.0, min_impurity_split = None,
   min_samples_leaf = 1, min_samples_split = 2,
   min_weight_fraction_leaf = 0.0, n_estimators = 100, n_jobs = None,
   oob_score = False, random_state = 0, verbose = 0, warm_start = False
)

Sau khi được trang bị, chúng ta có thể dự đoán từ mô hình hồi quy như sau:

print(RFregr.predict([[0, 2, 3, 0, 1, 1, 1, 1, 2, 2]]))

Đầu ra

[98.47729198]

Phương pháp ngoài cây

Đối với mỗi tính năng đang được xem xét, nó sẽ chọn một giá trị ngẫu nhiên cho phần tách. Lợi ích của việc sử dụng phương pháp cây phụ là nó cho phép giảm phương sai của mô hình nhiều hơn một chút. Nhược điểm của việc sử dụng các phương pháp này là nó làm tăng nhẹ độ chệch.

Phân loại với phương pháp cây phụ

Để tạo bộ phân loại bằng phương pháp Extra-tree, mô-đun Scikit-learning cung cấp sklearn.ensemble.ExtraTreesClassifier. Nó sử dụng các tham số giống như được sử dụng bởisklearn.ensemble.RandomForestClassifier. Sự khác biệt duy nhất là trong cách, đã thảo luận ở trên, họ xây dựng cây.

Ví dụ triển khai

Trong ví dụ sau, chúng tôi đang xây dựng bộ phân loại rừng ngẫu nhiên bằng cách sử dụng sklearn.ensemble.ExtraTreeClassifier và cũng kiểm tra độ chính xác của nó bằng cách sử dụng cross_val_score mô-đun.

from sklearn.model_selection import cross_val_score
from sklearn.datasets import make_blobs
from sklearn.ensemble import ExtraTreesClassifier
X, y = make_blobs(n_samples = 10000, n_features = 10, centers=100,random_state = 0)
ETclf = ExtraTreesClassifier(n_estimators = 10,max_depth = None,min_samples_split = 10, random_state = 0)
scores = cross_val_score(ETclf, X, y, cv = 5)
scores.mean()

Đầu ra

1.0

Thí dụ

Chúng ta cũng có thể sử dụng bộ dữ liệu sklearn để xây dựng bộ phân loại bằng phương pháp Extra-Tree. Như trong ví dụ sau, chúng tôi đang sử dụng tập dữ liệu Pima-Indian.

from pandas import read_csv

from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import ExtraTreesClassifier
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
array = data.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
kfold = KFold(n_splits=10, random_state=seed)
num_trees = 150
max_features = 5
ETclf = ExtraTreesClassifier(n_estimators=num_trees, max_features=max_features)
results = cross_val_score(ETclf, X, Y, cv=kfold)
print(results.mean())

Đầu ra

0.7551435406698566

Hồi quy với phương pháp cây phụ

Để tạo một Extra-Tree hồi quy, mô-đun Scikit-learning cung cấp sklearn.ensemble.ExtraTreesRegressor. Trong khi xây dựng bộ hồi quy rừng ngẫu nhiên, nó sẽ sử dụng các tham số giống như được sử dụng bởisklearn.ensemble.ExtraTreesClassifier.

Ví dụ triển khai

Trong ví dụ sau, chúng tôi đang áp dụng sklearn.ensemble.ExtraTreesregressorvà trên cùng dữ liệu như chúng tôi đã sử dụng khi tạo bộ hồi quy rừng ngẫu nhiên. Hãy xem sự khác biệt trong đầu ra

from sklearn.ensemble import ExtraTreesRegressor
from sklearn.datasets import make_regression
X, y = make_regression(n_features = 10, n_informative = 2,random_state = 0, shuffle = False)
ETregr = ExtraTreesRegressor(max_depth = 10,random_state = 0,n_estimators = 100)
ETregr.fit(X, y)

Đầu ra

ExtraTreesRegressor(bootstrap = False, criterion = 'mse', max_depth = 10,
   max_features = 'auto', max_leaf_nodes = None,
   min_impurity_decrease = 0.0, min_impurity_split = None,
   min_samples_leaf = 1, min_samples_split = 2,
   min_weight_fraction_leaf = 0.0, n_estimators = 100, n_jobs = None,
   oob_score = False, random_state = 0, verbose = 0, warm_start = False)

Thí dụ

Sau khi được trang bị, chúng ta có thể dự đoán từ mô hình hồi quy như sau:

print(ETregr.predict([[0, 2, 3, 0, 1, 1, 1, 1, 2, 2]]))

Đầu ra

[85.50955817]