Python构建ANN模型预测气温变化

在利用爬虫模型得到了气温数据集后,具体参考上篇Python构建爬虫模型爬取天气数据,我们开始利用tensorflow自带的模块搭建一个简单的ANN模型预测气温变化,其实这个模型适用于预测很多数据变化趋势,这里以预测气温变化为例。

import requests
from bs4 import BeautifulSoup
def get_data(city_name,tim):
    url="http://www.tianqihoubao.com/lishi/"+city_name+"/month/"+tim+".html"
    re=requests.get(url)
    html = re.content.decode('gbk')#规范编码,避免乱码
    soup = BeautifulSoup(html,'html.parser')
    data=soup.find_all('tr')
    for i in range(1,len(data)):#因为data[0]没有气温数据
        temp=data[i].text.split()
        temp1=temp[3][:-1]
        temp2=temp[5][:-1]
        res=0
        if temp1=='' and temp2=='':#后来爬数据发现有某天的气温不存在
            continue
        elif temp1=='':
            res=int(temp2)
        elif temp2=='':
            res=int(temp1)
        else:
            res=(int(temp1)+int(temp2))/2.0#取平均值
        #print(tim,temp1,temp2)
        fp.writelines(str(res)+'\n')
fp=open('data.txt','w',encoding='utf-8')
city_name="shanghai"
for year in range(2015,2020):#时间从2015年到2019年
    for month in range(1,13):#时间从1月到12月
        tim=str(year)
        if month<10:
            tim+=("0"+str(month))
        else:
            tim+=str(month)
        get_data(city_name,tim)#获取数据

fp.close()

运行上面的代码得到上海从2015年到2019年的完整气温数据,文件名叫data.txt,如下:
在这里插入图片描述

然后我们展开,这里很简单,我们以7个(也可以是其他个)气温为单位进行数据预测,也就是把前7个气温作为特征值,第8个为结果,也就是

x=[temp[i],temp[i+1],temp[i+2],temp[i+3],temp[i+4],temp[i+5],temp[i+6]]
y=[temp[i+7]]

以此得到我们模型的训练数据集。

一、读取数据

利用pandas读取数据

import pandas as pd
import numpy as np
def read_data(N):
    df=pd.read_csv('data.txt',header=None)#没有列名,为None
    data=df.values#提取数据内容
    X=[]
    Y=[]
    for i in range(N,len(data)):
        s=[]
        for j in range(i-N,i):
            s.append(data[j][0])
        X.append(s)
        Y.append(data[i][0])
    return np.array(X),np.array(Y)

N=7#特征数目
X,Y=read_data(N)
print(X)
print(Y)

显示内容如下:
在这里插入图片描述
于是我们得到了模型的训练数据集。

二、数据归一化
这里直接利用sklearn框架里面的MinMaxScaler模块进行数据归一化,比较方便,不用自己手写归一化函数了。

from sklearn.preprocessing import MinMaxScaler
'''
读取数据
'''
min_max_scaler = MinMaxScaler()
min_max_scaler.fit(X)
x = min_max_scaler.transform(X)#均值化处理
x_ = min_max_scaler.transform([[24.5,25.0,24.0,25.0,21.0,20.5,21.0]])#这里随便取一组数据,作为后面预测用,注意数据维度
y=Y

显示x和y的内容如下,print(x),print(y):

在这里插入图片描述特征数据得到了很好的归一化。

三、训练集和测试集的划分

这里同样调用sklearn框架里面的train_test_split模块进行数据集划分

from sklearn.model_selection import train_test_split
'''
数据读取+均值化处理
'''
#划分数据集,按训练集:测试集=8:2比例划分
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.2)

四、构建ANN模型
ANN模型为人工神经网络模型,共三层结构,输入层,隐含层,输出层,我们需要对中间的隐含层的参数(主要为隐含层中的神经元层数和每层的神经元个数进行调整),手工搭建模型比较麻烦,但是tensorflow框架里面提供了现成的模型框架,我们只需要对隐含层参数进行修改即可。

from tensorflow import keras#这里可能很多人报错没有keras模块,我直接在阿里云天池平台跑的数据,本地电脑的python需要调整下tensorflow版本等问题
'''
数据的读取+均值化+划分
'''
#模型结构,采用relu函数为激活函数,输入层为N个属性
#下面为4层隐含层,每层的神经元个数依次为500,500,250,250
#输入层对应N个属性
model = keras.Sequential([
        keras.layers.Dense(500,activation='relu',input_shape=[N]),
        keras.layers.Dense(500,activation='relu'),
        keras.layers.Dense(250,activation='relu'),
        keras.layers.Dense(250,activation='relu'),
        keras.layers.Dense(1)])#最后输出为一个结果,也就是预测的值
#定义损失函数loss,采用的优化器optimizer为Adam
model.compile(loss='mean_absolute_error',optimizer='Adam')
#开始训练模型
model.fit(x_train,y_train,batch_size = 126,epochs=1000)#训练1000个批次,每个批次数据量为126

至此,利用现成的模块构建一个简单的ANN模型完成。

