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-纽约市出租车费预测相关推荐

  1. 【Kaggle】纽约市出租车费预测(经典)

    [参考:New York City Taxi Fare Prediction | Kaggle] [参考:美国纽约市出租车大数据探索-基于kaggle比赛_@Irene的博客-CSDN博客]这个参考较 ...

  2. 某天没有数据能查出来0数量_用Excel对纽约市出租车费数据探索性分析

    一.引言 背景:在纽约,游客们往往把自由女神象.帝国大厦.中央公园等视为纽约的象征, 但穿梭在人海中的出租车也是纽约靓丽的人文景观之一, 是其流动的风景线, 在纽约公共文化中别具魅力.本篇文章利用之前 ...

  3. 使用ML.NET预测纽约出租车费

    有了上一篇<.NET Core玩转机器学习>打基础,这一次我们以纽约出租车费的预测做为新的场景案例,来体验一下回归模型. 场景概述 我们的目标是预测纽约的出租车费,乍一看似乎仅仅取决于行程 ...

  4. Dataset:New York City Taxi Fare Prediction纽约市出租车票价预测数据集的简介、下载、使用方法之详细攻略

    Dataset:New York City Taxi Fare Prediction纽约市出租车票价预测数据集的简介.下载.使用方法之详细攻略 目录 New York City Taxi Fare P ...

  5. 贪心入门——出租车费

    问题 B: 出租车费 时间限制: 1 Sec 内存限制: 32 MB 提交: 6 解决: 6 [提交][状态][讨论版] 题目描述 某市出租车计价规则如下:起步4公里10元,即使你的行程没超过4公里: ...

  6. codeup 1128: 出租车费 贪心|找规律

    1128: 出租车费 时间限制: 1 Sec 内存限制: 32 MB 提交: 871 解决: 299 [提交][状态][讨论版][命题人:外部导入] 题目描述 某市出租车计价规则如下:起步4公里10元 ...

  7. [Kaggle] Housing Prices 房价预测

    文章目录 1. Baseline 1. 特征选择 2. 异常值剔除 3. 建模预测 2. 待优化特征工程 房价预测 kaggle 地址 参考文章:kaggle比赛:房价预测(排名前4%) 1. Bas ...

  8. 动手学深度学习:3.16 实战Kaggle比赛:房价预测

    3.16 实战Kaggle比赛:房价预测 作为深度学习基础篇章的总结,我们将对本章内容学以致用.下面,让我们动手实战一个Kaggle比赛:房价预测.本节将提供未经调优的数据的预处理.模型的设计和超参数 ...

  9. kaggle 泰坦尼克 高分 预测

    kaggle 泰坦尼克 高分 预测 目录 kaggle 泰坦尼克 高分 预测 1.前言 2.包及数据导入 3.数据的初步认识 4.数据关系的可视化 5.数据清洗与缺失值处理 6.数据的统计分析 7.超 ...

最新文章

  1. Ubuntu16.04安装Pycharm2017.2
  2. mysql 5.7.12 修改密码
  3. android studio 工程demo例子,Android Studio 实现跑马灯微项目实例
  4. 前端学习(2652):初始化项目
  5. 如何用firebug调试js
  6. 使用Instruments中的CoreAnimation分析动画
  7. mysql pxc 报错_登录mysqlpxc报错找不到库文件libreadline.so.7
  8. Scala基础-01-Scala环境安装及基础语法(变量,函数)
  9. gps 数据解析-NMEA 0183协议
  10. std::deque的使用
  11. ASUS华硕笔记本Windows 7驱动光盘大全~
  12. linux不可用于文件名的符号,Linux 文件名中包含特殊字符
  13. colorbox iframe小记
  14. 5分钟自建数据库可视化平台,在线管理数据库也太方便了~
  15. Shell多进程ping检测指定网段ip是否在线
  16. Android类似IOS的果冻效果
  17. 8.微信小程序-Mobx数据共享(类似vuex)
  18. 真无线蓝牙耳机推荐:2021最受欢迎的TWS耳机品牌
  19. 树莓派4B通过网线连接笔记本上网
  20. 快速建站 python_Django简单快捷建站(适合做大作业)

热门文章

  1. UF超滤膜工艺在纯净水预处理中应用解析
  2. 局域网内访问win7共享文件夹的完整解决方案
  3. 企业怎样做好网络营销中的论坛营销
  4. C/C++ - 基本数据类型(默认:32位操作系统)
  5. JS校验二代身份证格式
  6. Android安全防护防护———加密算法
  7. 图解设计模式 -- 生成实例(二)
  8. OCP-1Z0-051 第79题 TRIM,REPLACE,LOWER函数
  9. 内心不够强大的十大表现
  10. 微信小程序免费HTTPS证书申请搭建教程(2)---安装SSL并使用HTTPS访问