본문 바로가기

데이터/머신러닝

[혼공] ch 5. 트리 알고리즘

1. 결정 트리 

 

1) 로지스틱 회귀로 와인 분류하기 

 

- 와인 데이터 불러오기 

 

import pandas as pd

wine = pd.read_csv('https://bit.ly/wine_csv_data')
wine.head()

 

 

- 레드 와인과 화이트 와인을 구분하는 이진분류 문제, 화이트 와인이 양성 클래스 

- 전체 와인 데이터에서 화이트 와인을 골라내는 문제 

 

- info() 메서드는 데이터프레임의 각 열의 데이터 타입과 누락된 데이터가 있는지 확인하는 데 유용 

 

wine.info()

 

 

- describe()는 열에 대한 간략한 통계를 출력

 

wine.describe()

 

 

- 판다스 데이터프레임을 넘파이 배열로 바꾸고 훈련 세트와 테스트 세트로 나눔 

- 알코올 도수, 당도, PH 값의 스케일이 다름

- 사이킷런의 StandardScaler 클래스를 사용해 특성을 표준화 

 

data = wine[['alcohol', 'sugar', 'pH']].to_numpy()
target = wine['class'].to_numpy()

 

- 20% 정도만 테스트 세트로 나누기 (test_size=0.2)

from sklearn.model_selection import train_test_split

train_input, test_input, train_target, test_target = train_test_split(
    data, target, test_size=0.2, random_state=42)

print(train_input.shape, test_input.shape)

 

 

- 훈련 세트는 5,197개이고 테스트 세트는 1,300개이다. 

 

- StandardScaler 클래스를 사용해 훈련 세트를 전처리 

 

from sklearn.preprocessing import StandardScaler

ss = StandardScaler()
ss.fit(train_input)

train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)

 

 

- 표준점수로 변환된 train_scaled와 test_scaled를 사용해 로지스틱 회귀 모델을 훈련 

 

from sklearn.linear_model import LogisticRegression

lr = LogisticRegression()
lr.fit(train_scaled, train_target)

print(lr.score(train_scaled, train_target))
print(lr.score(test_scaled, test_target))

 

 

- 훈련 세트와 테스트 세트의 점수가 모두 낮으니 모델이 과소적합 됨

 

 

2) 결정 트리 

 

- 예/아니오에 대한 질문을 이어나가면서 정답을 찾아 학습하는 알고리즘

- 사이킷런의 DecisionTreeClassifier 클래스를 사용해 훈련 

 

from sklearn.tree import DecisionTreeClassifier

dt = DecisionTreeClassifier(random_state=42)
dt.fit(train_scaled, train_target)

print(dt.score(train_scaled, train_target)) #훈련 세트
print(dt.score(test_scaled, test_target)) #테스트 세트

 

 

- plot_tree() 함수로 트리 출력 

 

import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

plt.figure(figsize=(10,7))
plot_tree(dt)
plt.show()

 

 

 

- 맨 위의 노드를 루트 노드(root node)라 부르고 맨 아래 끝에 달린 노드를 리프 노드(leaf node)라고 한다. 

- 노드는 훈련 데이터의 특성에 대한 테스트를 표현 

- 가지는 테스트의 결과(True, False)를 나타내며 일반적으로 하나의 노드는 2개의 가지를 가진다. 

 

- max_depth 매개변수로 트리의 깊이를 제한해서 출력

- fiiled 매개변수에서 클래스에 맞게 노드이 색을 칠할 수 있다. 

- feature_names 매개변수에는 특성의 이름을 전달할 수 있다. 

plt.figure(figsize=(10,7))
plot_tree(dt, max_depth=1, filled=True, feature_names=['alcohol', 'sugar', 'pH'])
plt.show()

 

 

 

 

- 루트 노드는 당도(sugar)가 -0.239 이하인지 질문

- 만약 어떤 샘플의 당도가 -0.239와 같거나 작으면 왼쪽 가지로 간다. 그렇지 않으면 오른쪽 가지로 간다. 

- 루트 노드의 총 샘플 수(samples)는 5,197개이다. 

- 이 중에서 음성 클래스(레드 와인)은 1,258개이고, 양성 클래스(화이트 와인)은 3,939개 이다. 

 

- 결정 트리의 리프 노드에서 가장 많은 클래스예측 클래스가 된다.

 

 

