波士頓房價(jià)預(yù)測

本內(nèi)容為Udacity課程波士頓房價(jià)預(yù)測項(xiàng)目,歡迎閱讀,有錯(cuò)的地方請留言。僅參考不建議作為其他用途。

優(yōu)達(dá)學(xué)城畢業(yè)項(xiàng)目Github地址: Kaggle貓狗大戰(zhàn)準(zhǔn)確率Top 2%webapp部署 如果對你有幫助歡迎 Star 或者 Fork
機(jī)器學(xué)習(xí)深度學(xué)習(xí)面試題總結(jié):機(jī)器學(xué)習(xí)深度學(xué)習(xí)面試題總結(jié)


第一步. 導(dǎo)入數(shù)據(jù)

在這個(gè)項(xiàng)目中,你將利用馬薩諸塞州波士頓郊區(qū)的房屋信息數(shù)據(jù)訓(xùn)練和測試一個(gè)模型,并對模型的性能和預(yù)測能力進(jìn)行測試。通過該數(shù)據(jù)訓(xùn)練后的好的模型可以被用來對房屋做特定預(yù)測---尤其是對房屋的價(jià)值。對于房地產(chǎn)經(jīng)紀(jì)等人的日常工作來說,這樣的預(yù)測模型被證明非常有價(jià)值。

此項(xiàng)目的數(shù)據(jù)集來自UCI機(jī)器學(xué)習(xí)知識庫(數(shù)據(jù)集已下線)。波士頓房屋這些數(shù)據(jù)于1978年開始統(tǒng)計(jì),共506個(gè)數(shù)據(jù)點(diǎn),涵蓋了麻省波士頓不同郊區(qū)房屋14種特征的信息。本項(xiàng)目對原始數(shù)據(jù)集做了以下處理:

  • 有16個(gè)'MEDV' 值為50.0的數(shù)據(jù)點(diǎn)被移除。 這很可能是由于這些數(shù)據(jù)點(diǎn)包含遺失看不到的值
  • 有1個(gè)數(shù)據(jù)點(diǎn)的 'RM' 值為8.78. 這是一個(gè)異常值,已經(jīng)被移除。
  • 對于本項(xiàng)目,房屋的'RM''LSTAT''PTRATIO'以及'MEDV'特征是必要的,其余不相關(guān)特征已經(jīng)被移除。
  • 'MEDV'特征的值已經(jīng)過必要的數(shù)學(xué)轉(zhuǎn)換,可以反映35年來市場的通貨膨脹效應(yīng)。

運(yùn)行下面區(qū)域的代碼以載入波士頓房屋數(shù)據(jù)集,以及一些此項(xiàng)目所需的Python庫。如果成功返回?cái)?shù)據(jù)集的大小,表示數(shù)據(jù)集已載入成功。

# 載入此項(xiàng)目所需要的庫
import numpy as np
import pandas as pd
import visuals as vs # Supplementary code

# 檢查你的Python版本
from sys import version_info
if version_info.major != 2 and version_info.minor != 7:
    raise Exception('請使用Python 2.7來完成此項(xiàng)目')
    
# 讓結(jié)果在notebook中顯示
%matplotlib inline
# 載入波士頓房屋的數(shù)據(jù)集
data = pd.read_csv('housing.csv')
prices = data['MEDV']
features = data.drop('MEDV', axis = 1)
    
# 完成
print "Boston housing dataset has {} data points with {} variables each.".format(*data.shape)
Boston housing dataset has 489 data points with 4 variables each.

第二步. 分析數(shù)據(jù)

在項(xiàng)目的第一個(gè)部分,你會對波士頓房地產(chǎn)數(shù)據(jù)進(jìn)行初步的觀察并給出你的分析。通過對數(shù)據(jù)的探索來熟悉數(shù)據(jù)可以讓你更好地理解和解釋你的結(jié)果。

由于這個(gè)項(xiàng)目的最終目標(biāo)是建立一個(gè)預(yù)測房屋價(jià)值的模型,我們需要將數(shù)據(jù)集分為特征(features)目標(biāo)變量(target variable)

  • 特征 'RM''LSTAT',和 'PTRATIO',給我們提供了每個(gè)數(shù)據(jù)點(diǎn)的數(shù)量相關(guān)的信息。
  • 目標(biāo)變量'MEDV',是我們希望預(yù)測的變量。

他們分別被存在featuresprices兩個(gè)變量名中。

編程練習(xí) 1:基礎(chǔ)統(tǒng)計(jì)運(yùn)算

你的第一個(gè)編程練習(xí)是計(jì)算有關(guān)波士頓房價(jià)的描述統(tǒng)計(jì)數(shù)據(jù)。我們已為你導(dǎo)入了numpy,你需要使用這個(gè)庫來執(zhí)行必要的計(jì)算。這些統(tǒng)計(jì)數(shù)據(jù)對于分析模型的預(yù)測結(jié)果非常重要的。
在下面的代碼中,你要做的是:

  • 計(jì)算prices中的'MEDV'的最小值、最大值、均值、中值和標(biāo)準(zhǔn)差;
  • 將運(yùn)算結(jié)果儲存在相應(yīng)的變量中。

std(標(biāo)準(zhǔn)差)在Numpy與Pandas中的不同

#TODO 1

#目標(biāo):計(jì)算價(jià)值的最小值
minimum_price = np.min(prices)

#目標(biāo):計(jì)算價(jià)值的最大值
maximum_price = np.max(prices)

#目標(biāo):計(jì)算價(jià)值的平均值
mean_price = np.mean(prices)

#目標(biāo):計(jì)算價(jià)值的中值
median_price = np.median(prices)

#目標(biāo):計(jì)算價(jià)值的標(biāo)準(zhǔn)差
std_price = np.std(prices)

#目標(biāo):輸出計(jì)算的結(jié)果
print "Statistics for Boston housing dataset:\n"
print "Minimum price: ${:,.2f}".format(minimum_price)
print "Maximum price: ${:,.2f}".format(maximum_price)
print "Mean price: ${:,.2f}".format(mean_price)
print "Median price ${:,.2f}".format(median_price)
print "Standard deviation of prices: ${:,.2f}".format(std_price)
Statistics for Boston housing dataset:

Minimum price: $105,000.00
Maximum price: $1,024,800.00
Mean price: $454,342.94
Median price $438,900.00
Standard deviation of prices: $165,171.13

問題 1 - 特征觀察

