Kaggle-纽约市出租车费预测
1 数据导入
在kaggle上下载完训练数据和测试数据之后,将数据导入。由于训练数据集过大,电脑配置有限,训练集只导入100000条记录。
trainData=pd.read_csv('train.csv',nrows=100000)
testData=pd.read_csv('test.csv')
2 数据审查
2.1. 数据的整体情况
2.2 类型审查
key列和pickup_datetime列显示为字符串类型,需要将其转换为时间类型。
2.3 数据的基本情况
观察每一个变量的数据基本情况:从fare_amount来看,最小值为负数,不合常理;从经纬度来看,最小值为-3000多,最大值为2000多,不合常理;乘客人数最大为208人,最小为0人,不合常理。
2.4 缺失值审查
综上,需要首先对数据进行以下处理:
(1)异常值处理:去除明显异常的记录
(2)缺失值处理:去除存在缺失值的记录
(3)类型转换:将字符串类型的列转换成时间类型的列
3 数据预处理
数据预处理包括类型转化、异常值处理、缺失值处理等
###类型转换
trainData['key']=pd.to_datetime(trainData['key'])
trainData['pickup_datetime']=pd.to_datetime(trainData['pickup_datetime'])
print('data dtypes:\n',trainData.dtypes)###缺失值处理
trainData=trainData.dropna(axis=0)
print('data null:\n',trainData.isnull().sum())###异常值处理
#去除fare_amount异常值
trainData=trainData.drop(trainData[trainData['fare_amount']<=0].index)#passenger_count异常值
trainData=trainData.drop(trainData[trainData['passenger_count']<=0].index)
trainData=trainData.drop(trainData[trainData['passenger_count']>6].index)#去除经纬度异常值
#去除不在纽约市区经纬度范围内的上车下车点
def select_within_boundingbox(dataframe,BB):return (dataframe['pickup_longitude']>=BB[0]) & (dataframe['pickup_longitude']<=BB[1]) & \(dataframe['dropoff_longitude']>=BB[0]) & (dataframe['dropoff_longitude']<=BB[1]) & \(dataframe['pickup_latitude']>=BB[2]) & (dataframe['pickup_latitude']<=BB[3]) & \(dataframe['dropoff_latitude']>=BB[2]) & (dataframe['dropoff_latitude']<=BB[3])
BB = (-74.5, -72.8, 40.5, 41.8)
trainData=trainData[select_within_boundingbox(trainData,BB)]
print(trainData.describe())
4 数据探索
为了找到纽约市出租车费的相关影响因素,需要对已有数据间的关系进行探索。
4.1 时间与车费的关系
观察车费与年份、月份、日期、时间以及星期的关系。如果车费在不同情况下显示出差异性,则该特征可作为车费的一个影响因素。
4.1.1 年份与出租车费的关系
plt.figure(figsize=(15,7))
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.scatter(trainData['year'],trainData['fare_amount'],s=2)
plt.title('年份与价格关系')
plt.xlabel('年份')
plt.ylabel('价格')
plt.show()
4.1.2 月份与出租车费的关系
plt.figure(figsize=(15,7))
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.scatter(trainData['month'],trainData['fare_amount'],s=2)
plt.title('月份与价格关系')
plt.xlabel('月份')
plt.ylabel('价格')
plt.show()
4.1.3 日期与出租车费的关系
plt.figure(figsize=(15,7))
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.scatter(trainData['day'],trainData['fare_amount'],s=2)
plt.title('日期与价格关系')
plt.xlabel('日期')
plt.ylabel('价格')
plt.ylim(10,12)
plt.show()
4.1.4 时间与出租车费的关系
plt.figure(figsize=(15,7))
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.scatter(trainData['hour'],trainData['fare_amount'],s=2)
plt.title('小时与价格关系')
plt.xlabel('小时')
plt.ylabel('价格')
plt.ylim(8,16)
plt.show()
4.1.5 星期与出租车费的关系
plt.figure(figsize=(15,7))
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.scatter(trainData['weekday'],trainData['fare_amount'],s=2)
plt.title('星期与价格关系')
plt.xlabel('星期')
plt.ylabel('价格')
plt.show()
4.2 距离与出租车费的关系
经纬度之间的距离不能单纯的用两点之间的距离来表示,所以这里采用求解两个点之间的球面距离作为两地之间的距离。
def distance(lon1,lat1,lon2,lat2):R=6371C=np.sin(lat1)*np.sin(lat2)+np.cos(lat1)*np.cos(lat2)*np.cos(lon1-lon2)try:distance=R*np.arccos(C)*pi/180except:distance=0return distance# 计算距离
trainData['distance_miles'] = distance(trainData.pickup_longitude, trainData.pickup_latitude, \trainData.dropoff_longitude, trainData.dropoff_latitude)trainData['distance_miles'].fillna(0,inplace=True)
#距离的分布
trainData.distance_miles.hist(bins=50, figsize=(12,4))
plt.xlabel('distance miles')
plt.title('Histogram ride distances in miles')
4.3 乘客人数与出租车费之间的关系
plt.figure(figsize=(15,7))
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.scatter(trainData['passenger_count'],trainData['fare_amount'],s=2)
plt.title('乘客人数与价格关系')
plt.xlabel('人数')
plt.ylabel('价格')
plt.ylim(8,14)
plt.show()
5 特征工程
在原先给定的数据基础上,得到新的数据特征,数据特征包括:时间特征、距离特征、乘客人数特征等。
5.1 时间特征
trainData['year']=trainData['pickup_datetime'].map(lambda x:x.year)
trainData['month']=trainData['pickup_datetime'].map(lambda x:x.month)
trainData['day']=trainData['pickup_datetime'].map(lambda x:x.day)
trainData['hour']=trainData['pickup_datetime'].map(lambda x:x.hour)
trainData['weekday']=trainData['pickup_datetime'].map(lambda x:x.dayofweek)
5.2 距离特征
trainData['distance_miles'] = distance(trainData.pickup_longitude, trainData.pickup_latitude, \trainData.dropoff_longitude, trainData.dropoff_latitude)
trainData['distance_miles'].fillna(0,inplace=True)
6 测试数据的处理
为了对测试数据进行预测,需要对测试数据进行与训练数据相同的特征提取。
print('testdata null:', testData.isnull().any())
#时间序列
testData['key']=pd.to_datetime(testData['key'])
testData['pickup_datetime']=pd.to_datetime(testData['pickup_datetime'])
print('data dtypes:\n',testData.dtypes)testData['year']=testData['pickup_datetime'].map(lambda x:x.year)
testData['month']=testData['pickup_datetime'].map(lambda x:x.month)
testData['day']=testData['pickup_datetime'].map(lambda x:x.day)
testData['hour']=testData['pickup_datetime'].map(lambda x:x.hour)
testData['weekday']=testData['pickup_datetime'].map(lambda x:x.dayofweek)#距离
testData['distance_miles'] = distance(testData.pickup_longitude, testData.pickup_latitude, \testData.dropoff_longitude, testData.dropoff_latitude)
testData['distance_miles'].fillna(0,inplace=True)
7 模型构建
本文决定采用RandomForestRegression模型实现出租车价格的预测。
trainX=trainData.iloc[:,train.columns!='fare_amount']
trainY=trainData['fare_amount']
testX=testDatafrom sklearn.model_selection import StratifiedKFold
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score
scores=[]
for i in range(50,201,50):rf=RandomForestRegressor(n_estimators=i)score=cross_val_score(rf,trianX,trainY,cv=5)scores.append(np.mean(score))
best_n=50*(np.argmax(scores)+1)
rf=RandomForestRegressor(n_estimators=best_n)
rf.fit(trainX,trainY)
rf_predict=pd.DataFrame()
rf_predict['key']=testData['key']
rf_predict['fare_amount']=rf.predict(testX)
rf_predict.to_csv('submision_rf.csv',index=False)
Kaggle-纽约市出租车费预测相关推荐
- 【Kaggle】纽约市出租车费预测(经典)
[参考:New York City Taxi Fare Prediction | Kaggle] [参考:美国纽约市出租车大数据探索-基于kaggle比赛_@Irene的博客-CSDN博客]这个参考较 ...
- 某天没有数据能查出来0数量_用Excel对纽约市出租车费数据探索性分析
一.引言 背景:在纽约,游客们往往把自由女神象.帝国大厦.中央公园等视为纽约的象征, 但穿梭在人海中的出租车也是纽约靓丽的人文景观之一, 是其流动的风景线, 在纽约公共文化中别具魅力.本篇文章利用之前 ...
- 使用ML.NET预测纽约出租车费
有了上一篇<.NET Core玩转机器学习>打基础,这一次我们以纽约出租车费的预测做为新的场景案例,来体验一下回归模型. 场景概述 我们的目标是预测纽约的出租车费,乍一看似乎仅仅取决于行程 ...
- Dataset:New York City Taxi Fare Prediction纽约市出租车票价预测数据集的简介、下载、使用方法之详细攻略
Dataset:New York City Taxi Fare Prediction纽约市出租车票价预测数据集的简介.下载.使用方法之详细攻略 目录 New York City Taxi Fare P ...
- 贪心入门——出租车费
问题 B: 出租车费 时间限制: 1 Sec 内存限制: 32 MB 提交: 6 解决: 6 [提交][状态][讨论版] 题目描述 某市出租车计价规则如下:起步4公里10元,即使你的行程没超过4公里: ...
- codeup 1128: 出租车费 贪心|找规律
1128: 出租车费 时间限制: 1 Sec 内存限制: 32 MB 提交: 871 解决: 299 [提交][状态][讨论版][命题人:外部导入] 题目描述 某市出租车计价规则如下:起步4公里10元 ...
- [Kaggle] Housing Prices 房价预测
文章目录 1. Baseline 1. 特征选择 2. 异常值剔除 3. 建模预测 2. 待优化特征工程 房价预测 kaggle 地址 参考文章:kaggle比赛:房价预测(排名前4%) 1. Bas ...
- 动手学深度学习:3.16 实战Kaggle比赛:房价预测
3.16 实战Kaggle比赛:房价预测 作为深度学习基础篇章的总结,我们将对本章内容学以致用.下面,让我们动手实战一个Kaggle比赛:房价预测.本节将提供未经调优的数据的预处理.模型的设计和超参数 ...
- kaggle 泰坦尼克 高分 预测
kaggle 泰坦尼克 高分 预测 目录 kaggle 泰坦尼克 高分 预测 1.前言 2.包及数据导入 3.数据的初步认识 4.数据关系的可视化 5.数据清洗与缺失值处理 6.数据的统计分析 7.超 ...
最新文章
- Ubuntu16.04安装Pycharm2017.2
- mysql 5.7.12 修改密码
- android studio 工程demo例子,Android Studio 实现跑马灯微项目实例
- 前端学习(2652):初始化项目
- 如何用firebug调试js
- 使用Instruments中的CoreAnimation分析动画
- mysql pxc 报错_登录mysqlpxc报错找不到库文件libreadline.so.7
- Scala基础-01-Scala环境安装及基础语法(变量,函数)
- gps 数据解析-NMEA 0183协议
- std::deque的使用
- ASUS华硕笔记本Windows 7驱动光盘大全~
- linux不可用于文件名的符号,Linux 文件名中包含特殊字符
- colorbox iframe小记
- 5分钟自建数据库可视化平台,在线管理数据库也太方便了~
- Shell多进程ping检测指定网段ip是否在线
- Android类似IOS的果冻效果
- 8.微信小程序-Mobx数据共享(类似vuex)
- 真无线蓝牙耳机推荐:2021最受欢迎的TWS耳机品牌
- 树莓派4B通过网线连接笔记本上网
- 快速建站 python_Django简单快捷建站(适合做大作业)