2. 环境搭建与工具链:TensorFlow 2.x安装、Keras简介、Pandas与NumPy数据处理基础、Matplotlib可视化基础
好,咱们正式开始动手了。
做时间序列预测,说白了就是跟数据打交道。你想想看,没有趁手的工具,再牛的算法也跑不起来。这一章我带你搭好环境,把几个核心工具链捋一遍。嗯,这里要注意,版本问题是个大坑,我当年刚入行时就吃过这个亏。
2.1 TensorFlow 2.x 安装:别踩版本坑
TensorFlow 2.x 跟 1.x 差别很大。我个人习惯直接用 2.x,API 更简洁,跟 Keras 也深度绑定了。
安装命令很简单:
pip install tensorflow==2.10.0
为什么我推荐 2.10.0?因为这是最后一个原生支持 GPU 的 Windows 版本。之后的版本在 Windows 上装 GPU 支持,那叫一个折腾。我在项目中遇到过,有人装了 2.11 死活跑不了 GPU,最后回退到 2.10 才搞定。
验证安装:
import tensorflow as tf
print(tf.__version__) # 输出应为 2.10.0
print(tf.config.list_physical_devices('GPU')) # 看看有没有GPU
2.2 Keras 简介:高级 API 真香
Keras 现在是 TensorFlow 的官方高级 API。说白了,它就是帮你把底层那些复杂的计算图操作给封装好了。你只需要搭积木一样堆层就行。
举个例子,搭建一个简单的 LSTM 模型:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
model = Sequential([
LSTM(50, activation='relu', input_shape=(10, 1)),
Dense(1)
])
model.compile(optimizer='adam', loss='mse')
你看,几行代码就搞定了。我刚开始用 TF 1.x 时,写个 LSTM 要定义占位符、会话、变量初始化... 那叫一个痛苦。Keras 把这些都简化了,你只管关注模型结构本身。
2.3 Pandas 与 NumPy:数据处理双雄
时间序列数据,90% 的时间都在做数据清洗和预处理。Pandas 和 NumPy 就是干这个的。
NumPy:数值计算的基础
NumPy 提供了多维数组对象,说白了就是矩阵运算。时间序列数据经常要转成数组喂给模型。
import numpy as np
# 创建一个时间序列数组
data = np.array([1.2, 2.3, 3.1, 4.5, 5.2])
print(data.shape) # (5,)
# 重塑为 LSTM 需要的形状 [样本数, 时间步, 特征数]
data_reshaped = data.reshape((1, 5, 1))
print(data_reshaped.shape) # (1, 5, 1)
Pandas:时间序列的瑞士军刀
Pandas 的 DataFrame 和 Series 天生就是为时间序列设计的。我处理过的项目里,90% 的数据源都是 CSV 文件,Pandas 读进来直接就能用。
import pandas as pd
# 读取时间序列数据
df = pd.read_csv('sensor_data.csv', parse_dates=['timestamp'], index_col='timestamp')
print(df.head())
# 处理缺失值
df = df.fillna(method='ffill') # 用前一个值填充
# 重采样到小时级别
df_hourly = df.resample('H').mean()
常用 Pandas 操作一览:
| 操作 | 代码 | 说明 |
|---|---|---|
| 读取 CSV | pd.read_csv() | 记得加 parse_dates |
| 查看前几行 | df.head() | 快速检查数据 |
| 缺失值处理 | df.fillna() / df.dropna() | 千万别直接删,先想想 |
| 滑动窗口 | df.rolling(window=5).mean() | 做平滑用的 |
| 时间偏移 | df.shift(1) | 生成滞后特征 |
2.4 Matplotlib 可视化基础:一眼看出问题
数据好不好,画个图就知道了。Matplotlib 是 Python 最经典的可视化库,虽然有人说它丑,但胜在灵活。
import matplotlib.pyplot as plt
# 设置中文字体,不然会乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 画个时间序列图
plt.figure(figsize=(12, 4))
plt.plot(df.index, df['value'], color='blue', linewidth=1)
plt.title('传感器数据时间序列')
plt.xlabel('时间')
plt.ylabel('数值')
plt.grid(True, alpha=0.3)
plt.show()
为什么我强调要画图?因为肉眼能看出很多统计指标看不出的问题。比如突然的尖峰、长期趋势、季节性波动。我在项目中遇到过,数据看起来统计指标都正常,一画图发现中间有段全是零值,原来是传感器坏了。
fig, axes = plt.subplots(2, 1, figsize=(12, 6))上面放原始数据,下面放差分后的数据,一眼就能看出平稳性。
2.5 整合起来:一个完整的数据预处理流程
好了,工具都介绍完了。咱们来个实战演练,把整个流程串起来。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
# 1. 生成模拟数据
dates = pd.date_range('2023-01-01', periods=1000, freq='H')
data = np.sin(np.linspace(0, 20*np.pi, 1000)) + np.random.normal(0, 0.1, 1000)
df = pd.DataFrame({'timestamp': dates, 'value': data})
df.set_index('timestamp', inplace=True)
# 2. 可视化原始数据
plt.figure(figsize=(12, 4))
plt.plot(df.index, df['value'])
plt.title('原始时间序列数据')
plt.show()
# 3. 创建滑动窗口样本
def create_sequences(data, seq_length):
xs, ys = [], []
for i in range(len(data) - seq_length):
x = data[i:i+seq_length]
y = data[i+seq_length]
xs.append(x)
ys.append(y)
return np.array(xs), np.array(ys)
seq_length = 10
X, y = create_sequences(df['value'].values, seq_length)
# 4. 重塑为 LSTM 输入格式 [样本, 时间步, 特征]
X = X.reshape((X.shape[0], X.shape[1], 1))
# 5. 搭建模型
model = Sequential([
LSTM(50, activation='relu', input_shape=(seq_length, 1)),
Dense(1)
])
model.compile(optimizer='adam', loss='mse')
print('数据准备完成,模型已搭建,可以开始训练了!')
嗯,下一章咱们就开始讲数据预处理的具体技巧了。到时候会深入讲滑动窗口、归一化、训练集验证集划分这些实战内容。准备好了吗?