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

제2회 빅데이터 분석기사(실기) - 작업형:제2유형(파이썬) 1 베이스라인

작성자 정보

  • ◆딥셀◆ 작성
  • 작성일

컨텐츠 정보

본문

(아래 내용 중 인코딩을 라벨인코딩으로 한 것이 올바른 방법이 아닌 것 같습니다. 원핫인코딩으로 한 내용이 제2회 빅데이터 분석기사(실기) - 제2유형 로지스틱회귀에 있으니 참고하시기 바랍니다.)


예제 개요 


실기 안내 페이지에 있는 작업형 제2유형의 예제는 다음과 같습니다.


[예제]

작업형 제2유형 : 모형 구축 및 평가 영역


고객 3,500명에 대한 학습용 데이터(y_train.csv, X_train.csv)를 이용하여 성별예측 모형을 만든 후, 이를 평가용 데이터(X_test.csv)에 적용하여 얻은 2,482명 고객의 성별 예측값(남자일 확률)을 다음과 같은 형식의 CSV 파일로 생성하시오.(제출한 모델의 성능은 ROC-AUC 평가지표에 따라채점)


유형2의 문제는 배점이 40점입니다. 유형1의 배점이 10점인 것과 비교해 볼 때 난이도나 작업량이 만만치 않을 것으로 예상됩니다. 그래도 시험 준비이므로 전략적으로 접근할 필요가 있습니다. 간결하게 해결하여 제출할 답을 만들어 놓고 개선하는 쪽으로 공부한는 것이 좋을 것 같습니다.


EDA(Exploratory Data Analysis) 분석은 따로 하지 않고 데이터 탭을 이용하여 데이터를 훌터보는 것으로 대신하겠습니다. 그리고 간단하게 베이스라인(baseline) 코드를 먼저 만들어 보겠습니다. 결과의 정확성을 따지지 않고 가장 간결하게 만들어 보겠습니다.


자세한 내용은 다시 다루겠습니다.


작업 절차


1) 파일에 저장된 데이터 읽어 오기

2) 데이터 전처리

3) 모델 만들기

4) 훈련

5) 예측

6) 제출용 데이터 파일 작성


작업 절차 별 작업 방법


1) pandas를 사용하여 csv 파일 읽어서 DataFrame으로 저장

2) 데이터 중 숫자가 아닌 문자열 데이터가 있으므로 인코딩하여 숫자 데이터로 변환

3) 이진 분류 방법으로 가장 기본적인 sklearn의 로지스틱 회귀 분류기를 사용

4) .fit() 메써드를 사용하여 모델 훈련

5) predict_proba() 메써드에 테스트 데이터를 입려으로 하여 예측값 만들기

6) 문제에서 요구하는 제출형식에 맞는 제출용 csv 파일에 저장


이 방법에 따라 코딩을 해보겠습니다.


베이스라인 코드


### 1) 파일에 저장된 데이터 읽어 오기

import os

import pandas as pd


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) 

pandas.read_csv()를 이용하여 데이터를 읽어 옵니다. 공홈에서 다운로드 받은 데이터 파일을 한글이 euc-kr로 인코딩 된 것 같습니다. 그래서 위와 같이 인코딩 옵션을 줘야 읽을 수 있습니다. 응시환경체험(구름)에 있는 데이터는 utf-8인 것 같습니다. 인코딩 옵션을 없이 해야 읽을 수 있습니다.


### 2) 데이터 전처리

# 결측 데이터 처리

x_train_df = x_train_df.fillna(0)

x_test_df = x_test_df.fillna(0)


# Pandas의 factorize : sklearn의 라벨 인코딩과 유사 ( 빈도 순으로 인코딩 )

x_train_df.loc[:, "주구매상품"] = pd.factorize(x_train_df["주구매상품"])[0].reshape(-1,1)

x_train_df.loc[:, "주구매지점"] = pd.factorize(x_train_df["주구매지점"])[0].reshape(-1,1)


x_test_df.loc[:, "주구매상품"] = pd.factorize(x_test_df["주구매상품"])[0].reshape(-1,1)

x_test_df.loc[:, "주구매지점"] = pd.factorize(x_test_df["주구매지점"])[0].reshape(-1,1)


# cust_id 열 제거

x_train = x_train_df.iloc[:, 1:]

y_train = y_train_df['gender']


x_test = x_test_df.iloc[:, 1:]


# 데이터 스케일링 : Min-Max 스케일 변환

from sklearn.preprocessing import MinMaxScaler


scaler = MinMaxScaler()

scaler.fit(x_train)


x_train_scaled = scaler.transform(x_train)

x_test_scaled = scaler.transform(x_test)

