1. 程式人生 > >優達(Udacity)波士頓預測房價

優達(Udacity)波士頓預測房價

機器學習工程師納米學位

模型評價與驗證

專案 1: 預測波士頓房價

歡迎來到機器學習工程師納米學位的第一個專案!在此檔案中,有些示例程式碼已經提供給你,但你還需要實現更多的功能來讓專案成功執行。除非有明確要求,你無須修改任何已給出的程式碼。以程式設計練習開始的標題表示接下來的內容中有需要你必須實現的功能。每一部分都會有詳細的指導,需要實現的部分也會在註釋中以TODO標出。請仔細閱讀所有的提示!

除了實現程式碼外,你還必須回答一些與專案和實現有關的問題。每一個需要你回答的問題都會以‘問題 X’為標題。請仔細閱讀每個問題,並且在問題後的‘回答’文字框中寫出完整的答案。你的專案將會根據你對問題的回答和撰寫程式碼所實現的功能來進行評分。

提示:**Code 和 Markdown 區域可通過 **Shift + Enter 快捷鍵執行。此外,Markdown可以通過雙擊進入編輯模式。

第一步. 匯入資料

在這個專案中,你將利用馬薩諸塞州波士頓郊區的房屋資訊資料訓練和測試一個模型,並對模型的效能和預測能力進行測試。通過該資料訓練後的好的模型可以被用來對房屋做特定預測—尤其是對房屋的價值。對於房地產經紀等人的日常工作來說,這樣的預測模型被證明非常有價值。

此專案的資料集來自UCI機器學習知識庫(資料集已下線)。波士頓房屋這些資料於1978年開始統計,共506個數據點,涵蓋了麻省波士頓不同郊區房屋14種特徵的資訊。本專案對原始資料集做了以下處理:
- 有16個'MEDV'

值為50.0的資料點被移除。 這很可能是由於這些資料點包含遺失看不到的值
- 有1個數據點的 'RM' 值為8.78. 這是一個異常值,已經被移除。
- 對於本專案,房屋的'RM''LSTAT''PTRATIO'以及'MEDV'特徵是必要的,其餘不相關特徵已經被移除。
- 'MEDV'特徵的值已經過必要的數學轉換,可以反映35年來市場的通貨膨脹效應。

執行下面區域的程式碼以載入波士頓房屋資料集,以及一些此專案所需的Python庫。如果成功返回資料集的大小,表示資料集已載入成功。

# 載入此專案所需要的庫
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來完成此專案') # 讓結果在notebook中顯示 %matplotlib inline
# 載入波士頓房屋的資料集
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.

第二步. 分析資料

在專案的第一個部分,你會對波士頓房地產資料進行初步的觀察並給出你的分析。通過對資料的探索來熟悉資料可以讓你更好地理解和解釋你的結果。

由於這個專案的最終目標是建立一個預測房屋價值的模型,我們需要將資料集分為特徵(features)目標變數(target variable)
- 特徵 'RM''LSTAT',和 'PTRATIO',給我們提供了每個資料點的數量相關的資訊。
- 目標變數'MEDV',是我們希望預測的變數。

他們分別被存在featuresprices兩個變數名中。

程式設計練習 1:基礎統計運算

你的第一個程式設計練習是計算有關波士頓房價的描述統計資料。我們已為你匯入了numpy,你需要使用這個庫來執行必要的計算。這些統計資料對於分析模型的預測結果非常重要的。
在下面的程式碼中,你要做的是:
- 計算prices中的'MEDV'的最小值、最大值、均值、中值和標準差;
- 將運算結果儲存在相應的變數中。

#TODO 1
arrPrices = np.array(prices)
print arrPrices.max()
#目標:計算價值的最小值
minimum_price = np.min(arrPrices)

#目標:計算價值的最大值
maximum_price = np.max(arrPrices)

#目標:計算價值的平均值
mean_price = np.mean(arrPrices)

#目標:計算價值的中值
median_price = np.median(arrPrices)

#目標:計算價值的標準差
std_price = np.std(arrPrices)

#目標:輸出計算的結果
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)
1024800.0
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 - 特徵觀察

如前文所述,本專案中我們關注的是其中三個值:'RM''LSTAT''PTRATIO',對每一個數據點:
- 'RM' 是該地區中每個房屋的平均房間數量;
- 'LSTAT' 是指該地區有多少百分比的房東屬於是低收入階層(有工作但收入微薄);
- 'PTRATIO' 是該地區的中學和小學裡,學生和老師的數目比(學生/老師)。

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

