天池?cái)?shù)據(jù)挖掘比賽 - 二手車交易價(jià)格預(yù)測(cè)

疑問(wèn):#use make_scorer to convert a metric to a scorer.

連續(xù):'kilometer', 'power', 'brand_amount', 'brand_price_average', 'brand_price_max',
'brand_price_median', 'brand_price_min', 'brand_price_std',
'brand_price_sum'揣苏;used_time
'v_0', 'v_1', 'v_10', 'v_11', 'v_12', 'v_13', 'v_14','v_2', 'v_3', 'v_4', 'v_5', 'v_6', 'v_7', 'v_8', 'v_9',

分類:'power_bin'悯嗓、'model', 'brand', 'bodyType', 'fuelType','gearbox', 'power_bin','notRepairedDamage', 【city督勺、'name','offerType','seller','kilometer'】
【以下兩個(gè)類別特征嚴(yán)重傾斜箱玷,故這邊先刪掉】"seller"狞洋、"offerType"

數(shù)據(jù)挖掘流程

【賽題理解】如果用簡(jiǎn)短的話來(lái)說(shuō)咪鲜,并且在比賽的角度或者做工程的角度,就是該賽題符合的問(wèn)題是什么問(wèn)題痒留,大概要去用哪些指標(biāo)电媳,哪些指標(biāo)是否會(huì)做到線上線下的一致性(不太理解蒙揣?洪乍?),是否有效的利于我們進(jìn)一步的探索更高線上分?jǐn)?shù)的線下驗(yàn)證方法夜焦,在業(yè)務(wù)上壳澳,你是否對(duì)很多原始特征有很深刻的了解,并且可以通過(guò)EDA來(lái)尋求他們直接的關(guān)系茫经,最后構(gòu)造出滿意的特征巷波。
【賽題理解后能做什么】這題的難點(diǎn)可能在哪里,關(guān)鍵點(diǎn)可能在哪里卸伞,哪些地方可以挖掘更好的特征抹镊,用什么樣得線下驗(yàn)證方式更為穩(wěn)定,出現(xiàn)了過(guò)擬合或者其他問(wèn)題荤傲,估摸可以用什么方法去解決這些問(wèn)題垮耳,哪些數(shù)據(jù)是可靠的,哪些數(shù)據(jù)是需要精密的處理的遂黍,哪部分?jǐn)?shù)據(jù)應(yīng)該是關(guān)鍵數(shù)據(jù)(背景的業(yè)務(wù)邏輯下终佛,比如CTR的題,一個(gè)尋常顧客大體會(huì)有怎么樣的購(gòu)買行為邏輯規(guī)律雾家,或者風(fēng)電那種題铃彰,如果機(jī)組比較鄰近,相關(guān)一些風(fēng)速芯咧,轉(zhuǎn)速特征是否會(huì)很近似)牙捉。這時(shí)是在一個(gè)宏觀的大體下分析的,有助于摸清整個(gè)題的思路脈絡(luò)敬飒,以及后續(xù)的分析方向邪铲。

EDA(作圖與量化)

探索性數(shù)據(jù)分析.PNG
一、載入數(shù)據(jù):
載入訓(xùn)練集和測(cè)試集无拗;
簡(jiǎn)略觀察數(shù)據(jù)(head()+shape)霜浴;

二、數(shù)據(jù)總覽:
通過(guò)describe()來(lái)熟悉數(shù)據(jù)的相關(guān)統(tǒng)計(jì)量
通過(guò)info()來(lái)熟悉數(shù)據(jù)類型

三蓝纲、【數(shù)據(jù)清洗】判斷數(shù)據(jù)缺失和異常
查看每列的存在nan情況
異常值檢測(cè)

刪除特征嚴(yán)重傾斜的列:
del Test_data["offerType"]

四阴孟、了解預(yù)測(cè)值的分布
總體分布概況(無(wú)界約翰遜分布等)
查看skewness and kurtosis【正態(tài)分布的偏度和峰度都看做零晌纫;偏度——左偏右偏,峰度——高頂平頂】
查看預(yù)測(cè)值的具體頻數(shù)

五永丝、特征分為類別特征和數(shù)字特征锹漱,并對(duì)類別特征查看【類別特征:特征nunique分布 】
- 數(shù)字特征分析
相關(guān)性分析
查看幾個(gè)特征得偏度和峰值
每個(gè)數(shù)字特征得分布可視化
數(shù)字特征相互之間的關(guān)系可視化
多變量互相回歸關(guān)系可視化
- 類型特征分析
unique分布
類別特征箱形圖可視化
類別特征的小提琴圖可視化
類別特征的柱形圖可視化類別
特征的每個(gè)類別頻數(shù)可視化(count_plot)

六、用pandas_profiling生成數(shù)據(jù)報(bào)告

1慕嚷、作圖分析

小提琴圖VS箱型圖