如前文所述,本項(xiàng)目中我們關(guān)注的是其中三個(gè)值:'RM''LSTAT''PTRATIO',對每一個(gè)數(shù)據(jù)點(diǎn):

  • 'RM' 是該地區(qū)中每個(gè)房屋的平均房間數(shù)量;
  • 'LSTAT' 是指該地區(qū)有多少百分比的業(yè)主屬于是低收入階層(有工作但收入微薄);
  • 'PTRATIO' 是該地區(qū)的中學(xué)和小學(xué)里,學(xué)生和老師的數(shù)目比(學(xué)生/老師)。

憑直覺,上述三個(gè)特征中對每一個(gè)來說,你認(rèn)為增大該特征的數(shù)值,'MEDV'的值會是增大還是減小呢?每一個(gè)答案都需要你給出理由。

提示:你預(yù)期一個(gè)'RM' 值是6的房屋跟'RM' 值是7的房屋相比,價(jià)值更高還是更低呢?

問題 1 - 回答:

# 載入畫圖所需要的庫 matplotlib
import matplotlib.pyplot as plt

# 使輸出的圖像以更高清的方式顯示
%config InlineBackend.figure_format = 'retina'

# 調(diào)整圖像的寬高
plt.figure(figsize=(16, 4))
for i, key in enumerate(['RM', 'LSTAT', 'PTRATIO']):
    plt.subplot(1, 3, i+1)
    plt.xlabel(key)
    plt.scatter(data[key], data['MEDV'], alpha=0.5)

對以上三個(gè)特征預(yù)期估計(jì):

  1. 增大 'RM' 值,'MEDV' 的值會增大。一般房間數(shù)多的房屋面積要大一些,所以價(jià)格會比房間數(shù)小的房屋貴

  2. 增大 'LSTAT' 值,'MEDV' 的值會減小。如果低收入階層比率越大相對購買貴的房屋的能力就可能會下降

  3. 增大 'PTRATIO' 值,'MEDV' 的值會增大。'PTRATIO' 為學(xué)生和老師的數(shù)目比,如果 'PTRATIO' 增大說明當(dāng)?shù)貙W(xué)生教育投入很大,為了孩子教育這樣可能會吸引更多的家長在該地區(qū)購買房屋,供應(yīng)量達(dá)不到需求量的時(shí)候房屋價(jià)格上漲是正常的

從上圖中我們可以看出,雖然 'PTRATIO' 與 'MEDV' 沒有像 'RM'、'LSTAT'那么強(qiáng)的相關(guān)性,但是更傾向于 'PTRATIO' 增大 'MEDV' 減小,可能的原因是在美國較好的學(xué)校會有低的學(xué)生老師比,這也是教育資源和教學(xué)質(zhì)量的保證

編程練習(xí) 2: 數(shù)據(jù)分割與重排

接下來,你需要把波士頓房屋數(shù)據(jù)集分成訓(xùn)練和測試兩個(gè)子集。通常在這個(gè)過程中,數(shù)據(jù)也會被重排列,以消除數(shù)據(jù)集中由于順序而產(chǎn)生的偏差。
在下面的代碼中,你需要

使用 sklearn.model_selection 中的 train_test_split, 將featuresprices的數(shù)據(jù)都分成用于訓(xùn)練的數(shù)據(jù)子集和用于測試的數(shù)據(jù)子集。

  • 分割比例為:80%的數(shù)據(jù)用于訓(xùn)練,20%用于測試;
  • 選定一個(gè)數(shù)值以設(shè)定 train_test_split 中的 random_state ,這會確保結(jié)果的一致性;
# TODO 2

# 提示: 導(dǎo)入train_test_split
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(features, prices, test_size=0.2, random_state=1)

問題 2 - 訓(xùn)練及測試

將數(shù)據(jù)集按一定比例分為訓(xùn)練用的數(shù)據(jù)集和測試用的數(shù)據(jù)集對學(xué)習(xí)算法有什么好處?

如果用模型已經(jīng)見過的數(shù)據(jù),例如部分訓(xùn)練集數(shù)據(jù)進(jìn)行測試,又有什么壞處?

提示: 如果沒有數(shù)據(jù)來對模型進(jìn)行測試,會出現(xiàn)什么問題?

問題 2 - 回答:

訓(xùn)練集(train set)、 驗(yàn)證集(validation set) 、測試集(test set)

  1. 將數(shù)據(jù)集按照一定比例分為訓(xùn)練集和測試集的好處是:訓(xùn)練集用來估計(jì)模型,測試集檢驗(yàn)最終選擇最優(yōu)模型的性能如何

  2. 用部分見過的數(shù)據(jù)測試不能很好的體現(xiàn)模型的準(zhǔn)確性,測試模型目的是為了驗(yàn)證由訓(xùn)練集構(gòu)建的模型的合理性、表現(xiàn)如何。模型擬合訓(xùn)練使用的是訓(xùn)練集數(shù)據(jù),所得到的模型也是依賴訓(xùn)練集數(shù)據(jù)而構(gòu)建的,如果再用部分訓(xùn)練集數(shù)據(jù)進(jìn)行測試,則結(jié)果不具有代表性,不能很好的得到我們預(yù)期的結(jié)果。

review: 機(jī)器學(xué)習(xí)的核心目的就是構(gòu)建具有泛化能力的模型,如果沒有測試集,或者用模型已經(jīng)見過的數(shù)據(jù)來測試,都無法確切知道模型對預(yù)測未知數(shù)據(jù)的表現(xiàn)如何,也就無法衡量模型表現(xiàn)。


第三步. 模型衡量標(biāo)準(zhǔn)

在項(xiàng)目的第三步中,你需要了解必要的工具和技巧來讓你的模型進(jìn)行預(yù)測。用這些工具和技巧對每一個(gè)模型的表現(xiàn)做精確的衡量可以極大地增強(qiáng)你預(yù)測的信心。

編程練習(xí)3:定義衡量標(biāo)準(zhǔn)

如果不能對模型的訓(xùn)練和測試的表現(xiàn)進(jìn)行量化地評估,我們就很難衡量模型的好壞。通常我們會定義一些衡量標(biāo)準(zhǔn),這些標(biāo)準(zhǔn)可以通過對某些誤差或者擬合程度的計(jì)算來得到。在這個(gè)項(xiàng)目中,你將通過運(yùn)算決定系數(shù) R2 來量化模型的表現(xiàn)。模型的決定系數(shù)是回歸分析中十分常用的統(tǒng)計(jì)信息,經(jīng)常被當(dāng)作衡量模型預(yù)測能力好壞的標(biāo)準(zhǔn)。

