본문 바로가기
TIL _Today I Learned/2024.08

[DAY 31] Machine Learning 실습

by gamdong2 2024. 8. 26.
[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 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