Scikit Learn-무작위 의사 결정 트리

이 장은 Sklearn의 무작위 결정 트리를 이해하는 데 도움이 될 것입니다.

무작위 의사 결정 트리 알고리즘

DT는 일반적으로 데이터를 재귀 적으로 분할하여 훈련되지만 과적 합되는 경향이 있다는 것을 알고 있기 때문에 데이터의 다양한 하위 샘플에 대해 많은 트리를 훈련하여 임의의 포리스트로 변환되었습니다. 그만큼sklearn.ensemble 모듈은 무작위 결정 트리를 기반으로 다음 두 알고리즘을 가지고 있습니다-

랜덤 포레스트 알고리즘

고려중인 각 기능에 대해 로컬 최적 기능 / 분할 조합을 계산합니다. 랜덤 포레스트에서 앙상블의 각 의사 결정 트리는 훈련 세트에서 대체로 추출 된 샘플에서 빌드 된 다음 각각에서 예측을 가져 와서 최종적으로 투표를 통해 최상의 솔루션을 선택합니다. 분류 및 회귀 작업 모두에 사용할 수 있습니다.

Random Forest로 분류

랜덤 포레스트 분류기를 만들기 위해 Scikit-learn 모듈은 sklearn.ensemble.RandomForestClassifier. 랜덤 포레스트 분류기를 만드는 동안이 모듈에서 사용하는 주요 매개 변수는 다음과 같습니다.‘max_features’‘n_estimators’.

여기, ‘max_features’노드를 분할 할 때 고려할 기능의 무작위 하위 집합 크기입니다. 이 매개 변수의 값을 none으로 선택하면 무작위 하위 집합이 아닌 모든 기능을 고려합니다. 반면에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 데이터 세트를 사용하여 Random Forest 분류기를 만들 수도 있습니다. 다음 예에서와 같이 홍채 데이터 세트를 사용하고 있습니다. 정확도 점수와 혼동 행렬도 찾을 수 있습니다.

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. Random Forest Regressor를 빌드하는 동안에서 사용하는 것과 동일한 매개 변수를 사용합니다.sklearn.ensemble.RandomForestClassifier.

구현 예

다음 예에서는 다음을 사용하여 임의 포리스트 회귀자를 작성합니다. sklearn.ensemble.RandomForestregressor 또한 predict () 메서드를 사용하여 새 값을 예측합니다.

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. Random Forest Regressor를 빌드하는 동안에서 사용하는 것과 동일한 매개 변수를 사용합니다.sklearn.ensemble.ExtraTreesClassifier.

구현 예

다음 예에서는 sklearn.ensemble.ExtraTreesregressor랜덤 포레스트 회귀자를 만들 때 사용한 것과 동일한 데이터에 대해 출력의 차이점을 보겠습니다.

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]