欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > 时序数据预测:TDengine 与机器学习框架的结合(二)

时序数据预测:TDengine 与机器学习框架的结合(二)

2025/4/21 3:46:13 来源:https://blog.csdn.net/qq_42190530/article/details/147272337  浏览:    关键词:时序数据预测:TDengine 与机器学习框架的结合(二)

五、实践案例:基于 TDengine 和机器学习框架的时序数据预测

五、实践案例:基于 TDengine 和机器学习框架的结合的时序数据预测

5.1 案例背景

本案例聚焦于智能电网领域的电力消耗预测。随着智能电网的快速发展,电力系统中产生了海量的时序数据,包括电力负荷、电压、电流等信息。准确预测电力消耗对于电力公司优化发电计划、合理分配电力资源、降低运营成本以及保障电力系统的稳定运行具有重要意义。

在实际的电力系统中,电力消耗受到多种因素的影响,如季节变化、天气状况、时间周期(工作日 / 节假日)、用户行为等。这些因素使得电力消耗数据呈现出复杂的非线性和周期性特征,给准确预测带来了挑战。传统的预测方法往往难以充分捕捉这些复杂特征,导致预测精度有限。而将 TDengine 与机器学习框架相结合,可以充分利用 TDengine 高效的数据存储和管理能力,以及机器学习框架强大的数据分析和建模能力,有望提高电力消耗预测的准确性。

5.2 数据准备

  1. 数据获取:本案例中,电力消耗数据来自于分布在不同区域的智能电表,这些电表实时采集电力消耗数据,并将其存储到 TDengine 数据库中。通过 TDengine 的 Python 连接器,可以轻松地从数据库中获取数据。使用 SQL 查询语句从 TDengine 中获取某一地区过去一年的每小时电力消耗数据,并将其转换为 Pandas 的数据帧格式,代码示例如下:
 

import taos

import pandas as pd

# 连接TDengine

conn = taos.connect(host='localhost', user='root', password='taosdata', database='power')

# 执行SQL查询

sql = "SELECT ts, consumption FROM power_consumption WHERE region ='region1' AND ts >= '2022-01-01 00:00:00' AND ts < '2023-01-01 00:00:00'"

df = pd.read_sql(sql, conn)

# 关闭连接

conn.close()

print(df.head())

  1. 数据清洗:原始数据中可能存在缺失值、异常值等问题,需要进行清洗。对于缺失值,可以采用插值法进行填充,如使用前一个值或后一个值进行填充,或者使用线性插值、样条插值等方法进行填充。对于异常值,可以通过设定阈值的方法进行检测和处理,将超过阈值的数据视为异常值,并进行修正或删除。使用 Pandas 的fillna()方法对缺失值进行前向填充,使用clip()方法将异常值限制在合理范围内,代码示例如下:
 

# 填充缺失值

df['consumption'] = df['consumption'].fillna(method='ffill')

# 处理异常值

df['consumption'] = df['consumption'].clip(lower=df['consumption'].quantile(0.01), upper=df['consumption'].quantile(0.99))

  1. 特征工程:为了提高模型的预测性能,需要从原始数据中提取有价值的特征。可以提取时间相关的特征,如小时、日、月、星期几、是否节假日等,这些特征可以帮助模型捕捉电力消耗的周期性变化。还可以计算滑动窗口统计特征,如过去几小时的平均电力消耗、最大电力消耗、最小电力消耗等,以反映电力消耗的趋势和波动情况。使用 Pandas 的dt属性提取时间特征,使用rolling()方法计算滑动窗口统计特征,代码示例如下:
 

# 提取时间特征

df['hour'] = df['ts'].dt.hour

df['day'] = df['ts'].dt.day

df['month'] = df['ts'].dt.month

df['weekday'] = df['ts'].dt.weekday

df['is_holiday'] = 0 # 假设已定义节假日判断函数,这里先设为0

# 计算滑动窗口统计特征

df['rolling_mean_3h'] = df['consumption'].rolling(window=3).mean()

df['rolling_max_3h'] = df['consumption'].rolling(window=3).max()

df['rolling_min_3h'] = df['consumption'].rolling(window=3).min()

# 删除包含缺失值的行(由于滑动窗口计算可能产生缺失值)

df = df.dropna()

