本篇中將分4步介紹一個簡單的決策樹預測模型的構建過程,讓你對建模過程有初步瞭解。
1. 選擇數據集
你的數據集中變量太多了,讓人摸不着頭腦,即便是打印出來也看不清楚。怎樣才能把這些龐大的數據集簡化爲能看得懂的東西呢?
在這篇中我們先依據直覺選擇幾個變量。稍後的篇章中將介紹如何利用統計類技巧優化變量。
爲了挑選一些特徵變量,我們先要看一下數據集中有哪些字段。通過DataFrame的columns屬性來查看即可,代碼如下所示:
import pandas as pd
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path)
melbourne_data.columns
返回的結果爲:
Melbourne數據集中有一些缺失值,即有一些房子的特徵值沒有被記錄。在後面的章節中將介紹如何處理缺失值,此處我們採取最簡單的操作,即剔除數據中的缺失值。代碼如下所示:
melbourne_data = melbourne_data.dropna(axis=0)
需要注意的是參數:axis=0表示的是刪除含有缺失值的行記錄。
選擇數據子集的方法有多種,通常使用的是以下兩種操作:
- 點操作,可以用來選擇目標變量
- 列表操作,用來選擇特徵變量
2. 選擇預測目標變量
你可以使用點操作來提取變量。一個單一的數據列被存儲在一種叫Series的結構中,Series結構與DataFrame類似,你可以將其理解爲一種特殊的,只有一列數據的Dataframe。
我們將利用點操作來選擇即將要預測的數據列,即預測目標。一般來說,預測目標變量被稱爲y。因此利用以下代碼來將Melbourne數據集中的房價預測字段存儲在變量y中。
y = melbourne_data.Price
3. 選擇特徵變量
這些被輸入到模型中用來實現預測的變量就叫做“特徵”。在我們的案例中,被用來預測房價的數據列就是特徵。有些時候,你可以將數據集中除了預測目標之外的數據列都作爲特徵,而有些時候可能使用較少一些的特徵,模型表現的會更好。
這次,我們只選擇幾個特徵來構建模型。稍後,你將學習如何選用不同的特徵進行模型的迭代。
以下代碼中,我們將通過在一個方括號裏輸入多個列名的方式提供多個特徵值。
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude']
通常來說,選定的特徵變量集被記爲X。如下所示:
X = melbourne_data[melbourne_features]
接下來我們通過describe方法和head方法來快速瀏覽以下特徵變量中的數據,如下所示:
X.describe()
X.head()
使用這些命令來目視檢查數據是數據科學家工作的重要組成部分,在檢查數據集時可能會發現驚喜。
4. 構建模型
你將利用scikit-learn庫來創建模型。在編碼過程中,這個庫通常被簡寫爲sklearn,如以下代碼中所示。Scikit-learn是對存儲在Dataframe中的數據進行建模的簡單常用工具庫。
構建和使用模型一般分爲4步:
- 定義模型:搞清楚要使用什麼類型的模型,是一個決策樹模型還是其他模型?模型中的參數如何配置?
- 擬合模型:捕獲數據集中所包含的模式,這一步是建模的核心步驟。
- 預測:利用模型來輸出預測結果
- 模型評價:評價模型預測結果的好與差。
代碼如下所示:
from sklearn.tree import DecisionTreeRegressor
# 定義一個決策樹模型,設置隨機參數
melbourne_model = DecisionTreeRegressor(random_state=1)
# 擬合模型
melbourne_model.fit(X, y)
許多機器學習模型在模型訓練時都是具有隨機性的。對參數random_state賦予一個特定的值可以讓模型每次運行的結果都是一致的。這被認爲是一種很好的做法。你可以對它賦予任何數值,因爲無論你選擇什麼數值,都不會對模型的質量產生本質影響。
通過以上我們已經擬合好了一個模型,可以直接用來預測。
在實踐中,你將用模型來預測市場上新的房子的價格,而不是用來預測那些我們已經知道它價格的房子。以下對訓練數據中前幾行數據的預測,只是爲了讓你看一下模型是如何工作的。
print("Making predictions for the following 5 houses:")
print(X.head())
print("The predictions are")
print(melbourne_model.predict(X.head()))
至此,一個完整的建模過程就完成了。下次再見。