본문 바로가기
IT/빅데이터분석기사(빅분기)

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

by 자바라머신러닝 2024. 4. 10.

제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 답변 빅데이터분석기사 실기 체험 에서 실행 결과

 
 

댓글