불순도 

 

지니 불순도(Gini impurity) 

 

- DecisionTreeClassifier 클래스의 criterion 매개변수의 기본값은 'gini'이다. 

- criterion 매개변수의 용도는 노드에서 데이터를 분할할 기준을 정하는 것

- 지니 불순도는 클래스의 비율을 제곱해서 더한 다음 1에서 빼면 된다. 

 

지니 불순도 = 1 - (음성 클래스 비율^2 + 양성 클래스 비율^2)

 

1 - ((1258/5197)^2 + (3939/5179)^2) = 0.367

 

 

- 어떤 노드의 두 클래스의 비율이 정확히 1/2씩이라면 지니 불순도는 0.5가 되어 최악이 된다. 

- 노드에 하나의 클래스만 있다면 지니 불순도는 0이 되어 가장 작다. 이런 노드를 순수 노드라고 부른다.

 

- 결정 트리 모델은 부모 노드(parent node)와 자식 노드(child node)의 불순도 차이가 가능한 크도록 트리를 성장시킨다. 

 

- 부모 노드와 자식 노드의 불순도 차이 계산 

부모의 불순도 - (왼쪽 노드 샘플 수/ 부모의 샘플 수) * 왼쪽 노드 불순도
- (오른쪽 노드 샘플 수/ 부모의 샘플수) * 오른쪽 노드 불순도=
0.367 - (2922/5179)*0.481 - (2275/5197)*0.069 = 0.066

 

- 정보 이득(information gain) = 부모와 자식 노드 사이의 불순도 차이 

- 정보 이득이 최대가 되도록 데이터를 나눈다. 

 

엔트로피 불순도 

 

-  DecisionTreeClassifier 클래스에서 criterion='entropy'를 지정

-  지니 불순도처럼 노드의 클래스 비율을 사용하지만 밑이 2인 로그를 사용하여 곱한다. 

 

-음성 클래스 비율 * log2(음성 클래스 비율) - 양성 클래스 비율 * log2(양성 클래스 비율)
= - (1258/5197)*log2(1258/5197) - (3939/5197)*log2(3939/5197) = 0.798

 

 

- 결정 트리 알고리즘은 불순도를 기준으로 사용해 정보 이득이 최대가 되도록 노드를 분할한다. 노드를 순수하게 나눌수록 정보 이득이 커진다. 새로운 샘플에 대해 예측할 때에는 노드의 질문에 따라 트리를 이동한다. 그리고 마지막에 도달한 노드의 클래스 비율을 보고 예측을 만든다. 

 

 

가지치기

 

- 결정 트리의 성장을 제한하는 방법

- 결정 트리에서 가지치기를 하는 가장 간단한 방법은 자라날 수 있는 트리의 최대 깊이를 지정하는 것

- DecisionTreeClassifer 클래스의 max_depth 매개변수를 3으로 지정하여 모델 만들기 

 

dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(train_scaled, train_target)

print(dt.score(train_scaled, train_target))
print(dt.score(test_scaled, test_target))

 

 

plt.figure(figsize=(20,15))
plot_tree(dt, filled=True, feature_names=['alcohol', 'sugar', 'pH'])
plt.show()

 

 

 

 

- 결정 트리는 어떤 특성이 가장 유용한지 나타내는 특성 중요도를 계산해 준다. 

- 특성 중요도는 결정 트리 모델의 feature_importances_ 속성에 저장되어 있다. 

 

print(dt.feature_importances_)

 

 

- 당도>알코올 도수>pH순으로 중요도가 높다.  이 값을 모두 더하면 1이된다. 

- 특성 중요도는 각 노드의 정보 이득과 전체 샘플에 대한 비율을 곱한 후 특성별로 더하여 계산한다. 

- 특성 중요도를 활용하면 결정 트리 모델을 특성 선택에 활용할 수 있다. 

 

 

2. 교차 검증과 그리드 서치 

 

1) 검증 세트(validation set)

 

- 하이퍼파라미터 튜닝을 위해 모델을 평가할 떄, 테스트 세트를 사용하지 않기 위해 훈련 세트에서 다시 떼어 낸 데이터 세트 

 

- 훈련 세트에서 모델을 훈련하고 검증세트로 모델을 평가한다. 

