基于Python实现的二手车价格预测
資源下載地址:https://download.csdn.net/download/sheziqiong/85697758
資源下載地址:https://download.csdn.net/download/sheziqiong/85697758
一、解決方案及算法
分四個方面去闡述
數(shù)據(jù)處理
特征工程
選擇的模型
集成的方法
1.1 數(shù)據(jù)處理
1.2 特征工程
從“regDate”,“creatDate”可以獲得年、月、日等一系列的新特征,然后做差可以獲得使用年長和使用天數(shù)這些新特征。
“regionCode”沒有保留。
因為嘗試了一系列方法,并且發(fā)現(xiàn)了可能會泄漏“price”,因此最終沒保留該特征。
對可分類的連續(xù)特征進行分桶,kilometer 是已經(jīng)分桶了。
然后對"power"和"model"進行了分桶。
使用分類特征“brand”、“model”、“kilometer”、“bodyType”、“fuelType”與“price”、“days”、“power”進行特征交叉。
交叉主要獲得的是后者的總數(shù)、方差、最大值、最小值、平均數(shù)、眾數(shù)、峰度等等
這里可以獲得非常多的新特征,挑選的時候,直接使用 lightgbm 幫我們?nèi)ミx擇特征,一組組的放進去,最終保留了以下特征。(注意:這里是使用 1/4 的訓(xùn)練集進行挑選可以幫助我們更快的鎖定真正 Work 的特征)
'model_power_sum','model_power_std', 'model_power_median', 'model_power_max', 'brand_price_max', 'brand_price_median', 'brand_price_sum', 'brand_price_std', 'model_days_sum','model_days_std', 'model_days_median', 'model_days_max', 'model_amount','model_price_max', 'model_price_median','model_price_min', 'model_price_sum', 'model_price_std', 'model_price_mean'使用了置信度排名靠前的匿名特征“v_0”、“v_3”與“price”進行交叉,測試方法以上述一樣,效果并不理想。
因為都是匿名特征,比較訓(xùn)練集和測試集分布,分析完基本沒什么問題,并且它們在lightgbm 的輸出的重要性都是非常高的,所以先暫且全部保留。
主要是對輸出重要度非常高的特征進行處理
特征工程一期:
對 14 個匿名特征使用乘法處理得到 14*14 個特征
使用 sklearn 的自動特征選擇幫我們?nèi)ズY選,大概運行了半天的時間。大致方法如下:
最終篩選得到:
'new3*3', 'new12*14', 'new2*14','new14*14'特征工程二期:
對 14 個匿名特征使用加法處理得到 14*14 個特征
這次不選擇使用自動特征選擇了,因為運行實在太慢了,筆記本耗不起。
然后先嘗試了全部放進去 lightgbm 訓(xùn)練是否有效,驚喜的發(fā)現(xiàn)效果很明顯,由于新生成的特征很多,因此要對一部分冗余的特征進行刪除。
使用的方法是刪除相關(guān)性高的變量,把要刪除的特征記錄下來大致方法如下:(剔除相關(guān)度>0.95 的)
最終獲得的應(yīng)該刪除的特征為:
['new14+6', 'new13+6', 'new0+12', 'new9+11', 'v_3', 'new11+10', 'new10+14', 'new12+4', 'new3+4', 'new11+11', 'new13+3', 'new8+1', 'new1+7', 'new11+14', 'new8+13', 'v_8', 'v_0', 'new3+5', 'new2+9', 'new9+2', 'new0+11', 'new13+7', 'new8+11', 'new5+12', 'new10+10', 'new13+8', 'new11+13', 'new7+9', 'v_1', 'new7+4', 'new13+4', 'v_7', 'new5+6', 'new7+3', 'new9+10', 'new11+12', 'new0+5', 'new4+13', 'new8+0', 'new0+7', 'new12+8', 'new10+8', 'new13+14', 'new5+7', 'new2+7', 'v_4', 'v_10', 'new4+8', 'new8+14', 'new5+9', 'new9+13', 'new2+12', 'new5+8', 'new3+12', 'new0+10', 'new9+0', 'new1+11', 'new8+4', 'new11+8', 'new1+1', 'new10+5', 'new8+2', 'new6+1', 'new2+1', 'new1+12', 'new2+5', 'new0+14', 'new4+7', 'new14+9', 'new0+2', 'new4+1', 'new7+11', 'new13+10', 'new6+3', 'new1+10', 'v_9', 'new3+6', 'new12+1', 'new9+3', 'new4+5', 'new12+9', 'new3+8', 'new0+8', 'new1+8', 'new1+6', 'new10+9', 'new5+4', 'new13+1', 'new3+7', 'new6+4', 'new6+7', 'new13+0', 'new1+14', 'new3+11', 'new6+8', 'new0+9', 'new2+14', 'new6+2', 'new12+12', 'new7+12', 'new12+6', 'new12+14', 'new4+10', 'new2+4', 'new6+0', 'new3+9', 'new2+8', 'new6+11', 'new3+10', 'new7+0', 'v_11', 'new1+3', 'new8+3', 'new12+13', 'new1+9', 'new10+13', 'new5+10', 'new2+2', 'new6+9', 'new7+10', 'new0+0', 'new11+7', 'new2+13', 'new11+1', 'new5+11', 'new4+6', 'new12+2', 'new4+4', 'new6+14', 'new0+1', 'new4+14', 'v_5', 'new4+11', 'v_6', 'new0+4', 'new1+5', 'new3+14', 'new2+10', 'new9+4', 'new2+6', 'new14+14', 'new11+6', 'new9+1', 'new3+13', 'new13+13', 'new10+6', 'new2+3', 'new2+11', 'new1+4', 'v_2', 'new5+13', 'new4+2', 'new0+6', 'new7+13', 'new8+9', 'new9+12', 'new0+13', 'new10+12', 'new5+14', 'new6+10', 'new10+7', 'v_13', 'new5+2', 'new6+13', 'new9+14', 'new13+9', 'new14+7', 'new8+12', 'new3+3', 'new6+12', 'v_12', 'new14+4', 'new11+9', 'new12+7', 'new4+9', 'new4+12', 'new1+13', 'new0+3', 'new8+10', 'new13+11', 'new7+8', 'new7+14', 'v_14', 'new10+11', 'new14+8', 'new1+2']]特征工程三、四期:
這兩期的效果不明顯,為了不讓特征冗余,所以選擇不添加這兩期的特征,具體的操作可以在 feature 處理的代碼中看到。
以上特征工程處理都是針對于樹模型來進行的,接下來,簡單說明神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)預(yù)處理。各位都知道由于 NN 的不可解釋性,可以生成大量的我們所不清楚的特征,因此我們對于NN 的數(shù)據(jù)預(yù)處理只要簡單處理異常值以及缺失值。
大部分的方法都包含在以上針對樹模型數(shù)據(jù)處理方法中,重點講述幾個不同點:
-
在對于“notRepairedDamage”的編碼處理,對于二分類的缺失值,往往取其中間值。
-
在對于其他缺失值的填充,在測試了效果后,發(fā)現(xiàn)填充眾數(shù)的效果比平均數(shù)更好,因此均填充眾數(shù)。
1.3 選擇的模型
本次比賽,我選擇的是 lightgbm+catboost+neural network。
本來也想使用 XGBoost 的,不過因為它需要使用二階導(dǎo),因此目標(biāo)函數(shù)沒有 MAE,并且嘗試了逼近 MAE 的一些自定義函數(shù)效果也不理想,因此沒有選擇使用它。
經(jīng)過上述的數(shù)據(jù)預(yù)處理以及特征工程:
樹模型的輸入有 83 個特征;神經(jīng)網(wǎng)絡(luò)的輸入有 29 個特征。
因為它們都是樹模型,因此我同時對這兩個模型進行分析
第一:lgb 和 cab 的訓(xùn)練收斂速度非常快,比同樣參數(shù)的 xgb 快非常多。
第二:它們可以處理缺失值,計算取值的增益,擇優(yōu)錄取。
第三:調(diào)整正則化系數(shù),均使用正則化,防止過擬合。
第四:降低學(xué)習(xí)率,獲得更小 MAE 的驗證集預(yù)測輸出。
第五:調(diào)整早停輪數(shù),防止陷入過擬合或欠擬合。
第六:均使用交叉驗證,使用十折交叉驗證,減小過擬合。
其他參數(shù)設(shè)置無明顯上分跡象,以代碼為準(zhǔn),不一一闡述。
以下為 lightgbm 對輸入的 83 個特征的重要度排序。
我針對該比賽,自己設(shè)計了一個五層的神經(jīng)網(wǎng)絡(luò),大致框架如上圖所示,但結(jié)點數(shù)由于太多只是展示部分結(jié)點畫圖。
以下為全連接層的結(jié)點個數(shù)設(shè)置,具體實現(xiàn)可參考代碼。
接下來對神經(jīng)網(wǎng)絡(luò)進行具體分析:
第一:訓(xùn)練模型使用小 batchsize,512,雖然在下降方向上可能會出現(xiàn)小偏差,但是對收斂速度的收益大,2000 代以內(nèi)可以收斂。
第二:神經(jīng)網(wǎng)絡(luò)對于特征工程這一類不用操心很多,就能達(dá)到與樹模型相差無幾的精度。
第三:調(diào)整正則化系數(shù),使用正則化,防止過擬合。
第四:調(diào)整學(xué)習(xí)率,對訓(xùn)練過程的誤差進行分析,選擇學(xué)習(xí)率下降的時機進行調(diào)整。
第五:使用交叉驗證,使用十折交叉驗證,減小過擬合。
第六:選擇梯度下降的優(yōu)化器為 Adam,它是目前綜合能力較好的優(yōu)化器,具備計算高效,對內(nèi)存需求少等等優(yōu)點。
1.4 集成的方法
由于兩個樹模型的訓(xùn)練數(shù)據(jù)一樣且結(jié)構(gòu)相似,首先對兩個樹模型進行 stacking,然后再與神經(jīng)網(wǎng)絡(luò)的輸出進行 mix。
由于樹模型和神經(jīng)網(wǎng)絡(luò)是完全不同的架構(gòu),它們得到的分?jǐn)?shù)輸出相近,預(yù)測值差異較大,往往在 MAE 上差異為 200 左右,因此將他們進行 MIX 可以取到一個更好的結(jié)果,加權(quán)平均選擇系數(shù)選擇 0.5,雖然神經(jīng)網(wǎng)絡(luò)的分?jǐn)?shù)確實會比樹模型高一點點,但是我們的最高分是多組線上最優(yōu)輸出的結(jié)合,因此可以互相彌補優(yōu)勢。
給出的代碼是一次輸出的結(jié)果,如若完美復(fù)現(xiàn)線上結(jié)果,得多輸出幾次選取Top-3求平均。
二、代碼說明
由于后期上分選擇了十折交叉驗證和非常小的學(xué)習(xí)率,運行較慢,大家可以先使用五折和較大學(xué)習(xí)率測試效果~
|--data訓(xùn)練集、測試集,可從比賽官網(wǎng)下載
|--user_data代碼中途生成的一些文件,比賽過程中方便觀察
|--prediction_result輸出的提交文本
|--feature| NN_generation.py | ——神經(jīng)網(wǎng)絡(luò)訓(xùn)練數(shù)據(jù)的處理程序 |
| generation.py | ——為以上兩個代碼的合成版本,生成兩份數(shù)據(jù) |
| cab_model.py ——catboost 模型訓(xùn)練代碼 |
| nn_model.py ——神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練代碼 |
| stack+mix.py ——二層 stack 和三層加權(quán)平均代碼 |
| model.py ——為以上四個代碼的合成版本,輸出測試集的預(yù)測數(shù)據(jù) |
| main.py ——主程序,一個代碼,包括以上所有的步驟 |
執(zhí)行:(進入該目錄,執(zhí)行以下命令即可產(chǎn)生一份預(yù)測數(shù)據(jù)) python main.py PS:其實 main 是我把 feature 和 model 的代碼全都復(fù)制扔了進去。
資源下載地址:https://download.csdn.net/download/sheziqiong/85697758
資源下載地址:https://download.csdn.net/download/sheziqiong/85697758
總結(jié)
以上是生活随笔為你收集整理的基于Python实现的二手车价格预测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stm32f407 四路pwm输出_ST
- 下一篇: 学习笔记(08):区块链应用案例-区块链