R2的數(shù)值范圍從0至1,表示目標(biāo)變量的預(yù)測值和實(shí)際值之間的相關(guān)程度平方的百分比。一個(gè)模型的R2 值為0還不如直接用平均值來預(yù)測效果好;而一個(gè)R2 值為1的模型則可以對目標(biāo)變量進(jìn)行完美的預(yù)測。從0至1之間的數(shù)值,則表示該模型中目標(biāo)變量中有百分之多少能夠用特征來解釋。模型也可能出現(xiàn)負(fù)值的R2,這種情況下模型所做預(yù)測有時(shí)會比直接計(jì)算目標(biāo)變量的平均值差很多。

在下方代碼的 performance_metric 函數(shù)中,你要實(shí)現(xiàn):

  • 使用 sklearn.metrics 中的 r2_score 來計(jì)算 y_truey_predict的R2值,作為對其表現(xiàn)的評判。
  • 將他們的表現(xiàn)評分儲存到score變量中。

  • (可選) 不使用任何外部庫,參考決定系數(shù)的定義進(jìn)行計(jì)算,這也可以幫助你更好的理解決定系數(shù)在什么情況下等于0或等于1。
# TODO 3

# 提示: 導(dǎo)入r2_score
from sklearn.metrics import r2_score

def performance_metric(y_true, y_predict):
    """計(jì)算并返回預(yù)測值相比于預(yù)測值的分?jǐn)?shù)"""
    
    score = r2_score(y_true, y_predict)

    return score
# TODO 3 可選

# 不允許導(dǎo)入任何計(jì)算決定系數(shù)的庫

def performance_metric2(y_true, y_predict):
    """計(jì)算并返回預(yù)測值相比于預(yù)測值的分?jǐn)?shù)"""
    y_true = np.array(y_true)
    y_predict = np.array(y_predict)
    
    score = 1 - np.divide(sum([np.square(x[0] - x[1]) for x in zip(y_true, y_predict)]),
                          sum([np.square(x - np.mean(y_true)) for x in y_true]))

    return score

問題 3 - 擬合程度

假設(shè)一個(gè)數(shù)據(jù)集有五個(gè)數(shù)據(jù)且一個(gè)模型做出下列目標(biāo)變量的預(yù)測:

真實(shí)數(shù)值 預(yù)測數(shù)值
3.0 2.5
-0.5 0.0
2.0 2.1
7.0 7.8
4.2 5.3

你覺得這個(gè)模型已成功地描述了目標(biāo)變量的變化嗎?如果成功,請解釋為什么,如果沒有,也請給出原因。

提示:運(yùn)行下方的代碼,使用performance_metric函數(shù)來計(jì)算模型的決定系數(shù)。

# 計(jì)算這個(gè)模型的預(yù)測結(jié)果的決定系數(shù)
score = performance_metric([3, -0.5, 2, 7, 4.2], [2.5, 0.0, 2.1, 7.8, 5.3])
print "Model has a coefficient of determination, R^2, of {:.3f}.".format(score)
Model has a coefficient of determination, R^2, of 0.923.

問題 3 - 回答:

  1. 從上邊的運(yùn)算結(jié)果來看 R^2 值為 0.923 已經(jīng)很接近 1 ,這個(gè)結(jié)果可以說是比較成功的描述了目標(biāo)變量的變化。

review: R^2 是評價(jià)模型表現(xiàn)的方法之一,每個(gè)機(jī)器學(xué)習(xí)模型的建立都要有相對應(yīng)的評價(jià)指標(biāo),后面我們會學(xué)到更多的評價(jià)指標(biāo)。不過 R^2 其實(shí)也有很多局限性需要注意

可汗學(xué)院對此也有很精彩的講解

skearn 對于常見的模型表現(xiàn)衡量方法也有詳細(xì)的介紹


第四步. 分析模型的表現(xiàn)

在項(xiàng)目的第四步,我們來看一下不同參數(shù)下,模型在訓(xùn)練集和驗(yàn)證集上的表現(xiàn)。這里,我們專注于一個(gè)特定的算法(帶剪枝的決策樹,但這并不是這個(gè)項(xiàng)目的重點(diǎn)),和這個(gè)算法的一個(gè)參數(shù) 'max_depth'。用全部訓(xùn)練集訓(xùn)練,選擇不同'max_depth' 參數(shù),觀察這一參數(shù)的變化如何影響模型的表現(xiàn)。畫出模型的表現(xiàn)來對于分析過程十分有益,這可以讓我們看到一些單看結(jié)果看不到的行為。

學(xué)習(xí)曲線

下方區(qū)域內(nèi)的代碼會輸出四幅圖像,它們是一個(gè)決策樹模型在不同最大深度下的表現(xiàn)。每一條曲線都直觀得顯示了隨著訓(xùn)練數(shù)據(jù)量的增加,模型學(xué)習(xí)曲線的在訓(xùn)練集評分和驗(yàn)證集評分的變化,評分使用決定系數(shù)R2。曲線的陰影區(qū)域代表的是該曲線的不確定性(用標(biāo)準(zhǔn)差衡量)。

運(yùn)行下方區(qū)域中的代碼,并利用輸出的圖形回答下面的問題。

# 根據(jù)不同的訓(xùn)練集大小,和最大深度,生成學(xué)習(xí)曲線
vs.ModelLearning(X_train, y_train)

問題 4 - 學(xué)習(xí)曲線

選擇上述圖像中的其中一個(gè),并給出其最大深度。隨著訓(xùn)練數(shù)據(jù)量的增加,訓(xùn)練集曲線的評分有怎樣的變化?驗(yàn)證集曲線呢?如果有更多的訓(xùn)練數(shù)據(jù),是否能有效提升模型的表現(xiàn)呢?

提示:學(xué)習(xí)曲線的評分是否最終會收斂到特定的值?

問題 4 - 回答:

