根据天气情况(温度湿度)、工作日这些特征属性预测共享单车的出行数量这一目标属性的值
数据预处理
对类型变量的处理:
- Weekday:1,2,3,4,5,6,0 进行类型编码(one-hot编码):
->星期日1000000,星期一0100000,星期二0010000,星期三0001000,星期四0000100,星期五0000010,星期六0000001 - 天气:0,1,2 (温度,适度,风力)这种数值类数据变量进行变量标准化:
->假设一个数据的值符合正态分布,我们可以通过(原始数据-平均值)/方差 方式进行标准化处理,然后这些值就都落到[0,1]这一范围内
数据准备
将数据集进行切分,分为训练集和测试集,用训练集训练神经网络模型,用测试集测试训练好的模型,观察其准确度
划分具有任意性,可以进行多次划分,提高准确度
如何训练?将训练集分割成小的批(batch,128条记录),然后对每一小批进行误差计算、反向传播,调整权重
建立人工神经网络
有59个输入单元(分别对应处理后的特征属性),隐含层有十个单元(隐含层的单元个数取决于问题的复杂度,单元个数越多,学习能力越强,但有可能过拟合),还有一个输出层
1.构建网络模型
(1)nn.Linear()是表示建立一层线性连接单元,以构建从输入层到隐藏层节点的映射,输入维度input_size,隐含维度hidden_size。
(2)nn.sigmoid() 作用到每一个隐含层神经元上,也就是第一层神经网络到第二层神经网络的非线性运算
(3)从隐含层到输出层的线性运算,神经元个数分别为hidden_size和output_size
所有神经网络的参数都存储在neu.parameters()里面了
最后再用sequential语句创建神经网络,存储到neu这个变量里
neu=torch.nn.Sequential(
torch.nn.Linear(input_size,hidden_size),
torch.nn.Sigmoid(),
torch.nn.Linear(hidden_size,output_size),
2. 建立损失函数和优化器
定义损失函数,torch.nn.MSELoss()等价于torch.mean((y-y*)^2),其中cost为函数指针
定义优化器 ,torch.optim.SGD是随机梯度下降梯度 neu.parameters()返回神经网络neu的所有权重、偏置参数,lr是学习率
cost=torch.nn.MSELoss()
optimizer=torch.optim.SGD(neu.parameters(),lr=0.01)
3.对神经网络进行分批次训练
for i in range[2000]: #2000就是训练次数epoch
batch_loss=[]#记录每一批次的损失
#每128个样本点被划分为一批次
#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=Variable(torch.FloatTensor(X[start:end]))#得到一个批次中的特征属性数据
yy=Variable(torch.FloatTensor(Y[start:end]))#得到一个批次中的目标属性数据
predict= neu(xx) #模型预测
loss= cost(predict, y)#计算损失函数(均方误差)
optimizer.zero_grad()#将优化器存储的那些参数的梯度设置为0
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))