摘要:泛化泛化數(shù)據(jù)集實(shí)驗(yàn)泛化過(guò)擬合的風(fēng)險(xiǎn)泛化泛化能力是指機(jī)器學(xué)習(xí)算法對(duì)新鮮樣本的適應(yīng)能力。機(jī)器學(xué)習(xí)的基本沖突是適當(dāng)擬合我們的數(shù)據(jù),但也要盡可能簡(jiǎn)單地?cái)M合數(shù)據(jù)。使用測(cè)試集再次檢查該模型。特征通常在正常范圍內(nèi),其中第百分位數(shù)的值約為。
泛化&泛化數(shù)據(jù)集&實(shí)驗(yàn) 泛化 (Generalization):過(guò)擬合的風(fēng)險(xiǎn)
泛化:泛化能力(generalization ability)是指機(jī)器學(xué)習(xí)算法對(duì)新鮮樣本的適應(yīng)能力。學(xué)習(xí)的目的是學(xué)到隱含在數(shù)據(jù)對(duì)背后的規(guī)律,對(duì)具有同一規(guī)律的學(xué)習(xí)集以外的數(shù)據(jù),經(jīng)過(guò)訓(xùn)練的網(wǎng)絡(luò)也能給出合適的輸出,該能力稱為泛化能力。
前兩篇實(shí)現(xiàn)了線性回歸模型得訓(xùn)練,并再最后進(jìn)行了采用合成特征作為特征輸入,且過(guò)濾了離群值,效果似乎不錯(cuò),但是這個(gè)不錯(cuò)的結(jié)果來(lái)自于我們采用了原來(lái)的訓(xùn)練數(shù)據(jù)進(jìn)行的測(cè)試,這樣的評(píng)估意義大嗎?如果我們使用了新的(訓(xùn)練模型從未遇見過(guò)的)數(shù)據(jù)進(jìn)行預(yù)測(cè),得到的結(jié)果可能會(huì)不敬人意。
假設(shè)我對(duì)模型不斷的進(jìn)行訓(xùn)練,不斷調(diào)整超參數(shù),經(jīng)過(guò)若干天后,得到的模型能夠達(dá)到完美的預(yù)測(cè)效果,對(duì)于輸入的任意特征都能得到正確的target,但是這并不是我們想要的模型,因?yàn)槠渲贿_(dá)到了對(duì)訓(xùn)練數(shù)據(jù)的完美貼合,但并不一定能對(duì)它從未見過(guò)的新數(shù)據(jù)做出正確的預(yù)測(cè),并且其訓(xùn)練了過(guò)久,模型也會(huì)變的過(guò)于復(fù)雜,這樣就叫做過(guò)擬合
大概過(guò)程如下圖(圖片來(lái)源于谷歌機(jī)器學(xué)習(xí)樣圖):
為了讓您直觀地理解這一概念,我們將展示 3 張圖。假設(shè)這些圖中的每個(gè)點(diǎn)代表一棵樹在森林中的位置。圖中的兩種顏色分別代表以下含義:
藍(lán)點(diǎn)代表生病的樹。
橙點(diǎn)代表健康的樹。
圖 1. 生病(藍(lán)色)和健康(橙色)的樹。
您能設(shè)想出一個(gè)有效的模型來(lái)預(yù)測(cè)以后的生病或健康的樹嗎?花點(diǎn)時(shí)間在腦海里繪制一條弧線將藍(lán)點(diǎn)與橙點(diǎn)分開,或者在腦海中圈住一些橙點(diǎn)或藍(lán)點(diǎn)。然后再看看圖 2,它顯示某種機(jī)器學(xué)習(xí)模型如何將生病的樹與健康的樹區(qū)分開。請(qǐng)注意,該模型產(chǎn)生的損失非常低。
圖 2. 用于區(qū)分生病的樹與健康的樹的復(fù)雜模型。
乍一看,圖 2 所示的模型在將健康的樹與生病的樹區(qū)分開方面似乎表現(xiàn)得非常出色。真的是這樣嗎?
圖 3. 該模型在預(yù)測(cè)新數(shù)據(jù)方面表現(xiàn)非常糟糕。
圖 3 顯示我們向該模型中添加了新數(shù)據(jù)后所發(fā)生的情況。結(jié)果表明,該模型在處理新數(shù)據(jù)方面表現(xiàn)非常糟糕。請(qǐng)注意,該模型對(duì)大部分新數(shù)據(jù)的分類都不正確。
圖 2 和圖 3 所示的模型過(guò)擬合了訓(xùn)練數(shù)據(jù)的特性。過(guò)擬合模型在訓(xùn)練過(guò)程中產(chǎn)生的損失很低,但在預(yù)測(cè)新數(shù)據(jù)方面的表現(xiàn)卻非常糟糕。如果某個(gè)模型在擬合當(dāng)前樣本方面表現(xiàn)良好,那么我們?nèi)绾蜗嘈旁撃P蜁?huì)對(duì)新數(shù)據(jù)做出良好的預(yù)測(cè)呢?正如您稍后將看到的,過(guò)擬合是由于模型的復(fù)雜程度超出所需程度而造成的。機(jī)器學(xué)習(xí)的基本沖突是適當(dāng)擬合我們的數(shù)據(jù),但也要盡可能簡(jiǎn)單地?cái)M合數(shù)據(jù)。
一種解決方法是將您的數(shù)據(jù)集分成兩個(gè)子集:
訓(xùn)練集 - 用于訓(xùn)練模型的子集。
測(cè)試集 - 用于測(cè)試模型的子集。
一般來(lái)說(shuō),在-測(cè)試集上表現(xiàn)是否良好是衡量能否在新數(shù)據(jù)上表現(xiàn)良好的有用指標(biāo),前提是:
測(cè)試集足夠大。
不會(huì)反復(fù)使用相同的測(cè)試集來(lái)作假。
我們從分布中隨機(jī)抽取樣本,且這些樣本是獨(dú)立同分布 (i.i.d) 的
獨(dú)立同分布:1、每次抽取是隨機(jī)的,不被其他條件所約束 2、所抽取的樣本是同分布的,即滿足同一個(gè)分布規(guī)律(如,抽紙牌,得從同樣得一副牌中抽取)3、分布是平穩(wěn)的,即分布在數(shù)據(jù)集內(nèi)不會(huì)發(fā)生變化
接下來(lái)我們來(lái)談?wù)?strong>訓(xùn)練集和測(cè)試集
訓(xùn)練集和測(cè)試集 (Training and Test Sets):拆分?jǐn)?shù)據(jù)訓(xùn)練集 - 用于訓(xùn)練模型的子集。
測(cè)試集 - 用于測(cè)試訓(xùn)練后模型的子集
如果我們只有一個(gè)數(shù)據(jù)集,但是需要訓(xùn)練集和測(cè)試集,辦法很簡(jiǎn)單,拆分就好了,比例大概可以是4:1這樣子
不過(guò),拆分?jǐn)?shù)據(jù)時(shí)候得遵循幾個(gè)原則
1.數(shù)據(jù)集夠大
2.隨機(jī)抽取的,能代表數(shù)據(jù)集的水平
注意:請(qǐng)勿對(duì)測(cè)試數(shù)據(jù)進(jìn)行訓(xùn)練,如果最后測(cè)試得到的結(jié)果意外的好,那最好檢查一下,多數(shù)是因?yàn)閷?duì)測(cè)試數(shù)據(jù)進(jìn)行了誤訓(xùn)練
這是我們剛才討論的劃分方式--訓(xùn)練集和測(cè)試集
但是這樣的劃分方式,會(huì)不會(huì)有問(wèn)題呢?如果為了在最后的測(cè)試數(shù)據(jù)上獲得最佳效果,從而更改學(xué)習(xí)速率、添加或移除特征,到從頭開始設(shè)計(jì)全新模型。當(dāng)該工作流程結(jié)束時(shí),在測(cè)試數(shù)據(jù)上表現(xiàn)很好,那么最終依然很有可能是過(guò)擬合的。
所以我們可以進(jìn)一步劃分,即訓(xùn)練集+驗(yàn)證集合+測(cè)試集合
在這一經(jīng)過(guò)改進(jìn)的工作流程中:
選擇在驗(yàn)證集上獲得最佳效果的模型。
使用測(cè)試集再次檢查該模型。
該工作流程之所以更好,原因在于它暴露給測(cè)試集的信息更少
接下來(lái),我們將對(duì)之前的理論進(jìn)行驗(yàn)證
驗(yàn)證使用多個(gè)特征而非單個(gè)特征來(lái)進(jìn)一步提高模型的有效性
調(diào)試模型輸入數(shù)據(jù)中的問(wèn)題
使用測(cè)試數(shù)據(jù)集檢查模型是否過(guò)擬合驗(yàn)證數(shù)據(jù)
與在之前的練習(xí)中一樣,我們將依然使用加利福尼亞州住房數(shù)據(jù)集,嘗試根據(jù) 1990 年的人口普查數(shù)據(jù)在城市街區(qū)級(jí)別預(yù)測(cè) median_house_value
設(shè)置和測(cè)試我們首先加載并準(zhǔn)備數(shù)據(jù)。這一次,我們將使用多個(gè)特征,因此我們會(huì)將邏輯模塊化,以對(duì)特征進(jìn)行預(yù)處理:
import math from IPython import display from matplotlib import cm from matplotlib import gridspec from matplotlib import pyplot as plt import numpy as np import pandas as pd from sklearn import metrics import tensorflow as tf from tensorflow.python.data import Dataset tf.logging.set_verbosity(tf.logging.ERROR) pd.options.display.max_rows = 10 pd.options.display.float_format = "{:.1f}".format california_housing_dataframe = pd.read_csv("https://storage.googleapis.com/mledu-datasets/california_housing_train.csv", sep=",") # california_housing_dataframe = california_housing_dataframe.reindex( # np.random.permutation(california_housing_dataframe.index)) # 對(duì)特征預(yù)處理 def preprocess_features(california_housing_dataframe): selected_features = california_housing_dataframe[ ["latitude", "longitude", "housing_median_age", "total_rooms", "total_bedrooms", "population", "households", "median_income"]] processed_features = selected_features.copy() # 此外多創(chuàng)建一個(gè)合成特征 processed_features["rooms_per_person"] = ( california_housing_dataframe["total_rooms"] / california_housing_dataframe["population"]) return processed_features # 對(duì)target預(yù)處理 def preprocess_targets(california_housing_dataframe): # output_targets為pd.DataFrame()類型的數(shù)據(jù)結(jié)構(gòu)(這種結(jié)構(gòu)類似于表格,有行有列的索引) output_targets = pd.DataFrame() output_targets["median_house_value"] = ( california_housing_dataframe["median_house_value"] / 1000.0) return output_targets # 訓(xùn)練集取前12000(共17000樣本) training_examples = preprocess_features(california_housing_dataframe.head(12000)) training_examples.describe()
latitude | longitude | housing_median_age | total_rooms | total_bedrooms | population | households | median_income | rooms_per_person | |
---|---|---|---|---|---|---|---|---|---|
count | 12000.0 | 12000.0 | 12000.0 | 12000.0 | 12000.0 | 12000.0 | 12000.0 | 12000.0 | 12000.0 |
mean | 34.6 | -118.5 | 27.5 | 2655.7 | 547.1 | 1476.0 | 505.4 | 3.8 | 1.9 |
std | 1.6 | 1.2 | 12.1 | 2258.1 | 434.3 | 1174.3 | 391.7 | 1.9 | 1.3 |
min | 32.5 | -121.4 | 1.0 | 2.0 | 2.0 | 3.0 | 2.0 | 0.5 | 0.0 |
25% | 33.8 | -118.9 | 17.0 | 1451.8 | 299.0 | 815.0 | 283.0 | 2.5 | 1.4 |
50% | 34.0 | -118.2 | 28.0 | 2113.5 | 438.0 | 1207.0 | 411.0 | 3.5 | 1.9 |
75% | 34.4 | -117.8 | 36.0 | 3146.0 | 653.0 | 1777.0 | 606.0 | 4.6 | 2.3 |
max | 41.8 | -114.3 | 52.0 | 37937.0 | 5471.0 | 35682.0 | 5189.0 | 15.0 | 55.2 |
training_targets = preprocess_targets(california_housing_dataframe.head(12000)) training_targets.describe()
median_house_value | |
---|---|
count | 12000.0 |
mean | 198.0 |
std | 111.9 |
min | 15.0 |
25% | 117.1 |
50% | 170.5 |
75% | 244.4 |
max | 500.0 |
# 測(cè)試集取尾5000 validation_examples = preprocess_features(california_housing_dataframe.tail(5000)) validation_examples.describe()
latitude | longitude | housing_median_age | total_rooms | total_bedrooms | population | households | median_income | rooms_per_person | |
---|---|---|---|---|---|---|---|---|---|
count | 5000.0 | 5000.0 | 5000.0 | 5000.0 | 5000.0 | 5000.0 | 5000.0 | 5000.0 | 5000.0 |
mean | 38.1 | -122.2 | 31.3 | 2614.8 | 521.1 | 1318.1 | 491.2 | 4.1 | 2.1 |
std | 0.9 | 0.5 | 13.4 | 1979.6 | 388.5 | 1073.7 | 366.5 | 2.0 | 0.6 |
min | 36.1 | -124.3 | 1.0 | 8.0 | 1.0 | 8.0 | 1.0 | 0.5 | 0.1 |
25% | 37.5 | -122.4 | 20.0 | 1481.0 | 292.0 | 731.0 | 278.0 | 2.7 | 1.7 |
50% | 37.8 | -122.1 | 31.0 | 2164.0 | 424.0 | 1074.0 | 403.0 | 3.7 | 2.1 |
75% | 38.4 | -121.9 | 42.0 | 3161.2 | 635.0 | 1590.2 | 603.0 | 5.1 | 2.4 |
max | 42.0 | -121.4 | 52.0 | 32627.0 | 6445.0 | 28566.0 | 6082.0 | 15.0 | 18.3 |
validation_targets = preprocess_targets(california_housing_dataframe.tail(5000)) validation_targets.describe()
median_house_value | |
---|---|
count | 5000.0 |
mean | 229.5 |
std | 122.5 |
min | 15.0 |
25% | 130.4 |
50% | 213.0 |
75% | 303.2 |
max | 500.0 |
在上面我們是把數(shù)據(jù)集中除了median_house_value作為target外,其他得所有列都作為了feature輸入
我們雖然沒有什么數(shù)據(jù)分析或者統(tǒng)計(jì)學(xué)得背景知識(shí),但是其實(shí)還是可以看一看,或者說(shuō)猜一猜輸入的這些特征到底是些什么,它們可能具有哪些意義?取值范圍是怎么樣的,數(shù)值的大小正常嘛?等等等
latitude:緯度
longitude:經(jīng)度
housing_median_age:房子年紀(jì)(中值)
total_rooms:房間總數(shù)(每個(gè)街區(qū))
total_bedrooms:臥室總數(shù)(每個(gè)街區(qū))
total_bedrooms:人口數(shù)(每個(gè)街區(qū))
households:戶(一家人為一戶)
median_income :收入(中值)
再看看這些feature的數(shù)值(最大值,最小值),理解一下它們的單位(當(dāng)然,會(huì)有不合理的,因?yàn)榇嬖跀?shù)據(jù)比較特殊,而且這是1990年的數(shù)據(jù)了),這些數(shù)據(jù)會(huì)幫助我們?cè)诤暧^上了解這些數(shù)據(jù)集,特別是一旦發(fā)現(xiàn)不合理的地方更是要注意了(尤其在訓(xùn)練自己的數(shù)據(jù)時(shí))
異常情況:
median_income 位于 3 到 15 的范圍內(nèi)。我們完全不清楚此范圍究竟指的是什么,看起來(lái)可能是某對(duì)數(shù)尺度?無(wú)法找到相關(guān)記錄;我們所能假設(shè)的只是,值越高,相應(yīng)的收入越高。
median_house_value 的最大值是 500001。這看起來(lái)像是某種人為設(shè)定的上限。
rooms_per_person 特征通常在正常范圍內(nèi),其中第 75 百分位數(shù)的值約為 2。但也有一些非常大的值(例如 18 或 55),這可能表明數(shù)據(jù)有一定程度的損壞。
我們將暫時(shí)使用提供的這些特征。但希望這些示例可幫助您較為直觀地了解如何檢查來(lái)自未知來(lái)源的數(shù)據(jù)
### 繪制緯度/經(jīng)度與房屋價(jià)值中位數(shù)的曲線圖
*
我們來(lái)詳細(xì)了解一下 latitude 和 longitude 這兩個(gè)特征。它們是相關(guān)城市街區(qū)的地理坐標(biāo)。
利用這兩個(gè)特征可以提供出色的可視化結(jié)果 - 我們來(lái)繪制 latitude 和 longitude 的曲線圖,然后用顏色標(biāo)注 median_house_value
plt.figure(figsize=(13, 8)) ax = plt.subplot(1, 2, 1) ax.set_title("Validation Data") # 取消y軸的自動(dòng)縮放,并定義上下限 ax.set_autoscaley_on(False) ax.set_ylim([32, 43]) # 取消x軸的自動(dòng)縮放,并定義上下限 ax.set_autoscalex_on(False) ax.set_xlim([-126, -112]) # plt.scatter()參數(shù)說(shuō)明 # validation_examples["longitude"],validation_examples["latitude"]:代表x,y # cmap:Colormap,顏色表 # c:color(色彩,或者顏色序列) plt.scatter(validation_examples["longitude"], validation_examples["latitude"], cmap="coolwarm", c=validation_targets["median_house_value"] / validation_targets["median_house_value"].max()) ax = plt.subplot(1,2,2) ax.set_title("Training Data") ax.set_autoscaley_on(False) ax.set_ylim([32, 43]) ax.set_autoscalex_on(False) ax.set_xlim([-126, -112]) plt.scatter(training_examples["longitude"], training_examples["latitude"], cmap="coolwarm", c=training_targets["median_house_value"] / training_targets["median_house_value"].max()) _ = plt.plot()
當(dāng)當(dāng)當(dāng)當(dāng),這個(gè)圖的問(wèn)題很明顯呢,訓(xùn)練和測(cè)試的數(shù)據(jù)差異很大呢,問(wèn)題在哪里呢? 都是一個(gè)數(shù)據(jù)集的哎,其實(shí)就是處理數(shù)據(jù)的時(shí)候,忘記了隨機(jī)排序了(再次說(shuō)明打亂順序真的很重要,我們永遠(yuǎn)無(wú)法預(yù)知原本序列的數(shù)據(jù)可能出現(xiàn)哪些問(wèn)題),此外采用圖標(biāo)分析也很重要,能夠在訓(xùn)練之前幫助我們發(fā)現(xiàn)問(wèn)題,不然后面就完蛋啦,怎么訓(xùn)練都不會(huì)有好的結(jié)果的。
調(diào)整后的結(jié)果
現(xiàn)在很像一個(gè)地圖了
訓(xùn)練和評(píng)估模型我們會(huì)使用數(shù)據(jù)集中的所有特征訓(xùn)練一個(gè)線性回歸器,定義一下以前將數(shù)據(jù)加載到 TensorFlow 模型中時(shí)所使用的同一輸入函數(shù)
def my_input_fn(features, targets, batch_size=1, shuffle=True, num_epochs=None): features = {key:np.array(value) for key,value in dict(features).items()} ds = Dataset.from_tensor_slices((features,targets)) # warning: 2GB limit ds = ds.batch(batch_size).repeat(num_epochs) if shuffle: ds = ds.shuffle(10000) features, labels = ds.make_one_shot_iterator().get_next() return features, labels
由于我們現(xiàn)在使用的是多個(gè)輸入特征,因此需要把用于將特征列配置為獨(dú)立函數(shù)的代碼模塊化。(目前此代碼相當(dāng)簡(jiǎn)單,因?yàn)槲覀兊乃刑卣鞫际?strong>數(shù)值,但當(dāng)我們?cè)诮窈蟮木毩?xí)中使用其他類型的特征時(shí),會(huì)基于此代碼進(jìn)行構(gòu)建。)
def construct_feature_columns(input_features): return set([tf.feature_column.numeric_column(my_feature) for my_feature in input_features])
接下來(lái),繼續(xù)完成下面的 train_model() 代碼,以設(shè)置輸入函數(shù)和計(jì)算預(yù)測(cè)。
但要確保針對(duì)相應(yīng)數(shù)據(jù)集調(diào)用 predict()比較訓(xùn)練數(shù)據(jù)和驗(yàn)證數(shù)據(jù)的損失
def train_model( learning_rate, steps, batch_size, training_examples, training_targets, validation_examples, validation_targets): periods = 10 steps_per_period = steps / periods # 創(chuàng)建線性回歸模型并設(shè)定好特征列和優(yōu)化器 my_optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate) my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer, 5.0) linear_regressor = tf.estimator.LinearRegressor( feature_columns=construct_feature_columns(training_examples), optimizer=my_optimizer ) # 創(chuàng)建訓(xùn)練、預(yù)測(cè)(使用訓(xùn)練集的數(shù)據(jù))、驗(yàn)證(使用驗(yàn)證集的數(shù)據(jù))的輸入函數(shù) training_input_fn = lambda: my_input_fn( training_examples, training_targets["median_house_value"], batch_size=batch_size) predict_training_input_fn = lambda: my_input_fn( training_examples, training_targets["median_house_value"], num_epochs=1, shuffle=False) predict_validation_input_fn = lambda: my_input_fn( validation_examples, validation_targets["median_house_value"], num_epochs=1, shuffle=False) # 訓(xùn)練(周期性輸出結(jié)果) print "Training model..." print "RMSE (on training data):" training_rmse = [] validation_rmse = [] for period in range (0, periods): # 按照訓(xùn)練steps進(jìn)行周期性訓(xùn)練 linear_regressor.train( input_fn=training_input_fn, steps=steps_per_period, ) # 記錄預(yù)測(cè)值(分別使用訓(xùn)練集和驗(yàn)證集) training_predictions = linear_regressor.predict(input_fn=predict_training_input_fn) training_predictions = np.array([item["predictions"][0] for item in training_predictions]) validation_predictions = linear_regressor.predict(input_fn=predict_validation_input_fn) validation_predictions = np.array([item["predictions"][0] for item in validation_predictions]) # 計(jì)算RMSE(使用訓(xùn)練值和驗(yàn)證值) training_root_mean_squared_error = math.sqrt( metrics.mean_squared_error(training_predictions, training_targets)) validation_root_mean_squared_error = math.sqrt( metrics.mean_squared_error(validation_predictions, validation_targets)) print " period %02d : %0.2f" % (period, training_root_mean_squared_error) training_rmse.append(training_root_mean_squared_error) validation_rmse.append(validation_root_mean_squared_error) print "Model training finished." plt.ylabel("RMSE") plt.xlabel("Periods") plt.title("Root Mean Squared Error vs. Periods") plt.tight_layout() plt.plot(training_rmse, label="training") plt.plot(validation_rmse, label="validation") # plt.legend()畫圖例,圖中右上角 plt.legend() return linear_regressor
訓(xùn)練...
linear_regressor = train_model( learning_rate=0.00003, steps=500, batch_size=5, training_examples=training_examples, training_targets=training_targets, validation_examples=validation_examples, validation_targets=validation_targets)
因?yàn)槭褂玫膄eatures較多,要耐心等一會(huì)兒就可以看到使用訓(xùn)練值和校驗(yàn)值的區(qū)別了,以及多特征的效果怎么樣
Training model...
RMSE (on training data):
period 00 : 217.67
period 01 : 201.13
period 02 : 186.67
period 03 : 176.46
period 04 : 170.31
period 05 : 167.41
period 06 : 166.75
period 07 : 166.49
period 08 : 167.72
period 09 : 169.76
Model training finished.
learning_rate=0.00003
要注意這是兩條線哦,還有一條是校驗(yàn)集的結(jié)果,真的是很貼合了哎,說(shuō)明模型效果挺好的
上面的learning_rate=0.00003,最終的rmse為169.76,這比上次的合成特征的高了好多,所以下面嘗試修改learning_rate
learning_rate=0.00015
learning_rate=0.005
learning_rate=0.05
我們會(huì)發(fā)現(xiàn)這次的損失函數(shù)曲線好像很復(fù)雜的樣子。。。。emmmmmmm,其實(shí)到這里,我還沒有調(diào)好,不過(guò)不管啦,下一篇我會(huì)說(shuō)明一下,多特征的時(shí)候怎么來(lái)調(diào)節(jié)超參數(shù)(其實(shí)我只是比較懶.....)
最后,再看看以學(xué)習(xí)率為0.00003訓(xùn)練出來(lái)的模型,遇到測(cè)試集的效果吧
california_housing_test_data = pd.read_csv("https://storage.googleapis.com/mledu-datasets/california_housing_test.csv", sep=",") test_examples = preprocess_features(california_housing_test_data) test_targets = preprocess_targets(california_housing_test_data) predict_test_input_fn = lambda: my_input_fn( test_examples, test_targets["median_house_value"], num_epochs=1, shuffle=False) test_predictions = linear_regressor.predict(input_fn=predict_test_input_fn) test_predictions = np.array([item["predictions"][0] for item in test_predictions]) root_mean_squared_error = math.sqrt( metrics.mean_squared_error(test_predictions, test_targets)) print "Final RMSE (on test data): %0.2f" % root_mean_squared_error
Final RMSE (on test data): 162.84
結(jié)果很接近了呢,說(shuō)明沒有過(guò)擬合。
講完。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44655.html
摘要:以用于檢測(cè)垃圾郵件的邏輯回歸模型為例。邏輯回歸的損失函數(shù)線性回歸的損失函數(shù)是平方損失。正則化在邏輯回歸建模中極其重要。 正則化:簡(jiǎn)單性 查看以下泛化曲線,該曲線顯示的是訓(xùn)練集和驗(yàn)證集相對(duì)于訓(xùn)練迭代次數(shù)的損失。 showImg(https://segmentfault.com/img/bVbahiL?w=750&h=322);上圖顯示的是某個(gè)模型的訓(xùn)練損失逐漸減少,但驗(yàn)證損失最終增加。換...
摘要:出現(xiàn)方差是正常的,但方差過(guò)高表明模型無(wú)法將其預(yù)測(cè)結(jié)果泛化到從中抽取訓(xùn)練樣本的較大母體。機(jī)器學(xué)習(xí)中的學(xué)習(xí)曲線是一種可視化圖形,能根據(jù)一系列訓(xùn)練實(shí)例中的訓(xùn)練和測(cè)試數(shù)據(jù)比較模型的指標(biāo)性能。 欠擬合(通常代表高偏差) 精度 如前所述如果模型具有足夠的數(shù)據(jù),但因不夠復(fù)雜而無(wú)法捕捉基本關(guān)系,則會(huì)出現(xiàn)偏差。這樣一來(lái),模型一直會(huì)系統(tǒng)地錯(cuò)誤表示數(shù)據(jù),從而導(dǎo)致預(yù)測(cè)精度低。這種現(xiàn)象叫做欠擬合(und...
閱讀 1207·2019-08-30 15:55
閱讀 954·2019-08-30 15:55
閱讀 2150·2019-08-30 15:44
閱讀 2879·2019-08-29 14:17
閱讀 1130·2019-08-29 12:45
閱讀 3301·2019-08-26 10:48
閱讀 3133·2019-08-23 18:18
閱讀 2599·2019-08-23 16:47