提示:你預期一個'RM' 值是6的房屋跟'RM' 值是7的房屋相比,價值更高還是更低呢?

MSDV = data['MEDV']
RM = data['RM']
LSTAT = data['LSTAT']
PTRATIO = data['PTRATIO']

import matplotlib.pyplot as plt
plt.plot(RM,MSDV,'o')
plt.xlabel('RM')
plt.ylabel('MSDV')
plt.show()

plt.plot(LSTAT,MSDV,'o')
plt.xlabel('RM')
plt.ylabel('MSDV')
plt.show()

plt.plot(PTRATIO,MSDV,'o')
plt.xlabel('RM')
plt.ylabel('MSDV')
plt.show()

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

問題 1 - 回答:

  • 根據上方的圖,可以看出RM與MSDV成正相關,LSTAT與MSDV成負相關,PTRATIO和MSDV相關性並不強
  • 增大RM,MSDV增大
  • 增大LSTAT,MSDV減小
  • 增大PTRATIO,MSDV變化不確定

程式設計練習 2: 資料分割與重排

接下來,你需要把波士頓房屋資料集分成訓練和測試兩個子集。通常在這個過程中,資料也會被重排列,以消除資料集中由於順序而產生的偏差。
在下面的程式碼中,你需要

使用 sklearn.model_selection 中的 train_test_split, 將featuresprices的資料都分成用於訓練的資料子集和用於測試的資料子集。
- 分割比例為:80%的資料用於訓練,20%用於測試;
- 選定一個數值以設定 train_test_split 中的 random_state ,這會確保結果的一致性;

# TODO 2

# 提示: 匯入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=10)

問題 2 - 訓練及測試

將資料集按一定比例分為訓練用的資料集和測試用的資料集對學習演算法有什麼好處?

如果用模型已經見過的資料,例如部分訓練集資料進行測試,又有什麼壞處?

提示: 如果沒有資料來對模型進行測試,會出現什麼問題?

問題 2 - 回答:

  • 首先用訓練資料集進行訓練,保證模型的建立,然後再用測試集資料進行測試,檢視模型是否過擬合或者不夠準確,容易共同保證模型的準確
  • 模型見過的資料往往效果都會很好,掩蓋了模型的缺點,導致在預測新資料的時候很有可能準確率降低

第三步. 模型衡量標準

在專案的第三步中,你需要了解必要的工具和技巧來讓你的模型進行預測。用這些工具和技巧對每一個模型的表現做精確的衡量可以極大地增強你預測的信心。

程式設計練習3:定義衡量標準

如果不能對模型的訓練和測試的表現進行量化地評估,我們就很難衡量模型的好壞。通常我們會定義一些衡量標準,這些標準可以通過對某些誤差或者擬合程度的計算來得到。在這個專案中,你將通過運算決定係數 R2 來量化模型的表現。模型的決定係數是迴歸分析中十分常用的統計資訊,經常被當作衡量模型預測能力好壞的標準。

R2的數值範圍從0至1,表示目標變數的預測值和實際值之間的相關程度平方的百分比。一個模型的R2 值為0還不如直接用平均值來預測效果好;而一個R2 值為1的模型則可以對目標變數進行完美的預測。從0至1之間的數值,則表示該模型中目標變數中有百分之多少能夠用特徵來解釋。模型也可能出現負值的R2,這種情況下模型所做預測有時會比直接計算目標變數的平均值差很多。

在下方程式碼的 performance_metric 函式中,你要實現:
- 使用 sklearn.metrics 中的 r2_score 來計算 y_truey_predict的R2值,作為對其表現的評判。
- 將他們的表現評分儲存到score變數中。

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

# 提示: 匯入r2_score

def performance_metric(y_true, y_predict):
    """計算並返回預測值相比於預測值的分數"""
    from sklearn.metrics import r2_score
    score = r2_score(y_true, y_predict)

    return score

# TODO 3 可選
# http://blog.csdn.net/grape875499765/article/details/78631435
# 不允許匯入任何計算決定係數的庫

