本文翻譯自kaggle learn,也就是kaggle官方最快入門kaggle競賽的教程,強調python編程實踐和數學思想(而沒有涉及數學細節),筆者在不影響算法和程序理解的基礎上刪除了一些沒必要要的廢話,畢竟英文有的時候比較囉嗦。node
背景:假設你的哥哥是一個投資房地產的大佬,投資地產賺了不少錢,你的哥哥準備和你合做,由於你擁有機器學習的知識能夠幫助他預測房價。你去問你的哥哥他是如何預測房價的,他告訴你說他徹底是依靠直覺,可是你通過調查研究發現他預測房價是根據房價以往的表現來進行預測的,做爲一個機器學習編程者,正好也能夠以往的房價進行將來房價的預測。機器學習當中有一個決策樹的算法,能夠用於將來房價的預測,這個模型是這樣的,以下所示:python
第一行的第一框表示程序的流程圖:"若是房子裏超過了2個臥室"則執行yes,不是的話則執行「No」,執行yes以後,咱們就對它進行預測後的房價是188000刀,執行「no」以後的預測房價則是178000刀,這就是一個簡單的決策樹。一個條件只有是和否兩個分支,可是能不能讓這個模型更加合理一點呢?所以咱們擬合出了第二個模型,以下圖所示:算法
能夠從中看到,除了考慮房子裏擁有的房間數量,第二個statement(條件)還考慮到了房子的總面積是多大,接着再根據房間的總面積大小進行預測。獲得預測的房價也就是prediccted price,咱們將其命名爲:「leaf」,中文也就是樹葉的意思。這就是決策樹算法的基本原理了!若是你想深挖其中的數學原理的話,咱們將會在後面的章節當中講解到。編程
pandas是Python程序裏面的一個包,經常用於數據缺失值的處理和數據的清理,也用於導入數據。咱們在Python當中導入這個包的代碼以下:數據結構
import pandas as pd
在pandas當中最重要的部分就是DataFrame這個數據結構,這個數據結構將你導入的數據所有變成一張表的形式,學習過R語言的同窗應該很清楚這是什麼,沒有學過的話你就把它當成一個相似EXCEL表格的東西就能夠了,咱們能夠用pandas像EXCEL表格同樣來處理數據。你使用pandas也是主要是使用DataFrame這個數據結構。假設你想要導入墨爾本的房價CSV數據到pandas當中,這個CSV文件的路徑以下所示:dom
../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%。學習
在一個數據集當中有大量的變量,如何纔可以簡化這些數據,讓咱們該選擇哪些變量呢?ui
在這裏咱們暫時依靠直覺來選擇變量,在咱們後面的章節當中將會介紹統計學裏的方法來選擇這些變量。爲了在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.]
這就是咱們實現的第一個決策樹算法模型啦!