预测智能电表的下一个非通信日
智能电表用于住宅,商业和生产场所的电,气,水和热的计费。公用事业公司对创建更智能,更高效的电网以减少非收入损失的需求正推动着这些智能电表的技术进步。但是,这些智能电表在维护和识别问题方面存在挑战。
识别故障/维护挑战
智能电表由于许多原因而变得无法通信,包括电能测量过多,电池电压不足,通信故障,定时错误,异常显示,烧坏以及天气等。此外,电表会暂时停止工作,并且时不时地这样做。最终,它会在数据中产生零消耗的时间段。当仪表不进行通信时,不仅会丢失数据,还会导致计费不准确,维修工作量增加以及客户不满意。
一旦在智能电表的运行过程中发生一定百分比的故障,电力公司将对故障信息进行统计以对情况的严重性进行分级,并发布操作风险警告进行修复。在此基础上,他们进行了后续分析。然而,该过程要求对故障现象的确认,定位以及分类技术人员的技术能力和经验有很高的要求。
因此,无论是对于国家电网的省级分支机构,还是对于电表制造商而言,标准化智能电表故障分类和故障信息统计过程的开发,特别是针对自动故障诊断和分类的自动分选装置的开发,都是如此。通过故障诊断和故障表分类技术拆除智能电表,是解决问题的重要方法。预测分析在这一方面为我们提供了很多帮助。它可以提供的众多机会之一是预测智能电表的下一个非通信日。
如果您知道智能电表是否可能在未来15天内脱机并成为数据丢失的受害者该怎么办。目的是预测电表是否会比实际故障更早地发生故障。机器学习模型可预测智能电表何时将变为非通信状态,从而导致现场检查,这对于节省成本至关重要。
我们可以在此基础上制定策略,并采取许多战术行动,例如:在修理其他永久停止的仪表时,维修人员可以验证附近的潜在故障仪表为
在本文中,我将解释智能电表的数据,特性以及如何使用机器学习算法解决此问题的方法。
需要采取行动来建立预测模型
? 数据准备
? 特征工程
? 选择机器学习模型
?超参数调整
? 部署模型(本文未讨论)
资料准备
为了说明解决方案方法,我通过合并和转换公开可用的数据集为该模型开发创建了数据集(有关数据,请参阅参考资料)。为了简单起见,我清理并删除了功能。从2011年11月23日到2014年2月28日,智能电表在超过2年的时间里每天都会收集清洁后的数据。
数据架构
栏位名称
描述
SMeterId
唯一的字母数字智能电表ID
meter_nbr
唯一的智能电表ID(数字)
阅读日期
阅读日期
阅读次数
当天的总阅读次数
energy_median
消费读数中值
能量平均值
消费读数平均值
energy_std
消耗读数的标准偏差
energy_sum
总消费读数
能量_分钟
消耗读数的最小值
能量最大
消耗读数的最大值
非通信电表定义
电表被认为是非通信的两种情况。首先,电表在任何时间间隔都记录为零消耗,并且energy_min字段的值为零。其次,由于智能电表每小时或每30分钟读取一次数据,因此在正常的一天中,读数计数为24或48,因此 读数计数不是24或48(取决于电表类型)。
这是完整的抄表数据,看起来像:
我们正在尝试从一系列非通信(NC)日期中预测下一个非通信事件的发生。我需要从完整的数据集中过滤掉非通讯性的抄表日期。这是python代码(有关完整的python代码,请参见参考)
nc_meter_data = meter_data_full [(meter_data_full.energy_min == 0)| (((meter_data_full.reading_count!= 24)&(meter_data_full.reading_count!= 48))]
训练模型的数据结构
我们使用智能电表使用九个月的每日能耗数据,并预测未来三个月的数据中的非使用日期。如果在接下来的3个月内没有任何非沟通事件,我们也会预测。假设我们的截止日期是2013年11月30日,然后拆分数据:
nc_meter_data_9m = nc_meter_data [(nc_meter_data.reading_date <datetime(2013
nc_meter_data_next = nc_meter_data [(nc_meter_data.reading_date> = datetime(2013
nc_meters = pd.DataFrame(nc_meter_data_9m ['meter_nbr']。unique())
nc_meters.columns = ['meter_nbr']
nc_meter_data_9m 代表九个月的数据,nc_meter_data_next 保留接下来三个月的电表数据。此外,我们将创建一个名为nc_meters 的数据 框, 以拥有用于预测模型的仪表级功能集:
nc_meters = pd.DataFrame(nc_meter_data_9m ['meter_nbr']。unique())
nc_meters.columns = ['meter_nbr']
通过使用nc_meter_data_next中的数据 ,我们需要计算 标签 (截止日期前的最后一个NC(非通信)日与之后的第一个NC(非通信)日之间的天数):
NextNCDay是仪表从最近9个月开始变为非通信状态的天数。现在,nc_meters如下所示:
您会很容易注意到,我们具有NaN值,因为这些电表是在过去3个月内一直处于非通信状态的好电表。因此,我们将999填充到NaN中(否则,一台预期不会很快无法通信的好仪表会在以后快速识别它们。
现在,我们在名为nc_meters的熊猫数据框中具有仪表编号和相应的标签。让我们通过我们的功能集来丰富它,以构建我们的机器学习模型。
特征工程
对于此项目,我们构建了11个变量来检测每个智能电表的消耗行为。那些是:
最近三个非沟通事件之间的天数
均值和标准差。天非沟通事件之间的差异
新近度–从阅读日期到最新日期的总天数(最大阅读日期)
新近度群集索引–使用无监督机器学习算法(kmean)将新近度得分分为4个群集
能耗–非交流日的每日总能耗
消费集群指数–使用无监督机器学习算法(kmean)将消费分数分为4个集群
频率–仪表发生9个月的全部非通信事件
频率聚类索引–使用无监督机器学习算法(kmean)将频率得分分为4个聚类
总体群集分数–通过每个群集重新排列索引后,来自新近度,消费和频率群集索引的合并索引分数。
下一个NC日范围-根据下一个非通讯日范围的仪表类别。当下一个NC事件<15天时,则0、15-30天为1,其他为2。
下一个NC日范围-根据下一个非通讯日范围的仪表类别。当下一个NC事件<15天时,则0、15-30天为1,其他为2。
根据客户类型,天气,电表类型,假期,高峰时间,一天中的星期,变送器,变压器,收集器等,还有许多功能是可能的。为了以简单的方式说明问题和解决方案,我仅使用了这些功能。
添加这些功能后,我们需要通过应用get_dummies 方法来处理这些分类功能 。
让我们集中讨论如何添加下两个功能。在此功能设计过程中,我们将大量使用 shift() 方法。
首先,我们创建一个带有meter_nbr和reading_date的数据框。
#创建带有仪表nbr和NC日期的数据框
meter_nc_day_order = nc_meter_data_9m [['meter_nbr','reading_date']]
#将阅读日期时间转换为一天
meter_nc_day_order ['nc_date'] = nc_meter_data_9m ['reading_date']。dt.date
meter_nc_day_order = meter_nc_day_order.sort_values(['meter_nbr','reading_date'])
接下来,通过使用班次,我们创建带有最近3个非交流事件发生日期的新列。
#shifting最后3 NC日期
meter_nc_day_order [ 'PrevNCDate'] = meter_nc_day_order.groupby( 'meter_nbr')[ 'nc_date']。移位(1)
meter_nc_day_order [ 'T2NCDate'] = meter_nc_day_order.groupby( 'meter_nbr')[ 'nc_date' ] .shift(2)
meter_nc_day_order ['T3NCDate'] = meter_nc_day_order.groupby('meter_nbr')['nc_date']。shift(3)
让我们开始计算每个NC(非交流)日期的天数差异
meter_nc_day_order ['DayDiff'] =(meter_nc_day_order ['nc_date']-meter_nc_day_order ['PrevNCDate'])。dt.days
meter_nc_day_order ['DayDiff2'] =(meter_nc_day_order ['nc_date']-meter_nc_day_order ['T2NCDate'])。dt.days
meter_nc_day_order ['DayDiff3'] =(meter_nc_day_order ['nc_date']-meter_nc_day_order ['T3NCDate'])。dt.days
对于每个meter_nbr,我们使用pandas .agg() 方法找出NC日期之间差异的均值和标准差:
meter_nc_day_diff = meter_nc_day_order.groupby('meter_nbr')。agg({'DayDiff':['mean','std']})。reset_index()
meter_nc_day_diff.columns = ['meter_nbr','DayDiffMean','DayDiffStd']
在这里,我们必须对非通信仪表的规则做出战术决策,以基于非通信事件的频率来选择具有较高非通信机会的仪表。对于许多次变得不通信的仪表,此规则非常有用。但是,对于那些发生1-2次非交流事件的人,我们不能说相同的话。例如,现在将仪表标记为频繁仪表,在过去9个月中仅发生2次非通信事件,为时过早。
我们仅使用以下行来保留购买次数超过3次的客户:
meter_nc_day_order_last = meter_nc_day_order.drop_duplicates(subset = ['meter_nbr'],keep ='last')
最后,我们删除NA值,将新的数据框与仪表合并,然后应用.get_dummies()来转换分类值:
meter_nc_day_order_last = meter_nc_day_order_last.dropna()
meter_nc_day_order_last = pd.merge(meter_nc_day_order_last,meter_nc_day_diff,on ='meter_nbr')
nc_meters = pd.merge(nc_meters,meter_nc_day_order_last [['meter_nbr','DayDiff','DayDiff2','DayDiff3','DayDiffMean','DayDiffStd']],on ='meter_nbr')
在应用get_dummies之前,将nc_meter_class创建为nc_meters的副本
nc_meter_class = nc_meters.copy()
nc_meter_class = pd.get_dummies(data = nc_meter_class,columns = ['Segment'])
现在,该功能集已准备好构建分类模型。让我们继续
选择机器学习模型
在开始选择模型之前,我们需要执行两个操作。首先,我们需要确定模型的类。通常,百分位数会为此提供权利。让我们使用 .describe() 方法在NextNCDay中查看它们 :
确定界限是统计和业务需求的问题。就第一个而言,它应该有意义,并且易于操作和沟通。考虑到这两个,我们将有三个类:
· 0-15:将在0-15天内丢失数据的电表— 类名称:1
· 16-30:将在16-30天内丢失数据的客户— 类名称:0
· ≥30:将在30天内丢失数据的客户— 类名称:2
nc_meter_class ['NextNCDayRange'] = 2
nc_meter_class.loc [nc_meter_class.NextNCDay> 15,'NextNCDayRange'] = 1
nc_meter_class.loc [nc_meter_class.NextNCDay> 30,'NextNCDayRange'] = 0
最后一步是查看功能与标签之间的相关性。该 相关矩阵 是显示这个最干净的方法之一:
corr = nc_meter_class [nc_meter_class.columns] .corr()
plt.figure(figsize =(30
sns.heatmap(corr,annot = True,linewidths = 0.2,fmt =“。2f”)
看起来 总体得分 具有最高的正相关(0.71),而 新近度 具有最高的负相关(-0.40)。
对于此特定问题,我们想使用线性回归,朴素贝叶斯,随机森林,支持向量分类器,决策树和最近邻分类器模型,并 选择 具有最高准确性的模型。让我们分开训练和测试测试,并测量不同模型的准确性:
每个型号的精度:
从该结果可以看出,随机森林是表现最好的森林(准确性约94%)。但是在此之前,让我们看看我们到底做了什么。我们在机器学习中应用了一个基本概念,即 交叉验证。
我们如何才能确保我们的机器学习模型在不同数据集中的稳定性?另外,如果我们选择的测试仪中有噪音该怎么办。
交叉验证是衡量这一点的一种方法。它通过选择不同的测试集来提供模型的分数。如果偏差低,则表示模型稳定。在我们的情况下,分数之间的偏差是可以接受的(决策树分类器除外)。
让我们与“随机森林”一起前进,看看如何使用一些先进技术改进现有模型。
超参数调整
要构建模型,我们将遵循前面文章中的步骤。但是为了进一步改善它,我们将进行超参数 调整。通过编程,我们将找出模型的最佳参数,以使其提供最佳准确性。
让我们首先对模型进行编码:
rf = RandomForestClassifier()
#使用3折交叉验证随机搜索paranc_meters,
#跨100个不同组合搜索,并使用所有可用的核心
rf_random = RandomizedSearchCV(estimator = rf,param_distributions = random_grid,n_iter = 100,cv = 3,详细= 2,random_state = 42,n_jobs = -1)
#拟合随机搜索模型
rf_random.fit(X_train,y_train)
rf_random.best_params_
在此版本中,我们在测试集上的准确性为95%:
base_model = RandomForestClassifier()
base_model.fit(X_train,y_train)
base_accuracy =评估(base_model,X_test,y_test)
RandomForestClassifier()有许多参数。您可以在此处找到它们的列表 。对于此示例,我们将选择 n_estimators,max_features,max_depth,min_samples_split,min_samples_leaf 和 bootstrap。
以下代码将为这些参数生成最佳值:
从sklearn.model_selection导入GridSearchCV
random_grid = {'n_estimators':n_estimators,
'max_features':max_features,
'max_depth':max_depth,
'min_samples_split':min_samples_split,
'min_samples_leaf':min_samples_leaf,
'bootstrap':bootstrap}
gsearch1 = GridSearchCV(estimator = RandomForestClassifier(),
param_grid = random_grid,得分='准确性',n_jobs = -1,iid = False,cv = 2)
gsearch1.fit(X_train,y_train)
gsearch1.best_params_,gsearch1.best_score_
当我们使用 GridSearchCV的最佳参数时,准确性得分从94%增加到96%。您可以在 我的 github中找到Jupyter Notebook和本文的数据
结论
了解在下周或下个月将无法使用的仪表清单将是预防性维护的一项很好的资源措施。当我为客户解决此问题时,我考虑了许多其他功能,例如变压器的属性,收集器,客户类型,电表模型和假期日历,高峰时间,周末,白天或晚上等。此外,在定义非交流状态,由于变压器故障而无法交流。我希望本文能为您提供有关该问题及其解决方法的高级概述。

关注 CDA人工智能学院 ,回复“录播”获取更多人工智能精选直播视频!


雷达卡



京公网安备 11010802022788号