2哥牍、量化分析(統(tǒng)計(jì)連續(xù)變量 / 數(shù)值特征?喝检?的相關(guān)性)

  • 相關(guān)性分析(當(dāng)資料不服從雙變量正態(tài)分布或總體分布未知嗅辣,或原始數(shù)據(jù)用等級(jí)表示時(shí),宜用 spearman或kendall相關(guān))
    皮爾森(pearson)相關(guān)系數(shù):要求服從正態(tài)分布挠说。連續(xù)性變量澡谭??
    斯皮爾曼(spearman)相關(guān)系數(shù):定序變量或不滿足正態(tài)分布假設(shè)的等間隔數(shù)據(jù)
    肯德?tīng)枺╧endall)相關(guān)系數(shù):定序變量或不滿足正態(tài)分布假設(shè)的等間隔數(shù)據(jù)损俭。

    相關(guān)性分析(定序變量的差值無(wú)意義蛙奖;import scipy eta?杆兵?雁仲?)

    數(shù)據(jù)分類:定性數(shù)據(jù)(定類、定序)琐脏、定量數(shù)據(jù)(定距攒砖、定比)

  • 獨(dú)立性分析


    獨(dú)立性分析(他推薦一種MVtest的獨(dú)立性分析方法,可在其github下載python包日裙,后續(xù)數(shù)據(jù)競(jìng)賽直接拿來(lái)用祭衩??阅签?)
  • 偏度與峰度
    偏度Skew(【數(shù)據(jù)的不對(duì)稱程度】掐暮;左偏右偏:指的是長(zhǎng)尾巴拖在哪邊;較大的正值表明該分布具有右側(cè)較長(zhǎng)尾部政钟。較大的負(fù)值表明有左側(cè)較長(zhǎng)尾部路克。)
    峰度Kurt(【數(shù)據(jù)分布頂?shù)募怃J程度】;高頂平頂养交;>3的峰度系數(shù)說(shuō)明觀察量更集中精算,有比正態(tài)分布更短的尾部;<3的峰度系數(shù)說(shuō)明觀測(cè)量不那么集中碎连,有比正態(tài)分布更長(zhǎng)的尾部灰羽,類似于矩形的均勻分布。)
    正態(tài)分布的偏度為0,峰度為3
    數(shù)據(jù)面試題:正態(tài)分布廉嚼、偏態(tài)分布及峰態(tài)分布

    偏度與峰度(根據(jù)具體數(shù)值玫镐,腦補(bǔ)圖像:正態(tài)分布的偏度為0,峰度為3)

特征工程

零基礎(chǔ)入門(mén)數(shù)據(jù)挖掘系列之「特征工程」

主要目的:在于將數(shù)據(jù)轉(zhuǎn)換為能更好地表示潛在問(wèn)題的特征怠噪,從而提高機(jī)器學(xué)習(xí)的性能恐似。包含:數(shù)據(jù)理解、數(shù)據(jù)清洗傍念、特征構(gòu)造矫夷、特征選擇、類別不平衡憋槐。

  • 異常值處理:是為了去除噪聲双藕;
  • 缺失值填補(bǔ):可以加入先驗(yàn)知識(shí)(構(gòu)造統(tǒng)計(jì)量特征也可以增加先驗(yàn)知識(shí)【分類特征是否都可以處理成統(tǒng)計(jì)量?按實(shí)際業(yè)務(wù)進(jìn)行】)阳仔;按類別補(bǔ)充缺失值忧陪。


    數(shù)據(jù)清洗(類別特征的分布編碼?distribution encoder)

    特征構(gòu)造的時(shí)候需要考慮:數(shù)值特征(提取統(tǒng)計(jì)量特征作為先驗(yàn)知識(shí))驳概,類別特征(一般會(huì)嘗試之間的交叉組合赤嚼,embedding【高維稀疏特征不適用onehot編碼旷赖,反而高維稀疏的特征需要embedding顺又??等孵?】也是一種思路)稚照,時(shí)間特征(本項(xiàng)目還需要對(duì)汽車的使用時(shí)間used_time列進(jìn)行分箱,使用了3年以下俯萌,3-7年果录,7-10年和10年以上,分為四個(gè)等級(jí)咐熙, 10年之后就是報(bào)廢車了弱恒,應(yīng)該會(huì)影響價(jià)格)。

【特征交叉】交叉主要獲得的是后者的總數(shù)棋恼、方差返弹、最大值、最小值爪飘、平均數(shù)义起、眾數(shù)、峰度等等师崎。使用分類特征“brand”默终、“model”、“kilometer”、“bodyType”齐蔽、“fuelType”
與“price”两疚、“days”、“power”進(jìn)行特征交叉肴熏。

特征構(gòu)造

分箱

特征選擇

創(chuàng)新:大類變?yōu)樾☆惞砣浮⒆兂啥喾诸悾恍☆愐暈楫惓|c(diǎn)蛙吏,用異常檢測(cè)來(lái)建模


