PyTorch基础——预测共享单车的使用量

预处理实验数据

读取数据

# 下载并解压数据集

!wget http://labfile.oss.aliyuncs.com/courses/1073/bike-sharing-dataset.zip
!unzip bike-sharing-dataset.zip
#导入需要使用的库
import numpy as np
import pandas as pd #读取csv文件的库
import matplotlib.pyplot as plt
import torch
from torch.autograd import Variable
import torch.optim as optim

# 让输出的图形直接在Notebook中显示
%matplotlib inline
#首先,让我们再来看看数据长什么样子
#读取数据到内存中,rides为一个dataframe对象
data_path = 'hour.csv'
rides = pd.read_csv(data_path)
rides.head()

对于类型变量的处理

#对于类型变量的特殊处理
# 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_4
# 这四种不同的特征。
dummy_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)
    rides = pd.concat([rides, dummies], axis=1)

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

对于数值类型变量进行标准化

# 调整所有的特征,标准化处理
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

将数据集进行分割

# 将所有的数据集分为测试集和训练集,我们以后21天数据一共21*24个数据点作为测试集,其它是训练集
test_data = data[-21*24:]
train_data = data[:-21*24]
print('训练数据:',len(train_data),'测试数据:',len(test_data))

# 将我们的数据列分为特征列和目标列

#目标列
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])
losses = []

features.head()

构建神经网络模型

手动编写用 Tensor 运算的人工神经网络

# 定义神经网络架构,features.shape[1]个输入层单元,10个隐含层,1个输出层
input_size = features.shape[1] #输入层单元个数
hidden_size = 10 #隐含层单元个数
output_size = 1 #输出层单元个数
batch_size = 128 #每隔batch的记录数
weights1 = Variable(torch.randn([input_size, hidden_size]), requires_grad = True) #第一到二层权重
biases1 = Variable(torch.randn([hidden_size]), requires_grad = True) #隐含层偏置
weights2 = Variable(torch.randn([hidden_size, output_size]), 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)

调用PyTorch现成的函数,构建序列化的神经网络

# 定义神经网络架构,features.shape[1]个输入层单元,10个隐含层,1个输出层
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 = Variable(torch.FloatTensor(X[start:end]))
        yy = Variable(torch.FloatTensor(Y[start:end]))
        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))
# 打印输出损失值
fig = plt.figure(figsize=(10, 7))
plt.plot(np.arange(len(losses))*100,losses, 'o-')
plt.xlabel('epoch')
plt.ylabel('MSE')

测试网络

使用测试数据集测试网络

# 用训练好的神经网络在测试集上进行预测
targets = test_targets['cnt'] #读取测试集的cnt数值
targets = targets.values.reshape([len(targets),1]) #将数据转换成合适的tensor形式
targets = targets.astype(float) #保证数据为实数

# 将属性和预测变量包裹在Variable型变量中
x = Variable(torch.FloatTensor(test_features.values))
y = Variable(torch.FloatTensor(targets))

# 用神经网络进行预测
predict = neu(x)
predict = predict.data.numpy()

# 将后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)

原文地址:https://www.cnblogs.com/wwj99/p/12179229.html

时间: 2024-08-29 03:58:36

PyTorch基础——预测共享单车的使用量的相关文章

全民围剿!共享单车窘境下该怎么挽回民心

虽然当下共享经济项目层出不穷,但其中最引人注目.潜力最大,且对大众生活影响最广的当属共享单车.在过去的一两年时间中,共享单车从零开始以最短的时间在国内彻底火爆.而在满足大众短途出行刚需的同时,资本的热度也让共享单车"昏了头". 其中最典型的,就是像扔钱一样疯狂在城市中投放单车.似乎投放单车数量的多少,直接与自身的实力.所占市场的份额等挂钩.而由此造成的严重后果,是共享单车成为城市的负面"标签"--影响交通.污染环境.安全风险--由此,全国多个城市开始对共享单车进行&

杀向全球的共享单车,最后真能有所作为吗?

纵观国内互联网企业的发展之路,在牛X到一定规模后,"出海"几乎成为必然的"套路".比如阿里.腾讯等巨头在海外玩得天翻地覆,小米.一加等在海外艰难前行也要咬牙坚持--之所以对"出海"辣么青睐,自然有诸多好处--为在全球立足做好准备.赢得更大发展空间反哺国内市场--而现在流行的,是在国内立足未稳就急不可耐地杀向全球--最典型的就是共享单车. 包括摩拜.ofo.oBike.小蓝单车等在内的国内共享单车企业在国内鏖战未止,就已经大张旗鼓地进军海外市场.而

