Sklearn에서 의사 결정 트리 및 랜덤 포레스트 구현

트리 기반 학습 알고리즘은 매우 인기 있고 널리 사용되는 비모수 적지도 학습 알고리즘으로 분류와 회귀 모두에 사용할 수 있습니다. 이 블로그는 주로 Sklearn의 트리 모델 구현을 요약하고 너무 많은 알고리즘 이론을 포함하지 않습니다.

1. 의사 결정 트리 분류기 훈련

의사 결정 트리 분류기를 훈련하려면 scikit-learn에서 DecisionTreeClassifier를 사용하십시오.

from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
#加载数据
iris = datasets.load_iris()
features = iris.data
target = iris.target
#创建决策树分类器对象
decisiontree = DecisionTreeClassifier(random_state=0)
#训练模型
model = decisiontree.fit(features,target)

의사 결정 트리의 트레이너는 노드에서 데이터의 불순물을 최소화 할 수있는 의사 결정 규칙을 찾으려고합니다. 기본적으로 Gini 색인이 사용됩니다.

#创建新样本
observation = [[5,4,3,2]]
#预测样本分类
model.predict(observation)
--->
array([1])

또한 predict_proba 메서드를 사용하여 표본이 각 범주 (예측 범주)에 속할 확률을 볼 수 있습니다.

#查看样本分别属于三个分类的概率
model.predict_proba(observation)
--->
array([[0., 1., 0.]])

다른 불순물 측정을 사용하려는 경우 매개 변수 기준을 수정할 수 있습니다.

2. 의사 결정 트리 회귀 모델 훈련

DecisionTreeRegression을 사용하여 의사 결정 트리 회귀 모델을 학습 시키십시오.

from sklearn.tree import DecisionTreeRegressor
from sklearn import datasets
#加载仅有两个特征的数据
boston = datasets.load_boston()
features = boston.data[:,0:2]
target = boston.target
#创建决策树回归模型对象
decisiontree = DecisionTreeRegressor(random_state=0)
#训练模型
model = decisiontree.fit(features,target)

의사 결정 트리 회귀 모델은 분할 규칙의 평가 기준으로 평균 제곱 오차 (MSE)의 감소를 기본으로합니다.
MSE = 1n ∑ i = 1n (yi − yi ^) 2 MSE = {1 \ over n} \ sum_ {i = 1} ^ n (y_i- \ hat {y_i}) ^ 2M S E=(1)나는 = 1N( 나는나는^)2

#创建新样本
observation = [[0.02,16]]
#预测样本值
model.predict(observation)
--->
array([33.])

매개 변수 기준은 평균 절대 오차 (MAE)와 같은 분할 품질을 선택하는 데 사용할 수 있습니다.

3. 시각적 의사 결정 트리

의사 결정 트리 모델을 DOT 형식으로 내보내고 시각화합니다.

import pydotplus
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
from IPython.display import Image
from sklearn import tree
#加载数据
iris = datasets.load_iris()
features = iris.data
target = iris.target
#创建决策树分类器对象
decisiontree = DecisionTreeClassifier(random_state=0)
#训练模型
model = decisiontree.fit(features,target)
#创建DOT数据
dot_data = tree.export_graphviz(decisiontree,
                                out_file=None,
                                feature_names=iris.feature_names,
                                class_names=iris.target_names)
#绘制图形
graph=pydotplus.graph_from_dot_data(dot_data)
#显示图形
Image(graph.create_png())

여기에 사진 설명 삽입
다른 애플리케이션에서 의사 결정 트리를 사용하려는 경우 시각화 된 의사 결정 트리를 PDF 또는 PNG 형식으로 내보낼 수 있습니다.

#创建PDF
graph.write_pdf("iris.pdf")
#创建PNG
graph.write_png("iris.png")

4. 랜덤 포레스트 분류기 훈련

RandomForestClassifier를 사용하여 랜덤 포레스트 분류기 모델을 학습 시키십시오.

from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets
#加载数据
iris = datasets.load_iris()
features = iris.data
target = iris.target
#创建决策树分类器对象
RF = RandomForestClassifier(random_state=0)
#训练模型
model = RF.fit(features,target)

DecisionTreeClassifier와 유사합니다.

#查看样本分别属于三个分类的概率
model.predict_proba(observation)
--->
array([[0., 1., 0.]])

