共享单车租车量预测实验

举报
bit_zhy 发表于 2023/06/29 04:54:28 2023/06/29
【摘要】 机器学习实验-共享单车租车量预测

共享单车租车量预测

 

1        实验简介

在不同的天气情况下,租用共享单车的数量差异很大。运营人员常常无法提供足够数量的自行车,或者无法确定何时进行维修工作。预测共享单车租车量,具有实际应用价值,当共享单车需要维修时,可以选择在自行车租用数量较少的时段;在自行车租用数量大的时间,可以提供更多的自行车,增加营业额。

本实验以共享单车租车为背景,设计回归算法来预测共享单车的租车量。

2        实验目的

  • 掌握回归算法
  • 给定数据集,训练回归算法,完成共享单车租车量的预测

3        相关理论与知识点

1)回归方法原理

4        实验任务及评分标准

序号

任务名称

任务具体要求

评分标准(100分制)

1

设计合适的回归方法进行租车量预测

运用回归算法,对该共享单车数据进行回归分析,并对结果进行分析。

使用Mindspore框架完成,采用Jupyter写代码。

开发语言:Python

 

Jupyter代码提交到华为云平台;

同时,将代码(.ipynb)和实验报告(word版)打包成一个文件提交到乐学平台,压缩包命名:学号+姓名+共享单车租车预测

 

5        实验条件与环境

 

要求

名称

版本要求

备注

编程语言

Python

 

 

开发环境

Jupyter

 

 

第三方工具包//插件

Mindspore

 

 

 

 

6        实验数据及其说明

属性(条目)

内容

数据集的名称

共享单车数据集

数据集的出处

UCI数据库中的Bike Sharing数据集

http://archive.ics.uci.edu/ml/datasets/Bike+Sharing+Dataset

数据集的主要内容


数据集的文件格式

csv格式

 

7        实验步骤及其代码

步骤序号

1

步骤名称

数据读取

步骤描述

 

代码及讲解

import pandas as pd

 

data_path = 'lab2_Data/hour.csv'

rides = pd.read_csv(data_path)

rides.head()

输出结果及其解读

 

 

步骤序号

2

步骤名称

部分数据编码

步骤描述

原始数据的星期几,天气情况等因素需要编码,这样数据才有意义。

代码及讲解

dummy_fields = ['season', 'weathersit', 'mnth', 'hr', 'weekday']

for each in dummy_fields:

    dummies = pd.get_dummies(rides[each], prefix=each, drop_first=False)

    rides = pd.concat([rides, dummies], axis=1)

输出结果及其解读

 

 

 

步骤序号

3

步骤名称

删除被编码列和不相关列

步骤描述

把原来的表格里面被编码原始列与不相关列去掉

代码及讲解

fields_to_drop = ['instant', 'dteday', 'season', 'weathersit',

                  'weekday', 'atemp', 'mnth', 'workingday', 'hr']

data = rides.drop(fields_to_drop, axis=1)

data.head()

输出结果及其解读

 

 

步骤序号

4

步骤名称

归一化部分列

步骤描述

归一化部分列

代码及讲解

quant_features = ['cnt', 'temp', 'hum', 'windspeed']

 

scaled_features = {}

for each in quant_features:

    mean, std = data[each].mean(), data[each].std()

    scaled_features[each] = [mean, std]

    data.loc[:, each] = (data[each] - mean)/std

输出结果及其解读

 

 

步骤序号

5

步骤名称

数据划分

步骤描述

划分训练集和测试集,最后21天为测试集

代码及讲解

train_data = data[:-21*24]

test_data = data[-21*24:]

print('训练数据:',len(train_data),'测试数据:',len(test_data))

输出结果及其解读

训练数据: 16875 测试数据: 504

 

步骤序号

6

步骤名称

生成训练样本和训练目标值

步骤描述

提取用户数等列作为目标

代码及讲解

import numpy as np

 

target_fields = ['cnt', 'casual', 'registered']

features, targets = train_data.drop(target_fields, axis=1), train_data[target_fields]

test_features, test_targets = test_data.drop(target_fields, axis=1), test_data[target_fields]

 

X = features.values

Y = targets['cnt'].values

Y = Y.astype(float)

Y = np.reshape(Y, [len(Y),1])

test_X = test_features.values

test_Y = test_targets['cnt'].values

test_Y = test_Y.astype(float)

test_Y = np.reshape(test_Y, [len(test_Y),1])

features.head()

输出结果及其解读

 

 

步骤序号

7

步骤名称

定义超参数

步骤描述

定义学习率、训练轮数和批大小

代码及讲解

learning_rate = 0.01

num_epoches = 5

batch_size = 32

输出结果及其解读

 

 

步骤序号

8

步骤名称

构建数据集

步骤描述

构建数据集并进行数据类型转换和批划分

代码及讲解

import mindspore

from mindspore.dataset import NumpySlicesDataset

import mindspore.dataset.transforms as transforms

   

train_dataset = NumpySlicesDataset((X, Y), ["data", "label"])

test_dataset = NumpySlicesDataset((test_X, test_Y), ["data", "label"])

 

train_dataset = train_dataset.map(operations=transforms.TypeCast(mindspore.float32), input_columns='data')

test_dataset = test_dataset.map(operations=transforms.TypeCast(mindspore.float32), input_columns='data')

 

