【机器学习实战】二、随机森林算法预测出租车车费案例

本文主要是介绍【机器学习实战】二、随机森林算法预测出租车车费案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

随机森林算法预测出租车车费案例

一、导入第三方库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import sklearn
二、加载数据集
train = pd.read_csv('train.csv',nrows=1000000) # 加载前1000000条数据
test = pd.read_csv('test.csv')
三、数据分析、清洗
train.shape # 训练集的形状
# 输出:(1000000,8)
test.shape # 测试集的形状
# 输出:(9914, 7)
train.head() # 显示训练集的前五行数据

在这里插入图片描述

test.head() # 显示前5行测试集数据

在这里插入图片描述

train.describe() # 描述训练集

在这里插入图片描述

test.describe() # 描述测试集

在这里插入图片描述
(1)检查数据中是否有空值

train.isnull().sum().sort_values(ascending=True) # 统计空值的数量,根据数量大小排序

在这里插入图片描述

test.isnull().sum().sort_values(ascending=True) #  统计空值数量

在这里插入图片描述

# 删除train中的空值
train.drop(train[train.isnull().any(1)].index, axis=0,inplace=True)
train.shape # 比原始数据减少10行
# 输出 (999990,8)

(2)检查fare_amount列是否有不合法值

train['fare_amount'].describe() # 描述fare_amount

在这里插入图片描述

# 将fare_amount的值小于0的进行统计
from collections import Counter
Counter(train['fare_amount'] < 0 ) # 共计38行车费小于0的数据
# 输出:Counter({False: 999952, True: 38})
# 将这38行数据删除
train.drop(train[train['fare_amount']<0].index,axis=0,inplace=True)
train['fare_amount'].describe()# 查看车费数据

在这里插入图片描述

# 可视化(直方图):0<票价<100   bins=100 划分为100份 
train[train.fare_amount<100].fare_amount.hist(bins=100,figsize=(14,3)) 
plt.xlabel('fare $')
plt.title('Histogram')

在这里插入图片描述
(3) 检查乘客passenger_count这一列

train['passenger_count'].describe() # 描述passenger_count这一列

在这里插入图片描述

# 查看乘客人数大于6的数据
train[train['passenger_count']>6]

在这里插入图片描述

# 删除离异值
train.drop(train[train['passenger_count']>6].index,axis=0,inplace=True)

(4)检查上车点的经度和纬度
1.纬度范围:-90 ~ 90
2.经度范围:-180 ~ 180

train['pickup_latitude'].describe() # 查看上车点纬度数据(min和max的离异值)

在这里插入图片描述

# 查看纬度小于 -90 的数据
train[train['pickup_latitude']< -90]

在这里插入图片描述

# 查看纬度大于 90 的数据
train[train['pickup_latitude'] > 90]

在这里插入图片描述

# 删除离异值
train.drop(train[(train['pickup_latitude'] > 90) | (train['pickup_latitude'] < -90 )].index, axis= 0 , inplace = True)
train.shape
# 输出:(999939, 8)
train['pickup_longitude'].describe() # 查看上车点的经度数据

在这里插入图片描述

train[train['pickup_longitude'] < - 180]

在这里插入图片描述

# 删除这些数据
train.drop(train[train['pickup_longitude'] < -180 ].index , axis=0 , inplace =True)
train.shape
# 输出:(999928, 8)

(5)检查下车点的经度和纬度

train.drop(train[(train['dropoff_latitude'] < -90 ) | (train['dropoff_latitude'] > 90 )].index, axis=0,inplace=True)
train.drop(train[(train['dropoff_longitude'] < -180 )| (train['dropoff_longitude'] > 180 )].index, axis=0 ,inplace= True)
train.shape
# 输出:(999911, 8)

(6)可视化地图,清理一些离异值

# 在测试集上确定一个区域,删除掉train数据集中不在区域框内的奇异点
# (1)纬度最小值,纬度最大值
min(test.pickup_latitude.min(),test.dropoff_latitude.min()), \
max(test.pickup_latitude.max(),test.dropoff_latitude.max())
# 输出: (40.568973, 41.709555)
# (2)经度最小值,经度最大值
min(test.pickup_longitude.min(), test.dropoff_longitude.min()), \
max(test.pickup_longitude.max(), test.dropoff_longitude.max())
# 输出:(-74.263242, -72.986532)
# (3)根据指定的区域框,删除掉奇异点
def select_within_boundingbox(df,BB):return (df.pickup_longitude >= BB[0]) & (df.pickup_longitude <= BB[1]) & \(df.pickup_latitude >= BB[2]) & (df.pickup_latitude <= BB[3]) & \(df.dropoff_longitude >= BB[0]) & (df.dropoff_longitude <= BB[1]) & \(df.dropoff_latitude >= BB[2]) & (df.dropoff_latitude <= BB[3])
BB = (-74.5,-72.8,40.5,41.8)
# 截图
nyc_map = plt.imread('./nyc_-74.5_-72.8_40.5_41.8.png')
BB_zoom = (-74.3, -73.7, 40.5, 40.9) # 放大后的地图
# 截图(放大)
nyc_map_zoom = plt.imread('./nyc_-74.3_-73.7_40.5_40.9.png')
train = train[select_within_boundingbox(train, BB)]# 删除区域框之外的点
train.shape
# 输出:(979018, 8)
# (4)在地图显示这些点def plot_on_map(df, BB, nyc_map, s=10, alpha=0.2):fig, axs = plt.subplots(1, 2, figsize=(16,10))# 第一个子图axs[0].scatter(df.pickup_longitude, df.pickup_latitude, alpha=alpha, c='r', s=s)axs[0].set_xlim(BB[0], BB[1])axs[0].set_ylim(BB[2], BB[3])axs[0].set_title('PickUp Locations')axs[0].imshow(nyc_map, extent=BB)# 第二个子图axs[1].scatter(df.dropoff_longitude, df.dropoff_latitude, alpha=alpha, c='r', s=s)axs[1].set_xlim((BB[0], BB[1]))axs[1].set_ylim((BB[2], BB[3]))axs[1].set_title('Dropoff locations')axs[1].imshow(nyc_map, extent=BB)
plot_on_map(train, BB, nyc_map, s=1, alpha=0.3)

