机器学习实战——美国疫情数据

题目要求

所谓“看花容易绣花难”,学了近一个月机器学习,实战(完全靠自己的项目)还是第一次做,尽管头有点大,但还是很有信心做好的!
在这里插入图片描述

①疫情数据收集

信息来自官方网站实时更新新型冠状病毒肺炎疫情地图
收集方式:手工制作csv表格(反正数据也没有多少~)
文件形式:
在这里插入图片描述

②数据的清洗与分析+可视化

此处踩坑无数,不知如何加载数据,因为列表的时间列是不符合格式的,一定要用.values获取 numpy.array()类型数据

# load the dataset
dataframe = read_csv('D:\ChromeCoreDownloads\新冠疫情预测\疫情预测\_usa-counties.csv', usecols=[1], engine='python', skipfooter=3)
dataset = dataframe.values
# 将整型变为float
dataset = dataset.astype('float32')

plt.plot(dataset)
plt.show()

在这里插入图片描述
使用手中现有数据拟合出曲线

④学习模型的构建思路:

拿到题目,我首先想到的是应用回归模型,因为回归模型可以预测数值变化。但是在参考后,我发现我们需要找到θ=ax+bx2cx3+…中的参数,而在美国疫情数据中,我并不能找到这些相应的影响因素,相关的数学分析以及传染病模型的构建对于小白我来说简直是天方夜谈。数据真的很简单,就是一个时间,一个死亡人数,拿什么来预测好呢。。。

选择LSTM的原因一:经过几天的思考,查找相关博客,询问同学大佬,我了解到了LSTM模型,它所能预测的模型和我的想法深思啊!
选择LSTM的原因二: 短时记忆网络的不足

NN 会受到短时记忆的影响。如果一条序列足够长,那它们将很难将信息从较早的时间步传送到后面的时间步。 因此,如果你正在尝试处理一段文本进行预测,RNN 可能从一开始就会遗漏重要信息。

在反向传播期间,RNN 会面临梯度消失的问题。 梯度是用于更新神经网络的权重值,消失的梯度问题是当梯度随着时间的推移传播时梯度下降,如果梯度值变得非常小,就不会继续学习。

因此,在递归神经网络中,获得小梯度更新的层会停止学习—— 那些通常是较早的层。 由于这些层不学习,RNN 可以忘记它在较长序列中看到的内容,因此具有短时记忆。

选择LSTM的原因三: LSTM内部“门”的机制,详情请看大佬的详细博客,真的很赞!
1)模型数据转换——>数据预处理成LSTM模型需要的矩阵类型数据,为下面的数据处理做准备

# X is the number of deaths at a given time (t) and Y is the number of deaths at the next time (t + 1).
# convert an array of values into a dataset matrix
def create_dataset(dataset, look_back=1):
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back-1):
        a = dataset[i:(i+look_back), 0]
        dataX.append(a)
        dataY.append(dataset[i + look_back, 0])
    return numpy.array(dataX), numpy.array(dataY)
# fix random seed for reproducibility
numpy.random.seed(7)

2)数据预处理——>将一个简单的数据矩阵缩放到 [0, 1],并且将矩阵W、矩阵 H 存储到拟合模型中

scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)

3)手动实现train_test_spilt~

# split into train and test sets
train_size = int(len(dataset) * 0.67)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:]

4)承接第一步,继续处理数据:X=t and Y=t+1 时的数据,并且此时的维度为 [samples, features],而投入到 LSTM 的 X 需要有这样的结构: [samples, time steps, features],所以做一下变换

# use this function to prepare the train and test datasets for modeling
look_back = 1
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)

# reshape input to be [samples, time steps, features]
trainX = numpy.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
testX = numpy.reshape(testX, (testX.shape[0], 1, testX.shape[1]))

5)进入LSTM网络训练

# create and fit the LSTM network
model = Sequential() #建立模型
model.add(LSTM(4, input_shape=(1, look_back))) #输入变量为1,有4个神经元
model.add(Dense(1)) # 输出层只有一个预测值
model.compile(loss='mean_squared_error', optimizer='adam')
# 编译模型:损失函数为mse, 优化器adam
model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)
# 训练100次,每次处理1张图片

训练结果:损失函数的表现还是很不错的
在这里插入图片描述

⑤模型的评估指标

1) 预测

# make predictions
trainPredict = model.predict(trainX)
testPredict = model.predict(testX)

2)评估:计算RMSE误差
RMSE(Root Mean Square Error)均方根误差,衡量观测值与真实值之间的偏差。常用来作为机器学习模型预测结果衡量的标准。
计算公式:在这里插入图片描述
3)将数据转换为计算RMSE的数据形式

# invert predictions
trainPredict = scaler.inverse_transform(trainPredict)
trainY = scaler.inverse_transform([trainY])
testPredict = scaler.inverse_transform(testPredict)
testY = scaler.inverse_transform([testY])

4)计算RMSE误差

trainScore = math.sqrt(mean_squared_error(trainY[0], trainPredict[:,0]))
print('Train Score: %.2f RMSE' % (trainScore))
testScore = math.sqrt(mean_squared_error(testY[0], testPredict[:,0]))
print('Test Score: %.2f RMSE' % (testScore))

评估结果:训练数据与测试数据偏差相对较大,预测存在偏差
在这里插入图片描述
5)结果可视化

# shift train predictions for plotting
trainPredictPlot = numpy.empty_like(dataset)
trainPredictPlot[:, :] = numpy.nan
trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict

# shift test predictions for plotting
testPredictPlot = numpy.empty_like(dataset)
testPredictPlot[:, :] = numpy.nan
testPredictPlot[len(trainPredict)+(look_back*2)+1:len(dataset)-1, :] = testPredict

# plot baseline and predictions
plt.plot(scaler.inverse_transform(dataset))
plt.plot(trainPredictPlot)
plt.plot(testPredictPlot)
plt.show()

结果展示(蓝心为正常的结果,绿线为预测结果,红线为测试集结果)
在这里插入图片描述
神经网络可调参数:隐藏层神经元数、隐藏层数、时间步长

总结:到这里整个模型训练就结束了,跟着原文作者大大,我也实现了自己的模型预测,当然这中间我又查询了很多资料,还有很多细节自己不会实现,调整参数与训练精度方面我了解的也不多,机器学习的路还有很长要走!加油加油(ง •_•)ง!

参考原文:https://blog.csdn.net/aliceyangxi1987/article/details/73420583

参考知识点原文::https://blog.csdn.net/yingqubaifumei/article/details/100888147?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159833935219195188327887%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=159833935219195188327887&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-2-100888147.pc_ecpm_v3_pc_rank_v3&utm_term=LSTM&spm=1018.2118.3001.4187

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值