제2회 빅데이터 분석기사(실기) - 제2유형 로지스틱회귀
작성자 정보
- ◆딥셀◆ 작성
- 작성일
컨텐츠 정보
- 17,014 조회
본문
제2회 빅데이터 분석기사(실기) - 작업형:제2유형(파이썬) 1 베이스라인의 내용을 제대로 다시 만들었습니다.
이 문서를 참고하시기 바랍니다.
최선의 모델을 선택하고 초매개변수 튜닝을 생략하고 로지스틱 회귀를 사용하여 바로 결과를 만드는 코드입니다.
베이스라인 코드에서 다음과 같은 부분을 수정하였습니다.
- 범주형 데이터의 인코딩 : 로지스틱회귀에서는 범주형 데이터를 원핫인코딩(One-Hot Encoding)하는 것이 맞는 것 같습니다.
- 변수 스케일 변환(Feature Scaling) : 수치형 데이터는 표준변환이나 MinMax 변환을 하면 되는데 MinMax 변환으로 할 경우 원핫인코딩한 값이 그대로 살아 있으므로 전체를 MinMax 변환하는 것이 작업이 간단합니다.
- 기타 : 실전을 대비하여 결과 파일을 먼저 만들고 시작합니다. 여차하면 이 파일을 제출합니다. 제출을 안하는 것보다는 좋겠죠?
코드(자세한 설명은 없습니다. 주석을 참고하세요.)
아래 코드를 복사하여 체험환경에서 실행하면 됩니다.
# 0. package import
import os
from time import time
import numpy as np
import pandas as pd
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.preprocessing import MinMaxScaler, RobustScaler, StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score
# 1. Data loard
data_dir = 'data'
X_train_file = os.path.join(data_dir, 'X_train.csv')
y_train_file = os.path.join(data_dir, 'y_train.csv')
X_test_file = os.path.join(data_dir, 'X_test.csv')
# X_train_df = pd.read_csv(X_train_file, encoding='euc-kr')
X_train_df = pd.read_csv(X_train_file)
y_train_df = pd.read_csv(y_train_file)
# X_test_df = pd.read_csv(X_test_file, encoding='euc-kr')
X_test_df = pd.read_csv(X_test_file)
# 제출파일 먼저 작성합니다.
# 나중에 제대로 구한 값으로 제출파일을 다시 작성합니다.
# 파일 쓰기를 다시하면 이전 파일에 덮어쓰기를 하므로 지우고 다시 만들 필요가 없습니다.
# 제출전 파일을 내용을 꼭 확인합니다.
exam_num = '0010' # 수험번호
file_name = exam_num + '.csv'
start_id = 3500
num_rec = 2482
default_value = 0.5
col_1_name = 'cust_id'
col_2_name = 'gender'
col_1 = X_test_df['cust_id']
# col_1 = np.array(range(start_id, start_id + num_rec))
col_2 = np.full(num_rec, default_value)
submit = pd.DataFrame({col_1_name:col_1, col_2_name:col_2})
submit.to_csv(file_name, index=False)
# 2. EDA
# 데이터의 정보를 봅니다.
'''
print(X_train_df.info())
print(X_train_df.describe())
'''
# 3. Data Preprocessing
train_df = pd.merge(y_train_df, X_train_df)
# 환불금액 최소값이 0이 아니므로 결측값을 0으로 변환(트레인 데이터 테스트 데이터 모두)
train_df['환불금액'] = train_df['환불금액'].fillna(0)
X_test_df['환불금액'] = X_test_df['환불금액'].fillna(0)
# 음수 데이터 삭제(트레인 데이터만)
train_df = train_df[train_df['총구매액'] >= 0]
# 입력 데이터 인코딩을 위해 데이터를 입력데이터와 라벨로 분리
X = train_df.drop(['cust_id', 'gender'], axis=1)
y = train_df.gender.values.ravel()
X_test = X_test_df.drop(['cust_id'], axis=1)
# 범주형 데이터를 더미변수로 변환(One-Hot-Encoding)
X_encoded = pd.get_dummies(X)
X_test_encoded = pd.get_dummies(X_test)
# 테스트 데이터에는 없는 범주는 0으로 채워 넣기
missing_cols = set(X_encoded.columns) - set(X_test_encoded.columns)
for c in missing_cols:
X_test_encoded[c] = 0
# 트레인에는 없는데 테스트에는 있는 범주는 제거
remain_cols = set(X_test_encoded.columns) - set(X_encoded.columns)
X_test_encoded = X_test_encoded.drop(remain_cols, axis=1)
#####################################################################
##### Scaling 전 데이터
##### X_encoded ### 트레이닝에 사용할 전체 데이터, 스케일링 해야함
##### X_test_encoded ### 제출에 사용할 테스트 데이터, 스케일링 해야함
# 4. data split
X_train, X_valid, y_train, y_valid = train_test_split(X_encoded, y, test_size=0.2, random_state=1, stratify=y)
# 5. feature scaling
# 스케일 변환 : 기본 표준스케일로, 경우에 따라 MinMaxScaler나 RobustScaler 사용
# MinMaxScaler로 할 경우 원핫인코딩된 데이터가 그대로 유지됨
# 모델 선택과 초매개변수 최적화를 위한 스케일링
# test data 추론을 위한 스케일링은 다시 해야함
# scaler = StandardScaler()
# scaler = RobustScaler()
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train = pd.DataFrame(scaler.transform(X_train), columns=X_train.columns)
X_valid = pd.DataFrame(scaler.transform(X_valid), columns=X_valid.columns)
# best_model = LogisticRegression(C=0.8549395013498206, penalty='l1', solver='liblinear')
best_model = LogisticRegression()
best_model.fit(X_train, y_train)
predict = best_model.predict_proba(X_valid)
print('valid_score : ', roc_auc_score(y_valid, predict[:, 1]))
# 6. 제출 답안 준비
# best_model을 전체 트레이닝 데이터를 모두 사용해서 다시 트레이닝
# 전체 트레인닝 데이터 X를 스케일링.
scaler.fit(X_encoded)
X_scaled = pd.DataFrame(scaler.transform(X_encoded), columns=X_encoded.columns)
X_test_scaled = pd.DataFrame(scaler.transform(X_test_encoded), columns=X_test_encoded.columns)
# 전체 training data로 다시 훈련한 뒤 test data를 예측하고 제출 파일 만들기
best_model.fit(X_scaled, y)
final_predict_proba = best_model.predict_proba(X_test_scaled)
# 제출 데이터를 추론 데이터로 재작성
submit['gender'] = final_predict_proba[:, :1]
submit.to_csv(file_name, index=False)
# 제출 전 확인
# path = './'
# print(os.listdir(path))
out_df = pd.read_csv(file_name)
print(out_df.head())
# 모두 정상적으로 되었으면 제출
관련자료
-
이전
-
다음