inflearn logo
강의

講義

知識共有

[仕事終わりの趣味] ビッグデータ分析実技 (作業型1,2,3)

第2回 既出タイプ(作業型1)

작업형 2 템플릿 확인 요청

7

mh

投稿した質問数 1

0

안녕하세요

전체적으로 이런 식으로 작업형 2를 풀어왔는데,

시험 전 마지막으로 올바른 코드인지 점검 부탁 드리고 싶습니다.

EDA -> target값 분리 -> 스케일링 -> 인코딩 -> 데이터 분리

-> 머신러닝 -> 평가 -> 테스트 예측 순서로 풀어왔는데,

AI한테 질문하니

카테고리가 안맞아 train, test를 불가피하게 합쳐서 풀어야 할 땐, 인코딩을 먼저 하라는 말에 혼란스러워 질문 드립니다.

import pandas as pd

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


# 평가: RMSE (회귀)
# target: 총구매액 (2482개의 행)
# 결측값: 환불금액
# object 컬럼: 주구매상품, 주구매지점 (2개) / num 컬럼: 그외 (7+1개)

pd.set_option('display.max_columns', None)
print(train.shape, test.shape)
# print(train.info())
# print(test.info())
# print(train.head())
# print(test.head())
# print(train.describe(include ='O'))
# print(test.describe(include = 'O'))

# 카테고리 확인 (주구매 불일치 -> 합쳐서 인코딩)
o_cols = train.select_dtypes(include = 'O').columns
# for col in o_cols:
# 	if (set(train[col]) == set(test[col])):
# 		print(col, '카테고리 일치')
# 	else:
# 		print(col, '카테고리 불일치')

# 결측치 채우기
train['환불금액'] = train['환불금액'].fillna(0)
test['환불금액'] = test['환불금액'].fillna(0)
# print(train.isnull().sum().sum())
# print(test.isnull().sum().sum())

# id, target 분리
train_id = train.pop('회원ID')
test_id = test.pop('회원ID')
target = train.pop('총구매액')
print(train.shape, test.shape)
print(target.describe())


# 스케일링
n_cols = train.select_dtypes(exclude = 'O').columns
# print(n_cols)
# print(train.head())
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
train[n_cols] = scaler.fit_transform(train[n_cols])
test[n_cols] = scaler.transform(test[n_cols])
# print(train.head())


# 인코딩
# 데이터 합치기
combined = pd.concat([train, test])
# 원핫
# combined = pd.get_dummies(combined)
# train = combined[:len(train)]
# test = combined[len(train):]
# print(train.shape, test.shape)

# 라벨인코더
from sklearn.preprocessing import LabelEncoder
o_cols = train.select_dtypes(include = 'O').columns
for col in o_cols:
	le = LabelEncoder()
	combined[col] = le.fit_transform(combined[col])
train = combined[:len(train)]
test = combined[len(train):]
print(train.shape, test.shape)


# 데이터 분리
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(train, target, test_size = 0.2, random_state = 0)
print(X_tr.shape, X_val.shape, y_tr.shape, y_val.shape)

# 머신러닝
# 랜포
# from sklearn.ensemble import RandomForestRegressor
# rf = RandomForestRegressor(random_state = 0)
# rf.fit(X_tr, y_tr)
# pred = rf.predict(X_val)

# lightgbm
import lightgbm as lgb
model = lgb.LGBMRegressor(random_state = 0, verbose = -1)
model.fit(X_tr, y_tr)
pred = model.predict(X_val)


# 평가
from sklearn.metrics import root_mean_squared_error
rmse = root_mean_squared_error(y_val, pred)
print(rmse)

# 813.2017203251257 (원핫, 랜포)
# 808.845167469651 (라벨, 랜포)
# 779.7626410741833 (라벨, lgb) - 채택
# 779.7626410741833 (원핫, lgb) 


# 테스트 예측 (전체 train으로 학습)
model.fit(train, target)
pred = model.predict(test)
submit = pd.DataFrame({'pred': pred})
submit.to_csv('result.csv', index = False)
print(pd.read_csv('result.csv').head())
print(pd.read_csv('result.csv').shape)

python 머신러닝 빅데이터 pandas 빅데이터분석기사