def performance_metric2(y_true, y_predict):
    """計算並返回預測值相比於預測值的分數"""
    import numpy as np
    arr_true = np.array(y_true)
    y_mean = np.mean(arr_true)

    ssreg = 0
    sstotal = 0
    ssres = 0
    for item in y_predict:
        ssreg += (item - y_mean)**2
    for item in y_true:
        sstotal += (item - y_mean)**2
    for index,item in enumerate(y_true):
        ssres += (item - y_predict[index])**2

    score = 1-(ssres/sstotal)

    return score

問題 3 - 擬合程度

假設一個數據集有五個資料且一個模型做出下列目標變數的預測:

真實數值 預測數值
3.0 2.5
-0.5 0.0
2.0 2.1
7.0 7.8
4.2 5.3

你覺得這個模型已成功地描述了目標變數的變化嗎?如果成功,請解釋為什麼,如果沒有,也請給出原因。

提示:執行下方的程式碼,使用performance_metric函式來計算模型的決定係數。

# 計算這個模型的預測結果的決定係數
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 - 回答:

比較成功,從R2資料計算結果來看,達到了0.923,說明誤差較小

第四步. 分析模型的表現

在專案的第四步,我們來看一下不同引數下,模型在訓練集和驗證集上的表現。這裡,我們專注於一個特定的演算法(帶剪枝的決策樹,但這並不是這個專案的重點),和這個演算法的一個引數 'max_depth'。用全部訓練集訓練,選擇不同'max_depth' 引數,觀察這一引數的變化如何影響模型的表現。畫出模型的表現來對於分析過程十分有益,這可以讓我們看到一些單看結果看不到的行為。

學習曲線

下方區域內的程式碼會輸出四幅影象,它們是一個決策樹模型在不同最大深度下的表現。每一條曲線都直觀得顯示了隨著訓練資料量的增加,模型學習曲線的在訓練集評分和驗證集評分的變化,評分使用決定係數R2。曲線的陰影區域代表的是該曲線的不確定性(用標準差衡量)。

執行下方區域中的程式碼,並利用輸出的圖形回答下面的問題。

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

這裡寫圖片描述

問題 4 - 學習曲線

選擇上述影象中的其中一個,並給出其最大深度。隨著訓練資料量的增加,訓練集曲線的評分有怎樣的變化?驗證集曲線呢?如果有更多的訓練資料,是否能有效提升模型的表現呢?

提示:學習曲線的評分是否最終會收斂到特定的值?

問題 4 - 回答:

  • max_depth = 3
  • 隨著訓練資料量的增加,訓練集曲線的評分在不斷下降,驗證集曲線評分在不斷上升
  • 如果有更多資料還會有提升,但是提升不一定很明顯

複雜度曲線

下列程式碼內的區域會輸出一幅影象,它展示了一個已經經過訓練和驗證的決策樹模型在不同最大深度條件下的表現。這個圖形將包含兩條曲線,一個是訓練集的變化,一個是驗證集的變化。跟學習曲線相似,陰影區域代表該曲線的不確定性,模型訓練和測試部分的評分都用的 performance_metric 函式。

執行下方區域中的程式碼,並利用輸出的圖形並回答下面的兩個問題。

# 根據不同的最大深度引數,生成複雜度曲線
vs.ModelComplexity(X_train, y_train)

這裡寫圖片描述

問題 5 - 偏差(bias)與方差(variance)之間的權衡取捨

當模型以最大深度 1訓練時,模型的預測是出現很大的偏差還是出現了很大的方差?當模型以最大深度10訓練時,情形又如何呢?圖形中的哪些特徵能夠支援你的結論?

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

問題 5 - 回答:

  • 最大深度為1時,出現了很大的偏差
  • 最大深度為10時,偏差和方差都不小,但是偏差優於深度為1時
  • R2越小則偏差越大,std範圍越大則方差越大

問題 6- 最優模型的猜測

結合問題 5 中的圖,你認為最大深度是多少的模型能夠最好地對未見過的資料進行預測?你得出這個答案的依據是什麼?

問題 6 - 回答:

  • 最大深度是4能夠最好的進行預測
  • 依據是當最大深度為4時,偏差最小,方差和其他差不多

第五步. 選擇最優引數

什麼是網格搜尋法?如何用它來優化模型?

問題 7 - 回答:

  • 網格搜尋法時一種通過遍歷給定的引數組合來優化模型表現的方法
  • 通過GridSearchCV窮舉提供的網格搜尋引數,根據引數不斷生成組合,最後根據結果來進行判斷選擇哪個引數