데이터 전처리가 필요합니다. 우선 결측 데이터가 있습니다. 

'환불금액'의 데이터가 없는 행이 많은데 환불금액이 없는 것은 환불금액이 0인 것과 같으므로 0으로 대체합니다. 

'주구매상품'과 '주구매지점'은 문자열 데이터이므로 숫자로 인코딩 합니다.

그리고 데이터들의 범위 차이가 심하므로 Min-Max 스케일 변환을 하여 비슷한 범위로 만듭니다.


### 3) 모델 만들기

from sklearn.linear_model import LogisticRegression #Logistic(Regression)Classifier


model_lr = LogisticRegression()

가장 기본적인 이진 분류기 중 하나이 로지스틱 회귀 모델을 호출하여 모델 객체를 만듭니다.


### 4) 훈련

model_lr.fit(x_train_scaled , y_train)

.fit() 메써드에 준비된 데이터를 입력하고 훈련을 실행합니다.


### 5) 예측

predict_proba_lr = model_lr.predict_proba(x_test_scaled)

문제에서 남성일 확률값을 제출하도록 요구하므로 .predict_proba() 메써드를 이용하고 전처리된 test 데이터를 입력으로 하여 예측값을 만들어 냅니다.


### 6) 제출용 데이터 파일 작성

submit = pd.DataFrame(predict_proba_lr[:, 1], columns=['gender'])

submit['cust_id'] = x_test_df['cust_id']

submit = submit[['cust_id', 'gender']]


submit.to_csv('0000.csv', index = False)

문제에서 요구하는 형식에 맞도록 데이터프레임을 만들고 이를 요구에 맞게 파일로 저장합니다.


이 코드를 하나의 파일로 만들면 다음과 같습니다.

### 1) 파일에 저장된 데이터 읽어 오기

import os

import pandas as pd


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)

y_train_df = pd.read_csv(Y_train_file)


x_test_df = pd.read_csv(X_test_file)



### 2) 데이터 전처리

# 결측 데이터 처리

x_train_df = x_train_df.fillna(0)

x_test_df = x_test_df.fillna(0)


# Pandas의 factorize : sklearn의 라벨 인코딩과 유사 ( 빈도 순으로 인코딩 )

x_train_df.loc[:, "주구매상품"] = pd.factorize(x_train_df["주구매상품"])[0].reshape(-1,1)

x_train_df.loc[:, "주구매지점"] = pd.factorize(x_train_df["주구매지점"])[0].reshape(-1,1)


x_test_df.loc[:, "주구매상품"] = pd.factorize(x_test_df["주구매상품"])[0].reshape(-1,1)

x_test_df.loc[:, "주구매지점"] = pd.factorize(x_test_df["주구매지점"])[0].reshape(-1,1)


# cust_id 열 제거

x_train = x_train_df.iloc[:, 1:]

y_train = y_train_df['gender']


x_test = x_test_df.iloc[:, 1:]


# 데이터 스케일링 : Min-Max 스케일 변환

from sklearn.preprocessing import MinMaxScaler


scaler = MinMaxScaler()

scaler.fit(x_train)


x_train_scaled = scaler.transform(x_train)

x_test_scaled = scaler.transform(x_test)



### 3) 모델 만들기

from sklearn.linear_model import LogisticRegression #Logistic(Regression)Classifier


model_lr = LogisticRegression()


### 4) 훈련

model_lr.fit(x_train_scaled , y_train)


### 5) 예측

predict_proba_lr = model_lr.predict_proba(x_test_scaled)



### 6) 제출용 데이터 파일 작성

submit = pd.DataFrame(predict_proba_lr[:, 1], columns=['gender'])

submit['cust_id'] = x_test_df['cust_id']

submit = submit[['cust_id', 'gender']]


submit.to_csv('0000.csv', index = False)

이렇게 파이썬 파일을 만들고 실행한 다음 제출하면 됩니다.


이렇게 하면 하나의 작업을 완료한 것입니다. 하지만 제2유형의 작업은 주어진 평가 지표에 따라 점수를 줍니다. 이 베이스라인 코드의 ROC-AUC 스코어는 0.6정도 될 것 같습니다. 그러면 40점 중 대략 10점 정도의 점수를 받지 않을까 예상됩니다.


이상 간단하게 유형2의 예제를 풀어 제출하는 방법을 알아보았습니다.


다음에는 내용 분석을 좀 더 해보고 시험에 대한 전략에 대해 알아 보겠습니다. 


*** 여기에 있는 정보는 글쓴이의 주관적이 생각이 포함되어 있습니다. 정확한 정보는 공홈(아래 링크 URL)과 수행 기관에서 확인 하시기 바랍니다.



관련자료

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

최근글


새댓글


알림 0