练习 - 可视化模型的输出

已完成

在本单元中,你将 Matplotlib 导入正在使用的笔记本中,并配置笔记本以支持内联 Matplotlib 输出。

  1. 切换回到你在上一部分中创建的 Azure Notebook。 如果关闭了笔记本,可以重新登录到 Microsoft Azure Notebooks 门户,打开笔记本,并使用 Cell ->Run All 在打开笔记本后重新运行笔记本中的所有单元格。

  2. 在笔记本末尾的新单元格中执行以下语句。 忽略与字体缓存相关的任何警告消息:

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

    第一个语句是创建笔记本时所选 Python 内核支持的多个 magic 命令 之一。 它使 Jupyter 能够在笔记本中呈现 Matplotlib 输出,而无需进行重复调用来 显示。 它必须出现在任何对 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%。 蓝色曲线表示模型的准确率。 更重要的是,此图表出现的事实表明你可以在 Jupyter Notebook 中使用 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 的结构与我们之前使用的 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 社区中如此受欢迎的原因之一。