Python 機器學習教程:預測Airbnb 價格(2)
我們可以對前面的函數進行擴展,來使用兩個特性和整個數據集。代替distance.euclidean(),我們準備使用distance.cdist(),因為它允許我們一次性傳入多個行。
( cdist()方法可以被用來以多種方法來計算距離,但它默認的是歐氏距離。)
你可以看到,我們的RMSE在使用兩個特性而不是僅僅使用accommodates時從212提高到了122。這是一個巨大的改進,儘管它仍然沒有我們想要的那麼精確。
scikit-learn簡介
我們已經從零開始編寫了函數來訓練我們的k最近鄰模型。這有助於我們理解這些機制是如何允許的,但是現在我們已經了解了基本原理,我們就可以使用Python的scikit-learn庫更快更有效地工作。
Scikit-learn是Python中最流行的機器學習庫。它為所有主要的機器學習演算法提供了內置的函數,並提供了一個簡單、統一的工作流。這些特性都允許數據科學家在對一個新數據集進行不同模型的訓練和測試時變得非常高效。
scikit-learn工作流包括四個主要步驟:
- 實例化你要使用的特定機器學習模型。
- 將模型與訓練數據相匹配。
- 使用該模型進行預測。
- 評估預測的準確性。
scikit-learn中的每個模型都被實現為一個單獨的類,第一步是識別我們想要創建實例的類。
任何幫助我們預測數值的模型,比如我們模型中的房屋出租價格,都被稱為一個回歸模型。機器學習模型的另一個主要類別稱為分類。當我們試圖從一組固定的標籤(例如血型或性別)來預測一個標籤時,就會使用到分類模型。
在本例中,我們希望使用 KNeighborsRegressor 類。來自類名KNeighborsRegressor中的單詞regressor是指我們剛剛討論過的回歸模型類,而「KNeighbors」則來自我們正在構建的k最近鄰模型。
scikit-learn使用類似於Matplotlib的面向對象風格。在調用構造函數執行任何其他操作之前,我們需要先實例化一個空模型。
如果我們參考其文檔,我們會注意到這些默認設置:
- n_neighbors:鄰居的數量,設置為5
- 演算法:計算最近的鄰居,設置為auto
- p:設置為2,對應歐氏距離
我們將algorithm參數設置為brute,並將n_neighbors值保留為5,這與我們構建的手動實現相匹配。
擬合模型並做出預測
現在,我們可以使用fit方法將模型與數據進行擬合。對於所有模型,fit方法都需要兩個參數:
- 一個類矩陣對象,包含我們希望從訓練集中使用的特徵列。
- 一個類列表對象,包含正確的目標值。
「類矩陣對象」意味著該方法是靈活的,可以接受一個pandas 的DataFrame或一個NumPy 的二維數組。這意味著我們可以從DataFrame中選擇要使用的列,並將其用作fit方法的第一個參數。
對於第二個參數,回想一下前面的內容,以下所有這些都是可接受的類列表對象:
- NumPy數組
- Python列表
- pandas 的Series對象(例如列)
讓我們從DataFrame中選擇目標列,並將其作為fit方法的第二個參數:
當調用fit()方法時,scikit-learn會存儲我們在KNearestNeighbors實例(knn)中指定的訓練數據。如果我們試圖將包含缺失值或非數值的數據傳入到fit方法中,scikit-learn將返回一個錯誤。這就是這個庫的優點之一——它包含了許多這樣的特性,可以防止我們犯錯誤。
現在我們已經指定了我們想要用來進行預測的訓練數據,我們可以使用predict方法來對測試集進行預測。predict方法只有一個必需的參數:
- 一個類似矩陣的對象,其中包含我們想要對其進行預測的數據集中的特徵列
我們在訓練和測試期間使用的特徵列的數量需要相匹配,否則scikit-learn將返回一個錯誤。
predict()方法會返回一個NumPy數組,其中包含針對測試集的預測的price值。
我們現在已經有了實踐整個scikit-learn工作流所需的一切東西:
當然,僅僅因為我們使用的是scikit-learn而不是手工編寫函數,並不意味著我們可以跳過評估步驟,看看我們模型的預測到底有多準確!
使用scikit-learn計算MSE
到目前為止,我們一直是使用NumPy和SciPy函數來幫助我們手動計算RMSE值。或者,我們也可以使用sklearn.metrics.mean_squared_error function() 函數來代替。
mean_squared_error()函數接受兩個輸入 :
- 一個類列表對象,表示測試集中的真實值。
- 第二個類列表對象,表示模型生成的預測值。
從語法的角度來看,這不僅簡單得多,而且由於scikit-learn已經對速度進行了大量優化,因此模型運行所需的時間也更少。
請注意,我們的RMSE與我們手工實現的演算法有一點不同——這可能是由於我們的「手工」KNN演算法和scikit-learn版本在隨機化方面的差異和實現上的細微差異造成的。
請注意,對scikit-learn庫本身的更改也會在一定程度上影響這些值。如果你正在學習本教程,並且得到了一個稍微不同的結果,這可能是因為你正在使用一個更新版本的scikit-learn。
使用更多的特徵
scikit-learn最棒的一點是它允許我們更快地進行迭代。讓我們通過創建一個使用四個而不是兩個特徵的模型來嘗試一下,看看這個優點是否可以改進我們的結果。
在這種情況下,我們的錯誤會略有下降。不過,當你添加特徵時,它可能並不總是這樣做。需要注意的一件重要的事情是:添加更多的特徵並不一定會產生一個更精確的模型。
這是因為添加一個不能準確預測你的目標變數的特徵會給你的模型增加「噪音」。
總結
讓我們來看看我們學習了什麼:
- 我們學習了什麼是機器學習,並通過一個非常基本的手工「模型」來預測一個房子的售價。
- 我們學習了k最近鄰演算法,並在Python中從頭開始構建了一個單變數模型(只有一個特徵),並使用它進行預測。
- 我們了解到RMSE可以用來計算我們的模型的誤差,然後我們可以用它來進行迭代,並嘗試改進我們的預測。
- 然後,我們從零開始創建一個多變數(不止一個特徵)模型,並使用它做出更好的預測。
- 最後,我們學習了scikit-learn庫,並使用KNeighborsRegressor類進行預測。
接下來的步驟
果你想繼續自己研究這個模型,你可以做以下幾件事來提高其準確性:
- 試著用不同的值替換k。
- 回到原始數據集,將我們刪除的一些列轉換為numeric(我們的《機器學習數據準備和清理》一文將會幫到你),並嘗試添加不同的特徵組合進行實驗。
- 嘗試一些特性工程,在其中基於現有數據創建新列:我們從Kaggle:房價競爭文章開始:有一個簡單的例子。
本文更新於2019年7月。
英文原文:https://www.dataquest.io/blog/machine-learning-tutorial/ 譯者:好酒不上頭


※使用Python加速數據分析的10個簡單技巧
※重新發明輪子:用PyTorch發現最佳的滾動形狀
TAG:Python部落 |