機(jī)器學(xué)習(xí)實(shí)戰(zhàn)--住房月租金預(yù)測(cè)(2)

前文回顧:機(jī)器學(xué)習(xí)實(shí)戰(zhàn)--住房月租金預(yù)測(cè)(1)咳蔚,今天繼續(xù)分享這次比賽的收獲端三。本文會(huì)講解對(duì)特征工程的處理耕挨。話不多說(shuō)细卧,我們開(kāi)始吧!

特征工程

image

“數(shù)據(jù)決定了機(jī)器學(xué)習(xí)的上限筒占,而算法只是盡可能逼近這個(gè)上限”贪庙,這里的數(shù)據(jù)指的就是經(jīng)過(guò)特征工程得到的數(shù)據(jù)。特征工程指的是把原始數(shù)據(jù)轉(zhuǎn)變?yōu)槟P偷挠?xùn)練數(shù)據(jù)的過(guò)程翰苫,它的目的就是獲取更好的訓(xùn)練數(shù)據(jù)特征止邮,使得機(jī)器學(xué)習(xí)模型逼近這個(gè)上限。特征工程能使得模型的性能得到提升奏窑,有時(shí)甚至在簡(jiǎn)單的模型上也能取得不錯(cuò)的效果导披。特征工程在機(jī)器學(xué)習(xí)中占有非常重要的作用,上面的思維導(dǎo)圖包含了針對(duì)特征工程處理的所有方法埃唯。

缺失值處理

1print(all_data.isnull().sum())

使用上面的語(yǔ)句可以查看數(shù)據(jù)集中的缺失值

image

從上面的圖中可以清楚的看到各數(shù)據(jù)的缺失值撩匕。

對(duì)于缺失值是任何一個(gè)數(shù)據(jù)集都不可避免的,在數(shù)據(jù)統(tǒng)計(jì)過(guò)程中可能是無(wú)意的信息被遺漏墨叛,比如由于工作人員的疏忽滑沧,忘記而缺失;或者由于數(shù)據(jù)采集器等故障等原因造成的缺失巍实,或者是有意的有些數(shù)據(jù)集在特征描述中會(huì)規(guī)定將缺失值也作為一種特征值,再或者是不存在的哩牍,有些特征屬性根本就是不存在的棚潦。

缺失值的處理,我們常用的方法有:刪除記錄:對(duì)于樣本數(shù)據(jù)量較大且缺失值不多同時(shí)正相關(guān)性不大的情況下是有效膝昆。可以使用 pandas 的 dropna 來(lái)直接刪除有缺失值的特征丸边。數(shù)據(jù)填充:數(shù)據(jù)填充一般采用均值叠必,中位數(shù)和中數(shù),當(dāng)然還有其他的方法比如熱卡填補(bǔ)(Hot deck imputation)妹窖,K最近距離鄰法(K-means clustering)等纬朝。不作處理:因?yàn)橐恍┠P捅旧砭涂梢詰?yīng)對(duì)具有缺失值的數(shù)據(jù),此時(shí)無(wú)需對(duì)數(shù)據(jù)進(jìn)行處理骄呼,比如Xgboost共苛,rfr等高級(jí)模型,所以我們可以暫時(shí)不作處理蜓萄。

對(duì)于這次比賽缺失值的處理主要是數(shù)據(jù)的填充 隅茎。

1cols=["renovated", "living_status","subway_distance" , "subway_station", "subway_line"]
2for col in cols:
3    kc_train[col].fillna(0, inplace=True) 4    kc_test[col].fillna(0, inplace=True) 
5 
6kc_train["way_rent"].fillna(2, inplace=True) 
7kc_test["way_rent"].fillna(2, inplace=True) 
8kc_train["area"].fillna(8, inplace=True) 
9kc_train = kc_train.fillna(kc_train.mean())10kc_test["area"].fillna(8, inplace=True)11kc_test = kc_test.fillna(kc_test.mean())

對(duì)于裝修狀態(tài),居住狀態(tài)嫉沽,距離辟犀,地鐵站點(diǎn)和線路均用0填充,區(qū)均用中位數(shù)8來(lái)填充绸硕,出租方式用2填充堂竟,同時(shí)做了一個(gè)判斷

1kc_train['is_living_status'] = kc_train['living_status'].apply(lambda x: 1 if x > 0 else 0)
2kc_train['is_subway'] = kc_train['subway_distance'].apply(lambda x: 1 if x > 0 else 0)
3kc_train['is_renovated'] = kc_train['renovated'].apply(lambda x: 1 if x > 0 else 0)
4kc_train['is_rent'] = kc_train['way_rent'].apply(lambda x: 1 if x < 2 else 0)
5
6kc_test['is_living_status'] = kc_test['living_status'].apply(lambda x: 1 if x > 0 else 0)
7kc_test['is_subway'] = kc_test['subway_distance'].apply(lambda x: 1 if x > 0 else 0)
8kc_test['is_renovated'] = kc_test['renovated'].apply(lambda x: 1 if x > 0 else 0)
9kc_test['is_rent'] = kc_test['way_rent'].apply(lambda x: 1 if x < 2 else 0)

異常值處理

異常值是分析師和數(shù)據(jù)科學(xué)家常用的術(shù)語(yǔ),因?yàn)樗枰芮凶⒁獠E澹駝t可能導(dǎo)致錯(cuò)誤的估計(jì)出嘹。 簡(jiǎn)單來(lái)說(shuō),異常值是一個(gè)觀察值夺蛇,遠(yuǎn)遠(yuǎn)超出了樣本中的整體模式疚漆。

什么會(huì)引起異常值呢?

主要有兩個(gè)原因:人為錯(cuò)誤和自然錯(cuò)誤

