1.数据来源:本例将会使用一个国外的共享单车公开数据集(Capital Bikeshare)来完成我们的任务,数据集下载链接:www.capitalbikeshare.com/ system-data。(或者也在我上传的资源中也有https://download.csdn.net/download/qq_40840797/20325952)

数据介绍:特征因素(例如:年份,季度,星期几,温度,风速等因素);目标变量(用户数,临时注册用户数,注册用户数)

2数据处理

import numpy as np
import pandas as pd #读取csv文件的库
from matplotlib import pyplot as plt
import torch
import torch.optim as optim
data_path = 'Bike-Sharing-Dataset/hour.csv'#数据位置
rides = pd.read_csv(data_path)#读取数据文件
rides.head()#看看数据长什么样子

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

# season=1,2,3,4, weathersi=1,2,3, mnth= 1,2,...,12, hr=0,1, ...,23, weekday=0,1,...,6
# 经过下面的处理后,将会多出若干特征,例如,对于season变量就会有 season_1, season_2, season_3, season_4dummy_fields = ['season', 'weathersit', 'mnth', 'hr', 'weekday']# 这四种不同的特征,进行编码
for each in dummy_fields:#利用pandas对象,我们可以很方便地将一个类型变量属性进行one-hot编码,变成多个属性dummies = pd.get_dummies(rides[each], prefix=each, drop_first=False)#prefix是用来生成列名字,drop_first是否把每次生成的第一列去掉rides = pd.concat([rides, dummies], axis=1)#按照列方向合并

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

# 把原有的类型变量对应的特征去掉,将一些不相关的特征去掉
fields_to_drop = ['instant', 'dteday', 'season', 'weathersit', 'weekday', 'atemp', 'mnth', 'workingday', 'hr']#要去掉的列名字
data = rides.drop(fields_to_drop, axis=1)#从文件中去掉
data.head()

2.4.归一化  'cnt', 'temp', 'hum', 'windspeed'这四个列

quant_features = ['cnt', 'temp', 'hum', 'windspeed']#要归一化的四列
#quant_features = ['temp', 'hum', 'windspeed']# 我们将每一个变量的均值和方差都存储到scaled_features变量中。
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#求归一化结果并装载进data

2.5.训练数据与测试数据划分

train_data = data[:-21*24]
test_data = data[-21*24:]#最后21天是测试集print('训练数据:',len(train_data),'测试数据:',len(test_data))

2.6生成训练样本与训练目标值

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]# 将数据从pandas dataframe转换为numpy
X = features.values#取值
Y = targets['cnt'].values#取值
Y = Y.astype(float)#转化格式Y = np.reshape(Y, [len(Y),1])#【16875,】转变为【16875,1】
losses = []
features.head()

3.两种构建神经网络方式

3.1.手动编写神经网络

input_size = features.shape[1] #输入层单元个数
hidden_size = 10 #隐含层单元个数
output_size = 1 #输出层单元个数
batch_size = 128 #每隔batch的记录数
weights1 = torch.randn([input_size, hidden_size], dtype = torch.double,  requires_grad = True) #第一到二层权重
biases1 = torch.randn([hidden_size], dtype = torch.double, requires_grad = True) #隐含层偏置
weights2 = torch.randn([hidden_size, output_size], dtype = torch.double, requires_grad = True) #隐含层到输出层权重
def neu(x):#计算隐含层输出#x为batch_size * input_size的矩阵,weights1为input_size*hidden_size矩阵,#biases为hidden_size向量,输出为batch_size * hidden_size矩阵    hidden = x.mm(weights1) + biases1.expand(x.size()[0], hidden_size)hidden = torch.sigmoid(hidden)#输入batch_size * hidden_size矩阵,mm上weights2, hidden_size*output_size矩阵,#输出batch_size*output_size矩阵output = hidden.mm(weights2)return output
def cost(x, y):# 计算损失函数error = torch.mean((x - y)**2)return error
def zero_grad():# 清空每个参数的梯度信息if weights1.grad is not None and biases1.grad is not None and weights2.grad is not None:weights1.grad.data.zero_()weights2.grad.data.zero_()biases1.grad.data.zero_()
def optimizer_step(learning_rate):# 梯度下降算法weights1.data.add_(- learning_rate * weights1.grad.data)weights2.data.add_(- learning_rate * weights2.grad.data)biases1.data.add_(- learning_rate * biases1.grad.data)
losses = []
for i in range(1000):# 每128个样本点被划分为一个撮,在循环的时候一批一批地读取batch_loss = []#每一批次的损失# start和end分别是提取一个batch数据的起始和终止下标for start in range(0, len(X), batch_size):#每128个点作为一个批次end = start + batch_size if start + batch_size < len(X) else len(X)#取截止点位xx = torch.tensor(X[start:end], dtype = torch.double, requires_grad = True)#生成特征批次yy = torch.tensor(Y[start:end], dtype = torch.double, requires_grad = True)#生成目标批次predict = neu(xx)#预测loss = cost(predict, yy)#损失zero_grad()#梯度清零loss.backward()#损失反向传播optimizer_step(0.01)#学习率设置batch_loss.append(loss.data.numpy())#每个批次损失装载在列表# 每隔100步输出一下损失值(loss)if i % 100==0:losses.append(np.mean(batch_loss))#每一百次迭代的损失均值装载在lossesprint(i, np.mean(batch_loss))
# 打印输出损失值
fig = plt.figure(figsize=(10, 7))
plt.plot(np.arange(len(losses))*100,losses, 'o-')#绘制损失曲线
plt.xlabel('epoch')
plt.ylabel('MSE')

