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的室内温度,就不能利用这个时间点以后的真实数据进行预测。

特别说明,温室内的湿度和气压以及温室外的温度、湿度和气压会对温室内的温度产生一定的影响。

img

2.评估指标

本模型依据提交的结果文件,采用均方误差MSE进行评价。 观测值img,预测值img,待预测的记录数n,计算公式如下:img

数据准备工作

  • 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 ```xml

I 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')
Posted on Jan 28, 2020