빅데이터분석기사
실기 분류

제2회 빅데이터 분석기사(실기) - 제2유형 로지스틱회귀

작성자 정보

  • ◆딥셀◆ 작성
  • 작성일

컨텐츠 정보

본문

제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())


# 모두 정상적으로 되었으면 제출

 

관련자료

댓글 0
등록된 댓글이 없습니다.

최근글


새댓글


알림 0