해결된 질문
작성
·
186
·
수정됨
0
학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요
먼저 유사한 질문이 있었는지 검색해보세요
안녕하세요 예시문제 작업형2번을 풀고 강의를 보고 궁금한점이 생겨 질문드립니다. 우선 아래는 제가 작성한 코드입니다.
# 출력을 원하실 경우 print() 함수 활용 # 예시) print(df.head()) # getcwd(), chdir() 등 작업 폴더 설정 불필요 # 파일 경로 상 내부 드라이브 경로(C: 등) 접근 불가
import pandas as pd
train = pd.read_csv("data/customer_train.csv")
test = pd.read_csv("data/customer_test.csv")
# 사용자 코딩
print(train.info())
train['환불금액'] = train['환불금액'].fillna(0)
test['환불금액'] = test['환불금액'].fillna(0)
# train['환불금액'] = train['환불금액'].fillna(train['환불금액'].mean())
# test['환불금액'] = test['환불금액'].fillna(test['환불금액'].mean())
train = train.drop(columns = '회원ID')
test_id = test.pop('회원ID')
X = train.iloc[:,:-1]
y = train.iloc[:,-1]
from sklearn.model_selection import train_test_split
X_tr , X_val , y_tr , y_val = train_test_split(X,y,test_size = 0.2 ,random_state=42)
print(X_tr.shape, X_val.shape , y_tr.shape ,y_val.shape)
# X_tr, X_val를 명시적으로 복사본 생성
X_tr = X_tr.copy()
X_val = X_val.copy()
from sklearn.preprocessing import LabelEncoder
le_col = ['주구매상품','주구매지점']
le = LabelEncoder()
for i in le_col:
X_tr.loc[:, i] = le.fit_transform(X_tr[i])
X_val.loc[:, i] = le.transform(X_val[i])
test.loc[:, i] = le.transform(test[i])
from sklearn.ensemble import RandomForestClassifier
from xgboost import XGBClassifier
from sklearn.metrics import roc_auc_score
rf = RandomForestClassifier(random_state = 42,
n_estimators=100, # 트리의 개수
max_depth=7, # 트리의 최대 깊이
min_samples_split=10, # 내부 노드를 분할하기 위한 최소 샘플 수
min_samples_leaf=4, # 리프 노드에 있어야 하는 최소 샘플 수
max_features='sqrt', # 각 트리를 분할할 때 고려할 최대 피처 수
bootstrap=True) # 부트스트래핑 사용 여부
rf.fit(X_tr,y_tr)
pred = rf.predict_proba(X_val)
# xgb = XGBClassifier(random_state=42,use_label_encoder=False, eval_metric='logloss')
# xgb.fit(X_tr,y_tr)
# pred = xgb.predict_proba(X_val)
print(roc_auc_score(y_val,pred[:,1]))
pred = rf.predict_proba(test)[:,1]
submit = pd.DataFrame(
{'pred' : pred
}
)
submit.to_csv('result.csv',index=False)
print(pd.read_csv('result.csv'))
# rf
# 0.6435519983529352
# rf 하이퍼
# 0.6732206123306826
# xgb
# 0.624477786070292
# 답안 제출 참고
# 아래 코드는 예시이며 변수명 등 개인별로 변경하여 활용
# pd.DataFrame변수.to_csv("result.csv", index=False)
Q1)우선 강의중 라벨인코딩시 오브젝트 컬럼의 unique값 중 test에는 있고 train에는 없다면 test와 train을 합쳐서 라벨인코딩 후 나눠야 한다고 말씀해주셨는데요. 방식은 알겠으나 그렇게 되면 data leakege 현상이 있을수 있어 과적합 위험도 있지 않나요? Q2) xgb에는 라벨인코딩기능이 자동탑제된걸로아는데 오브젝트타입 컬럼의 unique값중 test에는 있고 train에는 없는경우에도 작동이 되나요? Q3) # X_tr, X_val를 명시적으로 복사본 생성 X_tr = X_tr.copy() X_val = X_val.copy()이 부분은 오류가 떠서 gpt에게 물어보고 수정 한 것인데요 왜 copy를 적용해야 오류가 안뜨는지 설명해주실수있나요? 지피티가 해주는 설명은 이해가 잘안되네요
답변 1
0
네 맞습니다. data leakege 현상이 있을 수 있습니다. 단 시험에서 이것을 아직 문제 삼고 있지는 않습니다. 실기 난이도가 이런 것을 고려할 정도로 난이도가 있지는 않아요
2. xgb가 그렇게 자체적으로 처리하는 코드는 제가 아는 선에서는 아직 못 본 것 같습니다. xgb는 아직 타겟값도 0부터 시작해야 하는 까다로운 모델이거든요. 만약 최신버전만 가능하다면 시험환경은 통상 최신 버전은 아닙니다.
lightgbm은 타입을 카테고리컬로 변경해주면 인코딩 없이 처리가 가능합니다.
3. 제가 알려드린 순서와 다른 방식으로 풀이 한 것 같아요. 상관은 없습니다만
데이터를 분리한 이후에 인코딩을 하면서 X_tr 값이 변경되게 됩니다.
따라서 사본임을 명시하는 처리가 필요해요! 작업형1에서도 혹시나 복사 관련된 에러나 워닝이 발생한다면 copy()로 명시하면 됩니다 🙂
혹시 컴퓨터를 전공하셨다면
파이썬에서는 모든 객체가 참조를 통해 전달되므로
콜바이밸류처럼 보이는 콜바이레퍼런스(Call by Reference)를
콜바이밸류(Call by Value)로 명시한다고 생각해주세요