問題 8 - 交叉驗證

  • 什麼是K折交叉驗證法(k-fold cross-validation)?
  • GridSearchCV是如何結合交叉驗證來完成對最佳引數組合的選擇的?
  • GridSearchCV中的'cv_results_'屬效能告訴我們什麼?
  • 網格搜尋時如果不使用交叉驗證會有什麼問題?交叉驗證又是如何解決這個問題的?

提示: 在下面 fit_model函式最後加入 print pd.DataFrame(grid.cv_results_) 可以幫你檢視更多資訊。

問題 8 - 回答:

  • K折交叉驗證法就是將資料按照比例分成K份,每次取其中一份兒做測試集,其他的做訓練集,計算分數,將獲取到的所有分數做一個平均,就是當前模型的分數,根據模型分數來判斷當前模型的好壞
  • GridSearchCV中有一個引數叫做cv,可以構建交叉驗證物件然後傳入
  • 平均值、標準差、交叉驗證等一系列的分數和計算時間
  • 不使用交叉驗證得到的結果不如使用了有說服力,因為驗證的資料過少,交叉驗證將資料切分之後將每份兒資料都進行了驗證,所以更有說服力

程式設計練習 4:訓練最優模型

在這個練習中,你將需要將所學到的內容整合,使用決策樹演算法訓練一個模型。為了得出的是一個最優模型,你需要使用網格搜尋法訓練模型,以找到最佳的 'max_depth' 引數。你可以把'max_depth' 引數理解為決策樹演算法在做出預測前,允許其對資料提出問題的數量。決策樹是監督學習演算法中的一種。

在下方 fit_model 函式中,你需要做的是:
1. 定義 'cross_validator' 變數: 使用 sklearn.model_selection 中的 KFold 建立一個交叉驗證生成器物件;
2. 定義 'regressor' 變數: 使用 sklearn.tree 中的 DecisionTreeRegressor 建立一個決策樹的迴歸函式;
3. 定義 'params' 變數: 為 'max_depth' 引數創造一個字典,它的值是從1至10的陣列;
4. 定義 'scoring_fnc' 變數: 使用 sklearn.metrics 中的 make_scorer 建立一個評分函式;
‘performance_metric’ 作為引數傳至這個函式中;
5. 定義 'grid' 變數: 使用 sklearn.model_selection 中的 GridSearchCV 建立一個網格搜尋物件;將變數'regressor', 'params', 'scoring_fnc''cross_validator' 作為引數傳至這個物件建構函式中;

如果你對python函式的預設引數定義和傳遞不熟悉,可以參考這個MIT課程的視訊

from sklearn.model_selection import KFold,GridSearchCV
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import make_scorer

def fit_model(X, y):
    """ 基於輸入資料 [X,y],利於網格搜尋找到最優的決策樹模型"""

    cross_validator = KFold(n_splits=10)

    regressor = DecisionTreeRegressor()

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

    scoring_fnc = make_scorer(performance_metric)

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

    # 基於輸入資料 [X,y],進行網格搜尋
    grid = grid.fit(X, y)

#     import pandas as pd
#     print pd.DataFrame(grid.cv_results_)
    # 返回網格搜尋後的最優模型
    return grid.best_estimator_

程式設計練習 4:訓練最優模型 (可選)

在這個練習中,你將需要將所學到的內容整合,使用決策樹演算法訓練一個模型。為了得出的是一個最優模型,你需要使用網格搜尋法訓練模型,以找到最佳的 'max_depth' 引數。你可以把'max_depth' 引數理解為決策樹演算法在做出預測前,允許其對資料提出問題的數量。決策樹是監督學習演算法中的一種。

在下方 fit_model 函式中,你需要做的是:

  • 遍歷引數‘max_depth’的可選值 1~10,構造對應模型
  • 計算當前模型的交叉驗證分數
  • 返回最優交叉驗證分數對應的模型
# TODO 4 可選

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

提示: 你可能需要實現下面的 cross_val_score 函式

def cross_val_score(estimator, X, y, scoring = performance_metric, cv=3):
    """ 返回每組交叉驗證的模型分數的陣列 """
    scores = [0,0,0]
    return scores
