(모델링 실습 코드만 정리한 글임..!)
🌀 데이터 준비
(1) 데이터 불러오기
path = 'https://---.csv'
data = pd.read_csv(path)
data = data.sample(5000, random_state = 2022)
- csv 파일을 pandas DataFrame 형태로 불러옴
- 전체 데이터 중 5000개 샘플만 랜덤 추출
(2) 데이터 정리
drop_cols = ['id']
data.drop(drop_cols, axis = 1, inplace = True )
- 단순 식별자인 'id'를 제거
(3) 데이터 분할 1: x,y 나누기
target = 'CHURN'
x = data.drop(target, axis = 1)
y = data.loc[:, target]
- 타켓 변수와 설명 변수 분리
(NA는 없어서 전처리 과정에서 생략)
(4) 가변수화
dumm_cols = ['REPORTED_SATISFACTION','REPORTED_USAGE_LEVEL','CONSIDERING_CHANGE_OF_PLAN']
x = pd.get_dummies(x, columns = dumm_cols, drop_first = True)
get_dummies함수를 사용해 0/1 형태의 더미 변수로 변환drop_first=True: 기준 범주 하나를 제거하여 다중공선성 문제 방지
(5) 데이터 분할2: Train, Validation 나누기
x_train, x_val, y_train, y_val = train_test_split(x, y, test_size=.3, random_state=2022)
(6) Scaling
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train)
x_val = scaler.transform(x_val)
- SVM은 거리 기반 알고리즘이기 때문에 Scaling 필수!
MinMaxScaler: 모든 feature 값을 0~1 범위로 정규화
🌀 모델링
(1) 필요한 함수 불러오기
# 모델링을 위해
from sklearn.svm import SVC
# 평가를 위해.
from sklearn.metrics import *
- SVC: 분류
- SVR: 회귀
(2) 선언
model = SVC() # default: kernel = 'rbf'
(3) 모델링
model.fit(x_train, y_train)
- train 데이터를 이용해 결정 경계 학습
- 서포트 벡터를 기반으로 최적의 마진 결정 경계 생성
(4) 검증: 예측
pred = model.predict(x_val)
- 학습된 모델을 이용해 Validation 데이터에 대한 예측 수행
pred: 예측된 이탈 여부 (0 또는 1)
(5) 검증: 평가
- confusion matrix
confusion_matrix(y_val, pred)
- classification report
print(classification_report(y_val, pred))
precision recall f1-score support
LEAVE 0.68 0.60 0.64 731
STAY 0.66 0.73 0.69 769
accuracy 0.67 1500
macro avg 0.67 0.67 0.66 1500
weighted avg 0.67 0.67 0.67 1500
precision: 해당 클래스로 예측한 것 중 실제로 맞은 비율recall: 실제 해당 클래스 중 맞게 예측한 비율f1-score: precision과 recall의 조화 평균accuracy: 전체 예측 정확
즉, 현제 모델은 67% 수준의 성능을 보임
🌀 C와 Gamma를 조절한 모델 생성
모델 1. C ↓, gamma ↓ (단순한 모델)
(1) 모델 선언
# 모델 1: 마진을 넓게, 결정경계를 단순하게
model_1 = SVC(
C = 0.1,
gamma = 0.01,
kernel = 'rbf'
)
(2) 학습 및 예측
# 학습
model_1.fit(x_train, y_train)
# 예측
pred_1 = model_1.predict(x_val)
(3) 평가
print(confusion_matrix(y_val, pred_1))
print(classification_report(y_val, pred_1))
모델 2. C ↑, gamma ↑ (복잡한 모델)
(1) 모델 선언
model_2 = SVC(
C = 10,
gamma = 1,
kernel = 'rbf'
)
(2) 학습 및 예측
# 학습
model_2.fit(x_train, y_train)
# 예측
pred_2 = model_2.predict(x_val)
(3) 평가
print(confusion_matrix(y_val, pred_2))
print(classification_report(y_val, pred_2))
🌀 GridSearchCV로 SVM 최적의 C, gamma 찾기
GridSearchCV : 여러 개의 하이퍼파라미터 조합을 교차검증(Cross Validation) 으로 하나씩 전부 실험해서 가장 성능이 좋은 조합을 자동으로 찾아주는 방법
(1) GridSearchCV 불러오기
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
(2) 탐색할 파라미터 범위 설정
param_grid = {
'C': [0.1, 1, 10],
'gamma': [0.01, 0.1, 1],
'kernel': ['rbf']
}
(3) GridSearchCV 객체 생성
grid = GridSearchCV(
estimator = SVC(),
param_grid = param_grid,
scoring = 'f1', # 이탈/분류 문제에서 자주 사용
cv = 5 # 5-fold 교차검증
)
(4) 학습
grid.fit(x_train, y_train)
(5) 결과 확인
grid.best_params_ # 최적의 파라미터
{'C': 10, 'gamma': 0.1, 'kernel': 'rbf'}
grid.best_score_ # 최고 성능 점수
np.float64(0.6602850055583237)
(6) 최적 모델 자체
best_model = grid.best_estimator_
(7) Validation 데이터로 최종 검증
pred_best = best_model.predict(x_val)
print(confusion_matrix(y_val, pred_best))
print(classification_report(y_val, pred_best))
추가: 수동 Grid Search + 시각화 코드
C_list = [0.1, 1, 10]
gamma_list = [0.01, 0.1, 1]
for C in C_list:
for g in gamma_list:
model = SVC(
kernel='rbf',
C=C,
gamma=g
)
model.fit(x, y)
print(f"C={C}, gamma={g}")
svm_visualize(x, y, model, f"C={C}, gamma={g}")
'BDA-11th' 카테고리의 다른 글
| [BDA 11기] 데이터 분석 모델링(ML1) - 12주차 (1) | 2026.01.27 |
|---|---|
| [BDA 11기] 데이터 분석 모델링(ML1) - 11주차 (0) | 2026.01.15 |
| [BDA 11기] 데이터 분석 모델링(ML1) - 10주차 (0) | 2026.01.05 |
| [BDA 11기] 데이터 분석 모델링(ML1) - 9주차 (0) | 2026.01.04 |
| [BDA 11기] 데이터 분석 모델링(ML1) - 8주차 (0) | 2026.01.04 |