练习 - 可视化模型的输出

已完成

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

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

  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. 确认看到以下输出:

    ROC curve generated with Matplotlib.

    使用 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%:

    Predicting whether a flight will arrive on time.

    预测航班是否会准点到达

  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. 确认输出如下所示:

    Probability of on-time arrivals for a range of dates.

    多个日期的准点到达概率

  3. 修改代码来为 4 月 10 日至 4 月 16 日下午 1:00 离开 JFK 飞往 MSP 的航班生成类似的图表。 输出与上一步中的输出相比如何?

  4. 你可以自己编写代码,绘制在 1 月 30 日上午 9:00、中午、下午 3:00、下午 6:00 和晚上 9:00 离开 SEA 飞往 ATL 的航班准点到达的概率。 确认输出与以下内容匹配:

    Probability of on-time arrivals for a range of times.

    一段时间内准点到达的概率

如果你是 Matplotlib 新手并想要了解详细信息,可以在 https://www.labri.fr/perso/nrougier/teaching/matplotlib/. 找到优秀的教程。该教程介绍的 Matplotlib 相关内容比本模块介绍的相关内容要多得多,这就是它在 Python 社区中如此受欢迎的原因之一。