5.3 模型选择与训练

  1. 模型选择:考虑到电力消耗数据的非线性和时序特性,选择长短期记忆网络(LSTM)作为预测模型。LSTM 是一种特殊的递归神经网络,能够有效处理具有长期依赖关系的序列数据,在时序数据预测中表现出色。同时,为了对比不同模型的性能,也选择 LightGBM 作为基准模型。LightGBM 是一种基于梯度提升决策树的机器学习算法,具有训练速度快、内存占用少、可处理大规模数据等优点。
  1. 模型训练:使用 Keras 框架构建 LSTM 模型。将数据分为训练集和测试集,按照 80% 和 20% 的比例进行划分。对训练数据进行归一化处理,使用MinMaxScaler将数据缩放到 0 到 1 之间,以提高模型的训练效果。设置 LSTM 模型的参数,包括层数、隐藏单元数量、激活函数等,并使用Adam优化器和Mean Squared Error损失函数进行模型训练。代码示例如下:
 

from sklearn.preprocessing import MinMaxScaler

from keras.models import Sequential

from keras.layers import LSTM, Dense

import numpy as np

# 划分训练集和测试集

train_size = int(len(df) * 0.8)

train_data, test_data = df[:train_size], df[train_size:]

# 数据归一化

scaler = MinMaxScaler(feature_range=(0, 1))

train_scaled = scaler.fit_transform(train_data[['consumption']])

test_scaled = scaler.transform(test_data[['consumption']])

# 构建LSTM模型输入数据

def create_dataset(dataset, look_back=1):

X, y = [], []

for i in range(len(dataset) - look_back):

X.append(dataset[i:i + look_back, 0])

y.append(dataset[i + look_back, 0])

return np.array(X), np.array(y)

look_back = 6 # 时间步长

X_train, y_train = create_dataset(train_scaled, look_back)

X_test, y_test = create_dataset(test_scaled, look_back)

# 重塑数据以适应LSTM输入要求

X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))

X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))

# 构建LSTM模型

model = Sequential()

model.add(LSTM(50, input_shape=(look_back, 1)))

model.add(Dense(1))

model.compile(loss='mean_squared_error', optimizer='adam')

# 训练LSTM模型

history = model.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_test, y_test), verbose=2)

对于 LightGBM 模型,使用scikit-learn库进行构建和训练。将特征数据和目标数据分离,将训练集和测试集的数据转换为 LightGBM 所需的格式,并设置模型的参数,如学习率、树的数量、最大深度等。使用训练数据对 LightGBM 模型进行训练,并使用测试数据进行评估,代码示例如下:

 

import lightgbm as lgb

from sklearn.metrics import mean_squared_error

# 分离特征和目标

X = df.drop(['ts', 'consumption'], axis=1)

y = df['consumption']

# 划分训练集和测试集

X_train, X_test = X[:train_size], X[train_size:]

y_train, y_test = y[:train_size], y[train_size:]

# 转换为LightGBM数据集格式

lgb_train = lgb.Dataset(X_train, label=y_train)

lgb_eval = lgb.Dataset(X_test, label=y_test)

# 设置LightGBM模型参数

params = {

'objective':'regression',

'learning_rate': 0.01,

'num_leaves': 31,

'feature_fraction': 0.9,

'bagging_fraction': 0.8,

'bagging_freq': 5,

'verbose': 0

}

# 训练LightGBM模型

gbm = lgb.train(params, lgb_train, num_boost_round=1000, valid_sets=lgb_eval, early_stopping_rounds=50)

# 预测并评估

y_pred_lgb = gbm.predict(X_test)

mse_lgb = mean_squared_error(y_test, y_pred_lgb)

print(f'LightGBM Mean Squared Error: {mse_lgb}')

5.4 预测与评估

  1. 预测:使用训练好的 LSTM 模型和 LightGBM 模型对测试集进行预测。对于 LSTM 模型,将测试集数据进行预处理后输入模型,得到预测结果,并将预测结果进行反归一化处理,恢复到原始数据的尺度。对于 LightGBM 模型,直接使用训练好的模型对测试集特征数据进行预测,代码示例如下:
 

# LSTM模型预测

y_pred_lstm = model.predict(X_test)

y_pred_lstm = scaler.inverse_transform(y_pred_lstm)

# LightGBM模型预测

y_pred_lgb = gbm.predict(X_test)

  1. 评估:使用均方根误差(RMSE)、平均绝对误差(MAE)和决定系数(\(R^2\))等指标对预测结果进行评估。RMSE 反映了预测值与真实值之间的平均误差的平方根,能够衡量预测值的离散程度;MAE 反映了预测值与真实值之间的平均绝对误差,对异常值不敏感;\(R^2\)衡量了模型对数据的拟合优度,取值范围在 0 到 1 之间,越接近 1 表示模型的拟合效果越好。计算 LSTM 模型和 LightGBM 模型的评估指标,并进行对比分析,代码示例如下:
 

from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