그러나 별도의 의사 결정 트리가 아닌 포리스트로서 RandomForestClassifier에는 몇 가지 고유하고 중요한 매개 변수가 있습니다. 우선, 매개 변수 max_features는 각 노드가 고려해야하는 최대 기능 수를 결정합니다. 허용되는 입력 변수 유형에는 정수 (기능 수), 부동 소수점 (기능 비율) \ 및 sqrt (개수의 제곱근)가 있습니다. 풍모). 기본적으로 max_features 매개 변수의 값은 auto로 설정됩니다.
둘째, 매개 변수 부트 스트랩은 트리를 생성 할 때 사용되는 샘플 하위 집합을 설정하는 데 사용됩니다. 셋째, n_estimators 매개 변수는 포리스트에 포함 된 의사 결정 트리의 수를 설정합니다.

5. 랜덤 포레스트 회귀 모델 훈련

RandomForestRegressor를 사용하여 랜덤 포레스트 회귀 모델을 학습 시키십시오.

from sklearn.ensemble import RandomForestRegressor
from sklearn import datasets
#加载仅有两个特征的数据
boston = datasets.load_boston()
features = boston.data[:,0:2]
target = boston.target
#创建决策树回归模型对象
RF = RandomForestRegressor(random_state=0)
#训练模型
model = RF.fit(features,target)

임의 포리스트 분류기를 만드는 것과 마찬가지로 각 트리가 부트 스트랩 샘플 하위 집합을 사용하고 각 노드의 결정 규칙에서 기능의 일부만 고려하는 임의 포리스트 회귀 모델을 만들 수도 있습니다. RandomForestClassifier와 마찬가지로 랜덤 포레스트 회귀 모델에는 몇 가지 중요한 매개 변수가 있습니다.

  • max_features는 각 노드에 대해 고려할 최대 기능 수를 설정합니다. 기본값은 p \ sqrt p입니다. 조각, 여기서 p는 총 기능 수입니다.
  • 부트 스트랩은 대체 샘플링을 사용할지 여부를 설정하며 기본값은 true입니다.
  • n_estimators는 의사 결정 트리의 수를 설정하며 기본값은 10입니다.

6. Random Forest의 중요한 기능 식별

각 기능의 중요도 계산 및 시각화 (기능 중요도)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets
#加载数据
iris = datasets.load_iris()
features = iris.data
target = iris.target
#创建随机森林分类器对象
randomforest = RandomForestClassifier(random_state=0,n_jobs=-1)
#训练模型
model = randomforest.fit(features,target)
#计算特征的重要性
importances = model.feature_importances_
#将特征的重要性按降序排列
indices = np.argsort(importances)[::-1]
#按照特征重要性对特征名称重新排序
names = [iris.feature_names[i] for i in indices]
#创建图
plt.figure()
#创建图表题
plt.title("Feature Importance")
#添加数据
plt.bar(range(features.shape[1]),importances[indices])
#将特征名称添加为x轴标签
plt.xticks(range(features.shape[1]),names,rotation = 90)
#显示图
plt.show()

여기에 사진 설명 삽입

sklearn에서 결정 트리 및 랜덤 포레스트의 분류 및 회귀 모델을 사용하여 feature_importances_를 통해 모델의 각 기능의 중요성을 볼 수 있습니다.

#查看特征的重要程度
model.feature_importances_
--->
array([0.09090795, 0.02453104, 0.46044474, 0.42411627])

값이 클수록 기능이 더 중요해집니다 (모든 기능의 중요도가 1이됩니다). 이 값을 플로팅하면 랜덤 포레스트 모델을 설명하는 데 도움이됩니다.

7. 랜덤 포레스트에서 중요한 기능 선택

모델을 훈련하기 전에 먼저 중요한 기능을 결정한 다음이를 사용하여 모델을 다시 훈련하십시오.

from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets
from sklearn.feature_selection import SelectFromModel
#加载数据
iris = datasets.load_iris()
features = iris.data
target = iris.target
#创建随机森林分类器
RF = RandomForestClassifier(random_state=0,n_jobs=-1)
#创建对象,选择重要性大于或等于阈值的特征
selector = SelectFromModel(RF,threshold=0.3)
#使用选择器创建新的特征矩阵
features_important = selector.fit_transform(features,target)
#使用重要的特征训练随机森林模型
model = RF.fit(features_important,target)

이 방법을 사용하여 기능을 선택할 때주의해야합니다. 첫째, 원-핫 인코딩 후 명목 분류 기능의 중요성이 이진 기능으로 희석되고, 두 번째, 상관 관계가 높은 한 쌍의 기능의 중요성이 하나에 집중됩니다. 두 기능에 균등하게 분산되지 않고