在这里插入图片描述

plot_on_map(train, BB_zoom, nyc_map_zoom, s=1, alpha=0.3)

在这里插入图片描述
(7) 检查数据类型

train.dtypes

在这里插入图片描述

# 日期类型转换:key, pickup_datetimefor dataset in [train, test]:dataset['key'] = pd.to_datetime(dataset['key'])dataset['pickup_datetime'] = pd.to_datetime(dataset['pickup_datetime'])

(8)日期数据进行分析
将日期分隔为: 1.year 2.month 3.day 4.hour 5.day of week

# 增加5列,分别是:year, month, day, hour, day of weekfor dataset in [train, test]:dataset['year'] = dataset['pickup_datetime'].dt.yeardataset['month'] = dataset['pickup_datetime'].dt.monthdataset['day'] = dataset['pickup_datetime'].dt.daydataset['hour'] = dataset['pickup_datetime'].dt.hourdataset['day of week'] = dataset['pickup_datetime'].dt.dayofweek
train.head()

在这里插入图片描述

test.head()

在这里插入图片描述
(9)根据经纬度计算距离

# 计算公式def distance(lat1, long1, lat2, long2):data = [train, test]for i in data:R = 6371  # 地球半径(单位:千米)phi1 = np.radians(i[lat1])phi2 = np.radians(i[lat2])delta_phi = np.radians(i[lat2]-i[lat1])delta_lambda = np.radians(i[long2]-i[long1])#a = sin²((φB - φA)/2) + cos φA . cos φB . sin²((λB - λA)/2)a = np.sin(delta_phi / 2.0) ** 2 + np.cos(phi1) * np.cos(phi2) * np.sin(delta_lambda / 2.0) ** 2#c = 2 * atan2( √a, √(1−a) )c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1-a))#d = R*cd = (R * c) # 单位:千米i['H_Distance'] = dreturn d
distance('pickup_latitude','pickup_longitude','dropoff_latitude','dropoff_longitude')

在这里插入图片描述

# 统计距离为0,票价为0的数据train[(train['H_Distance']==0) & (train['fare_amount']==0)]

在这里插入图片描述

# 删除
train.drop(train[(train['H_Distance']==0) & (train['fare_amount']==0)].index, axis=0, inplace=True)
# 统计距离为0,票价不为0的数据# 原因1:司机等待乘客很长时间,乘客最终取消了订单,乘客依然支付了等待的费用;
# 原因2:车辆的经纬度没有被准确录入或缺失;len(train[(train['H_Distance']==0) & (train['fare_amount']!=0)])
# 输出:10478
# 删除
train.drop(train[(train['H_Distance']==0) & (train['fare_amount']!=0)].index, axis=0, inplace=True)

(10)新的字段:每公里车费:根据距离、车费,计算每公里的车费

train['fare_per_mile'] = train.fare_amount / train.H_Distancetrain.fare_per_mile.describe()

在这里插入图片描述

train.head()

在这里插入图片描述

# 统计每一年的不同时间段的每小时车费train.pivot_table('fare_per_mile', index='hour', columns='year').plot(figsize=(14, 6))
plt.ylabel('Fare $/mile')

在这里插入图片描述

四、模型训练和数据预测
train.columns

在这里插入图片描述

test.columns

在这里插入图片描述

X_train = train.iloc[:,[3,4,5,6,7,8,9,10,11,12,13]]
y_train = train.iloc[:,[1]] # fare_amount 车费
X_train.shape
# 输出:(968537, 11)
y_train.shape
# 输出:(968537, 1)
五、随机森林算法实现
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor()
rf.fit(X_train,y_train)

在这里插入图片描述

test.columns

在这里插入图片描述

rf_predict = rf.predict(test.iloc[:, [2,3,4,5,6,7,8,9,10,11,12]])
submission = pd.read_csv("sample_submission.csv")submission.head()

在这里插入图片描述

# 提交submission = pd.read_csv("sample_submission.csv")submission['fare_amount'] = rf_predictsubmission.to_csv("submission_1.csv", index=False)submission.head()

在这里插入图片描述

这篇关于【机器学习实战】二、随机森林算法预测出租车车费案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/307286

相关文章

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;