728x90

*주요 요약

  • seasonal 추가
  • 오존,미세먼지,초미세먼지 변수 -> 카테고리로 변경

 

지금까지 여러 파생변수를 만들어 보고 실험해 봤는데 대부분이 쓸모 없었습니다 아마 오늘을 끝으로 변수에 대한 FE는 마무리가 될것 같습니다. 다음 시간부터는 최적의 모델링을 찾는데 시간을 쓸것 같습니다 

 

 

1. Seasonal 추가

시계열 기법중에 분해기법이 있습니다. 계절성 정보를 넣으면 예측에 유리할 것같아서 시도 해봤습니다. 제가 가지고 있는 데이터는 날짜 형식이 아니며, 순서도 뒤죽박죽이기 때문에 grouby로 hour 별 mean 값을 구한 뒤, 가짜 날짜 변수를 생성하여 seasonal을 구했습니다. 그 후 각 시간별 seasonal 정보를 매칭시켜서 원본 데이터에 적용했습니다. 

train_tem = train.groupby('hour').mean().reset_index()
train_tem['Date'] = pd.date_range(start='2017-04-01 00:00:00', end='2017-04-01 23:00:00', freq='H')
train_tem['Date'] = pd.to_datetime(train_tem['Date'])
train_tem.set_index(train_tem['Date'], inplace=True)
train_tem=train_tem.asfreq('H')
result = sm.tsa.seasonal_decompose(pd.concat([train_tem['count'],train_tem['count']], axis=0),model='additive', freq=24)
result.seasonal
Date
2017-04-01 00:00:00    -36.915619
2017-04-01 01:00:00    -61.075729
2017-04-01 02:00:00    -77.272450
2017-04-01 03:00:00    -87.305237
2017-04-01 04:00:00    -95.157696
2017-04-01 05:00:00    -95.567532
2017-04-01 06:00:00    -84.124909
2017-04-01 07:00:00    -46.321630
2017-04-01 08:00:00     28.006239
2017-04-01 09:00:00    -15.141302
2017-04-01 10:00:00    -29.879007
2017-04-01 11:00:00    -20.354417
2017-04-01 12:00:00      3.219353
2017-04-01 13:00:00     11.367714
2017-04-01 14:00:00     25.907878
2017-04-01 15:00:00     44.284927
2017-04-01 16:00:00     60.417714
2017-04-01 17:00:00     78.451047
2017-04-01 18:00:00    153.481648
2017-04-01 19:00:00     92.924271
2017-04-01 20:00:00     56.186566
2017-04-01 21:00:00     60.134381
2017-04-01 22:00:00     39.563616
2017-04-01 23:00:00     -4.829827
2017-04-01 00:00:00    -36.915619
2017-04-01 01:00:00    -61.075729
2017-04-01 02:00:00    -77.272450
2017-04-01 03:00:00    -87.305237
2017-04-01 04:00:00    -95.157696
2017-04-01 05:00:00    -95.567532
2017-04-01 06:00:00    -84.124909
2017-04-01 07:00:00    -46.321630
2017-04-01 08:00:00     28.006239
2017-04-01 09:00:00    -15.141302
2017-04-01 10:00:00    -29.879007
2017-04-01 11:00:00    -20.354417
2017-04-01 12:00:00      3.219353
2017-04-01 13:00:00     11.367714
2017-04-01 14:00:00     25.907878
2017-04-01 15:00:00     44.284927
2017-04-01 16:00:00     60.417714
2017-04-01 17:00:00     78.451047
2017-04-01 18:00:00    153.481648
2017-04-01 19:00:00     92.924271
2017-04-01 20:00:00     56.186566
2017-04-01 21:00:00     60.134381
2017-04-01 22:00:00     39.563616
2017-04-01 23:00:00     -4.829827
Name: count, dtype: float64

 

seasonal_df = pd.DataFrame(result.seasonal)
seasonal_df = seasonal_df.iloc[:24].reset_index(drop=True)
seasonal_df
      count
0	-36.915619
1	-61.075729
2	-77.272450
3	-87.305237
4	-95.157696
5	-95.567532
6	-84.124909
7	-46.321630
8	28.006239
9	-15.141302
10	-29.879007
11	-20.354417
12	3.219353
13	11.367714
14	25.907878
15	44.284927
16	60.417714
17	78.451047
18	153.481648
19	92.924271
20	56.186566
21	60.134381
22	39.563616
23	-4.829827

 

def seasonal_fill(x):
  value = float(seasonal_df[seasonal_df.index==x].values)
  return value
df['seasonal'] = train['hour'].apply(seasonal_fill) 
df.head()

 

 

 

 

2. 오존,미세먼지,초미세먼지 변수 -> 카테고리로 변경

해당 아이디어는 다른 분의 블로그를 보면서 참고했습니다. 왜 이 생각을 못했을까 했어요 

# 오존, 좋음/보통/나쁨/매우나쁨 을 기상청 기준으로 다른 class 부여
df['hour_bef_ozone'] = df['hour_bef_ozone'].apply(lambda x : 0 if x <= 0.03 else 
                                                                   1 if 0.03 < x and x <= 0.09 else 
                                                                   2 if 0.09 < x and x <= 0.151 else
                                                                   3 if 0.151 < x else x)

# 미세먼지, 좋음/보통/나쁨/매우나쁨 을 기상청 기준으로 다른 class 부여
df['hour_bef_pm10'] = df['hour_bef_pm10'].apply(lambda x : 0 if x <= 30 else 
                                                                 1 if 30 < x and x <= 80 else 
                                                                 2 if 80 < x and x <= 150 else
                                                                 3 if 150 < x else x)

# 초미세먼지, 좋음/보통/나쁨/매우나쁨 을 기상청 기준으로 다른 class 부여
df['hour_bef_pm2.5'] = df['hour_bef_pm2.5'].apply(lambda x : 0 if x <= 15 else 
                                                                   1 if 15 < x and x <= 35 else 
                                                                   2 if 35 < x and x <= 75 else
                                                                   3 if 75 < x else x)

#One-Hot Encoding
df = pd.get_dummies(df, columns=['hour_bef_ozone','hour_bef_pm10','hour_bef_pm2.5'])

해당 변수를 원핫 인코딩 전/후 모두 비교해 봤는데, 결과적으로는 미미한 영향이었습니다. 애초에 target과 연관성이 적었던 변수들이기 때문입니다. 그래도 이번 계기로 데이터를 바라보는 시각이 조금은 넓어진 느낌을 받았습니다 :)

 

728x90

+ Recent posts