- 이런 식으로 테스트하고 싶은 매개변수를 바꿔가며 가장 좋은 모델을 고른다. 

- 그 다음 이 매개변수를 사용해 훈련 세트와 검증 세트를 합쳐 전체 훈련 데이터에서 모델을 다시 훈련한다. 

- 그리고 마지막에 테스트 세트에서 최종 점수를 평가한다. 

 

import pandas as pd

wine = pd.read_csv('https://bit.ly/wine_csv_data')

#class 열을 타깃으로  사용하고 나머지 열은 특성 배열에 저장
data = wine[['alcohol', 'sugar', 'pH']].to_numpy()
target = wine['class'].to_numpy()

 

 

- 훈련 세트와 테스트 세트를 나눔

from sklearn.model_selection import train_test_split

train_input, test_input, train_target, test_target = train_test_split(
    data, target, test_size=0.2, random_state=42)

 

- train_input과 train_target을 다시 train_test_split() 함수에 넣어 훈련 세트 sub_target, sub_target과 검증 세트 val_input, val_target을 만든다. 

 

sub_input, val_input, sub_target, val_target = train_test_split(
    train_input, train_target, test_size=0.2, random_state=42)
print(sub_input.shape, val_input.shape)

 

 

- var_input, val_target을 사용해서 모델을 평가 

from sklearn.tree import DecisionTreeClassifier

dt = DecisionTreeClassifier(random_state=42)
dt.fit(sub_input, sub_target)

print(dt.score(sub_input, sub_target))
print(dt.score(val_input, val_target))

 

 

2) 교차 검증 

 

교차 검증(cross validation)

- 검증 세트를 떼어 내어 평가하는 과정을 여러 번 반복한 다음 이 점수를 평균하여 최종 검증 점수를 얻는다. 

 

ex) 3-폴드 교차 검증 

 

 

 

- 사이킷런에는 cross-validate()라는 교차 검증 함수가 있다. 

- cross_validate() 함수는 기본적으로 5-폴드 교차 검증을 수행 

- 먼저 평가할 모델 객체를 첫 번째 매개변수로 전달하고 훈련 세트 전체를 cross_validate() 함수에 전달 

 

from sklearn.model_selection import cross_validate

scores = cross_validate(dt, train_input, train_target)
print(scores)

 

 

fit_time : 모델을 훈련하는 시간

score_time : 모델을 검증하는 시간

 

- 교차 검증의 최종 점수는 test_score 키에 담긴 5개의 점수를 평균하여 얻을 수 있다. 

import numpy as np

print(np.mean(scores['test_score']))

 

 

 

- 만약 교차검증을 할 때 훈련 세트를 섞으려면 분할기(splitter)를 지정해야 한다. 

- 사이킷런의 분할기는 교차 검증에서 폴드를 어떻게 나눌지 결정해 준다. 

- cross_validate() 함수는 기본적으로 회귀 모델일 경우 KFold 분할기를 사용하고 분류 모델일 경우 타깃 클래스를 골고루 나누기 위해 StratifiedKFold를 사용한다. 

 

- 훈련 세트를 섞은 후 10-폴드 교차 검증을 수행

splitter = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)
scores = cross_validate(dt, train_input, train_target, cv=splitter)
print(np.mean(scores['test_score']))

 

 

3) 하이퍼파라미터 튜닝

 

- 모델이 학습할 수 없어서 사용자가 지정해야만 하는 파라미터를 하이퍼파라미터 튜닝이라고 함

- 사이킷런과 같은 머신러닝 라이브러리를 사용할 때 이런 하이퍼파라미터는 모두 클래스나 메서드의 매개변수로 표현됨

 

그리드 서치(Grid Search)

 

- 하이퍼파라미터 탐색을 자동화해 주는 도구 

- 사이킷런의 GridSearchCV 클래스는 하이퍼파라미터 탐색과  교차 검증을 한번에 수행 

 

- GridSearchCV 클래스를 임포트하고 탐색할 매개변수와 탐색할 값의 리스트를 딕셔너리로 만든다. 

from sklearn.model_selection import GridSearchCV

params = {'min_impurity_decrease': [0.0001, 0.0002, 0.0003, 0.0004, 0.0005]}

 

- GridSearchCV 클래스에 탐색 대상 모델과 params 변수를 전달하여 그리드 서치 객체를 만든다. 

