头歌-机器学习 第13次实验 特征工程——共享单车之租赁需求预估

news2025/6/22 5:01:05

第1关:数据探索与可视化

任务描述

本关任务:编写python代码,完成一天中不同时间段的平均租赁数量的可视化功能。

相关知识

为了完成本关任务,你需要掌握:

  • 读取数据
  • 数据探索与可视化
读取数据

数据保存在./step1/bike_train.csv中,共享单车的训练集数据总共有8709个训练样本,训练样本中有12个特征(其中count为标签)。特征说明如下:

  • datetime:时间。年月日小时格式
  • season:季节。1:春天;2:夏天;3:秋天;4:冬天
  • holiday:是否节假日。0:否;1:是
  • workingday:是否工作日。0:否;1:是
  • weather:天气。1:晴天;2:阴天;3:小雨或小雪;4:恶劣天气
  • temp:实际温度
  • atemp:体感温度
  • humidity:湿度
  • windspeed:风速
  • casual:未注册用户租车数量
  • registered:注册用户租车数量
  • count:总租车数量

想要读取数据很简单,使用pandas即可,代码如下:

 
  1. import pandas as pd
  2. train_df = pd.read_csv('./step1/bike_train.csv')
  3. # 打印数据中的前5行
  4. print(train_df.head(5))

输出如下图所示:

数据探索与可视化

一般拿到数据之后都需要做数据探索(EDA),因为我们需要看看数据到底长什么样子,有什么特性是可以挖掘出来的。假设我们需要看看数据的大概分布是什么样的。可以用pandas提供的describe()函数。输出如下:

此时我们能看到count的标准差很大,我们可以将count的数据分布可视化出来,代码如下:

 
  1. import matplotlib.pyplot as plt
  2. plt.figure(figsize=(10,10))
  3. # 画count的直方图
  4. plt.hist(train_df['count'],bins=20)
  5. plt.title('count histgram')
  6. plt.xlabel('count')

可视化结果如下:

从可视化结果可以看出,count的整体的分布倾斜比较严重,需要处理一下,不然可能过拟合会有点严重。此时我们可以考虑将count的数值在3个标准差之外的样本给扔掉,减少训练集中的噪声,并对countlog变换。代码如下:

 
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import seaborn as sns
  4. # 筛选3个标准差以内的数据
  5. train_df=train_df[np.abs(train_df['count']-train_df['count'].mean())<=3*train_df['count'].std()]
  6. # log变换
  7. y=train_df['count'].values
  8. y_log=np.log(y)
  9. # 可视化
  10. sns.distplot(y_log)
  11. plt.title('distribution of count after log')

处理后可视化结果如下:

可以从可视化结果看出,转换过后,count的分布倾斜没有那么严重了,差异也变小了。

接下来我们看看其他的一些特征对于共享单车租赁量的影响。

首先来看看季节对于租赁量的影响,代码如下:

 
  1. day_df=train_df.groupby('date').agg({'season':'mean',
  2. 'casual':'sum', 'registered':'sum',
  3. 'count':'sum','temp':'mean',
  4. 'atemp':'mean','workingday':'mean','holiday':'mean'})
  5. season_day_mean=day_df.groupby(['season'],as_index=True).agg({'casual':'mean', 'registered':'mean','count':'mean'})
  6. temp_df = day_df.groupby(['season'], as_index=True).agg({'temp':'mean', 'atemp':'mean'})
  7. season_day_mean.plot(figsize=(15,9),xticks=range(1,4))
  8. plt.title('count in different season')

可视化结果如下:

从可视化结果可以看出,临时用户和注册用户用车数量变化趋势大体一致,且两年间都在秋季左右达到了比较高的用车辆,说明美国人也都比较喜欢在这段时间外出游玩。这是符合常理的。

接下来看看天气对租赁数量的影响,代码如下:

 
  1. weather_group=train_df.groupby(['weather'])
  2. weather_count=weather_group[['count','registered','casual']].count()
  3. weather_mean=weather_group[['count','registered','casual']].mean()
  4. # 不同天气的每小时平均租赁数量
  5. weather_mean.plot.bar(stacked=True,title='count per hour in different weather')

可视化结果如下:

讲道理,天气比较好的时侯,骑共享单车的人才比较多。但上图中像4(恶劣天气)这种天气的租赁数量也比较高,这是不是有点反常呢?我们可以从数据集中找出对应的数据看看,代码如下:

 
  1. print(train_df.loc[train_df.weather==4])