類別不平衡(創(chuàng)新:大類變?yōu)樾☆愒戳ā⒆兂啥喾诸悾恍☆愐暈楫惓|c(diǎn)鸦做,用異常檢測(cè)來(lái)建模)

【本項(xiàng)目用于樹(shù)模型的數(shù)據(jù)集的預(yù)處理】有異常值(LR或者樹(shù)模型都要處理異常值)励烦、分桶(連續(xù)特征離散化:LR或者樹(shù)模型都要);此項(xiàng)目并沒(méi)有處理缺失值(樹(shù)模型可以不處理缺失值泼诱?坛掠??)治筒。

匿名特征【特征統(tǒng)計(jì)屉栓、變換、四則運(yùn)算耸袜、多項(xiàng)式組合】:有些比賽的特征是匿名特征友多,這導(dǎo)致我們并不清楚特征相互直接的關(guān)聯(lián)性,這時(shí)我們就只有單純基于特征進(jìn)行處理堤框,比如裝箱域滥,groupby,agg 等這樣一些操作進(jìn)行一些特征統(tǒng)計(jì)蜈抓,此外還可以對(duì)特征進(jìn)行進(jìn)一步的 log启绰,exp 等變換,或者對(duì)多個(gè)特征進(jìn)行四則運(yùn)算(如上面我們算出的使用時(shí)長(zhǎng))沟使,多項(xiàng)式組合等然后進(jìn)行篩選委可。由于特性的匿名性其實(shí)限制了很多對(duì)于特征的處理,當(dāng)然有些時(shí)候用 NN 去提取一些特征也會(huì)達(dá)到意想不到的良好效果腊嗡。
非匿名特征【結(jié)合背景的特征構(gòu)建】:對(duì)于知道特征含義(非匿名)的特征工程着倾,特別是在工業(yè)類型比賽中,會(huì)基于信號(hào)處理叽唱,頻域提取屈呕,峰度,偏度等構(gòu)建更為有實(shí)際意義的特征棺亭,這就是結(jié)合背景的特征構(gòu)建虎眨;在推薦系統(tǒng)中也是這樣的,各種類型點(diǎn)擊率統(tǒng)計(jì),各時(shí)段統(tǒng)計(jì)嗽桩,加用戶屬性的統(tǒng)計(jì)等等岳守,這樣一種特征構(gòu)建往往要深入分析背后的業(yè)務(wù)邏輯或者說(shuō)物理原理,從而才能更好的找到 magic碌冶。
當(dāng)然特征工程其實(shí)是和模型結(jié)合在一起湿痢,這就是為什么要為 LR NN 做分桶和特征歸一化的原因,而對(duì)于特征的處理效果和特征重要性等往往要通過(guò)模型來(lái)驗(yàn)證扑庞。

高基類別特征:如銀行卡號(hào)譬重、ip地址、店鋪ID等類別很多的類別型特征罐氨。這種特征由于類別很多臀规,做onehot處理會(huì)導(dǎo)致維度很高并且很稀疏(很多空值),無(wú)論對(duì)于樹(shù)模型或者線性模型栅隐,稀疏都不是一個(gè)好的性質(zhì)塔嬉。特征一旦稀疏,就會(huì)失去統(tǒng)計(jì)的顯著性租悄?谨究?,降低模型的預(yù)測(cè)精度泣棋。

【長(zhǎng)尾分布 / 冪律分布】針對(duì)邏輯回歸LR模型(LR模型與神經(jīng)網(wǎng)絡(luò)一致胶哲??外傅;而非決策樹(shù)DT纪吮,因?yàn)镈T效果不明顯)模型俩檬,一般服從長(zhǎng)尾分布(或者長(zhǎng)尾分布的鏡像萎胰??)棚辽,可以取log之后再做歸一化技竟。很多模型都假設(shè)數(shù)據(jù)誤差項(xiàng)符合正態(tài)分布,而長(zhǎng)尾分布的數(shù)據(jù)違背了這一假設(shè)屈藐。

對(duì)冪律分布榔组,可以采用公式

概率分布細(xì)談:厚尾、長(zhǎng)尾联逻、冪律搓扯、指數(shù)
什么是「長(zhǎng)尾效應(yīng)」 ?

【Xgboost(xgb不要求標(biāo)準(zhǔn)化)處理分類特征不做one-hot編碼包归,因?yàn)闃?shù)模型不推薦對(duì)離散特征進(jìn)行one-hot】具體原因:(1)產(chǎn)生樣本切分不平衡锨推;(2)決策樹(shù)依賴的是數(shù)據(jù)的統(tǒng)計(jì)信息
本質(zhì)原因:特征的預(yù)測(cè)能力被人為的拆分成多分,每一份與其他特征競(jìng)爭(zhēng)最優(yōu)劃分節(jié)點(diǎn)時(shí)都會(huì)失敗换可,所以特征的重要性比實(shí)際低椎椰。
分類特征,構(gòu)造統(tǒng)計(jì)量沾鳄;針對(duì)類別特征brand慨飘,構(gòu)造統(tǒng)計(jì)量特征price,來(lái)增加先驗(yàn)知識(shí)】為了增加先驗(yàn)知識(shí)译荞,告訴模型品牌過(guò)去的歷史信息瓤的。

