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

20230611 빅분기 3회 실기 기출 작업형2

by 착실하게 2023. 6. 11.
반응형

강의 보기 전에 내 코드 작성 

 

# 작업형2 기출 3회 실기
# 예측할 컬럼: Travel Insurance
# 보험가입 확률을 묻는 문제

########### 자료불러오기 ###########
import pandas as pd 

train = pd.read_csv('data/3rd/train.csv') #시험에서 주어지는 파일
test = pd.read_csv('data/3rd/test.csv') #시험에서 주어지는 파일 
y_test = pd.read_csv('data/3rd/y_test.csv') # 선생님이 만드신 파일 

print(train.head())
print(test.head()) # Travel Insurance 컬럼이 없음 

###########
# EDA 

print(train.isnull().sum()) #결측치 없음
print(test.isnull().sum()) #결측치 없음 

print(train.info()) #int 6개 object 4개 
print(test.info()) #int 5개 object 4개 

print(train.describe())
print(test.describe())

print(train.describe(include='object'))
print(test.describe(include='object'))
# unique 카운트를 보니까 categorical data 컬럼 4개 모두 unique 값이 2개 뿐이다. 원핫해도 되지만 라벨인코딩 해볼까함

# 이상치 처리는 어떻게 해야할지 고민인데 일단 Age는 25-35세 데이터이며 특별한 이상치는 없어보임. 

# ChronicDiseases 는 이미 라벨인코딩 된 느낌의 데이터임.

###########
# Feature Engineering 

# print(train['Employment Type'].head())
cols = ['Employment Type','GraduateOrNot','FrequentFlyer','EverTravelledAbroad']

from sklearn.preprocessing import LabelEncoder

encoder = LabelEncoder()
for col in cols: 
  train[col] = encoder.fit_transform(train[col])
  test[col] = encoder.transform(test[col])

print(train.head())


# Scaling
# Age 에 MinMaxScaler 적용하고 싶었는데 ㅠㅠ 코드가 생각이 안남.....
from sklearn.preprocessing import MinMaxScaler

cols = ['Age','AnnualIncome']
scaler = MinMaxScaler()
# for col in cols: 
  # train[col] = MinMaxScaler(train[col])
  # test[col] = scaler.transform(test[col])


# print(train.head())

################################# 
# train_test_split

# Train dataset에서 맨마지막 컬럼분리

y_train = train.pop('TravelInsurance')
y_test_id = test.iloc[:,0]

print(y_train.head())
print(train.head())
print(y_test_id.head())

from sklearn.model_selection import train_test_split 

X_tr, X_val, y_tr, y_val = train_test_split(train, y_train, random_state=2022, test_size=0.2)



print("==================================")
################################# 
# 분류 문제로 판단하고 모델링. 
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 accuracy_score 
from sklearn.metrics import roc_auc_score 

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


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

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

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

# RandomForestClassifier 로 선택했음 

# print('lightgbm')
# model = lightgbm.LGBMClassifier(random_state=2022)
# model.fit(X_tr,y_tr)
# pred = model.predict(X_val)
# print(accuracy_score(y_val,pred))

################################# 
# test 데이터를 예측하고 제출 

pred = model.predict_proba(test)

# print(pred)
submit = pd.DataFrame({
  'index' : y_test_id,
  'y_pred' : pred[:,1]
})
print(submit.head())

submit.to_csv('data/3rd/20230611_3rd.csv',index=False)

################################# 
# print(accuracy_score(y_test , pred ))
print(roc_auc_score(y_test , pred[:,1] ))

 

아래는 퇴근후딴짓 선생님 강의 들으면서 메모  

 

1. 스케일러 관련 코드 

스케일러는 반복문 쓰면 에러남. 

 

2. 피쳐 엔지니어링 때 numerical, categorical 데이터 분리 하기 

아마 num_iter 넘친다고 에러난게 이거 분리 안해서 그런듯. 왜냐면 그 부분 바꾸니까 같은 스케일러 써도 그 에러 안 났음.

그러니까 항상 분리해서 해주고, 합쳐서 뒤에 모델링 하는거로 습관을 들이기로 하자!! 

 

# 내 코드 베이스에 선생님 코드로 수정하고, 강의 들으면서 메모한 버전 