gs = GridSearchCV(DecisionTreeClassifier(random_state=42), params, n_jobs=-1)

 

- gs 객체의 fit() 메서드를 호출

- 그리드 서치 객체는 결정 트리 모델 min_impurity_decrease 값을 바꿔가며 총 5번 실행(25개의 모델 훈련) 

- n_jobs 매개변수에서 병렬 실행에 사용할 CPU 코어 수를 지정하는 것이 좋다. 

  ( -1로 지정하면 시스템에 있는 모든 코어를 사용)

 

gs.fit(train_input, train_target)

 

 

- 사이킷런의 그리드 서치는 훈련이 끝나면 25개의 모델 중에서 검증 점수가 가장 높은 모델의 매개변수 조합으로 전체 훈련 세트에서 자동으로 다시 모델을 훈련한다. 

- 이 모델은 gs객체의 best_estimator_ 속성에 저장되어 있다. 

 

dt = gs.best_estimator_
print(dt.score(train_input, train_target))

 

- 그리드 서치로 찾은 최적의 매개변수는 best_params_속성에 저장되어 있다. 

print(gs.best_params_)

 

 

 

 

- 각 매개변수에서 수행한 교차 검증의 평균 점수는 cv_results_ 속성의 'mean_test_score'키에 저장되어 있다. 

print(gs.cv_results_['mean_test_score'])

 

 

- 넘파이 argmax() 함수를 사용하면 가장 큰 값의 인덱스를 추출할 수 있다. 

- 그 다음 이 인덱스를 사용해 params 키에 저장된 매개변수를 출력할 수 있다.  이 값이 최상의 검증 점수를 만든 매개변수 조합이다. 

 

best_index = np.argmax(gs.cv_results_['mean_test_score'])
print(gs.cv_results_['params'][best_index])

 

 

 

1. 먼저 탐색할 매개변수를 지정
2. 훈련 세트에서 그리드 서치를 수행하여 최상의 평균 검증 점수가 나오는 매개변수 조합을 찾음
 이 조합은 그리드 서치 객체에 저장된다. 
3. 그리드 서치는 최상의 매개변수에서 전체 훈련 세트를 사용해 최종 모델을 훈련한다. 
 이 모델도 그리드 서치 객체에 저장된다.

 

 

렌덤 서치(Random Search)

 

- 연속된 매개변수 값을 탐색할 때 유용

- 탐색할 값을 직접 나열하는 것이 아니고 탐색 값을 샘플링할 수 있는 확률 분포 객체를 전달 

 

- 싸이파이 stats 서브 패키지에 있는 uniform과 randint 클래스는 모두 주어진 범위에서 고르게 값을 뽑는다. 

=> 균등 분포에서 샘플링 

- radint는 정숫값을 뽑고, uniform은 실숫값을 뽑는다. 

 

from scipy.stats import uniform, randint

rgen = randint(0, 10)
rgen.rvs(10)

 

 

- uniform 클래스를 사용하여 0~1 사이에서 10개의 실수를 추출

 

ugen = uniform(0, 1)
ugen.rvs(10)

 

 

- 랜덤 서치에 randint과 uniform 클래스 객체를 넘겨주고 총 몇번을 샘플링해서 최적의 매개변수를 찾으라고 명령할 수 있다. 

 

- 탐색할 매개변수의 딕셔너리 만들기

- min_samples_leaf 매개변수를 탐색 대상에 추가 

- 이 매개변수는 리프 노드가 되기 위한 최소 샘플의 개수 

 

params = {'min_impurity_decrease': uniform(0.0001, 0.001),
          'max_depth': randint(20, 50),
          'min_samples_split': randint(2, 25),
          'min_samples_leaf': randint(1, 25),
          }

 

- min_impurity_decrease는 0.0001에서 0.001 사이의 실숫값을 샘플링 

- 샘플링 횟수는 사이킷런의 랜덤 서치 클래스인 RandomizedSearchCV n_iter 매개변수에 지정 

 

from sklearn.model_selection import RandomizedSearchCV

gs = RandomizedSearchCV(DecisionTreeClassifier(random_state=42), params,
                        n_iter=100, n_jobs=-1, random_state=42)
gs.fit(train_input, train_target)

 

