[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.08.26
📕 학습 목록
- 만료 상태 변환일 예측 모델 개발
📗 프로젝트 작업 내역
1) 프로젝트 제목
만료 상태 변환일 예측 모델 개발
2) 프로젝트 목표
회원의 상태가 "만료"로 전환되는 시점을 예측하는 머신러닝 모델을 개발하여 고객 이탈을 사전에 방지할 수 있는 전략을 마련
3) 사용한 데이터 셋
- 데이터: 천재교육 서비스의 회원 활동 및 상태 변화 데이터(만료상태변환일예측.csv)
- 회원의 활동 패턴 및 상태 전환 정보에 대한 데이터를 기반으로 머신러닝 회귀 모델을 학습
4) 워크플로우
① 패키지 임포트
- 사용한 주요 패키지: pandas, seaborn, numpy, matplotlib, scikit-learn, imblearn
import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import MinMaxScaler
from imblearn.over_sampling import SMOTE
② 데이터 로드 및 요약
df = pd.read_csv("만료상태변환일예측.csv")
print(df.shape)
print(df.columns)
③ 데이터 전처리
- 결측값 확인 및 새로운 feature 생성
# 결측값 처리
df.fillna(0, inplace=True)
# 새로운 feature 생성
df['days_between_mean'] = df.groupby('userid')['days_between'].transform('mean')
df['days_between_slope'] = df.groupby('userid')['days_between'].transform(lambda x: np.polyfit(range(len(x)), x, 1)[0])
df['mcode_count'] = df.groupby('userid')['mcode'].transform('count')
④ 스케일링 및 변수 변환
- MinMaxScaler로 스케일링
scaler = MinMaxScaler()
df[['days_between_mean', 'days_between_slope', 'mcode_count']] = scaler.fit_transform(df[['days_between_mean', 'days_between_slope', 'mcode_count']])
⑤ 오버샘플링을 통한 클래스 불균형 해결
X = df[['days_between_mean', 'days_between_slope', 'mcode_count']]
y = df['change_date'] # 예측하려는 목표 변수
smote = SMOTE()
X_resampled, y_resampled = smote.fit_resample(X, y)
⑥ 모델 학습
- 랜덤 포레스트 회귀 모델을 활용한 예측
# 모델 정의
models = {
"Linear Regression": LinearRegression(),
"Random Forest Regressor": RandomForestRegressor(),
"Support Vector Regressor": SVR()
}
# 모델 학습 및 평가
for name, model in models.items():
model.fit(X_resampled, y_resampled)
y_pred = model.predict(X_resampled)
rmse = np.sqrt(mean_squared_error(y_resampled, y_pred))
print(f"{name} RMSE: {rmse}")
⑦ 성능 평가 및 시각화
# 학습 곡선 (랜덤 포레스트 회귀 모델)
from sklearn.model_selection import learning_curve
train_sizes, train_scores, test_scores = learning_curve(
RandomForestRegressor(), X_resampled, y_resampled, cv=5, scoring='neg_mean_squared_error'
)
# 시각화
train_scores_mean = -train_scores.mean(axis=1)
test_scores_mean = -test_scores.mean(axis=1)
plt.plot(train_sizes, train_scores_mean, label='Training error')
plt.plot(train_sizes, test_scores_mean, label='Validation error')
plt.xlabel('Training set size')
plt.ylabel('RMSE')
plt.legend()
plt.title("Learning Curve for Random Forest Regressor")
plt.show()
5) 프로젝트 결과
- 구현 기능
- 회원의 만료 상태 전환 시점을 예측할 수 있는 회귀 모델 구현
- 클래스 불균형 문제를 해결하고, 데이터 변환을 통해 모델 성능 최적화
- RMSE 및 학습 곡선을 통해 각 모델의 예측 성능을 분석하여 랜덤 포레스트 회귀 모델을 최적 모델로 선정
6) 트러블 슈팅
- 오류: "ValueError: cannot perform reduce with flexible type" - 데이터의 일부 열에 대한 연산이 불가능하여 발생한 오류
- 해결 방법: 숫자형 데이터만 필터링하여 계산을 수행하도록 데이터 유형을 강제 변환하고, 비정상 값이 포함된 열을 제거하여 오류를 해결
7) 프로젝트를 통해 얻은 역량
- 회귀 모델을 통한 시점 예측
- 모델 성능 평가
📙 내일 일정
- 머신러닝 모델의 검증
'TIL _Today I Learned > 2024.08' 카테고리의 다른 글
[DAY 33] xAI (0) | 2024.08.28 |
---|---|
[DAY 32] 머신러닝 모델의 검증 (0) | 2024.08.27 |
[DAY 30] 추천 시스템, 최적화 (1) | 2024.08.23 |
[DAY 29] Machine Learning 실습 (0) | 2024.08.22 |
[DAY 28] 회귀 / 차원축소 / 클러스터링 (0) | 2024.08.21 |