引言使用大语言模型或其输出结果来完成各类机器学习驱动的任务包括一些在语言模型出现前就已被解决的传统预测任务已逐渐成为一种趋势。这自然引出了时间序列预测领域的一个问题利用大语言模型例如将大语言模型生成的嵌入作为额外的工程特征是否真的有助于提升时间序列预测模型的性能本文将通过一个鼓励批判性思考的、循序渐进的实践示例来探讨这个关于大语言模型在预测未来等任务中实用性的紧迫问题。利用LLM嵌入改进金融时间序列预测实践演练首先我们为本示例导入必要的模块和库。在这个示例中我们将创建两个用于训练预测模型的数据集版本一个仅包含时间序列相关的特征另一个则额外包含了从另一个不同但存在一定因果关联数据集中衍生出的、由大语言模型生成的嵌入特征。使用的两个数据集是道琼斯工业平均指数30家美国大型公司道指成分股的每日调整后收盘价。我们将使用yfinance库获取此数据集。Combined_News_DJIA 新闻标题每日前25条财经新闻标题大部分与道指成分股公司相关。importpandasaspdimportnumpyasnpimportyfinanceasyffromsentence_transformersimportSentenceTransformerfromsklearn.decompositionimportPCAfromsklearn.metricsimportaccuracy_scorefromlightgbmimportLGBMClassifier接下来的代码片段加载第一个数据集并应用简单的特征工程来添加滞后特征和滚动统计量——这是时间序列预处理中的常见做法旨在为下游预测任务更好地捕捉有意义的信号模式ticker^DJIdf_priceyf.download(ticker,start2008-01-01,end2016-12-31)df_pricedf_price[[Close]]df_price[return]df_price[Close].pct_change()df_price[target](df_price[return].shift(-1)0).astype(int)df_pricedf_price.dropna()df_price.head()# 添加滞后特征和滚动平均特征forlagin[1,2,3,5]:df_price[flag_{lag}]df_price[return].shift(lag)df_price[roll_mean_5]df_price[return].rolling(5).mean()df_price[roll_std_5]df_price[return].rolling(5).std()df_pricedf_price.dropna()请注意这些工程特征名称中使用的前缀我们稍后将再次引用它们。接着加载新闻标题数据集并将每日的标题合并到一个单一的文本列中。这是一个为了说明问题而故意简化的方法实际中可以做得更复杂——例如更严格地筛选与道指相关的标题内容。df_newspd.read_csv(https://raw.githubusercontent.com/gakudo-ai/open-datasets/refs/heads/main/Combined_News_DJIA.csv)df_news.columnsdf_news.columns.str.strip()df_news[Date]pd.to_datetime(df_news[Date],dayfirstTrue)headline_cols[cforcindf_news.columnsifc.startswith(Top)]df_news[headline_cols]df_news[headline_cols].fillna()df_news[combined]df_news[headline_cols].apply(lambdarow: .join([str(x)forxinrowifstr(x).strip()!]),axis1)df_news[combined].head()下面的辅助函数并非绝对必要但对于去除因数据集中某些字符串最初为字节编码而产生的奇怪字符很有用importastdefclean_bytes_text(x): 将类似字节的字符串b...转换为普通文本 ifisinstance(x,str):try:evaluated_valueast.literal_eval(x)ifisinstance(evaluated_value,bytes):returnevaluated_value.decode(utf-8)else:returnstr(evaluated_value)except(ValueError,SyntaxError):ifx.startswith(b):returnx.strip(b\)returnxreturnx df_news[combined]df_news[combined].apply(clean_bytes_text)现在我们使用一个预训练的句子转换器模型来生成嵌入将“combined”列中合并的新闻标题作为输入modelSentenceTransformer(all-MiniLM-L6-v2)embeddingsmodel.encode(df_news[combined].tolist(),show_progress_barTrue)为了降低过拟合风险并限制嵌入空间的维度我们应用主成分分析pcaPCA(n_components20)embeddings_reducedpca.fit_transform(embeddings)emb_dfpd.DataFrame(embeddings_reduced,indexdf_news[Date],columns[femb_{i}foriinrange(20)])现在进入流程中最复杂的部分将时间序列特征与生成的嵌入维度合并到一个单一数据集中。该过程包括通过清理列名、扁平化可能的多重索引列以及确保’Date’表示为单层列来准备用于合并的df_price。然后将结果与emb_df基于’Date’进行合并。emb_dfemb_df.copy()emb_df.reset_index(inplaceTrue)emb_df.rename(columns{emb_df.columns[0]:Date},inplaceTrue)iflevel_0indf_price.columns:df_pricedf_price.drop(columns[level_0])ifindexindf_price.columns:df_pricedf_price.drop(columns[index])df_price_cleaneddf_price.reset_index()ifisinstance(df_price_cleaned.columns,pd.MultiIndex):new_cols[]forcolindf_price_cleaned.columns:ifcol[0]Date:new_cols.append(Date)elifisinstance(col,tuple)andcol[1]!:new_cols.append(col[1])else:new_cols.append(col[0])df_price_cleaned.columnsnew_colsifTickerindf_price_cleaned.columns:df_price_cleaneddf_price_cleaned.drop(columns[Ticker])df_price_cleaned[Date]pd.to_datetime(df_price_cleaned[Date])dfpd.merge(df_price_cleaned,emb_df,onDate,howinner)回顾之前用于时间序列特征的前缀。现在我们将列名分为两组一组是与传统时间序列属性相关的特征另一组是与大语言模型嵌入相对应的特征。emb_features[colforcolindf.columnsifemb_incol]ts_features[colforcolindf.columnsiflag_incolorroll_incol]定义了这些特征组后我们进入最后阶段训练两个预测模型。第一个是仅使用时间序列特征的基线模型第二个则结合了时间序列特征与基于嵌入的特征。# 重要提示将Date设置为DataFrame索引以便正确分割时间序列dfdf.set_index(Date)traindf[df.index2014-01-01]# 分割阈值testdf[df.index2014-01-01]X_train_basetrain[ts_features]X_test_basetest[ts_features]X_train_fulltrain[ts_featuresemb_features]X_test_fulltest[ts_featuresemb_features]y_traintrain[target]y_testtest[target]最后我们训练这两个模型并比较它们的性能。# 基线模型不使用LLM嵌入model_baseLGBMClassifier(random_state42)model_base.fit(X_train_base,y_train)pred_basemodel_base.predict(X_test_base)acc_baseaccuracy_score(y_test,pred_base)print(Baseline Accuracy:,acc_base)基线准确率: 0.5.# 完整模型使用LLM嵌入model_fullLGBMClassifier(random_state42)model_full.fit(X_train_full,y_train)pred_fullmodel_full.predict(X_test_full)acc_fullaccuracy_score(y_test,pred_full)print(With Embeddings Accuracy:,acc_full)完整模型准确率: 0.5047619047619047.结论LLM能否提升时间序列预测有趣的是完整模型的准确率仅略高于基线模型——实际上在实践意义上几乎相同。因此结果是尚无定论的。读者也可以尝试稍微调整用于分割训练集和测试集的阈值日期2014年1月1日观察结果会如何变化。在某些情况下性能差异甚至可能变得更加不稳定。这自然而然地引出了对文章开头问题的细致回答。LLM嵌入能改进时间序列预测吗答案也许并不令人意外取决于具体情况。虽然通过特征工程整合LLM嵌入有时被称为基于LLM的时间序列预测在特定情境下可能前景可期但它们远非纯粹基于时序特征的传统预测方法的通用替代方案。近期的一些研究表明尽管LLM在数据匮乏或文本丰富的场景中可能提升性能但在高频、复杂数值或高度不稳定数据的环境中它们带来的价值往往有限甚至可能表现不佳。一个明智的策略是在多种实验设置和时间分割下评估嵌入增强的预测模型评估其对明确定义的基线的改进是否一致且具有统计意义。简而言之LLM嵌入在某些预测场景中可能增加价值——但仔细的实验、稳健的验证和对领域背景的深刻理解仍然是至关重要的。FINISHED更多精彩内容 请关注我的个人公众号 公众号办公AI智能小助手或者 我的个人博客 https://blog.qife122.com/对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号网络安全技术点滴分享