- 최적의 매개변수 조합 출력

 

print(gs.best_params_)

 

 

- 최고의 교차 검증 점수 확인 

 

print(np.max(gs.cv_results_['mean_test_score']))

 

 

- 최종 모델로 결정하고 테스트 세트의 성능 확인 

 

dt = gs.best_estimator_

print(dt.score(test_input, test_target))

 

 

 

 

3. 트리의 앙상블

 

 

1) 정형 데이터와 비정형 데이터

 

정형 데이터(structured data)

 

- 구조화된 데이터

- 앙상블 학습

 

비정형 데이터(unstructured data)

 

- 구조화되지 않은 데이터

ex) 이미지, 비디오, 오디오

- 신경망 알고리즘 

 

 

2) 랜덤 포레스트

 

랜덤 포레스트(Random Forest)

 

- 대표적인 결정 트리 기반의 앙상블 학습 방법

- 결정 트리를 랜덤하게 만들어 결정 트리의 숲을 만든다. 그리고 각 결정 트리의 예측을 사용해 최종 예측을 만든다. 

 

부트스트랩 샘플(bootstrap sample)

- 데이터 세트에서 중복을 허용하여 데이터를 샘플링하는 방식 

- 원 데이터 수 만큼 데이터 셋을 뽑아야 함 

 

- 분류 모델인 RandomForestClassifier는 기본적으로 전체 특성 개수의 제곱근만큼의 특성을 선택한다. 

- 회귀 모델인 RandomForestRegressor전체 특성을 사용한다. 

 

- 사이킷런의 랜덤 포레스트는 기본적으로 100개의 결정 트리를 이런 방식으로 훈련한다. 그 다음 분류일 때는 각 트리의 클래스별 확률을 평균하여 가장 높은 확률을 가진 클래스를 예측으로 삼는다. 회귀일 때는 단순히 각 트리의 예측을 평균한다. 

 

 

- 사이킷런의 RandomForestClassifier 클래스를 화이트 와인을 분류하는 문제에 적용 

 

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split

wine = pd.read_csv('https://bit.ly/wine_csv_data')

data = wine[['alcohol', 'sugar', 'pH']].to_numpy()
target = wine['class'].to_numpy()

train_input, test_input, train_target, test_target = train_test_split(data, target, test_size=0.2, random_state=42)

 

- cross_validate() 함수를 사용해 교차 검증 수행

- return_train_score 매개변수를 True로 지정하면 검증 점수뿐만 아니라  훈련 세트에 대한 점수도 같이 반환 

 

from sklearn.model_selection import cross_validate
from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_jobs=-1, random_state=42)
scores = cross_validate(rf, train_input, train_target, return_train_score=True, n_jobs=-1)

print(np.mean(scores['train_score']), np.mean(scores['test_score']))

 

 

- 훈련 세트에 다소 과대적합됨

 

- 랜덤 포레스트의 특성 중요도는 각 결정 트리의 특성 중요도를 취합한 것

rf.fit(train_input, train_target)
print(rf.feature_importances_)

[알코올 도수, 당도, Ph]

 

- 랜덤 포레스트가 특성의 일부를 랜덤하게 선택하여 결정 트리를 훈련하기 때문에 하나의 특성에 과도하게 집중하지 않고 좀 더 많은 특성이 훈련에 기여할 기회를 얻는다. 

 

OOB(Out of bag) 샘플

- 부트스트랩 샘플에 포함되지 않고 남는 샘플 

 

- 랜덤 포레스트는 OOB 샘플을 사용하여 부트스트랩 샘플로 훈련한 결정 트리를 평가할 수 있다. 

- 이 점수를 얻으려면 RandomForestClassifer 클래스의 oob_score 매개변수를 True로 지정해야 함 

 

rf = RandomForestClassifier(oob_score=True, n_jobs=-1, random_state=42)

rf.fit(train_input, train_target)
print(rf.oob_score_)

 

 

 

3) 엑스트라 트리 

 

엑스트라 트리(Extra Tree)

 

 

- 랜덤 포레스트와 비슷하게 결정 트리를 사용하여 앙상블 모델을 만들지만 부트스트랩 샘플을 사용하지 않는다. 

- 노드를 분할할 때 가장 좋은 분할을 찾는 것이 아니라 무작위로 분할 

