#12. 결정 트리, 특성중요도, 결정 트리 앙상블, 부트스트랩 샘플링
*본 글은 '비즈니스를 위한 데이터 과학(포스터 프로보스트, 톰 포셋 지음, 한빛출판사)' 4장과
'파이썬 라이브러리를 활용한 머신러닝(안드레아스 뮐러, 세라 가이도 지음, 한빛출판사)' 2장을 참고하여 작성되었습니다.
*필자가 배운 것을 조합해 작성한 것이므로 오류가 있을 수 있습니다.
1. 결정 트리
결정 트리는 연속된 질문(속성에 대한 질문)을 통해 객체들을 분할해간다.
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import mglearn
import sklearn
import graphviz
mglearn.plots.plot_animal_tree()
1.1 결정 트리 만들기
결정 트리를 학습한다는 것은 정답(클래스)에 가장 빨이 도달하는 질문 목록을 학습한다는 것을 의미한다.
질문들은 테스트라고 부르며(시험 세트와는 다른 의미다!) 연속된 특성들로 구성된다.
새로운 데이터에 대한 예측은 해당 데이터가 놓인 클래스 안에서 과반을 차지하는 타깃값으로 결정된다.
(class 0 안의 5개의 데이터 포인트 중 3개가 타깃값 A, 2개가 타깃값 B를 가진다면, 해당 클래스 안에 위치하게 되는
새로운 데이터 포인트의 타깃값은 A로 예측될 것이다.)
#two_moon 데이터셋으로 결정 트리 생성하기
mglearn.plots.plot_tree_progressive()
1.2 결정 트리 복잡도 제어하기
트리 모델에서의 복잡도는 노드의 개수에 따라 결정된다. 노드의 개수가 많을수록 모델의 크기는 커지고 복잡도도 증대한다.
특히나 단말 노드가 순수해질때까지 분류한다는 것은 트리가 훈련 세트에 100% 최적화 되었다는 것을 의미하므로, 복잡도도 최대다.
트리 모델의 과적합을 막는 방법은 두 가지가 있다.
1.사전 가지치기pre-pruning: 노드 개수 또는 최소 데이터 포인트 개수 기준을 정해 순수 단말이 되기 전에 트리 생성 중단하기
2.사후 가지치기post-pruning, pruning: 리프(마지막 노드)가 순수해질때까지 생성한 뒤 데이터 포인트가 적은 노드를 통폐합하기
sckikt-learn에서는 사전 가지치기만 지원한다.
그리고 결정 트리는 DecisionTreeRegression, DesicionTreeClassifier에 구현되어 있다.
1.2.1 유방암 데이터셋으로 pre-pruning
#완전한 트리 모델 만들기
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, stratify = cancer.target, random_state = 42)
tree = DecisionTreeClassifier(random_state = 0)
tree.fit(X_train, y_train)
print("훈련 세트 정확도: {:.3f}".format(tree.score(X_train, y_train)))
print("시험 세트 정확도: {:.3f}".format(tree.score(X_test, y_test)))
훈련 세트 정확도: 1.000 시험 세트 정확도: 0.937
#사전 가지치기 적용해서 트리의 성장 막기
tree = DecisionTreeClassifier(max_depth = 4, random_state = 0) #테스트 횟수를 4회로 제한
tree.fit(X_train, y_train)
print("훈련 세트 정확도: {:.3f}".format(tree.score(X_train, y_train)))
print("시험 세트 정확도: {:.3f}".format(tree.score(X_test, y_test)))
훈련 세트 정확도: 0.988 시험 세트 정확도: 0.951
2. 결정 트리 분석
2.1 유방암 데이터셋으로 결정 트리 시각화
from sklearn.tree import export_graphviz
export_graphviz(tree, out_file="tree.dot", class_names=["악성", "양성"],
feature_names=cancer.feature_names, impurity=False, filled=True)
with open("tree.dot") as f:
dot_graph = f.read()
# 이미지 사이즈 조정
import pydotplus
pydot_graph = pydotplus.graph_from_dot_data(dot_graph)
pydot_graph.set_size('"8,10!"')
pydot_graph.write_png('resized_tree.png')
gvz_graph = graphviz.Source(pydot_graph.to_string())
gvz_graph
2.2 트리의 특성 중요도 feature importance
트리를 만들 때 사용된 특성들의 중요도를 평가하는 척도로는 특성 중요도가 있다.
특성 중요도를 통해 트리의 작동 과정을 이해할 수 있다.
0과 1 사이의 값을 가지며, 1에 가까울수록 정확하게 타깃 클래스를 예측했음을 의미한다.
모든 속성들의 특성 중요도 합은 1이다.
print("특성 중요도: \n{}".format(tree.feature_importances_))
특성 중요도: [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.01019737 0.04839825 0. 0. 0.0024156 0. 0. 0. 0. 0. 0.72682851 0.0458159 0. 0. 0.0141577 0. 0.018188 0.1221132 0.01188548 0. ]
2.2.1 특성 중요도 시각화
def plot_feature_importance_cancer(model):
n_features = cancer.data.shape[1]
plt.barh(range(n_features), model.feature_importances_, align='center')
plt.yticks(np.arange(n_features), cancer.feature_names)
plt.xlabel("trait importance")
plt.ylabel("traits")
plt.ylim(-1, n_features)
plot_feature_importance_cancer(tree)
특성 중요도를 이해하려면 엔트로피와 정보증가량(IG)를 공부하면 된다.
특성 중요도의 값이 높다는 것은 해당 특성이 타깃값을 예측하는데 큰 도움이 된다는 뜻이다.
그러나 특성 중요도의 값은 그 자체가 클래스를 알아내는 데는 도움을 주지 못한다.
A특성이 높다는 것이 곧 해당 객체의 클래스가 A'클래스임을 의미하는 것이 아니라는 뜻이다.
특성 중요도는 데이터셋을 나누는 것에 도움을 주는 정보이다.
특성 중요도 값이 낮다고 해서 해당 특성이 분류에 유용하지 않다고 단정할 수도 없다.
다른 특성이 해당 특성의 정보를 포함하고 있어서 값이 낮은 걸 수도 있다.
#특성과 클래스 레이블이 복합적인 관계를 가지고 있을 때
#각각 두 개의 특성과 클래스를 가진 데이터셋 활용
tree = mglearn.plots.plot_tree_not_monotone()
display(tree)
Feature importances: [0. 1.]
특성과 클래스의 관계는 단순히 특성A보다 크면 a, 작으면 b식이 아니다. 생각보다 복합적일 수 있다.
위의 트리 구조 모델을 보면서 확인해보자.
특성 중요도 출력값을 보면, 둘 중 한 특성(트리 구조에서 보이는 X[1])의 특성 중요도 값이 1이다.
다른 한 특성(X[0])은 값이 0으로, 아예 분류 기준으로 사용되지 않았다.
이처럼 분류 모델은 하나의 특성만으로 데이터를 분류하고 있지만, 그 안에서도 분류되는 클래스 결과는 다소 복잡하다.
왜 그런지 살펴보자!
일단 루트 노드에서 X[1]보다 작은 데이터는 클래스1로 분류되었다.
반면, 그 다음 테스트에서 X[1]보다 작은 데이터 포인트들은 클래스0으로 분류되었다.
이는 하나의 특성을 사용하더라도 명쾌하게 '이것보다 크면 세모, 작으면 네모' 식으로 관계를 표현할 수 없다는 것을 보여준다.
그래서 특성과 클래스의 관계가 마냥 간단한 것이 아니라고 말하는 것이다.
3. 결정 트리 회귀
결정 트리 회귀는 분류와 비슷하게 구현된다.
그러나 짚고 넘어가야 할 속성이 있는데, 외삽extrapolation이다.
DesicionTreeRegressor를 비롯한 다른 트리 기반 회귀 모델은 훈련 데이터 이외의 다른 데이터 포인트에 대해 예측할 수 없다.
3.1 외삽 이해하기
#컴퓨터 메모리 가격 동향 데이터셋 불러오기
import pandas as pd
import os
ram_prices = pd.read_csv(os.path.join(mglearn.datasets.DATA_PATH, "ram_price.csv"))
plt.semilogy(ram_prices.date, ram_prices.price)
plt.xlabel("year")
plt.ylabel("price ($/byte)")
Text(0, 0.5, 'price ($/byte)')
# 2000년 이전을 훈련 데이터로, 2000년 이후를 테스트 데이터로 만들기.
#훈련 데이터 이외의 것으로 테스트 함으로써 회귀 모델의 외삽 성질을 알기 위함이다.
data_train = ram_prices[ram_prices.date < 2000]
data_test = ram_prices[ram_prices.date >= 2000]
# 가격 예측을 위해 날짜 특성만을 이용한다.
X_train = np.array(data_train['date']).reshape(-1,1)
# 데이터와 타깃의 관계를 간단하게 만들기 위해(선형으로 만들기 위해) 로그 스케일로 바꾼다.
y_train = np.log(data_train.price)
#각각의 모델을 훈련 데이터로 학습시키고 객체 생성하기
tree = DecisionTreeRegressor().fit(X_train, y_train)
linear_reg = LinearRegression().fit(X_train, y_train)
# 예측은 전체 기간에 대해서 수행한다.
X_all = np.array(ram_prices['date']).reshape(-1,1)
pred_tree = tree.predict(X_all)
pred_lr = linear_reg.predict(X_all)
# 예측한 값의 로그 스케일을 되돌린다.
price_tree = np.exp(pred_tree)
price_lr = np.exp(pred_lr)
plt.figure(figsize=(10, 7))
#그래프 표현하기
plt.semilogy(data_train.date, data_train.price, label="Train Data")
plt.semilogy(data_test.date, data_test.price, label="Test Data")
plt.semilogy(ram_prices.date, price_tree, label="Tree Regression Predict")
plt.semilogy(ram_prices.date, price_lr, label="Linear Regression Predict")
plt.legend()
<matplotlib.legend.Legend at 0x7f8a56aa9eb0>
위의 그래프를 확인해보면, 트리 회귀 모델은 2000년대 이후의 가격을 정확하게 예측하지 못한다.
훈련 데이터 이외의 데이터를 예측할 수 있는 능력이 없기 떄문이다. 이는 모든 트리 기반 모델이 가진 단점이다.
4. 결정 트리 매개변수
결정 트리는 복잡도를 제어하기 위한 사전 가지치기 매개변수를 가진다.
- max_depth
- max_leaf_nodes
- min_samples_leaf
위 세 종류의 매개변수 중 하나만 사용해도 트리 모델의 과대적합을 막을 수 있다.
결정 트리의 장점은 시각화가 쉽다는 점, 그리고 특성이 한 번에 하나씩 처리되기 때문에 데이터 스케일의 영향을 받지 않는다는 것이다.
특성이 개별적으로 처리되기 때문에 특성의 정규화, 표준화가 필요없다. 특성의 스케일과 속성(이진, 연속)이 여러가지 섞여있어도 괜찮다.
다만 매개변수를 사용하더라도 과적합의 경향을 띠기 쉬우므로 앙상블 방법을 사용해 보완해야 한다.
5. 결정 트리 앙상블
5.1 앙상블 Ensemble
앙상블이란 여러 머신러닝 모델을 연결해 더 강력한 모델을 만드는 기법이다.
회귀 문제에서 효과적인 앙상블 모델로는 랜덤 포레스트와 그래디언트 부스팅이 있다.
5.2 앙상블1_랜덤 포레스트 Random Forest 개념
결정 트리의 단점으로는 훈련 데이터에 과적합되는 경향이 있다는 것이 있다. 랜덤 포레스트는 이를 막는다.
랜덤 포레스트는 여러 개의 결정트리를 만들어낸다.
예측 자체는 잘 하지만 과적합되는 트리 모델의 성질을 이용해서 서로 다른 방향으로 과적합된 트리를 여러 개 만들어 사용한다.
여러 트리에서 도출되는 결과를 평균내서 사용하면 과적합 경향을 완화시킬 수 있다.
결과적으로, 트리 모델의 예측 성능은 유지하면서 과적합 경향만 줄어들게 된다.
랜덤 포레스트 앙상블을 위해서는 여러 독립적인 트리를 만들어야 한다. 서로 독립적인 트리를 만들기 위해 랜덤하게 만든다.
이를 위해서 테이터 포인트를 무작위로 선택하거나, 분할 테스트에서 특성을 무작위로 선택한다.
5.2.1 랜덤 포레스트 구축하기_부트스트랩 샘플링
트리를 여러 개 생성하는 랜텀 포레스트 기법을 위해서는 생성할 트리의 개수를 결정해야 한다.
개수를 결정하는 매개변수는 n_estimators를 사용한다.
각각의 트리는 서로 독립적이므로 알고리즘은 무작위 선택을 해야 한다. 이를 위해 부트스트랩 샘플을 생성한다.
부트스트랩 샘플은 전체 데이터셋 안의 데이터 포인트 개수를 반복 추출 횟수로 지정해 그만큼 무작위로 데이터를 반복 추출한다.
(예) 10개의 샘플이 있는 데이터셋에서 부트스트랩 샘플을 생성하면 10번 반복 추출한다.
이때 추출된 각 데이터셋에는 중복 추출된 데이터 포인트도 있고, 추출 누락된 데이터 포인트도 있을 수 있다.
그리고 각각의 샘플 데이터셋의 크기는 원래 데이터셋 크기와 동일하다.
부트스트랩에 대한 자세한 내용은 아래 글을 참고해보자!
https://modern-manual.tistory.com/31
부트스트랩으로 데이터셋을 만들었다면 이제 결정 트리를 만들 수 있다.
다만 각 노드에서 선택되는 특성은 '전체 특성을 대상으로' 정보증가량이 높은 순서대로가 아니라,
'무작위로 선택한 몇 개의 후보 특성들 중에서' 최선의(정보증가량이 높은) 특성을 선택해서 트리를 확장한다.
이때 얼만큼의 특성을 무작위로 선택할 것인지는 매개변수 max_feature로 결정한다.
그리고 무작위로 후보 특성을 골라내는 과정은 매 노드마다 반복되서 수행된다.
따라서 각각의 노드 안에서 형성되는 후보 특성은 모두 서로 다르다.
5.2.2 부트스트랩 샘플링_매개변수 설정하기
부트스트랩 샘플링에서는 max_feature매개변수가 중요하다.
max_feature은 무작위로 선택할 특성의 개수를 의미한다.전체 특성의 개수보다 적게 설정해야 의미가 있는 변수다!
그리고 1보다 커야 임의 선택되는 특성 그룹이 생성된다. 1일 경우에는 임의로 선택한 1개의 특성의 임계치만 찾게 된다.
- 정리
- max_feature은 각각의 트리에 적용할 특성의 개수를 선택한다.
- max_feature의 값이 클수록 전체 특성을 대상으로 만드는 일반적인 트리 모델과 비슷한 결괏값을 가진다.
- max_feature값이 1이 되면 각각의 트리는 1개의 임의로 선택된 특성을 사용해 만들어진다.
- 따라서 매개변수 값이 커질수록 랜덤 포레스트 드리들은 서로 비슷해질 것이다.
- 그리고 매개변수의 값이 작을수록 트리들의 독립성은 강해지고 데이터에 맞추기 위해서 노드의 개수가 많아질 것이다.(트리의 깊이가 깊어짐)
5.2.3 이론 개념 정리
랜덤 포레스트 예측은 다수의 랜덤 추출 샘플을 이용해 여러개의 트리를 만들어서 각각의 트리에 대한 예측을 만든다.
이후 최종 예측 방식은 알고리즘의 종류에 따라 다른데,
- 회귀 모델: 각각의 트리가 한 예측을 평균내어 최종 예측으로 채택
- 분류 모델: 약한 투표 전략. 각 트리 알고리즘이 출력 레이블의 확률을 제공한다. 이 확률을 평균내어 가장 높은 확률을 가진 클래스를 예측값으로 채택.
5.2.4 랜덤 포레스트 분석하기
#two_moon 데이터셋으로 트리 5개로 구성된 랜덤 포레스트 모델 만들기. (n_estimator=5)
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_moons
X, y = make_moons(n_samples=100, noise=0.25, random_state=3)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify = y, random_state=42)
forest = RandomForestClassifier(n_estimators=5, random_state=2)
forest.fit(X_train, y_train)
#랜덤 포레스트에 의해 만들어진 트리는 estimator_속성에 저장된다.
RandomForestClassifier(n_estimators=5, random_state=2)
#각 트리에서의 학습 결과의 평균으로 만들어낸 결정 경계 시각화하기
#2줄 3열 배열로 생성. 그래프들의 사이즈 지정
fig, axes = plt.subplots(2, 3, figsize=(15, 8))
for i, (ax, tree) in enumerate(zip(axes.ravel(), forest.estimators_)):
#enumerate()는 인덱스와 원소로 이뤄진 튜플을 출력하게 하는 내장함수
#ravel()는 다차원 배열을 1차원 배열로 변환해주는 함수
ax.set_title("tree {}".format(i))
mglearn.plots.plot_tree_partition(X, y, tree, ax = ax)
mglearn.plots.plot_2d_separator(forest, X, fill=True, ax=axes[-1, -1], alpha=.4)
axes[-1, -1].set_title("random forest")
mglearn.discrete_scatter(X[:, 0], X[:, 1], y) #산점도 그리기
[<matplotlib.lines.Line2D at 0x7f8a57e05c10>, <matplotlib.lines.Line2D at 0x7f8a57dee4f0>]
#유방암 데이터로 100개 트리로 이뤄진 랜덤 포레스트 적용하기
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, random_state=0)
forest = RandomForestClassifier(n_estimators=100, random_state=0)
forest.fit(X_train, y_train)
print("훈련 세트 정확도: {:.3f}".format(forest.score(X_train, y_train)))
print("시험 세트 정확도: {:.3f}".format(forest.score(X_test, y_test)))
훈련 세트 정확도: 1.000 시험 세트 정확도: 0.972
랜덤 포레스트는 매개변수 튜닝(노드의 개수 또는 클래스 안의 데이터 포인트 개수 제한)없이도 선형 모델, 단일 결정 트리보다 높은 정확도를 보인다.
단일 결정 트리에서 사전 가지치기를 했던 것처럼 max_feature 매개변수를 조정할 수도 있다. 그런데 안 해도 성능이 좋다.
렌덤 포레스트 또한 단일 모델과 같이 특성 중요도를 제공한다.
이때의 특성 중요도는 각각의 트리에서 계산한 특성 중요도를 취합한 값이다. 이는 단일 트리에서 나온 결과보다 신뢰도가 더 높다.
랜덤 포레스트 모델이 가지는 무작위성이 더 많은 경우의 수를 고려하게 만들어 데이터를 더 폭넓은 시각으로 볼 수 있게 하기 때문이다.
주의해야 할 점은, 랜덤 포레스트가 무작위성을 근거로 만들어지는 모델이므로 random_state값에 따라서 결과가 완전 달라진다는 것이다.
트리의 개수가 많을수록 random_state의 영향이 줄어들지만, 항상 같은 결과를 얻어야 하는 상황이라면 0으로 고정시키는 것이 좋다.
#유방암 데이터 랜덤 포레스트 모델의 특성 중요도
plot_feature_importance_cancer(forest)
5.3 앙상블2_그래디언트 부스팅 회귀 트리
그래디언트 부스팅 회귀는 이름에 회귀가 있는 것이지 분류와 회귀 문제 모두에 사용할 수 있다.
랜덤 포레스트와 비슷하게 여러개의 결정 트리를 만들어 강력한 모델을 만들지만
이전 트리의 오차를 보완하는 방식으로 트리를 생성하기 때문에 순치적으로 트리를 만든다는 차이점을 가진다.
그래디언트 부스팅 회귀에는 랜덤 포레스트와 달리 무작위성이 없다. 대신에 강력한 사전 가지치기를 수행한다.
그리고 깊이가 깊지 않은 트리(테스트 횟수가 비교적 적음)를 사용하기 때문에 메모리 용량을 적게 차지한다.
그래디언트 부스팅은 여러 간단한 모델(약한 학습기weak learner, 깊이가 얕은 트리를 의미)을 생성해 서로 연결하는 아이디어를 사용한다.
이때 여러 트리는 순차적으로 생성되어 연결되는데,
뒤에서 생성되는 트리는 앞에서 생성한 트리의 (예측값과 타깃값 사이의)오차값을 줄이는 방향으로 새롭게 생성된다.
2번째로 추가되는 트리는 1번째로 만든 트리의 오차를 줄이는 방향으로 만들어지는 것이다.
그래서 각각의 트리는 일부 데이터에 대해서만 예측을 잘 하지만, 그것들이 서로 연결되면 전체적인 트리 모델의 성능은 좋아진다.
5.3.1 그래디언트 부스팅의 매개변수
그래디언트 부스팅 회귀의 매개변수
그래디언트 부스팅은 랜덤 포레스트보다 매개변수에 좀 더 민감하게 반응한다.
사전 가지치기, 트리 개수 매개변수 이외에 그래디언트에서 중요한 매개변수로는 오차를 얼만큼 강하게 보정할 것인지를 결정하는 learning_rate가 있다.
learning_rate, 즉 학습률이 높으면 트리는 보정을 강하게 해서 모델을 더 복잡하게 만든다.
복잡도에 영향을 주는 또 다른 매개변수로는 n_estimators가 있다. 이는 생성할 트리의 개수를 지정하는 변수로,
n_estimator의 값이 클 수록 앙상블의 트리 개수가 더 많아져 모델의 복잡도가 올라간다.
- 학습률을 낮추면 비슷한 복잡도의 모델을 만들기 위해 더 많은 트리를 추가하게 된다.
- 트리의 개수가 많을수록 모델이 복잡해지고 과대적합의 가능성이 올라간다.
- 가능한 예산 내에서 트리의 개수를 설정한 뒤 적절한 학습률을 찾는 것이 일반적이다.
- 일반적으로 그래디언트 부스팅 모델에서 트리의 깊이(max_depth)는 5를 넘지 않으며, 매우 작게 설정한다.
5.3.2 그래디언트 부스팅 사용하기
#유방암 데이터셋으로 GradientBoostingClassifier 사용하기
from sklearn.ensemble import GradientBoostingClassifier
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, random_state=0)
gbrt = GradientBoostingClassifier(random_state=0)
gbrt.fit(X_train, y_train)
print("훈련 세트 정확도: {:.3f}".format(gbrt.score(X_train, y_train)))
print("시험 세트 정확도: {:.3f}".format(gbrt.score(X_test, y_test)))
훈련 세트 정확도: 1.000 시험 세트 정확도: 0.965
#훈련 세트의 정확도가 100%이므로 과대적합되었음을 알 수 있다. 과대적합을 막기 위한 방법으로 모델의 최대 깊이를 줄이거나 학습률을 낮추는 것이 있다.
#최대 깊이를 1로 정하기(사전 가지치기로 복잡도 제어)
gbrt = GradientBoostingClassifier(random_state=-0, max_depth=1)
gbrt.fit(X_train, y_train)
print("max_depth 훈련 세트 정확도: {:.3f}".format(gbrt.score(X_train, y_train)))
print("max_depth. 시험 세트 정확도: {:.3f}".format(gbrt.score(X_test, y_test)))
#학습률을 낮춰서 복잡도 제어하기
gbrt = GradientBoostingClassifier(random_state=-0, learning_rate=0.01)
gbrt.fit(X_train, y_train)
print("learning_rate 훈련 세트 정확도: {:.3f}".format(gbrt.score(X_train, y_train)))
print("learning_rate 시험 세트 정확도: {:.3f}".format(gbrt.score(X_test, y_test)))
max_depth 훈련 세트 정확도: 0.991 max_depth. 시험 세트 정확도: 0.972 learning_rate 훈련 세트 정확도: 0.988 learning_rate 시험 세트 정확도: 0.965
복잡도를 낮추는 매개변수를 사용한 결과, 훈련 세트의 정확도는 과적합 상태인 1보다 낮아지고 시험 세트의 성능은 개선됐음을 확인할 수 있다.
위의 예시에서는 최대 깊이를 설정하는 방법이 시험 세트의 성능을 최대로 향상시켰음을 볼 수 있다.
#그래디언트 부스팅 모델의 특성 중요도 시각화하기
#해당 모델은 일부 특성을 무시하고 있음을 확인할 수 있다.(값이 0인 특성들을 가리킨다.)
gbrt = GradientBoostingClassifier(random_state=0, max_depth=1)
gbrt.fit(X_train, y_train)
plot_feature_importance_cancer(gbrt)
'배우는 것 > Maching Learning' 카테고리의 다른 글
# 11. 이진 분류, 선형 분류 모델, 로지스틱 회귀, 지원 벡터 기계 (0) | 2021.12.28 |
---|---|
#10. 선형 모델, 선형 회귀, 릿지 회귀, 라쏘 회귀, 복잡도 제어 (0) | 2021.12.27 |
#9. 과적합, 과소적합, 일반화, 이전 글에 대한 배경지식 확장 (0) | 2021.12.27 |
#8. 최근접 이웃 알고리즘 실습, 이웃의 개수가 지도학습에 미치는 영향 (0) | 2021.12.27 |
#7. 파이썬 기본지식 공부(2)_스칼라형, 튜플, 리스트, 사전 (0) | 2021.12.23 |