Kaggle競賽入門:決策樹演算法的Python實現
本文翻譯自kaggle learn,也就是kaggle官方最快入門kaggle競賽的教程,強調python程式設計實踐和數學思想(而沒有涉及數學細節),筆者在不影響演算法和程式理解的基礎上刪除了一些不必要的廢話,畢竟英文有的時候比較囉嗦。
一.決策樹演算法基本原理
背景:假設你的哥哥是一個投資房地產的大佬,投資地產賺了很多錢,你的哥哥準備和你合作,因為你擁有機器學習的知識可以幫助他預測房價。你去問你的哥哥他是如何預測房價的,他告訴你說他完全是依靠直覺,但是你經過調查研究發現他預測房價是根據房價以往的表現來進行預測的,作為一個機器學習程式設計者,正好也可以以往的房價進行未來房價的預測。機器學習當中有一個決策樹的演算法,可以用於未來房價的預測,這個模型是這樣的,如下所示:
第一行的第一框表示程式的流程圖:"如果房子裡超過了2個臥室"則執行yes,不是的話則執行“No”,執行yes之後,我們就對它進行預測後的房價是188000刀,執行“no”之後的預測房價則是178000刀,這就是一個簡單的決策樹。一個條件只有是和否兩個分支,但是能不能讓這個模型更加合理一點呢?因此我們擬合出了第二個模型,如下圖所示:
可以從中看到,除了考慮房子裡擁有的房間數量,第二個statement(條件)還考慮到了房子的總面積是多大,接著再根據房間的總面積大小進行預測。得到預測的房價也就是prediccted price,我們將其命名為:“leaf”,中文也就是樹葉的意思。這就是決策樹演算法的基本原理了!如果你想深挖其中的數學原理的話,我們將會在後面的章節當中講解到。
二.使用Pandas來處理你的資料
pandas是Python程式裡面的一個包,常常用於資料缺失值的處理和資料的清理,也用於匯入資料。我們在Python當中匯入這個包的程式碼如下:
import pandas as pd
在pandas當中最重要的部分就是DataFrame這個資料結構,這個資料結構將你匯入的資料全部變成一張表的形式,學習過R語言的同學應該很清楚這是什麼,沒有學過的話你就把它當成一個類似EXCEL表格的東西就可以了,我們可以用pandas像EXCEL表格一樣來處理資料。你使用pandas也是主要是使用DataFrame這個資料結構。假設你想要匯入墨爾本的房價CSV資料到pandas當中,這個CSV檔案的路徑如下所示:
../input/melbourne-housing-snapshot/melb_data.csv
我們匯入資料到pandas當中的程式碼如下:
# save filepath to variable for easier access melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv' # read the data and store data in DataFrame titled melbourne_data melbourne_data = pd.read_csv(melbourne_file_path) # print a summary of the data in Melbourne data melbourne_data.describe()
輸出:
可以看到我們利用describe()函式將資料的各個屬性輸出得完完整整,包括資料出現的次數,平均值mean,標準差std,最小值min,最大值max,四分位數25%,75%。以及中位數50%。
三.為決策樹模型選擇資料
在一個數據集當中有大量的變數,如何才能夠簡化這些資料,讓我們該選擇哪些變數呢?
在這裡我們暫時依靠直覺來選擇變數,在我們後面的章節當中將會介紹統計學裡的方法來選擇這些變數。為了在pandas裡面選擇這些變數,我們需要選擇一列一列的資料,而不是一行一行的資料,因為每一列代表一個不同的變數,比如price,rooms等,剛剛才已經使用descibe函式對這些變數進行展示了。我們來看看剛剛匯入的墨爾本房產房產的資料一共有哪些變數,程式碼如下所示:
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
輸出:
Index(['Suburb', 'Address', 'Rooms', 'Type', 'Price', 'Method', 'SellerG', 'Date', 'Distance', 'Postcode', 'Bedroom2', 'Bathroom', 'Car', 'Landsize', 'BuildingArea', 'YearBuilt', 'CouncilArea', 'Lattitude', 'Longtitude', 'Regionname', 'Propertycount'], dtype='object')
在這個墨爾本房產資料集當中,有些資料已經缺失了,我們會在後面的章節當中介紹如何處理缺失資料,也就是進行資料的清理,現在我們進行下一步:
四.選擇要進行預測的目標資料
很顯然我們需要預測的是房價,在pandas當中,一個單列儲存在一個數據結構:“Series”當中,就類似於DataFrame只有一列一樣。我們將需要預測的變數命名為y,並將資料集裡面的價格賦值給它,程式碼如下所示:
y = melbourne_data.Price
五.選擇特徵進行預測價格
我們僅選取幾個特徵進行資料的預測,程式碼如下:
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude']
在傳統情況下,通常將這些資料命名為X,因為需要預測的值才是y,這樣和統計學當中的x和y正好相對應,命名為x的程式碼如下:
X = melbourne_data[melbourne_features]
現在讓我們用之前的describe()方法快速審計一下這些資料大概長什麼樣:
X.describe()
輸出:
用head方法來檢視前6行資料,和R語言的語法一模一樣:
X.head()
輸出:
六.擬合決策樹模型
終於,資料準備完畢,我們來到了最激動人心的一步了!擬合決策樹模型,在擬合決策樹模型當中,我們會用到:scikit-learn 這個Python庫,在擬合模型的時候我們需要如下這幾步:
1.選擇需要的是哪一個演算法
2.模型的擬合(fit)
3.模型的預測(predict)
4模型的評估(Evaluate)
下面是我們擬合模型時所用到的程式碼,首先導包準備資料並選擇決策樹演算法:
from sklearn.tree import DecisionTreeRegressor # Define model. Specify a number for random_state to ensure same results each run melbourne_model = DecisionTreeRegressor(random_state=1) # Fit model melbourne_model.fit(X, y)
輸出:
DecisionTreeRegressor(criterion='mse', max_depth=None, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=1, splitter='best')
現在我們的模型已經擬合完畢了,資料也已經全部完成了計算,我們一般情況下會使用除開我們資料集之外的房產的資料來預測房價,但我們這裡為了看看模型擬合得是否好,就直接選取X當中的前五行資料,用預測資料和實際資料進行比對,程式碼如下:
print("Making predictions for the following 5 houses:") print(X.head()) print("The predictions are") print(melbourne_model.predict(X.head()))
輸出的預測結果如下:
Making predictions for the following 5 houses: Rooms Bathroom Landsize Lattitude Longtitude 1 2 1.0 156.0 -37.8079 144.9934 2 3 2.0 134.0 -37.8093 144.9944 4 4 1.0 120.0 -37.8072 144.9941 6 3 2.0 245.0 -37.8024 144.9993 7 2 1.0 256.0 -37.8060 144.9954 The predictions are [1035000. 1465000. 1600000. 1876000. 1636000.]
這就是我們實現的第一個決策樹演算法模型