照著R語言和深度學(xué)習(xí)第三章 “3.6預(yù)測房價:一個回歸的例子” 做了一遍,用同樣的數(shù)據(jù)又跑了一遍OLS作對比膛薛,算是對深度學(xué)習(xí)多了點理解。
1. 數(shù)據(jù)
數(shù)據(jù)來自1970年代中期波士頓还最,內(nèi)生變量是郊區(qū)房屋的價格中位數(shù),外生變量包括房屋特征、住房所在區(qū)域的特征等13個變量埃撵。書里沒有具體說明數(shù)據(jù)來源雇寇,也沒有變量名或者標(biāo)簽氢拥,估計是截面數(shù)據(jù)蚌铜,否則應(yīng)該包括年份變量。訓(xùn)練樣本404個嫩海,測試樣本102個冬殃。
2. 模型設(shè)置
- 層和網(wǎng)絡(luò)
- 一共三層
- 前兩層輸出都是64,使用relu激活
- 第三層輸出為1叁怪,沒有定義激活函數(shù)(即默認(rèn)為線性模型)
- 優(yōu)化器:rmsprop
- 損失:均誤方差(MSE审葬,mean squared error,與OLS的目標(biāo)函數(shù)一樣)
- 監(jiān)控目標(biāo):平均絕對誤差(MAE奕谭,mean absolute error)涣觉。監(jiān)控MSE結(jié)果應(yīng)該不會差很多,選擇MAE大概是為了和內(nèi)生變量單位保持一致展箱,比MSE更容易解釋旨枯。
3. 模型訓(xùn)練
- 因為是小樣本,采取了K折驗證(K = 4)
- 在每輪訓(xùn)練中
- 迭代次數(shù)為100(epochs = 100)
- 迭代次數(shù)遠(yuǎn)高于前兩個例子混驰,大概是因為樣本量太小
- 每批樣本為1 (batch_size = 1)
- 不知道batch_size的設(shè)置原則攀隔,以及這里為什么設(shè)置成1,后面的章節(jié)需要注意一下這個問題
- 查了一下栖榨,batch_size = 1會影響收斂速度
- 模型跑下來昆汹,四折平均MAE為2.8左右,高于書里的2.38
- 迭代次數(shù)為100(epochs = 100)
- 按照書里將迭代次數(shù)設(shè)為500又跑了一次婴栽,花了很多時間(10分鐘的樣子)满粗,遠(yuǎn)高于第三章的前兩個例子(上萬樣本、張量展開后需要1G 空間)
- 精確度表現(xiàn)確實好了一些愚争,但仍然不如書上的數(shù)字
- MAE最低點的位置跟書上差不多映皆,都在120次迭代出現(xiàn)
4. 測試
- epochs = 80, batch_size = 16
- MAE是3左右,比書里高了0.5轰枝,是個不小的差距
- 試過epochs = 100/120, batch_size = 4/8捅彻,MAE也只降到2.8
- 降低batch_size特別影響速度
5. OLS模型
為了保持可比性,也是用訓(xùn)練樣本跑的回歸鞍陨,然后使用回歸系數(shù)對測試樣本進(jìn)行預(yù)測步淹,然后計算MAE,結(jié)果為3.3诚撵,就是說精度比深度學(xué)習(xí)方法低了10%缭裆。
為了省事,沒有用K折方法寿烟,由于K折驗證降低樣本量澈驼,估計使用K折或者bootstrap會進(jìn)一步降低精度。
由于不知道自變量的定義筛武,無法采用更有效的模型盅藻,比如傳統(tǒng)的房價模型會把某幾個變量做交叉或者做二次項购桑,這類模型會獲得更高的精度,用這些更好的模型作對比會更有意義氏淑,畢竟深度學(xué)習(xí)模型是高度非線性的。曾經(jīng)用美國的數(shù)據(jù)跑過硕噩,調(diào)一下模型可以使R平方從65%提高到80%假残,那么把精度再提高10%也許不算難事。
6. 結(jié)論與若干細(xì)節(jié)
- 研究問題的影響
住房市場是很成熟的市場炉擅,每個變量的影響在交易過程中已經(jīng)被考慮得很充分辉懒,也就是說市場已經(jīng)給每個變量制定了合理的價格。這些價格的形成來自買家與賣家(也許還有中介)的討價還價過程谍失,也就是來自人的計算眶俩。人在討價還價時不會做特別復(fù)雜的計算,非晨煊悖可能就是靠大腦中的線性模型計算颠印,比如100平米的房子比50平米貴兩倍。這種情況下抹竹,OLS和深度學(xué)習(xí)取得相同的效果是可以理解的线罕。
但這不是說深度學(xué)習(xí)是多此一舉,更好的解釋是窃判,如果真實的模型是線性的钞楼,那么深度學(xué)習(xí)這個黑箱最終給出的也是個線性模型。對于更復(fù)雜的市場袄琳,或許深度學(xué)習(xí)更有優(yōu)勢询件。 - 樣本量的影響
即便真實的世界定價是非線性的,想從幾百個樣本當(dāng)中提取復(fù)雜的非線性關(guān)系唆樊,恐怕也不容易如蚜。 - 運行速度
大概是batch_size的影響,深度學(xué)習(xí)跑得很慢搓扯,而OLS基本上是一個命令搞定介劫,回車敲下去,立刻出結(jié)果痢艺。再一次仓洼,樣本量如果夠大(再大的樣本OLS還是非常快)堤舒,batch_size設(shè)置大一些色建,速度可能不再是個問題,而且還可能獲得OLS抓不到的效應(yīng)舌缤。 - 對世界的理解
OLS可以看到每個變量的影響箕戳,而且還需要我們思考變量是否內(nèi)生某残,以確定因果關(guān)系。深度學(xué)習(xí)目的卻只在預(yù)測陵吸,無法提供對世界的理解玻墅。經(jīng)濟(jì)學(xué)知識(以及其他社會科學(xué)知識)和計量經(jīng)濟(jì)學(xué)方法,對于理解世界來說壮虫,仍然不可缺少澳厢。好的深度學(xué)習(xí)模型仍然需要和專業(yè)知識合作——至少輸入哪些變量、生成哪些新變量還是需要專家來決定吧囚似。
現(xiàn)在我明白了Susan Athey為什么會結(jié)論機(jī)器學(xué)習(xí)剩拢,或者AI,并不能用來揭示因果關(guān)系饶唤,只是在模型選擇上提供幫助徐伐。 - 幾個細(xì)節(jié)問題
(1)為了讓模型跑得更快,深度學(xué)習(xí)通常會把因變量進(jìn)行標(biāo)準(zhǔn)化變換募狂,每個變量增加1办素,意味著增加一個標(biāo)準(zhǔn)差。如果是在OLS當(dāng)中做這種變換熬尺,回歸系數(shù)的解釋需要跟著調(diào)整摸屠。但深度學(xué)習(xí)并不在意回歸系數(shù),只要因變量不做標(biāo)準(zhǔn)化粱哼,預(yù)測結(jié)果的單位是保持不變的季二。(當(dāng)然OLS的預(yù)測也不會跟著因變量標(biāo)準(zhǔn)化而變化。)
(2)OLS通常要考慮的內(nèi)生性揭措、樣本選擇等問題胯舷,原因是一旦出現(xiàn)上述問題,對系數(shù)的估計會出現(xiàn)不一致——也就是說樣本一旦改變绊含,估計結(jié)果會發(fā)生顯著變化桑嘶。機(jī)器學(xué)習(xí)雖然不考慮這些問題,但通過使用測試樣本躬充,可以對估計結(jié)果一致性做出反應(yīng)逃顶,也就是說過擬合〕渖酰或許機(jī)器學(xué)習(xí)方法能夠為計量的結(jié)果提供一些參考以政,這個問題就有待計量經(jīng)濟(jì)學(xué)家去回答了。
Update
(2021.9.23)
TensorFlow for R網(wǎng)站給出了波士頓房價變量說明伴找,所給的代碼也比書里更詳細(xì)盈蛮,值得讀。