数据结果如下:

数据的时间是下午6点,刚好是下班的高峰期,所以能够理解为什么这条数据对应的租赁量均值那么高了,这也是符合常理的。

那么一天中不同时间段对于租赁数量有什么样的影响呢?这个就留给你做练习吧。

编程要求

根据提示,在右侧编辑器Begin-End处补充代码,将./step1/bike_train.csv中的数据按照hour这个特征分组,然后求每一组的count的平均值。并使用matplotlib.pyplot绘制折线图,并保存到./step1/result/plot.png

测试说明

平台会对你生成的折线图与正确答案进行比对,因此请按照以下要求可视化:

  • 折线图的figsize(10, 10)
  • 折线图的标题为average count per hour

测试输入: 预期输出:你的答案与正确答案一致

import pandas as pd
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

#********* Begin *********#
import pandas as pd

import matplotlib.pyplot as plt

train_df = pd.read_csv('./step1/bike_train.csv')

train_df['hour'] = train_df.datetime.apply(lambda x:x.split()[1].split(':')[0]).astype('int')

group_hour=train_df.groupby(train_df.hour)

hour_mean=group_hour[['count','registered','casual']].mean()

fig=plt.figure(figsize=(10,10))

plt.plot(hour_mean['count'])

plt.title('average count per hour')

plt.savefig('./step1/result/plot.png')

#********* End *********#

第2关:特征工程

任务描述

本关任务:编写python代码,完成时间细化的功能。

相关知识

为了完成本关任务,你需要掌握:

  • 相关性分析
  • 特征选择
相关性分析

在选择特征之前,我们可以看看各个特征相关性的强弱。代码如下:

 
  1. # 计算特征对的相关性
  2. corr_df=train_df.corr()
  3. corr_df1=abs(corr_df)
  4. # 画热力图
  5. fig=plt.gcf()
  6. fig.set_size_inches(30,12)
  7. sns.heatmap(data=corr_df1,square=True,annot=True,cbar=True)

相关性热力图如下(其中颜色越亮,代表线性相关性越高):

选择特征

在使用相关性这一指标来选择特征时,通常选择相关性较低,也就是颜色较暗的特征。因为如果选择相关性较高的,比如tempatemp。从图可以看出这两个特征的相关性很高,也就是说在训练模型的时候,这两个特征所对应的权重是成比例的。既然成比例,那么之选其中一个就行了。

