본문 바로가기
IT&게임/빅데이터분석기사(빅분기)

[공식문제] 빅분기 제2유형 예제 문제 (분류)

by 푸루루 2024. 6. 18.
728x90
반응형

 

이미지 썸네일 삭제
(체험) 제2유형 - 빅데이터분석기사 실기 체험

제공된 데이터는 백화점 고객이 1년간 상품을 구매한 속성 데이터이다. 제공된 학습용 데이터(data/customer_train.csv)를 이용하여 백화점 구매 고객의 성별을 예측하는 모델을 개발하고, 개발한 모델에 기반하여 평가용 데이터(data/customer_test.csv)에 적용하여 얻은 성별 예측 결과를 아래 【제출 형식】에 따라 CSV 파일로 생성하여 제출하시오. * 예측 결과는ROC-AUC평가지표에 따라 평가함 * 성능이 우수한 예측 모델을 구축하기 위해서는 데이터 정제, Feature Engineering, 하이퍼 파...

dataq.goorm.io

※ ROC-AUC를 보았다는건

-> 이진분류

-> 확률값을 예측해야하므로 predict_proba()를 사용해야함

※ CSV 파일예시가 010101 이라고 해서 꼭 그런건 아님

※ ROC-AUC는 1이 양성 클래스 이므로, 특별한 언급이 없다면 1인 확률을 보면됨 !!!

 

[가장 쉬운 방법 - 평가 데이터를 나누지 않았음]

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

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

import pandas as pd

train = pd.read_csv("data/customer_train.csv")
test = pd.read_csv("data/customer_test.csv")

#EDA
pd.set_option('display.max_columns',None)
print(train.shape, test.shape)

print(train.info())
# object 변수는 2개 밖에 없음 

# 결측치 제거해보자 > 환불금액에 결측치가 있고 이걸 0으로 채우자 
# print(train.isnull().sum()) 
# print(train.isnull().sum())


# 전처리하기 (안에다가 대입하는거 잊지말기, test도 처리하는거)

train['환불금액'] = train['환불금액'].fillna(0)
# print(train.isnull().sum())
test['환불금액']=test['환불금액'].fillna(0)

#잘모르니까 일단 수치형 데이터는 뻈음 
cols=['총구매액','최대구매액','환불금액','방문일수','방문당구매건수','주말방문비율','구매주기']
target = train.pop('성별')
# 모델 학습
from sklearn.ensemble  import RandomForestClassifier
rf=RandomForestClassifier()
rf.fit(train[cols],target)
pred = rf.predict_proba(test[cols])

df=pd.DataFrame({
	'pred':pred[:,1]
})
# print(df)

df.to_csv("result.csv",index=False)
result=pd.read_csv("result.csv")
print(result)
 

pd.set_option('display.max_columns',None) >> 이걸 넣으면 컬럼이 그나마 잘보임

 

검증용 데이터를 나누지 않으니 , 이게 진짜 잘된건지 확인할 바가 없음

그래서 검증용 데이터가 필요함

 

 

[검증용 데이터 나누기]

 

# 문제정의
# roc-auc -> 확률값을 예측 predict_proba()
# 양성(1, 남자) 클래스 확률값 
# 분류(이진)

# 데이터 불러오기
import pandas as pd
train = pd.read_csv("data/customer_train.csv")
test = pd.read_csv("data/customer_test.csv")

# EDA
pd.set_option('display.max_columns', None)
# print(train.shape, test.shape)
# print(train.head())
# print(train.info())
# print(train.isnull().sum())
# print(test.isnull().sum())
# print(train.describe(include='O'))
# print(test.describe(include='O'))
# print(sorted(list(train['주구매상품'].unique())))
# print(sorted(list(test['주구매상품'].unique())))

a = set(train['주구매상품'].unique())
b = set(test['주구매상품'].unique())

print(a - b)
print(b - a)

# 전처리
train['환불금액'] = train['환불금액'].fillna(0)
test['환불금액'] = test['환불금액'].fillna(0)

from sklearn.preprocessing import LabelEncoder
cols = ['주구매상품', '주구매지점']

for col in cols:
	le = LabelEncoder()
	train[col] = le.fit_transform(train[col])
	test[col] = le.transform(test[col])
	
target = train.pop('성별')

# 검증용 데이터 
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(train, target, test_size=0.2, random_state = 0)
print(X_tr.shape, X_val.shape, y_tr.shape, y_val.shape)

# 모델 학습 및 평가
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_tr, y_tr)
# pred = model.predict_proba(X_val[cols])
pred = model.predict_proba(X_val)

from sklearn.metrics import roc_auc_score
print(roc_auc_score(y_val, pred[:,1]))

# 제출 
pred = model.predict_proba(test)
submit = pd.DataFrame({
	'pred': pred[:,1]
})
submit.to_csv('result.csv', index=False)
print(pd.read_csv('result.csv'))


# 베이스라인 모델(수치형) : 0.57 
# predict : 0.55
# 레이블 인코딩 : 0.609
 

 

 

728x90

댓글