如何判別異常值刁赦?

正態(tài)分布圖娶聘,箱裝圖或者離散圖以正態(tài)分布圖為例:符合正態(tài)分布時(shí)甚脉,根據(jù)正態(tài)分布的定義可知丸升,距離平均值3δ之外的概率為 P(|x-μ|>3δ) <= 0.003 ,這屬于極小概率事件牺氨,在默認(rèn)情況下我們可以認(rèn)定狡耻,距離超過(guò)平均值3δ的樣本是不存在的。 因此猴凹,當(dāng)樣本距離平均值大于3δ夷狰,則認(rèn)定該樣本為異常值。當(dāng)數(shù)據(jù)不服從正態(tài)分布:當(dāng)數(shù)據(jù)不服從正態(tài)分布郊霎,可以通過(guò)遠(yuǎn)離平均距離多少倍的標(biāo)準(zhǔn)差來(lái)判定沼头,多少倍的取值需要根據(jù)經(jīng)驗(yàn)和實(shí)際情況來(lái)決定。

異常值的處理方法常用有四種:
1.刪除含有異常值的記錄
2.將異常值視為缺失值,交給缺失值處理方法來(lái)處理
3.用平均值來(lái)修正
4.不處理

 1all_data = pd.concat([train, test], axis = 0, ignore_index= True) 
2all_data.drop(labels = ["price"],axis = 1, inplace = True) 
3fig = plt.figure(figsize=(12,5)) 
4ax1 = fig.add_subplot(121) 
5ax2 = fig.add_subplot(122) 
6g1 = sns.distplot(train['price'],hist = True,label='skewness:{:.2f}'.format(train['price'].skew()),ax = ax1)
7g1.legend() 
8g1.set(xlabel = 'Price') 9g2 = sns.distplot(np.log1p(train['price']),hist = True,label='skewness:{:.2f}'.format(np.log1p(train['price']).skew()),ax=ax2)
10g2.legend()
11g2.set(xlabel = 'log(Price+1)')
12plt.show()

查看訓(xùn)練集的房?jī)r(jià)分布进倍,左圖是原始房?jī)r(jià)分布土至,右圖是將房?jī)r(jià)對(duì)數(shù)化之后的。

image

由于房?jī)r(jià)是有偏度的,將房?jī)r(jià)對(duì)數(shù)化并且將有偏的數(shù)值特征對(duì)數(shù)化

1train['price'] = np.log1p(train['price'])
2
3# 將有偏的數(shù)值特征對(duì)數(shù)化4num_features_list = list(all_data.dtypes[all_data.dtypes != "object"].index)
5
6for i in num_features_list:
7    if all_data[i].dropna().skew() > 0.75:
8        all_data[i] = np.log1p(all_data[i])

根據(jù)上一篇我們篩選出的十個(gè)最相關(guān)的特征值猾昆,畫出離散圖陶因,并且對(duì)離散點(diǎn)做處理,這里只取房屋面積舉個(gè)栗子垂蜗。

1var = 'sqft_living'
2data = pd.concat([train['price'], train[var]], axis=1)
3data.plot.scatter(x=var, y='price', ylim=(0,150));
image
1train.drop(train[(train["sqft_living"]>0.125)&(train["price"]<20)].index,inplace=True)

這里將面積大于0.125且價(jià)格小于20的點(diǎn)全部刪除楷扬。

對(duì)于特征工程的處理這是在自己代碼中最重要的兩步--缺失值和異常值的處理,將類別數(shù)值轉(zhuǎn)化為虛擬變量和歸一化的處理效果不是特別好所以沒(méi)有貼上么抗,數(shù)據(jù)集中的房屋朝向可以采用獨(dú)熱編碼毅否,感興趣的可以試一下,我一直沒(méi)搞懂看了同學(xué)的處理他的代碼量太大蝇刀,效果也不是特別明顯螟加,自己索性沒(méi)去研究。下一次更新將針對(duì)這個(gè)問(wèn)題進(jìn)行模型選擇吞琐。
【推薦閱讀】

【Python爬蟲】初識(shí)爬蟲(1)

【LeetCode】貪心算法--買賣股票的最佳時(shí)機(jī) II(122)

一道課后練習(xí)題背后的知識(shí)點(diǎn)

Python人工造雪2.0(動(dòng)態(tài)版)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捆探,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子站粟,更是在濱河造成了極大的恐慌黍图,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奴烙,死亡現(xiàn)場(chǎng)離奇詭異助被,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)切诀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門揩环,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人幅虑,你說(shuō)我怎么就攤上這事丰滑。” “怎么了倒庵?”我有些...
    開(kāi)封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵褒墨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我擎宝,道長(zhǎng)郁妈,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任绍申,我火速辦了婚禮圃庭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己剧腻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布涂屁。 她就那樣靜靜地躺著书在,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拆又。 梳的紋絲不亂的頭發(fā)上儒旬,一...
    開(kāi)封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音帖族,去河邊找鬼栈源。 笑死,一個(gè)胖子當(dāng)著我的面吹牛竖般,可吹牛的內(nèi)容都是我干的甚垦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼涣雕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼艰亮!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起挣郭,我...
    開(kāi)封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤迄埃,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后兑障,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體侄非,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年流译,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逞怨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡先蒋,死狀恐怖骇钦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情竞漾,我是刑警寧澤眯搭,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站业岁,受9級(jí)特大地震影響鳞仙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笔时,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一棍好、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦借笙、人聲如沸扒怖。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盗痒。三九已至,卻和暖如春低散,著一層夾襖步出監(jiān)牢的瞬間俯邓,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工熔号, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稽鞭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓引镊,卻偏偏與公主長(zhǎng)得像朦蕴,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祠乃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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