Kaggle 比賽 學習 作業 (二)
Emmm...很尷尬,拖了這麼多天才來補Kaggle房價預測,主要中途好朋友結婚,回去參加了一趟婚禮,加上以前的老闆Mr.Simon回國想見我一面,又去了趟青島,中間一頓折騰,在火車上和閒暇時間到處找KFC斷斷續續的寫,最後在旅途中完成了,回來又趕上交各種期末大作業,這才耽擱了,下面直接附上我的word(圖片都不見了是什麼鬼???)
然後繼續幹活完成老師的任務。
Exploratory Data Analysis and Predictions
of House Price
作業完成工具與環境:win10+anaconda3+pycharm2018+jupyter notebook(Python3)
前言:
剛接觸python不久,之前在國科大接觸過模式識別,對一些機器學習知識有一個概念,現在回所後在做基於相關濾波的傳統方法的目標跟蹤,其中判別式的一個演算法,也是我現在剛剛完成改進的一個演算法,對於資料特徵的處理中使用到了嶺迴歸,PCA特徵降維+QR分解,隨機森林等知識,碰巧老師的作業與這些都有關係,相當於老師給我們提供了新的鍛鍊機會,看了Pedro Marcelino大神的思路與評論的交流,趕緊註冊Kaggle下載了訓練與驗證資料,開始體驗機器學習方法在房價預測中的使用,同時也是站在巨人的肩膀上一邊學習一邊思考這些資料處理篩選與模型建立訓練過程中,機器學習方法的使用與融合處理,以及效果的提升。
雖然沒有做過之類的練習,但是通過老師給的例程也大概瞭解到,機器學習的任務從開始到建模的一般流程是:獲取資料 -> 資料預處理 -> 訓練建模 -> 模型評估 -> 預測,分類。我也是依據傳統機器學習的流程,看看在每一步流程中都有哪些常用的函式以及它們的用法是怎麼樣的,通過顯示的圖片效果,演算法處理,Cross Validation等思想,來體會學習如何得到想要的結果。
下圖簡述一下本作業主要的思路:
程式碼+分析
1、資料理解與概覽(視覺化):
首先匯入需要的模組與讀路徑找到需要的資料(訓練集與測試集)
程式碼中顯示一下前五個資料,大致瀏覽瞭解一下具體影響房價的因素,(可以看到有多少個因素影響房價,ID+Price is included,實際上79個),然後在操作前瞭解一下資料的size,
瞭解資料型別:(可以看到有object,float64,int64等型別)
瞭解資料的分佈情況:
描述性資料總結直方圖:
之前程式碼沒有加,但是資料視覺化比較有啟發性,現在根據資料型別加個指令觀察一下資料與sale price的關係:
上圖是CentraAir,應該是中央空調的意思,看起來有無中央空調還是影響房價的;
上圖是OverallQual,我感覺應該是整體Quality?,那麼顯然是與房價正相關的;
上圖YearBuilt,顯然修建時間也與房價有很大的關係;
把箱形圖換成散點圖觀察一下:
資料觀察起來就是這個樣子,不贅述了。
2、資料清洗:
移除Id列以便於處理資料:
下面處理重要的資料特徵,這裡統計一下null資料的Frequency:
接下來整合資料以便下一步計算,把sale price拿出來,可以看到剩下的79個影響房價的因素,顯示一部分觀察一下:
接下來清洗掉缺失資料了,因為有的特徵因素(PoolQC, Alley, MiscFeature, Fence)缺失的資料很多,對房價預測沒有幫助也沒有參考意義,還有一些離群點或者噪點,剩下的就是有缺失但是有參考意義的因素,不能簡單刪除,不然最後做出的這個房價預測模型泛化效能肯定受影響很大,一些情況單獨定義或者作處理,如下:
3、特徵工程
相關性分析:
以上處理完資料,我們要看一下很重要的資料相關性了,這個之前用PCA給圖片多通道特徵降維的時候用到過,就像周老師第9節課上講的,我們可以用協方差矩陣觀察資料的相關性,其間要對資料進行歸一化均值處理,現在都比較方便了,Python可以一步到位:
嘗試不同的顏色"Spectral":
下面是訓練資料的相關度,顏色還是用"jet"更形象,畢竟紅色hot表示相關度高,藍色cold表示相關度低:(協方差矩陣熱度圖真是太形象了!amazing!)
下面是測試集的,換個顏色觀察一下:
協方差矩陣必然是對稱的,我們找上三角部分,其中相關度大於0.75的找出來:
由上圖以及找出的資料思考分析,GarageYrBlt與Years Blt有較高的相關性是合理的。因為車庫大多是在建房子的時候建的。GarageArea和GarageCars具有很高的相關性,因為如果能停更多的車,那麼就會有更多的車庫空間,反之亦然。 '1stFlrSF', 'TotalBsmtSF' 是相關的,這也是有意義的,因為通常地下室通常就在一樓的下面,而且大部分的面積都是相似的。TotRmsAbvGrd與GrlivArea相關。這也是有意義的,因為在這兩列中,地下室是不被考慮的。所以使用資料預測時,for計算的需要,這些資料要被drop掉。
異常值處理:
當然資料中也有前面提到的離群點,特別是GrLivArea,這裡需要觀察找出並移除:
在上面的圖中,右下角有很明顯的兩個點,面積在4000平方英尺以上,但銷量卻很低,與其他點趨勢普遍性不符,這兩個就是典型的離群點了,會在訓練中影響模型,在模型匹配時會引起較大的誤差,所以應該刪去,其他的雖有偏差但是還是有參考意義的,所以先保留著。
刪除離群點後,更新訓練資料的indexes:
特徵轉換:
接著將類別資料做一下處理,進行轉換,也就是正確化變數屬性(MSSubClass 的值其實應該是一個Category,但是Pandas是不會懂這些事兒的。使用df的時候,這類數字符號會被預設記成數字。這種東西很有誤導性,需要把它變回成string,這裡使用了LabelEncoder可以簡單地將 categorical labels 轉換為不同的數字):
以上資料中存在一些偏差離群資料,一般的經驗法則,絕對偏態值 >thresh 被認為是傾斜嚴重,為了減少傾斜異常值的影響,更好的處理它們,對它們作log處理,程式碼就是apply(ny.log1p)也就是作log(1+x)處理,可以讓data平滑化:
再次贅述一下,把Category的變數轉變成numerical表達形式:當用numerical來表達categorical的時候,因為數字本身有大小的含義,所以亂用數字會給後面的模型學習帶來麻煩。可以用One-Hot的方法來表達Category,與剛剛使用的LabelEncoder不同,這裡使用pandas自帶的get_dummies方法,一鍵One-Hot。
接著進行資料標準化,繼續使用log變換處理後的資料,把源資料給放在一個標準分佈內,不讓資料間的差距太大,不然會嚴重影響regression的效能:
以上處理後的資料做成訓練集和測試集:
4、演算法模型選擇與評估:
最後就是使用迴歸演算法了,這裡呼叫強大的sklearn機器學習庫,選擇不同的方法加上Cross Validation驗證演算法效果,來使泛化效能更好:
最上面兩行程式碼,先是將係數向量的L2範數新增到了損失函式,然後就是平方誤差項。引入L2範數係數向量正則項,就是課上老師講的,正則項也就是規則項、約束項,對優化的係數w加上constraint,同樣是防止過擬合併提高泛化能力,我的理解是把MSE加上S.t.項寫成拉格朗日形式就是常見的迴歸模型了,又因為範數的不同有一些有了不同的名字。比如正則項採用1範數,也就是所謂的Lasso Regression,傾向於完全消除不重要的權重,但是丟失的資訊也更多,得到的結果更稀疏,但是一定程度上有利於處理速度,感覺就是缺點與優點都很明顯;決策樹我的理解就是設定不同的樹的數目與深度,在節點處作判斷,最後依據概率模型做迴歸分析。
上面的是分別使用ElasticNet、嶺迴歸和隨機森林的方法,加上交叉驗證之後的結果,很明顯ElasticNet的綜合效果最佳,我的理解是ElasticNet演算法就是最簡單的樸素線性迴歸MSE加上正則項組成代價函式,只不過代價函式是一個combination of Lasso迴歸和嶺迴歸,也就是同時利用兩者的優點吧:(因為影響房價的因素有79個,但真正有較大影響的肯定沒有那麼多)
很明顯:r=0:ElasticNet變成嶺迴歸,r=1:ElasticNet就變成了Lasso迴歸。
5、生成結果,提交:
下面生成結果,準備submit my predictions:
檢視幾個預測的結果:
在Kaggle網站上提交測試
這個結果大概在Top18%左右,這裡使用的一些演算法,嶺迴歸雖然一定程度上可以擬合模型,但容易導致迴歸結果失真;Lasso迴歸雖然能刻畫模型代表的現實情況,但是模型過於簡單,不符合實際。彈性網迴歸(ElasticNet)結果表明,一方面達到了嶺迴歸對重要特徵選擇的目的,另一方面又像Lasso迴歸那樣,刪除了對因變數影響較小的特徵,所以取得了更好的效果。
我覺得使用更多的優化演算法,融合他們的特點,並進一步對缺失資料和資料篩選等做一些優化,還有更多的進步空間。
體會總結:
首先感覺Kaggle比賽是 Feature為主,引數調整和Ensemble為輔。當發現一個變數從直覺上來說對所要完成的目標有幫助,就可以將其作為 Feature,總之應該生成儘量多的 Feature,然後 Model 能夠挑出最有用的 Feature。Feature Engineering 能做到什麼程度,取決於對資料領域的瞭解程度,這一方面我倒基本是門外漢了,如何構造有用的 Feature,也是一個不斷學習和提高的過程。(哈哈做完作業有種要轉行的衝動……)
然後感覺Python用起來和其他語言有很多相似的地方,不過Python用起來真的是方便,各種完善的封裝好的包直接呼叫,尤其是Sklearn,真的很強大,呼叫簡單粗暴,包含了大部分的機器學習演算法。
作業對變數進行了哲(玄)學(學)分(調)析(參),不僅對 SalePrice 進行了單獨分析,還結合了相關程度最高的變數進行分析。先後處理了缺失資料和異常值,驗證了一些基礎統計假設,並且將類別變數轉換為虛擬變數,並對資料進行了歸一化等處理。
但是,模型提交後,還是有一些思考,因為學習的演算法有限,看了看很多大牛們的kernels和下面的comments,感覺房價預測模型肯定不能只是簡單的線性迴歸加正則化,而且雖然組合方法顯示了比較好的效能,但不一定組和方法就是最優的,希望以後接觸到更多的演算法與思想,有更多的思路來回味房價預測問題吧。
Acknowledgement:
Thanks for our teacher professor Chou ! In particular , we really appreciate that you provide us with a chance of sharing advanced machine learning knowledge in class ! We all like having you as our teacher , and you have our sincere respect and gratefulness !
References:
Xiaofeng Chou,Course of Machine Learning PPT;
---2thpart Liner Regression
---3thpart Decision Tree -- adaboosting -- Random Forest
---9thpart Dimensionality reduction technique
Data Description,Kaggle official data description;
( https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data )
Pedro Marcelino,Comprehensive data exploration with Python;
_____________________________________________分割線_________________________________________________
更新一下,老師成績給了很高的分,應該沒有比我高的,倉促下學習,得這個分已經很好了,希望以後學習了資料處理的知識,再繼續回來思考這個問題,很有意思。