项目实训第二周第二次记录

文章目录

  • 7.06
    • 价格预测模型
    • 年产量预测模型
  • 7.07
    • 模型输入修改
    • 模型调用与对接


7.06

继续尝试优化价格预测模型和年产量预测模型。

价格预测模型

通过昨天的努力,已经有了可靠的方法去判断两个时间序列是否相似,接下来便可以使用k-NN算法进行聚类。根据经验,最优解一般出现在k=1的时候。下面就利用DTW欧氏距离的1-NN算法。
利用该算法,对于测试集中的每一个时间序列,每一遍搜索必须遍历训练集中的所有点,从而可以找到最多的相似点。DTW算法是O(n2),计算过程耗费非常长的时间。通过之前写好的LB_Keogh下界方法来提高分类算法的计算速度,速度快很多。另外,当LBKeogh(Q,C) <= DTW(Q,C)时,我们可以消除那些比当前最相似的时间序列不可能更相似的时间序列。这样,我们就可以消除很多不必要的DTW计算过程。
之后聚类直接调用sklearn的包即可。
最终为每个类训练一个模型。实现所有市场所有农作物的价格预测。

年产量预测模型

模型优化
之前直接用单个市的数据集训练BP神经网络模型效果不佳,时间序列模型LSTM的训练需要更长的时间序列,同样单个市的数据集效果也不好。由于气温和降水所以我想到了扩充数据集,可以把市作为一个特征,为所有城市的同一种农作物训练一个模型。

  1. 数据预处理与特征工程
    将数据导入处理工具。主要使用Python+excel的方式。将同一农作物的各省份数据放在同一文件。从而扩充了数据集。
    处理分类型特征(市、年份)。使用python对数据进行编码。由于已经对农产品进行了分类,其中市使用独热编码。年份即直接编码0-19(之前爬虫组已经补充了18-19年的数据,由于农产品培育技术水平是逐渐提高的,对年份使用直接编码更能保留这种特征)。
    最终特征为 年份、市、每个月的月平均气温,年平均气温,每个月的月平均降水,年平均降水。
    特征选择。不存在方差为0的特征。进行F检验过滤没有显著线性关系的特征。
    最终选取的特征为年份、市、年平均气温、年平均降水。
import numpy as np
#首先导入   矩阵

print("开始读取数据,请稍候...")
fo = open("小麦.csv",encoding = 'gb18030')
ls = []
for line in fo:
    line = line.replace("\n","")
    ls.append(line.split(","))
fo.close()

#获取
hotDatachanpin = []    #hot
temp = []
for i in range(len(ls)):
    if i>0:
       index = []
       index.append(ls[i][0])
       hotDatachanpin.append(index)

#对类别进行独热处理编码 并转换矩阵
data = np.array(hotDatachanpin)
from sklearn import preprocessing
enc = preprocessing.OneHotEncoder(sparse=False)
data = enc.fit_transform( data )
print(hotDatachanpin[300])
print(data[300])
#[东营. 临沂. 威海. 德州. 日照. 枣庄. 泰安. 济南. 济宁. 淄博. 滨州. 潍坊. 烟台. 聊城. 莱芜. 菏泽. 青岛.]
#
for i in range(len(ls)):
    ls[i].pop(1)
    if i>0:
        ls[i].append(str(data[i-1][0]))
        ls[i].append(str(data[i-1][1]))
        ls[i].append(str(data[i-1][2]))
        ls[i].append(str(data[i-1][3]))
        ls[i].append(str(data[i - 1][4]))
        ls[i].append(str(data[i - 1][5]))
        ls[i].append(str(data[i - 1][6]))
        ls[i].append(str(data[i - 1][7]))
        ls[i].append(str(data[i - 1][8]))
        ls[i].append(str(data[i - 1][9]))
        ls[i].append(str(data[i - 1][10]))
        ls[i].append(str(data[i - 1][11]))
        ls[i].append(str(data[i - 1][12]))
        ls[i].append(str(data[i - 1][13]))
        ls[i].append(str(data[i - 1][14]))
        ls[i].append(str(data[i - 1][15]))
        ls[i].append(str(data[i - 1][16]))

ls[0].append('东营')
ls[0].append('临沂')
ls[0].append('威海')
ls[0].append('德州')
ls[0].append('日照')
ls[0].append('枣庄')
ls[0].append('泰安')
ls[0].append('济南')
ls[0].append('济宁')
ls[0].append('淄博')
ls[0].append('滨州')
ls[0].append('潍坊')
ls[0].append('烟台')
ls[0].append('聊城')
ls[0].append('莱芜')
ls[0].append('菏泽')
ls[0].append('青岛')
#[东营. 临沂. 威海. 德州. 日照. 枣庄. 泰安. 济南. 济宁. 淄博. 滨州. 潍坊. 烟台. 聊城. 莱芜. 菏泽. 青岛.]

#写文件
count = 1
print("正在生成CSV文件,请稍候")
fw = open("小麦.csv","w")
for item in ls:
    print(count)
    fw.write(','.join(item)+'\n')
    count=count+1
fw.close()
print("生成成功!")
  1. 模型训练
    使用选取的特征,将单产作为标签(为了避免因为种植面积变化带来的产量变化 ,使用每公顷产量(单产)作为农作物的年产量的单位)。
    接下分别使用GBDT集成网络、BP神经网络对比效果。
    调参。最终决定使用GBDT集成网络,效果较好。

今天初步完成了模型的编码构建,之后剩下进行模型保存与后端对接。


7.07

模型输入修改

两个预测模型已经基本完成,但是还需要修改一下输入才能应用到项目中。
之前仅是将一部分数据集分为测试集作为模型输入,真正应用时是把后端的数据作为输入进行预测,现在需要将模型的输入修改成参数传入。
修改输入如下:
将训练集数据删除,添加INPUT= (具体格式),替换测试集数据,将模型训练部分删除,添加加载模型语句,定义OUTPUT = (具体格式)

模型调用与对接

java web应用可以直接调用python深度学习训练的模型。为保证之后迭代需要完成的智能融等功能也能正常开发,我们在一开始后端就选用了一个python语言的框架DRF。
之前的模型进行了保存模型,在刚才的模型输入修改之前保存需要的模型并定义好了名称,目前采取直接放到同一目录下。
之后便可以进行模型与后端的集成。
记录一下出现的问题:

  • 在保存最优模型的时候出现
    Warning: Can save best model only with val_acc available, skipping
    当时寻找了半天不知道问题所在,最终发现是callback中的monitor = ‘val_loss’,
    导致了错误,改成loss即可

  • TensorFlow2 (Macbook m1 conda-forge)报错:NotImplementedError: Cannot convert a symbolic Tensor (sequential/simple_rnn/strided_slice:0) to a numpy array. This error may indicate that you’re trying to pass a Tensor to a NumPy call, which is not supported
    原因是:umpy版本过高,conda安装指定版本的numpy,1.19.5即可解决问题
    利用Anaconda执行如下命令即可
    conda search numpy
    conda install numpy=1.19.5 -c conda-forge

    最终我们完成对接并成功的进行调用预测。

你可能感兴趣的:(项目实训)