수준별 학습반
혼동행렬 시각화
cm = confusion_matrix(y_true, y_pred)
disp = ConfusionMatrixDisplay(confusion_matrix=cm)
disp.plot()
데이터에 맞는 시각화
1. 시간 추세 → Line plot
2. 분포 → Histogram, Box plot
3. 비교 → Bar chart
4. 비율 → Pie chart (3개 이내)
RFM 분류기법
고객분류기법
1️⃣Recency(최근성), 2️⃣Frequency(빈도), 3️⃣Monetary(구매금액)
예시) Recency: 2024-01-01 을 기준으로 한 달 이내에 구매기록이 있으면 ‘recent’ 아니면 ‘past’ 이런 식으로 분류함
군집화 프로세스
- 기간 선정
- K값(군집갯수), 초기 컬럼(피쳐) 선정
- 이상치 기준선정 및 제외
- 표준화
- 차원 축소
- PCA PLOT 으로 군집 밀도 확인
- 2~7번 과정을 반복하며 최적의 결과 도출
- 모델링(Random Forest)
- 데이터 적재 및 자동화 설정
머신러닝 6강 이어서
하이퍼파라미터 튜닝을 위한 준비
데이터셋 분리
train 데이터
vaiidation 데이터
test 데이터
교차검증
train 데이터를 여러 개의 validation데이터로 여러번 나누어 검증(이 세트를 fold라고함)
이 여러개의 성능의 평균이 최종 성능이라 봄
튜닝 방법
Grid Search: 파라미터 모든 조합 시도(후보가 적을 때 좋음)
Randomized Search: 임의로 샘플링된 하이퍼파라미터 조합을 일정 횟수만 시도(후보가 많을 때 좋음)
베이지안 최적화(Bayesian Optimization): 과거의 탐색 결과를 바탕으로 ‘가장 유망한 하이퍼파라미터 범위’를 중점적으로 탐색
그리드 서치 코드
# 3. 하이퍼 파라미터 후보군 설정
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [None, 5, 10]
}
# 4. GridSearchCV 생성
rf = RandomForestClassifier(random_state=42)
grid_search = GridSearchCV(
estimator=rf,
param_grid=param_grid,
cv=5, # 교차검증(fold) 횟수
scoring='accuracy',
n_jobs=-1, # 병렬 처리(가능한 모든 코어 사용)
)
# 5. 학습(그리드서치 수행)
grid_search.fit(X_train, y_train)
# 6. 최적 파라미터 및 성능 확인
print("Best Parameters:", grid_search.best_params_)
print("Best CV Score:", grid_search.best_score_)
이렇게 하면 가장 좋은 파라미터 조합과 성능이 다 나옴
MLOps(머신러닝 운영)란?
- Machine Learning + DevOps의 합성어
- 머신러닝 모델 개발부터 배포, 모니터링, 재학습, 롤백(Rollback) 등 전 과정을 자동화하고 효율적으로 운영하는 방법론 </aside>
앙상블 실습문제
xgboost 사용 후 평가
X_train,X_test,y_train,y_test = train_test_split(X, y,
test_size=0.2,
random_state=42,
stratify=y)
xgmodel = XGBClassifier(random_state=42)
xgmodel.fit(X_train,y_train)
yprd = xgmodel.predict(X_test)
print("=== XGBoost ===")
print("Accuracy:", accuracy_score(y_test, yprd))
print("Confusion Matrix:\n", confusion_matrix(y_test, yprd))
print("Classification Report:\n", classification_report(y_test, yprd))
cm = confusion_matrix(y_test, yprd)
disp = ConfusionMatrixDisplay(confusion_matrix=cm)
disp.plot()
정확도는 0.96이므로 높은 편이고 0클래스는 정밀도가 재현율보다 높으머 1 클래스는 재현율이 높고 정밀도가 낮다.
즉, 실제로 예측을 0(음성)으로 한 경우에는 대부분 실제로 음성이었지만, 실제 음성인 걸 양성으로 잘못 예측해서 놓친 경우는 있다
반면, 1 클래스는 실제로 양성인 데이터를 잘 놓치지 않고 예측했지만, 다른 클래스(음성)을 1(양성)으로 잘못 예측한 경우도 있었다
혼동행렬
혼동행렬 시각화를 보면
0의 재현율: 38/42
0의 정밀도 : 38/39
1의 재현율: 71/72
1의 정밀도: 71/75
피처 중요도
import matplotlib.pyplot as plt
# 4. 피처 중요도 추출
importances = xgmodel.feature_importances_
# 5. 시각화
plt.bar(range(len(importances)), importances)
plt.xticks(range(len(importances)), feature_names, rotation=90)
plt.xlabel("Feature")
plt.ylabel("Importance")
plt.title("Feature Importances in RandomForest")
plt.tight_layout()
plt.show()
# 가장 중요한 변수
most_important_idx = importances.argmax()
most_important_feature = feature_names[most_important_idx]
print("가장 중요한 변수:", most_important_feature)
가장 중요한 변수는 worst radius로 종양 반지름이다.
머신러닝 7강
비지도 학습
군집화(클러스터링)
같은 그룹끼리 공통저은 최대화, 다른 그룹과 차이는 극대화
k-means 클러스터링
몇 개의 군집(k)로 나눌건지 정하고 그 각 그룹의 중심을 결정하며 반복하여 가장 적절한 중심을 결정해나감
이상치 처리 하고 해야하
DBscan
데이터의 밀도를 봄
클러스터 개수 알아서 설정함
이상치 알아서 처리해줌
계층적 클러스터링
데이터 포인트 각각이 하나의 군집으로 시작 → 유사도가 가장 높은 군집들끼리 병합 → 최종적으로 하나의 군집(트리) 형성
# 3. K-Means
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans_labels = kmeans.fit_predict(X)
# 4. DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=5)
dbscan_labels = dbscan.fit_predict(X)
# 5. 계층적 클러스터링 (AgglomerativeClustering)
agg = AgglomerativeClustering(n_clusters=3)
agg_labels = agg.fit_predict(X)
# 6. 각 군집 결과의 실루엣 지수 평가
kmeans_sil = silhouette_score(X, kmeans_labels)
dbscan_sil = silhouette_score(X, dbscan_labels)
agg_sil = silhouette_score(X, agg_labels)
실루엣 계수(silhoutte)
응집도와 분리도 측정
-1~+1
높을수록 응집도로 측정
0에 가까울수록 경계에 있고 0 이하이면 잘못된 군집화
Davies-Bouldin Index
군집끼리 얼마나 겹치는지,
0에 가까울 수록 좋은 것
차원 축소 코드
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
군집화 실습문제
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering
from sklearn.metrics import silhouette_score
from sklearn.decomposition import PCA
import numpy as np
# 1. Wine 데이터셋 불러오기
from sklearn.datasets import load_wine
wine = load_wine()
X = wine.data
y = wine.target # 실제 레이블(군집 평가엔 직접 사용 안 함)
# 3. K-Means
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans_labels = kmeans.fit_predict(X)
# 4. DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=5)
dbscan_labels = dbscan.fit_predict(X)
# 5. 계층적 클러스터링 (AgglomerativeClustering)
agg = AgglomerativeClustering(n_clusters=3)
agg_labels = agg.fit_predict(X)
# 6. 각 군집 결과의 실루엣 지수 평가
kmeans_sil = silhouette_score(X, kmeans_labels)
agg_sil = silhouette_score(X, agg_labels)
print("=== 군집 결과 비교 ===")
print("K-Means: 실루엣 점수 =", kmeans_sil, "| 클러스터 라벨 =", np.unique(kmeans_labels))
print("Agglomerative: 실루엣 점수 =", agg_sil, "| 클러스터 라벨 =", np.unique(agg_labels))
dbscan_labels_unique = np.unique(dbscan_labels)
n_clusters_dbscan = len(dbscan_labels_unique[dbscan_labels_unique != -1]) # -1 (noise) 제외
if n_clusters_dbscan > 1:
dbscan_sil = silhouette_score(X, dbscan_labels)
else:
dbscan_sil = "실루엣 점수 계산 불가 (클러스터 수 부족)"
# 7. 시각화를 위해 PCA로 차원 축소 (2차원)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
# 8. 군집 결과 시각화
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
# K-Means 시각화
axes[0].scatter(X_pca[:, 0], X_pca[:, 1], c=kmeans_labels)
axes[0].set_title("K-Means")
# DBSCAN 시각화
axes[1].scatter(X_pca[:, 0], X_pca[:, 1], c=dbscan_labels)
axes[1].set_title("DBSCAN")
# Agglomerative 시각화
axes[2].scatter(X_pca[:, 0], X_pca[:, 1], c=agg_labels)
axes[2].set_title("Agglomerative")
plt.tight_layout()
plt.show()
dbscan은 자기가 군집화 해주기 때문에 군집이 한 개일 수 있음. 그럼 실루엣 평가를 못함
scatter에서 c는 컬러. 군집마다 컬러 다르게 설정해줌.
Agglomerative 쪽가 가장 군집 사이의 구분이 뚜렷해보인다고 생각함.
실루엣 점수와 davies 점수 둘 다 aglomerative가 좋은것을 알 수 있음.
davies 점수
from sklearn.metrics import davies_bouldin_score
dbi_kmeans = davies_bouldin_score(X, kmeans_labels)
dbi_agg = davies_bouldin_score(X, agg_labels)
print("KMeans Davies-Bouldin Index:", dbi_kmeans)
print("Agglomerative Davies-Bouldin Index:", dbi_agg)
'데이터분석 6기 > 본캠프' 카테고리의 다른 글
2025-04-17 머신러닝 총 정리 (회귀~분류) (0) | 2025.04.17 |
---|---|
2025-04-16 통계 총 정리 (1) | 2025.04.16 |
2025-04-11 머신러닝 5 (0) | 2025.04.11 |
2025-04-10 머신러닝 4 (1) | 2025.04.10 |
2025-04-09 머신러닝 3 (0) | 2025.04.09 |