特征工程用java或python,机器学习-特征工程-Feature generation 和 Feature selection(示例代码)...
Feature generation。對(duì)于這個(gè)技術(shù)點(diǎn),其實(shí)沒有什么訣竅,就是一個(gè),深刻理解咱們的數(shù)據(jù)的意義再加上一點(diǎn)點(diǎn)創(chuàng)造力。大家是不是很懵逼,哈哈,這就完啦????哈哈當(dāng)然不是啦,但是這一塊缺失沒有一個(gè)統(tǒng)一的模式,具有一定的隨機(jī)性。但是通過總結(jié),咱們可以總結(jié)一下常用的模式,方便大家在應(yīng)用的時(shí)候參考。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.1 Interaction。這個(gè)其實(shí)就是相當(dāng)于交叉的意思,咱們可以將幾個(gè)features直接的拼接在一起,形成一個(gè)“有意思”的新的feature,記住一定要有意義的,否則你不但白搞了,甚至原來好好的數(shù)據(jù)都被你搞砸了,不要為了裝逼而裝逼,咱要裝逼于無形之中。那么這個(gè)有什么意義呢?首先它能將多個(gè)columns裝換成一個(gè)column,方便咱們的數(shù)據(jù)處理;其次在有些特定的數(shù)據(jù)中,這種interaction更加能反映出數(shù)據(jù)的本質(zhì)。具體怎么操作了,咱們通過一個(gè)簡(jiǎn)單的代碼來展示,注意我只截取了我代碼的一部分,默認(rèn)數(shù)據(jù)都已經(jīng)加載完畢,所以不要糾結(jié)我的代碼的變量和數(shù)據(jù)哈,大家主要看過程和思路
interactions = data_raw["category"]+"_"+data_raw["country"]
baseline_data= baseline_data.assign(category_country = label_encoder.fit_transform(interactions))
上面的第一句代碼就是咱們interaction的部分,第二句是講interaction過后的數(shù)據(jù)label encoding并且加入到咱們的數(shù)據(jù)集里面,簡(jiǎn)單明了。上面是將原始數(shù)據(jù)中的category 和 country連接在一起從而形成一個(gè)新的feature? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2.2 numerical transforming。這是什么意思呢,對(duì)于有些numerical data的columns,他們的數(shù)據(jù)分布是很不均勻的,或者說他們的數(shù)值太大或者太小,有的時(shí)候不適合咱們的數(shù)據(jù)的訓(xùn)練,可能會(huì)出現(xiàn)vanishing gradient或者gradient explode的情況。具體啥叫vanishing gradient和gradient exploding,咱們?cè)诤竺娴膬?nèi)容在慢慢解釋。暫時(shí)只需要知道這是個(gè)很麻煩的事情就好了,會(huì)導(dǎo)致咱們訓(xùn)練的模型不那么牛逼就行了。那么咱們通過什么方法解決呢?這里主要通過一些常見的數(shù)學(xué)的方式來解決,例如用log 或者 sqrt等等方式。咱們可以通過下面的代碼來簡(jiǎn)單的展示一下
np.sqrt(baseline_data[‘goal‘])
np.log(baseline_data[‘goal‘])
從上面咱們可以看出,這里咱們主要還是通過numpy里面提供的API進(jìn)行處理的,非常簡(jiǎn)單,簡(jiǎn)單跟1一樣,好了這里就說到這了。? ? 對(duì)了,忘記一個(gè)事兒,就是numerical transforming在tree-based模型中沒有什么卵用的,因?yàn)閠ree-based的所有模型都是scale invariant的,就是tree-based模型都是不care數(shù)據(jù)的大小分布的。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2.3 rolling。這個(gè)就比較高級(jí)一點(diǎn)啦(相比前兩種方式),首先咱們先要明白rolling的概念,其實(shí)rolling就是相當(dāng)于在咱們的數(shù)據(jù)(series)上面卡上一個(gè)fixed-size的小window,然后對(duì)于這個(gè)window覆蓋的數(shù)據(jù)進(jìn)行一些簡(jiǎn)單的計(jì)算,例如:counting,mean,sum等等。如果大家還是覺得不懂,我把它的官方鏈接貼在這里,大家自己去看看,里面還有很多實(shí)例:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.rolling.html#pandas.Series.rolling?。那么我先寫一個(gè)簡(jiǎn)單的小例子給大家參考一下哈
launched = pd.Series(data_raw.index,data_raw.launched,name="count_7_days").sort_index()
count_7_days= launched.rolling(‘7d‘).count()
count_7_days.index = launched.values
count_7_days= count_7_days.reindex(data_raw.index)
我先簡(jiǎn)單解釋一下上面代碼的意思哈,第一句是讓時(shí)間作為這個(gè)series的index,第二句rolling是計(jì)算最近7天的的數(shù)量,第三第四句是講數(shù)據(jù)還原到之前的index的順序,房間重新join到原來的數(shù)據(jù)集中。那么rolling這種方式一般在什么情況下用呢?一般在你的數(shù)據(jù)有datetime的時(shí)候,或者前面數(shù)據(jù)會(huì)影響到后面的結(jié)果的時(shí)候,大家可以考慮一下下,但是這個(gè)是不一定的,還是需要大家有一定的creativity的。例如上面的例子就是統(tǒng)計(jì)最近7天一共上傳的APP的數(shù)量,來判斷某一個(gè)APP是否被下載的應(yīng)用場(chǎng)景。一般情況下,最近上傳的APP數(shù)量太多,被下載的概率就越低,所以他們還是有一定關(guān)聯(lián)關(guān)系的。所以我generate一個(gè)新的feature還是有一定道理的。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2.4 Time delta。從這個(gè)命名中咱們可以知道,這個(gè)跟time肯定有關(guān)系,這個(gè)大家猜的很對(duì)。time delta也是有一定隨機(jī)性的,有時(shí)需要有時(shí)也不需要,也是要根據(jù)實(shí)際的數(shù)據(jù)的特性來決定的,甚至是根據(jù)工程師自己來決定的,跟上面的rolling有點(diǎn)相似。為了方便解釋這其中的細(xì)節(jié),我也是直接來一個(gè)例子然后慢慢解釋
deftime_since_last_project_same_category(series):return series.diff().dt.total_seconds()/3600df= data_raw[[‘category‘,‘launched‘]].sort_values(‘launched‘)
group_category= df.groupby(‘category‘)
timedeltas=group_category.transform(time_since_last_project_same_category)
timedeltas= timedeltas.fillna(timedeltas.mean()).reindex(baseline_data.index)
上面前兩行是一個(gè)計(jì)算相鄰datatime之間的相差多少個(gè)小時(shí),第三行創(chuàng)建一個(gè)按照排序好的launched time為index的dataframe, 第四行是按照category的條件來group前面創(chuàng)建的df, 第五行是計(jì)算group里面相鄰數(shù)據(jù)之間的time delta,并且返回一個(gè)series, 第六行是填充這些空數(shù)據(jù),并且按照原始數(shù)據(jù)的方式index重新排序方便加入到原始數(shù)據(jù)。流程就這樣結(jié)束了。上面的場(chǎng)景是計(jì)算同一個(gè)category相鄰app上傳的時(shí)間差,這個(gè)其實(shí)也是會(huì)影響到咱們的APP是否被下載的因素。所以這個(gè)也是咱們的一個(gè)creativity,實(shí)際情況中千變?nèi)f化,一定要根據(jù)實(shí)際情況來定,不能為了裝逼而裝逼,一定要根據(jù)實(shí)際的業(yè)務(wù)需要,否則適得其反。 好了,其實(shí)關(guān)于feature generation還有很多種方式,例如有些事計(jì)算兩個(gè)columns之間的差值,取模等等,這里沒有統(tǒng)一的標(biāo)準(zhǔn),唯一的捷徑和key就是咱們一定得理解咱們每一個(gè)columns和dataset的實(shí)際業(yè)務(wù)的意思,否則再牛逼的generation也拯救不了你。下面咱們進(jìn)入到這一章的最后一節(jié)feature selection吧。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的特征工程用java或python,机器学习-特征工程-Feature generation 和 Feature selection(示例代码)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: discuz forums.inc.ph
- 下一篇: python怎么实现数据可视化_数据之美