五、模型的预测

#输出结果预测
y_=model.predict(x_)
print('预测结果为:',y_)

六、完整代码

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from tensorflow import keras#这里可能很多人报错没有keras模块,我直接在阿里云天池平台跑的数据,本地电脑的python需要调整下tensorflow版本等问题
def read_data(N):
    df=pd.read_csv('data.txt',header=None)#没有列名,为None
    data=df.values#提取数据内容
    X=[]
    Y=[]
    for i in range(N,len(data)):
        s=[]
        for j in range(i-N,i):
            s.append(data[j][0])
        X.append(s)
        Y.append(data[i][0])
    return np.array(X),np.array(Y)

N=7#特征数目
X,Y=read_data(N)
#数据均值化
min_max_scaler = MinMaxScaler()
min_max_scaler.fit(X)
x = min_max_scaler.transform(X)#均值化处理
x_ = min_max_scaler.transform([[24.5,25.0,24.0,25.0,21.0,20.5,21.0]])#这里随便取一组数据,作为后面预测用,注意数据维度
y=Y
#划分数据集,按训练集:测试集=8:2比例划分
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.2)
#模型结构,采用relu函数为激活函数,输入层为N个属性
#下面为4层隐含层,每层的神经元个数依次为500,500,250,250
#输入层对应N个属性
model = keras.Sequential([
        keras.layers.Dense(500,activation='relu',input_shape=[N]),
        keras.layers.Dense(500,activation='relu'),
        keras.layers.Dense(250,activation='relu'),
        keras.layers.Dense(250,activation='relu'),
        keras.layers.Dense(1)])#最后输出为一个结果,也就是预测的值
#定义损失函数loss,采用的优化器optimizer为Adam
model.compile(loss='mean_absolute_error',optimizer='Adam')
#开始训练模型
model.fit(x_train,y_train,batch_size = 126,epochs=1000)#训练1000个批次,每个批次数据量为126
#输出结果预测
y_=model.predict(x_)
print('预测结果为:',y_)

运行情况:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述最后误差停留在1.0左右,预测结果为21.177862。

希望我的分享对你的学习有所帮助,如果有错误请及时指出,谢谢~

# 一、项目介绍 **项目名称:天气预测和天气可视化** 天气预测和天气可视化是一个基于python机器学习(ml)的长春地区的天气预报项目,它实现了天气数据的爬取,预测和可视化。 项目结构如下: ![img](image/wps26.jpg) * 天气数据的来源 GetData文件使用python爬虫技术,爬取长春和全国的天气信息数据 爬取网站:http://tianqi.2345.com/wea_history/54161.htm ProcessDate文件对爬取的天气数据进行了预处理 几个CSV文件保存的是爬取后并经过处理的数据 * 天气数据的预测 GetModel文件通过训练预测模型预测长春近一周的天气,该文件利用Joblib将模型保存到本地 Main文件是项目主文件,通过运行该文件即可运行整个项目,该文件前部分获取保存到本地的预测模型来进行预测,并将预测结果打印到控制台 * 天气数据的可视化 Main文件后部分实现了天气数据的可视化 # 二、详细介绍 本项目分为三个部分,即爬取和处理数据,数据预测(包含评价方法)和数据可视化 ## 1. 爬取和处理数据 数据爬取代码: ````py resq = requests.get(url, headers=headers, params=params) data = resq.json()["data"] # data frame df = pd.read_html(data)[0] ```` 即使用python爬取网站的json数据 ### **数据预处理:** 获取到的天气信息包括最高温,最低温都不是int格式的数字,通过对数据截取,将部分指标的数据变换为int类型 并对缺失值进行了处理 ````py my_imputer = SimpleImputer() imputed_X_train = pd.DataFrame(my_imputer.fit_transform(X_train)) imputed_X_valid = pd.DataFrame(my_imputer.transform(X_valid)) ```` 通过SimpleImputer ,可以将现实数据中缺失的值通过同一列的均值、中值、或者众数补充起来,本项目使用了SimpleImputer的fit_transform对缺失值进行填充 ## 2. 数据预测模型评价方法 预测数据采用了机器学习算法——线性回归 模型使用过程: ### A. 提取数据 ````py 获取测试集、训练集、验证集 [X_train, X_valid, y_train, y_valid, X_test] = ProcessData.ProcessData() ```` 其中ProcessData()函数里使用了如下语句: ````py X_train, X_valid, y_train, y_valid = train_test_split(X, y, train_size=0.8, test_size=0.2, random_state=0) ```` train_test_split()是sklearn包的model_selection模块中提供的随机划分训练集和验证集的函数;使用train_test_split函数将完整的数据集和验证集以同等的比例分成2组不同的数据集和验证集 ### B. 训练模型 选择了随机树森林模型(randomforest),然后用fit来训练模型 ````py # 随机树森林模型 model = RandomForestRegressor(random_state=0, n_estimators=1001) # 训练模型 model.fit(X_train, y_train) ```` ### C. 根据数据预测 ````py # 最终预测结果 preds = model.predict(r[1]) -------- 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>