參考文獻(xiàn)

  1. max_depth = 1 圖:隨著訓(xùn)練數(shù)據(jù)增加,在訓(xùn)練數(shù)據(jù)低于 50 的時(shí)候訓(xùn)練集曲線隨數(shù)據(jù)增加下降的很快,驗(yàn)證集曲線隨數(shù)據(jù)增加迅速上升,訓(xùn)練數(shù)據(jù)大于 50 的時(shí)候訓(xùn)練集曲線和驗(yàn)證集曲線下降和上升緩慢呈現(xiàn)收斂的狀態(tài),訓(xùn)練集數(shù)據(jù)達(dá)到 300 的時(shí)候訓(xùn)練集 R^2 分?jǐn)?shù)和驗(yàn)證集 R^2 分?jǐn)?shù)比較接近,訓(xùn)練集和驗(yàn)證集的分?jǐn)?shù)收斂但是很低,為高偏差,很可能是欠擬合,此時(shí)通過增加數(shù)據(jù)量是不能有效提升模型表現(xiàn)

  2. max_depth = 10 圖:隨著訓(xùn)練數(shù)據(jù)增加,在訓(xùn)練數(shù)據(jù)低于 50 的時(shí)候訓(xùn)練集曲線變化不明顯,驗(yàn)證集曲線隨數(shù)據(jù)增加迅速上升,訓(xùn)練集數(shù)據(jù)大于 50 的時(shí)候,訓(xùn)練集曲線變化不明顯,驗(yàn)證集曲線呈現(xiàn)緩慢上升。訓(xùn)練數(shù)據(jù)達(dá)到 300 的時(shí)候訓(xùn)練集 R^2 分?jǐn)?shù)和驗(yàn)證集 R^2 分?jǐn)?shù)相差太大,為高方差,一般是過擬合。增大訓(xùn)練集數(shù)據(jù)可以有效的提升模型的表現(xiàn)

  3. max_depth = 3 圖:是比較理想的曲線,收斂且 R^2 分?jǐn)?shù)很高

review 批注:在傳統(tǒng)機(jī)器學(xué)習(xí)方法中,當(dāng)模型學(xué)習(xí)到一定程度以后,增大訓(xùn)練數(shù)據(jù)是很難有提升的,但是在深度學(xué)習(xí)中往往是一種有效的方法。

review: 對訓(xùn)練曲線和測試曲線趨勢和意義解釋的很好。這里隨著數(shù)據(jù)的增多,max_depth 不變的情況下,模型提升的幅度也越來越小。

這里還有更多關(guān)于學(xué)習(xí)曲線的介紹:

https://www.coursera.org/learn/machine-learning/lecture/Kont7/learning-curves

http://scikit-learn.org/stable/auto_examples/model_selection/plot_learning_curve.html

復(fù)雜度曲線

下列代碼內(nèi)的區(qū)域會輸出一幅圖像,它展示了一個(gè)已經(jīng)經(jīng)過訓(xùn)練和驗(yàn)證的決策樹模型在不同最大深度條件下的表現(xiàn)。這個(gè)圖形將包含兩條曲線,一個(gè)是訓(xùn)練集的變化,一個(gè)是驗(yàn)證集的變化。跟學(xué)習(xí)曲線相似,陰影區(qū)域代表該曲線的不確定性,模型訓(xùn)練和測試部分的評分都用的 performance_metric 函數(shù)。

運(yùn)行下方區(qū)域中的代碼,并利用輸出的圖形并回答下面的兩個(gè)問題。

# 根據(jù)不同的最大深度參數(shù),生成復(fù)雜度曲線
vs.ModelComplexity(X_train, y_train)

問題 5 - 偏差(bias)與方差(variance)之間的權(quán)衡取舍

當(dāng)模型以最大深度 1訓(xùn)練時(shí),模型的預(yù)測是出現(xiàn)很大的偏差還是出現(xiàn)了很大的方差?當(dāng)模型以最大深度10訓(xùn)練時(shí),情形又如何呢?圖形中的哪些特征能夠支持你的結(jié)論?

提示: 你如何得知模型是否出現(xiàn)了偏差很大或者方差很大的問題?

問題 5 - 回答:

  1. 當(dāng)模型以最大深度 1 訓(xùn)練時(shí),模型的預(yù)測出現(xiàn)了很大的偏差,圖中訓(xùn)練集 R^2 分?jǐn)?shù)和驗(yàn)證集 R^2 分?jǐn)?shù)在最大深度為 1 時(shí)的值可以說明,欠擬合,曲線收斂且分?jǐn)?shù)值很低

  2. 當(dāng)模型以最大深度 10 訓(xùn)練時(shí),模型的預(yù)測出現(xiàn)了很大的方差,圖中訓(xùn)練集 R^2 分?jǐn)?shù)和驗(yàn)證集 R^2 分?jǐn)?shù)在最大深度為 1 時(shí)的值可以說明,過擬合,曲線間的距離很大

review 批注:高偏差通常是由于模型太簡單(即模型欠擬合),不能很好的擬合測試集,訓(xùn)練分?jǐn)?shù)、驗(yàn)證分?jǐn)?shù)、測試分?jǐn)?shù)通常都比較低;高方差通常是由于模型過于復(fù)雜(即模型過擬合),模型在訓(xùn)練集上表現(xiàn)得很好,在驗(yàn)證集和測試集上得分確比較低,泛化能力差。

review: 借用西瓜書上的比喻,用機(jī)器學(xué)習(xí)來判斷一個(gè)物體是不是樹葉,underfitting 是以為所有綠色的都是樹葉(沒學(xué)會該學(xué)的);overfitting 是以為樹葉都要有鋸齒(學(xué)過頭了,不該學(xué)的也學(xué)了進(jìn)去)。這兩者都不是我們想要的。

維基百科對此也有詳細(xì)的解釋 https://en.wikipedia.org/wiki/Bias%E2%80%93variance_tradeoff

華盛頓大學(xué)機(jī)器學(xué)習(xí)的課程詳細(xì)講了這個(gè)問題,你可以免費(fèi)觀看。 https://www.coursera.org/learn/ml-regression/home/week/3

sklearn 也有對 validation curve的介紹:http://scikit-learn.org/stable/modules/learning_curve.html

問題 6- 最優(yōu)模型的猜測

結(jié)合問題 5 中的圖,你認(rèn)為最大深度是多少的模型能夠最好地對未見過的數(shù)據(jù)進(jìn)行預(yù)測?你得出這個(gè)答案的依據(jù)是什么?

問題 6 - 回答:

  1. 最大深度大概為 4 時(shí),模型能夠很好的對未見過的數(shù)據(jù)進(jìn)行預(yù)測,因?yàn)樵谧畲笊疃葹?4 時(shí),訓(xùn)練集曲線和驗(yàn)證集曲線收斂明顯且兩曲線對應(yīng)的 R^2 分?jǐn)?shù)較高

第五步. 選擇最優(yōu)參數(shù)

問題 7- 網(wǎng)格搜索(Grid Search)

什么是網(wǎng)格搜索法?如何用它來優(yōu)化模型?

問題 7 - 回答:

網(wǎng)格搜索算法與K折交叉驗(yàn)證