- splitter='random'인 결정 트리

- 많은 트리를 앙상블하기 때문에 과대적합을 막고 검증 세트의 점수를 높이는 효과 

- 사이킷런에서 제공하는 ExtraTressClassifier

 

- 교차 검증 점수 확인 

from sklearn.ensemble import ExtraTreesClassifier

et = ExtraTreesClassifier(n_jobs=-1, random_state=42)
scores = cross_validate(et, train_input, train_target, return_train_score=True, n_jobs=-1)

print(np.mean(scores['train_score']), np.mean(scores['test_score']))

 

 

- 특성 중요도 

et.fit(train_input, train_target)
print(et.feature_importances_)

 

 

4) 그레디언트 부스팅

 

그레디언트 부스팅(gradient boosting)

 

- 깊이가 얕은 결정 트리를 사용하여 이진 트리의 오차를 보완하는 방식으로 앙상블 하는 방법

- 경사 하강법을 사용하여 트리에 앙상블을 추가

- 분류에서는 로지스틱 손실 함수를 사용하고 회귀에서는 평균 제곱 오차 함수를 사용 

- 그레디언트 부스팅은 결정 트리를 계속 추가하면서 가장 낮은 곳을 찾아 이동

- 사이킷런에서 제공하는 GradientBoostingClassifier

 

 

- 교차 검증 점수 확인 

from sklearn.ensemble import GradientBoostingClassifier

gb = GradientBoostingClassifier(random_state=42)
scores = cross_validate(gb, train_input, train_target, return_train_score=True, n_jobs=-1)

print(np.mean(scores['train_score']), np.mean(scores['test_score']))

 

 

- 결정 트리 개수를 500개로 5배나 늘렸지만 과대적합을 잘 억제하고 있다. 

gb = GradientBoostingClassifier(n_estimators=500, learning_rate=0.2, random_state=42)
scores = cross_validate(gb, train_input, train_target, return_train_score=True, n_jobs=-1)

print(np.mean(scores['train_score']), np.mean(scores['test_score']))

 

 

- 특성 중요도 

gb.fit(train_input, train_target)
print(gb.feature_importances_)

 

 

5) 히스토그램 기반 그레디언트 부스팅

 

히스토그램 기반 그레디언트 부스팅(Histogram-based Gradient Boosting)

 

- 정형 데티어를 다루는 머신러닝 알고리즘 중에 가장 인기가 높은 알고리즘 

- 먼저 입력 특성을 256개의 구간으로 나눈다. 

- 히스토그램 기반 그레디언트 부스팅은 256개의 구간 중에서 하나를 떼어 놓고 누락된 값을 위해서 사용

- 사이킷런에서 제공하는 HisGradientBoostingClassifier

- 트리의 개수를 지정하는데 n_estimators 대신에 부스팅 반복 횟수를 지정하는 max_iter를 사용 

 

from sklearn.ensemble import HistGradientBoostingClassifier

hgb = HistGradientBoostingClassifier(random_state=42)
scores = cross_validate(hgb, train_input, train_target, return_train_score=True, n_jobs=-1)

print(np.mean(scores['train_score']), np.mean(scores['test_score']))

 

 

- 특성 중요도를 계산하기 위해 permutation_importance() 함수 사용 

- 특성을 하나씩 랜덤하게 섞어서 모델의 성능이 변화하는지를 관찰하여 어떤 특성이 중요한지를 계산 

 

from sklearn.inspection import permutation_importance

hgb.fit(train_input, train_target)
result = permutation_importance(hgb, train_input, train_target, n_repeats=10,
                                random_state=42, n_jobs=-1)
print(result.importances_mean)

 

 

- permutation_importance() 함수가 반환하는 객체는 반복하여 얻은 특성 중요도(importances), 평균(importances_mean), 표준편차(importances_std)를 담고 있다. 

- 평균 출력시 랜덤 포레스트와 비슷한 비율임을 알 수 있다. 

 

- 테스트 세트에서 특성 중요도 

 

result = permutation_importance(hgb, test_input, test_target, n_repeats=10,
                                random_state=42, n_jobs=-1)
print(result.importances_mean)

 

 

- HistGradientBoostingClassfier를 사용해 테스트 세트에서의 성능을 최종적으로 확인 

hgb.score(test_input, test_target)