⚙️ Clustering
📌 Clustering
- 개념 : 유사한 성격을 가진 객체를 묶어 그룹으로 구성하는 것이다.
- 참고사항 : 훈련에 대한 정답이 없는 비지도 학습이다.
📌 K-means
- 기본 과정
- 랜덤하게 초기값을 중심으로 일단 거리를 계산해 그룹을 정한다.
- 그 그룹들의 거리를 다시 계산하고 그룹을 재편하는 과정을 그룹의 변화가 없을 때까지 반복한다
- 특징
- 초기값에 따라 결과가 다양하게 나타날 수 있다.
- 클러스터의 사이즈 및 데이터의 분포에 영향을 받는다.
📌 K-Medoid
- 개념 : K-means와 비슷하지만, 계산에 시간이 더 많이 걸린다.
📌 Hierarchical Clustering
- 개념 : 거리를 중심으로 하나씩 자신의 그룹으로 포섭해가는 방식이다.
- 기본 과정
- 각 데이터들 사이의 거리를 계산한다.
- 각 점들 사이에 클러스터를 할당한다.
- 각 클러스터 사이에 M&A를 진행한다.
- 계속해서 유사한 것들을 대상으로 진행한다.
📌 DBSCAN
- 개념 : 거리 기반 군집화 방법들과 달리, 밀도 기반으로 군집화하는 방법이다.
- 특징
- 밀도를 고려하기 때문에, 거리 + 멤버 수를 같이 고려한다.
- 클러스터 수를 지정하지 않고 그룹핑한다.
- 기하학적 연결 중심으로 유사한 것들을 찾아간다.
📌 SOM
- 개념 : 다차원의 특징 벡터를 차원 축소 시켜주며 동시에 클러스터링 해주는 기법이다.
- 특징
- 인공신경망을 기본으로 하고 있다.
- 저차원 격자에서의 객체간 유사도를 고차원 공간에서 최대한 보존하여 군집화하고자 한다.
- 데이터 수가 많으면 잘 안될 수 있다.
📌 BIRCH
- 개념 : Clustering Feature Tree를 기반으로 동작하여 빠르게 연산이 가능한 방법이다.
⚙️ Optuna
📌 소개
- 2019년 일본 연구진들이 기존 Hyper Parameter Optimization(HPO)의 여러 방식들의 장점을 결합하여 만든 방법론으로, 시각화 기능까지 탑재하고 있다.
📌 기본 사용법
import optuna
# 개별 데이터를 바탕으로 무엇을 할지 지정
def objective(trial):
x = trial.suggest_float("x", -10, 10)
return (x-2)**2
# 학습 생성
study = optuna.create_study()
# 무엇을 대상으로 학습할지 지정
study.optimize(objective, n_trials = 100)
# 학습을 통해 얻은 최적값
study.best_params
📌 학습 과정 세팅
- optuna를 사용하여 파라미터를 세팅하는 경우, 함수 형태로 진행해야 한다.
def rf_objective(trial):
# 1. 파라미터 범위 설정
params = {
# 파라미터가 정수값을 사용할 때
"n_estimators": trial.suggest_int("n_estimators", 100, 5000),
"max_depth": trial.suggest_int("max_depth", 1, 100),
"min_samples_leaf": trial.suggest_int("min_samples_leaf", 1, 20),
"max_features": trial.suggest_int("max_features", 1, X_train.shape[1]),
"max_leaf_nodes": trial.suggest_int("max_leaf_nodes", 2, 1000),
# 파라미터가 범주값을 사용할 때
"criterion" : trial.suggest_categorical("criterion", ["gini", "entropy", "log_loss"]),
}
# 2. 테스트할 파라미터를 받아줄 모델 세팅
rf = RandomForestClassifier(n_jobs = -1, random_state = 1234, **params)
# 3. 학습 진행
rf.fit(X_train, y_train)
# 4. 평가 진행
scores = cross_val_score(rf, X_train, y_train, cv = kfold, scoring = "accuracy")
acc_mean = scores.mean()
# 5. OPT : 최적화할 대상 지정
return acc_mean
📌 학습 진행
# 학습 방법 세팅
rf_study = optuna.create_study(direction = "maximize")
# 학습 진행
rf_study.optimize(rf_objective, n_trials = 50, n_jobs = -1)
📌 결과 확인
# 가장 좋았던 파라미터 조합
print(rf_study.best_params)
print('-'*100)
# 가장 좋았던 정확도
print(rf_study.best_trial.values)
📌 결과 시각화
import plotly
# 테스트 결과 시각화
optuna.visualization.plot_optimization_history(rf_study)
# 변수들의 범위 시각화
optuna.visualization.plot_parallel_coordinate(rf_study)
# 파라미터들의 중요도 시각화
optuna.visualization.plot_param_importances(rf_study)
📌 최적의 파라미터로 재학습 진행
opt_rf = RandomForestClassifier(n_jobs = 1, random_state = 1234, **rf_study.best_params)
opt_rf.fit(X_train, y_train)
accuracy_score(y_val, opt_rf.predict(X_val))
📌 각 변수의 중요도 파악
import matplotlib.pyplot as plt
opt_rf.feature_importances_
temp = pd.DataFrame(
{
"IF":opt_rf.feature_importances_
},
index = list(X_train.columns )
)
temp.sort_values(by="IF").plot(kind="barh")