728x90

따릉이 프로젝트 완성하기 12번째 시간입니다. 여태까지 했던 작업물을 가지고 Test 데이터 적용해 본 결과, 31.30 점수대에서 머무르면서 29위에 랭크되었습니다. 성능 개선을 위한 하이퍼 파라미터를 많은 시간을 들이며 search를 해봤지만 한계에 봉착하게 되었습니다. 잔차분포를 보면 prediction값이 target보다 적게 예측한 결과가 다수 발견이 되어왔었습니다. 그래서 기존에는 target 이상치 제거를 18,19시에만 적용했던걸 4,5,12,13시에도 적용했습니다.

 

기존에 18,19시에만 이상치 제거를 했던 이유는 출퇴근시간에 급증하는 패턴을 일반화 스럽게? 살리기 위해서 였습니다. 이상치라고 해도 무조건 삭제하는건 좋지 않다고 배웠던 지라, 조심스럽게 접근했었습니다.

아무튼 아래 내용들은 모든 이상치를 제거 한 후 실행한 내용들입니다.  

요약

  • target 이상치 제거 범위 확대
def outliers_idx_search():
  outliers = list()
  for hour in range(0,23):
    train_df = pd.DataFrame(train[train['hour']==hour]['count'])
    Q1 = train_df.quantile(0.25)[0]
    Q3 = train_df.quantile(0.75)[0]
    IQR = Q3 - Q1
    filter = train_df.index[train_df['count']<=Q1 - 1.5 * IQR].to_list() + train_df.index[train_df['count']>= Q3 + 1.5 * IQR].to_list()
    if filter == []:
      continue
    outliers += filter  
  return outliers
    # df.drop(filter, axis =0, inplace=True)
outliers = outliers_idx_search()
df.drop(outliers, axis=0, inplace=True)

각 시간별 이상치를 탐색해야 했기 때문에 약간 코드가 난잡?해 보입니다 ; filter 객체에는 이상치 데이터의 인덱스가 List로 반환된 값을 가집니다. 리스트끼리 덧셈이 가능하기 때문에 outliters +=filter를 넣어서 모든 이상치 데이터 인덱스를 한 곳에 모아줬습니다.

 

그 후 grid search를 통해 최적 파라미터를 출력해본 결과

잔차분포가 그전 보다 0에 가깝게 모여 있음을 확인 할수 있었으며, 리더보드에서 30,12점수를 받으면서 29위->6위로 크게 반등했습니다. 현재 점수는 변수를 모두 사용하지 않았을때의 경우입니다. 이전에 모델을 여러번 실험한 결과 유익하지 않은 변수가 있다고 판단하여 초미세먼지 변수, 오존 변수를 제외해 오고 있었습니다. 다음 시간에는 모든 변수를 고려했을때의 최적 파리미터를 찾아볼 계획입니다.

728x90

+ Recent posts