1. 程式人生 > >資料探勘之售房資料分析1

資料探勘之售房資料分析1

最近再做一批關於售房的資料,感覺自己陷入一個死衚衕裡:

該批資料是儲存再postgresql裡面,是從某售房網站上爬下來的,以資料庫中的一列欄位作為儲存資料,該列欄位是以json的資料形式儲存的,這裡跟我打開了一個新大門,資料庫能儲存json資料格式的資料,而且postgresql還有一套專門的查詢語句詳情見:

這裡:

而對於機器學習而言:特徵是一列一列的,類似於資料庫的列欄位一樣:所以對於從某站上獲取的資料就必須進行分析,分解,衍生,提取等手段提取出一列一列的特徵,

這些就屬於資料分析方面的知識了,說到資料分析,不得不說資料探勘了;說到資料探勘就不得不提人工智慧,而資料探勘只是人工智慧的一個分支,人工智慧的應用方向有很多,資料探勘是一方面,還有就是NLP(也就是自然語言處理)還有語音識別,影象識別,機器人等應用方面,而我剛開始對資料探勘的理解說來慚愧,居然理解成了,爬蟲方面的知識,但是爬蟲只是資料探勘領域資料的獲取方式之一;

對於我這一批資料,我的任務是預測房屋的售賣天數,初始接觸的時候感覺十分的茫然,偶然間接觸了多元線性迴歸的概念,然後就用了線性迴歸模型做了一個,用的是tensorflow的框架,百度了好幾個總結了一下終於成功的運行了起來,但是途中遇到的問題真是很多,最主要的是用tensorflow自帶的方式讀取資料,還是一種比較low的方式做的,現在才知道他又一個data的api可以哼方便的使用;並且在少量資料讀取方面,pandas用於資料讀取是很方便的,最主要是pandas是將資料直接讀入記憶體,如果物理裝置有限,在工業生產上我估計這種方式用的很少,而且我那種方式還要再session會話中加入一個類似程序的東西才能讀進資料;

雖然學校學了矩陣運算的知識,但是沒有再實際中用到過,而對於線性迴歸模型而言:對於

:y = w1*x1 +w2*x2......這樣的模型,其實就是矩陣的運算,就是在用tensorflow的feedict的時候老是出現維度問題;其實就是y的輸入有問題,需要reshape一下,就這個簡單的問題困擾了我很久,直到我理解計算原理才知道自己的錯誤是多麼的愚蠢;

用這個模型預測的簡直不敢苟同,預測出來的值基本都是一樣的,而且用的都是數值特徵,都還不知道對分類資料的處理的方式,還有就是歸一化和標準化資料;

而且期間遇到一個nan的問題(預測出來的值都是nan);一個很奇怪的問題:當我用梯度下降作為優化函式的時候,就會出現這個問題;最後發現換了一個agrad優化函式之後就好了,這都不是我疑惑的,我疑惑地是當我用sklearn 的StandardScale 做標準化之後再用梯度下降演算法的時候就又好了,至今都未解決這個問題;可能是沒有理解原理的原因;但我猜測應該是資料方面的問題;也有可能是關於梯度下降演算法會出現的問題:梯度消失方面的問題;但是這是關於DNN模型時用sigmoid啟用函式才會出現的問題,這個可能就要排除了;

緊接著我又接觸了CNN模型,你可能會奇怪為什麼不是DNN模型,當時對深度學習,和機器學習的概念分不清;以為深度學習就是比機器學其牛逼,我就想哪個牛就用那個,恰巧看到了cnn的模型;說起簡單的cnn模型還是比較簡單的,分為卷積層,池化層,全連線層,可以多搞幾層,但是現在想起來還是比較搞笑的用DNN模型還是比較可行的但是用CNN模型明顯有一點不太好,我現在還是不知道幾個深度模型的區別DNN,CNN,RNN LSTM;反正能用的深度模型都用了,看別人的程式碼,依葫蘆畫瓢愣是讓程式碼執行起來了,還是可以達到預測效果的,但是解釋性極差;就拿CNN來說,我為了籌齊平方,我就只取了4個特診,RNN也是;心裡懷著深度學習高大上的感覺一路前進,搞定各種模型的使用方法;但是對於底層原理還是有很大的欠缺;

對於RNN(用LSTM)做的,我為了形成一個時序,就將2*2 分成兩個時序,2*1的;但是對於這樣的做法完全沒有任何的意義,

但是還是可以得出值;

對於LSTM的模型有很多種,按照輸入和輸出分為,一對一輸出,一對多,多對多,多對一等;但是對於LSTM單元,有三個門是輸入們,遺忘們,輸出門;

 

接下來就是DNN模型了,對於DNN模型,我用的還是tensorflow的框架,剛開始沒有接觸tensorflow的高階api的時候,我是自己構造的神經網路,說白了資料輸入,初始化w權重值,一般是zero初始化或者是高斯初始化;但是對於b偏置項則是one初始化,或者是zero初始化;

然後就是初始化x和y了;用tensorflwo裡面的placeholder,最後用feeddict進行資料餵養就行了,然後就是構造網路了,

最有就是訓練了;

最後又解除了tensorflow下的高階api,estimator;DNNRegeressor,還是就是LinearCombinedDNNRegressor這兩個可以做迴歸的模型;

說到這兩個模型,就要提到tensorflow的關於特徵工程的api,那就是feature_coloum了,就相當於原始資料與模型的輸入建立了橋樑的作用;

有很多種分桶,分類,等等,都是在我們平常使用的方式封裝起來的;

關於這兩個模型其實用法基本相似,但是在特徵的輸入方面,線性模型輸入的特徵無論稀疏,密集都可以,但是對於DNN模型則必須是密集的特徵了,這裡就要用到密集特徵和稀疏特徵的轉化了,有兩個,分別是indicate 和embedding;前者是針對不是太過於稀疏的特徵,後者是針對大量的稀疏特徵,如經過hash_bucket方式處理過的資料;

最後偶然間知道了一個kaggle的比賽,聽說裡面的人都很牛,分享了很多的kernel;而且有一個houses的kaggle專案跟我當前的專案有點類似,都是一個關於預測具體值的迴歸問題;

然後就看了一個kernel;裡面基本都是用的機器學習的方式做的,顯示LinearRegeressor,ridge,laosso,randomforrest,xgboost 這幾個都用過了,然後又接觸了另外一個框架叫keras,他內部好像集成了theano的tensorflow的東西,執行的時候會出現一個using tensorflow的東西;

 

在kaggle比賽中,xgboost的大殺器,說實話這個大殺器缺失有點牛,用其他模型表現確實都略微低於xgboost然後就是模型的stagging;

但是機器學習在資料方面實在是太過於繁瑣,特徵轉化;log變化;標準化,編碼;很繁瑣;

好了這就是我這個專案的大致經歷了,下一篇我將寫我處理資料的過程,以及特徵選擇,資料預處理方面的東西,

說實話,我感覺資料探勘方面基本都是在做資料方面的處理;模型我感覺影響不大,資料處理好了,誤差瞬降,沒處理好模型再高大上也沒啥用,還是要實用才好,

不得不提的是再機器學習方面,引數特別多,很多時候就是調參的工作,執行時間相對較短,用網格搜尋技術能很好的左到這一點,但是對於深度學習,由於執行時間過長,消耗時間多,用網格搜尋調參有點奢侈,而且還不一定準確,因為保不準執行的步驟越多,精度會越高