3.2.使用pytorch已有网络框架

input_size = features.shape[1]
hidden_size = 10
output_size = 1
batch_size = 128
neu = torch.nn.Sequential(torch.nn.Linear(input_size, hidden_size),torch.nn.Sigmoid(),torch.nn.Linear(hidden_size, output_size),
)
cost = torch.nn.MSELoss()
optimizer = torch.optim.SGD(neu.parameters(), lr = 0.01)
losses = []
for i in range(1000):# 每128个样本点被划分为一个撮,在循环的时候一批一批地读取batch_loss = []# start和end分别是提取一个batch数据的起始和终止下标for start in range(0, len(X), batch_size):end = start + batch_size if start + batch_size < len(X) else len(X)xx = torch.tensor(X[start:end], dtype = torch.float, requires_grad = True)yy = torch.tensor(Y[start:end], dtype = torch.float, requires_grad = True)predict = neu(xx)loss = cost(predict, yy)optimizer.zero_grad()loss.backward()optimizer.step()batch_loss.append(loss.data.numpy())# 每隔100步输出一下损失值(loss)if i % 100==0:losses.append(np.mean(batch_loss))print(i, np.mean(batch_loss))

4.测试

targets = test_targets['cnt'] #读取测试集的cnt数值
targets = targets.values.reshape([len(targets),1]) #将数据转换成合适的tensor形式
targets = targets.astype(float) #保证数据为实数x = torch.tensor(test_features.values, dtype =  torch.double, requires_grad = True)#使用3.1搭建网络,则dtype= torch.double;使用3.2搭建3.2搭建网络,则dtype = torch.float
y = torch.tensor(targets, dtype = torch.float, requires_grad = True)print(x[:10])
# 用神经网络进行预测
predict = neu(x)
predict = predict.data.numpy()
print((predict * std + mean)[:10])
# 将后21天的预测数据与真实数据画在一起并比较
# 横坐标轴是不同的日期,纵坐标轴是预测或者真实数据的值
fig, ax = plt.subplots(figsize = (10, 7))
mean, std = scaled_features['cnt']
ax.plot(predict * std + mean, label='Prediction', linestyle = '--')
ax.plot(targets * std + mean, label='Data', linestyle = '-')
ax.legend()
ax.set_xlabel('Date-time')
ax.set_ylabel('Counts')
# 对横坐标轴进行标注
dates = pd.to_datetime(rides.loc[test_data.index]['dteday'])
dates = dates.apply(lambda d: d.strftime('%b %d'))
ax.set_xticks(np.arange(len(dates))[12::24])
_ = ax.set_xticklabels(dates[12::24], rotation=45)

5.结果图