建模調(diào)參

驗(yàn)證方法

特征工程>模型融合>參數(shù)調(diào)優(yōu);貪心:先全力做好特征工程吞歼,再在此基礎(chǔ)上堤瘤,模型調(diào)參。


模型選擇(驗(yàn)證集)與參數(shù)調(diào)優(yōu)(精力:特征工程>模型融合>參數(shù)調(diào)優(yōu)浆熔;)

模型融合

最佳:不同模型的預(yù)測(cè)差異大本辐,得分近似(找不同模型)。


模型融合

模型融合2

Datawhale 零基礎(chǔ)入門(mén)數(shù)據(jù)挖掘+Baseline Task1 賽題理解
二手車交易價(jià)格預(yù)測(cè)——數(shù)據(jù)挖掘?qū)W習(xí)問(wèn)題答疑匯總
賽題理解 - 《二手車價(jià)格影響因素》《二手車常用估價(jià)方法 》《汽車行業(yè)統(tǒng)計(jì)數(shù)據(jù)》《二手車市場(chǎng)分析報(bào)告》
pythonlibs下載whl網(wǎng)址
用Python進(jìn)行時(shí)間處理合集
數(shù)據(jù)的偏度和峰度——df.skew()医增、df.kurt()
回歸分析的五個(gè)基本假設(shè)

技巧

取出字典dict中對(duì)應(yīng)value最小key值慎皱。——min(best_obj.items(), key=lambda x:x[1])[0]
嵌入式特征選擇:Lasso回歸叶骨、Ridge回歸茫多、決策樹(shù)。
sklearn里有rubust函數(shù)忽刽,可以去方差天揖??跪帝?今膊?訓(xùn)練集的異常值不需要?jiǎng)h除?伞剑?斑唬?


object

1、【特征稀疏 / 嚴(yán)重傾斜(name和regioncode特征太稀疏)VS特征全同黎泣?恕刘??】特征一旦稀疏抒倚,容易失去統(tǒng)計(jì)的顯著性褐着??托呕?含蓉?洋访??谴餐?姻政??岂嗓?汁展??
不具有統(tǒng)計(jì)意義/顯著性的特征可刪除:

不具有統(tǒng)計(jì)意義的特征可刪除

2厌殉、本案例的baseline里面先特征篩選食绿、再分訓(xùn)練集和測(cè)試街,最后-1填補(bǔ)缺失值公罕。
3器紧、測(cè)試集含異常值的處理方法:規(guī)則方法?手動(dòng)改楼眷?
4铲汪、power最大值過(guò)大(與中位數(shù)差異大):有可能異常值,或者不是正太分布罐柳。
5掌腰、特征間的相關(guān)性系數(shù)接近1,可能帶來(lái)復(fù)共線性 / 多重共線性(精確相關(guān)關(guān)系或高度相關(guān)關(guān)系)的問(wèn)題张吉,故需要剔除某個(gè)特征齿梁。
6、
【回歸問(wèn)題標(biāo)簽列的統(tǒng)計(jì)特征】

def Sta_inf(data):
    print('_min',np.min(data))
    print('_max:',np.max(data))
    print('_mean',np.mean(data))
    print('_ptp(極差肮蛹?)',np.ptp(data))
    print('_std',np.std(data))
    print('_var',np.var(data))

【df的索引取值:可用df.iloc[index集合]勺择,而非df.iloc[index集合,:]】
【分層StratifiedKFold抽樣取序號(hào)index】

sk = StratifiedKFold(n_splits=5,shuffle=True,random_state=0)
for train_ind,val_ind in sk.split(X_data,Y_data):  #train_ind,val_ind是索引?伦忠?
    print('train:%s |test:%s'%(train_ind,val_ind))
    
    train_x=X_data.iloc[train_ind,:].values
    train_y=Y_data.iloc[train_ind,:]
    val_x=X_data.iloc[val_ind,:].values
    val_y=Y_data.iloc[val_ind,:]

【權(quán)重表達(dá)】

 (1-MAE_lgb/(MAE_xgb+MAE_lgb))*val_lgb + (1-MAE_xgb/(MAE_xgb+MAE_lgb))*val_xgb

【實(shí)例化sub = pd.DataFrame()后填數(shù)】

sub = pd.DataFrame()##實(shí)例化一個(gè)pd或者df省核,然后往里面填數(shù)據(jù);先實(shí)例化缓苛,然后填數(shù)據(jù)
sub['SaleID'] = TestA_data.SaleID
sub['price'] = sub_Weighted
sub.to_csv('./sub_Weighted.csv',index=False)

