使用分位數回歸預測目標的取值范圍

問題:如何做到對目標值的區間范圍的預測

使用神經網絡做回歸任務,我們使用MSE、MAE作為損失函數,最終得到的輸出y通常會被近似為y的期望值,例如有兩個樣本:(x=1, y=3)和(x=1, y=2),那只用這兩個樣本訓練模型,預測x=1時y的值就是2.5。

但有些情況下目標值y的空間可能會比較大,只預測一個期望值并不能幫助我們做進一步的決策。我們想知道x=1時,y的值最小會是多少,最大會是多少,使用MSE、MAE這些損失函數來構建預測輸出區間模型時候,往往需要對樣本進行非常復雜的處理才能達到目的,而且因為數據的預處理需要加入很強的先驗信息,建模效果肯定會打折扣,再一個如果數據規模比較大,那將會在數據預處理上浪費大量的時間。


這里介紹一個特殊的損失函數——分位數損失,利用分位數損失我們不需要對數據進行任何先驗的處理,就可以輕松做到預測輸出y的某一分位數水平值,例如5%分位數或95%分位數,利用這個輸出很自然就完成預測輸出范圍的回歸模型。

分位數損失函數的表達式如下圖:


其中γ是損失函數的參數,從實際意義上可以理解為是我們需要的分位數,這個損失函數從結構上看,就是以一定的概率γ懲罰預測值大于實際值,同時鼓勵預測值小于實際值,這樣的效果就是學得了目標y的γ分位數期望值。對于分位數損失函數的具體應用可以參考下邊的例子。


我們這里以波士頓房價數據集為例理解一下分位數損失函數的效果。
首先加載數據并進行分割,另外為了可視化方便,我們將x_test進行PCA降維并排序:

boston_data = load_boston()
x = boston_data['data']
y = boston_data['target']
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=77)
# PCA對數據進行降維處理,方便可視化
pca = PCA(n_components=1)
x_test_after_pca = pca.fit_transform(x_test, y_test)
# 對數據進行排序
x_sort_id = np.argsort(x_test, axis=None)
x_test = x_test[x_sort_id]
y_test = y_test[x_sort_id]
x_for_visual = x_test_after_pca[x_sort_id]

第二步就是損失函數的定義,在keras中沒有分位數函數的定義,可以根據公式來進行定義:

def quantile_loss(y_pred, y_true, r=0.5):
    greater_mask = K.cast((y_true <= y_pred), 'float32')
    smaller_mask = K.cast((y_true > y_pred), 'float32')
    return K.sum((r-1)*K.abs(smaller_mask*(y_true-y_pred)), -1)+K.sum(r*K.abs(greater_mask*(y_true-y_pred)), -1)

還有一種更簡潔的定義方式可以參考這里:

def tilted_loss(q, y_true, y_pred):
    e = (y_true-y_pred)
    return K.mean(K.maximum(q*e, (q-1)*e), axis=-1)

構建一個最簡單的模型:

def gen_model(ipt_dim):
    l1 = Input(shape=(ipt_dim,))
    l2 = Dense(10, activation='relu', kernel_initializer=glorot_normal(), bias_initializer=zeros())(l1)
    l3 = Dense(5, activation='relu', kernel_initializer=glorot_normal(), bias_initializer=zeros())(l2)
    l4 = Dense(1, activation='relu', kernel_initializer=glorot_normal(), bias_initializer=zeros())(l3)
    m_model = Model(inputs=l1, outputs=l4)
    return m_model

調用模型,并且對結果進行可視化:

plt.figure()
plt.scatter(x_for_visual, y_test, label='actual')
q_list = [0.1, 0.5, 0.9]

for quantile in q_list:
    model = gen_model(in_dims)
    model.compile(loss=lambda y_t, y_p: tilted_loss(quantile, y_t, y_p), optimizer='adam')
    model.fit(x_train, y_train, epochs=5, batch_size=8, verbose=1)
    y_ = model.predict(x_test)
    plt.plot(x_for_visual, y_, label=quantile)

plt.legend()
plt.show()

可視化的最終結果如下圖,我們可以看到學習到的三個檔位的分位數回歸模型。其中0.5的與普通MAE回歸結果是等價的,只不過0.5預測的是中位數而MAE預測的是期望值;0.1和0.9的兩條曲線可以作為預測結果的上下界,能夠包含其中80%的數據結果,如果我們追求更高的區間置信度,可以選擇更低的下界分位數和更高的上界分位數。


分位數函數的建模結果,藍點為實際的數據

總結

  1. 在回歸任務中,我們可以輕松構建能夠預測輸出值范圍的模型,并且不依賴對數據的先驗處理,是一種非常高效的方法;
  2. 分位數損失函數的實現,推薦使用文中的第二種方法,涉及的計算步驟更少,效率更高;
  3. 分位數損失函數與MAE損失類似,是一種線性的損失函數,在loss在0附近的區間內同樣存在導數不連續的問題,如果能有簡單的方法可以規避這個缺點,則會更加好用。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容

  • ----本段節選自秦東魁老師新書《上乘運氣學》 《上乘運氣學》:人生如夢,游戲人生,掌握人世間十二大游戲規則,你就...
    秦東魁閱讀 774評論 0 0
  • 春風又回來了,我遲遲未能察覺。我以為這次會有點不一樣,門前的朽木該有點抽芽的動靜。 我看著它,滿心期待。 然而春風...
    我想發芽閱讀 3,009評論 0 1
  • 26歲 身邊的朋友漸漸開始成家立業 父母也帶著自己去相親 見了十幾個姑娘 她們有人很美 有人很溫柔 但是 你知道她...
    葉小泫閱讀 647評論 0 1