練習 - 建置機器學習模型

已完成

若要建立機器學習模型,您需要兩個資料集:一個用於定型,另一個用於測試。 實際上,您通常只有一個資料集,因此您會將它一分為二。 在此練習中,您將在於上一個實驗室中準備的 DataFrame 上執行 80-20 分割,讓您可以加以使用以將機器學習模型定型。 您也會將 DataFrame 分隔成特徵資料行和標籤資料行。 前者包含作為模型輸入的資料行 (例如航班起點和目的地,以及排程起飛時間),而後者則包含模型將嘗試預測的資料行,在此範例中為 ARR_DEL15 資料行,其指出航班是否將準時抵達。

  1. 切換回您在上一節中建立的 Azure 筆記本。 如果您已關閉筆記本,您可以重新登入 Microsoft Azure Notebooks 入口網站,開啟筆記本並使用 [資料格] ->[全部執行],並於開啟筆記本後在其中重新執行所有資料格。

  2. 在筆記本結尾的新資料格中,輸入並執行下列程式碼:

    from sklearn.model_selection import train_test_split
    train_x, test_x, train_y, test_y = train_test_split(df.drop('ARR_DEL15', axis=1), df['ARR_DEL15'], test_size=0.2, random_state=42)
    

    第一個陳述式會匯入 scikit-learn 的 train_test_split 協助程式函式。 第二行使用函式將 DataFrame 分割成包含 80% 原始資料的定型集,以及包含剩餘 20% 資料的測試集。 random_state 參數會植入用來進行分割的亂數產生器,而第一個和第二個參數則是包含功能資料行和標籤資料行的 DataFrame。

  3. train_test_split 會傳回四個 DataFrames。 使用下列命令來顯示 DataFrame 中包含要用於定型功能資料行的資料列數和資料行數:

    train_x.shape
    
  4. 現在使用此命令來顯示包含特徵資料行的 DataFrame 中,要用於測試的資料列和資料行數目:

    test_x.shape
    

    這兩個輸出有何不同,原因何在?

您可以預測在其他兩個 DataFrame (train_ytest_y) 上呼叫 shape 時所看到的內容嗎? 如果您不確定,請試試看來了解。

機器學習模型種類繁多。 迴歸模型是最常見的模型之一,它使用多個迴歸演算法的其中一個來產生數值,例如某人的年齡,或信用卡交易是詐騙的機率。 您將為分類模型定型,以將一組輸入解析成其中一組已知的輸出。 分類模型的典型範例是檢查電子郵件,並將其分類為「垃圾郵件」或「非垃圾郵件」。您的模型將會是二元分類模型,可預測航班會準時抵達或延遲 (我們使用「二元」,因為只有兩個可能的輸出)。

使用 scikit-learn 的優點之一,就是您不必手動建置這些模型,或實作這些模型所使用的演算法。 Scikit-learn 包含用於實作常見機器學習模型的各種不同類別。 其中一個是 RandomForestClassifier,它會將多個決策樹與資料進行擬合,並使用平均來提高整體精確度並限制過適

  1. 在新的資料格中執行下列程式碼來建立 RandomForestClassifier 物件,並呼叫 fit 方法加以定型。

    from sklearn.ensemble import RandomForestClassifier
    
    model = RandomForestClassifier(random_state=13)
    model.fit(train_x, train_y)
    

    輸出會顯示分類器中所使用的參數,包括 n_estimators (指定每個決策樹樹系中的決策樹數目) 與 max_depth (指定決策樹的最大深度)。 所顯示的值是預設,但您可以在建立 RandomForestClassifier 物件時覆寫任何值。

    將模型定型。

    將模型定型

  2. 現在呼叫 predict 方法,以使用 test_x 中的值來測試模型,然後呼叫 score 方法以判斷模型的平均精確度:

    predicted = model.predict(test_x)
    model.score(test_x, test_y)
    

    確認您看到下列輸出:

    測試模型。

    測試模型

平均精確度為 86%,這在表面上看起來不錯。 不過,平均精確度性不一定是分類模型精確度的可靠指標。 讓我們進一步探索並判斷模型到底有多精確,也就是它在判斷航班是否準時抵達方面有多精確。

