摘要:概述這是使用機(jī)器學(xué)習(xí)預(yù)測(cè)平均氣溫系列文章的最后一篇文章了,作為最后一篇文章,我將使用的開源機(jī)器學(xué)習(xí)框架來構(gòu)建一個(gè)神經(jīng)網(wǎng)絡(luò)回歸器。請(qǐng)注意,我把這個(gè)聲明推廣到整個(gè)機(jī)器學(xué)習(xí)的連續(xù)體,而不僅僅是神經(jīng)網(wǎng)絡(luò)。
概述
??這是使用機(jī)器學(xué)習(xí)預(yù)測(cè)平均氣溫系列文章的最后一篇文章了,作為最后一篇文章,我將使用google的開源機(jī)器學(xué)習(xí)框架tensorflow來構(gòu)建一個(gè)神經(jīng)網(wǎng)絡(luò)回歸器。關(guān)于tensorflow的介紹、安裝、入門,請(qǐng)自己google,這里就不做講述。
??這篇文章我主要講解一下幾點(diǎn):
了解人工神經(jīng)網(wǎng)絡(luò)理論
tensorflow高級(jí)API:Estimators
構(gòu)建DNN模型預(yù)測(cè)天氣
人工神經(jīng)網(wǎng)絡(luò)基礎(chǔ)理論??上一篇文章主要講解了如何構(gòu)建線性回歸模型(這是最基礎(chǔ)的機(jī)器學(xué)習(xí)算法)來預(yù)測(cè)內(nèi)布拉斯加州林肯市每天的平均氣溫。線性回歸模型非常有效,并且可以被用于數(shù)值化(比如分類)、預(yù)測(cè)(比如預(yù)測(cè)天氣)。線性回歸算法也比較與局限性,它要求數(shù)據(jù)之間具有線性關(guān)系。
??針對(duì)于非線性關(guān)系的場(chǎng)景,數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)有數(shù)不清的算法來處理。近些年最火的要數(shù)神經(jīng)網(wǎng)絡(luò)算法了,它可以處理機(jī)器學(xué)習(xí)領(lǐng)域的好多問題。神經(jīng)網(wǎng)絡(luò)算法具備線性和非線性學(xué)習(xí)算法的能力。
??神經(jīng)網(wǎng)絡(luò)受到大腦中的生物神經(jīng)元的啟發(fā),它們?cè)趶?fù)雜的交互網(wǎng)絡(luò)中工作,根據(jù)已經(jīng)收集的信息的歷史來傳輸,收集和學(xué)習(xí)信息。我們感興趣的計(jì)算神經(jīng)網(wǎng)絡(luò)類似于大腦的神經(jīng)元,因?yàn)樗鼈兪墙邮蛰斎胄盘?hào)(數(shù)字量)的神經(jīng)元(節(jié)點(diǎn))的集合,處理輸入并將處理后的信號(hào)發(fā)送給其他下游代理 網(wǎng)絡(luò)。 信號(hào)作為通過神經(jīng)網(wǎng)絡(luò)的數(shù)字量的處理是一個(gè)非常強(qiáng)大的特征,不限于線性關(guān)系。
??在這個(gè)系列中,我一直關(guān)注一種稱為監(jiān)督學(xué)習(xí)的特定類型的機(jī)器學(xué)習(xí),也就說說訓(xùn)練的數(shù)據(jù)結(jié)果是已知的,根據(jù)歷史已知的輸入和輸出,預(yù)測(cè)未來的輸入對(duì)應(yīng)的輸出。 此外,預(yù)測(cè)的類型是數(shù)值的真實(shí)值,這意味著我們使用的是回歸預(yù)測(cè)算法。
??從圖形上看,類似于本文中描述的神經(jīng)網(wǎng)絡(luò)如圖:
上面描述的神經(jīng)網(wǎng)絡(luò)在最左邊包含一個(gè)輸入層,即圖中的x1和x2,這兩個(gè)特征是神經(jīng)網(wǎng)絡(luò)輸入值。這兩個(gè)特征被輸入到神經(jīng)網(wǎng)絡(luò)中,通過被稱為隱藏層的兩層神經(jīng)元進(jìn)行處理和傳輸。這個(gè)描述顯示了兩個(gè)隱藏層,每層包含三個(gè)神經(jīng)元(節(jié)點(diǎn))。 該信號(hào)然后離開神經(jīng)網(wǎng)絡(luò),并作為單個(gè)數(shù)值預(yù)測(cè)值匯總在輸出層。
??讓我花一點(diǎn)時(shí)間來解釋箭頭背后的含義,箭頭表示數(shù)據(jù)在層間從一個(gè)節(jié)點(diǎn)到另一個(gè)節(jié)點(diǎn)的傳輸處理。 每個(gè)箭頭代表一個(gè)數(shù)值的數(shù)學(xué)變換,從箭頭的底部開始,然后乘以特定于該路徑特定的權(quán)重。 一個(gè)圖層中的每個(gè)節(jié)點(diǎn)將以這種方式得到一個(gè)值。 然后匯總所有在節(jié)點(diǎn)收斂的值。 這個(gè)就是我之前提到的神經(jīng)網(wǎng)絡(luò)的線性操作。
??在每個(gè)節(jié)點(diǎn)上進(jìn)行求和之后,將一個(gè)特殊的非線性函數(shù)應(yīng)用到總和上,這在上面的圖像中被描述為Fn(...)。 這種將非線性特征引入神經(jīng)網(wǎng)絡(luò)的特殊功能稱為激活功能。 激活函數(shù)所帶來的這種非線性特性賦予了多層神經(jīng)網(wǎng)絡(luò)以其功能。 如果不是將非線性加入到過程中,則所有層都將有效地代數(shù)地組合成一個(gè)常數(shù)運(yùn)算,其中包括將輸入乘以某個(gè)平坦系數(shù)值(即線性模型)。
好吧,這一切都很好,但是這怎么轉(zhuǎn)化為學(xué)習(xí)算法呢? 那么最直接的答案就是評(píng)估正在進(jìn)行的預(yù)測(cè),即模型“y”的輸出,到實(shí)際預(yù)期值(目標(biāo)),并對(duì)權(quán)重進(jìn)行一系列調(diào)整,以改善整體 預(yù)測(cè)準(zhǔn)確性。
??在回歸機(jī)器學(xué)習(xí)算法的世界中,通過使用成本(又名“損失”或“客觀”)函數(shù)(即平方誤差之和(SSE))評(píng)估準(zhǔn)確性。 請(qǐng)注意,我把這個(gè)聲明推廣到整個(gè)機(jī)器學(xué)習(xí)的連續(xù)體,而不僅僅是神經(jīng)網(wǎng)絡(luò)。 在前面的文章中,普通最小二乘算法完成了這一工作,它發(fā)現(xiàn)了使誤差平方和(即最小二乘)最小化的系數(shù)組合。
??我們的神經(jīng)網(wǎng)絡(luò)回歸器會(huì)做同樣的事情。 它將迭代訓(xùn)練數(shù)據(jù)提取特征值,計(jì)算成本函數(shù)(使用SSE),并以最小化成本函數(shù)的方式調(diào)整權(quán)重。 通過算法迭代推送特征的過程和評(píng)估如何根據(jù)成本函數(shù)來調(diào)整權(quán)重。
??模型優(yōu)化算法在構(gòu)建魯棒神經(jīng)網(wǎng)絡(luò)中非常重要。 例如通過網(wǎng)絡(luò)體系結(jié)構(gòu)(即寬度和深度)饋送,然后根據(jù)成本函數(shù)進(jìn)行評(píng)估,調(diào)整權(quán)重。 當(dāng)優(yōu)化器函數(shù)確定權(quán)重調(diào)整不會(huì)導(dǎo)致成本函數(shù)計(jì)算代價(jià)的變化,該模型被認(rèn)為是“學(xué)習(xí)”。
??tensorflow由好幾個(gè)部分組成,其中最常用的是Core API,它為用戶提供了一套低級(jí)別的API來定義和訓(xùn)練使用符號(hào)操作的任何機(jī)器學(xué)習(xí)算法。這也是TensorFlow的核心功能,雖然Core API能應(yīng)對(duì)大多數(shù)的應(yīng)用場(chǎng)景,但我更關(guān)注Estimator API。
??TensorFlow團(tuán)隊(duì)開發(fā)了Estimator API,使日常開發(fā)人員可以更方便地使用該庫。這個(gè)API提供了訓(xùn)練模型、評(píng)估模型、以及和Sci-Kit庫相似的對(duì)未知數(shù)據(jù)的預(yù)測(cè)接口,這是通過實(shí)現(xiàn)各種算法的通用接口來實(shí)現(xiàn)的。另外,構(gòu)建在高級(jí)API中的是機(jī)器學(xué)習(xí)最佳實(shí)踐,抽象和可伸縮性的負(fù)載。
??所有這些機(jī)器學(xué)習(xí)的優(yōu)點(diǎn)使得基礎(chǔ)Estimator類中實(shí)現(xiàn)的一套工具以及多個(gè)預(yù)先封裝的模型類型,降低了使用TensorFlow的入門門檻,因此可以應(yīng)用于日常問題。通過抽象出諸如編寫訓(xùn)練循環(huán)或處理會(huì)話之類的問題,開發(fā)人員能夠?qū)W⒂诟匾氖虑椋缈焖賴L試多個(gè)模型和模型架構(gòu),以找到最適合他們需要的模型。
??在這篇文章中,我將介紹如何使用非常強(qiáng)大的深度神經(jīng)網(wǎng)絡(luò)估計(jì)器之一DNN Regressor。
??我們先導(dǎo)入一些我們需要用到的庫。
import pandas as pd import numpy as np import tensorflow as tf from sklearn.metrics import explained_variance_score, mean_absolute_error, median_absolute_error from sklearn.model_selection import train_test_split
我們來處理一下數(shù)據(jù),所有的數(shù)據(jù)我都放在了Github上,大家可以去查閱clone。
# read in the csv data into a pandas data frame and set the date as the index df = pd.read_csv("end-part2_df.csv").set_index("date") # execute the describe() function and transpose the output so that it doesn"t overflow the width of the screen df.describe().T
# execute the info() function df.info()Index: 997 entries, 2015-01-04 to 2017-09-27 Data columns (total 39 columns): meantempm 997 non-null int64 maxtempm 997 non-null int64 mintempm 997 non-null int64 meantempm_1 997 non-null float64 meantempm_2 997 non-null float64 meantempm_3 997 non-null float64 meandewptm_1 997 non-null float64 meandewptm_2 997 non-null float64 meandewptm_3 997 non-null float64 meanpressurem_1 997 non-null float64 meanpressurem_2 997 non-null float64 meanpressurem_3 997 non-null float64 maxhumidity_1 997 non-null float64 maxhumidity_2 997 non-null float64 maxhumidity_3 997 non-null float64 minhumidity_1 997 non-null float64 minhumidity_2 997 non-null float64 minhumidity_3 997 non-null float64 maxtempm_1 997 non-null float64 maxtempm_2 997 non-null float64 maxtempm_3 997 non-null float64 mintempm_1 997 non-null float64 mintempm_2 997 non-null float64 mintempm_3 997 non-null float64 maxdewptm_1 997 non-null float64 maxdewptm_2 997 non-null float64 maxdewptm_3 997 non-null float64 mindewptm_1 997 non-null float64 mindewptm_2 997 non-null float64 mindewptm_3 997 non-null float64 maxpressurem_1 997 non-null float64 maxpressurem_2 997 non-null float64 maxpressurem_3 997 non-null float64 minpressurem_1 997 non-null float64 minpressurem_2 997 non-null float64 minpressurem_3 997 non-null float64 precipm_1 997 non-null float64 precipm_2 997 non-null float64 precipm_3 997 non-null float64 dtypes: float64(36), int64(3) memory usage: 311.6+ KB
??請(qǐng)注意,我們剛剛記錄下了1000個(gè)氣象數(shù)據(jù)記錄,并且所有的特征都是數(shù)字性質(zhì)的。 另外,由于我們?cè)诘谝黄恼轮械呐ぷ鳎杏涗浂际峭暾?,因?yàn)樗鼈儾蝗鄙偃魏沃担]有非空值)。
??現(xiàn)在我將刪除“mintempm”和“maxtempm”這兩列,因?yàn)樗鼈儗?duì)幫助我們預(yù)測(cè)平均溫度毫無意義。 我們正在試圖預(yù)測(cè)未來,所以我們顯然不能掌握有關(guān)未來的數(shù)據(jù)。 我還將從目標(biāo)(y)中分離出特征(X)。
# First drop the maxtempm and mintempm from the dataframe df = df.drop(["mintempm", "maxtempm"], axis=1) # X will be a pandas dataframe of all columns except meantempm X = df[[col for col in df.columns if col != "meantempm"]] # y will be a pandas series of the meantempm y = df["meantempm"]
??和所有監(jiān)督機(jī)器學(xué)習(xí)應(yīng)用程序一樣,我將把我的數(shù)據(jù)集分成訓(xùn)練集和測(cè)試集。 但是,為了更好地解釋訓(xùn)練這個(gè)神經(jīng)網(wǎng)絡(luò)的迭代過程,我將使用一個(gè)額外的數(shù)據(jù)集,我將其稱為“驗(yàn)證集合”。 對(duì)于訓(xùn)練集,我將利用80%的數(shù)據(jù),對(duì)于測(cè)試和驗(yàn)證集,它們將分別為剩余數(shù)據(jù)的10%。為了分解這些數(shù)據(jù),我將再次使用Scikit Learn 庫的train_test_split()函數(shù)。
# split data into training set and a temporary set using sklearn.model_selection.traing_test_split X_train, X_tmp, y_train, y_tmp = train_test_split(X, y, test_size=0.2, random_state=23) # take the remaining 20% of data in X_tmp, y_tmp and split them evenly X_test, X_val, y_test, y_val = train_test_split(X_tmp, y_tmp, test_size=0.5, random_state=23) X_train.shape, X_test.shape, X_val.shape print("Training instances {}, Training features {}".format(X_train.shape[0], X_train.shape[1])) print("Validation instances {}, Validation features {}".format(X_val.shape[0], X_val.shape[1])) print("Testing instances {}, Testing features {}".format(X_test.shape[0], X_test.shape[1])) Training instances 797, Training features 36 Validation instances 100, Validation features 36 Testing instances 100, Testing features 36
構(gòu)建神經(jīng)網(wǎng)絡(luò)模型時(shí)要采取的第一步是實(shí)例化tf.estimator.DNNRegressor()類。類的構(gòu)造函數(shù)有多個(gè)參數(shù),但我將重點(diǎn)關(guān)注以下參數(shù):
feature_columns:一種類似列表的結(jié)構(gòu),包含要輸入到模型中的要素的名稱和數(shù)據(jù)類型的定義
hidden_??units:一個(gè)類似列表的結(jié)構(gòu),包含神經(jīng)網(wǎng)絡(luò)數(shù)量寬度和深度的定義
optimizer:tf.Optimizer子類的一個(gè)實(shí)例,在訓(xùn)練期間優(yōu)化模型的權(quán)重;它的默認(rèn)值是AdaGrad優(yōu)化器。
activation_fn:激活功能,用于在每一層向網(wǎng)絡(luò)引入非線性;默認(rèn)是ReLU
model_dir:要?jiǎng)?chuàng)建的目錄,其中包含模型的元數(shù)據(jù)和其他檢查點(diǎn)保存
我將首先定義一個(gè)數(shù)字特征列的列表。要做到這一點(diǎn),我使用tf.feature_column.numeric_column()函數(shù)返回一個(gè)FeatureColumn實(shí)例。
feature_cols = [tf.feature_column.numeric_column(col) for col in X.columns]
??使用定義的特性列,我現(xiàn)在可以實(shí)例化DNNRegressor類并將其存儲(chǔ)在回歸變量中。 我指定我想要一個(gè)有兩層深度的神經(jīng)網(wǎng)絡(luò),其中兩層的寬度都是50個(gè)節(jié)點(diǎn)。 我還指出,我希望我的模型數(shù)據(jù)存儲(chǔ)在一個(gè)名為tf_wx_model的目錄中。
regressor = tf.estimator.DNNRegressor(feature_columns=feature_cols, hidden_units=[50, 50], model_dir="tf_wx_model") INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {"_tf_random_seed": 1, "_save_checkpoints_steps": None, "_save_checkpoints_secs": 600, "_model_dir": "tf_wx_model", "_log_step_count_steps": 100, "_keep_checkpoint_every_n_hours": 10000, "_save_summary_steps": 100, "_keep_checkpoint_max": 5, "_session_config": None}
接下來我想要做的是定義一個(gè)可重用的函數(shù),這個(gè)函數(shù)通常被稱為“輸入函數(shù)”,我將調(diào)用wx_input_fn()。 這個(gè)函數(shù)將被用來在訓(xùn)練和測(cè)試階段將數(shù)據(jù)輸入到我的神經(jīng)網(wǎng)絡(luò)中。有許多不同的方法來建立輸入函數(shù),但我將描述如何定義和使用一個(gè)基于tf.estimator.inputs.pandas_input_fn(),因?yàn)槲业臄?shù)據(jù)是在一個(gè)pandas數(shù)據(jù)結(jié)構(gòu)。
def wx_input_fn(X, y=None, num_epochs=None, shuffle=True, batch_size=400): return tf.estimator.inputs.pandas_input_fn(x=X, y=y, num_epochs=num_epochs, shuffle=shuffle, batch_size=batch_size)
??請(qǐng)注意,這個(gè)wx_input_fn()函數(shù)接受一個(gè)必選參數(shù)和四個(gè)可選參數(shù),然后將這些參數(shù)交給TensorFlow輸入函數(shù),專門用于返回的pandas數(shù)據(jù)。 這是TensorFlow API一個(gè)非常強(qiáng)大的功能。函數(shù)的參數(shù)定義如下:
X:輸入要輸入到三種DNNRegressor接口方法中的一種(訓(xùn)練,評(píng)估和預(yù)測(cè))
y:X的目標(biāo)值,這是可選的,不會(huì)被提供給預(yù)測(cè)調(diào)用
num_epochs:可選參數(shù)。 當(dāng)算法在整個(gè)數(shù)據(jù)集上執(zhí)行一次時(shí),就會(huì)出現(xiàn)一個(gè)新紀(jì)元。
shuffle:可選參數(shù),指定每次執(zhí)行算法時(shí)是否隨機(jī)選擇數(shù)據(jù)集的批處理(子集)
batch_size:每次執(zhí)行算法時(shí)要包含的樣本數(shù)
??通過定義我們的輸入函數(shù),我們現(xiàn)在可以訓(xùn)練我們基于訓(xùn)練數(shù)據(jù)集上的神經(jīng)網(wǎng)絡(luò)。 對(duì)于熟悉TensorFlow高級(jí)API的讀者,您可能會(huì)注意到我對(duì)自己的模型的培訓(xùn)方式有點(diǎn)不合常規(guī)。至少從TensorFlow網(wǎng)站上的當(dāng)前教程和網(wǎng)絡(luò)上的其他教程的角度來看。通常情況下,您將看到如下所示的內(nèi)容。
regressor.train(input_fn=input_fn(training_data, num_epochs=None, shuffle=True), steps=some_large_number) ..... lots of log info ....
然后,作者將直接展示evaluate()函數(shù),并且?guī)缀鯖]有提示它在做什么或?yàn)槭裁创嬖谶@一行代碼。
regressor.evaluate(input_fn=input_fn(eval_data, num_epochs=1, shuffle=False), steps=1) ..... less log info ....
在此之后,假設(shè)所有的訓(xùn)練模型都是完美的,他們會(huì)直接跳到執(zhí)行predict()函數(shù)。
predictions = regressor.predict(input_fn=input_fn(pred_data, num_epochs=1, shuffle=False), steps=1)
??我希望能夠提供一個(gè)合理的解釋,說明如何訓(xùn)練和評(píng)估這個(gè)神經(jīng)網(wǎng)絡(luò),以便將這個(gè)模型擬合或過度擬合到訓(xùn)練數(shù)據(jù)上的風(fēng)險(xiǎn)降到最低。因此,我們不再拖延,讓我定義一個(gè)簡(jiǎn)單的訓(xùn)練循環(huán),對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行訓(xùn)練,定期對(duì)評(píng)估數(shù)據(jù)進(jìn)行評(píng)估。
evaluations = [] STEPS = 400 for i in range(100): regressor.train(input_fn=wx_input_fn(X_train, y=y_train), steps=STEPS) evaluations.append(regressor.evaluate(input_fn=wx_input_fn(X_val, y_val, num_epochs=1, shuffle=False))) INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Saving checkpoints for 1 into tf_wx_model/model.ckpt. INFO:tensorflow:step = 1, loss = 1.11335e+07 INFO:tensorflow:global_step/sec: 75.7886 INFO:tensorflow:step = 101, loss = 36981.3 (1.321 sec) INFO:tensorflow:global_step/sec: 85.0322 ... A WHOLE LOT OF LOG OUTPUT ... INFO:tensorflow:step = 39901, loss = 5205.02 (1.233 sec) INFO:tensorflow:Saving checkpoints for 40000 into tf_wx_model/model.ckpt. INFO:tensorflow:Loss for final step: 4557.79. INFO:tensorflow:Starting evaluation at 2017-12-05-13:48:43 INFO:tensorflow:Restoring parameters from tf_wx_model/model.ckpt-40000 INFO:tensorflow:Evaluation [1/1] INFO:tensorflow:Finished evaluation at 2017-12-05-13:48:43 INFO:tensorflow:Saving dict for global step 40000: average_loss = 10.2416, global_step = 40000, loss = 1024.16 INFO:tensorflow:Starting evaluation at 2017-12-05-13:48:43 INFO:tensorflow:Restoring parameters from tf_wx_model/model.ckpt-40000 INFO:tensorflow:Finished evaluation at 2017-12-05-13:48:43 INFO:tensorflow:Saving dict for global step 40000: average_loss = 10.2416, global_step = 40000, loss = 1024.16
??上面的循環(huán)迭代了100次。 在循環(huán)體中,我調(diào)用了回歸器對(duì)象的train()方法,并將其傳遞給了我的可重用的wx_input_fn(),后者又通過了我的訓(xùn)練功能集和目標(biāo)。 我有意地將默認(rèn)參數(shù)num_epochs等于None,基本上這樣說:“我不在乎你通過訓(xùn)練集多少次,只是繼續(xù)訓(xùn)練算法對(duì)每個(gè)默認(rèn)batch_size 400”(大約一半的訓(xùn)練 組)。 我還將shuffle參數(shù)設(shè)置為默認(rèn)值True,以便在訓(xùn)練時(shí)隨機(jī)選擇數(shù)據(jù)以避免數(shù)據(jù)中的任何順序關(guān)系。 train()方法的最后一個(gè)參數(shù)是我設(shè)置為400的步驟,這意味著訓(xùn)練集每個(gè)循環(huán)將被批處理400次。
??這給了我一個(gè)很好的時(shí)間以更具體的數(shù)字來解釋一個(gè)epoch的意義。 回想一下,當(dāng)一個(gè)訓(xùn)練集的所有記錄都通過神經(jīng)網(wǎng)絡(luò)訓(xùn)練一次時(shí),就會(huì)出現(xiàn)一個(gè)epoch。 所以,如果我們的訓(xùn)練集中有大約800(準(zhǔn)確的說是797)個(gè)記錄,并且每個(gè)批次選擇400個(gè),那么每?jī)蓚€(gè)批次我們就完成了一個(gè)時(shí)間。 因此,如果我們遍歷整個(gè)訓(xùn)練集100個(gè)迭代400個(gè)步驟,每個(gè)批次大小為400(每個(gè)批次的一個(gè)半個(gè)時(shí)間),我們得到:
(100 x 400 / 2) = 20,000 epochs
??現(xiàn)在你可能想知道為什么我為循環(huán)的每次迭代執(zhí)行和evaluate()方法,并在列表中捕獲它的輸出。 首先讓我解釋一下每次train()方法被觸發(fā)時(shí)會(huì)發(fā)生什么。它隨機(jī)選擇一批訓(xùn)練記錄,并通過網(wǎng)絡(luò)推送,直到做出預(yù)測(cè),并為每條記錄計(jì)算損失函數(shù)。 然后根據(jù)計(jì)算出的損失根據(jù)優(yōu)化器的邏輯調(diào)整權(quán)重,這對(duì)于減少下一次迭代的整體損失的方向做了很好的調(diào)整。 一般而言,只要學(xué)習(xí)速率足夠小,這些損失值隨著時(shí)間的推移而逐漸下降。
??然而,經(jīng)過一定數(shù)量的這些學(xué)習(xí)迭代之后,權(quán)重開始不僅受到數(shù)據(jù)整體趨勢(shì)的影響,而且還受到非實(shí)際的噪聲在所有實(shí)際數(shù)據(jù)中的繼承。 在這一點(diǎn)上,網(wǎng)絡(luò)受到訓(xùn)練數(shù)據(jù)特性的過度影響,并且變得無法推廣關(guān)于總體數(shù)據(jù)的預(yù)測(cè)。這與我之前提到的高級(jí)TensorFlow API許多其他教程不足之處有關(guān)。 在訓(xùn)練期間周期性地打破這一點(diǎn)非常重要,并評(píng)估模型如何推廣到評(píng)估或驗(yàn)證數(shù)據(jù)集。 通過查看第一個(gè)循環(huán)迭代的評(píng)估輸出,讓我們花些時(shí)間看看evaluate()函數(shù)返回的結(jié)果。
evaluations[0] {"average_loss": 31.116383, "global_step": 400, "loss": 3111.6382}
正如你所看到的,它輸出的是平均損失(均方誤差)和訓(xùn)練中的步驟的總損失(平方誤差和),這一步是第400步。 在訓(xùn)練有素的網(wǎng)絡(luò)中,你通常會(huì)看到一種趨勢(shì),即訓(xùn)練和評(píng)估損失或多或少地平行下降。 然而,在某個(gè)時(shí)間點(diǎn)的過度配置模型中,實(shí)際上在過擬合開始出現(xiàn)的地方,驗(yàn)證訓(xùn)練集將不再看到其evaluate()方法的輸出降低。 這是你想停止進(jìn)一步訓(xùn)練模型的地方,最好是在變化發(fā)生之前。
??現(xiàn)在我們對(duì)每個(gè)迭代都有一個(gè)評(píng)估集合,讓我們將它們作為訓(xùn)練步驟的函數(shù)來繪制,以確保我們沒有過度訓(xùn)練我們的模型。 為此,我將使用matplotlib的pyplot模塊中的一個(gè)簡(jiǎn)單的散點(diǎn)圖。
import matplotlib.pyplot as plt %matplotlib inline # manually set the parameters of the figure to and appropriate size plt.rcParams["figure.figsize"] = [14, 10] loss_values = [ev["loss"] for ev in evaluations] training_steps = [ev["global_step"] for ev in evaluations] plt.scatter(x=training_steps, y=loss_values) plt.xlabel("Training steps (Epochs = steps / 2)") plt.ylabel("Loss (SSE)") plt.show()
??從上面的圖表看來,在所有這些迭代之后,我并沒有過度配置模型,因?yàn)樵u(píng)估損失從來沒有呈現(xiàn)出朝著增加價(jià)值的方向的顯著變化?,F(xiàn)在,我可以安全地繼續(xù)根據(jù)我的剩余測(cè)試數(shù)據(jù)集進(jìn)行預(yù)測(cè),并評(píng)估模型如何預(yù)測(cè)平均天氣溫度。
??與我已經(jīng)演示的其他兩種回歸方法類似,predict()方法需要input_fn,我將使用可重用的wx_input_fn()傳遞input_fn,將測(cè)試數(shù)據(jù)集交給它,將num_epochs指定為None,shuffle為False,因此它將依次送入所有的數(shù)據(jù)進(jìn)行測(cè)試。
??接下來,我做一些從predict()方法返回的dicts迭代的格式,以便我有一個(gè)numpy的預(yù)測(cè)數(shù)組。然后,我使用sklearn方法explain_variance_score(),mean_absolute_error()和median_absolute_error()來預(yù)測(cè)數(shù)組,以測(cè)量預(yù)測(cè)與已知目標(biāo)y_test的關(guān)系。
pred = regressor.predict(input_fn=wx_input_fn(X_test, num_epochs=1, shuffle=False)) predictions = np.array([p["predictions"][0] for p in pred]) print("The Explained Variance: %.2f" % explained_variance_score( y_test, predictions)) print("The Mean Absolute Error: %.2f degrees Celcius" % mean_absolute_error( y_test, predictions)) print("The Median Absolute Error: %.2f degrees Celcius" % median_absolute_error( y_test, predictions)) INFO:tensorflow:Restoring parameters from tf_wx_model/model.ckpt-40000 The Explained Variance: 0.88 The Mean Absolute Error: 3.11 degrees Celcius The Median Absolute Error: 2.51 degrees Celcius
我已經(jīng)使用了與上一篇文章有關(guān)的線性回歸技術(shù)相同的指標(biāo),以便我們不僅可以評(píng)估這個(gè)模型,還可以對(duì)它們進(jìn)行比較。 正如你所看到的,這兩個(gè)模型的表現(xiàn)相當(dāng)類似,更簡(jiǎn)單的線性回歸模型略好一些。然而,你可以通過修改學(xué)習(xí)速率,寬度和深度等參數(shù)來優(yōu)化機(jī)器學(xué)習(xí)模型。
總結(jié)??本文演示了如何使用TensorFlow高級(jí)API Estimator子類DNNRegressor。并且,我也描述了神經(jīng)網(wǎng)絡(luò)理論,他們是如何被訓(xùn)練的,以及在過程中認(rèn)識(shí)到過度擬合模型的危險(xiǎn)性的重要性。
??為了演示這個(gè)建立神經(jīng)網(wǎng)絡(luò)的過程,我建立了一個(gè)模型,能夠根據(jù)本系列第一篇文章收集的數(shù)字特征預(yù)測(cè)第二天的平均溫度。寫這些文章的目的不是為了建立一個(gè)非常好的模型預(yù)測(cè)天氣,我的目標(biāo)是:
演示從數(shù)據(jù)收集,數(shù)據(jù)處理,探索性數(shù)據(jù)分析,模型選擇,模型構(gòu)建和模型評(píng)估中進(jìn)行分析(機(jī)器學(xué)習(xí),數(shù)據(jù)科學(xué),無論...)項(xiàng)目的一般過程。
演示如何使用兩個(gè)流行的Python庫StatsModels和Scikit Learn來選擇不違反線性回歸技術(shù)關(guān)鍵假設(shè)的有意義的功能。
演示如何使用高級(jí)別的TensorFlow API,并直觀地了解所有這些抽象層下正在發(fā)生的事情。
討論與過度擬合模型相關(guān)的問題。
解釋試驗(yàn)多個(gè)模型類型以最好地解決問題。
相關(guān)文章使用機(jī)器學(xué)習(xí)預(yù)測(cè)天氣第二部分
使用機(jī)器學(xué)習(xí)預(yù)測(cè)天氣第一部分
英文原文
原文地址:http://www.bugcode.cn/mlweath...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/41204.html
摘要:概述本章是使用機(jī)器學(xué)習(xí)預(yù)測(cè)天氣系列教程的第一部分,使用和機(jī)器學(xué)習(xí)來構(gòu)建模型,根據(jù)從收集的數(shù)據(jù)來預(yù)測(cè)天氣溫度。數(shù)據(jù)類型是機(jī)器學(xué)習(xí)領(lǐng)域經(jīng)常會(huì)用到的數(shù)據(jù)結(jié)構(gòu)。 概述 ??本章是使用機(jī)器學(xué)習(xí)預(yù)測(cè)天氣系列教程的第一部分,使用Python和機(jī)器學(xué)習(xí)來構(gòu)建模型,根據(jù)從Weather Underground收集的數(shù)據(jù)來預(yù)測(cè)天氣溫度。該教程將由三個(gè)不同的部分組成,涵蓋的主題是: 數(shù)據(jù)收集和處理(本文)...
摘要:為了建立線性回歸模型,我要用到里非常重要的兩個(gè)機(jī)器學(xué)習(xí)相關(guān)的庫和。使用逐步回歸建立一個(gè)健壯的模型一個(gè)強(qiáng)大的線性回歸模型必須選取有意義的重要的統(tǒng)計(jì)指標(biāo)的指標(biāo)作為預(yù)測(cè)指標(biāo)。 概述 ??這篇文章我們接著前一篇文章,使用Weather Underground網(wǎng)站獲取到的數(shù)據(jù),來繼續(xù)探討用機(jī)器學(xué)習(xí)的方法預(yù)測(cè)內(nèi)布拉斯加州林肯市的天氣??上一篇文章我們已經(jīng)探討了如何收集、整理、清洗數(shù)據(jù)。這篇文章我們...
閱讀 949·2021-11-22 09:34
閱讀 1091·2021-10-08 10:16
閱讀 1893·2021-07-25 21:42
閱讀 1850·2019-08-30 15:53
閱讀 3575·2019-08-30 13:08
閱讀 2244·2019-08-29 17:30
閱讀 3404·2019-08-29 17:22
閱讀 2261·2019-08-29 15:35