原始資料說明
winequality-white.csv如下,具11個特徵(features)及品質。目標是使用Tensorflow 2.0及其內建的Keras來生成Deep Learning模型。Deep Learning 簡介:機器學習Machine Learning vs 深度學習
根據François Chollet(Keras作者)在他的著作Deep Learning with python中說述,深度學習算是機器學習的一種。差異在於(下圖),機器學習(有時候)需要人工自行降維、Features選擇,而後才進行模型訓練;深度學習最主要的差別,是利用多層(Layer)由各種演算法建立類神經網路來處理問題,最主要的原理是利用梯度下降法(Gradient descent),設法找到最低的Loss( = predicted value - actual value,大概意思。損失函數亦很多種選擇)。深度學習有非常多的架構,大概都是基於這樣的概念上發展的,譬如在層與層之間加入一些演算法進行降維(CNN)、亦或產生具有"記憶性"的層(RNN),依據不同的問題及需求,可以選擇不同的深度學習架構。在影像、語音辨識中,大多資料都是超高維度加上巨量資料,即常聽見的「張量」(tensor),在處理上及適用於Deep Learning。不同於機器學習,深度學習可以產生數量龐大、可以溝通的點(Dense units)與層(Layer),對於複雜問題的處理具有更大的優勢,且支持GPU的平行運算,可以大幅節省硬體運算時間。
Source: Deep Learning Spreads |
使用Keras快速搭建深度學習模型
Keras太猛了!以TensorFlow作為運算基礎,Keras僅需要短短及行程式碼就可以搭建出一個模型,以下是本篇的範例中擷取的,實際上僅用了5行程式碼就搭建出模型。
最主要的就是model.add(keras.layers.Dense(16, activation = 'relu', input_shape=(11,)))。我們建立第一層網路,具有16個units,使用激勵函數ReLu來進行本層的運算,而輸入的features共有11個。依此類推,第二層有32個units,第三層有16個。而最後一層(輸出層),因為本篇是迴歸問題,所以僅需要一個unit。如果是二元分類問題,就是兩個units,若是有10個不同分類,當然就是10個units。
model.compile()中我們必須要設置優化器(Optimizers)、損失函數(Loss)、Metrics(不會翻。比較用,訓練中不會被採用) 。簡言之就是模型在訓練中我們要使用的優化方式、參數,及我們要觀測及比較的損失函數。因為本篇是迴歸問題,所以我觀察MSE的變化,尋找最低值;至於優化器,因為我是看Tensorflow官網的教學,教學中提到Adam這個優化器幾乎可以適用所有基本的問題,所以我直接採用之,並設定Learning rate=.001(也是學別人的)。
資料預處理
有了Keras,搭建模型變得非常簡單,對我而言資料預處理的部份才是最困難的。還好本篇所用的資料相對簡單,我僅將所有features轉換成Z分數,避免scale的差距造成誤差及權重的問題。
處理完會發現所有的features都變成了相同scale(下圖)。
開始訓練
使用model.fit(),設定每批次要都入模型中計算的樣本數(batch_size=32),迭代100次(epochs=100)。其他參數可參考
模型成效初探
畫圖看成效。看來epochs設15大概就夠了,且似乎沒有出現overfitting的問題。
%matplotlib inline是ipython及jupyter notebook內的魔法函數,可以省下每次作圖都還要多打一行plt.show()的功夫。
預測未知樣本
使用model.evaluate(),帶入測試用的未知樣本,結果不太好。我試了幾次MSE大約都介於0.47~0.51之間,誤差其實算蠻大的。這也告訴我們,沒有所謂一通百通的架構或模型,想得到更好的結果,看來還有很長的一段路要走。
後記
個人覺得本篇的資料,用機器學習(如CART,隨機森林,MARS...等Regressors)足以。之前使用機器學習的結果也都像本篇,不盡理想。本篇僅是快速搭建簡易的模型,之後會繼續在這個基礎上作更多的延伸學習,希望MSE可以降到.4甚至.35以下。
註:我隱隱覺得,或許quality的分級根本是人為主觀而定的,所以訓練結果總是差...(?)
沒有留言:
張貼留言