天天看點

特征工程--單時間變量特征時間特征

時間特征

時間資訊是極其敏感的資訊,我們在資料競賽中看到分數前後排出現較大gap的時候,第一時間需要考慮的就是時間資訊,時間特征在很多競賽中,往往可以決定排名的走勢,那麼當我們拿到時間相關的特征時,該如何進行思考,建構強有力的特征呢?(PS:本文我們介紹8大常見的單變量時間特征,剩下的兩個可能一不小心拿金牌強特會在後續分享)。

1.基礎周期特征(年月日特征拆解)

幾乎所有的時間都可以被拆解為年-月-日-小時-分鐘-秒-毫秒的形式。在大多數情況中,拆解之後的資料往往存在某些潛在規律的,比如:

  • 我們對某個城市的旅遊人數進行預估,旅遊是存在旺季和淡季的,這個時候拆分之後得到的月份就非常重要;
  • 我們預估店鋪每天的銷量,因為很多公司都會在月末發工資,這個時候拆解得到的天資訊就會比較重要;
  • 我們預估使用者是否會下單,那麼小時特征可能就比較重要,比如這個時候已經是晚上11點了,使用者在搜尋旅館的資訊,那麼大機率可能就會下單,相反如果是中午在搜尋,那麼該使用者可能并不是很急,是以下單的機率就會小一些;
  • 我們預估地鐵的每個小時的流量,那麼早上7點到8點,晚上5點到7點,這些上下班的高峰期,流量一般就會大一些。

雖然拆解很簡單,但是裡面會按含有非常多的潛在重要資訊,如果直接對時間資訊進行Label編碼,然後使用梯度提升樹模型進行訓練預測,是極難挖掘到此類資訊的,但是拆解之後卻可以極大的幫助到梯度提升樹模型發現此類資訊

import pandas as pd
df = pd.DataFrame()
df['dt'] = ['2020-07-03', '2020-08-09', '2020-08-29', '2020-08-19']
df['dt'] = pd.to_datetime(df['dt'])
df['year']  = df['dt'].dt.year
df['month'] = df['dt'].dt.month
df['day']   = df['dt'].dt.day
df.head()      
dt year month day
2020-07-03 2020 7 3
1 2020-08-09 8 9
2 2020-08-29 29
2020-08-19 19
特征工程--單時間變量特征時間特征
特征工程--單時間變量特征時間特征

2.特殊周期特征(星期&節假日等)

1.星期特征

年月日特征拆解可以幫我們得到最基礎的時間周期特征。那麼肯定大家就就會聯想到其它的時間周期特征,例如星期等資訊。

特征工程--單時間變量特征時間特征

這個也較為容易了解:

  • 我們需要預測某些餐館的人流量,那麼熱鬧的大餐館周六周日的人流量就會比平時多一些;而一些靠近網際網路大公司附近的商場可能周末人會少很多,因為平時工作日忙,就會在附近商場吃飯,但是到了周日了,不用上班了,周圍的人流量大大下降,反而使得商場附近餐館的人流量大大下降了。

2.月和星期組合特征

有些時候,我們還會将星期特征和月份特征結合,構成簡單的組合特征,怎麼做呢?很簡單,我們還是舉個例子:

  • 我們需要預測某些餐館的銷售額,我們知道一般公司會在月末發放工資,是以每個月的最後一個周末的餐館的銷售額可能就會比平常的周末大一些。

3.節假日特征

節假日這個不僅包含國家的法定節假日,依據問題的不同,還有非常多特殊的日期,例如:

  • 如果我們的問題是預測各大電商的日GMV,那麼每年的雙11等特殊日期就尤為重要;
  • 如果我們的問題是預測旅遊景點的客流量,那麼五一、十一等節假日的日期就尤為重要;
特征工程--單時間變量特征時間特征

4.節假日和星期組合特征

節假日和星期的組合也是非常強的組合特征,在有些問題中,又是重要節日又是周末會是非常強的資訊,在另外一些問題中,節假日如果是連着周六周日的,那麼這些資訊也都是非常重要的組合特征,因為這意味着我們的假期可能延長了,是以會是一種較強的信号。

1. df['weekday']   = df['dt'].dt.weekday
2. df.head()      
weekday
4
6
5

月份暗含資訊

特征工程--單時間變量特征時間特征

該特征經常适用于關于以月為機關的預估問題,例如預估某個公司每個月的産值,某個景點的旅遊人數,這個時候每個月中工作日的天數以及休假的天數就是非常重要的資訊。

特征工程--單時間變量特征時間特征

時間差

特征工程--單時間變量特征時間特征

1.相鄰時間差

該特征顧明思議,就是相鄰兩個時間戳之間的內插補點,在有些問題中,例如使用者浏覽每個視訊的開始時間戳,相鄰兩個時間戳的內插補點一般就是使用者浏覽視訊的內插補點,如果內插補點越大,那麼該使用者可能對上一個視訊的喜好程度往往越大,此時,相鄰時間戳的就是非常有價值的特征。

特征工程--單時間變量特征時間特征

2.相鄰時間差頻率編碼

這個是關于相鄰特征內插補點的頻率編碼,該特征往往适合相鄰時間差互補的一個特征,可以幫助我們更好地挖掘一些内在的資訊,例如有些自律的使用者在會控制自己的休閑與工作的時長,我們在統計使用者的生活習慣時,發現出現大量的相鄰時間差時10分鐘和60分鐘的,原來是該使用者喜歡工作60分鐘就休息10分鐘,此時相鄰時間差頻率編碼就可以協助我們發現此類資訊。

特征工程--單時間變量特征時間特征
1. '''
2.     以月為機關計算基礎時間差
3. '''
4. df['month_diff'] = df['month'] - df['month'].shift(1)
5. df['month_diff_cnt'] = df['month_diff'].map(df['month_diff'].value_counts())
6. df.head()      
month_diff month_diff_cnt
NaN
0.0

繼續閱讀