【熱力圖顯示 VS (連續(xù)/數(shù)值特征)相關(guān)系數(shù)的直方圖降序排列】

plt.figure(figsize=(15,15))
sns.heatmap(Train_data[numeric_features].corr(),  linewidths=.5, square=True, annot=True, fmt='.2f', linecolor='white')

Train_data[numeric_features].corr()['price'].sort_values(ascending = False).plot(kind='bar')

【偏度與峰度的圖形顯示】

【各個(gè)特征偏度的直方圖】
Train_data.skew().sort_values(ascending=False)[1:-1].plot(kind='bar')

【各個(gè)特征峰度的直方圖】
Train_data.kurt().sort_values(ascending=False)[2:].plot(kind='bar')
plt.axhline(3)  ##正態(tài)分布的偏度為0芳撒,峰度為3

【數(shù)值特征的偏度與峰度】
for col in numeric_features:
    print('特征%s'%col,'\t',
         'Skewness: %.2f'%Train_data[col].skew(),'\t',
         'Kurtosis: {:6.2f}'.format(Train_data[col].kurt()))

【可視化:每個(gè)特征(類別邓深、數(shù)量)未桥、兩特征之間(類別、數(shù)量)芥备?冬耿? 的可視化】

【兩數(shù)字特征之間的關(guān)系可視化】
sns.set()
columns =numeric_features # ['price', 'v_12', 'v_8' , 'v_0', 'power', 'v_5',  'v_2', 'v_6', 'v_1', 'v_14']
sns.pairplot(Train_data[columns],size = 2 ,kind ='scatter',diag_kind='kde')
plt.show()

【每個(gè)數(shù)值特征的分布可視化】
f = pd.melt(Train_data, value_vars=numeric_features)  # len(f)/len(numeric_features) ==Train_data.shape[0]
g = sns.FacetGrid(f, col="variable",  col_wrap=4, sharex=False, sharey=False)
g = g.map(sns.distplot , "value")  ### plt.hist,'value'

【多變量之間的關(guān)系可視化】
多變量之間的關(guān)系可視化

【類別特征:特征nunique分布 和 箱形圖可視化】

for cat_fea in categorical_features:
    print('特征{}\t取值個(gè)數(shù):{}'.format(cat_fea,Train_data[cat_fea].nunique()))

【類別特征的小提琴圖可視化】
for cat in categorical_features:
    sns.violinplot(x=cat,y='price',data=Train_data)
    plt.show()

【異常值處理的代碼】

# 這里我包裝了一個(gè)異常值處理的代碼,可以隨便調(diào)用萌壳。
def outliers_proc(data, col_name, scale=3):
    """
    用于清洗異常值亦镶,默認(rèn)用 box_plot(scale=3)進(jìn)行清洗
    :param data: 接收 pandas 數(shù)據(jù)格式
    :param col_name: pandas 列名
    :param scale: 尺度
    :return:
    """
    def box_plot_outliers(data_ser, box_scale):
        """
        利用箱線圖去除異常值
        :param data_ser: 接收 pandas.Series 數(shù)據(jù)格式
        :param box_scale: 箱線圖尺度日月,
        :return:
        """
        iqr = box_scale * (data_ser.quantile(0.75) - data_ser.quantile(0.25))
        val_low = data_ser.quantile(0.25) - iqr
        val_up = data_ser.quantile(0.75) + iqr
        rule_low = (data_ser < val_low)
        rule_up = (data_ser > val_up)
        return (rule_low, rule_up), (val_low, val_up)

    data_n = data.copy()
    data_series = data_n[col_name]
    rule, value = box_plot_outliers(data_series, box_scale=scale)
    #print('結(jié)果:',rule,value)
    
    index = np.arange(data_series.shape[0])[rule[0] | rule[1]]  #(&,|)和(and缤骨,or)
    print("Delete number is: {}".format(len(index)))
    
    data_n = data_n.drop(index)  #如何刪除行:df.drop(index)
    data_n.reset_index(drop=True, inplace=True)  #drop=True意思是刪除舊索引爱咬??
    print("Now column number is: {}".format(data_n.shape[0]))
    
    index_low = np.arange(data_series.shape[0])[rule[0]]
    outliers = data_series.iloc[index_low]  #series取值:series.iloc[index_low]
    print("Description of data less than the lower bound is:")
    print(type(outliers))
    print(pd.Series(outliers).describe())
    
    index_up = np.arange(data_series.shape[0])[rule[1]]
    outliers = data_series.iloc[index_up]
    print("Description of data larger than the upper bound is:")
    print(pd.Series(outliers).describe())
    
    print(len(index_up)+len(index_low))
    
    fig, ax = plt.subplots(1, 2, figsize=(10, 7))
    sns.boxplot(y=data[col_name], data=data, palette="Set1", ax=ax[0])
    sns.boxplot(y=data_n[col_name], data=data_n, palette="Set1", ax=ax[1])
    return data_n

