본문으로 바로가기
728x90

[작업형 2]

아래는 백화점 고객의 1년 간 구매 데이터이다.

 

(가) 제공 데이터 목록

1. y_train.csv : 고객의 성별 데이터 (학습용)

2. X_train.csv, X_test.csv : 고객의 상품구매 속성 (학습용 및 평가용)

 

(나) 데이터 형식 및 내용

1. y_train.csv (3,500명 데이터)

- custid : 고객 ID

- gender : 고객의 성별 (0: 여자, 1: 남자)

2. X_train.csv (3,500명 데이터), X_test.csv (2,482명 데이터)

 

고객 3,500명에 대한 학습용 데이터(y_train.csv, X_train.csv)를 이용하여 성별예측 모형을 만든 후,

이를 평가용 데이터(X_test.csv)에 적용하여 얻은 2,482명 고객의 성별 예측값(남자일 확률)을

다음과 같은 형식의 CSV 파일로 생성하시오. (제출한 모델의 성능은 ROC-AUC 평가지표에 따라 채점)

 

(유의사항)

- 성능이 우수한 예측모형을 구축하기 위해서는 적절한 데이터 전처리, Feature Engineering,

분류 알고리즘 사용, 초매개변수 최적화, 모형 앙상블 등이 수반되어야 한다.

- 수험번호.csv 파일이 만들어지도록 코드를 제출한다.

- 제출한 모델의 성능은 ROC-AUC 평가지표에 따라 채점한다.

 

# 출력을 원하실 경우 print() 함수 활용
# 예시) print(df.head())

# getcwd(), chdir() 등 작업 폴더 설정 불필요
# 파일 경로 상 내부 드라이브 경로(C: 등) 접근 불가

# 데이터 파일 읽기 예제
import pandas as pd
X_test = pd.read_csv("data/X_test.csv")
X_train = pd.read_csv("data/X_train.csv")
y_train = pd.read_csv("data/y_train.csv")

# 사용자 코딩
# 데이터 파악
print(X_train.info())
print(X_train.describe())
print(X_train.head())

# 결측치 확인
print(X_train.isna().sum())
print(X_test.isna().sum())

# 결측치 제거
X_train['환불금액'] = X_train['환불금액'].fillna(0)
X_test['환불금액'] = X_test['환불금액'].fillna(0)

# 라벨 인코더
label = ['주구매상품', '주구매지점']
from sklearn.preprocessing import LabelEncoder
X_train[label] = X_train[label].apply(LabelEncoder().fit_transform)
X_test[label] = X_test[label].apply(LabelEncoder().fit_transform)
print(X_train[label].head())

# 카테고리화
print(X_train[label].value_counts())

category = ['주구매지점']
for i in category:
	X_train[i] = X_train[i].astype('category')
	X_test[i] = X_test[i].astype('category')
	
X_train = pd.get_dummies(X_train)
X_test = pd.get_dummies(X_test)
print(X_train.head())

# 파생변수 생성
X_train['총구매액_qcut'] = pd.qcut(X_train['총구매액'], 5, labels=False)
X_test['총구매액_qcut'] = pd.qcut(X_test['총구매액'], 5, labels=False)
print(X_train.head())

# 스케일
from sklearn.preprocessing import MinMaxScaler
cols = ['총구매액', '최대구매액', '환불금액', '내점일수', '내점당구매건수', '주말방문비율', '구매주기']
scaler = MinMaxScaler()
scaler.fit(X_train[cols])
X_train[cols] = scaler.transform(X_train[cols])
X_test[cols] = scaler.transform(X_test[cols])
print(X_train.head())

# 데이터 분리
from sklearn.model_selection import train_test_split
X_train, X_valid, y_train, y_valid = train_test_split(X_train, y_train['gender'], test_size=0.2, random_state=42, stratify=y_train['gender'])

print(X_train.shape)
print(X_valid.shape)

# 모델 학습(앙상블)
from sklearn.linear_model import LogisticRegression
model1 = LogisticRegression()
model1.fit(X_train, y_train)
pred1 = pd.DataFrame(model1.predict_proba(X_valid))

from sklearn.ensemble import RandomForestClassifier
model2 = RandomForestClassifier()
model2.fit(X_train, y_train)
pred2 = pd.DataFrame(model2.predict_proba(X_valid))

from sklearn.ensemble import VotingClassifier
model3 = VotingClassifier(estimators=[('logistic', model1), ('rf', model2)], voting='soft')
model3.fit(X_train, y_train)
pred3 = pd.DataFrame(model3.predict_proba(X_valid))

# 모델 평가
from sklearn.metrics import roc_auc_score
print('logistic', roc_auc_score(y_valid, pred1.iloc[:, 1]))
print('rf', roc_auc_score(y_valid, pred2.iloc[:, 1]))
print('voting', roc_auc_score(y_valid, pred3.iloc[:, 1]))

# 하이퍼파라미터 튜닝
from sklearn.model_selection import GridSearchCV
params = {'n_estimators': [10, 20, 40, 80], 'max_depth':[4,6]}
model4 = RandomForestClassifier()
clf = GridSearchCV(estimator=model4, param_grid=params, cv=3)
clf.fit(X_train, y_train)
print(clf.best_params_)

# 답안 제출 참고
# 아래 코드 예측변수와 수험번호를 개인별로 변경하여 활용
# pd.DataFrame({'cust_id': X_test.cust_id, 'gender': pred}).to_csv('003000000.csv', index=False)
result = pd.DataFrame(model3.predict_proba(X_test))
pd.DataFrame({'custid': X_test['cust_id'], 'gender': result.iloc[:, 1]}).to_csv('003000000.csv', index=False)

check = pd.read_csv('003000000.csv')
print(check.head())
728x90