IT/빅데이터분석기사(빅분기)

구글 Gemini 및 MS Copliot (Chat GPT) 활용 8회 빅데이터분석 기사(빅분기) 실기 도전 작업 제2유형

자바라머신러닝 2024. 4. 10. 19:33

제2유형 작업은 머신러닝 학습을 통해 평가지표 성능을 비교하고 예측값을 산출하는 문제입니다. 빅데이터분석 실기 체험은 ROC-AUC 평가지표 사용하여 성능점검을 하도록 질문하고 있습니다. 학습데이터에는 성별이 없지만 평가데이터는 성별 데이터가 업습니다. 학습데이터만으로 학습한 모델로 평가데이터에 없는 성별 데이터를 예측하는 문제입니다.
 

  • 결론
    • 결과는 구글 Gemini 및 MS Copliot 별로 ROC-AUC 값 약간 상이
      • MS Copliot ROC-AUC : 0.6506
      • 구글 Gemini ROC-AUC : 0.6414 
    • ROC-AUC 가 높고 코드 상대적 용이한 MS Copiolt 코드 채택 
      • MS Copliot 코드 : 상대적 용이
      • 구글 Gemini 코드 : 상대적 복잡 

 

import pandas as pd

train = pd.read_csv("data/customer_train.csv")
test = pd.read_csv("data/customer_test.csv")

train.fillna(0, inplace=True) # 결측값
test.fillna(0, inplace=True) # 결측값

from sklearn.preprocessing import LabelEncoder # 범주데이터 정규화
category_cols = ['주구매상품', '주구매지점']
for col in category_cols:
	le = LabelEncoder()	
	train[col] = le.fit_transform(train [col])	
	test[col] = le.fit_transform(test[col])
	
x = train.drop(columns=['성별']) # 독립변수
y = train['성별']                 # 목표변수

from sklearn.model_selection import train_test_split
x_train, x_val, y_train, y_val = train_test_split(x,y,test_size=0.2,random_state=42,stratify=y)	

from sklearn.preprocessing import MinMaxScaler # 2) 학습 대상 데이터(train) 정규화 (구지 불필요)
x_train_scaled = MinMaxScaler().fit_transform(x_train)
print(type(x_train)) # 2800 건 데이터프레임
print(type(x_train_scaled)) # 2800 건 배열

# print(y_train) # 3) 정답 데이터 생성 (이미 있을 경우 별도 처리 없음)

from sklearn.ensemble import RandomForestClassifier # 4) 모델 생성
model = RandomForestClassifier()
print(type(x_train_scaled)) # 2800 건 배열
print(len(x_train_scaled)) # 2800 건 데이터 프레임
print(len(y_train)) # 2800 건 시리즈
model.fit(x_train, y_train)   # 5) 모델 학습

from sklearn.metrics import roc_auc_score  # 6) 모델 예즉 및 ROC 성능 출력

pred = model.predict(x_val)

print(len(x_val)) # 700 건 데이터 프레임
print(len(y_val)) # 700 건 시리즈
print(len(pred))  # 700 건 배열
print(roc_auc_score(y_val, pred))

# 제출 데이터(test) 에 예측값 산정
test_scaled = MinMaxScaler().fit_transform(test) # 제출 데이터(test) 정규화 (구지 불필요)
test_pred =  model.predict(test)
pd.DataFrame({'회원ID': test.회원ID, 'label': test_pred } ).to_csv('003000000.csv', index=False) # 7) 정답 생성
result = pd.read_csv('003000000.csv')
print(result)

 

체험문제 정리 결과를 Copilot 에게 질문
더보기

제공된 데이터는 백화점 고객이 1년간 상품을 구매한 속성 데이터이다.
제공된 학습용 데이터 (data/customer_train.csv)를 이용하여 백화점 구매고객의 성별을 예측하는 모델을 개발하고,
개발한 모델에 기반하여 평가용 데이터 (data/customer_train.csv)에 적용하여 얻은 성별 예측 결과를 아래 [제출형식]에 따라 CSV 파일로 생성하라.

- 예측결과는 ROC-AUC 평가지표에 따라 평가함
- 성능이 우수한 예측 모델을 구축하기 위해서는 데이터 정재, Feature Engineering, 하이퍼 파라메터 (hyper parameter) 최적화, 모델 비교 등이 필요할 수 있음. 
   다만, 과적합에 유의하여야 함

[제출형식]
1) CSV 파일명 : result.csv (파일명에 디렉토리-폴더 지정불가)
2) 예측 성별 컬럼명 : pred
3) 제출 컬럼 개수 : pred 컬럼 1개
4) 평가용 데이터 개수와 예측 결과 데이터 개수 일치 : 2.482개

[제공 데이터]
1) 데이터 목록
   학습용 데이터 (data/customer_train.csv) 3500개
   평가용 데이터 (data/customer_train.csv) 2482개
    - 평가용 데이터에는 '성별' 컬럼 미제공

[데이터 설명]
회원ID : 회원고유번호
총구매액 : 총 구매금액(원)
최대구매액 : 구매건당 최대구매금액 (원)
환불금액 : 환불금액(원)
주구매상품 : 주로 구매한 품목 (42개 품목 범주)
주구매지점 : 주로 구매한 지점명 (24개 지점 범주)
방문일수 : 고객이 방문한 일수(일)
방문당구매건수 : 총구매건수/방문일수
주말방문비율 : 주말에 방문한 비율
구매주기 : 구매 주기(일)
성별 : 고객 성별 (0:여자, 1:남자)