【時(shí)間特征提劝砥稹(errors='coerce')】

data['used_time'] =(pd.to_datetime(data['creatDate'], format='%Y%m%d', errors='coerce') - 
                    pd.to_datetime(data['regDate'], format='%Y%m%d', errors='coerce')).dt.days

【構(gòu)造brand的price統(tǒng)計(jì)量特征:train訓(xùn)練集groupby("brand")構(gòu)造精拟,merge到測(cè)試集;字典中的字典可用來(lái)構(gòu)造df

# 計(jì)算某品牌的銷售統(tǒng)計(jì)量虱歪,同學(xué)們還可以計(jì)算其他特征的統(tǒng)計(jì)量
# 這里要以 train 的數(shù)據(jù)計(jì)算統(tǒng)計(jì)量
Train_gb = Train_data.groupby("brand")
all_info = {}
for kind, kind_data in Train_gb:
    info = {}
    kind_data = kind_data[kind_data['price'] > 0]
    info['brand_amount'] = len(kind_data)
    info['brand_price_max'] = kind_data.price.max()
    info['brand_price_median'] = kind_data.price.median()
    info['brand_price_min'] = kind_data.price.min()
    info['brand_price_sum'] = kind_data.price.sum()
    info['brand_price_std'] = kind_data.price.std()
    info['brand_price_average'] = round(kind_data.price.sum() / (len(kind_data) + 1), 2)
    all_info[kind] = info
brand_fe = pd.DataFrame(all_info).T.reset_index().rename(columns={"index": "brand"})
data = data.merge(brand_fe, how='left', on='brand')

【數(shù)據(jù)分桶(以 power 為例):缺失值也進(jìn)桶】

bin = [i*10 for i in range(31)]
data['power_bin'] = pd.cut(data['power'], bin, labels=False)
data[['power_bin', 'power']].head()

【刪除列 / 特征】

df.drop(['creatDate', 'regDate', 'regionCode'], axis=1,inplace=True)

del df['creatDate']  ??????

【特征符合長(zhǎng)尾分布的log_min_max處理方式(給LR用)】

#特征符合長(zhǎng)尾分布的log_min_max處理方式
def log_min_max(df,df_train,col):
    #data = pd.read_csv('D:/data_for_tree.csv')  可能要重新讀取
    import scipy.stats as st
    import numpy as np
    import seaborn as sns
    log_train_n = np.log(df_train[col]+1)   
    
    plt.figure(1)  #作圖看特征是否符合長(zhǎng)尾分布
    df[col].plot(kind='hist',bins=100)  #此處可處理缺失值蜂绎;而改用的sns不能處理缺失值:sns.distplot(data['used_time'], kde=True, fit=st.norm)

    df[col] = np.log(df[col]+1)  #訓(xùn)練集與測(cè)試集一起的有l(wèi)og無(wú)歸一化,再作圖
    plt.figure(2)
    sns.distplot(df[col], kde=True, fit=st.norm)

    df[col]=(df[col] - np.min(log_train_n))/(np.max(log_train_n)-np.min(log_train_n))  #訓(xùn)練集minmax笋鄙,再一起log师枣,再作圖
    plt.figure(3)
    sns.distplot(df[col], kde=True, fit=st.norm)
    
    #return df[col]  ???

【高勢(shì)集特征model,也就是類別中取值個(gè)數(shù)非常多的萧落, 一般可以使用聚類的方式践美,然后獨(dú)熱】

from scipy.cluster.hierarchy import linkage, dendrogram
#from sklearn.cluster import AgglomerativeClustering
from sklearn.cluster import KMeans

ac = KMeans(n_clusters=3)
ac.fit(model_price_data)
model_fea = ac.predict(model_price_data)
plt.scatter(model_price_data[:,0], model_price_data[:,1], c=model_fea)
cat_data_hot['model_fea'] = model_fea
cat_data_hot = pd.get_dummies(cat_data_hot, columns=['model_fea'])
#但是發(fā)現(xiàn)KMeans聚類不好,可以嘗試層次聚類試試找岖,并且這個(gè)聚類數(shù)量啥的應(yīng)該也會(huì)有影響拨脉,
#這里只是提供一個(gè)思路,我覺(jué)得這個(gè)特征做的并不是太好宣增,還需改進(jìn)玫膀。

【降低內(nèi)存代碼:通過(guò)精度轉(zhuǎn)化降低內(nèi)存損耗】reduce_mem_usage 函數(shù)通過(guò)調(diào)整數(shù)據(jù)類型,幫助我們減少數(shù)據(jù)在內(nèi)存中占用的空間