【scikit-learn】網(wǎng)格搜索來進(jìn)行高效的參數(shù)調(diào)優(yōu)

網(wǎng)格搜索法是指定參數(shù)值的一種窮舉搜索方法,通過將估計(jì)函數(shù)的參數(shù)通過交叉驗(yàn)證的方法進(jìn)行優(yōu)化來得到最優(yōu)的學(xué)習(xí)算法。 即,將各個(gè)參數(shù)可能的取值進(jìn)行排列組合,列出所有可能的組合結(jié)果生成“網(wǎng)格”。然后將各組合用于 SVM 訓(xùn)練,并使用交叉驗(yàn)證對表現(xiàn)進(jìn)行評估。在擬合函數(shù)嘗試了所有的參數(shù)組合后,返回一個(gè)合適的分類器,自動(dòng)調(diào)整至最佳參數(shù)組合,可以通過 clf.best_params_ 獲得參數(shù)值

網(wǎng)格搜索是根據(jù)給定的模型自動(dòng)進(jìn)行交叉驗(yàn)證,通過調(diào)節(jié)每一個(gè)參數(shù)來跟蹤評分結(jié)果。

如果使用決策樹訓(xùn)練模型,通常選擇參數(shù)是決策樹的最大深度,在定義最大深度的值時(shí)要盡可能的包含最優(yōu)最大深度。

可以通過字典來提供分類器或回歸器的類型對象。字典的鍵我們將要調(diào)整的參數(shù),而字典的值就是需要嘗試的參數(shù)值的相應(yīng)列表。

以決策樹為例:每個(gè)最大深度決策樹驗(yàn)證分?jǐn)?shù)使用交叉驗(yàn)證評估得到,然后對所有最大深度的決策樹最終驗(yàn)證分?jǐn)?shù)進(jìn)行比較,分?jǐn)?shù)最高的哪一個(gè)就是最優(yōu)最大深度。

review: GridSearch就是把給定超參數(shù)下所有可能的組合都試一遍,通過指定的評價(jià)函數(shù)找出最優(yōu)。

同時(shí)還要注意,這里的最優(yōu)也是我們給定超參數(shù)范圍,給定 Kfold(如果使用)的K下的最優(yōu)。超參數(shù)空間變化和K取值的變化都會引起結(jié)果不同,所以即使是GridSearch,也無法保證是絕對最優(yōu)。

問題 8 - 交叉驗(yàn)證

  • 什么是K折交叉驗(yàn)證法(k-fold cross-validation)?
  • GridSearchCV是如何結(jié)合交叉驗(yàn)證來完成對最佳參數(shù)組合的選擇的?
  • GridSearchCV中的'cv_results_'屬性能告訴我們什么?
  • 網(wǎng)格搜索時(shí)如果不使用交叉驗(yàn)證會有什么問題?交叉驗(yàn)證又是如何解決這個(gè)問題的?

提示: 在下面 fit_model函數(shù)最后加入 print pd.DataFrame(grid.cv_results_) 可以幫你查看更多信息。

問題 8 - 回答:

  • K 折交叉驗(yàn)證是將訓(xùn)練集的所有數(shù)據(jù)分為 K 份(通常選擇 K = 10),取第 K 份作為驗(yàn)證集,驗(yàn)證集的作用是:確定網(wǎng)絡(luò)結(jié)構(gòu)或者控制模型復(fù)雜度的參數(shù),剩下的 K-1 份作為交叉驗(yàn)證的訓(xùn)練集

  • GridSearchCV 對每一個(gè)參數(shù)組合進(jìn)行一次 K 折交叉驗(yàn)證,得到對應(yīng)的平均分?jǐn)?shù);最后選擇平均分?jǐn)?shù)最高的參數(shù)組合作為模型的最優(yōu)參數(shù)組合,可通過 best_params_ 屬性獲得該參數(shù)組合

  • cv_results 屬性返回一個(gè)字典,記錄了每一組網(wǎng)格參數(shù)每一次訓(xùn)練/驗(yàn)證( K 折對應(yīng) K 次)對應(yīng)的訓(xùn)練結(jié)果,包括訓(xùn)練/驗(yàn)證時(shí)間、訓(xùn)練/驗(yàn)證評估分?jǐn)?shù)以及相關(guān)時(shí)間和評分的統(tǒng)計(jì)信息

  • 網(wǎng)格搜索不使用交叉驗(yàn)證,可以使訓(xùn)練速度更快,但可能難以得到最優(yōu)的模型參數(shù);交叉驗(yàn)證對每一個(gè)參數(shù)組合得出的評分更為準(zhǔn)確和魯棒,可以提高評估的穩(wěn)定性

review: 對于網(wǎng)格搜索來說,使用交叉驗(yàn)證的評估結(jié)果更準(zhǔn)確,因?yàn)椴皇褂媒徊骝?yàn)證,訓(xùn)練數(shù)據(jù)可以按一定比例分為訓(xùn)練集和驗(yàn)證集。我們可以用這個(gè)訓(xùn)練集訓(xùn)練不同(參數(shù))的模型,在驗(yàn)證集上跑分。選出最佳參數(shù)組合。但這樣只是這一次劃分驗(yàn)證集上表現(xiàn)最好的參數(shù),如果驗(yàn)證集不具代表性。就會影響模型在未知數(shù)據(jù)上的表現(xiàn)。而交叉驗(yàn)證很大程度上避免因樣本劃分不合理導(dǎo)致選擇了錯(cuò)誤的參數(shù)。

編程練習(xí) 4:訓(xùn)練最優(yōu)模型

在這個(gè)練習(xí)中,你將需要將所學(xué)到的內(nèi)容整合,使用決策樹算法訓(xùn)練一個(gè)模型。為了得出的是一個(gè)最優(yōu)模型,你需要使用網(wǎng)格搜索法訓(xùn)練模型,以找到最佳的 'max_depth' 參數(shù)。你可以把'max_depth' 參數(shù)理解為決策樹算法在做出預(yù)測前,允許其對數(shù)據(jù)提出問題的數(shù)量。決策樹是監(jiān)督學(xué)習(xí)算法中的一種。