'''

def fit_model2(X, y):
    """ 基於輸入資料 [X,y],利於網格搜尋找到最優的決策樹模型"""

    #最優交叉驗證分數對應的最優模型
    best_estimator = None

    return best_estimator

問題 9 - 最優模型

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

執行下方區域內的程式碼,將決策樹迴歸函式代入訓練資料的集合,以得到最優化的模型。

# 基於訓練資料,獲得最優模型
optimal_reg = fit_model(X_train, y_train)

# 輸出最優模型的 'max_depth' 引數
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 - 回答:

  • 答案是相同的,是4

第六步. 做出預測

當我們用資料訓練出一個模型,它現在就可用於對新的資料進行預測。在決策樹迴歸函式中,模型已經學會對新輸入的資料提問,並返回對目標變數的預測值。你可以用這個預測來獲取資料未知目標變數的資訊,這些資料必須是不包含在訓練資料之內的。

問題 10 - 預測銷售價格

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

特徵 客戶 1 客戶 2 客戶 3
房屋內房間總數 5 間房間 4 間房間 8 間房間
社群貧困指數(%被認為是貧困階層) 17% 32% 3%
鄰近學校的學生-老師比例 15:1 22:1 12:1

你會建議每位客戶的房屋銷售的價格為多少?從房屋特徵的數值判斷,這樣的價格合理嗎?為什麼?

提示:用你在分析資料部分計算出來的統計資訊來幫助你證明你的答案。

執行下列的程式碼區域,使用你優化的模型來為每位客戶的房屋價值做出預測。

# 生成三個客戶的資料
client_data = [[5, 17, 15], # 客戶 1
               [4, 32, 22], # 客戶 2
               [8, 3, 12]]  # 客戶 3

# 進行預測
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: $406,933.33
Predicted selling price for Client 2's home: $232,200.00
Predicted selling price for Client 3's home: $938,053.85

問題 10 - 回答:

  • Predicted selling price for Client 1’s home: $406,933.33

  • Predicted selling price for Client 2’s home: $232,200.00

  • Predicted selling price for Client 3’s home: $938,053.85

程式設計練習 5

你剛剛預測了三個客戶的房子的售價。在這個練習中,你將用你的最優模型在整個測試資料上進行預測, 並計算相對於目標變數的決定係數 R2的值**。

predict_test = optimal_reg.predict(X_test)

r2 = performance_metric(y_test,predict_test)

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

問題11 - 分析決定係數

你剛剛計算了最優模型在測試集上的決定係數,你會如何評價這個結果?

問題11 - 回答

  • 結果是0.75
  • 結果並沒有很理想,還有很大的提升空間

模型健壯性

一個最優的模型不一定是一個健壯模型。有的時候模型會過於複雜或者過於簡單,以致於難以泛化新增添的資料;有的時候模型採用的學習演算法並不適用於特定的資料結構;有的時候樣本本身可能有太多噪點或樣本過少,使得模型無法準確地預測目標變數。這些情況下我們會說模型是欠擬合的。

問題 12 - 模型健壯性

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

提示: 執行下方區域中的程式碼,採用不同的訓練和測試集執行 fit_model 函式10次。注意觀察對一個特定的客戶來說,預測是如何隨訓練資料的變化而變化的。

# 請先註釋掉 fit_model 函式裡的所有 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 - 回答:

  • 模型不夠足夠健壯性保持預測的一致性
  • 使用不同的訓練和測試集的時候,資料波動範圍不小

問題 13 - 實用性探討

簡單地討論一下你建構的模型能否在現實世界中使用?

提示:回答以下幾個問題,並給出相應結論的理由:
- 1978年所採集的資料,在已考慮通貨膨脹的前提下,在今天是否仍然適用?
- 資料中呈現的特徵是否足夠描述一個房屋?
- 在波士頓這樣的大都市採集的資料,能否應用在其它鄉鎮地區?
- 你覺得僅僅憑房屋所在社群的環境來判斷房屋價值合理嗎?

問題 13 - 回答:

  • 不一定適用,隨著時間的流逝影響因素和幾十年前肯定不完全相同
  • 不足夠,就模型的構建來看,還不夠準確
  • 不一定能應用,大都市的規劃購房都是有一定限制的,而鄉鎮地區限制就會小很多,甚至地廣人稀,隨意建房
  • 不完全合理,還需要考慮其他的因素,比如說國家政策、經濟收入等

可選問題 - 預測北京房價

(本題結果不影響專案是否通過)通過上面的實踐,相信你對機器學習的一些常用概念有了很好的領悟和掌握。但利用70年代的波士頓房價資料進行建模的確對我們來說意義不是太大。現在你可以把你上面所學應用到北京房價資料集中 bj_housing.csv

免責宣告:考慮到北京房價受到巨集觀經濟、政策調整等眾多因素的直接影響,預測結果僅供參考。

這個資料集的特徵有:
- Area:房屋面積,平方米
- Room:房間數,間
- Living: 廳數,間
- School: 是否為學區房,0或1
- Year: 房屋建造時間,年
- Floor: 房屋所處樓層,層

目標變數:
- Value: 房屋人民幣售價,萬

你可以參考上面學到的內容,拿這個資料集來練習資料分割與重排、定義衡量標準、訓練模型、評價模型表現、使用網格搜尋配合交叉驗證對引數進行調優並選出最佳引數,比較兩者的差別,最終得出最佳模型對驗證集的預測分數。

# TODO 6

# 你的程式碼

問題14 - 北京房價預測

你成功的用新的資料集構建了模型了嗎?他能對測試資料進行驗證嗎?它的表現是否符合你的預期?交叉驗證是否有助於提升你模型的表現?

提示:如果你是從零開始構建機器學習的程式碼會讓你一時覺得無從下手。這時不要著急,你要做的只是檢視之前寫的程式碼,把每一行都看明白,然後逐步構建你的模型。當中遇到什麼問題也可以在我們論壇尋找答案。也許你會發現你所構建的模型的表現並沒有達到你的預期,這說明機器學習並非是一項簡單的任務,構建一個表現良好的模型需要長時間的研究和測試。這也是我們接下來的課程中會逐漸學到的。

問題14 - 回答

相關推薦

Udacity波士頓預測房價

機器學習工程師納米學位 模型評價與驗證 專案 1: 預測波士頓房價 歡迎來到機器學習工程師納米學位的第一個專案!在此檔案中,有些示例程式碼已經提供給你,但你還需要實現更多的功能來讓專案成功執行。除非有明確要求,你無須修改任何已給出的程式碼。以程式設

學城Udacity深度學習筆記-1.Python&os學習

歡迎使用Markdown編輯器寫部落格 Python對於檔案操作非常方便,很大一部分是因為os這個庫,在做優達城深度學習作業的時候裡面有一堆os,各種列表推導式混合os.path,一下就繞暈了。這裡做點筆記,方便自己學習&複習。 如上圖,

原創競賽-關於房價預測模型的數據預分析1

ria 另一個 sns 相同 kernel fmt com image 6.5 註:該部分參考kaggle房價模型的大神Pedro Marcelino提供的kernel 在我們拿到數據後,應該預先分析一下數據。 1、總覽數據 import numpy as np impor

數學建模-預測模型搬運

pad 關系 blog 乘法 rbf 獨立 .net 測量 erl 本文內容來自:不鳴則已…… 基於數學建模的預測方法種類繁多,從經典的單耗法、彈性系數法、統計分析法,到目前的灰色預測法。當在使用相應的預測方法建立預測模型時,我們需要知道主要的一些預測方法的研究

使用三種不同的核函式迴歸對Boston房價進行預測,同時對測試資料做出預測

from sklearn.datasets import load_boston from sklearn.svm import SVR from sklearn.cross_validation import train_test_split from sklearn.m

《C Primer Plus(第6版)(中文版)》普拉作者epub+mobi+azw3

內存 處理 參考資料 預處理 表達 字符 rime 系統 位操作 內容簡介 《C Primer Plus(第6版)中文版》詳細講解了C語言的基本概念和編程技巧。 《C Primer Plus(第6版)中文版》共17章。第1、2章介紹了C語言編程的預備知識

JVM調總結-分代垃圾回收詳述

web服務器 mar you 數量 不變 all 時間 lis 完成 為什麽要分代 分代的垃圾回收策略,是基於這樣一個事實:不同的對象的生命周期是不一樣的。因此,不同生命周期的對象可以采取不同的收集方式,以便提高回收效率。 在Java程序運行的過程中,會

JVM調總結-調方法

圖片 死鎖 ron 詳細信息 ict 時間 最大 bsp 底部 JVM調優工具 Jconsole,jProfile,VisualVM Jconsole : jdk自帶,功能簡單,但是可以在系統有一定負荷的情況下使用。對垃圾回收算法有很詳細的跟蹤。詳細說明參考這裏 JP

JVM調總結-反思

pdf col 實現 aio https 重要 簡單 什麽 tps 垃圾回收的悖論 所謂“成也蕭何敗蕭何”。Java的垃圾回收確實帶來了很多好處,為開發帶來了便利。但是在一些高性能、高並發的情況下,垃圾回收確成為了制約Java應用的瓶頸。目

JVM調總結-垃圾回收面臨的問題

也會 直接 問題 行程 完成 情況 出現 基本類型 不能 如何區分垃圾 上面說到的“引用計數”法,通過統計控制生成對象和刪除對象時的引用數來判斷。垃圾回收程序收集計數為0的對象即可。但是這種方法無法解決循環引用。所以,後來實現的垃圾判斷算法

JVM調總結-基本垃圾回收算法

會有 width 順序 系統 不知道 對待 循環引用 compact 垃圾回收算法 可以從不同的的角度去劃分垃圾回收算法: 按照基本回收策略分 引用計數(Reference Counting): 比較古老的回收算法。原理是此對象有一個引用,即增加一個計數,刪除一

JVM調總結-調方法

JVM調優工具 Jconsole,jProfile,VisualVM   Jconsole : jdk自帶,功能簡單,但是可以在系統有一定負荷的情況下使用。對垃圾回收演算法有很詳細的跟蹤。詳細說明參考這裡   JProfiler:商業軟體,需要付費。

JVM調總結-分代垃圾回收詳述2

分代垃圾回收流程示意     選擇合適的垃圾收集演算法 序列收集器   用單執行緒處理所有垃圾回收工作,因為無需多執行緒互動,所以效率比較高。但是,也無法使用多處理器的優勢,所以此收集器適合單處理器機器。當然,此收集

JVM調總結-分代垃圾回收詳述1

為什麼要分代     分代的垃圾回收策略,是基於這樣一個事實:不同的物件的生命週期是不一樣的。因此,不同生命週期的物件可以採取不同的收集方式,以便提高回收效率。       在Java程式執行的過程中,會產生大量的物件

Spark之效能調總結

總結一下spark的調優方案: 一、效能調優   1、效能上的調優主要注重一下幾點:     Excutor的數量     每個Excutor所分配的CPU的數量     每個Excutor所能分配的記憶體量     Driver端分配的記憶體數量   2、如何分配資源     在生產環境中,

JVM調總結-----一些概念

Java物件的大小     基本資料的型別的大小是固定的,這裡就不多說了。對於非基本型別的Java物件,其大小就值得商榷。     在Java中,一個空Object物件的大小是8byte,這個大小隻是儲存堆中一個沒有任何屬性的物件的

MySQL調三部曲EXPLAIN

MySQL調優三部曲(二)EXPLAIN EXPLAINMySQL Query Optimizer通過執行EXPLAIN命令來告訴我們它將使用一個怎樣的執行計劃優化Query。所以,通過Explain可以幫助我們選擇更好的索引和寫出更優化的查詢語句 Explain各種資訊的解釋PS:下面列舉的例子有些是無

Ubuntu 16.04 安裝英偉Nvidia顯示卡驅動

配有英偉達顯示卡的主機,裝完 Ubuntu 16.04 後出現閃屏現象,是由於沒有安裝顯示卡驅動。 顯示卡型號 NVIDIA Corporation GM204 [GeForce GTX 970] 由於沒有顯示卡驅動,螢幕閃屏,以下安裝過程在終端模式下進行(按 Ctrl+Alt+F1 切換到

IC攻城獅求職寶典 01 2018年IC設計企業 筆試題 01 英偉Nvidia

set 電路 速度 固定 時間 企業 結構 vol 替換 1、 什麽是建立時間、保持時間,如果setup time violation或者hold time violation 應該怎麽做?(10分)答案:建立時間:是指在觸發器的時鐘信號采樣邊沿到來之前,數據保持穩定不變

Phase seperation 的無序結構域IDRs怎麼預測?

蛋白研究過程中,一般認為氨基酸的序列決定了蛋白的結構,結構決定功能(一般指蛋白的三維結構)。然而,近50年的研究中,有一種沒有特定三維結構的蛋白不斷被研究人員發現,由於這類蛋白無法摺疊成穩定的三維結構而稱為固有無序蛋白(intrinsically disordered