Scikit Learn - ต้นไม้ตัดสินใจแบบสุ่ม

บทนี้จะช่วยคุณในการทำความเข้าใจแผนผังการตัดสินใจแบบสุ่มใน Sklearn

อัลกอริทึมต้นไม้การตัดสินใจแบบสุ่ม

อย่างที่เราทราบกันดีว่า DT มักได้รับการฝึกฝนโดยการแยกข้อมูลซ้ำ ๆ กัน แต่มีแนวโน้มที่จะเกินพอดีพวกมันได้ถูกเปลี่ยนเป็นป่าสุ่มโดยการฝึกต้นไม้จำนวนมากเหนือตัวอย่างต่างๆของข้อมูล sklearn.ensemble โมดูลกำลังมีอัลกอริทึมสองแบบตามโครงสร้างการตัดสินใจแบบสุ่ม -

อัลกอริทึมป่าสุ่ม

สำหรับแต่ละคุณลักษณะที่อยู่ระหว่างการพิจารณาจะคำนวณชุดค่าผสม / คุณลักษณะที่เหมาะสมที่สุดในท้องถิ่น ในสุ่มฟอเรสต์ต้นไม้การตัดสินใจแต่ละอันในวงดนตรีจะถูกสร้างขึ้นจากตัวอย่างที่ดึงโดยมีการเปลี่ยนจากชุดการฝึกจากนั้นจะรับคำทำนายจากแต่ละคนและสุดท้ายจะเลือกวิธีการแก้ปัญหาที่ดีที่สุดโดยการโหวต สามารถใช้ได้ทั้งการจำแนกประเภทและงานการถดถอย

การจำแนกประเภทด้วย Random Forest

สำหรับการสร้างลักษณนามฟอเรสต์แบบสุ่มโมดูล Scikit-learn มีให้ sklearn.ensemble.RandomForestClassifier. ในขณะที่สร้างลักษณนามฟอเรสต์แบบสุ่มพารามิเตอร์หลักที่โมดูลนี้ใช้คือ‘max_features’ และ ‘n_estimators’.

ที่นี่ ‘max_features’คือขนาดของชุดย่อยแบบสุ่มของคุณลักษณะที่ต้องพิจารณาเมื่อแยกโหนด หากเราเลือกค่าของพารามิเตอร์นี้เป็นไม่มีก็จะพิจารณาคุณสมบัติทั้งหมดแทนที่จะเป็นเซตย่อยแบบสุ่ม ในทางกลับกัน,n_estimatorsคือจำนวนต้นไม้ในป่า ยิ่งมีจำนวนต้นมากก็จะได้ผลดี แต่ก็จะใช้เวลาคำนวณนานขึ้นเช่นกัน

ตัวอย่างการใช้งาน

ในตัวอย่างต่อไปนี้เรากำลังสร้างลักษณนามฟอเรสต์แบบสุ่มโดยใช้ sklearn.ensemble.RandomForestClassifier และตรวจสอบความถูกต้องด้วยโดยใช้ cross_val_score โมดูล.

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()

เอาต์พุต

0.9997

ตัวอย่าง

เรายังสามารถใช้ชุดข้อมูล sklearn เพื่อสร้างลักษณนามป่าสุ่ม ดังตัวอย่างต่อไปนี้เรากำลังใช้ชุดข้อมูลม่านตา นอกจากนี้เรายังจะพบคะแนนความแม่นยำและเมทริกซ์ความสับสน

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)

เอาต์พุต

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

การถดถอยกับป่าสุ่ม

สำหรับการสร้างการถดถอยฟอเรสต์แบบสุ่มโมดูล Scikit-learn มีให้ sklearn.ensemble.RandomForestRegressor. ในขณะที่สร้างตัวควบคุมฟอเรสต์แบบสุ่มจะใช้พารามิเตอร์เดียวกับที่ใช้sklearn.ensemble.RandomForestClassifier.

ตัวอย่างการใช้งาน

ในตัวอย่างต่อไปนี้เรากำลังสร้างตัวควบคุมฟอเรสต์แบบสุ่มโดยใช้ sklearn.ensemble.RandomForestregressor และการทำนายค่าใหม่โดยใช้วิธีการทำนาย ()

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)

เอาต์พุต

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
)

เมื่อติดตั้งแล้วเราสามารถทำนายจากแบบจำลองการถดถอยได้ดังนี้ -

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

เอาต์พุต

[98.47729198]

วิธีการเสริมต้นไม้

สำหรับแต่ละคุณสมบัติที่อยู่ระหว่างการพิจารณาจะเลือกค่าสุ่มสำหรับการแยก ประโยชน์ของการใช้วิธีต้นไม้เสริมคือช่วยลดความแปรปรวนของแบบจำลองได้อีกเล็กน้อย ข้อเสียของการใช้วิธีการเหล่านี้คือการเพิ่มอคติเล็กน้อย

การจำแนกประเภทด้วยวิธี Extra-Tree

สำหรับการสร้างลักษณนามโดยใช้วิธี Extra-tree โมดูล Scikit-learn มีให้ sklearn.ensemble.ExtraTreesClassifier. ใช้พารามิเตอร์เดียวกับที่ใช้sklearn.ensemble.RandomForestClassifier. ความแตกต่างเพียงอย่างเดียวคือวิธีที่กล่าวถึงข้างต้นพวกเขาสร้างต้นไม้

ตัวอย่างการใช้งาน

ในตัวอย่างต่อไปนี้เรากำลังสร้างลักษณนามฟอเรสต์แบบสุ่มโดยใช้ sklearn.ensemble.ExtraTreeClassifier และยังตรวจสอบความถูกต้องโดยใช้ cross_val_score โมดูล.

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()

เอาต์พุต

1.0

ตัวอย่าง

เรายังสามารถใช้ชุดข้อมูล sklearn เพื่อสร้างลักษณนามโดยใช้วิธี Extra-Tree ดังตัวอย่างต่อไปนี้เรากำลังใช้ชุดข้อมูล 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())

เอาต์พุต

0.7551435406698566

การถดถอยด้วยวิธี Extra-Tree

สำหรับการสร้างไฟล์ Extra-Tree การถดถอยโมดูล Scikit-learn จัดเตรียมไว้ให้ sklearn.ensemble.ExtraTreesRegressor. ในขณะที่สร้างตัวควบคุมฟอเรสต์แบบสุ่มจะใช้พารามิเตอร์เดียวกับที่ใช้sklearn.ensemble.ExtraTreesClassifier.

ตัวอย่างการใช้งาน

ในตัวอย่างต่อไปนี้เรากำลังสมัคร sklearn.ensemble.ExtraTreesregressorและบนข้อมูลเดียวกับที่เราใช้ในขณะสร้างตัวรีเควสเตอร์ฟอเรสต์แบบสุ่ม เรามาดูความแตกต่างของ Output

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)

เอาต์พุต

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)

ตัวอย่าง

เมื่อติดตั้งแล้วเราสามารถทำนายจากแบบจำลองการถดถอยได้ดังนี้ -

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

เอาต์พุต

[85.50955817]