8. 고르지 않은 분류 처리

불균형이 심한 데이터에 대해 랜덤 포레스트 모델을 훈련하려는 경우 매개 변수 class_weight = "balance"를 사용하여 의사 결정 트리 또는 랜덤 포레스트 모델을 훈련 할 수 있습니다.

import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets
#加载数据
iris = datasets.load_iris()
features = iris.data
target = iris.target
#删除前40个样本以获得高度不均衡的数据
features = features[40:,:]
target = target[40:]
#创建目标向量表明分类是0还是1
target = np.where((target==0),0,1)
#创建随机森林分类器对象
randomforest = RandomForestClassifier(random_state=0,n_jobs=-1,class_weight="balanced")
#训练模型
model= randomforest.fit(features,target)

실제 응용 프로그램에서는 고르지 않은 분류 문제가 발생하기 쉽습니다. 이 문제가 해결되지 않으면 불균형 분류가 모델의 성능을 저하시킵니다. class_weight = "balanced"를 사용하면 더 작은 범주의 가중치를 늘릴 수 있습니다 (더 큰 범주의 가중치 감소).

9. 의사 결정 트리의 크기 제어

의사 결정 트리의 구조와 규모를 수동으로 제어합니다.

from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
#加载数据
iris = datasets.load_iris()
features = iris.data
target = iris.target
#创建决策树分类器对象
DT = DecisionTreeClassifier(random_state=0,
                            max_depth=None,
                            min_samples_split=2,
                            min_samples_leaf=1,
                            min_weight_fraction_leaf=0,
                            max_leaf_nodes=None,
                            min_impurity_decrease=0)
#训练模型
model = DT.fit(features,target)
  • max_depth : 트리의 최대 깊이. None이면 모든 리프 노드가 순수 노드가 될 때까지 트리가 계속 성장합니다. 이 매개 변수의 값으로 정수가 제공되면 트리는 정수로 표시되는 깊이까지 효과적으로 "정리"됩니다.
  • min_samples_split : 노드가 분할되기 전 노드의 최소 샘플 수입니다. 정수가 제공되는 경우 이는 최소 샘플 수를 나타내고 부동 소수점 숫자가 제공되는 경우 최소 샘플은 총 샘플 수에 부동 소수점 수를 곱한 것입니다.
  • min_samples_leaf : min_samples_split과 동일한 매개 변수 형식을 사용하여 리프 노드에 필요한 최소 샘플 수입니다.
  • max_leaf_nodes : 최대 리프 노드 수.
  • min_impurity_split : 분할을 수행하는 데 필요한 최소 불순물 감소.

10. 부스팅을 통한 성능 향상

콘텐츠의이 부분은 통합 학습에 속하며 xgboost, lightgbm 및 기타 콘텐츠가 포함되므로 여기에 게시되지 않습니다. 나중에 통합 학습 지식 포인트를 별도로 구성합니다.

11. Out-of-Bag Error를 사용하여 랜덤 포레스트 모델 평가

교차 검증을 사용하지 않고 랜덤 포레스트 모델을 평가합니다.

from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets
#加载数据
iris = datasets.load_iris()
features = iris.data
target = iris.target
#创建随机森林分类器对象
randomforest = RandomForestClassifier(random_state=0,n_jobs=-1,n_estimators=1000,oob_score=True)
#训练模型
model= randomforest.fit(features,target)
#查看袋外误差
randomforest.oob_score_
output--->
0.9533333333333334

랜덤 포레스트에서 각 의사 결정 트리는 부트 스트랩 샘플의 하위 집합을 사용하여 훈련됩니다. 이는 각 트리에 대해 훈련에 참여하지 않은 샘플의 하위 집합이 있음을 의미합니다. 이러한 샘플을 OOB (Out-of-bag) 샘플이라고합니다. Out-of-bag 샘플은 랜덤 포레스트 모델의 성능을 평가하기위한 테스트 세트로 사용할 수 있습니다.

각 샘플에 대해 알고리즘은 실제 값을 해당 샘플로 훈련되지 않은 트리 모델의 하위 집합에서 생성 된 예측 값과 비교합니다. 모든 샘플의 총점을 계산하면 랜덤 포레스트 성능 지수를 얻을 수 있습니다. OOB 점수 평가 방법은 교차 검증의 대안으로 사용할 수 있습니다.

  • 참조 : Python 머신 러닝 매뉴얼

추천

출처blog.csdn.net/weixin_44127327/article/details/109161102