在下方 fit_model 函數(shù)中,你需要做的是:

  1. 定義 'cross_validator' 變量: 使用 sklearn.model_selection 中的 KFold 創(chuàng)建一個(gè)交叉驗(yàn)證生成器對象;
  2. 定義 'regressor' 變量: 使用 sklearn.tree 中的 DecisionTreeRegressor 創(chuàng)建一個(gè)決策樹的回歸函數(shù);
  3. 定義 'params' 變量: 為 'max_depth' 參數(shù)創(chuàng)造一個(gè)字典,它的值是從1至10的數(shù)組;
  4. 定義 'scoring_fnc' 變量: 使用 sklearn.metrics 中的 make_scorer 創(chuàng)建一個(gè)評分函數(shù);
    ‘performance_metric’ 作為參數(shù)傳至這個(gè)函數(shù)中;
  5. 定義 'grid' 變量: 使用 sklearn.model_selection 中的 GridSearchCV 創(chuàng)建一個(gè)網(wǎng)格搜索對象;將變量'regressor', 'params', 'scoring_fnc''cross_validator' 作為參數(shù)傳至這個(gè)對象構(gòu)造函數(shù)中;

如果你對python函數(shù)的默認(rèn)參數(shù)定義和傳遞不熟悉,可以參考這個(gè)MIT課程的視頻

# TODO 4

#提示: 導(dǎo)入 'KFold' 'DecisionTreeRegressor' 'make_scorer' 'GridSearchCV' 
from sklearn.model_selection import KFold
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import make_scorer
from sklearn.model_selection import GridSearchCV

def fit_model(X, y):
    """ 基于輸入數(shù)據(jù) [X,y],利于網(wǎng)格搜索找到最優(yōu)的決策樹模型"""
    
    cross_validator = KFold(n_splits=10, random_state=1, shuffle=True)
    
    regressor = DecisionTreeRegressor()

    params = { 'max_depth': range(1,11) }

    scoring_fnc = make_scorer(performance_metric)

    grid = GridSearchCV(regressor, params, scoring=scoring_fnc, cv=cross_validator)

    # 基于輸入數(shù)據(jù) [X,y],進(jìn)行網(wǎng)格搜索
    grid = grid.fit(X, y)
    
    #print pd.DataFrame(grid.cv_results_)

    # 返回網(wǎng)格搜索后的最優(yōu)模型
    return grid.best_estimator_

編程練習(xí) 4:訓(xùn)練最優(yōu)模型 (可選)

在這個(gè)練習(xí)中,你將需要將所學(xué)到的內(nèi)容整合,使用決策樹算法訓(xùn)練一個(gè)模型。為了得出的是一個(gè)最優(yōu)模型,你需要使用網(wǎng)格搜索法訓(xùn)練模型,以找到最佳的 'max_depth' 參數(shù)。你可以把'max_depth' 參數(shù)理解為決策樹算法在做出預(yù)測前,允許其對數(shù)據(jù)提出問題的數(shù)量。決策樹是監(jiān)督學(xué)習(xí)算法中的一種。

在下方 fit_model 函數(shù)中,你需要做的是:

  • 遍歷參數(shù)‘max_depth’的可選值 1~10,構(gòu)造對應(yīng)模型
  • 計(jì)算當(dāng)前模型的交叉驗(yàn)證分?jǐn)?shù)
  • 返回最優(yōu)交叉驗(yàn)證分?jǐn)?shù)對應(yīng)的模型
# TODO 4 可選

'''
不允許使用 DecisionTreeRegressor 以外的任何 sklearn 庫

提示: 你可能需要實(shí)現(xiàn)下面的 cross_val_score 函數(shù)

def cross_val_score(estimator, X, y, scoring = performance_metric, cv=3):
    """ 返回每組交叉驗(yàn)證的模型分?jǐn)?shù)的數(shù)組 """
    scores = [0,0,0]
    return scores
'''

def fit_model2(X, y):
    """ 基于輸入數(shù)據(jù) [X,y],利于網(wǎng)格搜索找到最優(yōu)的決策樹模型"""
    
    #最優(yōu)交叉驗(yàn)證分?jǐn)?shù)對應(yīng)的最優(yōu)模型
    best_estimator = None
    
    return best_estimator

問題 9 - 最優(yōu)模型

最優(yōu)模型的最大深度(maximum depth)是多少?此答案與你在問題 6所做的猜測是否相同?

運(yùn)行下方區(qū)域內(nèi)的代碼,將決策樹回歸函數(shù)代入訓(xùn)練數(shù)據(jù)的集合,以得到最優(yōu)化的模型。

# 基于訓(xùn)練數(shù)據(jù),獲得最優(yōu)模型
optimal_reg = fit_model(X_train, y_train)

# 輸出最優(yōu)模型的 'max_depth' 參數(shù)
print "Parameter 'max_depth' is {} for the optimal model.".format(optimal_reg.get_params()['max_depth'])
Parameter 'max_depth' is 4 for the optimal model.

問題 9 - 回答:

  1. 最優(yōu)模型的最大深度為 4,與問題 6 中猜測相同

review: 這里返回的最佳參數(shù)的值,會隨著 random_state 在 train_test_split, Kfold (如果設(shè)置shuffle=True) 和 DecisionTreeRegressor 中的取值變化而變化。要得到一致結(jié)果,每個(gè)隨機(jī)數(shù)都需要設(shè)定。

第六步. 做出預(yù)測

當(dāng)我們用數(shù)據(jù)訓(xùn)練出一個(gè)模型,它現(xiàn)在就可用于對新的數(shù)據(jù)進(jìn)行預(yù)測。在決策樹回歸函數(shù)中,模型已經(jīng)學(xué)會對新輸入的數(shù)據(jù)提問,并返回對目標(biāo)變量的預(yù)測值。你可以用這個(gè)預(yù)測來獲取數(shù)據(jù)未知目標(biāo)變量的信息,這些數(shù)據(jù)必須是不包含在訓(xùn)練數(shù)據(jù)之內(nèi)的。

問題 10 - 預(yù)測銷售價(jià)格

想像你是一個(gè)在波士頓地區(qū)的房屋經(jīng)紀(jì)人,并期待使用此模型以幫助你的客戶評估他們想出售的房屋。你已經(jīng)從你的三個(gè)客戶收集到以下的資訊:

特征 客戶 1 客戶 2 客戶 3
房屋內(nèi)房間總數(shù) 5 間房間 4 間房間 8 間房間
社區(qū)貧困指數(shù)(%被認(rèn)為是貧困階層) 17% 32% 3%
鄰近學(xué)校的學(xué)生-老師比例 15:1 22:1 12:1

你會建議每位客戶的房屋銷售的價(jià)格為多少?從房屋特征的數(shù)值判斷,這樣的價(jià)格合理嗎?為什么?

提示:用你在分析數(shù)據(jù)部分計(jì)算出來的統(tǒng)計(jì)信息來幫助你證明你的答案。

