5.이번 데이터는 train데이터(21년7월~22년7월)와 test데이터(22년8월)의 날짜 차이가 크기 때문에
1 2
test = train.query('month==7 and year==2022 and day>15').reset_index(drop=True) train = train.query('month!=7 or year!=2022 or day<=15').reset_index(drop=True)
이런식으로 데이터를 나눈 것을 확인 (참고하여 추후에 비슷한 문제 나와도 이런 방식으로 생각해보기)
6.라벨 인코딩 할 수 있는 열들을 한 번에 인코딩하기
1 2 3 4 5 6 7 8 9 10 11 12
str_col = ['day_of_week','start_turn_restricted','end_turn_restricted', 'road_name','road_type','road_rating','start_node_name','end_node_name', 'start_latitude','end_latitude','start_longitude','end_longitude'] for i in str_col: le = LabelEncoder() le=le.fit(train[i]) train[i]=le.transform(train[i]) for label in np.unique(test[i]): if label notin le.classes_: le.classes_ = np.append(le.classes_, label) test[i]=le.transform(test[i])
7.파생 변수 생성(Feature Engineering) - 매우 중요
제가 리뷰하는 코드를 작성한 팀은 다음과 같은 변수를 생성했음을 파악.
주요 항목별 target의 train 데이터셋 평균과 표준편차를 파생변수로 생성!
[시간, 제한속도]별 target 평균은 별도 파생변수로 생성
[시간]별 targe 평균에 대한 [시간,제한속도]별 target 평균의 비율 추가
파생 변수는 train 데이터셋 만으로 생성한 이후, test 데이터셋으로 merge
train & target을 합친 후 데이터를 구해서 어떤게 더 좋은지 파악해봐도 좋을듯함 (아마 train이 더 좋아서 train만 한듯합니다.
이와 같은 파생 변수 생성은 문제들을 많이 풀어보고 경험이 축적되어야 좋은 모델을 만들 수 있을 듯합니다.
일단, 제 경우는 이러한 코드들에서 이러한 변수를 어떤식으로 왜 만들었는지 분석해보고, 추후 적용할 수 있을지 파악하는 편입니다.
1 2 3 4 5 6 7 8 9 10 11 12
names = ['day_of_week', 'base_hour','road_name','start_node_name','end_node_name','maximum_speed_limit','start_latitude','end_latitude','start_longitude','end_longitude'] for name in names: print(name) df1 = train.groupby(name).mean().reset_index()[[name,'target']].rename(columns={'target':f'{name}_mean_target'}) train = pd.merge(train,df1,on=name,how='left') test = pd.merge(test,df1,on=name,how='left')