共享单车租车量预测实验
共享单车租车量预测
1 实验简介
在不同的天气情况下,租用共享单车的数量差异很大。运营人员常常无法提供足够数量的自行车,或者无法确定何时进行维修工作。预测共享单车租车量,具有实际应用价值,当共享单车需要维修时,可以选择在自行车租用数量较少的时段;在自行车租用数量大的时间,可以提供更多的自行车,增加营业额。
本实验以共享单车租车为背景,设计回归算法来预测共享单车的租车量。
2 实验目的
- 掌握回归算法
- 给定数据集,训练回归算法,完成共享单车租车量的预测
3 相关理论与知识点
(1)回归方法原理
4 实验任务及评分标准
序号 |
任务名称 |
任务具体要求 |
评分标准(100分制) |
1 |
设计合适的回归方法进行租车量预测 |
运用回归算法,对该共享单车数据进行回归分析,并对结果进行分析。 使用Mindspore框架完成,采用Jupyter写代码。 开发语言:Python。
|
Jupyter代码提交到华为云平台; 同时,将代码(.ipynb)和实验报告(word版)打包成一个文件提交到乐学平台,压缩包命名:学号+姓名+共享单车租车预测 |
5 实验条件与环境
要求 |
名称 |
版本要求 |
备注 |
编程语言 |
Python |
|
|
开发环境 |
Jupyter |
|
|
第三方工具包/库/插件 |
Mindspore
|
|
|
6 实验数据及其说明
属性(条目) |
内容 |
数据集的名称 |
共享单车数据集 |
数据集的出处 |
UCI数据库中的Bike Sharing数据集 |
数据集的主要内容 |
|
数据集的文件格式 |
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说明预测误差较小,模型对该问题有较好的回归能力。
- 点赞
- 收藏
- 关注作者
评论(0)