共享单车玩前沿技术?或许这是活命之本

对于共享单车行业而言,目前实在是多事之秋.当然,有喜也有悲.既有近段时间摩拜.ofo先后获得数亿美元融资,让共享单车行业扬眉吐气的喜事,也有单车乱停乱放,甚至成为环境潜在威胁这样的悲事.而如今,似乎共享单车企业又和前沿技术杠上了. 摩拜.ofo等共享单车企业纷纷发布全新单车相关技术,让人眼前一亮.而众多前沿技术的落地和使用,意味着共享单车行业要从此前的比拼投放量向提升使用体验等方向进化.或许在接下来,前沿技术将是共享单车企业的"活命之本". 为前沿技术"疯魔"!摩拜

关于共享单车的一点思考

市场环境 (1)该类产品的市场生成状况如何,收益比例如何然后再决定是否加入 共享单车是共享经济的一个代表,从政治角度来看,符合节约环保的倡导:从经济角度看,经济高速发展必然需要资源的整合和利用,共享模式将成为未来的趋势:从社会角度开,城市拥堵.限牌限行,共享单车解决了短途出行的刚需:从技术角度看,LBS技术.安全开锁,第三方安全支付等都为共享单车提供了技术支持,也是未来需要更加强化的地方. 共享单车在开始的时候还没有竞争对手,同时没用动任何巨头的奶酪,可以说是今年最成功创新的产品 目前市面上占有

共享单车哈罗王炸连出,OFO小心沦为炮灰

在共享单车行业寒冬之际,哈罗单车却是好消息不断,先是12月4日宣布获得3.5亿美元的D1轮融资,昨天又再次宣布完成10亿元的D2轮融资,在这大家都勒紧裤腰带过日子的寒冬里,哈罗单车可谓是王炸连出,来了一轮大逆袭. 哈罗单车何以王炸不断?投资者背后的逻辑又是什么?我们不妨来做个探究. 一.蚂蚁金服:为了更加丰富的生态 在D1轮的融资中我们知道,永安行持股公司哈罗单车的投资方为蚂蚁金服.威马汽车.成为资本.富士达等多家知名投资机构,其中蚂蚁金服为领投方.目前哈罗单车的股权结构为永安行低碳100%持股

Hadoop Spark大数据全套课程+共享单车开发项目实战

hadoop spark大数据实时计算全套课程+共享单车开发项目实战 [下载地址:https://pan.baidu.com/s/1SnaWp_ls0V3Z_CgmhGkT7Q ] 有着三四年工作经验的你,面对如此诱惑的薪资和热度爆棚的岗位是否想尝试一下突破紧急,走上职业生涯巅峰? 本期推出java,hadoop,spark大数据从基础到项目实战的全过程培训教材课程目录: 原文地址:http://blog.51cto.com/aino007/2148831

【火炉炼AI】机器学习007-用随机森林构建共享单车需求预测模型

[火炉炼AI]机器学习007-用随机森林构建共享单车需求预测模型 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 共享单车是最近几年才发展起来的一种便民交通工具,基本上是我等屌丝上班,下班,相亲,泡妞必备神器.本项目拟使用随机森林回归器构建共享单车需求预测模型,从而查看各种不同的条件下,共享单车的需求量. 1. 准备数据集 本次使用的数据集来源于加利福尼亚大学欧文分校(UCI)大学的公

共享单车需求分析(二)

三.可视化分析 各个时间段单车的租赁变化 考虑到在所给的变量中,时间变量比较多,因此首先考虑各个时间段,单车的租赁情况. 首先看看,2011年和2012年,两年中每个月平均使用情况 1 #首先看一下整体的租赁 2 fig = plt.subplots(figsize=(15,15)) 3 4 ax1 = plt.subplot2grid((4,2), (0,0), colspan=2) 5 df1 = train_2.groupby(['Month', 'Year']).mean().unsta

中国是单车“坟场”,美国共享单车竟风生水起?

共享单车--提及这一过气"风口",你的第一反应是什么? 是 ofo 账户里躺着的无可奈何的299押金?还是新近为美团创下数十亿亏损的摩拜? 在"新四大发明"光环褪去之后,共享单车的正面新闻屈指可数,ofo信用破产,摩拜巨额亏损,哈啰后来居上,行业格局几无新意. 不过,你可能不知道的是,在大洋彼岸的美国,共享单车行业刚刚从"Copy from China"--"照抄中国"的破天荒意义中走出,战势正烧的如火如荼.在这竞争之中,行业