def reduce_mem_usage(df):
    """ iterate through all the columns of a dataframe and modify the data type
        to reduce memory usage.        
    """
    start_mem = df.memory_usage().sum() 
    print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))
    
    for col in df.columns:
        col_type = df[col].dtype
        
        if col_type != object:
            c_min = df[col].min()
            c_max = df[col].max()
            if str(col_type)[:3] == 'int':
                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
                    df[col] = df[col].astype(np.int8)
                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
                    df[col] = df[col].astype(np.int16)
                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
                    df[col] = df[col].astype(np.int32)
                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
                    df[col] = df[col].astype(np.int64)  
            else:
                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
                    df[col] = df[col].astype(np.float16)
                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
                    df[col] = df[col].astype(np.float32)
                else:
                    df[col] = df[col].astype(np.float64)
        else:
            df[col] = df[col].astype('category')

    end_mem = df.memory_usage().sum() 
    print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))
    print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))
    return df

【調(diào)用方法】
sample_feature2 = reduce_mem_usage(pd.read_csv('D:/data_for_lr.csv'))

【多個(gè)子圖的作圖plt.subplot(1,3,1):原始VS刪除VS截?cái)唷?/p>

import seaborn as sns
import scipy.stats as st

print('It is clear to see the price shows a typical exponential distribution')

plt.figure(figsize=(15,5))
plt.subplot(1,3,1)
sns.distplot(train_y,fit=st.norm)
plt.subplot(1,3,2)
sns.distplot(train_y[train_y<train_y.quantile(0.9)],fit=st.norm)  ##此處相當(dāng)于刪除爹脾,而非截?cái)?
a= train_y.copy()
a[a>train_y.quantile(0.9)] = train_y.quantile(0.9)
plt.subplot(1,3,3)
sns.distplot(a,fit=st.norm)  ##此處相當(dāng)于截?cái)?

【五折交叉驗(yàn)證(五折交叉驗(yàn)證得出驗(yàn)證集)帖旨;函數(shù)的裝飾器;標(biāo)簽的log處理與未處理】
簡(jiǎn)單建模(線性回歸灵妨;刪測(cè)試集解阅,不分驗(yàn)證集) & 五折交叉驗(yàn)證(分驗(yàn)證集) & 模擬真實(shí)業(yè)務(wù)情況(結(jié)合時(shí)間序列,更好滴分驗(yàn)證集)泌霍; 繪制學(xué)習(xí)率曲線與驗(yàn)證曲線

#五折交叉驗(yàn)證(五折交叉驗(yàn)證得出驗(yàn)證集)【20200501】

from sklearn.model_selection import cross_val_score
from sklearn.metrics import mean_absolute_error,make_scorer

#函數(shù)的裝飾器
def log_transfer(func):
    def wrapper(y,yhat):
        result = func(np.log(y),np.nan_to_num(np.log(yhat)))
        return result
    return wrapper

model_cvs = LinearRegression(normalize = True)
scores = cross_val_score(model_cvs,X=train_X, y=train_y, verbose=0, cv = 5,
                         scoring=make_scorer(log_transfer(mean_absolute_error)))

print('AVG:', np.mean(scores))
scores

#使用線性回歸模型货抄,對(duì)未處理標(biāo)簽的特征數(shù)據(jù)進(jìn)行五折交叉驗(yàn)證(Error 1.36)

#五折交叉驗(yàn)證【20200501】
model_cvs2 = LinearRegression(normalize = True)
scores = cross_val_score(model_cvs2, X=train_X, y=train_y_ln, verbose=1, cv = 5, 
                         scoring=make_scorer(mean_absolute_error))
#use `make_scorer` to convert a metric to a scorer.
print('AVG:', np.mean(scores))
scores

#使用線性回歸模型,對(duì)處理過(guò)標(biāo)簽的特征數(shù)據(jù)進(jìn)行五折交叉驗(yàn)證(Error 0.19)

【繪制學(xué)習(xí)率曲線與驗(yàn)證曲線】learning_curve返回了3個(gè)數(shù):train_sizes, train_scores, test_scores = learning_curve朱转?蟹地??

from sklearn.model_selection import learning_curve,validation_curve

def plot_learning_curve(estimator, title, X, y, ylim=None, 
                        cv=None,n_jobs=1, train_size=np.linspace(.1, 1.0, 5 )): 
    plt.figure()
    plt.title(title)
    if ylim is not None:
        plt.ylim(*ylim)
    plt.xlabel('Training example')
    plt.ylabel('score')
    
    train_sizes, train_scores, test_scores = learning_curve(
        estimator, X, y, cv=cv, 
        n_jobs=n_jobs, train_sizes=train_size, scoring = make_scorer(mean_absolute_error))  
    train_scores_mean = np.mean(train_scores, axis=1)  
    train_scores_std = np.std(train_scores, axis=1)  
    test_scores_mean = np.mean(test_scores, axis=1)  
    test_scores_std = np.std(test_scores, axis=1)  
    
    plt.grid()#區(qū)域  ##網(wǎng)格線
    plt.fill_between(train_sizes, train_scores_mean - train_scores_std,  
                     train_scores_mean + train_scores_std, alpha=0.1,  
                     color="r")  
    plt.fill_between(train_sizes, test_scores_mean - test_scores_std,  
                     test_scores_mean + test_scores_std, alpha=0.1,  
                     color="g")  
    plt.plot(train_sizes, train_scores_mean, 'o-', color='r',  
             label="Training score")  
    plt.plot(train_sizes, test_scores_mean,'o-',color="g",  
             label="Cross-validation score")  
    plt.legend(loc="best")  
    return plt