[csv 파일 형식]
- csv 파일명 : result.csv
- 고객 성별 예측 결과 컬럼명 : pred (0:여자, 1:남자)
- pred 컬럼 데이터 개수 2482개
- csv 파일 화인 방법 : 생성된 파일을 아래 예시에 따라 출력하여 확인
  import pandas ad pd
  result = pd.read_csv("result.csv")
  print(result)

 

[코드 시작]
import pandas as pd

train = pd.read_csv("data/customer_train.csv")
test = pd.read_csv("data/customer_test.csv")


이 문제를 
주구매상품과 주구매지점에 대한 범주화 처리와 
결측값 전처리를 하되 deprecated 발생하지 않게 하고
RandomForest 모델을 사용한 
python 코드로 작성해줘

 
 

MS Copilot

 
 

  • Copilot 문의 과정

Copilot 문의 과정
Copilot 문의 과정

  • Copilot  최종결과 코드 (시험암기용)
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score

# Load the training data
train = pd.read_csv("data/customer_train.csv")
test = pd.read_csv("data/customer_test.csv")

# Combine train and test data for preprocessing
combined_data = pd.concat([train, test], axis=0)

# Fill missing values with median
combined_data.fillna(combined_data.median(), inplace=True)

# Encode categorical features
categorical_features = ["주구매상품", "주구매지점"]
for feature in categorical_features:
    le = LabelEncoder()
    combined_data[feature] = le.fit_transform(combined_data[feature])

# Split the combined data back into train and test
train = combined_data[:len(train)]
test = combined_data[len(train):]

# Features and target
X = train.drop(columns=["성별"])
y = train["성별"]

# Split into train and validation sets
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

# Initialize and train the RandomForest model
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

# Predict on validation set
y_val_pred = model.predict_proba(X_val)[:, 1]

# Calculate ROC-AUC score
roc_auc = roc_auc_score(y_val, y_val_pred)
print(f"ROC-AUC score on validation set: {roc_auc:.4f}")

# Predict on test set
y_test_pred = model.predict(test.drop(columns=["성별"]))

# Create a DataFrame with predictions
result = pd.DataFrame({"pred": y_test_pred})

# Save predictions to a CSV file
result.to_csv("result.csv", index=False)

# Print success message
print("Predictions saved to result.csv")

# 최종 결과 재확인
print(pd.read_csv("result.csv"))

 

  • Copilot 답변 빅데이터분석기사 실기 체험 에서 실행 결과
    • ROC-AUC = 0.6506
    • 학습된 결과 pred 건수 2,482건 확인
    • 제출 클릭

Copilot 답변 빅데이터분석기사 실기 체험 에서 실행 결과
Copilot 답변  빅데이터분석기사 실기 체험 에서 실행 결과

 
 

구글 Gemini

 
 

  • 구글 Gemini 문의 과정

구글 Gemini 문의 과정
구글 Gemini 문의 과정

  • 구글 Gemini 최종결과 코드
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score

# 데이터 불러오기
train = pd.read_csv("data/customer_train.csv")
test = pd.read_csv("data/customer_test.csv")

# 결측값 처리
train['환불금액'].fillna(0, inplace=True)
test['환불금액'].fillna(0, inplace=True)

# 범주형 변수 처리
le_product = LabelEncoder()
le_product.fit(train['주구매상품'])
train['주구매상품'] = le_product.transform(train['주구매상품'])
test['주구매상품'] = le_product.transform(test['주구매상품'])

le_branch = LabelEncoder()
le_branch.fit(train['주구매지점'])
train['주구매지점'] = le_branch.transform(train['주구매지점'])
test['주구매지점'] = le_branch.transform(test['주구매지점'])

# 데이터 전처리
scaler = StandardScaler()
scaler.fit(train[['총구매액', '최대구매액', '환불금액', '방문일수', '방문당구매건수', '주말방문비율', '구매주기']])
train_scaled = scaler.transform(train[['총구매액', '최대구매액', '환불금액', '방문일수', '방문당구매건수', '주말방문비율', '구매주기']])
test_scaled = scaler.transform(test[['총구매액', '최대구매액', '환불금액', '방문일수', '방문당구매건수', '주말방문비율', '구매주기']])

# 학습 및 평가
X_train, X_test, y_train, y_test = train_test_split(train_scaled, train['성별'], test_size=0.2, random_state=42)

# 모델 학습
model = RandomForestClassifier(n_estimators=100, max_depth=10, random_state=42)
model.fit(X_train, y_train)

# 모델 평가
score = model.score(X_test, y_test)
print("모델 정확도:", score)

# ROC AUC 평가
roc_auc = roc_auc_score(y_test, model.predict_proba(X_test)[:, 1])
print("ROC AUC:", roc_auc)

# 예측 결과 생성
y_pred = model.predict_proba(test_scaled)[:, 1]

# 제출 파일 생성
result = pd.DataFrame({'pred': y_pred})
result.to_csv("result.csv", index=False)

# 최종 결과 재확인
print(pd.read_csv("result.csv"))
  • 구글 Gemini 답변 빅데이터분석기사 실기 체험 에서 실행 결과
    • ROC-AUC = 0.6414
    • 학습된 결과 pred 건수 2,482건 확인
    • 제출 클릭

구글 Gemini 답변 빅데이터분석기사 실기 체험 에서 실행 결과
구글 Gemini 답변 빅데이터분석기사 실기 체험 에서 실행 결과