[결정트리] 에서 주요사용할 라이브러리
- category_encoders
- graphviz
- numpy
- pandas
- scikit-learn
"결정노드"를 어떻게 분류하는지에 따라 트리를 나눈다
- 정보 균일도가 높은 데이터 세트를 먼저 선택할 수 있도록 규칙 조건을 만들어줌
1. 정보 이득(엔트로피 개념 기반)
정보 이득 지수는 1-엔트로피 지수
정보이득이 높은 걸 기준으로 트리를 나눔
정보 획득량(Information Gain)은 부모 노드의 Entropy 에서 자식노드들의 Entropy 가중평균합을 뺀 값이다.
2. 지니 계수(엔트로피 개념 기반X)
- 지니 계수가 낮을수록 데이터 균일도가 높음
- 계산이 빠름
- 부모 노드의 Gini Impurity 보다 자식노드들의 Gini Impurity(가중평균합)가 커지면 더이상 트리를 나누지 않고, 부모 노드가 마지막 말단 노드가 된다.
ex) 사이킷런 DecisionTreeClassifier는 지니 계수를 이용해 데이터 세트 분할
왜 결정트리에서는 Standard Scaler를 사용하지 않을까?
a,b 클래스가 혼합된 데이터가 있을때 비율이 각각 (45%, 55%), (80%,20%)이면 불순도가 높은 것은?
특성 중요도가 낮은걸 빼고 모델링 하는것도 특성공학 방법 중 하나
1. min_sampes_split
2. min_samples_leaf
3. max_depth
from category_encoders import OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
# 파이프 라인을 사용하지 않았을 때
enc = OneHotEncoder()
imp_mean = SimpleImputer()
scaler = StandardScaler()
model_lr = LogisticRegression(n_jobs=-1)
X_train_encoded = enc.fit_transform(X_train)
X_train_imputed = imp_mean.fit_transform(X_train_encoded)
X_train_scaled = scaler.fit_transform(X_train_imputed)
model_lr.fit(X_train_scaled, y_train)
X_val_encoded = enc.transform(X_val)
X_val_imputed = imp_mean.transform(X_val_encoded)
X_val_scaled = scaler.transform(X_val_imputed)
# score method: Return the mean accuracy on the given test data and labels
print('검증세트 정확도', model_lr.score(X_val_scaled, y_val))
X_test_encoded = enc.transform(X_test)
X_test_imputed = imp_mean.transform(X_test_encoded)
X_test_scaled = scaler.transform(X_test_imputed)
y_pred = model_lr.predict(X_test_scaled)
코드가 여러줄이고 복잡합니다.
#파이프라인을 사용했을 때
pipe = make_pipeline(
OneHotEncoder(),
SimpleImputer(),
StandardScaler(),
LogisticRegression(n_jobs=-1)
)
pipe.fit(X_train, y_train)
print('검증세트 정확도', pipe.score(X_val, y_val))
y_pred = pipe.predict(X_test)
파이프라인을 사용하면 최소화하고 간단하게 적용할 수 있다.