衡量分類模型精確度的方式有幾種。 其中一個最能全方位衡量二元分類模型的方式是接收者操作特徵曲線下面積 (有時稱為 "ROC AUC"),其基本上會量化模型進行正確預測 (不論結果為何) 的頻率。 在此單元中,您將計算先前所建置模型的 ROC AUC 分數,並了解為何該分數低於 score 方法所輸出平均精確度的一些原因。 您也將了解用來量測模型精確度的其他方式。

  1. 計算 ROC AUC 之前,您必須先產生測試集的「預測機率」。 這些機率是模型針對每個類別可能預測的估計值或答案。 例如,[0.88199435, 0.11800565] 表示航班有 89% 的機率會準時抵達 (ARR_DEL15 = 0),且有 12% 的機率不會準時抵達 (ARR_DEL15 = 1)。 這兩個機率的加總會得到 100%。

    執行下列程式碼以從測試資料產生一組預測機率:

    from sklearn.metrics import roc_auc_score
    probabilities = model.predict_proba(test_x)
    
  2. 現在使用下列陳述式,透過 scikit-learn 的 roc_auc_score 方法從機率產生 ROC AUC 分數:

    roc_auc_score(test_y, probabilities[:, 1])
    

    確認輸出顯示分數為 67%:

    產生 AUC 分數。

    「正在產生 AUC 分數」

    為何 AUC 分數低於前一個練習中計算得到的平均精確度?

    score 方法輸出反映模型在測試集中成功預測的項目數。 此分數會偏向一邊,因為在用來定型和測試模型的資料集中,代表準時抵達之資料列數目遠超過代表誤點的資料列數目。 由於此資料不平衡,如果您預測航班準時,會比預測航班誤點更有可能為正確。

    ROC AUC 將此列入考量,並更精確地指出正確預測準時「或」誤點的機率。

  3. 您可以產生混淆矩陣 (也稱為「誤差矩陣」) 來深入了解模型的行為。 混淆矩陣會量化每個答案正確或不正確分類的次數。 具體來說,它會量化誤判為真、誤否定、確判為真和真否定的數目。 如果定型為識別貓狗之二元分類模型使用 95% 為狗的資料集進行測試,只要每次猜「狗」,就有可能得分 95%。 但如果完全無法識別貓,則沒有什麼價值。

    使用下列程式碼為您的模型產生混淆矩陣:

    from sklearn.metrics import confusion_matrix
    confusion_matrix(test_y, predicted)
    

    輸出中的第一個資料列代表準時的航班。 該資料列中第一個資料行顯示正確預測為準時的航班數目,而第二個資料行顯示預測為誤點但其實不然的航班數目。 由此看來,模型在預測航班準時方面似乎很精確。

    產生混淆矩陣。

    產生混淆矩陣

    反觀代表航班誤點的第二個資料列。 第一個資料行顯示錯誤預測為準時的誤點航班數目。 第二個資料行顯示正確預測為誤點的航班數目。 很明顯地,模型在預測航班誤點方面,幾乎與預測航班準時抵達一樣精確。 在混淆矩陣中,您「想要」將大型數字放在左上角和右下角,並將小型數字 (最好為零) 放在右上角和左下角。

  4. 其他用於分類模型的正確性量值包括「精確度」和「召回率」。 假設模型有三個準時抵達和三個延誤抵達,它已正確預測兩個準時抵達,但錯誤地將兩個延誤抵達預測為準時抵達。 在此情況下,精確度是 50% (四個航班中分類為即將準時的兩個航班實際上就是準時),而其召回率是 67% (它已正確識別三個準時抵逹航班中的兩個)。 您可以從 https://en.wikipedia.org/wiki/Precision_and_recall 深入了解精確度和召回率

    Scikit-learn 包含名為 precision_score 的便利方法,可用來計算精確度。 若要將模型的精確度量化,請執行下列陳述式:

    from sklearn.metrics import precision_score
    
    train_predictions = model.predict(train_x)
    precision_score(train_y, train_predictions)
    

    檢查輸出。 您模型的精確度是多少?

    測量精確度。

    測量精確度

  5. Scikit-learn 還包含一個名為 recall_score 的方法用於計算召回率。 若要測量模型的召回率,請執行下列陳述式:

    from sklearn.metrics import recall_score
    
    recall_score(train_y, train_predictions)
    

    模型的召回率是多少?

    測量召回率。

    測量召回率

  6. 使用 File ->Save and Checkpoint 命令來儲存筆記本。

在真實世界中,訓練有素的資料科學家會尋找讓模型更加精確的方法。 此外,他們還會嘗試不同演算法,然後採取步驟來「微調」所選擇的演算法,以找出最佳的參數組合。 另一個可能步驟就是將資料集擴展為數百萬個資料列,而非幾千個資料列,同時嘗試減少延誤和準時抵達之間的不平衡狀態。 但就我們的目的而言,此模型保持原狀即已足夠。