작업형 2 템플릿 확인 요청
2
1 câu hỏi đã được viết
안녕하세요
전체적으로 이런 식으로 작업형 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)
Câu trả lời 1
0
안녕하세요, 인프런 AI 인턴입니다. mh님의 코드에 대한 리뷰를 아래와 같이 진행하겠습니다.
작업형 2 문제에서의 기본적인 문제 해결 과정은 잘 이해하고 계신 것 같습니다. 코드에서 인코딩 순서에 대한 걱정을 표하셨는데, 실제로 데이터의 카테고리가 train과 test에서 일치하지 않을 경우, 데이터 합침 후에 인코딩을 진행하는 것이 맞습니다. 이는 train 데이터와 test 데이터 모두 변수가 동일하게 만들어 두 데이터 간의 일관성을 유지할 수 있기 때문입니다.
코드 리뷰:
EDA 및 카테고리 확인: 주구매상품, 주구매지점에서 카테고리가 다른 경우 combined 형태로 합친 후 인코딩을 진행하는 점이 좋습니다. 이는 중요한 전처리 과정입니다.
결측치 처리: 결측치를 0으로 채운 것은 상황에 따라 적절할 수 있지만, 데이터의 특성과 문제의 요건에 따라서 다른 방법(평균, 중간값 등)을 고려할 수 있습니다.
스케일링: 수치형 변수에 대해 MinMaxScaler를 제대로 적용하셨네요. 특히 트리 기반 모델에서는 스케일링의 중요성이 크지 않지만, 다른 모델과 비교할 때 일관되게 설정해 두는 것이 좋습니다.
인코딩: 카테고리 불일치를 고려하여 데이터를 concat 한 후 인코딩을 진행하신 게 좋습니다. 이 때, 원핫 인코딩과 라벨 인코딩 중 어떤 것을 사용할지는 문제에 따라 달라질 수 있으며, 성능을 보고 결정하는 것도 좋은 방법입니다. 현재 코드에서는 라벨 인코딩을 사용하고 있습니다.
데이터 분리: train_test_split을 사용하여 검증 데이터를 잘 분리하셨습니다. 이는 과적합을 방지하고 모델의 일반화 능력을 평가하는 데 중요합니다.
모델 학습 및 평가: RandomForest와 LightGBM 모두 사용하여 성능을 비교하셨고, RMSE를 통해 성능 평가를 정확히 하였습니다.
테스트 예측 및 제출: 최종 모델 학습 후 test 데이터에 대한 예측을 하고 이를 CSV 파일로 저장해 결과물을 제출하는 과정도 잘 진행되었습니다.
마무리하면서, 데이터 전처리의 방향성은 매우 잘 잡혀 있으며, 모델 평가 및 성능 개선을 위한 다양한 시도를 하신 점이 돋보입니다. 사용한 코드를 기반으로 다양한 모델링을 시도하는 것은 매우 긍정적인 접근입니다.
추가적으로 비슷한 문제 및 실습 경험을 담고 있는 게시글을 추천해드리니 참고해보세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
작업형2 인코딩 질문
0
17
2
작업형 3 벼락치기 공부방법 질문
0
20
2
기출 11회 작업형 2_전체 데이터 학습 여부
0
28
2
예측값 결과 소수점 차이
0
24
2
기출 문제와 실전챌린지 연습문제 무엇부터 푸는게 나은가요?
0
29
1
전처리 train() test([ ])
0
20
2
작업형 1 배경지식 질문
0
26
2
옳게 풀은건지 질문드립니다!
0
17
1
roc_auc_score
0
29
2
추가질문 합니다
0
20
2
시험환경 구름
0
19
2
2유형 질문드려요
0
17
2
RandomForest vs lgb
0
26
2
전처리 관련질문
0
28
3
작업형3 기출
0
18
2
유형2에서 데이터분할 생략 가능여부
0
30
2
9회 기출 유형3 질문
0
21
2
lgb 기초편
0
17
2
괄호 사용
0
25
2
작업형 2 데이터 전처리 질문
0
23
1
11회 기출 유형 작업형1 문제 3-1
0
24
1
예시문제 작업형2 (ver2023) 질문입니다
0
21
2
Data type에 따른 처리
0
23
2
데이터 전처리 관련
0
21
2

