Deep Learning 1 IFLY Temperature Predict
[TOC]
描述
随着计算机技术的发展,我国逐渐实现了从传统农业到现代农业的转变,正逐步迈向智慧农业。温室是现代农业技术应用的典型场景,其内部环境具有可操作性,能人为形成适宜植物生长的小型封闭生态系统,提升农产品的产量和质量,因此被广泛应用于农业生产中。在温室的各项环境因子中,作物对温度最为敏感。温度的高低影响植株细胞的酶活性,从而影响作物的生长速度、产量和质量,因此温度对作物生长发育影响极大。为了保证农产品的产量和质量,应保证作物正常生长,需对温室温度进行精确的调控。
二、赛事任务
温室温度调控需要对温室温度进行精准的预测,本次大赛提供了中国农业大学涿州实验站的温室温度数据作为样本,参赛选手需基于提供的样本构建模型,预测温室温度变化情况。
三、评审规则
1.数据说明:
本次比赛为参赛选手提供了温室内外的部分传感器数据,包括温室内的温度、湿度、气压以及温室外的温度、湿度、气压。
本次比赛分为初赛和复赛两个阶段,初赛阶段提供约30天的传感器数据,其中前20天的数据作为训练数据,后10天的数据用于做温度预测;复赛阶段提供约15天的传感器数据,其中前10天的数据作为训练数据,后5天的数据用于做温度预测。
注1:训练集的数据,每1分钟1条数据记录;测试集的数据,每30分钟1条数据记录。
注2:选手不能利用“未来的实际数据”预测“过去的数据”,例如,假设要预测2020/6/18 08:08:08的室内温度,就不能利用这个时间点以后的真实数据进行预测。
特别说明,温室内的湿度和气压以及温室外的温度、湿度和气压会对温室内的温度产生一定的影响。
2.评估指标
本模型依据提交的结果文件,采用均方误差MSE进行评价。 观测值,预测值,待预测的记录数n,计算公式如下:
数据准备工作
- load dependencies :五大常用numpy, pandas, matplotlib, seaborn, warnings 和一些基本的依赖
- load data 加载数据:train, test
- check data 数据的基本状态结构,
加载依赖
# Common five dependencies
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
sns.set_style('whitegrid')
import warnings
warnings.filterwarnings('ignore')
import datetime
from tqdm import tqdm
加载数据:注意路径问题
# load datall
df_train = pd.read_csv('./data/train/train.csv')
df_test = pd.read_csv('./data/test/test.csv')
检查-数据结构
- 通过利用
data.shape
来查看基本的数据(shape为属性)的结构 - 通过利用
data.columns
来查看数据的attribute属性(columns和shape一样,也是属性)也就是key-value中的key, - 通过利用
data.info()
来查看数据的完整信息,包括数据的类型,数据key-value的对应情况,然后还有value中不为null的个数(non-null),或者也可以通过自己写一个循环,通过遍历data.columns中的所有的属性key对应的所有值的isna()
情况并用sum(data[col].isna())
来统计和,最后用pd.Dataframe来显示出来即可
# 写成函数,方便后面直接调用
def show_info(data):
# basic shape
print('data shape is: {} sample number {} attribute number {}\n'.format(data.shape, data.shape[0], data.shape[1]))
# attribute(key)
print('data columns number {} \nall columns: {}\n'.format(len(data.columns) ,data.columns))
# value's null
null_cnt = [sum(data[col].isna()) for col in data.columns]
print('data all attribute count null:\n', pd.DataFrame(null_cnt, columns=['cnt null'],index=data.columns))
修改版
def show_info(data, is_matrix_transpose=False):
# basic shape
print('data shape is: {} sample number {} attribute number {}\n'.format(data.shape, data.shape[0], data.shape[1]))
# attribute(key)
print('data columns number {} \nall columns: {}\n'.format(len(data.columns) ,data.columns))
# value's null
print('data all attribute count null:\n', data.isna().sum())
# data value analysis and data demo
if is_matrix_transpose:
print('data value analysis: ', data.describe().T)
print('data demo without matrix transpose: ', data.head().T)
else:
print('data value analysis: ', data.describe())
print('data demo without matrix transpose: ', data.head())
查看某个属性的分类【在最后的二分类或多分类的情况】:也就是属性'Attr'
中有多少是标签为分类1
??
查看最后多分类中的数据分布:在最后的分类结果中,有多少各个分类的
eg: dog breed identification,看看label中有多少种dog的分类
all_dog_breeds = sorted(list(set(labels['breed'])))
- 然后调用,并传入想看的数据即可:
show_info(df_train)
show_info(df_test)
点击展开输出
data shape is: (25497, 13) sample number 25497 attribute number 13
data columns number 13
all columns: Index(['time', '年', '月', '日', '小时', '分钟', '秒', '温度(室外)', '湿度(室外)', '气压(室外)',
'湿度(室内)', '气压(室内)', 'temperature'],
dtype='object')
data all attribute count null:
cnt null
time 0
年 0
月 0
日 0
小时 0
分钟 0
秒 0
温度(室外) 660
湿度(室外) 660
气压(室外) 660
湿度(室内) 690
气压(室内) 690
temperature 690
data columns number 12
all columns: Index(['time', '年', '月', '日', '小时', '分钟', '秒', '温度(室外)', '湿度(室外)', '气压(室外)',
'湿度(室内)', '气压(室内)'],
dtype='object')
data all attribute count null:
cnt null
time 0
年 0
月 0
日 0
小时 0
分钟 0
秒 0
温度(室外) 2
湿度(室外) 2
气压(室外) 2
湿度(室内) 1
气压(室内) 1
检查-数据内容(count, mean, std, min=0%, 25%, 50%, 75%, max=100%):直接用pd.Dataframe 已经内部封装好的函数data.describe()
来渲染即可(注意是函数,不是属性了,因为最后是要显示出一个表格)
df_train.describe()
time | 年 | 月 | 日 | 小时 | 分钟 | 秒 | 温度(室外) | 湿度(室外) | 气压(室外) | 湿度(室内) | 气压(室内) | temperature | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 2.549700e+04 | 25497.0 | 25497.000000 | 25497.000000 | 25497.000000 | 25497.000000 | 25497.000000 | 24837.000000 | 24837.000000 | 24837.000000 | 24807.000000 | 24807.000000 | 24807.000000 |
mean | 1.553344e+09 | 2019.0 | 3.097619 | 20.299369 | 12.062870 | 29.583441 | 29.614974 | 16.529235 | 74.358014 | 983.638640 | 72.601443 | 981.264248 | 16.629089 |
std | 5.011791e+05 | 0.0 | 0.296805 | 7.938573 | 6.895092 | 17.282217 | 17.218067 | 4.249602 | 16.349346 | 22.990619 | 14.051747 | 43.900166 | 3.693474 |
min | 1.552496e+09 | 2019.0 | 3.000000 | 1.000000 | 0.000000 | 0.000000 | 0.000000 | 8.900000 | 23.000000 | 400.200000 | 25.000000 | 392.500000 | 9.300000 |
25% | 1.552917e+09 | 2019.0 | 3.000000 | 16.000000 | 6.000000 | 15.000000 | 15.000000 | 13.300000 | 64.000000 | 979.900000 | 64.000000 | 980.000000 | 13.800000 |
50% | 1.553342e+09 | 2019.0 | 3.000000 | 22.000000 | 13.000000 | 30.000000 | 30.000000 | 15.900000 | 78.000000 | 986.100000 | 76.000000 | 985.900000 | 16.100000 |
75% | 1.553774e+09 | 2019.0 | 3.000000 | 26.000000 | 18.000000 | 45.000000 | 44.000000 | 18.600000 | 88.000000 | 990.400000 | 84.000000 | 989.900000 | 18.400000 |
max | 1.554224e+09 | 2019.0 | 4.000000 | 31.000000 | 23.000000 | 59.000000 | 59.000000 | 32.600000 | 96.000000 | 1082.500000 | 91.000000 | 1013.700000 | 30.100000 |
EDA 探索性数据分析
作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法
- 预处理:将train和test进行拼接,然后整体看某个属性的情况
- 作图:查看数据其中的结构与规律
预处理-用pandas中的concat函数pd.concat([df_train, df_test])
把train和test连接
【为了方便分开,就添加一个type属性(‘train’, ‘test’),来区分train集合和test集合】
df_train['type'] = 'train'
df_test['type'] = 'test'
df = pd.concat([df_train, df_test])
分开: 由于本来test是没有temperature这个属性的,但是由于拼接了之后和train有这个属性,所以再摘出来就获得了本来没有的这个属性,但是都赋值null了
train = df[df['type'] == 'train']
test = df[df['type'] == 'test']
show_info(train)
show_info(test)
输出为:「即可发现区别经过拼接和分开之后test增加了一列属性」
Collapsible
```xmlI am xml
`` -- should have an extra one, but don't want this closed.点击展开输出
data shape is: (25497, 14) sample number 25497 attribute number 14
data columns number 14
all columns: Index(['time', '年', '月', '日', '小时', '分钟', '秒', '温度(室外)', '湿度(室外)', '气压(室外)',
'湿度(室内)', '气压(室内)', 'temperature', 'type'],
dtype='object')
data all attribute count null:
cnt null
time 0
年 0
月 0
日 0
小时 0
分钟 0
秒 0
温度(室外) 660
湿度(室外) 660
气压(室外) 660
湿度(室内) 690
气压(室内) 690
temperature 690
type 0
data shape is: (406, 14) sample number 406 attribute number 14
data columns number 14
all columns: Index(['time', '年', '月', '日', '小时', '分钟', '秒', '温度(室外)', '湿度(室外)', '气压(室外)',
'湿度(室内)', '气压(室内)', 'temperature', 'type'],
dtype='object')
data all attribute count null:
cnt null
time 0
年 0
月 0
日 0
小时 0
分钟 0
秒 0
温度(室外) 2
湿度(室外) 2
气压(室外) 2
湿度(室内) 1
气压(室内) 1
temperature 406
type 0
作图
- 【hue】最好通过给所有数据添加一个属性type,来画图,这样就可以根据type来进行分类,最后在图中呈现出两种不同的数据的走向
- 【col】来区分是表格中的哪种属性
def plot_curve(df, col, hue):
plt.figure(figsize=(24,5))
sns.lineplot(x='time', y=col, hue=hue, data=df)
plt.show()
调用:
plot_curve(df, '温度(室外)', 'type')
plot_curve(df, '湿度(室外)', 'type')
plot_curve(df, '湿度(室内)', 'type')
plot_curve(df, '气压(室外)', 'type')
plot_curve(df, '气压(室内)', 'type')