inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

2회 기출유형(작업형1)

작업형 2 템플릿 확인 요청

해결된 질문

36

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 빅데이터분석기사

답변 2

0

퇴근후딴짓

네!! 코드 문제 전혀 없습니다. 잘하고 계세요!!

그리고

첫 코드 작성시 스케일링은 빼고 진행해도 됩니다. (성능 향상이 미미해요)


이정도 코드 작성이 가능하시다면 xgb 모델도 비교해 보면 어떨까요?

분류

from xgboost import XGBClassifier
xgb = XGBClassifier(random_state=0, verbosity=0)
xgb.fit(X_tr, y_tr)
pred = xgb.predict(X_val)

회귀

from xgboost import XGBRegressor
xgb = XGBRegressor(random_state=0, verbosity=0)
xgb.fit(X_tr, y_tr)
pred = xgb.predict(X_val)

0

인프런 AI 인턴

안녕하세요, 인프런 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 파일로 저장해 결과물을 제출하는 과정도 잘 진행되었습니다.

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

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

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

빅분기 12회 결과 관련 문의

0

21

0

책이랑 강의랑 순서나 예제가 다른것 같네요

0

49

2

수강연장 문의

0

57

1

재검토 요청 방법 좀 알려주셔요...-.-;;

0

82

2

12회 실기 질문(작업형 2)

0

66

2

뒤로가기 버튼 같은 것이 있나요?

0

49

1

강의 연장 문의

0

69

2

출력값 질문

0

47

2

수업노트가 어디에 있나요?

0

44

1

실기시험 제출관련

0

207

3

6.20 작업형 2 과적합

0

199

3

코딩팡 장업형2 베이스 라인 인코딩 종류 질문

0

68

2

로지스틱회귀, 회귀

0

59

2

회귀 문제를 풀때 질문입니다.

0

66

1

불균형 처리 후 성능이 더 낮아졌다면,

0

74

2

실기 체험 제2유형 에러 문의

0

74

1

LIGHTGBM 으로 하면 pred값이 소수점 6자리까지 나오는게 맞나요

0

63

2

3번문제 등분산 가정

0

54

2

작업형3 target 형 변환 질문

0

44

2

[작업형1] 연습문제 섹션1 ~ 10 의 section4

0

56

3

원핫인코딩과 레이블 인코딩에서 concat

0

68

2

제2유형 질문입니다.

0

51

2

C()

0

51

2

작업형 2에서 strafity 적용 유무

0

62

2