根据热力图我们暂且可以选择时段(hour)、温度(temp)、湿度(humidity)、季节(season)、天气(weather)、风速(windspeed)、是否工作日(workingday)、是否假日(holiday 、注册用户租赁数量(registered)作为特征。

编程要求

现在可能觉得datetime这个字段有必要再细化挖掘一下,比如细化成年份、月份、日期、星期几等。

根据提示,在右侧编辑器Begin-End处补充代码,实现transform_data函数。该函数需要你将train_df中的datetime字段进行细化,细化成year(年份)、month(月份)、date(日期)、weekdat(星期几)、hour(小时)。并返回细化后的DataFrame

例如,原始数据如下:

细化后数据如下:

测试说明

平台会对你返回的DataFrame与答案进行比对,您只需实现transform_data即可。

测试输入: 预期输出:你的答案与正确答案一致。

import pandas as pd
import numpy as np
from datetime import datetime

def transform_data(train_df):
    '''
    将train_df中的datetime划分成year、month、date、weekday、hour
    :param train_df:从bike_train.csv中读取的DataFrame
    :return:无
    '''

    #********* Begin *********#
    train_df['date'] = train_df.datetime.apply(lambda x:x.split()[0])
    train_df['hour'] = train_df.datetime.apply(lambda x:x.split()[1].split(':')[0]).astype('int')
    train_df['year'] = train_df.datetime.apply(lambda x:x.split()[0].split('-')[0]).astype('int')
    train_df['month'] = train_df.datetime.apply(lambda x: x.split()[0].split('-')[1]).astype('int')
    train_df['weekday'] = train_df.date.apply(lambda x: datetime.strptime(x, '%Y-%m-%d').isoweekday())
    return train_df

    #********* End **********#

第3关:租赁需求预估

任务描述

本关任务:编写python代码,实现租赁需求预估。

相关知识

为了完成本关任务,你需要掌握:

  • 独热编码
  • sklearn机器学习算法的使用
  • 生成预测结果
独热编码

一般来说,代表类型型的特征我们需要对其进行独热编码。像数据中季节这种类别型的特征,应该使用独热编码。因为如果使用原始的1、2、3、4的话,机器学习算法可能会认为4这个季节更重要。为了防止这种偏见,我们就需要对其进行独热编码。

独热编码其实很简单,就是将待编码的特征的所有可能的取值列出来,然后再在对应的位置上填1,其他位置填0。可以看成是二进制的一种变形。

比如有4个样本的season分别为2、2、2、1。如下图所示:

那么将其独热编码后,如下图所示(第1行到第3行的season=2,所以编码后,每行的season_2这一列为1,其他列为0。而第4行的season=1,所以编码后,season_1这一列为1,其他列为0):

代码如下:

 
  1. import pandas as pd
  2. # 将train_df中的season这一列进行独热编码
  3. dummies_season = pd.get_dummies(train_df['season'], prefix='season')
  4. # 打印
  5. print(dummies_season)
sklearn机器学习算法的使用

sklearn中提供了非常多的机器学习算法的接口,例如逻辑回归、弹性网络、随机森林等等。而且使用起来非常简单,只需要fitpredict二连即可。而本关是对共享单车的租赁需求量做预测,所以这是一个回归问题。在这里给出sklearn解决回归问题的示例代码:

 
  1. from sklearn.linear_model import Ridge
  2. # 实例化Ridge回归对象
  3. ridge = Ridge(alpha=1.0)
  4. # 使用训练集的数据和标签训练
  5. ridge.fit(train_df, train_label)
  6. # 对测试集数据进行预测
  7. pred_result = ridge.predict(test_df)
生成预测结果

想要将预测结果保存到文件中,可以使用pandas来实现,示例代码如下:

 
  1. import pandas as pd
  2. # 构建DataFrame,pred_result为机器学习算法的预测结果
  3. result = pd.DataFrame({'count':pred_result})
  4. # 将DataFrame保存成result.csv,并且保存时不保留index
  5. result.to_csv('./result.csv', index=False)
编程要求

根据提示,在右侧编辑器补充代码。代码主要任务如下:

  • 读取./step3/bike_train.csv中的数据作为训练集,读取./step3/bike_test.csv中的数据作为测试集
  • 将数据处理成你想要的样子
  • 使用sklearn对训练集数据进行训练,并对测试集进行预测
  • 将预测结果保存至./step3/result.csv
测试说明

平台会计算你保存的./step3/result.csvr2 score。若r2 score高于0.95视为过关。

测试输入: 预期输出:你的预测结果的r2 score高于0.95

PS:./step3/result.csv中需要两列。一列为datetime,另一列为count。其中datetime./step3/bike_test.csv中的datetimecount为你的预测结果。如:

#********* Begin *********#  
import pandas as pd  
import numpy as np  
from datetime import datetime  
from sklearn.linear_model import Ridge
train_df = pd.read_csv('./step3/bike_train.csv')
# 舍弃掉异常count  
train_df=train_df[np.abs(train_df['count']-train_df['count'].mean())<=3*train_df['count'].std()]
# 训练集的时间数据处理
train_df['date']=train_df.datetime.apply(lambda x:x.split()[0])  
train_df['hour']=train_df.datetime.apply(lambda x:x.split()[1].split(':')[0]).astype('int')  
train_df['year']=train_df.datetime.apply(lambda x:x.split()[0].split('-')[0]).astype('int')  
train_df['month']=train_df.datetime.apply(lambda x:x.split()[0].split('-')[1]).astype('int')  
train_df['weekday']=train_df.date.apply( lambda x : datetime.strptime(x,'%Y-%m-%d').isoweekday())
# 独热编码  
train_df_back=train_df  
dummies_month = pd.get_dummies(train_df['month'], prefix='month')  
dummies_year = pd.get_dummies(train_df['year'], prefix='year')  
dummies_season = pd.get_dummies(train_df['season'], prefix='season')  
dummies_weather = pd.get_dummies(train_df['weather'], prefix='weather')
train_df_back = pd.concat([train_df, dummies_month,dummies_year, dummies_season,dummies_weather], axis = 1)
train_label = train_df_back['count']  
train_df_back = train_df_back.drop(['datetime', 'season', 'weather', 'atemp', 'date', 'month', 'count'], axis=1)
test_df = pd.read_csv('./step3/bike_test.csv')
# 测试集的时间数据处理  
test_df['date']=test_df.datetime.apply(lambda x:x.split()[0])  
test_df['hour']=test_df.datetime.apply(lambda x:x.split()[1].split(':')[0]).astype('int')  
test_df['year']=test_df.datetime.apply(lambda x:x.split()[0].split('-')[0]).astype('int')  
test_df['month']=test_df.datetime.apply(lambda x:x.split()[0].split('-')[1]).astype('int')  
test_df['weekday']=test_df.date.apply( lambda x : datetime.strptime(x,'%Y-%m-%d').isoweekday())
# 独热编码
test_df_back=test_df  
dummies_month = pd.get_dummies(test_df['month'], prefix='month')  
dummies_year = pd.get_dummies(test_df['year'], prefix='year')  
dummies_season = pd.get_dummies(test_df['season'], prefix='season')  
dummies_weather = pd.get_dummies(test_df['weather'], prefix='weather')
test_df_back = pd.concat([test_df, dummies_month,dummies_year, dummies_season,dummies_weather], axis = 1)  
test_df_back = test_df_back.drop(['datetime', 'season', 'weather', 'atemp', 'date', 'month'], axis=1)
clf = Ridge(alpha=1.0)
# 训练  
clf.fit(train_df_back, train_label)  
# 预测  
count = clf.predict(test_df_back)
# 保存结果  
result = pd.DataFrame({'datetime':test_df['datetime'], 'count':count})  
result.to_csv('./step3/result.csv', index=False)  
#********* End *********#  

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

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

相关文章

JUC:实现一个简易的数据库连接池(享元模式)

主要是学习享元模式。 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在通过共享尽可能多的对象来最小化内存使用和提高性能。在该模式中&#xff0c;对象被分为两种状态&#xff1a;内部状态和外部状态。 内部状态&#xff08;Intr…

[SystemVerilog]常见设计模式/实践

常见设计模式/实践 RTL 设计&#xff08;尤其是 ASIC&#xff09;的最终目标是制作出最小、最快的电路。为此&#xff0c;我们需要了解综合工具如何分析和优化设计。此外&#xff0c;我们还关注仿真速度&#xff0c;因为等待测试运行实际上是在浪费工程精力。虽然综合和仿真工…

智造未来,引领潮流:中科美菱新品发布展现制造新力量

2024年3月30日&#xff0c;中科美菱在第十六届中国整合生物样本学大会上瞩目亮相&#xff0c;发布了其全新力作—云智安菱睿系列全自动超低温样本存储设备SU-80。同时&#xff0c;公司还携云智安自动化样本库解决方案闪耀昆明。这一新品的华丽登场&#xff0c;不仅向世界展示了…

本地域名解析DNS

本地域名解析&#xff1a; - 需要修改本地hosts&#xff0c;增加映射 - windows hosts文件目录 c:\windows\system32\drivers\etc\hosts - 增加映射 22.100.10.122 gitlab.xxx.cn

爬取豆瓣(线程、Session)优化版本

爬取豆瓣&#xff08;线程、Session&#xff09;优化版本 该文章只是为了精进基础&#xff0c;对Session、threading、网站请求解析的理解。 此版本没有爬取详情页。还在学习阶段的读者可以尝试一下。 适用于基础刚开始学习爬虫的&#xff01; 1.改进点&#xff1a; 将普通的r…

JDK版本升级后连不上MySQL数据库的问题

1. 问题描述 用户在将 JDK 版本从 8 升级到 11 后&#xff0c;发现应用无法连接到 MySQL 数据库&#xff0c;出现连接超时或连接被拒绝的错误。 例如出现如下报错信息&#xff1a; 可能原因&#xff1a; JDBC驱动版本不兼容&#xff1a; 新的 JDK 11 可能需要使用更高版本的 My…

时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测

时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测 目录 时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-ESN基于麻雀搜索…

数据的未来:人工智能引领下的大数据革命

大数据是指在一定时间范围内&#xff0c;无法通过常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;这种数据具有海量、高增长率和多样化的特点&#xff0c;需要采用新的处理模式才能发挥其更强的决策力、洞察发现力和流程优化能力。大数据将数据视为核心资源&#xff0…

Vue 项目如何在VSCode中进行断点调试

概要&#xff1a; 简单介绍一下&#xff0c;在VSCode中如何对Vue项目进行断点调试。具体内容包括但不限于&#xff1a;如何配置调试环境、如何在代码中设置断点、如何启动调试以及如何解决在调试过程中可能遇到的问题。 实际开发中&#xff0c;我们的前端项目一般都是在浏览器…

11 flink-sql 中基于 mysql-cdc 连接 mysql-pxc 集群无法获取增量数据问题

前言 问题是来自于 群友, 2024.03.29, 也是花了一些时间 来排查这个问题 大致的问题是用 mysql-cdc 连接了一个 mysql-pxc 集群, 然后创建了一个 test_user 表 使用 "select * from test_user" 获取数据表的数据, 可以拿到 查询时的快照, 但是 无法获取到后续对…

使用QT 开发不规则窗体

使用QT 开发不规则窗体 不规则窗体贴图法的不规则窗体创建UI模板创建一个父类创建业务窗体main函数直接调用user_dialog创建QSS文件 完整的QT工程 不规则窗体 QT中开发不规则窗体有两种方法&#xff1a;&#xff08;1&#xff09;第一种方法&#xff0c;使用QWidget::setMask函…

CSS伪元素::after清除浮动样式

一.代码 1.清除前 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </h…

Vue3学习01 Vue3核心语法

Vue3学习 1. Vue3新的特性 2. 创建Vue3工程2.1 基于 vue-cli 创建项目文件说明 2.2 基于 vite 创建具体操作项目文件说明 2.3 简单案例(vite) 3. Vue3核心语法3.1 OptionsAPI 与 CompositionAPIOptions API 弊端Composition API 优势 ⭐3.2 setup小案例setup返回值setup 与 Opt…

[计算机效率] 看图工具:Honeyview

3.23 看图工具&#xff1a;Honeyview Honeyview是一款轻量级、快速且功能强大的图片浏览器&#xff0c;具有多种强大的功能和特点。 多种图像格式支持&#xff1a;Honeyview支持几乎所有常见的图像格式&#xff0c;包括JPG、PNG、BMP、GIF等&#xff0c;甚至包括一些不常见的格…

搭建NFS服务器,部署k8s集群,并在k8s中使用NFS作为持久化储存

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、k8s概述 2、NFS简介 二、NFS服务器…

机器学习和深度学习-- 李宏毅(笔记与个人理解)Day8

Day 8 classification &#xff1a;Probabilistic Generative Model 今天上了一整天的课&#xff0c; 本来实在是更新不动了&#xff0c;但是看到《剑来》更新了&#xff0c;想一想这本书里面一直强调的成功的feature – 心性&#xff0c;嗯心性坚毅就好&#xff01;主人公陈平…

日程安排组件DHTMLX Scheduler v7.0新版亮点 - 拥有多种全新的主题

DHTMLX Scheduler是一个类似于Google日历的JavaScript日程安排控件&#xff0c;日历事件通过Ajax动态加载&#xff0c;支持通过拖放功能调整事件日期和时间&#xff0c;事件可以按天、周、月三个种视图显示。 备受关注的DHTMLX Scheduler 7.0版本日前正式发布了&#xff0c;如…

使用ROCm的HIP API向量加法程序

一、向量加法程序 Radeon Open Compute (ROCm) 是一个开源平台&#xff0c;用于加速高性能计算 (HPC) 和机器学习应用程序。它支持包括GPUs在内的多种硬件&#xff0c;并提供HIP (Heterogeneous-compute Interface for Portability) 作为CUDA代码的便捷转换工具。为了提供一个…

BPMN.JS中文教程学习

基础篇 vue bpmn.js 建模BpmnModeler将数据转图形bpmnModeler.importXML // basic.vue<script>// 引入相关的依赖import BpmnModeler from bpmn-js/lib/Modelerimport {xmlStr} from ../mock/xmlStr // 这里是直接引用了xml字符串export default {name: ,components: {…

使用 Docker 部署 Open-Resume 在线简历平台

1&#xff09;Open-Resume 介绍 GitHub&#xff1a; https://github.com/xitanggg/open-resume Open-Resume 是一款功能强大的开源 简历生成器 和 简历解析器 。可以帮助我们快速的生成个人简历&#xff0c;并定制化不同的主题和布局风格。该项目的目标是为每个人提供免费的现…