運(yùn)行下列的代碼區(qū)域,使用你優(yōu)化的模型來為每位客戶的房屋價(jià)值做出預(yù)測。

# 生成三個(gè)客戶的數(shù)據(jù)
client_data = [[5, 17, 15], # 客戶 1
               [4, 32, 22], # 客戶 2
               [8, 3, 12]]  # 客戶 3

# 進(jìn)行預(yù)測
predicted_price = optimal_reg.predict(client_data)
for i, price in enumerate(predicted_price):
    print "Predicted selling price for Client {}'s home: ${:,.2f}".format(i+1, price)
Predicted selling price for Client 1's home: $411,417.39
Predicted selling price for Client 2's home: $230,828.57
Predicted selling price for Client 3's home: $937,230.00

問題 10 - 回答:

  1. 建議客戶 1 的房屋銷售價(jià)格為:$411,417.39

  2. 建議客戶 2 的房屋銷售價(jià)格為:$230,828.57

  3. 建議客戶 3 的房屋銷售價(jià)格為:$937,230.00

  4. 根據(jù)三位客戶的房屋特征來分析:

    客戶 3 的房間數(shù)為 8,房間最多,且社區(qū)的貧困指數(shù)在三位客戶中最低,說明購買房屋的能力高,學(xué)生老師的比例小,可以說明當(dāng)?shù)貙逃耐度胼^大。所以價(jià)格高于其他兩位客戶是正常的。根據(jù)問題 1 中的預(yù)測可以說明符合預(yù)期預(yù)測

    客戶 2 的房屋特征與其他兩位客戶房屋特征相比,房間數(shù)最少,且社區(qū)貧困指數(shù)最大,學(xué)生老師的比例最大,所以房屋價(jià)低于其他兩位客戶是正常的。

    客戶 1 的房屋特征介于客戶 2 和客戶 3 之間,所以房屋價(jià)格介于客戶2 房屋價(jià)格和客戶 3 房屋價(jià)格之間是正常的

review: 這里我們可以根據(jù)房子的特征來做橫向比較;也可以與數(shù)據(jù)集中特征相近的房子做縱向比較。最終還可以跟統(tǒng)計(jì)數(shù)據(jù)中的最大值,最小值,均值等做比較。

編程練習(xí) 5

你剛剛預(yù)測了三個(gè)客戶的房子的售價(jià)。在這個(gè)練習(xí)中,你將用你的最優(yōu)模型在整個(gè)測試數(shù)據(jù)上進(jìn)行預(yù)測, 并計(jì)算相對于目標(biāo)變量的決定系數(shù) R2的值**。

#TODO 5

# 提示:你可能需要用到 X_test, y_test, optimal_reg, performance_metric
# 提示:你可能需要參考問題10的代碼進(jìn)行預(yù)測
# 提示:你可能需要參考問題3的代碼來計(jì)算R^2的值

predicted_price = optimal_reg.predict(X_test)

r2 = performance_metric(y_test, predicted_price)

print "Optimal model has R^2 score {:,.2f} on test data".format(r2)
Optimal model has R^2 score 0.78 on test data

問題11 - 分析決定系數(shù)

你剛剛計(jì)算了最優(yōu)模型在測試集上的決定系數(shù),你會如何評價(jià)這個(gè)結(jié)果?

問題11 - 回答

決定系數(shù)

  1. 此模型計(jì)算相對于目標(biāo)變量的決定系數(shù) R^2 的是為:0.78。這個(gè)值說明模型有一定的參考性,在實(shí)際中可能會有些偏差。

模型健壯性

一個(gè)最優(yōu)的模型不一定是一個(gè)健壯模型。有的時(shí)候模型會過于復(fù)雜或者過于簡單,以致于難以泛化新增添的數(shù)據(jù);有的時(shí)候模型采用的學(xué)習(xí)算法并不適用于特定的數(shù)據(jù)結(jié)構(gòu);有的時(shí)候樣本本身可能有太多噪點(diǎn)或樣本過少,使得模型無法準(zhǔn)確地預(yù)測目標(biāo)變量。這些情況下我們會說模型是欠擬合的。

問題 12 - 模型健壯性

模型是否足夠健壯來保證預(yù)測的一致性?

提示: 執(zhí)行下方區(qū)域中的代碼,采用不同的訓(xùn)練和測試集執(zhí)行 fit_model 函數(shù)10次。注意觀察對一個(gè)特定的客戶來說,預(yù)測是如何隨訓(xùn)練數(shù)據(jù)的變化而變化的。

# 請先注釋掉 fit_model 函數(shù)里的所有 print 語句
vs.PredictTrials(features, prices, fit_model, client_data)
Trial 1: $391,183.33
Trial 2: $411,417.39
Trial 3: $415,800.00
Trial 4: $420,622.22
Trial 5: $418,377.27
Trial 6: $411,931.58
Trial 7: $399,663.16
Trial 8: $407,232.00
Trial 9: $402,531.82
Trial 10: $413,700.00

Range in prices: $29,438.89

問題 12 - 回答:

  1. 對于模型來說以上 10 次訓(xùn)練數(shù)據(jù)的變化價(jià)格差值范圍大概為 $29,438.89 左右,這個(gè)范圍有些大,說明模型的健壯性不是很好。

review: 關(guān)于敏感性分析更多的知識可以參考 https://en.wikipedia.org/wiki/Sensitivity_analysis

問題 13 - 實(shí)用性探討

簡單地討論一下你建構(gòu)的模型能否在現(xiàn)實(shí)世界中使用?

提示:回答以下幾個(gè)問題,并給出相應(yīng)結(jié)論的理由:

  • 1978年所采集的數(shù)據(jù),在已考慮通貨膨脹的前提下,在今天是否仍然適用?
  • 數(shù)據(jù)中呈現(xiàn)的特征是否足夠描述一個(gè)房屋?
  • 在波士頓這樣的大都市采集的數(shù)據(jù),能否應(yīng)用在其它鄉(xiāng)鎮(zhèn)地區(qū)?
  • 你覺得僅僅憑房屋所在社區(qū)的環(huán)境來判斷房屋價(jià)值合理嗎?

問題 13 - 回答:

以上構(gòu)建的模型不能在現(xiàn)實(shí)世界中使用,理由如下:

