반응형
강의 보기 전에 내 코드 작성
# 작업형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 ))
반응형
'IT,SW,Data,Cloud,코딩 > Python' 카테고리의 다른 글
20230613 파이썬공부 (0) | 2023.06.13 |
---|---|
20230612 복습문제 (0) | 2023.06.12 |
20230611 빅분기 작업형1 모의문제 (0) | 2023.06.11 |
20230611 작업형1 모의문제1 (0) | 2023.06.11 |
20230611 빅분기 3회 기출 작업형1 (0) | 2023.06.11 |
20230611 빅분기 2회 기출 작업형 2 - 분류 (0) | 2023.06.11 |
20230610 파이썬공부 - 작업형 1 실습 (0) | 2023.06.10 |
20230610 파이썬공부 - 작업형2 (0) | 2023.06.10 |
댓글