共享单车神经网络预测(pytorch )每行代码详细解释相关推荐

  1. (15) 基于图卷积神经网络的共享单车流量预测

    交通预见未来(3) 基于图卷积神经网络的共享单车流量预测 1.文章信息 <Bike Flow Prediction with Multi-Graph Convolutional Networks ...

  2. 机器学习入门04——共享单车数据预测实验

    共享单车骑行数据预测 任务说明 1. 任务描述 请在Capital Bikeshare (美国Washington, D.C.的一个共享单车公司)提供的自行车数据上进行回归分析.根据每天的天气信息,预 ...

  3. bp学习函数matlab代码,小范学数量经济学之四:BP神经网络预测的MATLAB模拟代码

    股票价格预测神器:BP神经网络预测的matlab模拟代码: 自动优选神经元个数: 自动迭代15000次,精度0.001: 代码运行效果图: 原始代码自此处开始: % 本代码由重庆科技学院范巧副教授于2 ...

  4. [人工智能学习日志]深度学习-LSTM共享单车使用量预测

    LSTM共享单车使用量预测 1.加载数据集.数据可视化.预处理 - 引入包 - 加载数据集 - 数据集描述方式 - 数据集可视化处理 5.模型搭建.编译.训练 - 模型搭建 - 模型编译 - 保持模型 ...

  5. 手把手入门神经网络系列(2)_74行代码实现手写数字识别

    作者: 龙心尘&&寒小阳  时间:2015年12月.  出处:  http://blog.csdn.net/longxinchen_ml/article/details/5028124 ...

  6. PointNet代码详细解释(Pytorch版本)

    pointnet.pytorch的代码详细解释 1. PointNet的Pytorch版本代码解析链接 2. 代码解释 2.1 代码结构思维导图 2.2 代码注释 2.2.1 build.sh 2.2 ...

  7. 吴恩达机器学习 神经网络 作业1(用已经求好的权重进行手写数字分类) Python实现 代码详细解释

    整个项目的github:https://github.com/RobinLuoNanjing/MachineLearning_Ng_Python 里面可以下载进行代码实现的数据集 题目介绍: In t ...

  8. 吴恩达机器学习 逻辑回归 作业2(芯片预测) Python实现 代码详细解释

    整个项目的github:https://github.com/RobinLuoNanjing/MachineLearning_Ng_Python 里面可以下载进行代码实现的数据集 题目介绍: In t ...

  9. 吴恩达机器学习 逻辑回归 作业3(手写数字分类) Python实现 代码详细解释

    整个项目的github:https://github.com/RobinLuoNanjing/MachineLearning_Ng_Python 里面可以下载进行代码实现的数据集 题目介绍: In t ...

最新文章

  1. java 将整型数组内容写入txt文件_Java自学-I/O 字节流
  2. 神经网络的sigmoid激活函数是一种平方映射
  3. C语言中返回错误信息的函数总结
  4. iOS开发--TableView详细解释
  5. flex3提示mysql2_Flex中的MySQL管理(2)_MySQL
  6. sizeof(数组名)和sizeof(指针)
  7. 超越JAX-RS规范:Apache CXF搜索扩展
  8. 重用生成的JAXB类
  9. 10.25模拟 三角形
  10. -bash:fork:Resource temporarily unavailable
  11. 基于OpenCV实现图像线性变化
  12. fun-函数的数据类型小结
  13. 通过set赋值,与select赋值的区别
  14. 酒店消防安全知识培训PPT模板
  15. app测试用例考虑点
  16. Oracle varchar2类型
  17. 苹果手机投屏到Windows
  18. 网龙百万3D角色编辑系统介绍
  19. PicGo+Github图床配置
  20. VOCs废气处理设备-粤信环保

热门文章

  1. SQL查询重复数据,只显示一条sql语句
  2. 红黑树 (Red-Black Tree) – 介绍
  3. 【辞九门回忆】等什么君
  4. 【PaperReading】DAEGC : Attributed Graph Clustering: A Deep Attentional Embedding Approach
  5. 环洋市场咨询:全球自动光学检测设备(AOI)收入预计2028年达到40.27亿美元
  6. 【亲测直接有效】NVIDIA安装程序无法继续:不兼容,没有找到硬件
  7. 【系统分析师之路】第十三章 软件体系结构
  8. 网易数帆 Envoy Gateway 实践之旅:坚守 6 年,峥嵘渐显
  9. C++ 关于分数的处理与计算
  10. 如何用python完成评分功能呢_利用python基于电影评分数据进行