02.04(화) 본캠프 47일차 - 모델링 마무리 & 발표 준비 시작

Laña·2025년 2월 5일
0
post-thumbnail

찐찐 최종!!

드디어 모델링 코드 마무리했다...
사실 마지막의 마지막까지 나와서 뭔가 자꾸 수정해야할 것 같았지만, 일단 3차 모델의 최종 코드로 마무리하고 나머지는 개인적으로 해보신거라구 했다..!!

  • 기본 베이스 코드
# 기본적인 라이브러리, 데이터 마운트
from google.colab import drive
drive.mount('/content/drive')

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

plt.rc('font', family='NanumBarunGothic')

train = pd.read_csv("/content/drive/MyDrive/train.csv")
test = pd.read_csv("/content/drive/MyDrive/test.csv")

from sklearn.impute import SimpleImputer
from sklearn.impute import KNNImputer
from sklearn.cluster import KMeans
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split, RandomizedSearchCV, GridSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, f1_score
from imblearn.over_sampling import SMOTE
  • 전처리 함수 생성 (결측치 처리 + 라벨,빈도 인코딩 + KMeans 알고리즘)
# 제공플랫폼 별 결측치 여부
missing_ratio_by_platform = train.groupby('제공플랫폼').apply(lambda x: (x.isna().any(axis=1).sum()) / len(x)).to_dict()

train['제공플랫폼_결측치비율'] = train['제공플랫폼'].map(missing_ratio_by_platform)

# 관리비 + 월세 -> 파생변수1
train['price'] = train['월세'] + train['관리비']

def NaN_cnt(data):
  data['NaN_cnt'] = data.isna().sum(1)
  return data

# 게재일 관련 파생변수2
def Duration(data):
  data['게재일'] = pd.to_datetime(data['게재일'])
  data['게재일 수'] = (pd.to_datetime('today') - data['게재일']).dt.days
  data['게재일 월'] = data['게재일'].dt.month
  return data

# 결측값 처리
def Imputer(data):
  simple_imputer = SimpleImputer(strategy='median')
  columns_to_fill = ['해당층', '총층','총주차대수']
  data[columns_to_fill] = simple_imputer.fit_transform(data[columns_to_fill])
  data[['방수','욕실수']] = data[['방수','욕실수']].fillna(1.0)
  return data

def clustered_na(data, n_clusters):
  kmeans = KMeans(n_clusters=n_clusters, random_state=42)
  data['군집'] = kmeans.fit_predict(data[['보증금', '월세', '방수', '욕실수', '관리비']])
  mean_area_by_cluster = data.groupby('군집')['전용면적'].mean()
  for cluster, mean_area in mean_area_by_cluster.items():
      data.loc[(data['군집'] == cluster) & (data['전용면적'].isna()), '전용면적'] = mean_area
  return data

# Label Encoding
def LabelEnc(data):
  le = LabelEncoder()
  for col in ['매물확인방식', '방향', '주차가능여부']:
    data[col] = le.fit_transform(data[col])
  return data

# Frequency encoding
def FrequencyEnc(data, cols):
  for col in cols:
    freq = data[col].value_counts() / len(data)
    data[col + '_freq'] = data[col].map(freq)
  return data

def preprocess_data(data):
  data = NaN_cnt(data)
  data = Duration(data)
  data = Imputer(data)
  data = clustered_na(data, 5)
  data = LabelEnc(data)
  data = FrequencyEnc(data, ['중개사무소','제공플랫폼'])
  return data

train_processed = preprocess_data(train)
  • 모델 학습 및 검증
# 훈련 및 검증 데이터 분리

X = train_processed.drop(columns=['허위매물여부', 'ID', '중개사무소','제공플랫폼','군집','게재일'])
y = train_processed['허위매물여부']

X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.25, random_state=42)

#smote = SMOTE(random_state=42)
#X_train_resampled, y_train_resampled = smote.fit_resample(X_train, y_train)

# 모델 객체

best_rf_model = RandomForestClassifier(random_state=42, n_estimators=230, max_depth=9, min_samples_split=2, min_samples_leaf=5, max_features=8)
#230,9,2,5,8
# 모델 학습

best_rf_model.fit(X_train, y_train)

# 검증 데이터 평가

y_val_pred = best_rf_model.predict(X_val)

val_accuracy = accuracy_score(y_val, y_val_pred)
val_f1 = f1_score(y_val, y_val_pred)

print(f'Validation Accuracy: {val_accuracy}\n')
print(f'Validation f1-score: {val_f1}\n')
  • 하이퍼파라미터 튜닝 (gridsearch)
# 하이퍼파라미터 튜닝 (grid)

# 파라미터 초기 구간
rf_param_grid = { 'n_estimators' : [100,200,300], 'max_depth' : [8,10,12], 'min_samples_split' : [4,5,6], 'min_samples_leaf' : [4,5,6], 'max_features': [6,8,10]}

# 마지막 서치
rf_param_grid = { 'n_estimators' : [210,220,230], 'max_depth' : [9],'min_samples_split' : [2], 'min_samples_leaf' : [5], 'max_features': [8]}

rf_grid = GridSearchCV(best_rf_model, param_grid = rf_param_grid, scoring = 'f1', n_jobs = -1, verbose = 1)
rf_grid.fit(X_train, y_train)

# 마지막 서치로 나온 최종 best_parameter 값들을 모델 객체 생성시 넣어줬습니다!!!
  • 테스트 데이터 전처리 및 예측
# 테스트 데이터 전처리 및 예측
test['제공플랫폼_결측치비율'] = test['제공플랫폼'].map(missing_ratio_by_platform)

test['price'] = test['월세'] + test['관리비']

test_processed = preprocess_data(test)

X_test = test_processed.drop(columns=['게재일', 'ID', '중개사무소', '군집', '제공플랫폼'], errors='ignore')

test_pred = best_rf_model.predict(X_test)

# 예측 결과 저장
submission = pd.DataFrame({'ID': test_processed['ID'], '허위매물여부': test_pred})
submission.to_csv('submission.csv', index=False, encoding='utf-8-sig')

submission

이렇게 모델링 마무리!!!
그리고 대망의 ppt, 발표 대본 준비 시작..ㅜㅠ

profile
SQL, Python, Code Kata

0개의 댓글

관련 채용 정보