天池 Datawhale二手車新手賽 Task03

2021-10-04 13:02:35 字數 2383 閱讀 8927

特徵工程應當結合模型來做,這看起來似乎是一句廢話,但與一些參賽的小夥伴討論過後,發現很多人都沒有認識到這一點。或者說只是表面上知道這一點,卻並沒有很好地在建模中踐行。我覺得這裡有乙個原因,就是很多同學在做data mining的時候,只是調包,然後頂多調一下超引數,只能從結果來判斷引數好壞,並不知道為什麼好,甚至連有哪些超引數都不清楚。基於此,對特徵工程這一塊也是鬍子眉毛一把抓,網上看了些資料,然後就按照別人說的處理一通,並沒有深入思考別人為什麼那樣處理。

舉個例子,很多同學上來就看特徵分布,然後就發現很多不滿足正態分佈,然後也不管用的什麼模型,先做一通正態轉換。然而卻完全沒考慮,自己用的是xgboost模型。而xgboost模型根本就不管你特徵什麼分布,人家就是安特徵排序,然後取點進行split,所以轉換特徵的分布,對演算法並沒有任何影響,因為多數的特徵轉換都是單調的,不改變原特徵排序。什麼?你說你用的是線性模型? 那當我沒說。

好了回歸正題,本次賽題,個人選用的是xgboost,別問我為什麼不用lbg,因為我還沒學懂這個演算法。基於xgboost,特徵工程有哪些需要注意的?

這裡僅僅談一些個人的思考,說不上什麼方**。

首先,xgboost是根據特徵的排序,然後分別取不同分位數的值來進行split,計算gini值,決定選取哪個特徵的哪個分位點進行split。從演算法原理可以判斷,任何單調的數值變換,都不會提公升演算法的準確率,甚至對也不會提公升演算法效率。所以那些normalize,scalable的演算法就必要做了。那應該做什麼呢?這裡分不同的變數進行**。

對於變數中的缺失值,如果有先驗,補上當然好,不補問題也不大。對於異常值,比如異常高的值或者異常低的值,個人覺得可以進行截斷。但也有例外,比如本賽題中的power,我看到有很多超過500的值,而超過500後,這些觀測的**會驟降,這時候截斷的方式就不好了,因為模型會認為500以上的跟500的是一波人,也就不會把他們分開。因此個人建議是,超過500了就標位缺失值,認為是消費者自己亂填的。同樣的,很多power = 0, 是否也標為缺失值呢?個人看了下分布,認為如果也將0標為缺失值,模型會認為這些人 跟power 大於500的那些人是一波人,但實際上又會很不一樣,因此就不適宜把0再轉為缺失值,而且從**的變化趨勢,power接近0 的**都不高,因此模型會很容易把這些低power的跟正常power的人分開。這時候我做的是,把power低於10 的都規整到0,這樣模型會更容易的把0 這波人單獨分開來。

此外,對於連續變數,還可以進行分桶操作,比如通過creatdate - regdate 能得到二手車的使用年限(注:regdate有部分錯誤日期,轉換的時候不處理會出現缺失的情況),而經驗告訴我們,二手車年限往往跟年數是有關係的,比如第一年第二年,因此處理使用年限的時候,對其記性了按年取整的操作。這樣一方面能減少過擬合(可能也會損失部分資訊),另一方面能夠加速模型的訓練,實測進行了該操作後,模型的分數並沒有降低,但是速度確實快了。

嗯,想到這裡,還是得回去翻一下xgboost的演算法,比如演算法是否能精準的把power中的0值與非0值進行分割?可能剛開始的時候不一定行,因為演算法是對特徵進行分桶,然後再取點進行分割。

本賽題裡面,像model、brand這樣的分類變數,也進行了連續值編碼,但千萬不能把它當做連續值來放入模型(別問我為什麼)。這些變數都需要進行one hot編碼。但model有好幾百個,演算法作者不建議對這種變數不進行處理就直接one hot,因為過於稀疏,個人認為可以對model 這樣的變數,可以根據model 觀測數的多少來進行one hot,比如觀測資料低於一定閾值的,統統編碼成乙個model。當然這麼做會略顯粗糙,但也總比什麼都不做直接one hot的好。對於one hot,本人開始也犯了乙個低階錯誤,就是為了防止完全共線性,把one hot後的某一列丟棄了。完全共線性那是回歸裡面的大忌(抱歉本人回歸中毒太深),但樹模型則完全不擔心,而且去掉了某一列後,對於模型來說,需要排除掉其餘所有的變數後才能「找回」丟棄的那一列,這是弄巧反拙,因此,one hot後千萬不能丟棄某列。

聽說有同學把regioncode提取第一位當做城市,卻沒發現regioncode是連續編碼的,就是主辦方壓根就不希望你從裡面獲取城市資訊。這種強行提取城市的做法,出發點雖然對的,卻沒有觀察資料的特點。也是很多新人會犯的錯誤吧,切記。

對於v_1 這種疑似主辦方對部分資料做了平移的特徵,本人嘗試把其拆成三列(不要問我為什麼不平移回去,萬一我猜錯了呢),一列表示左半部分,一列表示右半部分,還有一列是標識 哪些觀測屬於左半部分,屬於的標1, 不屬於標 0。 這也是受線性回歸的影響,這樣能夠完整的保留資訊的同時,讓模型區別的對待左右兩部分資料。但讓我不解的是,xgboost似乎不太認同 0/1 標識列,做的幾個變數重要性都很低。有待進一步思考。

對於y是否需要做轉換,這個不同於特徵的變換,是有價值的,y的取值首先就會極大的影響到超引數的設定,同時也會影響到模型split的優先順序,對於這一點,是需要結合gini值的計算來進行推敲。目前個人的判斷是,當y的值域跨度太大時,確實需要對其進行轉換。而且如果我們對某一種值域範圍的y所對應的超引數有較強把握的時候,把y轉換成相應的值域,也能提公升我們調超引數的效率。

天池二手車比賽 EDA

這是第二次的任務打卡 首先是基本流程 借鑑別人的乙個思維導圖,基本流程比較清楚了。1.與官方手冊有修改的的地方 import seaborn as sns import matplotlib.pyplot as plt import scipy.stats as st 引入科學計算包,統計類 plt...

瓜子二手車推出二手車新零售業務

瓜子二手車今日宣布,正式推出二手車新零售業務 瓜子保賣體驗店,通過線上大資料 流量,線下實體店的聯動,實現交易效率大幅提公升的同時帶動交易規模的提公升。瓜子保賣體驗店 車輛均來自個人賣家,買賣雙方一口價交易。賣車車主可提前拿到瓜子先行墊付的大額預付車款,節約售車時間 買家可一次多看大量優質個人車源,...

二手車專案(二)

sale應用中 urls.py 1 encoding utf 8 2 author freshman 3 4from django.conf.urls import url,include56 from sale import views78 9 urlpatterns 10 汽車品牌列表 11 u...