練習 - 將模型的輸出視覺化

已完成

在本單元中,您會將 Matplotlib 匯入您所使用的筆記本,並將筆記本設定為支援內嵌 Matplotlib 輸出。

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

  2. 在筆記本結尾的新資料格中,執行下列程式碼。 忽略與字型快取相關的任何顯示警告訊息:

    %matplotlib inline
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    sns.set()
    

    第一個陳述式是建立筆記本時所選取 Python 核心支援的數個 magic 命令之一。 它可讓 Jupyter 在筆記本中呈現 Matplotlib 輸出,而無需重複呼叫 show。 同時,它必須出現在 Matplotlib 本身的任何參考之前。 最後一個陳述式會設定 Seaborn 來增強來自 Matplotlib 的輸出。

  3. 若要查看作用中的 Matplotlib,請在新的資料格中執行下列程式碼,以針對您在上一個實驗中建置的機器學習服務模型繪製 ROC 曲線

    from sklearn.metrics import roc_curve
    
    fpr, tpr, _ = roc_curve(test_y, probabilities[:, 1])
    plt.plot(fpr, tpr)
    plt.plot([0, 1], [0, 1], color='grey', lw=1, linestyle='--')
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    
  4. 確認您看到下列輸出:

    使用 Matplotlib 產生的 ROC 曲線。

    使用 Matplotlib 產生的 ROC 曲線

圖表中間虛線表示取得正確答案的機率是 50-50。 藍色曲線代表模型的正確性。 更重要的是,顯示此圖表的事實表明您可以在 Jupyter 筆記本中使用 Matplotlib。

您建置機器學習服務模型的原因,是為了要預測航班將準時或延誤抵達。 在此練習中,您將撰寫 Python 函式,以呼叫您在上一個實驗中建置的機器學習服務模型,用來計算航班準時的可能性。 然後,您將使用此函式來分析數個航班。

  1. 在新的資料格中輸入下列函式定義,然後執行該資料格。

    def predict_delay(departure_date_time, origin, destination):
        from datetime import datetime
    
        try:
            departure_date_time_parsed = datetime.strptime(departure_date_time, '%d/%m/%Y %H:%M:%S')
        except ValueError as e:
            return 'Error parsing date/time - {}'.format(e)
    
        month = departure_date_time_parsed.month
        day = departure_date_time_parsed.day
        day_of_week = departure_date_time_parsed.isoweekday()
        hour = departure_date_time_parsed.hour
    
        origin = origin.upper()
        destination = destination.upper()
    
        input = [{'MONTH': month,
                  'DAY': day,
                  'DAY_OF_WEEK': day_of_week,
                  'CRS_DEP_TIME': hour,
                  'ORIGIN_ATL': 1 if origin == 'ATL' else 0,
                  'ORIGIN_DTW': 1 if origin == 'DTW' else 0,
                  'ORIGIN_JFK': 1 if origin == 'JFK' else 0,
                  'ORIGIN_MSP': 1 if origin == 'MSP' else 0,
                  'ORIGIN_SEA': 1 if origin == 'SEA' else 0,
                  'DEST_ATL': 1 if destination == 'ATL' else 0,
                  'DEST_DTW': 1 if destination == 'DTW' else 0,
                  'DEST_JFK': 1 if destination == 'JFK' else 0,
                  'DEST_MSP': 1 if destination == 'MSP' else 0,
                  'DEST_SEA': 1 if destination == 'SEA' else 0 }]
    
        return model.predict_proba(pd.DataFrame(input))[0][0]
    

    此函式會採用日期和時間、出發地機場代碼、目的地機場代碼作為輸入,並傳回介於 0.0 與 1.0 之間的值,表示航班準時抵達其目的地的機率。 它會使用您在前一個實驗中建置的機器學習服務模型來計算機率。 同時,為了呼叫模型,它會將包含輸入值的 DataFrame 傳遞至 predict_proba。 資料框架結構完全符合我們先前使用的 DataFrame 結構。

    注意

    predict_delay 函式的日期輸入則會使用國際日期格式 dd/mm/year

  2. 使用下列程式碼,計算 10 月 1 日晚上從紐約飛往亞特蘭大的航班準時抵達的機率。 您輸入的年份無關,因為模型不會使用。

    predict_delay('1/10/2018 21:45:00', 'JFK', 'ATL')
    

    確認輸出顯示準時抵達的機率為 60%:

    預測航班是否準時抵達。

    預測航班是否準時抵達

  3. 修改程式碼,計算隔天相同航班準時抵達的機率:

    predict_delay('2/10/2018 21:45:00', 'JFK', 'ATL')
    

    此航班準時抵達的機率為何? 如果您的旅遊計劃很彈性,您是否考慮將旅程延後一天?

  4. 現在修改程式碼,計算同一天從亞特蘭大飛往西雅圖的早班航班準時抵達的機率:

    predict_delay('2/10/2018 10:00:00', 'ATL', 'SEA')
    

    此航班是否可能準時抵達?

您現在只要使用一行程式碼,就能輕鬆地預測航班可能準時或誤點。 請放心試驗其他日期、時間、起點和目的地。 但請記住,由於只使用機場代碼 ATL、DTW、JFK、MSP 和 SEA 定型模型,因此結果只對這些機場代碼有意義。

  1. 執行下列程式碼,將不同日期從 JFK 飛往 ATL 的晚班航班準時抵達的機率繪製成圖:

    import numpy as np
    
    labels = ('Oct 1', 'Oct 2', 'Oct 3', 'Oct 4', 'Oct 5', 'Oct 6', 'Oct 7')
    values = (predict_delay('1/10/2018 21:45:00', 'JFK', 'ATL'),
              predict_delay('2/10/2018 21:45:00', 'JFK', 'ATL'),
              predict_delay('3/10/2018 21:45:00', 'JFK', 'ATL'),
              predict_delay('4/10/2018 21:45:00', 'JFK', 'ATL'),
              predict_delay('5/10/2018 21:45:00', 'JFK', 'ATL'),
              predict_delay('6/10/2018 21:45:00', 'JFK', 'ATL'),
              predict_delay('7/10/2018 21:45:00', 'JFK', 'ATL'))
    alabels = np.arange(len(labels))
    
    plt.bar(alabels, values, align='center', alpha=0.5)
    plt.xticks(alabels, labels)
    plt.ylabel('Probability of On-Time Arrival')
    plt.ylim((0.0, 1.0))
    
  2. 確認輸出與以下內容相似:

    不同日期準時抵達的機率。

    不同日期準時抵達的機率

  3. 修改程式碼,為 4 月 10 日至 4 月 16 日下午 1:00 離開 JFK 飛往 MSP 的航班產生相似圖表。 此輸出相較於上一個步驟中的輸出有何不同?

  4. 自行撰寫程式碼,將 1 月 30 日上午 9:00、中午、下午 3:00、下午 6:00 和下午 9:00 離開 SEA 飛往 ATL 的航班準時抵達的機率繪製成圖。 確認輸出與下圖相符:

    不同時間準時抵達的機率。

    不同時間準時抵達的機率

如果您剛開始使用 Matplotlib 並想要深入了解,您可以在下列網址找到一個絕佳的教學課程:https://www.labri.fr/perso/nrougier/teaching/matplotlib/.Matplotlib 的功能「遠超過」本文所展示的內容,這也是為何它在 Python 社群中這麼受歡迎的原因之一。