# 计算LSTM模型评估指标

rmse_lstm = np.sqrt(mean_squared_error(y_test, y_pred_lstm))

mae_lstm = mean_absolute_error(y_test, y_pred_lstm)

r2_lstm = r2_score(y_test, y_pred_lstm)

print(f'LSTM Root Mean Squared Error: {rmse_lstm}')

print(f'LSTM Mean Absolute Error: {mae_lstm}')

print(f'LSTM R2 Score: {r2_lstm}')

# 计算LightGBM模型评估指标

rmse_lgb = np.sqrt(mean_squared_error(y_test, y_pred_lgb))

mae_lgb = mean_absolute_error(y_test, y_pred_lgb)

r2_lgb = r2_score(y_test, y_pred_lgb)

print(f'LightGBM Root Mean Squared Error: {rmse_lgb}')

print(f'LightGBM Mean Absolute Error: {mae_lgb}')

print(f'LightGBM R2 Score: {r2_lgb}')

通过评估指标的对比,可以看出 LSTM 模型在捕捉电力消耗数据的复杂时序特征方面具有优势,其预测性能优于 LightGBM 模型。在实际应用中,可以根据具体需求和数据特点选择合适的模型进行电力消耗预测。

六、实施步骤与注意事项

6.1 环境搭建

  1. 安装 TDengine:根据操作系统类型,从 TDengine 官方网站(https://www.taosdata.com/cn/all-downloads/ )下载对应的安装包。如果是 Linux 系统,可以使用 tar 包或 rpm 包进行安装。以 tar 包安装为例,首先解压安装包,然后进入解压后的目录,执行./install.sh -e no命令进行安装。安装完成后,需要修改/etc/taos/taos.cfg配置文件,设置数据存储路径、日志路径等参数。在 Windows 系统上,下载对应的.exe安装文件,双击运行安装程序,按照提示完成安装,并配置taos.cfg文件。在安装过程中,要注意关闭防火墙或开放 TDengine 所需的端口(如 6030 - 6049 的 TCP 和 UDP 端口),确保 TDengine 能够正常通信。
  1. 安装机器学习框架:如果选择 Python 作为开发语言,常用的机器学习框架如 Scikit - learn、TensorFlow、PyTorch 等可以通过pip命令进行安装。安装 Scikit - learn 可以执行pip install -U scikit - learn;安装 TensorFlow 可以根据需求选择 CPU 版本或 GPU 版本,CPU 版本执行pip install tensorflow,GPU 版本需要根据 CUDA 和 cuDNN 的版本选择对应的 TensorFlow 版本进行安装;安装 PyTorch 同样需要根据 CUDA 版本选择合适的安装命令,如pip install torch torchvision torchaudio --index - url https://download.pytorch.org/whl/cu117(假设使用 CUDA 11.7)。在安装机器学习框架时,要注意版本兼容性,不同版本的框架可能对 Python 版本、依赖库版本有不同的要求,需参考官方文档进行正确安装。

6.2 数据接入与处理

  1. 数据接入 TDengine:利用 TDengine 提供的各种连接器,如 Python 连接器、Java 连接器等,将时序数据接入 TDengine。以 Python 连接器为例,首先使用taos.connect()函数连接到 TDengine 数据库,传入主机地址、用户名、密码和数据库名等参数。然后,使用execute()方法执行 SQL 语句,将数据插入到 TDengine 中。如果数据量较大,可以使用批量插入的方式提高插入效率,通过构建包含多条数据的列表,使用executemany()方法一次性插入多条数据。代码示例如下:
 

import taos

# 连接TDengine

conn = taos.connect(host='localhost', user='root', password='taosdata', database='power')

cursor = conn.cursor()

# 批量插入数据

data = [

('2023-01-01 00:00:00', 10.5),

('2023-01-01 01:00:00', 11.2),

('2023-01-01 02:00:00', 9.8)

]

sql = "INSERT INTO power_data (ts, value) VALUES (%s, %s)"

cursor.executemany(sql, data)

# 提交事务并关闭连接

conn.commit()

cursor.close()

conn.close()

  1. 数据清洗与转换:原始时序数据可能存在噪声、缺失值、异常值等问题,需要进行清洗和转换。对于噪声数据,可以使用滤波算法进行平滑处理,如移动平均滤波、卡尔曼滤波等;对于缺失值,可以采用插值法进行填充,如线性插值、样条插值等;对于异常值,可以通过设定阈值、使用聚类算法或孤立森林算法等方法进行检测和处理。在数据转换方面,可能需要对数据进行归一化或标准化处理,以提高机器学习模型的性能。使用MinMaxScaler对数据进行归一化处理,将数据缩放到 0 到 1 之间,代码示例如下:
 

from sklearn.preprocessing import MinMaxScaler

data = [[10], [15], [20], [25], [30]]

scaler = MinMaxScaler(feature_range=(0, 1))

scaled_data = scaler.fit_transform(data)

print(scaled_data)

6.3 模型部署与优化

  1. 模型部署:将训练好的机器学习模型部署到生产环境中,可以使用多种方式。一种常见的方式是将模型封装成 Web 服务,使用 Flask、Django 等 Web 框架创建 API 接口,接收外部的预测请求,并返回预测结果。以 Flask 为例,首先加载训练好的模型,然后定义 API 端点,在端点函数中接收请求数据,进行预处理后输入模型进行预测,最后返回预测结果。代码示例如下:
 

from flask import Flask, request, jsonify

import joblib

app = Flask(__name__)

# 加载模型

model = joblib.load('trained_model.pkl')

@app.route('/predict', methods=['POST'])

def predict():

data = request.get_json(force=True)

# 数据预处理

processed_data = preprocess_data(data)

prediction = model.predict(processed_data)

return jsonify({'prediction': prediction.tolist()})

if __name__ == '__main__':

app.run(debug=True)

  1. 模型优化与维护:在模型部署后,需要对模型进行持续的优化和维护。可以定期使用新的数据对模型进行重新训练,以适应数据分布的变化和业务需求的更新。同时,要对模型的性能进行监控,使用指标如准确率、召回率、F1 值、均方误差等评估模型的预测效果。如果发现模型性能下降,需要分析原因,可能是数据质量问题、模型过拟合或欠拟合等,然后采取相应的措施进行优化,如重新清洗数据、调整模型参数、增加数据量等。

6.4 注意事项

  1. 数据一致性:在数据接入和处理过程中,要确保数据的一致性。由于 TDengine 与机器学习框架之间存在数据交互,可能会因为数据传输、处理过程中的问题导致数据不一致。因此,需要建立数据校验机制,在数据接入 TDengine 时进行完整性和准确性校验,在数据从 TDengine 读取到机器学习框架进行处理后,也要进行结果校验,确保数据在整个流程中的一致性。
  1. 性能优化:TDengine 和机器学习框架的性能都会影响整个系统的性能。在 TDengine 方面,要合理设计数据模型,使用合适的索引和分区策略,以提高数据查询效率;在机器学习框架方面,要优化模型结构和参数,选择合适的算法和训练方法,减少模型训练和预测的时间。同时,要注意系统的资源使用情况,避免因为资源不足导致性能下降。
  1. 兼容性问题:TDengine 与机器学习框架之间可能存在兼容性问题,不同版本的 TDengine 和机器学习框架可能对彼此的支持程度不同。在选择版本时,要参考官方文档和社区经验,确保两者之间的兼容性。此外,还要考虑与其他依赖库和工具的兼容性,如操作系统、数据库驱动、Python 版本等。
  1. 数据安全:时序数据可能包含敏感信息,如电力系统中的用户用电数据、工业生产中的设备运行数据等。在数据存储和传输过程中,要采取安全措施,如加密存储、传输加密、访问控制等,确保数据的安全性和隐私性。同时,要遵守相关的数据安全法规和政策。

七、未来展望

7.1 技术发展趋势

  • 算法优化与创新:随着机器学习和深度学习技术的不断发展,未来将出现更多专门针对时序数据预测的高效算法。这些算法将更好地捕捉时序数据的复杂特征和规律,进一步提高预测的准确性和可靠性。结合注意力机制和 Transformer 架构的时序预测算法,能够更有效地处理长序列数据,提高对数据中关键信息的关注度,从而提升预测性能。
  • 模型融合与集成:将多种不同的机器学习模型进行融合和集成,能够充分发挥各个模型的优势,弥补单一模型的不足。通过将 LSTM、GRU 等深度学习模型与传统的机器学习模型(如 ARIMA、Prophet 等)进行融合,可以综合利用不同模型对数据的理解和处理能力,提高预测的稳定性和准确性。在实际应用中,可以根据数据的特点和需求,选择合适的模型进行融合,以达到最佳的预测效果。
  • 实时性增强:在许多应用场景中,对时序数据的实时预测需求越来越迫切。未来,TDengine 与机器学习框架的结合将更加注重实时性的提升,通过优化数据处理流程、采用实时计算技术等手段,实现对时序数据的实时采集、处理和预测。利用 TDengine 的流式计算功能,结合实时机器学习算法,能够对物联网设备产生的实时数据进行快速分析和预测,及时发现异常情况并做出响应。
  • 自动机器学习(AutoML):AutoML 技术能够自动完成机器学习模型的选择、超参数调优等任务,大大降低了机器学习的应用门槛。未来,将 AutoML 技术应用于 TDengine 与机器学习框架的结合中,能够实现更高效、便捷的时序数据预测。通过 AutoML 工具,可以自动根据数据特征和预测目标选择最合适的机器学习模型,并自动调整模型的超参数,提高模型的性能和效率。

7.2 应用拓展

  • 智能交通:在智能交通领域,TDengine 与机器学习框架的结合将发挥重要作用。通过对交通流量、车速、车辆位置等时序数据的实时采集和分析,利用机器学习模型进行交通流量预测、交通事故预测、智能路径规划等。根据实时交通数据预测不同路段的交通拥堵情况,为驾驶员提供最优的行驶路线,减少交通拥堵和出行时间;通过分析车辆的行驶数据,预测交通事故的发生概率,提前采取预防措施,提高交通安全水平。
  • 智能家居:在智能家居系统中,各种智能设备(如智能电表、智能水表、智能空调、智能灯光等)会产生大量的时序数据。将 TDengine 与机器学习框架相结合,可以对这些数据进行分析和挖掘,实现智能家居设备的智能控制、能源管理、故障预测等功能。根据用户的习惯和实时环境数据,自动调整智能空调的温度和风速,实现节能和舒适的平衡;通过对智能电表数据的分析,预测家庭的用电需求,提前进行能源调配,降低用电成本;利用机器学习模型对智能设备的运行数据进行监测和分析,预测设备故障,提前进行维护,提高设备的可靠性和使用寿命。
  • 医疗健康:在医疗健康领域,TDengine 与机器学习框架的结合也具有广阔的应用前景。通过对患者的生命体征数据(如心率、血压、体温等)、医疗影像数据、疾病诊断数据等时序数据的分析,利用机器学习模型进行疾病预测、健康风险评估、个性化医疗方案制定等。通过对患者的历史健康数据进行分析,预测患者患某种疾病的风险,提前进行干预和预防;根据患者的个体特征和疾病情况,利用机器学习算法制定个性化的治疗方案,提高治疗效果;利用 TDengine 存储和管理大量的医疗数据,为医学研究提供数据支持,推动医学科学的发展。
  • 金融领域:在金融领域,时序数据的预测对于风险管理、投资决策等具有重要意义。将 TDengine 与机器学习框架相结合,可以对股票价格、汇率、利率等金融时序数据进行分析和预测,为投资者提供决策支持。利用机器学习模型对股票市场的历史数据进行分析,预测股票价格的走势,帮助投资者制定合理的投资策略;通过对汇率和利率数据的预测,帮助金融机构进行风险管理和资产配置。

八、结论

在当今数字化时代,时序数据预测对于众多领域的决策制定和业务发展至关重要。TDengine 与机器学习框架的结合,为时序数据预测提供了一种强大且高效的解决方案,展现出了显著的优势和广阔的应用前景。

TDengine 作为一款专门针对时序数据设计的高性能数据库,以其卓越的存储和查询能力,为机器学习模型提供了坚实的数据基础。通过高效地管理海量的时序数据,TDengine 确保了数据的快速获取和处理,大大提高了机器学习模型训练和预测的效率。而机器学习框架则凭借其强大的算法和工具,能够深入挖掘数据中的潜在模式和规律,实现精准的时序数据预测。

通过实际案例的展示,我们看到了这种结合在智能电网电力消耗预测中的成功应用。通过合理的数据准备、模型选择与训练,以及科学的预测与评估,实现了较为准确的电力消耗预测,为电力公司的运营决策提供了有力支持。在实施过程中,我们详细介绍了环境搭建、数据接入与处理、模型部署与优化等关键步骤,并强调了数据一致性、性能优化、兼容性和数据安全等注意事项,为实际应用提供了全面的指导。

展望未来,随着技术的不断进步,TDengine 与机器学习框架的结合将在算法优化、模型融合、实时性增强和自动机器学习等方面取得更大的突破,进一步提升时序数据预测的性能和效率。在应用拓展方面,智能交通、智能家居、医疗健康和金融等领域将成为其重要的应用场景,为这些领域的智能化发展注入新的活力。

对于从事相关领域的开发者和研究者来说,TDengine 与机器学习框架的结合是一个充满机遇和挑战的领域。希望本文能够激发大家的兴趣,鼓励大家积极尝试和探索,将这一技术应用到更多的实际场景中,为推动各行业的数字化转型和智能化发展贡献力量。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词