轉載:https://blog.csdn.net/qq_40195614/article/details/90199642?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4
波士頓房價問題
房價的預測和前兩期的問題是不同的,最大的區別就是這個問題不是離散的分類,他是一個連續值,那么在搭建網絡時候的技巧就有所區別。
代碼實例分析
from keras.datasets import boston_housing
(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()
- 1
- 2
導入數據
train_data.shape test_data.shape
看一下數據的尺寸,發現訓練集的尺寸是404,13;測試集的尺寸是102,13;說明這些數據不多,這十三個數據特征是各種數值,包括犯罪率,住宅平均房間數,道路的通暢程度等。很明顯,這些數據都看起來沒什么關系,相互之間無法聯系,還有一個最要命的就是我們無法確定那個數據更加的重要。另外,這些數據的范圍也不同,想要使用,必須要做一些處理。
train_targets
看一下targets,就可以看到當時房子的房價了,這就是訓練集中對應的結果集,類似於上兩個例子中的標簽集。
mean = train_data.mean(axis=0) train_data -= mean std = train_data.std(axis=0) train_data /= std test_data -= mean test_data /= std
這里就是應對數據范圍不同的辦法,方法叫標准化,含義就是加工每個特征,使他們的數據滿足平均值為0,標准差為1.具體的方法就是每列取平均值,減去平均值,再除以減掉之后的標准差。這里要注意標准化所用的數據必須是在訓練集上得到,實際操作中不能讓任何數據從驗證集上得到,不然會導致模型過擬合的問題。
from keras import models from keras import layers def build_model(): model = models.Sequential() model.add(layers.Dense(64, activation='relu', input_shape=(train_data.shape[1],))) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(1)) model.compile(optimizer='rmsprop', loss='mse', metrics=['mae']) return model
這里就是搭建學習模型的步驟,因為這個模型要重復使用,所以我們把它寫成函數的形式。前兩層輸出維數都是64,並且用激活函數relu去激活,但最后一層是純的線性層,只輸出一個值,而且不激活,可見輸出的值是任意范圍內的。
下面編譯用的是優化器rmsprop,損失函數是mse,即為均方誤差,就是預測值與目標值之差的平方,反應了差距的大小,回歸問題用的比較多。最后一個指標是mae,平均絕對誤差,它求的是差值的絕對值,沒有平方。
回到數據集本身,就會發現問題在於訓練集和驗證集都太小了,特別是驗證集小,這會讓每次驗證的結果差距都比較大,就沒辦法得出結論,於是就要引入一種K折交叉驗證的方法,簡單來說就是自給自足,自己驗證自己的方法。
import numpy as np k = 4 num_val_samples = len(train_data) // k num_epochs = 100 all_scores = [] for i in range(k): print('processing fold #', i) val_data = train_data[i * num_val_samples: (i + 1) * num_val_samples] val_targets = train_targets[i * num_val_samples: (i + 1) * num_val_samples] partial_train_data = np.concatenate( [train_data[:i * num_val_samples], train_data[(i + 1) * num_val_samples:]], axis=0) partial_train_targets = np.concatenate( [train_targets[:i * num_val_samples], train_targets[(i + 1) * num_val_samples:]], axis=0) model = build_model() # Train the model (in silent mode, verbose=0) model.fit(partial_train_data, partial_train_targets, epochs=num_epochs, batch_size=1, verbose=0) val_mse, val_mae = model.evaluate(val_data, val_targets, verbose=0) all_scores.append(val_mae)
這段代碼看似很長,其實只反映了一個思想,就是k折驗證,第一部分把訓練集分成四份,每一份都是待定的驗證集;第二部分把第一步選定的數據除外的數據拿出來然后使用concatenate拼接起來當了訓練集;第三部分去訓練然后驗證。得到的分數就是mae。其中的參數verbose為0就是不輸出進度條,默認的是1,就是顯示進度條,日志,這個不影響過程,只影響能不能看到進度。
后面的事情下一期講。