# 작업형2 기출 3회 실기
# 예측할 컬럼: Travel Insurance
# 보험가입 확률을 묻는 문제

########### 자료불러오기 ###########
import pandas as pd 

train = pd.read_csv('data/3rd/train.csv') #시험에서 주어지는 파일
test = pd.read_csv('data/3rd/test.csv') #시험에서 주어지는 파일 
y_test = pd.read_csv('data/3rd/y_test.csv') # 선생님이 만드신 파일 

print(train.head())
print(test.head()) # Travel Insurance 컬럼이 없음 

###########
# EDA 

print(train.isnull().sum()) #결측치 없음
print(test.isnull().sum()) #결측치 없음 

print(train.info()) #int 6개 object 4개 
print(test.info()) #int 5개 object 4개 

print(train.describe())
print(test.describe())

print(train.describe(include='object'))
print(test.describe(include='object'))
# unique 카운트를 보니까 categorical data 컬럼 4개 모두 unique 값이 2개 뿐이다. 원핫해도 되지만 라벨인코딩 해볼까함

# 이상치 처리는 어떻게 해야할지 고민인데 일단 Age는 25-35세 데이터이며 특별한 이상치는 없어보임. 

# ChronicDiseases 는 이미 라벨인코딩 된 느낌의 데이터임.

# train의 y target 데이터에 value_counts() 추가로 해주면 더 좋았을 것이다. 
print(train['TravelInsurance'].value_counts()) # target 데이터 비율 확인 

###########
# Feature Engineering 

# 수치형 데이터와 범주형 데이터 분리
n_train=train.select_dtypes(exclude='object').copy()
c_train=train.select_dtypes(include='object').copy()

n_test=test.select_dtypes(exclude='object').copy()
c_test=test.select_dtypes(include='object').copy()

# 수치형 데이터 - 스케일러

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()
cols = ['Age','AnnualIncome','FamilyMembers','ChronicDiseases']

print(n_train.head())

n_train[cols] = scaler.fit_transform(n_train[cols])
n_test[cols] = scaler.transform(n_test[cols])

print(n_train.head())

# 범주형 데이터 - 원핫인코딩
print(c_train.head())

c_train = pd.get_dummies(c_train)
c_test = pd.get_dummies(c_test)

print(c_train.head())

# 분리한 데이터 다시 합치기 
train = pd.concat([n_train,c_train],axis=1)
test = pd.concat([n_test,c_test],axis=1)
print(train.shape,test.shape)
print(train.head())


################################# 
# train_test_split

# Train dataset에서 맨마지막 컬럼분리

# y_train = train.pop('TravelInsurance')
# y_test_id = test.iloc[:,0]

# print(y_train.head())
# print(train.head())
# print(y_test_id.head())

from sklearn.model_selection import train_test_split 

X_tr, X_val, y_tr, y_val = train_test_split(train.drop('TravelInsurance',axis=1), train['TravelInsurance'], random_state=1204, test_size=0.1)


print("==================================")
################################# 
# 분류 문제로 판단하고 모델링. 
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 accuracy_score 
from sklearn.metrics import roc_auc_score 

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


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

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

print('RandomForestClassifier')
model = RandomForestClassifier(
  n_estimators=400,max_depth=9,random_state=1204)
model.fit(X_tr,y_tr)
pred = model.predict_proba(X_val)
# print(accuracy_score(y_val,pred))
print(roc_auc_score(y_val,pred[:,1]))

# RandomForestClassifier 로 선택했음 

# print('lightgbm')
# model = lightgbm.LGBMClassifier(random_state=2022)
# model.fit(X_tr,y_tr)
# pred = model.predict(X_val)
# print(accuracy_score(y_val,pred))

################################# 
# test 데이터를 예측하고 제출 

pred = model.predict_proba(test)[:,1]

# print(pred)
submit = pd.DataFrame({
  'index' : test.index,
  'y_pred' : pred
})
# print(submit.head())

submit.to_csv('data/3rd/20230611_3rd.csv',index=False)

ans = pd.read_csv('data/3rd/20230611_3rd.csv')

print(ans.head())

print(roc_auc_score(y_test , pred ))

 

 

반응형

댓글