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

news2024/11/16 1:50:49

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

一、导入第三方库

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_datetime

for 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 week

for dataset in [train, test]:
    dataset['year'] = dataset['pickup_datetime'].dt.year
    dataset['month'] = dataset['pickup_datetime'].dt.month
    dataset['day'] = dataset['pickup_datetime'].dt.day
    dataset['hour'] = dataset['pickup_datetime'].dt.hour
    dataset['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*c
        d = (R * c) # 单位:千米
        i['H_Distance'] = d
    return 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_Distance

train.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_predict

submission.to_csv("submission_1.csv", index=False)

submission.head()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java-抽象类与接口

前言 温故而知新 最近从头来看当初学过的语法知识点, 温故而知新, 发现当初还有许多未掌握的知识, 所以我建议大家也要多温故, 可能当初有好多知识点是没掌握到的. 这篇博客的重点就是介绍抽象类与接口, 并阐述他们的区别. 一. 抽象类 1. 概念 在面向对象的概念中, 所有的…

git基础

代码托管平台&#xff1a;git.acwing.com 一、git基本概念 工作区&#xff1a;仓库的目录。工作区是独立于各个分支的。 暂存区&#xff1a;数据暂时存放的区域&#xff0c;类似于工作区写入版本库前的缓存区。暂存区是独立于各个分支的。 版本库&#xff1a;存放所有已经提交…

黑马Hive+Spark离线数仓工业项目--数仓主题应用层ST层构建(2)

服务域&#xff1a;回访主题分析 目标&#xff1a;掌握回访主题的需求分析 路径 - step1&#xff1a;需求 - step2&#xff1a;分析 实施 需求&#xff1a;统计不同维度下的回访主题指标的结果 分析 - 指标 - 回访工程师数量、回访人员数量、回访人员最大数量、回访人员最…

C++学习 Day.8 (重载运算符和类型转换运算符)ps:一大波参考博客来袭~~

this指针 详解请点这里 复制构造函数详解 点这里和这里 指针的指针的地址&#xff0c;指针自身的地址&#xff0c;指针指向的地址 点这里 实例化解释很好 引用和指针的区别 点这里和这里 引用详解&#xff1a;C&#xff1a;引用的简单理解 - Tom文星 - 博客园 (cnblogs.co…

SMC详解

SMC全称:Secure Monitor Call 目的&#xff1a;进入到EL3异常等级 应用场景&#xff1a;大于等于EL1异常等级下使用&#xff08;EL0下不能使用&#xff09; 官方介绍以及使用方式如下&#xff1a; 主要配置&#xff1a; (1) SCR_EL3.SMD&#xff1a; (2) HCR_EL2.TSC 主要功…

ArcGIS基础实验操作100例--实验20按像元修改栅格值

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 基础编辑篇--实验20 按像元修改栅格值 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

SpringCloud整合Seata(AT两阶段--场景: 下单减少库存)

文章目录零&#xff1a;前置操作 --- 搭建Seata服务一&#xff1a;介绍说明二&#xff1a;添加undolog表三&#xff1a;框架整合Seata相关依赖3.1&#xff1a;引入公共SEATA POM依赖3.2&#xff1a;业务服务引入SEATA公共组件依赖3.3&#xff1a;yml文件配置Seata客户端和注册信…

[C++]模板与STL简介

&#x1f941;作者&#xff1a; 华丞臧 &#x1f4d5;​​​​专栏&#xff1a;【C】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449;LeetCode 文章目录模板初阶…

AspNetCore中的日志组件

介绍 本文写作年代比较久远&#xff0c;最新日志文档请查看&#xff1a; .NET Core 和 ASP.NET Core 中的日志记录 | Microsoft Learn了解如何使用由 Microsoft Extension.Logging NuGet 包提供的日志记录框架。https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/l…

选择-C++选择分支

引言 你们喜欢吃"只因"肉? a > 喜欢 b > 还行 c > 不喜欢 请说出你的答案: 证明 真ikun 和假ikun 关键点 我现在 a 因为我是ikun 我是 唯一玩梗的CSDN技术型博主 哈哈所以夹带点私货 你们dddd(懂的都懂) 关注我,让你看到更多的C/C 的技术点和技术以外的梗…

CTF之MISC题目-简单流量

CTF系列文章 第一篇 CTF之密码学题目-classical && coding 第二篇 CTF之MISC题目-西游记 第三篇 CTF之MISC题目-简单流量 文章目录CTF系列文章前言一、题目是什么&#xff1f;二、解题步骤1.下载文件、解压2.使用wireshark3.解压flag.zip总结前言 这是一道关于网络数…

ElasticSearch-倒排索引

文章目录一、mysql数据库存在的问题1.1 模糊查询索引失效1.2 不能分词查询二、倒排索引一、mysql数据库存在的问题 1.1 模糊查询索引失效 假设要查询上图中title中包含"手机"的信息&#xff0c;那么sql语句是这样的 SELECT * FROM goods WHERE title LIKE %手机%;如…

功能更新 | 身份认证增强安全配置

在开始本文前&#xff0c;先给大家出个解谜题&#xff0c;密码在下一段文字里&#xff0c;由 9 个字组成&#xff0c;开动你的脑筋吧&#xff0c;我们在本文结尾会揭晓答案&#xff1a; 2022 年马上就要结束了&#xff0c;机遇与挑战并存的一年。昨天&#xff0c;北京郊区一些地…

企业电子招标采购系统源码及功能清单

​ ​ 一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点&#xff1a;对草稿进行编…

从卖货到广告,跨境电商解锁变现新模式

一、经济全球化背景下&#xff0c;跨境电商作为外贸发展的新模式&#xff0c;可谓势头正盛。而 2022 年&#xff0c;在汇率波动、欧美通胀等不可抗逆因素的影响下&#xff0c;跨境电商大环境也面临着诸多挑战。对于消费者而言&#xff0c;全球通货膨胀持续走高&#xff0c;物价…

List、List<Object>、List<?>

List、List、List<?>ListList<Object>List<?>demoList 1、声明的List集合对其 所指向的集合对象&#xff08;就是赋值的集合对象&#xff09;的限制:无泛型限制&#xff0c;并且无视指向的集合对象的泛型&#xff0c;直接当成List处理&#xff08;泛型擦除…

软件测试难吗?应该怎样学习?

软件测试是一份不错的职业&#xff0c;现在也有许多小伙伴想要学习软件测试技术&#xff0c;成为一名软件测试员。但是零经验的小白又担心不知道软件测试好不好学&#xff0c;应该如何学习软件测试能力&#xff0c;需要做哪些培训呢。下面就给大家推荐一些学习经验与技巧&#…

【JavaEE】JVM(八股文!)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录【JVM内存划分】【JVM类加载】【JVM垃圾回收机制GC】一&#xff09;GC是啥二&#xff09;GC回收哪部分内存三&#xff09;具体怎么回收四&#xff09;怎么找垃圾&#xff08;判定某个对象是否是垃圾&#xff09;五&a…

圆和椭圆外投影

1 圆外一点在缩放到圆上 圆方程: x2y222x^2y^2 2^2 x2y222 直线方程: ykxy kx ykx 圆外一点: A(3,3)A(3,3)A(3,3) 求点B. 方法1-解方程 圆外一点A(3,3)A(3,3)A(3,3),那么:直线k1k1k1,直线方程:yxyxyx 方程联立: x2x24x^2 x^2 4 \\ x2x24 x2y2x \sqrt{2} \\ y \sqrt…

点云 3D 分割 - SqueezeSeg(ICRA 2018)

点云 3D 分割 - SqueezeSeg&#xff08;ICRA 2018&#xff09;摘要1. 引言2. 相关工作A. 三维激光雷达点云的语义分割B. 用于3D点云的CNNC. 图像的语义分割D. 通过模拟收集数据3. 方法描述A. 点云变换B. 网络结构C. 条件随机场D. 数据收集4. 实验A. 评估指标B. 实验设置C. 实验…