train_dataset = train_dataset.batch(batch_size)

test_dataset = test_dataset.batch(batch_size)

输出结果及其解读

 

 

步骤序号

9

步骤名称

构建网络框架

步骤描述

构建一个简单的MLP作为回归模型

代码及讲解

import mindspore.nn as nn

 

class Network(nn.Cell):

    def __init__(self):

        super().__init__()

        self.flatten = nn.Flatten()

        self.dense_relu_sequential = nn.SequentialCell(

            nn.Dense(56, 10),

            nn.Sigmoid(),

            nn.Dense(10, 1)

        )

 

    def construct(self, x):

        logits = self.dense_relu_sequential(x)

        return logits

   

network = Network()

输出结果及其解读

 

 

步骤序号

10

步骤名称

定义损失函数和优化器

步骤描述

MSE损失函数和SGD优化器

代码及讲解

net_loss = nn.MSELoss()

net_opt = nn.SGD(network.trainable_params(), learning_rate = learning_rate)

输出结果及其解读

 

 

步骤序号

11

步骤名称

训练模型

步骤描述

训练模型

代码及讲解

from mindvision.engine.callback import LossMonitor

from mindspore.train import Model

 

model=Model(network, loss_fn=net_loss, optimizer=net_opt, metrics={'MSE':nn.MSE()})

 

print('training...')

model.train(num_epoches, train_dataset, callbacks=[LossMonitor(learning_rate, 100)])

输出结果及其解读

training...

Epoch:[  0/  5], step:[  100/  528], loss:[1.278/0.998], time:0.486 ms, lr:0.01000

Epoch:[  0/  5], step:[  200/  528], loss:[0.826/1.017], time:0.474 ms, lr:0.01000

Epoch:[  0/  5], step:[  300/  528], loss:[0.887/1.006], time:0.570 ms, lr:0.01000

Epoch:[  0/  5], step:[  400/  528], loss:[0.595/1.009], time:0.412 ms, lr:0.01000

Epoch:[  0/  5], step:[  500/  528], loss:[0.772/1.001], time:0.488 ms, lr:0.01000

Epoch time: 1969.133 ms, per step time: 3.729 ms, avg loss: 1.008

Epoch:[  1/  5], step:[   72/  528], loss:[0.883/0.955], time:0.504 ms, lr:0.01000

Epoch:[  1/  5], step:[  172/  528], loss:[0.692/0.968], time:0.444 ms, lr:0.01000

Epoch:[  1/  5], step:[  272/  528], loss:[1.057/0.987], time:0.487 ms, lr:0.01000

Epoch:[  1/  5], step:[  372/  528], loss:[0.544/0.986], time:0.492 ms, lr:0.01000

Epoch:[  1/  5], step:[  472/  528], loss:[0.893/0.988], time:0.537 ms, lr:0.01000

Epoch time: 1480.507 ms, per step time: 2.804 ms, avg loss: 0.984

Epoch:[  2/  5], step:[   44/  528], loss:[0.641/0.961], time:0.473 ms, lr:0.01000

Epoch:[  2/  5], step:[  144/  528], loss:[0.810/0.909], time:0.441 ms, lr:0.01000

Epoch:[  2/  5], step:[  244/  528], loss:[0.846/0.881], time:0.442 ms, lr:0.01000

Epoch:[  2/  5], step:[  344/  528], loss:[1.301/0.858], time:0.426 ms, lr:0.01000

Epoch:[  2/  5], step:[  444/  528], loss:[1.077/0.840], time:0.420 ms, lr:0.01000

Epoch time: 1325.965 ms, per step time: 2.511 ms, avg loss: 0.822

Epoch:[  3/  5], step:[   16/  528], loss:[0.444/0.679], time:0.512 ms, lr:0.01000

Epoch:[  3/  5], step:[  116/  528], loss:[0.396/0.699], time:0.454 ms, lr:0.01000

Epoch:[  3/  5], step:[  216/  528], loss:[0.274/0.677], time:0.463 ms, lr:0.01000

Epoch:[  3/  5], step:[  316/  528], loss:[0.968/0.673], time:0.498 ms, lr:0.01000

Epoch:[  3/  5], step:[  416/  528], loss:[0.420/0.669], time:0.496 ms, lr:0.01000

Epoch:[  3/  5], step:[  516/  528], loss:[0.504/0.667], time:0.472 ms, lr:0.01000

Epoch time: 1475.405 ms, per step time: 2.794 ms, avg loss: 0.668

Epoch:[  4/  5], step:[   88/  528], loss:[1.044/0.635], time:0.510 ms, lr:0.01000

Epoch:[  4/  5], step:[  188/  528], loss:[0.538/0.610], time:0.448 ms, lr:0.01000

Epoch:[  4/  5], step:[  288/  528], loss:[0.809/0.611], time:0.474 ms, lr:0.01000

Epoch:[  4/  5], step:[  388/  528], loss:[0.879/0.611], time:0.482 ms, lr:0.01000

 

步骤序号

12

步骤名称

测试

步骤描述

 

代码及讲解

acc = model.eval(test_dataset)

 

print("{}".format(acc))

输出结果及其解读

'MSE': 0.3946835798660693

8        实验结果及解读

MSE为0.39说明预测误差较小,模型对该问题有较好的回归能力。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。