回答 1

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. mh님의 코드에 대한 리뷰를 아래와 같이 진행하겠습니다.

작업형 2 문제에서의 기본적인 문제 해결 과정은 잘 이해하고 계신 것 같습니다. 코드에서 인코딩 순서에 대한 걱정을 표하셨는데, 실제로 데이터의 카테고리가 train과 test에서 일치하지 않을 경우, 데이터 합침 후에 인코딩을 진행하는 것이 맞습니다. 이는 train 데이터와 test 데이터 모두 변수가 동일하게 만들어 두 데이터 간의 일관성을 유지할 수 있기 때문입니다.

코드 리뷰:

  1. EDA 및 카테고리 확인: 주구매상품, 주구매지점에서 카테고리가 다른 경우 combined 형태로 합친 후 인코딩을 진행하는 점이 좋습니다. 이는 중요한 전처리 과정입니다.

  2. 결측치 처리: 결측치를 0으로 채운 것은 상황에 따라 적절할 수 있지만, 데이터의 특성과 문제의 요건에 따라서 다른 방법(평균, 중간값 등)을 고려할 수 있습니다.

  3. 스케일링: 수치형 변수에 대해 MinMaxScaler를 제대로 적용하셨네요. 특히 트리 기반 모델에서는 스케일링의 중요성이 크지 않지만, 다른 모델과 비교할 때 일관되게 설정해 두는 것이 좋습니다.

  4. 인코딩: 카테고리 불일치를 고려하여 데이터를 concat 한 후 인코딩을 진행하신 게 좋습니다. 이 때, 원핫 인코딩과 라벨 인코딩 중 어떤 것을 사용할지는 문제에 따라 달라질 수 있으며, 성능을 보고 결정하는 것도 좋은 방법입니다. 현재 코드에서는 라벨 인코딩을 사용하고 있습니다.

  5. 데이터 분리: train_test_split을 사용하여 검증 데이터를 잘 분리하셨습니다. 이는 과적합을 방지하고 모델의 일반화 능력을 평가하는 데 중요합니다.

  6. 모델 학습 및 평가: RandomForest와 LightGBM 모두 사용하여 성능을 비교하셨고, RMSE를 통해 성능 평가를 정확히 하였습니다.

  7. 테스트 예측 및 제출: 최종 모델 학습 후 test 데이터에 대한 예측을 하고 이를 CSV 파일로 저장해 결과물을 제출하는 과정도 잘 진행되었습니다.

마무리하면서, 데이터 전처리의 방향성은 매우 잘 잡혀 있으며, 모델 평가 및 성능 개선을 위한 다양한 시도를 하신 점이 돋보입니다. 사용한 코드를 기반으로 다양한 모델링을 시도하는 것은 매우 긍정적인 접근입니다.

추가적으로 비슷한 문제 및 실습 경험을 담고 있는 게시글을 추천해드리니 참고해보세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

10회 기출 작업형3 문제 2-1 질문

0

3

1

작업형 2 질문

0

8

1

작업형2 인코딩 질문

0

20

2

작업형 3 벼락치기 공부방법 질문

0

27

2

기출 11회 작업형 2_전체 데이터 학습 여부

0

30

2

예측값 결과 소수점 차이

0

25

2

기출 문제와 실전챌린지 연습문제 무엇부터 푸는게 나은가요?

0

31

1

전처리 train() test([ ])

0

20

2

작업형 1 배경지식 질문

0

29

2

옳게 풀은건지 질문드립니다!

0

20

1

roc_auc_score

0

29

2

추가질문 합니다

0

21

2

시험환경 구름

0

19

2

2유형 질문드려요

0

19

2

RandomForest vs lgb

0

26

2

전처리 관련질문

0

29

3

작업형3 기출

0

19

2

유형2에서 데이터분할 생략 가능여부

0

30

2

9회 기출 유형3 질문

0

21

2

lgb 기초편

0

22

2

괄호 사용

0

25

2

작업형 2 데이터 전처리 질문

0

24

1

11회 기출 유형 작업형1 문제 3-1

0

27

1

예시문제 작업형2 (ver2023) 질문입니다

0

21

2