review 提示:'MEDV'特征的值已經(jīng)過必要的數(shù)學(xué)轉(zhuǎn)換,可以反映35年來市場的通貨膨脹效應(yīng)。
?

  • 1978年到現(xiàn)今時(shí)間跨度太大,消費(fèi)水平的差異、購房側(cè)重點(diǎn)的不同、經(jīng)濟(jì)條件的差異等等諸多的原因影響,所以訓(xùn)練出的模型已經(jīng)無法預(yù)測如今市場房屋價(jià)值

  • 數(shù)據(jù)中呈現(xiàn)的特征不能足夠的描述一個(gè)房屋,如今購房要求比較高,關(guān)注的更多的是房屋的地理位置,周邊環(huán)境,如學(xué)校、醫(yī)院、交通等

  • 在波士頓這樣的大都市采集的數(shù)據(jù)不能應(yīng)用于其他鄉(xiāng)鎮(zhèn)地區(qū),如今消費(fèi)觀、經(jīng)濟(jì)條件、購房的側(cè)重點(diǎn)、以及其他情況不同區(qū)域的人都有不同的側(cè)重點(diǎn)

  • 僅僅憑房屋所在社區(qū)的環(huán)境來判斷房屋價(jià)值不合理,房屋的價(jià)值不僅僅與房屋所在社區(qū)的環(huán)境有關(guān),其他的一些因素:如房屋在社區(qū)的位置、房屋的樓層高低、房屋的建造成本、空間大小等都會影響房屋價(jià)值

可選問題 - 預(yù)測北京房價(jià)

(本題結(jié)果不影響項(xiàng)目是否通過)通過上面的實(shí)踐,相信你對機(jī)器學(xué)習(xí)的一些常用概念有了很好的領(lǐng)悟和掌握。但利用70年代的波士頓房價(jià)數(shù)據(jù)進(jìn)行建模的確對我們來說意義不是太大。現(xiàn)在你可以把你上面所學(xué)應(yīng)用到北京房價(jià)數(shù)據(jù)集中 bj_housing.csv

免責(zé)聲明:考慮到北京房價(jià)受到宏觀經(jīng)濟(jì)、政策調(diào)整等眾多因素的直接影響,預(yù)測結(jié)果僅供參考。

這個(gè)數(shù)據(jù)集的特征有:

  • Area:房屋面積,平方米
  • Room:房間數(shù),間
  • Living: 廳數(shù),間
  • School: 是否為學(xué)區(qū)房,0或1
  • Year: 房屋建造時(shí)間,年
  • Floor: 房屋所處樓層,層

目標(biāo)變量:

  • Value: 房屋人民幣售價(jià),萬

你可以參考上面學(xué)到的內(nèi)容,拿這個(gè)數(shù)據(jù)集來練習(xí)數(shù)據(jù)分割與重排、定義衡量標(biāo)準(zhǔn)、訓(xùn)練模型、評價(jià)模型表現(xiàn)、使用網(wǎng)格搜索配合交叉驗(yàn)證對參數(shù)進(jìn)行調(diào)優(yōu)并選出最佳參數(shù),比較兩者的差別,最終得出最佳模型對驗(yàn)證集的預(yù)測分?jǐn)?shù)。

# TODO 6

# 你的代碼

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
from sklearn.model_selection import KFold
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import make_scorer
from sklearn.model_selection import GridSearchCV

%matplotlib inline
# 載入北京房屋的數(shù)據(jù)集
data = pd.read_csv('bj_housing.csv')
prices = data['Value']
features = data.drop('Value', axis = 1)

print "Beijing housing dataset has {} data points with {} variables each.".format(*data.shape)
Beijing housing dataset has 9999 data points with 7 variables each.
# 數(shù)據(jù)分割與重排
X_train, X_test, y_train, y_test = train_test_split(features, prices, test_size=0.2, random_state=30)
# 決定系數(shù)計(jì)算
def performance_metric(y_true, y_predict):
    score = r2_score(y_true, y_predict)
    return score
# 訓(xùn)練最優(yōu)模型
def fit_model(X, y):
    cross_validator = KFold(n_splits=10, random_state=1, shuffle=True)
    
    regressor = DecisionTreeRegressor()
    
    params = { 'max_depth': range(1,11) }

    scoring_fnc = make_scorer(performance_metric)

    grid = GridSearchCV(regressor, params, scoring=scoring_fnc, cv=cross_validator)

    # 基于輸入數(shù)據(jù) [X,y],進(jìn)行網(wǎng)格搜索
    grid = grid.fit(X, y)

    # 返回網(wǎng)格搜索后的最優(yōu)模型
    return grid.best_estimator_
# 基于訓(xùn)練數(shù)據(jù),獲得最優(yōu)模型
optimal_reg = fit_model(X_train, y_train)

# 輸出最優(yōu)模型的 'max_depth' 參數(shù)
print "Parameter 'max_depth' is {} for the optimal model.".format(optimal_reg.get_params()['max_depth'])
Parameter 'max_depth' is 4 for the optimal model.
# 計(jì)算相對于目標(biāo)變量的決定系數(shù) R2的值
predicted_price = optimal_reg.predict(X_test)

r2 = performance_metric(y_test, predicted_price)

print "Optimal model has R^2 score {:,.2f} on test data".format(r2)
Optimal model has R^2 score 0.75 on test data

問題14 - 北京房價(jià)預(yù)測

你成功的用新的數(shù)據(jù)集構(gòu)建了模型了嗎?他能對測試數(shù)據(jù)進(jìn)行驗(yàn)證嗎?它的表現(xiàn)是否符合你的預(yù)期?交叉驗(yàn)證是否有助于提升你模型的表現(xiàn)?

提示:如果你是從零開始構(gòu)建機(jī)器學(xué)習(xí)的代碼會讓你一時(shí)覺得無從下手。這時(shí)不要著急,你要做的只是查看之前寫的代碼,把每一行都看明白,然后逐步構(gòu)建你的模型。當(dāng)中遇到什么問題也可以在我們論壇尋找答案。也許你會發(fā)現(xiàn)你所構(gòu)建的模型的表現(xiàn)并沒有達(dá)到你的預(yù)期,這說明機(jī)器學(xué)習(xí)并非是一項(xiàng)簡單的任務(wù),構(gòu)建一個(gè)表現(xiàn)良好的模型需要長時(shí)間的研究和測試。這也是我們接下來的課程中會逐漸學(xué)到的。

問題14 - 回答

使用北京房屋數(shù)據(jù)集成功構(gòu)建了模型,并成功對測試數(shù)據(jù)集進(jìn)行了驗(yàn)證,模型大體符合預(yù)期,交叉驗(yàn)證可以提升模型的表現(xiàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容