做图网站有哪些内容,成都官网优化多少钱,低价虚拟主机,网站开发岗位名称项目地址#xff1a;Datamining_project: 数据挖掘实战项目代码
目录
一、背景和挖掘目标
1、问题背景
2、原始数据
3、挖掘目标
二、分析方法与过程
1、初步分析
2、总体流程
第一步#xff1a;数据抽取
第二步#xff1a;探索分析
第三步#xff1a;数据的预处…
项目地址Datamining_project: 数据挖掘实战项目代码
目录
一、背景和挖掘目标
1、问题背景
2、原始数据
3、挖掘目标
二、分析方法与过程
1、初步分析
2、总体流程
第一步数据抽取
第二步探索分析
第三步数据的预处理 第四步构建专家样本 第五步: 构建用水事件行为识别模型 三、总结和思考 一、背景和挖掘目标
1、问题背景
智能家居是利用先进的技术融合个性需求将与家居生活有关的各个子系统有机地结合在一起通过网络化综合智能控制和管理实现“以人为本”的全新生活体验。企业若能深入了解其产品在不同用户群的使用习惯开发新功能就能开拓新市场实现产品的智能化。根据家居的智能化分析客户行为识别不同客户群的特征、加深对客户的理解等。以热水器为例分析客户行为针对不同的客户群提供个性化产品、改进新产品的智能化的研发和制定相应的营销策略。
2、原始数据
用户用水数据表包括了洗浴、洗手、洗脸、洗菜、做饭等用水行为 3、挖掘目标
根据热水器采集到的数据划分一次完整用水事件在划分好的一次完整用水事件中识别出洗浴事件。
二、分析方法与过程
1、初步分析
热水器在状态发生改变或者有水流状态时每2秒会采集一条流水数据。因为用户行为不仅仅只有洗浴还存在其他的用水事件比如洗手、洗菜等所以热水器采集的数据来自各种不同的用水事件。基于热水器采集的数据根据水流量和停顿时间间隔划分为不同大小的时间区间每个区间是一个可理解的一次完整用水事件并以热水器一次完整用水事件作为一个基本事件。从独立的用水事件中识别出其中属于洗浴的事件。
2、总体流程 第一步数据抽取
采用无放回随机抽样法抽取200家热水器用户从2014年1月1日至2014年12月31日的用水记录作为原始建模数据。属性名称 属性说明 热水器编码 热水器出厂编号 发生时间 记录热水器处于某状态的时刻 开关机状态 热水器是否开机 即热 即时加热 加热中 热水器处于对水进行加热的状态 保温中 热水器处于对水进行保温的状态 有无水流 热水水流量大于等于10L/min为有水否则为无 实际温度 热水器中热水的实际温度 热水量 热水器热水的含量 水流量 热水器热水的水流速度 单位L/min 节能模式 热水器的一种节能工作模式 预约洗 预约一个时间使用热水 即时洗 不预约直接使用热水器 加热剩余时间 加热到设定温度还需多长时间 当前设置温度 热水器加热时热水能够到达的最大温度 第二步探索分析
为了探究用户真实用水停顿时间间隔的分布情况统计用水停顿的时间间隔并作频率分布直方图。 停顿时间间隔为0~0.3分钟的频率很高根据日常用水经验可以判断其为一次用水时间中的停顿停顿时间间隔为6~13分钟的频率较低分析其为两次用水事件之间的停顿间隔。两次用水事件的停顿时间间隔分布在3~7分钟与现场实验统计用水停顿的时间间隔近似。
第三步数据的预处理
1、数据规约属性规约因“热水器编号”、“即热”、“即时洗” 、“有无水流” 、“预约洗”、 “节能模式”对建模无作用可以去除。数值规约当热水器“开关机状态”为“关”且水流量为0时说明热水器不处于工作状态数据记录可以规约掉。2、数据变换
一次完整用水事件的划分用水状态记录中水流量不为0表明用户正在使用热水;而水流量为0时用户用热水发生停顿或者用热水结束。水流量为0的状态记录之间的时间间隔如果超过一个阈值T则从该段水流量为0的状态记录向前找到最后一条水流量不为0的用水记录作为上一次用水事件的结束;向后找到水流量不为0的状态记录作为下一个用水事件的开始。 #-*- coding: utf-8 -*-
#用水事件划分
import pandas as pdthreshold pd.Timedelta(4 min) #阈值为分钟
inputfile data/water_heater.xls #输入数据路径,需要使用Excel格式
outputfile tmp/dividsequence.xls #输出数据路径,需要使用Excel格式data pd.read_excel(inputfile)
data[u发生时间] pd.to_datetime(data[u发生时间], format %Y%m%d%H%M%S)
data data[data[u水流量] 0] #只要流量大于0的记录
d data[u发生时间].diff() threshold #相邻时间作差分比较是否大于阈值
data[u事件编号] d.cumsum() 1 #通过累积求和的方式为事件编号data.to_excel(outputfile)
用水事件阈值寻优根据水流量和停顿时间间隔的阈值划分一次完整的用水事件。 # -*- coding: utf-8 -*-
# 阈值寻优
import numpy as np
import pandas as pdinputfile data/water_heater.xls # 输入数据路径,需要使用Excel格式
n 4 # 使用以后四个点的平均斜率threshold pd.Timedelta(minutes5) # 专家阈值
data pd.read_excel(inputfile)
data[u发生时间] pd.to_datetime(data[u发生时间], format%Y%m%d%H%M%S)
data data[data[u水流量] 0] # 只要流量大于0的记录def event_num(ts):d data[u发生时间].diff() ts # 相邻时间作差分比较是否大于阈值return d.sum() 1 # 这样直接返回事件数dt [pd.Timedelta(minutesi) for i in np.arange(1, 9, 0.25)]
h pd.DataFrame(dt, columns[u阈值]) # 定义阈值列
h[u事件数] h[u阈值].apply(event_num) # 计算每个阈值对应的事件数
h[u斜率] h[u事件数].diff() / 0.25 # 计算每两个相邻点对应的斜率# df_test[col_name].rolling(ma).mean()新版本 ----pd.rolling_mean(df_test[col_name], ma) 旧版本
# pd.rolling_mean(h[u斜率].abs(), n)
h[u斜率指标] h[u斜率].rolling(n).mean() # 采用后n个的斜率绝对值平均作为斜率指标
ts h[u阈值][h[u斜率指标].idxmin() - n]
# 注用idxmin返回最小值的Index由于rolling_mean()自动计算的是前n个斜率的绝对值平均
# 所以结果要进行平移-nif ts threshold:ts pd.Timedelta(minutes4)print(ts)属性构造根据用水行为需构造四类指标时长指标、频率指标、用水的量化指标以及用水的波动指标。 属性解释
候选洗浴事件从大量的一次完整用水事件中筛选规则剔除可以明显判定不是洗浴的事件 筛选掉非常短暂的用水事件:一次完整的用水事件满足其中任意一个条件就被判定为短暂用水事件其筛选条件为:1、一次用水事件中总用水量纯热水)小于y升;2、用水时长小于100秒;3、总用水时长小于120秒。
3、缺失值的处理
因存在网络故障等原因导致用水数据状态记录缺失的情况需要对缺失的数据状态记录进行添加。其添加方法用水状态记录缺失的情况下填充一条状态记录使水流量为0发生时间加2秒其余属性状态不变。第四步构建专家样本 第五步:构建用水事件行为识别模型
1、洗浴识别模型
根据建模样本数据和用户记录的包含用水的用途、用水开始时间、用水结束时间等属性的用水日志建立BP神经网络模型识别洗浴事件。 # -*- coding: utf-8 -*-
# 建立、训练多层神经网络并完成模型的检验
from __future__ import print_function
import pandas as pdinputfile1 ../data/train_neural_network_data.xls # 训练数据
inputfile2 ../data/test_neural_network_data.xls # 测试数据
testoutputfile ../tmp/test_output_data.xls # 测试数据模型输出文件
data_train pd.read_excel(inputfile1) # 读入训练数据(由日志标记事件是否为洗浴)
data_test pd.read_excel(inputfile2) # 读入测试数据(由日志标记事件是否为洗浴)
y_train data_train.iloc[:, 4].as_matrix() # 训练样本标签列
x_train data_train.iloc[:, 5:17].as_matrix() # 训练样本特征
y_test data_test.iloc[:, 4].as_matrix() # 测试样本标签列
x_test data_test.iloc[:, 5:17].as_matrix() # 测试样本特征from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activationmodel Sequential() # 建立模型
model.add(Dense(11, 17)) # 添加输入层、隐藏层的连接
model.add(Activation(relu)) # 以Relu函数为激活函数
model.add(Dense(17, 10)) # 添加隐藏层、隐藏层的连接
model.add(Activation(relu)) # 以Relu函数为激活函数
model.add(Dense(10, 1)) # 添加隐藏层、输出层的连接
model.add(Activation(sigmoid)) # 以sigmoid函数为激活函数
# 编译模型损失函数为binary_crossentropy用adam法求解
model.compile(lossbinary_crossentropy, optimizeradam, class_modebinary)model.fit(x_train, y_train, nb_epoch100, batch_size1) # 训练模型
model.save_weights(../tmp/net.model) # 保存模型参数r pd.DataFrame(model.predict_classes(x_test), columns[u预测结果])
pd.concat([data_test.iloc[:, :5], r], axis1).to_excel(testoutputfile)
model.predict(x_test)2、模型检验
通过某热水器用户记录了两周的热水器用水日志将前一周的数据作为训练数据后一周的数据作为测试数据。根据该热水器用户提供的用水日志与多层神经网络模型识别结果的比较总共21条检测数据准确识别了18条数据模型对洗浴事件的识别准确率为85.5%。 三、总结和思考
根据上述模型划分的结果发现有时候会将两次或多次洗浴划分为一次洗浴因为在实际情况中存在着一个人洗完澡后另一个人马上洗的情况这中间过渡期间的停顿间隔小于阈值。针对两次或多次洗浴事件被合并为一次洗浴事件的情况需要进行优化对连续洗浴事件作识别提高模型识别精确度。判断连续洗浴的方法对每次用水事件建立一个连续洗判别指标。连续洗判别指标初始值为0每当有一个属性超过设定的阈值就给该指标加上相应的值最后判别连续洗指标是否超过给定的阈值如果超过给定的阈值认为该次用水事件为连续洗事件。