調(diào)用
plot_learning_curve(LinearRegression(), 'Liner_model', train_X[:1000], 
                    train_y_ln[:1000], ylim=(0.0, 0.9), cv=5, n_jobs=1)  

【貪心調(diào)參】
GridSearchCV網(wǎng)格搜索【同時(shí)滿足三種功能:fit藤为、score和交叉驗(yàn)證】:同時(shí)搜索多個(gè)參數(shù)怪与,本質(zhì)是枚舉。GS.best_params_最佳參數(shù)取值組合和GS.best_score_模型評(píng)判標(biāo)準(zhǔn)

best_obj = dict()
for obj in objective:
    model = LGBMRegressor(objective=obj)
    score = np.mean(cross_val_score(model, X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error)))
    best_obj[obj] = score
    
best_leaves = dict()
for leaves in num_leaves:
    model = LGBMRegressor(objective=min(best_obj.items(), key=lambda x:x[1])[0], num_leaves=leaves)
    score = np.mean(cross_val_score(model, X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error)))
    best_leaves[leaves] = score
    
best_depth = dict()
for depth in max_depth:
    model = LGBMRegressor(objective=min(best_obj.items(), key=lambda x:x[1])[0],
                          num_leaves=min(best_leaves.items(), key=lambda x:x[1])[0],
                          max_depth=depth)
    score = np.mean(cross_val_score(model, X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error)))
    best_depth[depth] = score

【作圖】
sns.lineplot(x=['0_initial','1_turning_obj','2_turning_leaves','3_turning_depth'], y=[0.143 ,min(best_obj.values()), min(best_leaves.values()), min(best_depth.values())])

【貝葉斯調(diào)參】from bayes_opt import BayesianOptimization

bayes_opt流程

  • 定義優(yōu)化函數(shù)
  • 定義優(yōu)化參數(shù)
  • 開(kāi)始優(yōu)化
  • 顯示結(jié)果

【特征的分布怎么判斷不一樣】卡方檢驗(yàn)缅疟?分别?遍愿;特征的分布圖像和sns的kde擬合圖畫(huà)在一起來(lái)對(duì)比?耘斩?

Windows下沼填,pip安裝時(shí)ReadTimeoutError解決辦法
延長(zhǎng)等待時(shí)間完美解決問(wèn)題——
windows下在cmd中括授,linux在終端下輸入如下命令:pip --default-timeout=100 install -U pip

np.set_printoptions(suppress = True) ##浮點(diǎn)數(shù)轉(zhuǎn)化后的顯示方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市刽脖,隨后出現(xiàn)的幾起案子羞海,更是在濱河造成了極大的恐慌曲管,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件院水,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡檬某,警方通過(guò)查閱死者的電腦和手機(jī)撬腾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)恢恼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人场斑,你說(shuō)我怎么就攤上這事漓踢÷┮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵青责,是天一觀的道長(zhǎng)挺据。 經(jīng)常有香客問(wèn)我,道長(zhǎng)脖隶,這世上最難降的妖魔是什么扁耐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮浩村,結(jié)果婚禮上做葵,老公的妹妹穿的比我還像新娘。我一直安慰自己心墅,他們只是感情好酿矢,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著怎燥,像睡著了一般瘫筐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铐姚,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天策肝,我揣著相機(jī)與錄音,去河邊找鬼隐绵。 笑死之众,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的依许。 我是一名探鬼主播棺禾,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼峭跳!你這毒婦竟也來(lái)了膘婶?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛀醉,失蹤者是張志新(化名)和其女友劉穎悬襟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拯刁,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脊岳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垛玻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逸绎。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖夭谤,靈堂內(nèi)的尸體忽然破棺而出棺牧,到底是詐尸還是另有隱情,我是刑警寧澤朗儒,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布颊乘,位于F島的核電站,受9級(jí)特大地震影響醉锄,放射性物質(zhì)發(fā)生泄漏乏悄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一恳不、第九天 我趴在偏房一處隱蔽的房頂上張望檩小。 院中可真熱鬧,春花似錦烟勋、人聲如沸筐付。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)较解。三九已至,卻和暖如春印衔,著一層夾襖步出監(jiān)牢的瞬間姥敛,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工忿偷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留臊泌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓渠概,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親贮喧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子猪狈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容