본문 바로가기
IT,SW,Data,Cloud,코딩/Python

20230611 빅분기 2회 기출 작업형 2 - 분류

by 착실하게 2023. 6. 11.
반응형
# 제품 배송 시간에 맞춰 배송 되었는지 예측 모델 만들기 
# 학습용 데이터를 이용하여 배송 예측 모형을 만든 후, 이를 평가용 데이터에 적용하여 얻은 예측 (시간에 맞춰 도착하지 않을 확률) 값을 다음과 같은 형식의 csv 파일로 생성하시오 (제출한 모델의 성능은 ROC-AUC 평가지표에 따라 채점)
# 0 정시 도착, 1 정시 도착하지 않음

# 시험환경 세팅 3개 파일 생성 (코드 변경 X)

################################
# 데이터 가져오기 & EDA 

import pandas as pd 

X_test = pd.read_csv('archive/X_test.csv')
X_train = pd.read_csv('archive/X_train.csv')
y_train = pd.read_csv('archive/y_train.csv')

print(X_test.shape, X_train.shape, y_train.shape)

print(X_train.head())
print(X_test.head())
print(y_train.head())

print(X_train.isnull().sum())
print(X_test.isnull().sum())
print(y_train.isnull().sum())

print(y_train['Reached.on.Time_Y.N'].value_counts())
print(X_train.info())
print(X_train.describe())

# categorical data 의 경우, trian dataset과 test dataset 의 unique한 데이터 종류를 확인해서, 만약 그 종류의 갯수가 다르다면, dataset을 합쳐서, label encoding 이나 one hot encoding 을 해주어야 한다. 

print(X_train.describe(include=object))
print(X_test.describe(include=object))

# [Tip] object 타입 고유값 개수 확인 #nunique #[[대괄호 2개인 점에 유의]] # 데이터프레임의 함수임 
print(X_train[['Warehouse_block','Mode_of_Shipment','Product_importance','Gender']].nunique())
# print(X_train[['Warehouse_block','Mode_of_Shipment','Product_importance','Gender']].nunique(dropna=False))

# unique()는 Series에 사용가능함.
print(X_train['Warehouse_block'].unique())

# X 데이터와 Y 데이터 target 값만 합치기 
# 뒤쪽에 target을 붙여서 작업하는 이유: 데이터간의 상관관계를 직관적으로 알아보기 편하다. 

df = pd.concat([X_train, y_train['Reached.on.Time_Y.N']],axis=1)
print(df.head(1)) #잘 붙었는지 확인

cond = df['Discount_offered'] > 50 
print(sum(cond)) #1
print(sum(df[cond]['Reached.on.Time_Y.N'])) #2
# cond를 바꿔가면서 1과 #2의 건수를 확인해보면, cond 의 변화 (cond의 변수)에 따라 y (target) 값의 변화를 직관적으로 확인하기 좋다. 


################################
# 데이터 전처리 및 피처엔지니어링

cols = X_train.select_dtypes(include='object').columns
# print(cols) 
# .columns 해주면 컬럼명만 반환 받음 

from sklearn.preprocessing import LabelEncoder

encoder = LabelEncoder()
for col in cols: 
  
  X_train[col] = encoder.fit_transform(X_train[col])
  X_test[col] = encoder.transform(X_test[col])

print(X_train.head())
print(X_test.head())

# train data 의 id 값은 필요없어서 drop 
# test data 의 id 값는 학습 시 필요없으나 나중에 필요하므로 pop 

X_train = X_train.drop('ID',axis=1)
X_test_id = X_test.pop('ID')

################################
# train_test_split 
# train data로 train dataset, validation dataset 분리하기. 

from sklearn.model_selection import train_test_split

X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train['Reached.on.Time_Y.N'], random_state=2021, test_size=0.2)

print(X_tr.shape,X_val.shape,y_tr.shape,y_val.shape)


################################
# 모델 및 평가 

# 모델링 라이브러리
from sklearn.linear_model import LogisticRegression 
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier 
from xgboost import XGBClassifier 
import lightgbm 

#평가 라이브러리
from sklearn.metrics import roc_auc_score 

model = LogisticRegression(random_state=2022)
model.fit(X_tr,y_tr)
pred = model.predict_proba(X_val)
print('LogisticRegression', roc_auc_score(y_val,pred[:,1]))


model = DecisionTreeClassifier(random_state=2022)
model.fit(X_tr,y_tr)
pred = model.predict_proba(X_val)
print('DecisionTreeClassifier', roc_auc_score(y_val,pred[:, 1]))

model = RandomForestClassifier(random_state=2022)
model.fit(X_tr,y_tr)
pred = model.predict_proba(X_val)
print('RandomForestClassifier', roc_auc_score(y_val,pred[:,1]))

model=XGBClassifier(random_state=2022)
model.fit(X_tr,y_tr)
pred = model.predict_proba(X_val)
print('XGBClassifier', roc_auc_score(y_val,pred[:,1]))

# model = lightgbm.LGBMClassifier(random_state=2022)
# model.fit(X_tr,y_tr)
# pred = model.predict_proba(X_val)
# print('LGBMClassifier', roc_auc_score(y_val,pred[:,1]))

################################
# test data 예측 및 제출 

pred = model.predict_proba(X_test)

submit = pd.DataFrame({
  'ID' : X_test_id, 
  'Reached.on.Time_Y.N' : pred[:,1]
})

print(submit.head())

submit.to_csv('archive/20230611_18.csv',index=False) 

#index=False 안해주면 index외에 unnamed 같은게 하나 더나온다

submit_test = pd.read_csv('archive/20230611_18.csv')

print(submit_test.head())
반응형

댓글