使用估值神器
Using the Estimator in a Real-World Program
前言叨B叨
大家上周末剁手開心哇? 來來來, 為了更開心得剁手認(rèn)真學(xué)習(xí).
本章包含以下內(nèi)容:
1. 用新的數(shù)據(jù)來估價
2. 用新的數(shù)據(jù)來訓(xùn)練分類器
3. 然后呢?
正文
1.用新的數(shù)據(jù)來估
現(xiàn)在我們已經(jīng)訓(xùn)練和測試了我們的模型,讓我們正式將其投入使用。打開make_predictions.py。在我們過這個例子的時候,你會注意到,即使這個文件包含估計房屋價值所需的所有邏輯,實際的代碼也只有幾行。這是因為所有的邏輯都已經(jīng)由機器學(xué)習(xí)算法創(chuàng)建并保存在我們的模型中了。我們只需要加載模型,傳入數(shù)據(jù)并運行。
from sklearn.externals import joblib
# Load the model we trained previously
model = joblib.load('trained_house_classifier_model.pkl')
首先,我們加載之前訓(xùn)練過的梯度增強模型。我們只是調(diào)用joblib.load并傳入文件名。接下來,我們列出了我們想要評估的特定房屋的所有屬性。
# For the house we want to value, we need to provide the features in the exact same
# arrangement as our training data set.
house_to_value = [
# House features
2006, # year_built
1, # stories
4, # num_bedrooms
3, # full_bathrooms
0, # half_bathrooms
2200, # livable_sqft
2350, # total_sqft
...
True, # has_central_heating
True, # has_central_cooling
# Garage type: Choose only one
0, # attached
0, # detached
1, # none
# City: Choose only one
0, # Amystad
1, # Brownport
0, # Chadstad
0, # Clarkberg
...
0, # West Gregoryview
0, # West Lydia
0 # West Terrence
]
# scikit-learn assumes you want to predict the values for lots of houses at once, so it expects an array.
# We just want to look at a single house, so it will be the only item in our array.
homes_to_value = [
house_to_value
]
我們需要按照與我們用來訓(xùn)練模型的訓(xùn)練數(shù)據(jù)完全相同的順序創(chuàng)建一個具有相同特征的數(shù)組。這意味著這里的數(shù)據(jù)需要反映我們所做的任何特征工程(feature engineering )變更。所以我們刪除的字段和我們用one-hot編碼添加的字段在這里反映出來。我已經(jīng)提前定義了2006年建造的一個假想房屋的所有參數(shù),包括它的基本特征,車庫的類型以及它所在的城市。接下來,我們需要創(chuàng)建一系列的房屋值。 Scikit-learn假定你想要一次對多個項目進行預(yù)測,所以它期望一系列的房屋價值。
由于我們現(xiàn)在只想給一個房子估價,所以我們只創(chuàng)建了一組值house_to_value,然后放入這個homes_to_value數(shù)組。為了預(yù)測數(shù)據(jù),我們調(diào)用model.predict并傳入特征數(shù)組。
# Run the model and make a prediction for each house in the homes_to_value array
predicted_home_values = model.predict(homes_to_value)
# Since we are only predicting the price of one house, just look at the first prediction returned
predicted_value = predicted_home_values[0]
print("This house has an estimated value of ${:,.2f}".format(predicted_value))
結(jié)果是一個包含每個房屋的價格預(yù)測的數(shù)組。由于我們剛剛只傳入了一個房子的信息,所以只需要拿第一個索引的值然后打印。
對于這個房子,它預(yù)測587,000美元的價格。但是,讓我們看看如果我們改變一些特征值會發(fā)生什么。
現(xiàn)在讓我們來回顧一下2006年到1973年建成的一年。現(xiàn)在讓我們重新運行它,看看如何改變價值。右鍵單擊運行,現(xiàn)在我們可以看到價值下降到$ 454,000。看起來房子齡很重要。現(xiàn)在如果我們改變一些其他的屬性呢?如果我們說這個房子有一個附加的車庫,現(xiàn)在讓我們重新運行它,看看如何改變價值。現(xiàn)在價值達(dá)到了49萬美元。
那城市呢?讓我們改變房子的城市,重新運行。現(xiàn)在房子的價值大幅下降到386,000美元。看起來地理位置很重要。您可以嘗試自己調(diào)整這些值,看看它是如何影響最終價格的。現(xiàn)在我們有一個完整的工作體系。如果我們用一個很好的用戶界面來替換這個腳本,我們會有一個非常酷的真實產(chǎn)品。
2.用新的數(shù)據(jù)來訓(xùn)練分類器
我們剛剛完成了建立和使用機器學(xué)習(xí)模型。恭喜!但請記住,我們的機器學(xué)習(xí)模型只與我們所使用的數(shù)據(jù)匹配。由于房價總是在變化,隨著市場的變化,這個模型很快就會過時。所以當(dāng)?shù)讓訑?shù)據(jù)發(fā)生變化時,我們需要重新訓(xùn)練模型。我們可以使用之前使用的trainmodel.py文件重新訓(xùn)練我們的模型。我們只需要提供一個更新的數(shù)據(jù)集與更近的房屋銷售數(shù)據(jù)。
讓我們來看看。首先,我們在用原始數(shù)據(jù)集訓(xùn)練估計器時得到的準(zhǔn)確性結(jié)果。測試集的錯誤是$ 59,000左右。讓我們看看當(dāng)我們用更新的數(shù)據(jù)集重新訓(xùn)練模型時會發(fā)生什么。現(xiàn)在,讓我們改變我們正在使用的數(shù)據(jù)集。我們只需要更新我們正在加載的數(shù)據(jù)文件的名稱。我提供了第二個數(shù)據(jù)文件叫做ml_house_data_set_updated.csv。這個數(shù)據(jù)集已經(jīng)更新了房價。讓我們重新運行腳本,看看我們用這個數(shù)據(jù)集得到的結(jié)果。執(zhí)行了這個數(shù)據(jù)集,測試錯誤就更高了。大概是63,000美元。如果我們回頭看,以前只有59,000美元。這是一個約4000美元的錯誤增加。
在現(xiàn)實世界的系統(tǒng)中,對天氣或交通等頻繁變化的事物進行建模,通常會建立一個自動化的訓(xùn)練流程然后定期運行,如每天或每周。這使得系統(tǒng)隨著數(shù)據(jù)的變化而保持最新。但在更換舊模型之前,檢查新模型的準(zhǔn)確性是非常重要的。
有時訓(xùn)練數(shù)據(jù)變化很大,以至于舊的模型不再有效。您的自動化訓(xùn)練過程應(yīng)檢查新模型的錯誤率,并提醒您在新模型執(zhí)行得有問題的時候進行干預(yù)。
3.然后呢?
我建議大家嘗試使用自己的數(shù)據(jù)覆蓋的概念。 之后,您可以嘗試使用本課程中使用的梯度增強算法之外的不同機器學(xué)習(xí)算法。 支持向量回歸機是另一個可以在scikit-learn中進行實驗的流行算法。 如果您將機器學(xué)習(xí)用于解決大規(guī)模問題,則可以嘗試xgboost庫。 Xgboost是Python和其他幾種編程語言的附加庫,它提供了梯度提升的快速實現(xiàn),可以在多臺計算機上分布。 最后,無論您使用哪種編程語言,本課程中的所有基本概念都適用于任何機器學(xué)習(xí)庫或工具包。
Amazon AWS和Microsoft Azure等云服務(wù)提供商現(xiàn)在提供機器學(xué)習(xí)工具,可以讓您在云中構(gòu)建模型。
結(jié)語
自此, 機器學(xué)習(xí)與人工智能基礎(chǔ):價值估算就全部講完, 之后我會物色更多的相關(guān)教程, 敬請期待!
你的 關(guān)注-收藏-轉(zhuǎn)發(fā) 是我繼續(xù)分享的動力!