一、前言
机票价格的预测一直是航空业和旅行者关注的重要问题之一。随着航空业的快速发展和市场竞争的加剧,正确预测机票价格对于航空公司的利润最大化和旅行者的预算规划至关重要。在过去,人们通常依靠经验和市场趋势来预测机票价格,但这种方法往往存在不准确和不稳定的问题。
为了解决这个问题,本项目旨在利用机器学习算法来预测机票价格。机器学习是一种强大的技术,可以自动从历史数据中学习规律和模式,并根据这些模式做出准确的预测。通过分析航班的相关数据,如起飞时间、航空公司、航线、季节性和市场需求等因素,我们可以构建一个机票价格预测模型。本实验在jupyter notebook中执行,本文将给出代码的详细介绍,供初学者更好的学习数据预处理、特征工程、数据划分、模型选择和训练、模型评估等过程。
二、实验所需的库及介绍
本实验所需的库与介绍如下,进行本实现请先在conda pip install以下库:
1. pandas: pandas`是一个强大的数据处理和分析库。它提供了高性能、易于使用的数据结构,如DataFrame,用于处理和操作结构化数据。pandas`可以读取和写入各种数据格式,如 CSV、Excel、SQL 数据库等。它还提供了许多数据处理和转换函数,使数据清洗、转换和整理变得更加简单。
2. seaborn: seaborn 是一个基于 matplotlib`的数据可视化库。它提供了一组高级的统计图形和绘图函数,使得创建各种统计图形变得更加简单。seaborn的设计目标是使可视化过程更加简洁、美观,并提供了一些默认的样式和颜色调色板,使得图形的生成和修改更加容易。
3. numpy: numpy 是一个用于科学计算的库。它提供了高性能的多维数组对象(ndarray)以及用于操作数组的各种函数。numpy的数组操作功能非常强大,可以进行向量化操作、广播等。它还提供了许多数学函数,如线性代数运算、傅里叶变换、随机数生成等。
4. matplotlib.pyplot: matplotlib.pyplot 是 matplotlib库的一个子模块,它提供了一组简单而有效的函数,用于创建各种类型的图形和可视化。通过 pyplot,可以创建线图、散点图、条形图、饼图等,并对图形进行自定义设置,如添加标题、标签、图例等。
5. datetime: datetime 是 Python 的一个内置模块,提供了处理日期和时间的函数和类。它可以用于创建、操作和格式化日期和时间,计算时间差、转换时间表示等。
6. scikit-learn: scikit-learn(简称为 sklearn)是一个流行的机器学习库,提供了许多常用的机器学习算法和工具。它包含了用于分类、回归、聚类、降维、模型选择和评估等任务的函数和类。train_test_split 用于划分训练集和测试集的工具函数,RandomizedSearchCV 是用于进行随机搜索交叉验证的类,RandomForestRegressor 和 ExtraTreesRegressor 是随机森林和极端随机森林回归器的类。
7. pickle: pickle 是 Python 的内置模块,用于序列化和反序列化 Python 对象。它可以将对象转换为字节流表示,从而可以将对象保存到文件或通过网络传输。pickle 在机器学习中常用于保存训练好的模型,以便以后重用。可以使用 pickle 将训练好的模型保存到文件,然后在需要时加载回来并进行预测或其他操作。
三、数据集简介
我们采用网上搜集到的国外的一个航班信息数据集用于我们的预测实验,数据集包含了航班的出发点、到达地、出发时间、到达时间、票价等航班信息。你可以通过下面链接下载该数据集:
链接:链接:https://pan.baidu.com/s/1ukycDJvkn55B-gE022rpVw?pwd=zu8l
提取码:zu8l
四、实现代码
1.导入航班价格预测所需的库
import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
import datetime as dt
from sklearn.model_selection import train_test_split, RandomizedSearchCV
from sklearn.ensemble import RandomForestRegressor, ExtraTreesRegressor
import pickle
from sklearn import metrics
2.读取训练数据
train_data = pd.read_excel('Data_Train.xlsx')
train_data.head()
这段代码使用了Pandas库来读取一个在程序同目录下名为"Data_Train.xlsx"的Excel文件,并将其内容加载到一个名为train_data
的DataFrame中,显示DataFrame的前几行数据,运行结果如下:
3.检查目标列中的值
train_data['Destination'].value_counts()
这段代码对train_data
DataFrame中的"Destination"列执行了value_counts()
方法。它返回了一个包含每个唯一值的计数的Series对象,该Series对象按计数值降序排列。运行结果如下:
• 在我们的数据集中,最多的人前往科钦,其次是班加罗尔,然后是德里。
下面我们将"Destination"列中的'New Delhi'值替换为'Delhi',以便在数据中统一表示目的地:
def newd(x):
if x=='New Delhi':
return 'Delhi'
else:
return x
train_data['Destination'] = train_data['Destination'].apply(newd)
4.检查我们的列车数据信息
train_data.info()
`train_data.info()`是一个用于查看DataFrame的基本信息的方法。它提供了关于DataFrame的列名、每列的非空值数量、数据类型以及占用内存等方面的信息,这对于数据清洗、处理和分析非常有用。运行结果如下:
5.将日期和月份列转换为日期时间列
train_data['Journey_day'] = pd.to_datetime(train_data['Date_of_Journey'],format='%d/%m/%Y').dt.day
train_data['Journey_month'] = pd.to_datetime(train_data['Date_of_Journey'],format='%d/%m/%Y').dt.month
train_data.drop('Date_of_Journey',inplace=True,axis=1)
train_data.head()
这段代码进行了一系列的数据处理操作,对`train_data` DataFrame进行了修改:
首先,代码使用`pd.to_datetime()`函数将"Date_of_Journey"列中的日期字符串转换为Pandas的日期时间类型。`pd.to_datetime()`函数接受两个参数:要转换的列和日期字符串的格式。在这里,日期字符串的格式是"%d/%m/%Y",表示日期格式为"日/月/年"。转换后,日期时间对象的天数部分被提取并赋值给新的"Journey_day"列,用于表示出发日期的天数。
接着,代码再次使用`pd.to_datetime()`函数将"Date_of_Journey"列中的日期字符串转换为日期时间类型,并提取出月份部分,并将其赋值给新的"Journey_month"列,用于表示出发日期的月份。
然后,使用`drop()`方法删除了原始的"Date_of_Journey"列。`drop()`方法用于从DataFrame中删除指定的列或行,其中第一个参数是要删除的列或行的标签,`inplace=True`表示对原始DataFrame进行修改,`axis=1`表示删除列。
最后,代码通过调用`head()`方法显示修改后的DataFrame的前几行数据。
运行结果如下:
6.从时间中提取小时和分钟
t