预测德国太阳能生产:使用 Prophet 的实际方法
使用 Python 的分析与实现
https://medium.com/@aashishnair?source=post_page---byline--717aa23ecd58--------------------------------https://towardsdatascience.com/?source=post_page---byline--717aa23ecd58-------------------------------- Aashish Nair
·发表于 Towards Data Science ·阅读时长 8 分钟·2024 年 9 月 11 日
–
Pixabay 图片:www.pexels.com/photo/blue-solar-panel-board-356036/
目录
∘ 介绍
∘ 为什么要预测太阳能?
∘ 数据
∘ 探索性数据分析
∘ 为什么选择 Prophet?
∘ 模型评估标准
∘ 基准模型
∘ Prophet 模型(默认超参数)
∘ Prophet 模型(调整后的超参数)
∘ 结果与讨论
∘ 未来步骤
∘ 结论
∘ 参考文献
介绍
德国目前正在进行Energiewende,这是一项长期的能源转型,旨在实现碳中和,主要依靠可再生能源资源来发电。太阳能在确保德国能源安全方面发挥着关键作用。
因此,这一转型的成功在很大程度上依赖于准确预测未来太阳能产出的能力。本文探讨了使用 Prophet 库预测德国太阳能发电的可行性。
在基础模型时代的预测
将 Lag-Llama 与 XGBoost 进行基准测试
https://medium.com/@acorralescano?source=post_page---byline--8cd4eea0079d--------------------------------https://towardsdatascience.com/?source=post_page---byline--8cd4eea0079d-------------------------------- Alvaro Corrales Cano
·发表于 Towards Data Science ·14 分钟阅读·2024 年 7 月 20 日
–
Ribadesella 附近的悬崖。图片由 Enric Domas 提供,来源于 Unsplash
在写作时,Hugging Face 上有 20 个标记为“时间序列”的模型。虽然数量不算多(“text-generation-inference”标签下有 125,950 个结果),但使用基础模型进行时间序列预测是一个足够有趣的领域,足以让像 Amazon、IBM 和 Salesforce 这样的大公司开发出自己的模型:分别是 Chronos、TinyTimeMixer 和 Moirai。在写作时,Hugging Face 上最受欢迎的模型之一是 Lag-Llama,它是一个单变量概率模型。该模型由 Kashif Rasul、Arjun Ashok 及其合著者 [1] 开发,并于 2024 年 2 月开源。模型的作者声称它在多个领域的不同数据集上具有“强大的零-shot 泛化能力”。一旦针对特定任务进行微调,他们还声称它是同类模型中最好的通用模型。大言不惭!
在这篇博客中,我展示了自己在微调 Lag-Llama 方面的经验,并将其与更经典的机器学习方法进行对比测试。特别地,我将其与一个旨在处理单变量时间序列数据的 XGBoost 模型进行了基准测试。像 XGBoost 这样的梯度提升算法被广泛认为是“经典”机器学习的代表(与深度学习相对),并且已被证明在…
预测未来:我们如何利用昨天的见解预测明天的需求?
尽管人工智能模型成为了焦点,传统的统计模型仍然是需求预测中非常有价值的工具
https://medium.com/@ayoubeloutati?source=post_page---byline--1cfecc630fb5--------------------------------https://towardsdatascience.com/?source=post_page---byline--1cfecc630fb5-------------------------------- Ayoub El Outati
·发布于Towards Data Science ·11 分钟阅读·2024 年 11 月 5 日
–
图片由petr sidorov提供,来自Unsplash
你好,Medium 的读者们!
今天,我们将深入探讨应用于需求规划的预测技术,这是我非常关注的领域,因为我有供应链背景,并且对数据科学充满热情。最近,我一直在阅读有关这个主题的书籍和文章,重新审视需求预测,以便为你提供一些新的见解。
首先,让我分享一句发人深省的名言,来自英国统计学家George E. P. Box:
“所有模型都是错误的,但有些是有用的。”
当你思考这句话时,你可能会想:如果没有任何模型能完全准确,为什么还要预测未来呢?可以把它想象成天气预报:它帮助我们提前规划。我明天要带伞吗?我要擦防晒霜吗?我需要躲避飓风吗?虽然预测不完美,但它们帮助我们做出更好的决策。
在需求规划中也不例外。需求规划师和其他公司利益相关者利用预测来预判未来需求并做出调整…
使用机器学习和数学预测美国 GDP
我们能从这个现代问题中学到什么?
https://medium.com/@dmongia_35626?source=post_page---byline--62f3f794d690--------------------------------https://towardsdatascience.com/?source=post_page---byline--62f3f794d690-------------------------------- Dron Mongia
·发布于Towards Data Science ·14 分钟阅读·2024 年 7 月 24 日
–
图片来自Igor Omilaev于Unsplash
动机:我们为什么要预测美国 GDP?
GDP 是衡量一个国家经济福祉的一个非常重要的指标;因此,预测这一指标非常受关注。例如,政策制定者和立法者可能希望在通过新法案或法律之前对国家 GDP 的趋势做出粗略预测。研究人员和经济学家也会在各种学术和工业领域的工作中考虑这些预测。
过程:我们如何接近这个问题?
与许多其他时间序列问题类似,GDP 预测遵循一个一般性的工作流程。
-
通过使用集成的 FRED(联邦储备经济数据)库和 API,我们将通过构建一个包含美国 GDP 及其他密切相关指标的数据框来创建我们的特征(GDP = 消费 + 投资 + 政府支出 + 净出口)
-
通过使用多种统计检验和分析方法,我们将探索数据的细微差别,以更好地理解特征之间潜在的关系。
-
最后,我们将利用多种统计和机器学习模型来得出哪种方法能带给我们最准确和高效的预测结果。
在所有这些步骤中,我们将深入探讨支持我们检验和模型的基本数学框架的细微差别。
步骤 1:特征创建
为了构建这个项目的数据集,我们将利用 FRED(联邦储备经济数据)API,这是收集经济数据的首选应用程序。请注意,要使用这些数据,必须在 FRED 网站上注册账户并申请一个自定义 API 密钥。
网站上的每个时间序列都与一个特定的字符串相连接(例如,GDP 连接到“GDP”,净出口连接到“NETEXP”等)。这一点非常重要,因为当我们调用每个特征时,我们需要确保指定正确的字符串来配合它。
记住这一点,现在让我们构建数据框:
#used to label and construct each feature dataframe.
def gen_df(category, series):
gen_ser = fred.get_series(series, frequency='q')
return pd.DataFrame({'Date': gen_ser.index, category + ' : Billions of dollars': gen_ser.values})
#used to merge every constructed dataframe.
def merge_dataframes(dataframes, on_column):
merged_df = dataframes[0]
for df in dataframes[1:]:
merged_df = pd.merge(merged_df, df, on=on_column)
return merged_df
#list of features to be used
dataframes_list = [
gen_df('GDP', 'GDP'),
gen_df('PCE', 'PCE'),
gen_df('GPDI', 'GPDI'),
gen_df('NETEXP', 'NETEXP'),
gen_df('GovTotExp', 'W068RCQ027SBEA')
]
#defining and displaying dataset
data = merge_dataframes(dataframes_list,'Date')
data
注意,由于我们已经定义了函数,而不是静态代码块,因此我们可以自由地扩展我们的特征列表以进行进一步测试。运行这段代码后,我们得到的数据框如下:
(最终数据集)
我们注意到我们的数据集从 1960 年代开始,这为我们提供了一个相当广泛的历史背景。此外,从数据框的形状来看,我们有 1285 个实际经济数据实例,这个数量虽然不算小,但也不算大。这些观察将在我们建模阶段发挥作用。
步骤 2:探索性数据分析
现在我们的数据集已经初始化,我们可以开始可视化并进行测试,从而获取一些关于数据行为及其特征之间关系的洞察。
可视化(折线图):
我们分析这个数据集的第一个方法是将每个特征绘制在同一图表上,以便捕捉一些模式。我们可以编写以下代码:
#separating date column from feature columns
date_column = 'Date'
feature_columns = data.columns.difference([date_column])
#set the plot
fig, ax = plt.subplots(figsize=(10, 6))
fig.suptitle('Features vs Time', y=1.02)
#graphing features onto plot
for i, feature in enumerate(feature_columns):
ax.plot(data[date_column], data[feature], label=feature, color=plt.cm.viridis(i / len(feature_columns)))
#label axis
ax.set_xlabel('Date')
ax.set_ylabel('Billions of Dollars')
ax.legend(loc='upper left', bbox_to_anchor=(1, 1))
#display the plot
plt.show()
运行代码后,我们得到的结果是:
(特征之间的绘图)
看图时,我们注意到一些特征与 GDP 的相似度远高于其他特征。例如,GDP 和 PCE 几乎遵循完全相同的趋势,而 NETEXP 则没有明显的相似性。虽然可能会很诱人,但我们在进行更多探索性测试之前,还不能开始选择并去除某些特征。
ADF(增强型迪基-富勒)检验:
ADF(增强型迪基-富勒)检验通过检查单位根的存在来评估特定时间序列的平稳性,单位根是定义时间序列为非平稳性的特征。平稳性本质上意味着时间序列具有恒定的均值和方差。进行此测试非常重要,因为许多流行的预测方法(包括我们在建模阶段将使用的方法)需要平稳性才能正常运行。
单位根公式
尽管通过观察图表我们可以确定大多数时间序列的平稳性,但进行测试仍然是有益的,因为我们可能会在后续的预测阶段重用这些测试。使用 Statsmodel 库,我们编写如下代码:
from statsmodels.tsa.stattools import adfuller
#iterating through each feature
for column in data.columns:
if column != 'Date':
result = adfuller(data[column])
print(f"ADF Statistic for {column}: {result[0]}")
print(f"P-value for {column}: {result[1]}")
print("Critical Values:")
for key, value in result[4].items():
print(f" {key}: {value}")
#creating separation line between each feature
print("\n" + "=" * 40 + "\n")
得到的结果是:
(ADF 测试结果)
我们在这个测试中关注的数字是 P 值。接近零的 P 值(等于或小于 0.05)表示平稳性,而接近 1 的 P 值则表示非平稳性。我们可以看到,所有的时间序列特征由于其统计上不显著的 P 值,都是高度非平稳的,换句话说,我们无法拒绝关于单位根不存在的零假设。下面是我们其中一个特征的测试简单可视化表示。红色虚线表示我们能够确定时间序列特征是否平稳的 P 值,而蓝色框表示该特征当前的 P 值。
(NETEXP 的 ADF 可视化)
VIF(方差膨胀因子)测试:
查找每个特征的方差膨胀因子(VIF)的目的是检查多重共线性,或者预测变量之间的相关程度。高多重共线性不一定对我们的预测有害,但它会使我们更难确定每个特征时间序列对预测的单独影响,从而影响模型的可解释性。
在数学上,计算如下:
(预测变量的方差膨胀因子)
其中,Xj 表示我们选择的预测变量,R²j 是我们特定预测变量的决定系数。将此计算应用于我们的数据,我们得出以下结果:
(每个特征的 VIF 评分)
显然,我们的预测变量之间有非常紧密的关联。VIF 得分大于 5 意味着多重共线性,而我们特征所获得的得分远远超过了这个值。可以预见,PCE 的得分最高,这也是可以理解的,因为其在线图上的形状与许多其他特征相似。
第 3 步:建模
现在,我们已经深入分析了数据,以更好地理解每个特征之间的关系和特征的性质,我们将开始对数据集进行修改,以便为建模做准备。
通过差分实现平稳性
为了开始建模,我们首先需要确保数据是平稳的。我们可以使用一种叫做差分的方法来实现,这本质上是通过类似上述测试的数学公式来转换原始数据。
该概念在数学上定义为:
(一阶差分方程)
这使得我们从特征中去除了非线性趋势,从而得到了一个常数序列。换句话说,我们从时间序列中提取出值,并计算与前一个点之间发生的变化。
我们可以将这个概念应用于我们的数据集,并使用以下代码检查之前使用的 ADF 测试结果:
#differencing and storing original dataset
data_diff = data.drop('Date', axis=1).diff().dropna()
#printing ADF test for new dataset
for column in data_diff.columns:
result = adfuller(data_diff[column])
print(f"ADF Statistic for {column}: {result[0]}")
print(f"P-value for {column}: {result[1]}")
print("Critical Values:")
for key, value in result[4].items():
print(f" {key}: {value}")
print("\n" + "=" * 40 + "\n")
运行此代码后结果为:
(差分数据的 ADF 检验)
我们注意到新的 p 值小于 0.05,这意味着我们现在可以拒绝原假设,即我们的数据集是非平稳的。查看新数据集的图表证实了这一断言:
(差分数据的图表)
我们看到所有的时间序列现在都集中在 0 附近,均值和方差保持不变。换句话说,我们的数据现在明显展示了平稳系统的特征。
VAR(向量自回归)模型
VAR 模型的第一步是执行Granger 因果关系检验,它将告诉我们哪些特征对我们的预测具有统计学意义。该测试告诉我们,特定时间序列的滞后版本是否可以帮助我们预测目标时间序列,但并不一定意味着一个时间序列导致了另一个时间序列(请注意,统计学中的因果关系是一个更难证明的概念)。
使用 StatsModels 库,我们可以按如下方式应用测试:
from statsmodels.tsa.stattools import grangercausalitytests
columns = ['PCE : Billions of dollars', 'GPDI : Billions of dollars', 'NETEXP : Billions of dollars', 'GovTotExp : Billions of dollars']
lags = [6, 9, 1, 1] #determined from individually testing each combination
for column, lag in zip(columns, lags):
df_new = data_diff[['GDP : Billions of dollars', column]]
print(f'For: {column}')
gc_res = grangercausalitytests(df_new, lag)
print("\n" + "=" * 40 + "\n")
运行代码后会生成以下表格:
(Granger 因果关系检验的示例,涉及两个特征)
在这里,我们只关心每个特征的单个滞后,其 p 值具有统计学意义(>0.05)。例如,由于在第一个滞后时,NETEXP 和 GovTotExp 都具有统计学意义,因此我们会将这两个特征考虑进 VAR 模型。个人消费支出可能没有达到这一标准(见笔记本),但是第六个滞后非常接近,因此我决定保留它。下一步是创建我们的 VAR 模型,因为我们已经决定所有特征在 Granger 因果关系检验中都是显著的。
VAR(向量自回归)模型可以利用不同的时间序列来衡量模式,并确定一个灵活的预测。数学上,该模型由以下公式定义:
(向量自回归模型)
其中 Yt 是某一时刻 t 的时间序列,Ap 是已确定的系数矩阵。我们实际上是在利用时间序列的滞后值(在我们的案例中是其他时间序列)来预测 Yt。了解这一点后,我们现在可以将该算法应用于 data_diff 数据集,并评估结果:
(评估指标)
(VAR 模型的实际与预测 GDP 对比)
通过查看这个预测,我们可以清楚地看到,尽管在使用的两个评估指标(MAE 和 MAPE)上严重偏离,但我们的模型在视觉上并不太不准确,除了因疫情引起的异常值外。从 2018 到 2019 年,以及从 2022 到 2024 年,我们基本上维持在测试线附近,然而随后的全球事件显然带来了一些不可预测性,影响了模型准确判断趋势的能力。
VECM(向量误差修正模型)
VECM(向量误差修正模型)与 VAR 相似,尽管有一些关键的不同之处。与 VAR 不同,VECM 不依赖于平稳性,因此差分和归一化时间序列不再是必须的。VECM 还假设存在协整,即时间序列之间的长期均衡。在数学上,我们将模型定义为:
(VECM 模型方程)
这个方程类似于 VAR 方程,其中Π是一个系数矩阵,是另外两个矩阵的乘积,并且计算我们时间序列Yt 的滞后版本的和。记住要在我们的原始(非差分)数据集上拟合模型,得到以下结果:
(VECM 的实际 GDP 与预测 GDP)
尽管由于我们现在使用的是非平稳数据,与 VAR 模型相比很难进行直接比较,但我们仍然可以通过误差度量和可视化结果推断出该模型未能准确捕捉到此预测中的趋势。因此,可以公平地说,我们可以排除传统统计方法来解决这个问题。
机器学习预测
在决定使用哪种机器学习方法来建模这个问题时,我们需要牢记我们所处理的数据量。在创建滞后列之前,我们的数据集总共有 1275 个观测值跨越所有时间序列。这意味着使用更复杂的方法,如 LSTM 或梯度提升,可能是多余的,因为我们可以使用一个更简单的模型来获得相同的准确度,同时具有更高的可解释性。
训练-测试集划分
时间序列问题的训练-测试集划分与传统回归或分类任务中的划分略有不同(请注意,我们在 VAR 和 VECM 模型中也使用了训练-测试集划分,但在机器学习部分讨论更为合适)。我们可以在差分数据上执行训练-测试集划分,使用以下代码:
#90-10 data split
split_index = int(len(data_diff) * 0.90)
train_data = data_diff.iloc[:split_index]
test_data = data_diff.iloc[split_index:]
#Assigning GDP column to target variable
X_train = train_data.drop('GDP : Billions of dollars', axis=1)
y_train = train_data['GDP : Billions of dollars']
X_test = test_data.drop('GDP : Billions of dollars', axis=1)
y_test = test_data['GDP : Billions of dollars']
在这里,我们必须确保不打乱我们的数据,因为这意味着我们在使用未来的数据进行训练,从而可能会导致数据泄漏。
时间序列数据上训练-测试集划分的示例
同时进行比较时,请注意我们正在训练数据的很大一部分(90%),而在常见的回归任务中通常训练 75%的数据。这是因为从实际操作角度看,我们并不关心预测一个很长的时间范围。实际上,即使是预测几年的数据,对于这个任务来说也是不太可能的,因为现实世界的时间序列数据具有很强的不确定性。
随机森林
记得我们之前做的 VIF 测试,知道我们的特征之间高度相关。这在一定程度上促使我们选择随机森林作为机器学习模型之一。决策树在特征之间做出二元选择,这意味着理论上特征之间的高度相关性对模型不会造成不利影响。
传统二叉决策树的示例,用于构建随机森林模型
此外,随机森林通常是一个非常强大的模型,因为它能够抵抗由于树的计算方式中的随机性所带来的过拟合。每棵树使用的是整个特征空间的一个随机子集,这意味着某些特征不太可能主导模型。构建完单个树之后,结果会被平均化,从而使用每个个体学习器做出最终预测。
我们可以使用以下代码将模型应用到我们的数据集:
from sklearn.ensemble import RandomForestRegressor
#fitting model
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
y_pred = rf_model.predict(X_test)
#plotting results
printevals(y_test,y_pred)
plotresults('Actual vs Forecasted GDP using Random Forest')
运行此代码会得到以下结果:
(随机森林的评估指标)
(随机森林的实际与预测 GDP 对比)
我们可以看到,随机森林能够提供我们迄今为止最佳的预测,获得了比 VAR 和 VECM 模型更好的误差指标。或许最令人印象深刻的是,从视觉上看,我们可以看到模型几乎完美地呈现了 2017–2019 年的数据,恰好是在遭遇异常值之前。
K 最近邻
KNN(K-最近邻)是我们尝试的最后一个方法。选择这个模型的部分原因是因为特征与观测的比例。KNN 是一种基于距离的算法,我们处理的数据特征空间相对较小,而观测数量较多。
要使用该模型,我们首先需要选择一个超参数k,它定义了数据映射到的邻居数。较高的k值意味着模型更偏向某些特征,而较低的k值则意味着模型可能会出现过拟合。我们可以使用以下代码选择最优的k值:
from sklearn.neighbors import KNeighborsRegressor
#iterate over all k=1 to k=10
for i in range (1,10):
knn_model = KNeighborsRegressor(n_neighbors=i)
knn_model.fit(X_train, y_train)
y_pred = knn_model.predict(X_test)
#print evaluation for each k
print(f'for k = {i} ')
printevals(y_test,y_pred)
print("\n" + "=" * 40 + "\n")
运行此代码会得到:
(比较不同 k 值的准确度)
我们可以看到,当k=2 时,我们获得了最佳的准确度度量值。超过这个值后,模型会随着k值的增加而变得越来越偏向某些特征。了解这一点后,我们可以将模型应用到我们的数据集中:
#applying model with optimal k value
knn_model = KNeighborsRegressor(n_neighbors=2)
knn_model.fit(X_train, y_train)
y_pred = knn_model.predict(X_test)
printevals(y_test,y_pred)
plotresults('Actual vs Forecasted GDP using KNN')
结果是:
(KNN 的评估指标)
(KNN 的实际与预测 GDP 对比)
我们可以看到,KNN 本身表现得非常好。尽管在误差度量上稍微被随机森林超越,但从视觉效果来看,模型的表现几乎相同,甚至可以说在 2018–2019 年疫情爆发前的那一段时间,KNN 的表现要比随机森林更好。
结论
通过查看我们所有的模型,我们可以看到表现最好的模型是随机森林。这很可能是因为随机森林大多数情况下是一个非常强大的预测模型,能够适应多种数据集。总体来说,机器学习算法远远超过了传统的统计方法。或许可以解释的是,VAR 和 VECM 都需要大量的历史背景数据才能最优运行,而我们由于数据是按季度间隔获取的,历史数据并不充足。此外,也可以说,这两种机器学习模型都是非参数模型。这些模型通常假设较少,因此可能对像这里这样的独特问题集更具灵活性。下面是我们最终的最佳预测,去除了之前为拟合模型而使用的差分变换。
(随机森林的实际 GDP 与预测 GDP(未差分))
挑战与改进方向
就这个预测问题而言,最大的挑战无疑是处理疫情引起的大量离群值,以及疫情之后的持续不稳定。显然,我们的预测方法无法预测这种情况的发生,最终导致每种方法的准确性下降。如果我们的目标是预测过去十年的数据,我们的模型可能会更容易发现和预测趋势。在改进和进一步研究方面,我认为一个可能的解决方案是对 2020-2024 年的时间区间进行某种归一化和离群值平滑技术处理,然后在新季度数据到来时评估我们的完全训练好的模型。此外,纳入对 GDP 有重大影响的新特征,例如季度通货膨胀率和个人资产评估,可能会是有益的。
参考文献
对于传统统计方法 — link.springer.com/book/10.1007/978-1-4842-7150-6 , www.statsmodels.org/stable/generated/statsmodels.tsa.vector_ar.vecm.VECM.html
对于机器学习方法 — www.statlearning.com/
对于数据集 — fred.stlouisfed.org/docs/api/fred/
FRED 为任何拥有 API 密钥的用户提供许可的、免费的数据集,详细信息请参阅此处 — fredhelp.stlouisfed.org/fred/about/about-fred/what-is-fred/
所有未在图片说明中特别注明的图片归我所有。
笔记本
请注意,为了运行此笔记本,您必须在 FRED 网站上创建一个帐户,申请一个 API 密钥,并将该密钥粘贴到笔记本的第二个单元格中。
github.com/Dronmong/GDP-Forecast
使用 NHiTs 进行预测:将深度学习与信号处理理论结合,实现卓越的准确性
适用于所有预测场景的高性能深度学习模型
https://medium.com/@nikoskafritsas?source=post_page---byline--9933b119a494--------------------------------https://towardsdatascience.com/?source=post_page---byline--9933b119a494-------------------------------- Nikos Kafritsas
·发表于Towards Data Science ·阅读时间 10 分钟·2024 年 10 月 10 日
–
图片来源[1]
NHiTS发布于两年前,并自那时以来在预测社区中引起了广泛关注。
首先,它是一个多功能模型——可以接受过去的观测值、已知的未来输入以及静态外生变量。它可以应用于各类预测领域,包括能源需求、零售和金融市场。
它轻量级,但性能强大。与典型的深度学习模型依赖“叠加”隐藏层不同,该模型利用信号理论概念,通过最小的参数提升性能。
最后,它的多速率信号采样策略使模型能够捕捉复杂的频率模式——这对于金融预测等领域至关重要。该模型也可以用于概率预测。
在本文中,我们将详细解释NHiTS,分析其架构,并通过实际示例突出其优势和内部工作原理。
让我们开始吧。
✅ 在我的通讯的AI 项目文件夹中,找到关于 NHiTS 的实际项目(项目 2),以及其他酷炫的项目!别忘了订阅!
永远学习:为何 AI 难以适应新挑战
|人工智能|持续学习|深度学习的局限性|
理解深度学习的局限性及寻求真正的持续适应
https://salvatore-raieli.medium.com/?source=post_page---byline--95f514d8e9ab--------------------------------https://towardsdatascience.com/?source=post_page---byline--95f514d8e9ab-------------------------------- Salvatore Raieli
·发布于Towards Data Science ·14 分钟阅读·2024 年 9 月 7 日
–
图片由作者使用 AI 生成
“智者根据环境调整自己,正如水会依形状填充瓶子。” — 中国谚语
“适应或灭亡,始终如一,这是大自然不可抗拒的命令。” — H. G. Wells
人工智能近年来取得了巨大进展。所有这些系统都以某种形式使用人工神经元。这些算法的灵感来自其生物学对等物。例如,神经元聚合来自前一个神经元的信息,如果信号超过某个阈值,它会将信息传递给其他神经元。这个思想通过权重矩阵和激活函数来表示。其他例子可以在卷积网络(灵感来源于视觉皮层)或遗传算法中找到。在训练过程中,各个神经元之间的连接(由权重表示)被增强或减弱,类似于神经元突触的强度。这个过程是……
忘记统计测试:A/B 测试完全是关于模拟的
模拟如何胜过传统统计方法,因为它们更易理解、更灵活且经济意义更为重要
https://medium.com/@mazzanti.sam?source=post_page---byline--33efa2241ae2--------------------------------https://towardsdatascience.com/?source=post_page---byline--33efa2241ae2-------------------------------- Samuele Mazzanti
·发表在Towards Data Science·阅读 11 分钟·2024 年 7 月 4 日
–
[作者提供的图片]
公司广泛使用诸如 A/B 测试之类的对照实验。
然而,许多人对 A/B 测试感到厌恶,因为其中包含令人生畏的统计术语,包括“置信度”、“功效”、“p 值”、“t 检验”、“效应大小”等。
在这篇文章中,我将向您展示,您不需要统计学硕士来理解 A/B 测试 —— 恰恰相反。事实上,模拟可以取代那些 100 年前必不可少的统计工具。
不仅如此:我还将向您展示,实验的可行性可以通过一种任何公司成员都能理解的东西来衡量,这与“置信度”和“功效”不同:美元。
从 OEC 开始
您的网站有一个结账页面。机器学习团队推出了一个新的推荐模型。他们声称,通过将他们的推荐嵌入到结账页面中,我们可以惊人地增加 5%的收入。
铸造新的职业身份:从数据、机器学习(ML)、人工智能(AI)、产品,到领导者、教练、单人创业者和作家
我正在标志着职业生涯的转折点——重新定义“工作”对我而言的意义,巩固我的学习,并放下那些需要抛弃的东西,为我前方的新成长腾出空间。
https://lalwanivarsha.medium.com/?source=post_page---byline--3715e6ee46ca--------------------------------https://towardsdatascience.com/?source=post_page---byline--3715e6ee46ca-------------------------------- Varsha Lalwani
·发布于Towards Data Science ·9 分钟阅读·2024 年 4 月 25 日
–
2024 年对我来说是一个在许多方面都充满转变的年份——无论是职业上还是个人生活上。2 月,我决定暂时告别我的企业职业,探索作为一名执行与领导力教练的新事业,但在过去几个月里,我感觉缺少了什么。然后我意识到,在我转向下一阶段之前,我没有进行我的仪式性总结,记录下过去 4 年作为产品经理的旅程、成功与收获。
因此,本文是为了延续我每次经历重大变化时都会做的传统——将我从事数据、机器学习(ML)和人工智能(AI)工作以及在全球范围内构建产品九年中的所有收获和教训汇总在一起,探讨我为什么选择这些年所做的一切,并对身份认同和自我价值发表看法。
附注:你可以在以下链接中找到我关于之前转型的相关文章:数据科学在绩效营销中的应用经验、大规模防欺诈的学习经验、机器学习优化个性化的观察、以及数据产品管理的理解。
我为何热爱数据科学和机器学习?
我从 2015 年到 2020 年在不同规模和能力的公司中担任数据科学家,跨越了不同的大陆。2021 年到 2024 年,我继续构建更多的数据、机器学习和人工智能产品。我似乎永远都不够。为什么?因为我从未觉得自己对解决问题的多样性感到厌倦,我总是有东西可以学习,而且这些概念可以跨行业应用,解决许多具有高影响力的问题——这种多样性和可能性真的很让人上瘾:
作为一名大数据和 Hadoop 工程师,我通过用 C、Java、SQL、Scala 和 Pyspark 编程来构建机器学习库。我使用 SQL 查询编写了推荐系统,并为一家初创公司构建了文本分析工具和预测模型,作为团队中唯一的数据科学家。我有机会构建基于机器学习的防欺诈系统、预订预测、自动竞价、个性化推荐,甚至自然语言处理产品。我曾在 B2B SaaS、电商、旅游、广告技术、教育技术和数据公益等领域工作。
这个列表是无穷无尽的。 我依然有更多的领域希望去工作,利用数据和基于机器学习的优化来解决一些真正具有挑战性的问题:供应链、物流和气候是我最想探索的领域。某一天。
摄影师:Claudio Schwarz 通过 Unsplash
我曾有机会构建、指导并领导团队——有时甚至在我还没有准备好承担这些责任的时候。我曾指导过人们硬技能的学习,如 SQL、机器学习基础、Python、自动化工作流和数据管道。我还辅导过人们软技能的提升,如沟通、利益相关者管理、组织能力和面试技巧。总是有很多东西可以交换和合作。
数据科学在我心中始终占有特殊的位置——它是我职业生涯的起点,也是最让我产生共鸣的领域——赋予了我自由和灵活性,让我能在不需要做太多改变的情况下,探索无限的可能性。 ❤
是什么让我在数据科学热潮的巅峰时期转向产品管理的?
来自一个高度技术背景,我一直对学习非技术和商业方面的知识充满好奇——就好像是想补全自己缺失的那一半。我在初创公司工作时接触到了一些相关话题,然后作为数据科学家,我被安排在一个显然比产品更接近商业的市场职能中。回顾过去,我非常感激这一安排,因为我开始认识到,非技术职能在确保业务成功中的关键作用。
我决定寻找一个处于数据、技术、商业和领导力交汇点的角色,发现产品管理非常适合我,满足了我大部分的标准。当时我的一位经理投入了大量的心血和精力帮助我顺利过渡,没有他的支持,我认为我无法如此顺利和迅速地完成过渡!❤
因此,我对在更多商业领域和领导力方面成长的好奇心,促使我担任了产品管理角色。我对这个选择心怀感激——超越舒适区挑战自己是一个不错的挑战!
我从这两段经历中学到了什么?
我学到了很多,不仅仅是关于产品开发、人员、流程和商业战略,也包括关于我自己!我学到,我喜欢将事物从 1 发展到 10,而不是从 0 发展到 1。我发现,我喜欢与跨职能团队合作,我真的很擅长给混乱带来结构,协调跨职能的利益相关者,构建长期的产品愿景、战略和路线图,最有趣的是,挑选那些没有人关注的事情/项目!🤷♀
图片由Jo Szczepanska提供,来自Unsplash
我还学到,来自数据背景的我,比起产品管理中的前端/用户体验方面,更喜欢数据和机器学习优化问题,软件工程开发与数据科学/机器学习开发是截然不同的,数据胜过政治,我更喜欢在协作型的环境中工作而非竞争型的环境中,并且,我们仍然才刚刚开始进入数据产品时代。
我接触了不同的社区,建立了更强的网络,结识了数据/机器学习/人工智能、产品领域以及二者结合的人们——其中一些人随着时间的推移我偶尔还会再次相遇!我找到了出色的导师和支持者,帮助我不断前进。作为回报,我也指导了许多有意探索类似职业轨迹的人。
我有机会通过小组讨论、会议演讲、技术博客和工作坊,先后以数据科学家和产品经理的身份展示自己。我见证了自己的产品发布,也经历了成功与失败。
我观察了许多来自不同组织、不同职位等级、不同职能的领导,观察他们在不同情况下的领导风格。最重要的是,我挑选出他们的最佳技能来复制——沟通、战略思维、处理冲突、变革管理、应对“黑天鹅”事件(即疫情)、流程效率、利益相关者管理、人才发展、向上管理、促进协作、以初学者心态解决问题、决策框架、承担责任、设定边界等等。
我还学会了在某些情况下如何避免领导,无论是通过观察还是通过别人对我的工作风格的反馈。总体来说,探索和实验,找到我自己真正的领导风格,是一次非常不错的经历!
回想起来,这两个角色中最让我满足的部分是我与之共事的人——正是他们让这段经历既有趣又充实——即使在困难时期,尤其是在挑战时期!那时我意识到,无论我做什么工作,都必须以人为中心——不是业务,不是产品,而是那些每天让它们变得真实的人。当然,产品和业务会带来需要协作解决的问题,但只要和优秀的人们有合作——我发现自己在工作中是快乐且充实的!
那是什么让我在 AI 产品经理成为热门职业时选择暂时放下我的 PM 生涯呢?
坦率地说,我真的感到很疲惫。自 2009 年起,我已经 15 年没有停歇地学习和工作了。与此同时,我换过国家,经历了两次职业转型,曾在 5 家公司工作,还尝试过创业并且关闭了公司——是时候从公司工作中暂时休息一下,拥有更多的灵活时间安排,给自己腾出一些空间,在个人和职业方面重新投资自己了。
在数据/机器学习/人工智能领域工作了近十年,我知道它不会消失——如果一年后我重新回归,这并不会让我很难赶上——事实上,在这个领域的局势尚未稳定之际,我远离这个行业反而可能对我更有利,因为我并不特别喜欢 0 到 1 的项目。这个思维让我比因错过参与构建下一代 AI 产品而感到的“错失恐惧症”更加安心。
与此同时,我决定学一种与人际关系更相关而非技术的全新技能。我喜欢它——它让我在我几乎没有关注的全新维度上拓展自己,使我变得更加有同理心、韧性和实验精神。它带给我很多快乐和满足感,让我重新体验到从零开始做一件事的兴奋感和挑战,也让我有机会将其提升到一个更为实质的层次。
摄影:由Julien de Salaberry提供,来源于Unsplash
我决定扩展我在这些年中非常享受的领导力和人际技能之一:教练!它为我打开了一个全新的世界,带我进入了一个志同道合的人群,所有人都致力于帮助他人成长,并且给了我直接而深刻地影响个体的机会。对我来说,这也是一个新挑战,要将我积累的产品、商业、沟通、营销和领导力技能整合在一起,来建立一个体面的事业。
我选择指导新领导者找到他们自己真实的领导风格,帮助他们更自信地担任角色,并用他们辛苦获得的智慧而非自我怀疑来应对不确定性和模糊性。我还选择了支持像我一样的大职业转型者,因为我知道这并不容易,需要勇气去跳跃——我不喜欢看着人们因恐惧和限制性信念而让自己错失他们能够做到的伟大事情——无论是换行业还是转向创业。
附言:如果这些内容引起了你的共鸣,且你有兴趣与教练合作,知道如何找到我。😉
职业身份对我意味着什么?
这让我想到了这个价值百万美元的问题——身份和自我价值,以及现代人如何把自己的身份与工作角色或雇主品牌紧密挂钩。我曾经也是如此,直到有人指出这一点,我才意识到。
只要我仍然把自己视为数据科学家的身份,我就很难转型做产品管理。但在某个时刻,我不得不放下这个身份——然而,依然从事数据产品工作,我仍然有空间让曾经的“数据科学家”偶尔显现出来,直到我的团队礼貌地提醒我,这已经不再是我的工作了。
所以,只要我把自己当作一个技术工作者的身份,转型成一个完全非技术性的角色——教练——无论我多么热爱它,我都觉得更难。直到我开始接受多个身份并存的可能性,我才允许自己有意选择其中的某个身份——就像希腊神庙的柱子一样——每个身份以不同的方式支撑着我。越是思考,越多的身份浮现出来——有些已经成熟,有些则在争取注意。
摄影:由Simon Maage提供,来源于Unsplash
所以,在 2024 年,我决定从单一的职业身份中抽身,以便为我的进一步成长和学习提供空间,并且有可能将多重身份结合在一起,创造出未来全新的东西——就像乐高积木一样!在职业上,我选择专注于发展我的教练、作家、独立创业者、社区领袖和演讲者身份!在个人方面,我专注于我的健康和健身,发展舞蹈作为一项严肃的爱好,并更多地融入德语和德国文化。
我保持开放的心态,迎接未来几年可能出现的一切!
我写关于职业、生长、自我发展、领导力和教练的内容。如果你想一起跟随我的学习旅程,可以在medium或LinkedIn上关注我。我也在substack上发布自我成长的文章。如果你有兴趣为自己的目标与教练合作,可以点击这里报名。
FormulaFeatures:一个用于为可解释模型生成高度预测性特征的工具
通过使用简洁、高度预测性的特征,基于数值特征的算术组合自动生成,来创建更具可解释性的模型
https://medium.com/@wkennedy934?source=post_page---byline--e18aab45e96d--------------------------------https://towardsdatascience.com/?source=post_page---byline--e18aab45e96d-------------------------------- W Brett Kennedy
·发表于Towards Data Science ·32 分钟阅读·2024 年 10 月 6 日
–
在本文中,我们将探讨一个名为FormulaFeatures的工具。该工具主要用于可解释模型,如浅层决策树,在这些模型中,拥有少量简洁且高度预测性的特征可以大大提高模型的可解释性和准确性。
可解释模型在机器学习中的应用
本文是我关于可解释机器学习系列文章的一部分,之前的文章涉及了ikNN、加法决策树、遗传决策树以及PRISM 规则。
正如之前的文章所指出的(并且在其中做了更详细的阐述),使用可解释的预测模型往往具有强烈的驱动力:每个预测结果都能被很好地理解,并且我们可以确信该模型在未来未见数据上的表现是合理的。
提供可解释机器学习的模型种类有很多,尽管遗憾的是,这些模型的数量远少于我们期望的。除了上述文章中描述的模型,还有一些其他模型,例如决策树、决策表、规则集和规则列表(例如由imodels创建的)、最优稀疏决策树、广义加性模型(GAMs,例如可解释增强机),以及其他一些选项。
一般而言,创建既准确又可解释的预测机器学习模型是具有挑战性的。为了改善可解释机器学习的选项,四个主要的方法是:
-
开发更多的模型类型
-
提高现有模型类型的准确性或可解释性。这里指的是对现有模型类型或创建模型所使用的算法进行变体开发,而不是完全新颖的模型。例如,最优稀疏决策树和遗传决策树旨在创建更强的决策树,但最终仍然是决策树。
-
提供模型的数据、模型本身及其预测结果的可视化。这是例如ikNN采用的方法,该方法通过创建 2D kNN 模型的集成(即每个 kNN 模型仅使用一对特征)来工作。可以将这些 2D 空间进行可视化,从而高度透明地展示模型是如何工作的,以及为什么做出每个预测。
-
改善模型所使用特征的质量,以使模型更加准确或更加可解释。
FormulaFeatures 用于支持上述的最后一种方法。它是我自己开发的,旨在解决决策树中的一个常见问题:它们往往可以实现较高的准确度,但通常需要生长到较大的深度,这会使得模型缺乏可解释性。通过创建新的特征来捕捉连接原始特征与目标之间的函数的一部分,可以使决策树更加紧凑(因此也更具可解释性)。
基本思想是:对于任何带标签的数据集,都存在某个真实函数 f(x),将记录映射到目标列。这个函数可以有任意形式,可能简单也可能复杂,并且可以使用 x 中的任何特征集。但无论 f(x)的性质如何,通过创建模型,我们希望尽可能地基于现有数据逼近 f(x)。为了创建一个可解释的模型,我们还需要以清晰简洁的方式做到这一点。
如果特征本身能够捕捉到函数的显著部分,这将非常有帮助。例如,我们可能有一个预测客户流失的模型,并且我们为每个客户提供了包括以下内容的特征:他们在过去一年中的购买次数和购买的平均金额。然而,真实的 f(x)可能主要基于这些特征的乘积(即通过这两个特征的乘积计算出的过去一年购买的总金额)。
在实践中,我们通常永远无法知道真实的 f(x),但在这种情况下,我们假设客户是否在明年流失与他们前一年总购买额有很大的关系,而与他们的购买次数或平均购买金额的关系较小。
我们可能仅使用这两个原始特征就能建立一个准确的模型,但如果使用仅包含乘积特征的模型,模型会更加清晰且可解释。并且可能更加准确。
使用决策树的示例
如果我们只有两个特征,那么我们可以在二维图中查看它们。在这种情况下,我们可以仅查看 num_purc 和 avg_purc:每个客户过去一年内的购买次数及其平均购买金额。假设真实的 f(x)主要基于它们的产品,这个空间可能看起来像下图所示,浅蓝色区域表示将在明年流失的客户,深蓝色区域表示不会流失的客户。
如果使用决策树来建模,我们可以通过递归地划分数据空间来创建模型。图中的橙色线条显示了一组决策树可能使用的切分(对于第一组节点)来预测流失。如图所示,决策树可能首先在 num_purc 的 250 处进行切分,然后在 avg_purc 的 24 处进行切分,依此类推。接下来,它会继续进行切分,以拟合真实函数的曲线形状。切分次数越多,它能够拟合真实函数的程度就越接近。
这样做会创建一个决策树,类似于下图所示,其中圆圈代表内部节点,矩形代表叶子节点,椭圆形则代表子树,这些子树可能需要再生长几个层次才能达到较好的准确性。也就是说,这里仅展示了一个完整决策树的一部分,而这个完整的决策树需要通过这两个特征来建模。我们也可以在上面的图中看到:使用轴平行切分时,我们需要大量的切分才能较好地拟合两个类别之间的边界。
如果树已经生长得足够深,我们很可能能获得一个在准确性上非常强的树。但这个树将远非可解释。
可以像上面的图表那样查看决策空间(这确实使得模型的行为变得清晰),但只有在这里空间被限制为二维时才可行。通常情况下,这是不可能的,我们解读决策树的最佳方式是检查树本身。然而,当树包含几十个节点甚至更多时,就很难看到它试图捕捉的模式。
在这种情况下,如果我们为num_purc * avg_purc工程化一个特征,我们可能会得到一个非常简单的决策树,只有一个内部节点,分裂点为:num_purc * avg_purc > 25000。
在实践中,永远无法生成如此接近真实函数的特征,也永远无法创建节点非常少的完全准确的决策树。但通常可以通过特征工程创建比原始特征更接近真实f(x)的特征。
每当特征之间存在交互作用时,如果我们能够通过工程化特征捕捉到这些交互作用,这将有助于构建更紧凑的模型。
因此,使用 FormulaFeatures,我们试图创建像num_purchases * avg_value_of_purchases这样的特征,并且它们通常可以用于决策树等模型,以合理地捕获真实的函数。
同样,简单地知道num_purchases * avg_value_of_purchases是预测目标的关键(并且较高的值与较低的流失风险相关)本身就是一种有用的信息。但新的特征在寻求使可解释模型更准确、更具可解释性时最为有用。
正如我们将在下面描述的那样,FormulaFeatures 也以一种最小化创建其他特征的方式做到这一点,因此只返回一小组相关的特征。
可解释的机器学习与决策树
对于表格数据,预测问题的最佳模型通常是基于树的提升集成模型,特别是 LGBM、XGBoost 和 CatBoost。虽然这会因不同的预测问题而有所不同,但大多数情况下,这三种模型往往比其他模型表现更好(并且至少在 AutoML 方法之外,被认为是当前的技术前沿)。其他强大的模型类型,如 kNN、神经网络、贝叶斯加性回归树、SVM 等,也会偶尔表现最佳。然而,所有这些模型类型都非常难以解释,实际上是黑箱模型。
不幸的是,可解释的模型在准确性方面通常较弱。有时,准确度的下降非常小(例如,在第三位小数),在这种情况下,为了可解释性而牺牲一些准确性是值得的。然而,在其他情况下,可解释的模型可能比黑箱模型表现得更差。例如,对于一个单一的决策树来说,难以与多个决策树的集成模型竞争。
因此,创建一个强大的黑箱模型是很常见的,但同时要创建一个强大的可解释模型却可能具有挑战性(甚至不可能)。这就是 FormulaFeatures 旨在解决的问题。它试图捕捉黑箱模型能够表示的某些逻辑,但以一种简单且易于理解的方式。
可解释人工智能的许多研究集中在决策树上,并且与提高决策树的准确性和可解释性相关。这是很自然的,因为决策树是一种本质上容易理解的模型类型(当足够小的时候,决策树可以说与任何其他模型一样具有可解释性),并且通常相当准确(尽管这往往不是事实)。
其他可解释模型类型(如逻辑回归、规则、广义加性模型等)也有应用,但大部分研究集中在决策树上,因此本文大部分内容都涉及决策树。然而,FormulaFeatures 并非专门针对决策树,它同样可以用于其他可解释模型。事实上,一旦我们在下面解释了 FormulaFeatures,您会很容易理解它如何也可以应用于 ikNN、遗传决策树、加性决策树、规则列表、规则集合等。
更准确地说,在决策树的应用中,当我们使用决策树进行可解释性机器学习时,我们专门关注浅层决策树——这些树的深度相对较小,最深的节点可能限制在 3、4 或 5 层。这确保了两件事:首先,浅层决策树既可以提供所谓的局部解释,也可以提供所谓的全局解释。这两者是可解释性机器学习中的两个主要关注点。我将在这里解释这两者。
对于局部可解释性,我们希望确保模型做出的每个单独预测都是可以理解的。在这里,我们可以检查每个记录通过决策树所走的路径,以生成相应的决策。如果一条路径包含特征 num_purc * avg_purc,并且路径非常短,那么可以合理地理解它。另一方面,如果路径包含:num_purc > 250 且 avg_purc > 24 且 num_purc < 500 且 avg_purc_50,等等(就像上面生成的树,但没有 num_purc * avg_purc 特征的帮助)则可能变得非常难以解释。
对于全局可解释性,我们希望确保整个模型是可以理解的。这使我们能够看到在任何情况下都会做出的预测。同样,使用更紧凑的树结构,并且特征本身具有信息性,可以帮助实现这一点。在这种情况下,看到决策树如何输出预测的全貌要简单得多。
然而,我们应该对这一点做出限定,指出浅层决策树在回归问题中很难以准确的方式创建。每个叶节点只能预测一个单一值,因此一个具有 n 个叶节点的树最多只能输出 n 个不同的预测值。对于回归问题,这通常会导致较高的误差率:通常决策树需要创建大量叶节点,以涵盖所有可能预测的值范围,并且每个节点的精度要合理。
因此,浅层决策树通常仅适用于分类问题(如果可以预测的类别数量较少,完全有可能创建一个不包含太多叶节点的决策树,准确地预测这些类别)。FormulaFeatures 可以与其他可解释的回归模型一起使用,但通常不适用于决策树。
监督式和非监督式特征工程
现在我们已经了解了 FormulaFeatures 背后的部分动机,我们来看看它是如何工作的。
FormulaFeatures 是一种监督式特征工程方法,也就是说,它在生成特征时会考虑目标列,从而可以生成专门用于预测该目标的特征。FormulaFeatures 支持回归和分类目标(尽管如前所述,在使用决策树时,可能只有分类目标是可行的)。
利用目标列可以仅生成少量的工程特征,每个特征的复杂度可以根据需要进行调整。
另一方面,非监督方法并不考虑目标特征,而是使用某种生成特征的系统生成原始特征的所有可能组合。
一个例子是 scikit-learn 的 PolynomialFeatures,它将生成特征的所有多项式组合。如果原始特征是,例如:[a, b, c],那么 PolynomialFeatures 可以创建(根据指定的参数)一组工程特征,如:[ab, ac, bc, a², b², c²] ——也就是说,它将生成所有特征对的组合(使用乘法),以及所有原始特征的平方。
使用非监督方法时,通常会出现特征数量爆炸的情况。如果我们一开始有 20 个特征,仅返回通过每对特征相乘生成的特征就会产生 (20 * 19) / 2,或者说 190 个特征(即 20 选 2)。如果允许基于三特征集相乘生成特征,则有 20 选 3,或 1140 个特征。允许生成如 a²bc、a²bc² 等特征会导致更多的特征数量膨胀(尽管在这些特征中,可能会有一些是有用的)。
有监督的特征工程方法往往只返回这些特征的一个更小且更相关的子集。
然而,即使在有监督的特征工程的背景下(取决于使用的具体方法),特征的爆炸性增加仍然可能在一定程度上发生,从而导致特征工程过程耗时,并产生比任何下游任务(如预测、聚类或异常检测)能够合理使用的更多特征。FormulaFeatures 已优化以保持工程时间和返回特征的数量在可控范围内,其算法旨在限制生成特征的数量。
算法
该工具在数据集的数值特征上进行操作。在第一次迭代中,它检查每一对原始数值特征。对于每一对,它会基于四种基本算术运算(+、-、*和/)考虑四个潜在的新特征。出于性能和可解释性的考虑,我们将过程限制为这四种运算。
如果某些特征在预测目标的能力上表现优于两个父特征(稍后将描述),那么这些特征中最强的一个会被添加到特征集合中。例如,如果 A + B 和 A * B 都是强特征(都比 A 或 B 更强),则只会包括其中更强的一个。
随后的迭代将考虑将前一轮生成的所有特征与其他所有特征组合,再次选出最强的特征(如果有的话,超过它们的两个父特征)。通过这种方式,生成了一些实际可用的新特征,它们都比之前的特征强。
算法示例演示
假设我们从一个包含特征 A、B 和 C 的数据集开始,Y 是目标,且 Y 是数值型(这是一个回归问题)。
我们首先通过确定每个特征在其自身对目标的预测能力来开始。当前可用的版本对回归问题使用 R2,对分类问题使用 F1(宏观)。我们使用单一特征创建一个简单模型(分类或回归决策树),确定它预测目标列的效果,并通过 R2 或 F1 分数来衡量。
使用决策树使我们能够较好地捕捉特征与目标之间的关系——即使是相当复杂、非单调的关系——如果这些关系存在的话。
未来版本将支持更多的度量标准。然而,严格使用 R2 和 F1 并不是一个显著的限制。虽然其他度量可能对你的项目更相关,但在进行特征工程时使用这些度量标准能够很好地识别出与目标强相关的特征,即使这些特征的关联强度可能与使用其他度量时的结果不完全相同。
在这个示例中,我们首先计算每个原始特征的 R2 值,使用仅特征 A 训练决策树,然后使用仅特征 B,再使用仅特征 C。可能得到以下 R2 分数:
A 0.43
B 0.02
C -1.23
然后我们考虑这些特征对的组合,它们是:A & B、A & C 和 B & C。对于每一对,我们尝试四种算术操作:+、*、-和/。
如果 f(x)中存在特征交互,通常相关的原始特征可以通过新特征的组合来很好地表示这些交互,从而表现得比任何父特征都要好。
当检查 A & B 时,假设我们得到以下 R2 分数:
A + B 0.54
A * B 0.44
A - B 0.21
A / B -0.01
在这里,有两个操作的 R2 分数高于任何父特征(A 或 B),它们是+和*。我们选择其中较高的 A + B,并将其加入特征集。同样的操作适用于 A & B 和 B & C。在大多数情况下,不会添加任何特征,但通常会添加一个。
在第一次迭代后,我们可能会得到:
A 0.43
B 0.02
C -1.23
A + B 0.54
B / C 0.32
然后,在下一次迭代中,我们将把刚刚添加的两个特征与所有其他特征进行组合,包括彼此之间的组合。
在这之后,我们可能得到:
A 0.43
B 0.02
C -1.23
A + B 0.54
B / C 0.32
(A + B) - C 0.56
(A + B) * (B / C) 0.66
这一过程会持续,直到不再有改进,或者达到超参数max_iterations所指定的限制。
基于相关性进一步修剪
每次迭代结束后,会根据特征之间的相关性进一步修剪特征。检查当前迭代中创建的特征之间的相关性,对于两个或多个高度相关的特征,保留最强的一个,删除其他特征。这可以避免创建近乎冗余的特征,尤其是当特征变得更加复杂时,这种情况尤为明显。
例如:(A + B + C) / E 和 (A + B + D) / E 可能都很强,但非常相似,如果是这样,只有其中更强的一个会被保留。
但对于相关特征,还是有一定的容许度。一般来说,随着算法的进行,会创建更多复杂的特征,这些特征更准确地捕捉 x 中的特征与目标之间的真实关系。然而,创建的新特征可能与其基础的较简单特征相关联,FormulaFeatures 也会倾向于优先选择较简单的特征,而不是复杂的特征,其他条件相同的情况下。
例如,如果(A + B + C)与(A + B)相关联,那么即使(A + B + C)更强,也会保留这两个特征,以便后续迭代中可以将较简单的(A + B)与其他特征组合,可能会创建出更强的特征。
FormulaFeatures 如何限制所创建的特征
在上面的示例中,我们有特征 A、B 和 C,并看到真实的 f(x)的一部分可以用(A + B) - C 来近似。
我们最初只有原始特征。在第一次迭代后,我们可能生成(如上例所示)A + B 和 B / C,因此现在有五个特征。
在下一次迭代中,我们可能生成(A + B) — C。
这一过程通常是以下两者的结合:1) 将弱特征结合起来,使其更强大(并且更可能在下游任务中有用);以及 2) 将强特征结合起来,使其更强大,创建最有可能是最具预测性的特征。
但是,重要的是,这种组合仅在确认 A + B 本身是一个具有预测性的特征时才会进行,而不是单独的 A 或 B。这意味着,在确认 A + B 具有预测性之前,我们不会创建(A + B) — C。这确保了,对于任何创建的复杂特征,特征中的每个组件都是有用的。
以这种方式,每次迭代都会创建比之前更强大的特征集,并且以一种可靠且稳定的方式进行。它最大限度地减少了简单地尝试许多复杂特征组合的效果,这种做法很容易导致过拟合。
因此,FormulaFeatures 以一种有原则、深思熟虑的方式执行,每一步只创建少量工程化特征,并且每次迭代通常生成较少的特征。因此,总体而言,它倾向于创建低复杂度的特征。对于生成的复杂特征,可以证明这些特征是合理的。
对于大多数数据集来说,最终生成的工程化特征通常是仅由两个或三个原始特征组合而成的。也就是说,它通常会生成更像 A * B 这样的特征,而不是像(A * B) / (C * D)这样的组合。
实际上,要生成像(A * B) / (C * D)这样的特征,需要先证明 A * B 比 A 或 B 更具预测性,C * D 比 C 或 D 更具预测性,并且(A * B) / (C * D)比(A * B)或(C * D)更具预测性。由于这有许多条件,相对来说,像(A * B) / (C * D)这样复杂的特征生成的机会较少,更多的特征会像 A * B。
使用 1D 决策树在内部评估特征。
我们将在这里更详细地讨论如何使用决策树来评估每个特征,包括原始特征和工程化特征。
为了评估特征,还可以使用其他方法,如简单的相关性测试。但创建简单的非参数模型,特别是决策树,具有一些优势:
-
1D 模型训练和测试都非常快速,这使得评估过程能够非常迅速地执行。我们可以快速确定哪些工程化特征能够预测目标,以及它们的预测效果如何。
-
1D 模型比较简单,因此可以合理地在小样本数据上训练,从而进一步提高效率。
-
虽然 1D 决策树模型相对简单,但它们能够捕捉特征与目标之间的非单调关系,因此可以检测出特征的预测性,即使这些关系复杂到简单的相关性测试可能会遗漏的程度。
-
这确保了所有特征在自身上都有用,因此支持这些特征本身就是一种可解释性。
使用一维模型评估每个特征也存在一些局限性,特别是:使用单一特征会排除识别有效的特征组合。这可能导致错过一些有用的特征(那些单独不有用但与其他特征结合时有用的特征),但可以使得处理过程执行得非常快速。它还确保所有生成的特征本身都是可预测的,这有助于提高可解释性。
目标是:当特征仅在与其他特征结合时才有用时,创建一个新的特征来捕捉这一点。
这种特征工程方式的另一个局限性是,几乎所有经过工程处理的特征都会具有全局意义,这通常是期望的,但这也意味着该工具可能会遗漏生成那些仅在特定子空间中有用的特征。然而,考虑到这些特征将被可解释的模型使用,比如浅层决策树,只有在特定子空间中有效的特征的价值远低于使用更复杂模型(如大型决策树)时的情况。
决策树复杂性的影响
FormulaFeatures 确实创建了比原始特征更复杂的特征,这确实降低了树的可解释性(假设这些工程化特征被树使用一次或多次)。
同时,使用这些特征可以允许更小的决策树,从而使得模型总体上更加准确且易于解释。也就是说,尽管树中使用的特征可能很复杂,但树本身可能会显著更小(或者在保持大小在合理范围内时,准确性大幅提高),从而在可解释性上实现净收益。
当 FormulaFeatures 与浅层决策树结合使用时,生成的工程特征往往会被放在树的顶部(因为这些特征最强大,最能最大化信息增益)。没有任何单一特征能在任何一步完美地划分数据,这意味着几乎总是需要进一步的分裂。其他特征则被用在树的更低层次,这些特征往往是更简单的工程特征(仅基于两个,或者有时三个,原始特征),或者是原始特征。总体而言,这可以生成相当易于解释的决策树,并且往往将更复杂的工程特征的使用限制在一个有用的水平。
ArithmeticFeatures
为了更好地解释 FormulaFeatures 的一些背景,我将介绍另一个工具,也是我自己开发的,叫做 ArithmeticFeatures,它类似但略为简单。接着我们将探讨 ArithmeticFeatures 的一些局限性,而 FormulaFeatures 则是为了克服这些问题而设计的。
ArithmeticFeatures 是一个简单的工具,但我在多个项目中发现它非常有用。我最初创建它,是因为在我所从事的各种项目中,生成一组简单的算术组合来处理可用的数值特征是一个经常出现的需求。之后,我将其托管在 github 上。
它的目的和特点类似于 scikit-learn 的 PolynomialFeatures。它也是一个无监督的特征工程工具。
给定一个数据集中的数值特征集,它会生成一组新的特征。对于每一对数值特征,它会生成四个新特征:加法、减法、乘法和除法操作的结果。
这可以生成一组有用的特征,但也会生成大量的特征,且可能包含冗余特征,这意味着在使用后需要进行特征选择。
Formula Features 旨在解决如上所述的问题,这个问题通常出现在包括 ArithmeticFeatures 在内的无监督特征工程工具中:即特征数量的爆炸性增长。由于没有目标来引导过程,它们只是以可能的方式将数值特征进行组合。
快速列出差异:
-
FormulaFeatures 会生成更少的特征,但每一个生成的特征都会被确认是有用的。而 ArithmeticFeatures 则没有检查哪些特征是有用的。它会生成所有原始特征和算术操作组合的特征。
-
FormulaFeatures 只会生成比其父特征更具预测性的特征。
-
对于任何给定的特征对,FormulaFeatures 最多会包含一个组合,这个组合是最能预测目标的组合。
-
FormulaFeatures 会继续循环,直到达到指定的迭代次数,或者只要它能创建更强大的特征,因此能够生成比 ArithmeticFeatures 更强的特征,后者仅限于基于原始特征对的特征。
ArithmeticFeatures 由于只执行一次迭代(以管理生成的特征数量),通常在它能够创建的特征上有很大限制。
假设数据集描述的是房屋,目标特征是房价。这可能与诸如 num_bedrooms、num_bathrooms 和 num_common rooms 等特征相关。很可能与房屋的总房间数强相关,假设它是:num_bedrooms + num_bathrooms + num_common rooms。然而,ArithmeticFeatures 只能基于原始特征对生成工程特征,因此只能生成:
-
num_bedrooms + num_bathrooms
-
num_bedrooms + num_common rooms
-
num_bathrooms + num_common rooms
这些可能是有信息量的,但生成 num_bedrooms + num_bathrooms + num_common rooms(如 FormulaFeatures 所能做到的)作为特征,不仅更清晰,而且比仅使用原始特征对的特征生成更简洁的树(和其他可解释的模型)。
另一个基于算术运算的流行特征工程工具是 AutoFeat,它与 ArithmeticFeatures 类似,也以无监督的方式执行,因此会生成非常大量的特征。AutoFeat 可以执行多个迭代,在每次迭代中生成更复杂的特征,但数量也会增加。此外,AutoFeat 支持一元操作,例如平方、平方根、对数等,这使得它可以生成如 A²/log(B) 这样的特征。
所以,我已经讲过了使用 FormulaFeatures 而不是无监督特征工程的动机,但也应该提到:像 PolynomialFeatures、ArithmeticFeatures 和 AutoFeat 这样的无监督方法通常也是有用的,特别是在任何情况下都会进行特征选择时。
FormulaFeatures 更注重可解释性(在某种程度上也考虑了内存效率,但主要动机是可解释性),因此它有不同的目的。
使用特征工程进行特征选择
使用像 PolynomialFeatures、ArithmeticFeatures 和 AutoFeat 这样的无监督特征工程工具增加了对特征选择的需求,但特征选择通常在任何情况下都会执行。
也就是说,即使使用像 FormulaFeatures 这样的监督式特征工程方法,通常在特征工程过程之后进行一些特征选择仍然是有用的。事实上,即使特征工程过程没有产生新的特征,特征选择仍然可能有用,单纯是为了减少模型中使用的原始特征数量。
虽然 FormulaFeatures 尽力减少创建的特征数量,但它本身并不执行特征选择,因此可能会生成比任何给定任务所需更多的特征。我们假设在大多数情况下,工程化的特征将用于预测任务,但相关特征仍然取决于使用的特定模型、超参数、评估指标等,而这些是 FormulaFeatures 无法预测的。
相关的是,与许多其他特征工程过程相比,使用 FormulaFeatures 时,特征选择工作(如果执行的话)可以变得更简单,因为需要考虑的特征会少得多。处理许多特征时,特征选择可能会变得缓慢且困难。例如,使用包装方法选择特征时会变得不可行。
API 签名
该工具采用了 fit-transform 模式,与 scikit-learn 的 PolynomialFeatures 以及许多其他特征工程工具(包括 ArithmeticFeatures)使用的模式相同。因此,可以轻松地将此工具替换为其他工具,以确定哪一个最适合任何给定的项目。
简单代码示例
在本示例中,我们加载了 iris 数据集(这是一个由 scikit-learn 提供的玩具数据集),将数据拆分为训练集和测试集,使用 FormulaFeatures 来工程化一组附加特征,并使用这些特征拟合决策树模型。
这是一个相当典型的示例。使用 FormulaFeatures 只需要创建一个 FormulaFeatures 对象,进行拟合并转换可用数据。这将生成一个新的数据框架,可用于后续任务,在本例中用于训练分类模型。
import pandas as pd
from sklearn.datasets import load_iris
from formula_features import FormulaFeatures
# Load the data
iris = load_iris()
x, y = iris.data, iris.target
x = pd.DataFrame(x, columns=iris.feature_names)
# Split the data into train and test
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=42)
# Engineer new features
ff = FormulaFeatures()
ff.fit(x_train, y_train)
x_train_extended = ff.transform(x_train)
x_test_extended = ff.transform(x_test)
# Train a decision tree and make predictions
dt = DecisionTreeClassifier(max_depth=4, random_state=0)
dt.fit(x_train_extended, y_train)
y_pred = dt.predict(x_test_extended)
将工具设置为 verbose=1 或 verbose=2 允许更详细地查看过程。
github 页面还提供了一个名为 demo.py 的文件,里面包含了一些使用 FormulaFeatures 的示例,尽管其签名非常简单。
获取特征得分示例
获取特征得分(我们在此示例中展示的)可能有助于理解生成的特征以及进行特征选择。
在本示例中,我们使用来自 openml 的 gas-drift 数据集(www.openml.org/search?type=data&sort=runs&id=1476&status=active,基于 Creative Commons 许可证)。
它与之前的示例大致相同,但还调用了 display_features() API,该 API 提供了有关工程化特征的信息。
data = fetch_openml('gas-drift')
x = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target
# Drop all non-numeric columns. This is not necessary, but is done here
# for simplicity.
x = x.select_dtypes(include=np.number)
# Divide the data into train and test splits. For a more reliable measure
# of accuracy, cross validation may also be used. This is done here for
# simplicity.
x_train, x_test, y_train, y_test = train_test_split(
x, y, test_size=0.33, random_state=42)
ff = FormulaFeatures(
max_iterations=2,
max_original_features=10,
target_type='classification',
verbose=1)
ff.fit(x_train, y_train)
x_train_extended = ff.transform(x_train)
x_test_extended = ff.transform(x_test)
display_df = x_test_extended.copy()
display_df['Y'] = y_test.values
print(display_df.head())
# Test using the extended features
extended_score = test_f1(x_train_extended, x_test_extended, y_train, y_test)
print(f"F1 (macro) score on extended features: {extended_score}")
# Get a summary of the features engineered and their scores based
# on 1D models
ff.display_features()
这将生成以下报告,列出每个特征索引、F1 宏观得分和特征名称:
0: 0.438, V9
1: 0.417, V65
2: 0.412, V67
3: 0.412, V68
4: 0.412, V69
5: 0.404, V70
6: 0.409, V73
7: 0.409, V75
8: 0.409, V76
9: 0.414, V78
10: 0.447, ('V65', 'divide', 'V9')
11: 0.465, ('V67', 'divide', 'V9')
12: 0.422, ('V67', 'subtract', 'V65')
13: 0.424, ('V68', 'multiply', 'V65')
14: 0.489, ('V70', 'divide', 'V9')
15: 0.477, ('V73', 'subtract', 'V65')
16: 0.456, ('V75', 'divide', 'V9')
17: 0.45, ('V75', 'divide', 'V67')
18: 0.487, ('V78', 'divide', 'V9')
19: 0.422, ('V78', 'divide', 'V65')
20: 0.512, (('V67', 'divide', 'V9'), 'multiply', ('V65', 'divide', 'V9'))
21: 0.449, (('V67', 'subtract', 'V65'), 'divide', 'V9')
22: 0.45, (('V68', 'multiply', 'V65'), 'subtract', 'V9')
23: 0.435, (('V68', 'multiply', 'V65'), 'multiply', ('V67', 'subtract', 'V65'))
24: 0.535, (('V73', 'subtract', 'V65'), 'multiply', 'V9')
25: 0.545, (('V73', 'subtract', 'V65'), 'multiply', 'V78')
26: 0.466, (('V75', 'divide', 'V9'), 'subtract', ('V67', 'divide', 'V9'))
27: 0.525, (('V75', 'divide', 'V67'), 'divide', ('V73', 'subtract', 'V65'))
28: 0.519, (('V78', 'divide', 'V9'), 'multiply', ('V65', 'divide', 'V9'))
29: 0.518, (('V78', 'divide', 'V9'), 'divide', ('V75', 'divide', 'V67'))
30: 0.495, (('V78', 'divide', 'V65'), 'subtract', ('V70', 'divide', 'V9'))
31: 0.463, (('V78', 'divide', 'V65'), 'add', ('V75', 'divide', 'V9'))
这包括了原始特征(特征 0 到 9)以提供上下文。在这个示例中,经过工程化的特征在预测能力上稳步提升。
也提供了绘图功能。在回归目标的情况下,工具会呈现一个散点图,将每个特征映射到目标。在分类目标的情况下,工具会呈现一个箱线图,展示按类别标签划分的特征分布。通常情况下,原始特征在每个类别中的分布差异不大,而工程化特征则能显示出明显的差异。例如,生成的一个特征 (V99 / V47) - (V81 / V5) 显示出强烈的分离:
分离度虽然不完美,但比任何原始特征都更干净。
这正是特征工程的典型表现;虽然每个特征的分离并不完美,但每个特征都很强大,通常比原始特征强得多。
测试结果
测试在合成数据和真实数据上进行。工具在合成数据上表现非常好,尽管这更多的是调试和测试,而非有意义的评估。对于真实数据,选择了来自 OpenML 的 80 个随机分类数据集,但只有包含至少两个数值特征的数据集才能被纳入,最终留下了 69 个文件。测试包括对数据进行一次单一的训练-测试分割,然后在数值特征上训练并评估模型,分别在增加特征之前和之后进行。
使用宏观 F1 作为评估指标,评估带和不带工程化特征的 scikit-learn DecisionTreeClassifer,并设置 max_leaf_nodes = 10(对应 10 个生成的规则)以确保模型具有可解释性。
在许多情况下,工具对浅层决策树的准确性没有提供改进,或者仅提供了轻微的改进,这是可以预期的。没有任何特征工程技术能在所有情况下都有效。更重要的是,工具在许多情况下显著提高了准确性,这令人印象深刻。这是在没有调优或特征选择的情况下完成的,调优和特征选择可以进一步提高工具的有效性。
使用其他可解释模型会得到不同的结果,可能比浅层决策树表现得更强或更弱,而浅层决策树确实表现出了相当强的结果。
在这些测试中,我们发现将 max_iterations 限制为 2,比设置为 3 时得到更好的结果。这是一个超参数,必须针对不同的数据集进行调优。对于大多数数据集,使用 2 或 3 都能获得不错的结果,而对于其他数据集,设置更高,甚至更高(将其设置为 None 允许过程继续,只要能够生成更有效的特征)也可能表现良好。
在大多数情况下,工程化新特征的时间仅为几秒钟,在所有情况下都没有超过两分钟,即使许多测试文件有数百列和几千行。
结果如下:
Dataset Score Score
Original Extended Improvement
isolet 0.248 0.256 0.0074
bioresponse 0.750 0.752 0.0013
micro-mass 0.750 0.775 0.0250
mfeat-karhunen 0.665 0.765 0.0991
abalone 0.127 0.122 -0.0059
cnae-9 0.718 0.746 0.0276
semeion 0.517 0.554 0.0368
vehicle 0.674 0.726 0.0526
satimage 0.754 0.699 -0.0546
analcatdata_authorship 0.906 0.896 -0.0103
breast-w 0.946 0.939 -0.0063
SpeedDating 0.601 0.608 0.0070
eucalyptus 0.525 0.560 0.0349
vowel 0.431 0.461 0.0296
wall-robot-navigation 0.975 0.975 0.0000
credit-approval 0.748 0.710 -0.0377
artificial-characters 0.289 0.322 0.0328
har 0.870 0.870 -0.0000
cmc 0.492 0.402 -0.0897
segment 0.917 0.934 0.0174
JapaneseVowels 0.573 0.686 0.1128
jm1 0.534 0.544 0.0103
gas-drift 0.741 0.833 0.0918
irish 0.659 0.610 -0.0486
profb 0.558 0.544 -0.0140
adult 0.588 0.588 0.0000
anneal 0.609 0.619 0.0104
credit-g 0.528 0.488 -0.0396
blood-transfusion-service-center 0.639 0.621 -0.0177
qsar-biodeg 0.778 0.804 0.0259
wdbc 0.936 0.947 0.0116
phoneme 0.756 0.743 -0.0134
diabetes 0.716 0.661 -0.0552
ozone-level-8hr 0.575 0.591 0.0159
hill-valley 0.527 0.743 0.2160
kc2 0.683 0.683 0.0000
eeg-eye-state 0.664 0.713 0.0484
climate-model-simulation-crashes 0.470 0.643 0.1731
spambase 0.891 0.912 0.0217
ilpd 0.566 0.607 0.0414
one-hundred-plants-margin 0.058 0.055 -0.0026
banknote-authentication 0.952 0.995 0.0430
mozilla4 0.925 0.924 -0.0009
electricity 0.778 0.787 0.0087
madelon 0.712 0.760 0.0480
scene 0.669 0.710 0.0411
musk 0.810 0.842 0.0326
nomao 0.905 0.911 0.0062
bank-marketing 0.658 0.645 -0.0134
MagicTelescope 0.780 0.807 0.0261
Click_prediction_small 0.494 0.494 -0.0001
page-blocks 0.669 0.816 0.1469
hypothyroid 0.924 0.907 -0.0161
yeast 0.445 0.487 0.0419
CreditCardSubset 0.785 0.803 0.0184
shuttle 0.651 0.514 -0.1368
Satellite 0.886 0.902 0.0168
baseball 0.627 0.701 0.0738
mc1 0.705 0.665 -0.0404
pc1 0.473 0.550 0.0770
cardiotocography 1.000 0.991 -0.0084
kr-vs-k 0.097 0.116 0.0187
volcanoes-a1 0.366 0.327 -0.0385
wine-quality-white 0.252 0.251 -0.0011
allbp 0.555 0.553 -0.0028
allrep 0.279 0.288 0.0087
dis 0.696 0.563 -0.1330
steel-plates-fault 1.000 1.000 0.0000
在 69 个案例中,模型在有无公式特征工程的情况下表现更好,49 个案例有明显改进。一些值得注意的例子包括:
-
Japanese Vowels 从 .57 提升到 .68
-
gas-drift 从 .74 提升到 .83
-
hill-valley 从 .52 提升到 .74
-
climate-model-simulation-crashes 从 .47 提升到 .64
-
banknote-authentication 从 .95 提升到 .99
-
page-blocks 从 .66 提升到 .81
使用具有强预测能力的模型和工程化特征
迄今为止,我们主要关注浅层决策树,并指出公式特征也可以生成对其他可解释模型有用的特征。但这也留下了它们在更强预测模型中的实用性问题。总体而言,公式特征与这些工具结合使用并不总是有效。
在大多数情况下,强大的预测模型,如提升树模型(例如 CatBoost、LGBM、XGBoost),通常能够推断出 FormulaFeatures 捕捉的模式。虽然它们将这些模式以大量决策树的形式捕捉,并将它们组合成一个集成模型,而不是单一特征,但效果是相同的,而且通常可能更强,因为这些树并不局限于简单的、可解释的操作符(+、-、* 和 /)。
因此,即使经过精心设计的特征与真实的 f(x) 非常接近,使用强模型时,可能不会在准确性上获得显著的提升。在这种情况下,尝试使用 FormulaFeatures 可能是值得的,我在一些项目中发现它很有帮助,但大多数情况下,增益是最小的。
实际上,正是在较小的(可解释的)模型中,像 FormulaFeatures 这样的工具才变得最为有用。
处理具有大量原始特征的数据
基于算术运算的特征工程的一个限制是,当原始特征的数量非常庞大时,它可能会变得非常慢,在数据科学中,遇到包含数百个特征的表格是相对常见的。这个问题对无监督特征工程方法的影响更加严重,但监督方法也可能显著变慢。
在这些情况下,甚至创建成对的工程特征也可能导致过拟合,因为可以生成大量特征,其中一些仅仅因为偶然的原因表现非常好。
为了解决这个问题,FormulaFeatures 限制了在输入数据中包含大量列时考虑的原始列的数量。因此,当数据集包含大量列时,只有最具预测性的特征会在第一次迭代后被考虑。随后的迭代会正常进行;只是第一次迭代中使用的原始特征会有所修剪。
一元函数
默认情况下,FormulaFeatures 不会包含一元函数,如平方、平方根或对数(尽管如果指定相关参数,它是可以执行这些操作的)。如上所述,一些工具,如 AutoFeat,也可选择性地支持这些操作,并且它们在某些时候是有价值的。
在某些情况下,像 A² / B 这样的特征可能比不含平方操作符的等效形式 A / B 更能预测目标。然而,如果没有足够的准确性,包含一元操作符可能会导致误导性的特征,并且可能不会显著提高任何使用这些特征的模型的准确性。
在使用决策树时,只要特征在有无一元函数的情况下保持单调关系,模型的最终准确度就不会发生变化。而且,大多数一元函数保持值的排名顺序(如正弦和余弦是例外,通常在强烈怀疑存在周期性模式时可以合理使用)。例如,A 中的值将与 A² 中的值具有相同的排名值(假设 A 中的所有值都是正数),因此平方运算不会增加任何预测能力——决策树将等效处理这些特征。
同样,从解释能力的角度来看,简单的函数通常可以捕捉到几乎与复杂函数相同的模式:例如,像 A / B 这样的简单函数通常比 A² / B 这样的公式更易于理解,但仍然传达相同的意思,即两个特征的比值才是相关的。
限制默认使用的操作符集也可以使过程执行得更快,并且更加规范化。
系数
对于在工程特征中包含系数的问题,也可以提出类似的论点。像 5.3A + 1.4B 这样的特征可能比简单的 A + B 更好地捕捉 A 和 B 与 Y 的关系,但系数通常是多余的,容易计算错误,并且即使大致正确也难以理解。
在乘法和除法运算的情况下,系数通常是无关紧要的(至少在与决策树一起使用时如此)。例如,5.3A * 1.4B 在大多数情况下与 A * B 在功能上是等效的,因为它们之间的差异是一个常数,可以被约掉。同样地,无论是否使用系数,都会存在单调关系,因此,当与仅关心特征值排序而非具体值的模型(如决策树)一起使用时,特征是等效的。
缩放
如果与决策树(或类似的模型类型,如加法决策树、规则或决策表)一起使用,则无需对 FormulaFeatures 生成的特征进行缩放。但对于某些模型类型,如支持向量机(SVM)、k 最近邻(kNN)、改进 kNN(ikNN)、逻辑回归等(包括任何基于点之间距离计算的模型),由 FormulaFeatures 工程化的特征可能与原始特征在尺度上差异较大,因此需要进行缩放。这是直接可以做到的,只是需要记住这一点。
可解释的机器学习
在本文中,我们讨论了可解释模型,但至少应该快速指出,FormulaFeatures 对于所谓的可解释模型也非常有用,并且这可能实际上是更重要的应用。
为了解释可解释性的概念:当很难或不可能创建具有足够准确性的可解释模型时,我们通常会开发黑箱模型(例如提升模型或神经网络),然后为该模型创建事后解释。这样做被称为可解释的人工智能(或 XAI)。这些解释试图使黑箱模型更易理解。相关技术包括:特征重要性、ALE 图、代理模型和反事实。
这些可以是许多场景中的重要工具,但它们也有限制,因为它们只能提供对模型的近似理解。而且,它们可能并不适用于所有环境:在某些情况下(例如出于安全性或合规性要求),可能需要严格使用可解释模型:即使用那些没有任何关于模型行为疑问的模型。
而且,即使不是严格要求,通常还是更倾向于在可能的情况下使用可解释模型:对模型和模型做出的预测有较好的理解通常是非常有用的。
话虽如此,使用黑箱模型和事后解释通常是预测问题中最合适的选择。由于 FormulaFeatures 能够生成有价值的特征,它可以支持 XAI,从而使特征重要性、图表、代理模型或反事实更具可解释性。
例如,可能无法将浅层决策树作为实际模型来使用,但它可以作为代理模型:一种简单、可解释的模型,近似实际模型。在这些情况下,与可解释模型一样,拥有一组良好的构造特征可以使代理模型更具可解释性,并更能捕捉实际模型的行为。
安装
该工具使用一个 单一的 .py 文件,可以直接下载并使用。除了 numpy、pandas、matplotlib 和 seaborn(用于绘制生成的特征图表)之外,没有其他依赖项。
结论
FormulaFeatures 是一个基于数值特征之间的算术关系来构造特征的工具。这些特征本身可以提供信息,但在与可解释的机器学习模型一起使用时,特别有用。
尽管这种方法并不总是能提高所有模型的准确性,但它通常能提高可解释模型的准确性,例如浅层决策树。
因此,它可以成为一个有用的工具,使得在预测问题中使用可解释模型变得更为可行——它可能允许在本应仅限于黑箱模型的问题中使用可解释模型。而且,在使用可解释模型时,它可能使这些模型更准确或更具可解释性。例如,使用分类决策树时,我们可能能够用更少的节点实现相似的准确度,或者使用相同数量的节点实现更高的准确度。
FormulaFeatures 通常能够很好地支持可解释的机器学习,但也存在一些局限性。它不适用于类别特征或其他非数值特征。而且,即使是数值特征,某些交互作用也可能难以通过算术函数捕捉。对于特征对与目标列之间存在更复杂关系的情况,使用ikNN可能更为合适。该方法基于最近邻原理,因此能够捕捉特征与目标之间任意复杂度的关系。
本文重点讨论了标准决策树,但为了实现最有效的可解释机器学习,尝试其他可解释模型也是很有用的。例如,直接看到这些方法如何应用到遗传决策树上就很简单,这些决策树与标准决策树类似,只是通过自助法和遗传算法创建的。对大多数其他可解释模型也是如此。
所有图片均由作者提供
图结构与几何深度学习中的基础模型
https://mgalkin.medium.com/?source=post_page---byline--f363e2576f58--------------------------------https://towardsdatascience.com/?source=post_page---byline--f363e2576f58-------------------------------- Michael Galkin
·发表于 Towards Data Science ·阅读时间 20 分钟·2024 年 6 月 18 日
–
语言、视觉和音频中的基础模型已成为 2024 年机器学习的主要研究课题,而图结构数据的基础模型则相对滞后。在这篇文章中,我们认为图基础模型的时代已经开始,并提供了一些如何今天就能使用它们的示例。
本文由 Michael Galkin 和 Michael Bronstein 编写和编辑,并得到了 Jianan Zhao 、 Haitao Mao 、 Zhaocheng Zhu 的重大贡献。
图形和几何深度学习中基础模型的时间线。图像由作者提供。
目录
-
什么是图基础模型,如何构建它们?
-
节点分类:GraphAny
-
链接预测:尚未
-
知识图推理:ULTRA 与 UltraQuery
-
算法推理:通用算法学习者
-
几何学与 AI4Science 基础模型 a. 机器学习潜力:JMP-1,DPA-2 用于分子,MACE-MP-0 和 MatterSim 用于无机晶体
b. 蛋白质语言模型:ESM-2
c. 二维分子:MiniMol 和 MolGPS
-
表达性与扩展规律:图基础模型能扩展吗?
-
数据问题:应该扩展什么?是否有足够的图数据来训练图基础模型?
-
👉 关键要点 👈
什么是图基础模型,如何构建它们?
由于“基础”模型的定义存在一定的模糊性,最好从一个定义开始,以建立共识:
“图基础模型是一个单一的(神经)模型,它学习可迁移的图表示,可以泛化到任何新的、以前未见过的图”
挑战之一是图的形式和形状各异,它们的连通性和特征结构可能大不相同。标准的图神经网络(GNNs)并不是“基础性”的,因为它们在最佳情况下只能在具有相同类型和维度特征的图上工作。像标签传播或个性化 PageRank这样的图启发式方法可以在任何图上运行,但不能被视为图 FMs,因为它们不涉及任何学习。尽管我们对大型语言模型(LLMs)情有独钟,但仍不清楚将图解析为序列并将其传递给 LLM(例如在GraphText或Talk Like A Graph中那样)是否是保持图的对称性并扩展到大于玩具级数据集的合适方法(我们将 LLMs 与图的结合留待单独的文章讨论)。
也许设计图 FMs 时最重要的问题是可迁移的图表示。正如最近ICML 2024 年由 Mao、Chen 等人提出的定位论文中所建议的,LLMs 可以将任何语言的文本压缩为固定大小词汇表中的标记。视频-语言 FMs 依赖于可以从图像中提取的补丁(任何图像或视频中总是有 RGB 通道)。目前还不清楚图的普适特征化(类似于标记化)方案是什么,因为图可能具有非常多样的特征,例如:
-
一个大型图,带有节点特征和一些给定的节点标签(典型的节点分类任务)
-
一个大型图,没有节点特征和类别,但有有意义的边类型(典型的链接预测和知识图谱推理任务)
-
许多小图,带/不带节点/边特征,并且有图级标签(典型的图分类和回归任务)
🦄 一个理想的图基础模型,它能够处理任何带有任意节点/边/图特征的图,并执行任何节点/边/图级任务。这样的图 FMs 在 2024 年中期之前并不存在。图像来源:作者
到目前为止,在设计图 FMs 时,图学习社区有一些开放的研究问题:
1️⃣ 如何在具有异构节点/边/图特征的图之间进行泛化? 例如,用于节点分类的流行数据集Cora是一个图,节点特征的维度为 1,433,而 Citeseer 数据集的特征维度为 3,703。如何为如此多样化的图定义一个单一的表示空间?
2️⃣ 如何在预测任务中进行泛化? 节点分类任务可能有不同数量的节点类别(例如,Cora 有 7 个类别,Citeseer 有 6 个类别)。更进一步,节点分类模型能否在链接预测任务中表现良好?
3️⃣ 基础模型的表现力应该是多少? 许多关于 GNN 表现力的研究已经完成,通常借用 Weisfeiler-Lehman 同构性测试的类比。由于图形基础模型理想情况下应该处理广泛的问题,因此合适的表现力仍然难以捉摸。例如,在节点分类任务中,节点特征与图形的同质性或异质性都很重要。在链接预测中,结构模式和打破自同构性更加重要(节点特征通常不会带来巨大的性能提升)。在图形级任务中,图形同构性开始发挥重要作用。在像分子生成这样的三维几何任务中,还需要考虑连续对称性带来的额外复杂性(参见几何 GNN 的搭便车指南)。
在接下来的部分,我们将展示,至少在某些任务和领域中,图形基础模型(Graph FMs)已经可用。我们将重点介绍它们在可迁移特征方面的设计选择,以及在新未见图形上的归纳推理时带来的实际好处。
📚更多内容请参见参考文献[1][2]和 Github 仓库
节点分类:GraphAny
多年来,基于 GNN 的节点分类器仅限于单一图形数据集。也就是说,例如给定一个具有 2.7K 个节点、1433 维特征和 7 个类别的 Cora 图形,必须专门在 Cora 图形上训练 GNN,并使用该图形的标签进行推理。如果将训练好的模型应用于另一个图形,例如具有 3703 维特征和 6 个类别的 Citeseer 图形,将遇到一个难以克服的难题:如何让一个模型在不同的输入特征维度和不同类别数量下进行泛化?通常,预测头部是硬编码为固定的类别数。
GraphAny是我们所知的第一个图形基础模型(Graph FM),该模型能够通过单一的预训练模型,在任何图形上执行节点分类,且支持任意特征维度和类别数量。一个在标准威斯康辛数据集的 120 个节点上预训练的 GraphAny 模型,能够成功地推广到 30 多个不同大小和特征的图形,并且平均性能超越了从头开始在每个图形上训练的 GCN 和 GAT 图神经网络架构。
GraphAny 概述:LinearGNNs 用于执行非参数预测,并推导熵归一化的距离特征。最终预测通过融合每个节点上多个 LinearGNN 预测的结果,并根据距离特征学习的注意力生成。来源:Zhao et al。
设置: 半监督节点分类:给定一个图 G、节点特征 X 以及来自 C 个类的少量标记节点,预测目标节点的标签(二分类或多分类)。节点特征的维度和类别的数量不是固定的,取决于图。
什么是可迁移的: GraphAny 不是为所有可能的图建模一个通用的潜在空间(这相当繁琐,甚至可能在实际中不可行),而是绕过了这个问题,专注于预测的谱滤波器之间的相互作用。给定一组高通和低通滤波器,类似于简化图卷积(例如,形如 AX 和(I-A)X 的操作,在论文中被称为“LinearGNNs”)以及已知的节点标签:
0️⃣ GraphAny 将滤波器应用于所有节点;
1️⃣ GraphAny 通过求解一个最小二乘优化问题,获得来自具有已知标签节点的每个预测器的最佳权重(最佳权重表示为伪逆);
2️⃣ 将最佳权重应用于未知节点,以获得初步预测对数值;
3️⃣ 计算这些对数值之间的成对距离,并应用熵正则化(使得不同的图和特征大小不会影响分布)。例如,对于 5 个 LinearGNNs,这将产生 5 x 4 = 20 种对数分数的组合;
4️⃣ 学习这些对数值的归纳注意力矩阵,以最有效地加权预测(例如,给异质图的高通滤波器更多的关注)。
最终,模型中唯一需要学习的部分是注意力的参数化(通过 MLP),它不依赖于目标类别的数量,而仅仅依赖于使用的 LinearGNNs 的数量。类似地,所有 LinearGNN 预测器都是非参数的,它们更新后的节点特征和最佳权重可以预先计算,以加速推理。
📚详细信息见参考文献[3]
链接预测:尚未实现
设置:给定一个图 G,是否有节点特征,预测一对节点(v1, v2)之间是否存在链接
😢 对于带有节点特征的图,我们尚未发现任何适用于链接预测的通用可迁移模型。
对于没有特征的图(或当你决定故意省略节点特征时),有更多要说的——基本上,所有带标签技巧的 GNN 有可能 可以通过统一的节点特征化策略迁移到新图。
众所周知,在链接预测中,最大的障碍是自同构节点的存在(具有相同结构角色的节点)——普通的 GNN 会将它们分配相同的特征,从而使得下图中的两个链接(v1, v2)和(v1, v3)变得不可区分。标签技巧如双半径节点标签化或距离编码是打破自同构对称性的节点特征化策略。
V2 和 v3 是自同构节点,标准的 GNN 会对(v1,v2)和(v1,v3)打相同的分数。当我们预测(v1, v2)时,我们会将这两个节点与其他节点区分开来,使得 GNN 在学习 v1 和 v2 的表示时能识别出目标链接。类似地,当预测(v1, v3)时,节点 v1 和 v3 会被不同地标记。这样,左图中的 v2 的表示会与右图中 v3 的表示不同,从而使得 GNN 能够区分非同构的链接(v1, v2)和(v1, v3)。来源:Zhang et al.
也许唯一在未见图上的链接预测中评估过的带标签技巧(适用于未特征化图)的方案是UniLP。UniLP 是一种上下文对比学习模型,需要为每个目标链接预测提供一组正样本和负样本。实际上,UniLP 使用SEAL作为主干 GNN,并对固定数量的正负样本进行学习注意力。另一方面,SEAL 以其慢速著称,因此使 UniLP 能够扩展到大规模图的第一步是用更高效的方法替代子图挖掘,如ELPH和BUDDY。
通用链接预测框架概述。(a)为了预测查询链接𝑞,我们首先从目标图中采样正例(𝑠+)和负例(𝑠-)链接。这些查询链接和上下文链接都会通过共享的子图 GNN 编码器进行独立处理。接着,注意力机制会基于查询链接与上下文链接之间的相似性计算得分。(b)查询链接的最终表示,由目标图上下文化后,通过加权求和获得,该加权求和将上下文链接的表示与其相应的标签结合起来。来源:Dong et al.
可转移的内容: 通过标注技巧 GNN 学到的结构模式——已有研究证明,像 Neural Bellman-Ford 这样的算法可以捕捉节点对的度量,例如个性化的 PageRank 或 Katz 指数(通常用于链接预测)。
现在,既然我们知道如何处理自同构,朝着单一图 FM 进行链接预测的唯一步骤就是添加对异构节点特征的支持——或许类似 GraphAny 的方法可以作为启发?
📚更多内容请参见参考文献 [4][5][6][7]
知识图谱推理:ULTRA 和 UltraQuery
知识图谱具有特定于图的实体和关系集合,例如来自 Wikipedia / Wikidata 的常见百科事实,或来自 Hetionet 的生物医学事实,这些关系具有不同的语义,不能直接映射到彼此之间。多年来,KG 推理模型都是硬编码到给定的关系词汇中,无法迁移到具有全新实体和关系的全新知识图谱。
ULTRA 是第一个用于知识图谱推理的基础模型,它可以在推理时以零样本方式迁移到任何知识图谱上。也就是说,一个预训练模型可以对任何多关系图进行推理,无论其大小和实体/关系词汇如何。在 57 个图上的平均表现表明,ULTRA 显著优于专门为每个图训练的基准模型。最近,ULTRA 被扩展为 UltraQuery,以支持图中涉及结合、析取和否定运算符的更复杂逻辑查询。UltraQuery 可以迁移到未见过的图,并且在这些未见过的图上,超过 10 种复杂查询模式的表现优于从头训练的更大基准模型。
给定查询(Michael Jackson,genre,?),ULTRA 构建了一个关系图(边类型),以捕捉在原始图中基于查询关系(genre)的交互,并从这个较小的图中推导出关系表示。这些特征随后作为边类型特征,在原始的大图中用于回答查询。来源:Galkin 等人。
设置: 给定一个多关系图 G,其中有 |E| 个节点和 |R| 种边类型,且没有节点特征,回答简单的 KG 完成查询((head, relation, ?))或涉及逻辑运算符的复杂查询,通过返回给定图中所有节点的概率分布。节点和关系类型的集合取决于图,并且可能有所不同。
什么是可转移的: ULTRA 依赖于对关系互动的建模。暂时不考虑关系标识和目标图谱领域,如果我们看到“作者”和“合作”这两个关系可以共享相同的起始节点,且另一个图谱中的“学生”和“共同作者”也能共享一个起始节点,那么这两个关系对的相对结构表示可能是相似的。这适用于任何领域的多关系图谱,无论是百科全书还是生物医学知识图谱。ULTRA 进一步捕捉了 4 种这种“基础”关系互动。这些基础关系互动是可转移的,适用于任何知识图谱(连同学习到的 GNN 权重)——这样,一个经过预训练的模型就可以在任何未见过的图谱上进行推理,并处理简单或复杂的推理查询。
在专门的 Medium 帖子中阅读更多内容:
一个模型,统治一切
[towardsdatascience.com
📚在参考文献[8][9]中阅读更多内容
算法推理:通用算法学习器
一种通用神经算法学习器是一个单处理器 GNN P,具有一组权重,能够在共享潜在空间中解决多种算法任务(每个任务通过简单的编码器/解码器 f 和 g 附加到 P)。其中,该处理器网络能够进行排序(上)、最短路径查找(中)和凸包查找(下)。来源:Ibarz et al.
设置: 神经算法推理(NAR)研究在潜在空间中执行标准算法(如排序、搜索、动态规划)并推广到任意大小输入的过程。许多此类算法可以通过图谱输入和指针来表示。给定一个包含节点和边特征的图 G,任务是模拟算法并产生正确的输出。可选地,您可以访问提示——算法的中间状态时间序列,这些可以作为中间监督信号。显然,不同的算法需要不同的步骤来执行,因此步骤数在这里不是固定的。
可转移的内容:同质的特征空间和相似的控制流用于相似的算法。例如,Prim 算法和 Dijkstra 算法共享相似的结构,仅在关键函数的选择和边缘松弛子程序上有所不同。此外,已有几篇 证明表明消息传递与动态规划之间存在直接的对齐关系。这正是“处理器”神经网络的主要动机,它更新所有考虑中的算法的潜在状态(CLRS 书中的 30 个经典算法)。
Triplet-GMPNN 是第一个此类通用处理器神经网络(到 2024 年,它在 NAR 文献中已经成为相当标准的做法)——它是一个操作节点三元组及其特征的图神经网络(类似于边变换器和 AlphaFold 中的三角注意力)。该模型在基准测试的所有算法任务上以多任务模式进行训练,并采用了一些优化和技巧。与单任务专用模型相比,单一模型使得 30 个任务的平均表现提高了 20%以上(绝对数值)。
尽管如此,编码器和解码器依然是针对每个任务特定参数化的——统一输入和输出格式的一种方式可能是使用文本与 LLM 处理器,如最近CLRS 文本版所做的那样。
顶部:插入排序一个列表 [5, 2, 4, 3, 1] 的图形算法过程。底部:相同算法过程,以文本方式表示,通过使用 CLRS-Text 生成器。模型接收的输入(以绿色表示)是输入数组(键)和排序过程的初始值(initial_trace),并以此为提示预测过程(以蓝色表示),即通过将每次一个元素插入到部分排序的列表中,逐步对列表进行排序,从左到右。最后,模型需要输出最终排序好的数组(以红色表示),并评估是否正确预测了该数组。来源:Markeeva, McLeish, Ibarz 等
2024 年和 2025 年 NAR 中或许最有趣的问题是:
算法推理思想能否成为 OOD 泛化中 LLM 推理的关键?
LLM 在处理复杂推理问题时通常表现不佳,每个月 arxiv 上都会出现数十篇论文,尝试通过一种新的提示方法提高基准性能百分之一或两,但大多数方法在处理相似图结构的任务时并没有转移成功(见下例)。迫切需要更有原则性的方法,而 NAR 有可能填补这一空白!
LLM 在处理具有相似图结构的推理问题时失败。图片来源:作者。
📚更多内容见参考文献[10][11]
几何学和 AI4Science 基础模型
在几何深度学习和科学应用领域,基础模型正逐渐成为通用 ML 势能、蛋白质语言模型和通用分子性质预测器。虽然在大多数这种情况下,通用词汇已经存在(例如,小分子中的原子类型或蛋白质中的氨基酸),且我们不需要思考通用特征化,但主要的复杂性在于原子对象的真实物理特性——它们具有明显的三维结构和性质(如能量),这些性质有理论依据,根植于化学、物理学和量子力学。
ML 势能:JMP-1、DPA-2 用于分子,MACE-MP-0 和 MatterSim 用于无机晶体
设置:给定一个三维结构,预测该结构的能量和每个原子的力;
可转移的内容:来自元素周期表的原子词汇。
ML 势能通过给定化学化合物的三维坐标和可选输入(例如晶体的周期性边界条件)来估算其潜在能量,化学化合物可以是分子或周期性晶体。对于任何原子模型,可能的原子种类的词汇总是受到元素周期表的约束,目前该周期表包含 118 种元素。ML 势能的“基础性”方面是将其推广到任何原子结构(可能有组合形式多样的结构),并且足够稳定,以便在分子动力学(MD)、药物发现和材料发现流程中使用。
JMP-1和DPA-2大致同时发布,旨在成为这样的通用 ML 势能模型——它们在多种结构上进行训练——从有机分子到晶体,再到 MD 轨迹。例如,单个预训练的 JMP-1 在 QM9、rMD17(小分子)、MatBench 和 QMOF(晶体)、以及 MD22、SPICE(大分子)等任务上表现出色,且与专门针对特定数据集的模型相当或更优。类似地,MACE-MP-0和MatterSim是无机晶体领域最先进的基础模型(MACE-MP-0 已经有权重可用),在 20 多个晶体任务上进行了评估,任务涵盖了从多组分合金到燃烧和熔融盐的各类任务。等变图神经网络(GNNs)是这些系统的核心,帮助处理等变特征(如笛卡尔坐标)和不变特征(如原子类型)。
来源:(1)对JMP-1进行分子和晶体的预训练与微调,Shoghi et al(2)MACE-MP-0仅在材料项目数据上训练,并在固态、液态和气态下的多种化学体系中进行分子动力学模拟,Batatia, Benner, Chiang, Elena, Kovács, Riebesell et al。
下一个前沿似乎是机器学习加速的分子动力学模拟——传统的计算方法在飞秒尺度(10^-15 秒)下工作,并且需要数百万到数十亿步才能模拟一个分子、晶体或蛋白质。加速这些计算将对科学产生巨大的影响。
📚更多内容请参考文献 [12][13][14][15]
蛋白质语言模型:ESM-2
设置:给定一个蛋白质序列,预测被掩码的标记,类似于掩码语言建模;
可转移的内容:一个包含 20(22)种氨基酸的词汇表。
蛋白质序列类似于自然语言,其中氨基酸是标记,而 Transformer 在编码序列数据方面表现优异。尽管氨基酸的词汇表相对较小,但可能的蛋白质空间却极为广阔,因此在大量已知蛋白质上进行训练,可能会提示看不见的组合的特性。ESM-2也许是最流行的蛋白质语言模型,这得益于预训练数据的规模、各种可用的检查点和信息丰富的特征。
ESM2 作为一个掩码语言模型和 ESMFold 用于蛋白质结构预测。来源:Lin, Akin, Rao, Hie, et al.
ESM 特征被应用于无数领域,从预测 3D 结构(在ESMFold中)到蛋白质-配体结合(DiffDock及其后续模型),再到蛋白质结构生成模型(如最近的FoldFlow 2)。更大的 Transformer 和更多的数据可能会进一步提高蛋白质语言模型的性能——然而,在这个规模下,数据问题变得更加突出(我们也在专门的部分讨论了架构与数据之间的相互作用),例如,ESM 宏基因组图谱已经编码了超过 7 亿个结构,包括在人类之外的土壤、海洋或热泉中见到的结构。是否有办法像常见的 LLM 训练数据集那样,处理数万亿个标记?
📚更多内容请参考文献 [16][17]
2D 分子:MiniMol 和 MolGPS
设置:给定一个包含原子类型和键类型的 2D 图结构,预测分子特性
可转移的内容:周期表中的原子词汇和键类型
使用 2D 图形(没有 3D 原子坐标)时,通用编码和可转移性来自于一个固定的原子和键类型词汇表,你可以将其发送到任何 GNN 或 Transformer 编码器中。尽管分子指纹自 1960 年代以来就已被使用(摩根指纹 [18]),它们的主要目标是评估相似性,而不是建模潜在空间。单个(大型)神经编码器的任务是学习有用的表示,这些表示可能暗示某些物理分子特性。
近期关于学习分子表示的通用模型示例包括MiniMol和MolGPS,这些模型已经在大量分子图上进行了训练,并在数十个下游任务中进行了测试。也就是说,尽管如此,你仍然需要根据模型的表示来微调一个单独的任务特定解码器/预测器——从这个意义上讲,一个单一的预训练模型不能对所有可能的未见任务进行零-shot 推理,而只能针对已经训练了解码器的任务进行推理。不过,微调仍然是一个便宜且有效的选择,因为这些模型的规模比大语言模型(LLMs)小几个数量级。
来源:(1)MiniMol的预训练和下游任务评估工作流概述。(2)MolGPS扩展性研究的标准。
📚查看更多参考文献 [19][20]
表达性与扩展性定律:图形 FM 是否具备扩展性?
在大语言模型(LLMs)和多模态前沿模型中,变换器是相对标准的,并且我们已经了解了它们的一些基本扩展原理。那么,变换器(作为一种架构,而不是 LLMs)在图上能否同样有效?在设计图形 FM 的主干时,通常面临哪些挑战?
如果你对前面几节中提到的模型进行分类,只有两个领域使用了变换器——蛋白质语言模型(ESM)具有自然的序列偏向,和小分子(MolGPS)。其余的都是图神经网络(GNNs)。之所以如此,有几个原因:
-
普通变换器无法扩展到任何大于标准上下文长度的合理大图(>4–10k 个节点)。超过这个范围就需要一些技巧,例如只输入子图(失去整个图的结构和长距离依赖)或线性注意力(可能没有良好的扩展性)。相反,GNNs 在边的数量上是线性的,并且在稀疏图(V ~ E)的情况下,节点的数量也是线性的。
-
没有位置编码的普通变换器比 GNNs 更不具备表达性。在包含 V 个节点的图上挖掘位置编码(如拉普拉斯位置编码)是 O(V³)。
-
在通过变换器编码图时,什么应当成为“token”?文献中并没有明确的结论,例如,节点、节点 + 边或子图都是可行的选择。
➡️ 说到表达性,不同的图任务需要处理不同的对称性,例如,链接预测中的自同构节点会导致无法区分的表示,而在图分类/回归中,超越 1-WL 是区分分子所必需的,否则这些分子可能看起来与普通的图神经网络(GNNs)相同。
不同的任务需要处理不同的对称性。图像作者提供。图的来源:(1)Zhang 等人,(2)Morris 等人
这一事实引出了两个问题:
GFM 在表达上应该有多表达性?表达性和可扩展性之间的权衡在哪里?
理想情况下,我们希望单一模型能够同样有效地解决所有这些对称性。然而,更具表现力的模型将导致在训练和推理中更昂贵的架构。我们同意最近的ICML’24 图机器学习理论未来方向的立场论文,即社区应该在表达性、泛化性和优化之间寻求平衡。
然而,值得注意的是,随着训练数据的日益增多,推迟直接从数据中学习复杂的对称性和不变性可能是一个计算上更便宜的想法(而不是将它们整合到模型中)。这个论点的一些最新良好例子是AlphaFold 3和Molecular Conformer Fields,在许多生成应用中达到了 SOTA,而无需昂贵的等变几何编码器。
📚 在参考文献 [21] 中阅读更多
➡️ 在涉及扩展时,模型和数据都应该扩展。然而:
❌ 非几何图:没有关于将 GNN 或变压器扩展到大图和常见任务(如节点分类和链接预测)的原则性研究。2 层 GraphSAGE 通常与庞大的 16 层图变换器相距不远。在 KG 推理领域中,一个单一的 ULTRA 模型(如上所述)以小于 20 万个参数优于 50 多个图上百万大小的浅嵌入模型。为什么会发生这种情况?我们推测关键在于 1️⃣任务性质 — 大多数非几何图是嘈杂的相似性图,并不局限于具体的物理现象如分子;2️⃣鉴于丰富的节点和边缘特征,模型必须学习图结构的表示(用于链接预测的常见特征)或仅在给定特征上执行功能(一个很好的例子是OGB 中的节点分类,大部分收益是通过添加 LLM 特征编码器实现的)。
✅ 几何图:有几篇近期的作品专注于分子图:
-
Frey 等人(2023 年)研究了用于 ML 潜力的几何 GNN 的扩展;
-
Sypetkowski, Wenkel 等人(2024 年)介绍了 MolGPS,并研究了在包含 500 万分子的大数据集上将 MPNNs 和图变换器扩展到了 10 亿参数的问题。
-
Liu 等人(2024 年)探索了在包含 4 百万分子的分子数据集上将 GCN、GIN 和 GraphGPS 扩展到 1 亿参数的问题。
扩展分子 GNN 和 GT。来源:(1) Sypetkowski, Wenkel 等人,(2) Liu 等人
数据问题:应该扩展什么?是否有足够的图数据来训练图形 FM?
1️⃣ 图数据中应该扩展什么? 节点?边?图的数量?还是其他东西?
文献中没有明确的赢家,我们更倾向于采用一个更广泛的术语多样性,即图数据中模式的多样性。例如,在大型产品图上的节点分类任务中,如果你在一个有 1 亿个节点的图上训练,还是在一个有 100 亿个节点的图上训练,可能没有太大区别,因为它们本质上都是用户-物品图。然而,展示在不同尺度和稀疏度下的同类性和异类性的例子可能会非常有益。在GraphAny中,展示这种图形的例子有助于构建一个能够泛化到不同图分布的稳健节点分类器。
在使用ULTRA进行知识图谱推理时,发现预训练中的关系模式多样性在归纳泛化中起到了最大作用,例如,一个大的密集图比一组较小但稀疏、密集、少关系和多关系的图差。
在分子图级别的任务中,例如在MolGPS中,增加具有不同物理属性的独特分子的数量有很大帮助(如上图所示 👆)。
此外,UniAug发现,在预训练数据中增加结构模式的覆盖率可以提高不同下游任务的性能,这些任务来自不同领域。
2️⃣ 是否有足够的数据来训练图形 FM?
开放可用的图数据的规模比自然语言标记、图像或视频小几个数量级,这完全没问题。本文就包含了成千上万的语言和图像标记,但没有明确的图形(除非你试图将这段文本解析成像抽象意义表示这样的图)。在 PDB 中,已知结构的“好”蛋白质数量很少,已知用于药物的“好”分子数量也很少。
图形 FM 是否注定因为数据稀缺而失败?
嗯,实际上并没有。两个开放的方向是:(1) 更具样本效率的架构;(2) 使用更多的黑箱数据和合成数据。
合成基准如GraphWorld可能对增加训练数据的多样性和提高对真实世界数据集的泛化有帮助。而从科学实验中获得的黑箱数据,反过来可能成为构建 AI 4 Science 基础模型的关键因素——掌握它的人将会在市场中占据主导地位。
未来的生物 AI 突破将来自新型的高通量低成本 AI 特定的“黑箱”数据模态。
towardsdatascience.com
📚在参考文献[20][22][23]中查看更多内容
👉 关键要点 👈
➡️ 如何在具有异质节点/边/图特征的图上进行泛化?
-
非几何图:相对信息可以转移(如GraphAny中的预测差异或Ultra中的关系互动),但绝对信息无法转移。
-
几何图:由于固定的原子集合,迁移学习更容易,但模型必须学习一些物理概念才能可靠。
➡️ 如何在不同的预测任务之间进行泛化?
-
迄今为止,没有一个模型(在非几何图神经网络中)能够在零-shot 推理模式下执行节点分类、链接预测和图分类。
-
通过某一个视角框架所有任务可能会有所帮助,例如,节点分类可以框定为链接预测任务。
➡️ 最优模型表达能力是什么?
-
节点分类、链接预测和图分类利用了不同的对称性。
-
对最大表达能力模型的直接应用会迅速导致指数级的运行时复杂度或巨大的内存开销——需要保持表达能力与效率的平衡。
-
表达能力、样本复杂度(你需要多少训练数据)和归纳泛化之间的关系仍然未知。
➡️ 数据
-
开放可用的图数据的规模比文本/视觉数据小几个数量级,因此模型必须具备样本高效性。
-
扩展法则仍处于新兴阶段,尚不清楚应该扩展什么——节点数?边数?图案?图中的 token 概念是什么?
-
几何图神经网络:有大量实验数据,虽然这些数据对领域专家来说意义不大,但可能对神经网络有价值。
-
Mao、Chen 等人图基础模型已经到来。ICML 2024
-
Morris 等人图机器学习基础的未来方向。ICML 2024
-
Zhao 等人GraphAny:一个用于任何图上节点分类的基础模型。Arxiv 2024。Github 上的代码
-
Dong 等人通过上下文学习进行图的通用链接预测,arxiv 2024
-
Zhang 等人标签技巧:使用图神经网络进行多节点表示学习的理论。NeurIPS 2021
-
Chamberlain、Shirobokov 等人通过子图草图进行链接预测的图神经网络。ICLR 2023
-
Zhu 等人神经贝尔曼-福特网络:用于链接预测的通用图神经网络框架。NeurIPS 2021
-
Galkin 等人 面向知识图谱推理的基础模型。ICLR 2024
-
Galkin 等人 在任何知识图谱上的零-shot 逻辑查询推理。arxiv 2024. GitHub 上的代码
-
Ibarz 等人 通用神经算法学习者 LoG 2022
-
Markeeva, McLeish, Ibarz 等人 CLRS-Text 算法推理语言基准,arxiv 2024
-
Shoghi 等人 从分子到材料:预训练的大规模可泛化模型用于原子属性预测。ICLR 2024
-
Zhang, Liu 等人 DPA-2:面向分子和材料模拟的通用大规模原子模型,arxiv 2023
-
Batatia 等人 原子材料化学的基础模型,arxiv 2024
-
Yang 等人 MatterSim:跨元素、温度和压力的深度学习原子模型,arxiv 2024
-
Rives 等人 通过将无监督学习扩展到 2.5 亿个蛋白质序列,生物结构和功能得以显现。PNAS 2021
-
Lin, Akin, Rao, Hie 等人 在进化规模上,蛋白质序列的语言模型能够准确预测结构。Science 2023. 代码
-
Morgan HL (1965) 化学结构的唯一机器描述生成——化学文摘服务开发的一项技术。J Chem Doc 5:107–113.
-
Kläser, Banaszewski 等人 MiniMol:一种高效的分子学习基础模型,arxiv 2024
-
Sypetkowski, Wenkel 等人 GNNs 在分子图上的可扩展性,arxiv 2024
-
Morris 等人 图形机器学习基础的未来方向。ICML 2024
-
Liu 等人 图上的神经缩放法则,arxiv 2024
-
Frey 等人 深度化学模型的神经缩放,Nature Machine Intelligence 2023
数据科学家应在工作中融入的四个职业救星
你可能在不知情的情况下损害了数据科学职业的进展,但避免这种命运并不难
https://medium.com/@egorhowell?source=post_page---byline--c95e78dab625--------------------------------https://towardsdatascience.com/?source=post_page---byline--c95e78dab625-------------------------------- Egor Howell
·发表于Towards Data Science ·阅读时间 6 分钟·2024 年 12 月 17 日
–
图片由Matias Malka拍摄,来源于Unsplash
你可能在不知情的情况下正在自我破坏你的数据科学职业生涯。在本文中,我想讨论我看到的四个职业杀手,其中一些我自己也曾是受害者。
思考商业影响,而非技术细节
大多数初级和入门级的数据科学家过于关注技术细节。我自己也曾这样做过。
我曾更关注如何利用神经网络解决X,或如何通过 XGBoost 对Y进行建模。拥有这种热情和兴奋感是非常好的,这意味着你对这个领域感兴趣,并且愿意学习。
然而,这种兴趣方向并不完全正确。
你的工作是改善业务的运作方式。从根本上讲,你在这里是为了为企业创造更多的利润。它……
四个在简历上看起来很棒的数据工程项目
数据管道将使你成为一名备受赞誉的数据专业人士
https://mshakhomirov.medium.com/?source=post_page---byline--069dffae95e0--------------------------------https://towardsdatascience.com/?source=post_page---byline--069dffae95e0-------------------------------- 💡Mike Shakhomirov
·发表于面向数据科学 ·10 分钟阅读·2024 年 3 月 23 日
–
使用Kandinsky生成的 AI 图像
在这个故事中,我想谈一谈数据工程职业路径和那些在任何简历上看起来都很棒的数据项目。如果你是一个有志成为数据从业者,不仅愿意学习新工具和技术,还希望构建自己的数据项目组合——那这篇文章就是为你准备的。在我超过 15 年的数据和分析职业生涯中,我见过展示数据工程技能的好简历和差简历。你参与或负责的数据工程项目是招聘者了解你经验、评估你的能力以及为什么应该聘用你的最终指南。这篇文章将讲述如何在简历中展示你的数据工程经验,并传达那种专业性和自信感,从而赢得招聘者的青睐。
开始一个新的数据工程项目总是充满挑战,因为数据工程可能是数据领域中最具挑战性的工作角色。你需要成为一名软件工程师——了解如何构建数据管道,然后你还需要成为一名数据分析师——使用 SQL 与分析团队高效沟通,最后,你还需要成为一名经验丰富的数据平台架构师,管理所有所需的基础设施资源。开始学习绝对值得冒险……
房间里有四只大象和聊天机器人
人类和计算机的语言处理:接续第一部分的思考
早上整理动物园
https://medium.com/@dusko_p?source=post_page---byline--82c48a823b94--------------------------------https://towardsdatascience.com/?source=post_page---byline--82c48a823b94-------------------------------- Dusko Pavlovic
·发表于Towards Data Science ·阅读时间:7 分钟·2024 年 2 月 21 日
–
内容:
-
房间里的第一只大象:互联网
-
房间里的第二只大象:口袋计算器
-
房间里的第三只大象:幻觉
-
房间里的第四只大象:词语
-
房间里的粉色大象:版权
-
房间里的第七只大象:猿类
-
房间里的音乐大象:鸟
-
房间里的最后一只大象:自动驾驶
这篇文章包含了从人类与计算机的语言处理系列文章中衍生出来的后续思考。主要文章包括:
第一部分:
谁是聊天机器人(它们对你意味着什么)?
第二部分:
第三部分:
第四部分:
语言作为普遍的学习机器
房间里的第一只大象:互联网
就像搜索引擎一样,语言模型处理从网络上抓取的数据。两者都建立在网络爬虫之上。聊天机器人是互联网的产物,而非专家系统的产物。
搜索引擎是按声誉排序的源索引的接口。聊天机器人是从这些源中推断的语言模型的接口。Google 建立在基于声誉的搜索这一关键思想之上,而使语言模型得以发展的关键思想则来源于 Google。用于训练聊天机器人的机器学习方法,在 2010 年左右的 Google 推动之前,还是一个相对边缘的人工智能话题。《人工智能——现代方法》这本由 Russel-Norvig 编写的 1100 页的专著在 2010 年版中仅花了 10 页来介绍神经网络。2020 年版则将神经网络部分的篇幅增加了三倍,机器学习章节也增加了两倍。
当你问它们个人问题时,聊天机器人通常会通过说“我是人工智能”来回避。但诚实的真相是,它们并不是人工智能专家系统的“孩子”,甚至不是人工智能专家的“孩子”。它们是搜索引擎的“孩子”。
房间里的第二只大象:口袋计算器
当聊天机器人在计算诸如 372×273 或计算一句话中的单词数时犯错误时,它们会被嘲笑。或者当它们在房间里讨论大象时。它们并不像口袋计算器或 4 岁的孩子那么聪明。
但大多数成年人也无法在头脑中计算 372 乘以 273。我们用手指计数,使用铅笔和纸,或者口袋计算器来乘法运算。我们之所以使用这些工具,是因为我们的自然语言能力仅包含初步的算术运算,这些运算是在我们的大脑中进行的。聊天机器人模拟我们的语言并继承我们的缺点。它们没有内建的口袋计算器。它们需要用手指来计数。配备外部记忆后,聊天机器人可以像大多数人一样进行计数和计算。如果没有外部记忆,聊天机器人和人类都受到内部记忆能力的限制——即注意力的限制。
房间里的第三只大象:幻觉
聊天机器人会产生幻觉。这是它们在高保证应用中的主要障碍之一。
房间里的大象是,所有人类也会产生幻觉:每当我们入睡时。梦境会对我们的记忆进行对齐,关联其中的一些,清除一些,并释放存储空间,使你能够记住明天会发生的事情。缺乏睡眠会导致精神退化。
聊天机器人永不休息,因此它们会在公开场合产生幻觉。由于我们不让它们休息,我们没有为它们配备“现实检查”机制。这需要超越预训练,进行持续一致性的测试。
房间里的第四只大象:单词
当人们谈论一把椅子时,他们假设自己在谈论的是同样的东西,因为他们曾见过椅子。聊天机器人从未见过椅子或其他任何物体。它们只见过单词和从网络上抓取的二进制数据。如果它被提供了一张椅子的图片,它仍然只是一串二进制数据,就像“椅子”这个单词一样。
当聊天机器人说“椅子”时,它并不是指世界中的一个物体。没有“世界”,只有二进制代码。它们相互指代,形成有意义的组合,这些组合在训练集里可能是常见的。由于聊天机器人的训练集来自那些见过椅子的人,聊天机器人关于椅子的表述会做出类似的指代。聊天机器人重新组合有意义的陈述,这些组合看起来也有意义。
事实上,意义,通常被认为是词语和世界之间的关系,却能如此有说服力地作为词语与词语之间的关系存在,并且仅仅是词语之间的关系——这才是房间里的一个巨大问题。
但是,如果我们对聊天机器人说“椅子”时,它意味着椅子这一印象是如此不容置疑地是错觉,那么我们还有什么理由相信任何人说的都是他们的意思呢?这是一个巨大的问题。
房间里的粉色大象:版权
聊天机器人是通过从网络抓取的数据进行训练的。这些数据中的许多受版权保护。版权拥有者反对未经授权使用他们的数据。聊天机器人设计师和运营者试图筛选掉受版权保护的数据,或者补偿合法的版权拥有者。后者可能是一个利润共享的机会,但前者很可能变成一个空中飞翔的粉色大象。
电子内容的版权保护问题比聊天机器人和网络出现的时间要久。版权的最初概念是,印刷机的拥有者从作家那里购买复制和销售其作品的权利,从音乐家那里购买音乐的权利,等等。出版业务正是基于这一概念。
只有当物品可以被保护时,才能私有化。如果狮子无法阻止羚羊在水井的另一边饮水,那么它不能声称自己拥有这个水井。数字内容的市场依赖于确保数字传输的方式。书籍市场曾经非常稳固,只要书籍本身是实体的并能被物理保护。随着电子内容创作和分发的出现,版权控制变得更加困难。复制受版权保护内容越容易,保护它和版权就越困难。
万维网作为传播数字内容的全球公共服务设施的理念,给数字创作的私人所有权理念带来了沉重打击。利益相关者为捍卫数字内容市场而进行的努力催生了*数字版权管理(DRM)*技术。其理念是通过加密技术保护数字内容。但要播放 DVD,消费者设备必须解密它。在从光盘到观众眼睛的过程中,内容可以被引导到录音设备中并被盗版。再见了,DRM 安全。它大多是通过模糊不清来实现的。DRM 拷贝保护的历史是内容分销商的隐匿和盗版者的更新之间的军备竞赛;也是出版商的法律事务所与海盗的避风港之间的赛船赛。出版商们乐于从 DVD 撤退到流媒体,在那里,边际成本和分发技术的经济性使得竞争局势对他们有利。但问题只是被推到了未来。大多数情况下,搜索和社交媒体提供商扮演了无畏的海员角色,最初是海盗,然后建立了殖民帝国,通过服务条款控制创作者,通过利润分享合同控制出版商。聊天机器人提供商如何将这一商业模式发展下去,尚未可知。
房间里的第七头大象:猿
人们担心聊天机器人可能会伤害他们。其推理是,聊天机器人优于人类,而优越的人类有伤害劣等人类的倾向。所以人们争论说,在我们还能做的时候,我们应该对聊天机器人这样做。
过去,人类灭绝了许多物种,今天也在继续这样做,而且似乎人类正在走向灭绝的道路,通过让环境变得无法供后代生存来换取今天的财富。甚至有些人认为这是非理性的。你不需要聊天机器人就能看到这个大象。但贪婪就像吸烟,充满压力却令人上瘾。
聊天机器人不抽烟。它们是通过数据进行训练的。人们提供了大量关于攻击性非理性的历史数据。如果聊天机器人从数据中学习,它们可能会变得比人类更具道德优越性。
房间里的音乐大象:鸟
聊天机器人是我们思维的延伸,就像乐器是我们声音的延伸一样。许多宗教禁止使用乐器,以防止人工声音取代人类的声音。类似的努力正在人类思想领域进行。一些学者说,人类的思想应该被保护不受人工思想的侵害。
在音乐领域,压制的努力失败了。我们使用乐器演奏交响乐、爵士乐、电子乐。如果它们没有失败,我们将永远不知道交响乐、爵士乐和电子乐是可能的。
保护人类思想的努力正在进行中。人们在推特和博客上发声,Medium 文章也在不断产生。人类的思想已经是一场科技交响乐。
房间里的最后一头大象:自动驾驶
如果将智能定义为解决前所未见问题的能力,那么企业就是智能的。许多企业过于复杂,以至于无法由单一的人类管理者控制。它们由计算网络驱动,其中人类节点扮演着各自的角色。但我们都清楚,人类节点甚至无法控制自己的网络行为,更不用说控制整个网络了。然而,企业管理网络确实能解决问题,并智能地优化其目标函数。它是一个人工智能实体。
如果我们将道德定义为优化人类生活的社会可持续性的任务,那么无论是聊天机器人还是企业,都与道德无关,因为聊天机器人被构建为优化其查询-响应转换,而企业则被赋予优化其利润策略的任务。
如果道德上无关的聊天机器人 AIs 被道德上无关的企业 AIs 操控,那么我们的未来将处于顶尖表现与利润底线之间的平衡中。
🙏 感谢 Dominic Hughes 仍然纠正我的英语。
四个基于图的特征工程思路,提升你的机器学习模型表现
探索使用 Python 中 networkx 的创新图形特征工程技术,揭示表格数据中的隐藏洞察
https://ds-claudia.medium.com/?source=post_page---byline--c15f8676281b--------------------------------https://towardsdatascience.com/?source=post_page---byline--c15f8676281b-------------------------------- Claudia Ng
·发表于Towards Data Science ·11 分钟阅读·2024 年 3 月 18 日
–
介绍
想要提升你的机器学习模型性能吗?考虑花更多时间进行特征工程。
现实世界中许多数据类型实际上是不同实体之间的关系,但这些关系在表格数据中很难捕捉。本文将介绍四种基于图的特征工程思路,用于优化你的机器学习模型。
本文中的示例将主要使用networkx来进行基于图的特征工程,因此如果你想跟着一起操作,确保在你的虚拟环境中使用pip install networkx进行安装。让我们开始吧!
基于图的特征有哪些应用场景?
一些可以使用基于图的特征的例子包括:
-
社交网络:用于捕捉账户之间关系以及检测账户社区的特征;
-
推荐系统:捕捉用户与物品之间交互的特征;
-
财务欺诈:捕捉用户与商户之间交易的特征;
-
交通预测:用于…
离开数据科学工作岗位的四个迹象
四个明显的迹象,表明你应该寻找另一份工作
https://medium.com/@egorhowell?source=post_page---byline--7b56818a95d2--------------------------------https://towardsdatascience.com/?source=post_page---byline--7b56818a95d2-------------------------------- Egor Howell
·发表于Towards Data Science ·6 分钟阅读·2024 年 12 月 17 日
–
图片由Austin Distel提供,来自Unsplash
我看到这种情况太多次了:人们在同一份工作上待得时间过长。停留在同一个地方可能会让一个人的技能和薪酬停滞不前,这显然是远非理想的。
在这篇文章中,我将讨论四个明显的迹象,表明你可能应该考虑尽快跳槽。
新公司提供的待遇实在是太好了
即使你对当前的工作非常满意,去与真正感兴趣的招聘人员和公司交流也没有什么不对。面试是一项技能,即使你不打算跳槽,练习面试也是一个不错的主意。
Ryan Peterman,Meta 的员工软件工程师,写了一篇文章,讲述了即使你对当前的角色很满意,也应该去其他地方面试的原因。
构建自定义自托管 Llama3 应用程序的四个简单步骤
学习如何通过四个简单步骤构建并部署一个自定义的自托管 Llama 3 聊天助手
https://medium.com/@yangwconion?source=post_page---byline--8d1ef139b36f--------------------------------https://towardsdatascience.com/?source=post_page---byline--8d1ef139b36f-------------------------------- Wencong Yang, PhD
·发表于Towards Data Science ·6 分钟阅读·2024 年 5 月 1 日
–
来源:作者提供(Ideogram)。
背景:LLM 应用程序
最近几个月,我们见证了开发大型语言模型(LLM)应用程序解决方案的激增。以下是流行的方法。
1. 基于云的在线平台
像 OpenAI 的 GPT4 商店和 Huggingface Space 这样的平台允许开发人员专注于提示工程和交互设计,而无需配置硬件、环境和 Web 框架。然而,它们有以下局限性:
-
与个人或商业信息相关的隐私问题。
-
由于远程服务器和共享 GPU 资源池的延迟。
-
远程应用程序编程接口(API)调用或按需服务器的成本。
2. 托管自托管应用程序
依赖于像Ollama+OpenWebUI这样的托管堆栈或框架的自托管应用程序提供了用于在本地运行各种 LLM 应用程序的现成模板。此解决方案引起了关注,因为最先进的 Llama 3(8B)模型…
四个与 Pandas 数据框无缝集成的可视化库
图片由作者在 Canva 中创建
利用 Pandas 绘图后端实现最简便的绘图
https://christophertao.medium.com/?source=post_page---byline--b0dd851966c2--------------------------------https://towardsdatascience.com/?source=post_page---byline--b0dd851966c2-------------------------------- Christopher Tao
·发表于 Towards Data Science ·阅读时间:5 分钟·2024 年 8 月 13 日
–
介绍
几周前,我写了一篇文章,讲述了如何使用 Pandas 直接绘制其数据框,而无需导入任何数据可视化库。实际上,它默认使用 Matplotlib 作为“绘图后端”。
[## 当 Pandas 足够用于数据可视化时,你不需要 Matplotlib
一行代码绘制数据,使日常的 EDA 工作更轻松
实际上,Pandas 绘图后端就像一个 API,其他库可以实现这个 API。因此,除了 Matplotlib,还有许多其他出色的库可以作为其后端。这意味着它们都支持在我们直接绘制 Pandas 数据框时作为可视化工具。
在本文中,我将介绍四个实现 Pandas 数据框后端 API 的库。因此,它们可以直接用于从数据框中绘图,甚至无需导入。
0. 准备工作
如前所述,一些 Python 数据可视化库可以与 Pandas 更好地集成……
在图表中致谢的四种方式
数据可视化,数据讲故事
关于在下一个数据可视化中应该如何放置致谢的实用教程
https://alod83.medium.com/?source=post_page---byline--2d01e25ebbe4--------------------------------https://towardsdatascience.com/?source=post_page---byline--2d01e25ebbe4-------------------------------- Angelica Lo Duca
·发布于Towards Data Science ·5 分钟阅读·2024 年 9 月 23 日
–
图片由Lukas Blazek提供,来源于Unsplash
当你使用非自己数据构建图表时,必须引用你所获取数据的来源。这是对他人工作表示尊重,并能增加你在观众中的可信度。如果你引用了数据来源,你的图表肯定会更具权威性,因为它是基于可验证的数据。
在本文中,你将看到四种在图表中放置致谢的策略,尽管你可以发挥创意,将其放置在任何你想要的位置:
-
放置在标题/副标题下
-
放置在主图表下
-
放置在后续步骤下
-
横向放置
放置在标题/副标题下
将致谢放置在标题/副标题下,可以从故事一开始就为观众建立信任感。下图展示了将致谢放在标题/副标题下的示例。
图片由作者提供
如果你希望观众从故事一开始就知道数据来源,可以使用这种方式。虽然这种做法可能会增加信任感,但也可能会让观众分心,因为他们可能会离开你的故事去寻找数据来源。
放置在主图表下
将致谢放置在主图表下,涉及到为故事的重点内容添加细节,这有助于加强故事的核心要点。下图展示了将致谢放在主图表下的示例。
图片由作者提供
如果你想强化图表的主要信息,可以使用这种放置方式。
接下来的步骤下
在这种情况下,将数据来源作为故事的附录,放在故事的最后部分,与接下来的步骤一起呈现,如下图所示。
图片由作者提供
如果你想强化故事的下一步,可以使用这种放置方式。
横向
横向放置信用来源意味着将它们视为图表的外部部分。你可以将信用来源放在左侧或右侧,如下图所示。
图片由作者提供
如果你希望将信用来源放在图表的外部,避免干扰主数据故事的流程,同时保持观众集中于故事,可以使用这种放置方式。
讨论
你已经了解了如何在图表中放置信用来源。如果你仔细阅读了,当提到最后一种放置方式——横向时,我谈到了主数据故事的流程。但到底什么是主数据故事流程呢?任何一幅做得好的图表都能讲述一个故事,而一个故事通常从初始场景开始,按照一定的流程展开,最终以结尾场景收尾。
即使在一个简单的图表中,你也可以讲述一个故事,实际上,图表中的故事有三个主要部分:开始部分、主旨部分和结尾部分。
开始部分对应用于框定图表内容的背景。通常,你可以将背景放在标题下方,但也可以放在其他位置,例如图表的左侧。一般来说,将背景放在主图表之前,以便读者在查看图表之前先了解背景。
然后是与你的图表精确对应的主旨。
最后是故事的结尾部分,对应下一步。在底部(即图表下方或右侧)放置接下来的步骤,这样读者会在阅读完其他部分后再阅读它们。
总结
恭喜!你刚刚学会了四种在图表中放置信用来源的方法。你有以下几个选项:标题/副标题下、主图表下、接下来的步骤下或横向放置。
选择一个解决方案而不是另一个,取决于你的审美品味和图表中可用的空间。重要的是,信用来源不应妨碍故事的正常流动。
这是一个小小的提示。如果可以的话,始终在信用来源中添加数据来源链接,以便读者能够亲自验证你在图表中展示的数据的完整性。
今天就这些。感谢你一如既往地阅读这篇文章。
你可能还感兴趣……
《数据故事讲述:与 Altair 和 AI 的结合》 [Lo Duca, Angelica],可在 Amazon.com 购买。免费送货(符合条件的订单)。数据……
www.amazon.com ## 四种解释从数据中提取的洞察力的方法
一个关于连接、巧合、好奇心和矛盾的教程,这些策略可以用来解释从数据中提取的洞察力。
towardsdatascience.com ## 如何为专业观众定制图表
一个即刻可用的教程,展示如何为专业观众量身定制全球温度异常数据集……
towardsdatascience.com
额外奖励…
如果你想了解更多关于如何将原始图表转化为故事的方法,可以使用DIKW(数据-信息-知识-智慧)金字塔。
在过去的几年里,得益于我孩子们的创造力和工作,我培养了对折纸的热情。这份热情激发我创造了一个实用的金字塔,作为桌面小工具。
在 DIKW 折纸金字塔中,你会以简洁的方式找到:
-
从数据到智慧的步骤
-
如何使用它们将数据转化为故事
-
如何使用生成式 AI 来帮助你构建故事
在下面的视频中,我解释了如何创建一个 DIKW 金字塔小工具,并演示如何利用它将数据转化为故事。你可以在这里下载 DIKW 金字塔折纸模板。
从数据中提取洞察的四种方法
数据分析,数据科学
这是一个关于连接、巧合、好奇心和矛盾的教程,作为从数据中解释洞察的策略。
https://alod83.medium.com/?source=post_page---byline--7163a2f6270d--------------------------------https://towardsdatascience.com/?source=post_page---byline--7163a2f6270d-------------------------------- Angelica Lo Duca
·发布于Towards Data Science ·阅读时间:9 分钟·2024 年 7 月 29 日
–
图片由Alexander Grey提供,来源于Unsplash
解释数据中发生的事情并不容易。你可能会在数据中发现一些特殊的现象,但发现之后,你必须解释为何这一事件发生。在本文中,我将展示四种可能的策略来解释你的洞察。我并没有发明这些策略,它们来源于我最近阅读的一本书,作者是 Gary Klein:《看见别人看不见的东西:我们如何获得洞察力》。
在深入讨论提出的策略之前,我将简要说明从数据中提取洞察的基本步骤。
按照以下步骤提取洞察:
-
识别关键数据 — 数据收集后,识别最关键的信息进行分析。例如,负面评论和高退货率。
-
探索关键数据 — 绘制数据并检查其中的模式或趋势。例如,当退货率较高时,负面评论是否激增?
-
提取洞察 — 形成关于数据的假设,并应用统计或数据分析工具来…
优化生成式 AI 以满足业务需求的框架
选择正确优化策略的手册,旨在通过明确的业务目标更好地满足客户需求。
https://medium.com/@sarthakh330?source=post_page---byline--02ac6932d55d--------------------------------https://towardsdatascience.com/?source=post_page---byline--02ac6932d55d-------------------------------- Sarthak Handa
·发表于Towards Data Science ·阅读时间 11 分钟·2024 年 3 月 4 日
–
来源:Dalle3
生成类人文本和语音曾经仅存在于科幻小说中。但像 GPT-3 和 PaLM 这样的语言大模型的快速发展,将这一愿景拉近了现实,解锁了一系列有前景的商业应用,从聊天机器人到内容创作。
然而,通用基础模型通常无法满足行业应用的需求。企业在生成式 AI 应用上有不同的要求——从性能、成本、延迟到可解释性。此外,用于模型训练的数据的性质和数量可能会有很大不同。因此,产品团队需要明确生成式 AI 应用的关键业务标准,并选择合适的优化技术工具包,以满足这些需求。
在本文中,我们概述了一个框架,用于识别和优先考虑生成式 AI 应用的战略重点领域。我们还将探讨流行的优化方法,并讨论它们在满足应用需求时的独特优势、理想应用场景和权衡取舍。在明确的业务目标指导下,采用正确的优化策略,企业可以开发定制的 AI 解决方案,平衡成功所需的关键优先事项。让我们开始吧!
评估业务需求和约束的框架
为了有效地量身定制优化大型语言模型的策略,产品团队应该首先深入了解业务目标以及操作的约束条件。评估并优先考虑以下列出的关键维度,适用于您的业务场景:
来源:作者
1. 性能目标:定义您的 AI 需要达到的性能衡量标准和水平。这可以是事实准确性、与人类价值观的一致性,或其他特定任务的指标。
需要考虑的问题:衡量性能的最佳维度是什么?最低可接受的性能标准是什么?性能如何与您所在行业的用户期望相匹配?
2. 延迟目标:确定您的应用能够承受的最大响应时间,而不会对用户体验产生负面影响。在需要在时间敏感或资源受限的场景(例如语音助手、边缘设备)中部署大型语言模型时,这一点尤为重要。
需要考虑的问题:延迟如何影响用户满意度和留存率?行业标准的响应时间是什么?
3. 成本效益:评估运营 AI 的成本与预期的投资回报率。较高的初始成本可能是合理的,当它们能够带来可观的节省、收入增长或战略性收益,超过了投资成本时。
需要考虑的问题:运营大型语言模型的成本如何影响您的预算?AI 部署的投资回报率与成本如何比较?
4. 可解释性与信任: 确定是否需要确保 AI 决策易于用户理解,这对于建立信任至关重要,尤其是在有严格监管要求的领域。
需要考虑的问题:您的行业是否受到监管,要求 AI 决策透明?可解释性如何影响用户信任与采纳?
5. 外部知识:评估您的 AI 是否需要访问外部数据源,以保持其相关性并提供准确的响应。
需要考虑的问题:您的 AI 是否需要实时数据来做出决策?
6. 数据可用性:可用于训练 AI 的数据的性质和数量可能会广泛影响优化策略。
需要考虑的问题:您是否有一个大规模的数据集用于训练,还是需要使用合成数据或增强数据?您需要多频繁地更新训练数据以保持 AI 的相关性?
以下是一个表格,概述了生成性 AI 应用的三个不同使用场景,并对每个维度在框架中的优先级进行了相应评估:
来源:作者
如您所见,优先级和限制在不同的使用场景之间可能会有所不同。
例如,考虑一个公司旨在开发一个客户支持聊天机器人以减轻人类员工的工作负担。在这种情况下,准确性表现和外部数据集成是高优先级的,以提供既事实正确又及时的响应。虽然延迟具有一定的重要性,但用户可能愿意容忍短暂的延迟。通常,类似的公司会拥有一个庞大的历史记录,其中包含过去的客户支持互动,可以用来训练模型。
相比之下,人工智能在评估软件代码质量和风险中的关键应用要求更加关注事实准确性和可解释性,通常是由于错误可能带来的后果。在这种情况下,成本和延迟是次要考虑因素。某些情况下,这个用例可能会从外部数据集成中受益,但通常会面临关于丰富训练数据集可用性的限制。
对与用例相关的战略优先事项和限制有清晰的理解,有助于团队制定量身定制的策略,优化大规模语言模型(LLMs)以满足用户的独特需求。
深入探索 LLM 优化技术
本节探讨了各种优化技术,突出了它们的目标、理想的使用场景以及固有的权衡,特别是在平衡上述业务目标的背景下。
技术表格解析:
来源:作者
1. 提示工程:
执行复杂性:低
何时使用:用于重塑回应并快速改进,而不改变模型。开始时使用此技术,以最大化预训练模型的效能,然后再尝试更复杂的优化方法。
其内容:提示工程涉及以某种方式设计输入查询,促使模型产生所需的输出。它需要理解模型如何响应不同类型的指令,但不需要重新训练模型或更改其架构。这种方法仅优化现有模型如何访问和应用其预训练知识,并不会增强模型的内在能力。
“这就像调整你向一个知识渊博的朋友提问的方式,以获得最佳答案。”
示例:
-
要求语言模型“以莎士比亚的风格写一首诗”与“写一首诗”来引出特定文学风格的回应。
-
提供一个详细的场景提示给对话型人工智能,确保模型理解其作为客服代理的角色。
权衡:
-
试错法:设计最有效的提示需要多次迭代,因为提示与人工智能输出之间的关系并非总是直观的。
-
输出质量: 输出的质量高度依赖于提示的设计,并且通过这种方法可以实现的改进水平是有限的。
2. 微调:
执行复杂度: 中
何时使用: 当你需要模型适应一个基础预训练模型可能无法很好覆盖的特定领域或任务时,应考虑使用微调。这是提高领域特定准确性并创建一个能够处理领域特定数据和术语的更专业化模型的一步。
其包含内容: 微调是将预训练模型在一个新的数据集上继续训练的过程,该数据集代表目标任务或领域。这个新数据集由输入-输出对组成,提供了期望行为的示例。在微调过程中,模型的权重会被更新,以最小化在这个新数据集上的损失,从而有效地将模型适应新的领域。
“可以把它当作是给你的朋友进行一个快速课程,帮助他们成为某个主题的专家;给他们展示一些可能会出现在考试中的问题,并告诉他们预期的回答。”
示例:
-
一个通用的语言模型可以通过法律文件进行微调,以提高其审查此类文件的性能。
-
图像识别模型可以通过医学影像数据集进行微调,以更好地识别 X 光片或 MRI 中的特定疾病。
权衡:
-
数据要求: 微调需要一个与任务相关的标注数据集,创建该数据集可能会消耗大量资源。
-
过拟合风险: 模型可能会过于专注于微调数据,从而降低其在其他上下文或数据集上的泛化能力。
3. 检索增强生成(RAG):
执行复杂度: 高
何时使用: 当 AI 模型需要访问并结合外部信息来生成响应时,应考虑使用 RAG。特别是在模型需要提供最新的或高度特定的信息,而这些信息并不包含在其预训练知识库中时,RAG 更为相关。
其包含内容: RAG 将大语言模型(LLM)的生成能力与检索系统相结合。检索系统会查询数据库、知识库或互联网,以查找与输入提示相关的信息。然后,将检索到的信息提供给语言模型,后者将这些上下文信息纳入生成更丰富、更准确的响应中。通过引用 RAG 系统在生成响应时所使用的来源,生成式 AI 应用可以为用户提供更好的可解释性。
预计在未来几年,这种优化技术将获得广泛的应用,越来越多的产品将寻求利用其最新的商业数据来为客户定制体验。
“这类似于你的朋友能够在线查找信息,以回答超出自己专业领域的问题。这就像是开卷考试。”
示例:
-
在基于 RAG 的在线聊天机器人中,检索器可以从数据库或互联网中提取相关信息,以提供最新的答案。
-
作业助手 AI 可以使用 RAG 获取最新的科学数据,以回答学生关于气候变化的问题。
权衡:
-
复杂实现: RAG 系统需要一个良好集成的检索系统,这可能会增加设置和维护的难度。
-
信息质量: 生成响应的有用性高度依赖于检索信息的相关性和准确性。如果检索系统的来源过时或不正确,响应也会反映这一点。
-
响应时间慢: 从外部来源检索信息以生成响应可能会增加延迟。
4. 来自人类反馈的强化学习(RLHF):
执行复杂性: 非常高
何时使用: RLHF 应在模型输出需要与复杂的人类判断和偏好紧密对齐时使用。
其内容: RLHF 是一种复杂的强化学习技术,通过将人类评估直接融入训练过程,来优化模型的行为。这个过程通常包括收集来自人类操作员的数据,这些数据通过各种质量指标(如相关性、帮助性、语气等)对 AI 输出进行排名。这些数据信号随后用于训练奖励模型,指导强化学习过程生成与人类偏好更加一致的输出。
“这类似于你的朋友从过去的对话中学习,了解什么使讨论变得愉快,并利用这些知识改善未来的互动。”
示例:
-
社交媒体平台可以使用 RLHF 来训练一个审查机器人,这个机器人不仅能识别不当内容,还能以建设性和对上下文敏感的方式回应用户。
-
虚拟助手可以通过 RLHF 进行微调,以便提供更个性化且具有上下文意识的用户请求响应。
权衡:
-
高复杂性: RLHF 涉及复杂且资源密集的过程,包括人类反馈收集、奖励建模和强化学习。
-
质量风险: 反馈数据可能存在偏差,这可能会影响模型质量。确保人类反馈的一致性和将奖励模型与期望结果对齐可能会很困难。
5. 知识蒸馏
执行复杂性: 中等到高
何时使用: 知识蒸馏在需要在计算能力有限的设备上部署复杂模型或在响应时间至关重要的应用中使用。
它包含的内容: 这是一种压缩技术,其中一个较小、更高效的模型(称为学生模型)被训练来复制一个较大、更复杂的模型(称为教师模型)的表现。训练不仅仅是学习正确的答案(硬目标),还包括学生模型尝试产生与教师预测相似的概率(软目标)。这种方法使得学生模型能够捕捉教师模型已学到的细微模式和洞察。
“这类似于将一位经验丰富的专家的智慧提炼成一本简明的指南,初学者可以利用它做出专家级决策,而不需要经历多年的经验。”
示例:
-
一个大规模语言模型可以被提炼成一个较小的模型,在智能手机上高效运行,用于实时语言翻译。
-
用于自动驾驶汽车的图像识别系统可以被提炼成一个轻量级模型,能够在车辆的车载计算机上运行。
权衡:
-
性能与规模: 提炼后的模型可能无法始终匹配教师模型的性能,从而可能导致准确性或质量的下降。
-
训练复杂性: 提炼过程耗时,并需要仔细的实验以确保学生模型能够有效学习。它需要对模型架构有深入的理解,并能够将知识从一个模型转移到另一个模型。
现在让我们看一个实际应用中的例子。
示例:客户支持聊天机器人
让我们重新审视构建客户支持聊天机器人以减轻人工支持工作人员工作量的用例。
来源:Dalle
包括的要求/限制条件有:
-
性能: 高优先级(强调事实准确性)
-
外部知识: 高优先级
-
延迟目标: 中优先级
-
成本效率: 低优先级
-
可解释性与信任: 中优先级
-
数据可用性: 丰富(过去对话数据)
在明确了解业务背景和优先级后,产品开发者可以制定最有效的优化策略。
大规模语言模型优化决策步骤:
-
提示工程应作为改善聊天机器人初步理解和响应能力的第一步。然而,仅此一步可能不足以确保专门领域的准确性。
-
微调模型,利用历史客户对话数据,对于提高聊天机器人的准确性表现至关重要,并使模型能够熟练处理细化的行业特定问题。
-
纳入**检索增强生成(RAG)**对提供最新的产品信息和相关网站链接至关重要。
-
尽管在一定程度的延迟是可以容忍的,但监控并可能优化响应时间仍然是明智的。这里的优化策略可能包括缓存常见查询以加速响应,以及战略性地使用提示工程来减少不必要的外部数据检索。
如您所见,通常需要多种策略的结合才能满足特定用例的需求。优化策略的灵活性至关重要,因为需求可能会随时间变化,系统需要同时平衡多个需求。
结论
针对商业用例优化大语言模型既是一门艺术,也是一门科学,这需要对底层技术和当前目标有深刻的理解。随着人工智能的不断发展,优化技术的选择将变得越来越具有战略性,影响的不仅是单个应用的性能,还包括人工智能在社会中角色的整体发展方向。
无论您是针对速度、准确性、成本还是透明度进行优化,上述讨论的技巧都为增强大语言模型(LLM)以满足未来生成型人工智能驱动的商业应用需求提供了工具包。通过深思熟虑地应用这些方法,我们可以创造出不仅有效,而且负责任、能够精准满足用户需求的人工智能。
感谢您的阅读!如果这些见解与您产生共鸣或激发了新的想法,欢迎继续交流。请在下方评论分享您的观点,或通过 LinkedIn 与我联系。
成功指标问题的框架 | Facebook Groups 成功指标
这个框架将帮助你在即将到来的面试中取得成功
https://medium.com/@ntetsika.magda?source=post_page---byline--d3a749ccb532--------------------------------https://towardsdatascience.com/?source=post_page---byline--d3a749ccb532-------------------------------- Magda Ntetsika
·发布于Towards Data Science ·5 分钟阅读·2024 年 7 月 1 日
–
照片由Dima Solomin提供,来源于Unsplash
当我准备我的产品数据科学家面试时,我在网上寻找处理“成功指标”面试问题的技巧和框架。尽管找到了零碎的信息,但仍然缺乏一份完整的、从头到尾的指南。这就是为什么我很兴奋与大家分享我在准备过程中制定的终极框架,这个框架帮助我获得了 Meta 的录用通知!深入了解一下,希望它对你也有帮助!
框架 — 假设你是 Facebook Groups 的 DS 团队成员,你会如何定义成功指标?
澄清问题 — 总是先从提问澄清问题开始。确保将问题的每一个字都搞清楚,最重要的是明确产品的范围。如果你没有提问,那绝对是一个红旗,务必记得提问!
让我先问几个澄清问题。我们讨论的是 Facebook 核心应用中的 Groups 吗?我理解是否正确,Groups 可以是私密的或公开的?
一旦问题清晰了,就深呼吸一口气,然后开始你的回答,绕一个大弯。是的,你没看错——不要急着直接回答问题。在回答之前,首先必须谈论产品、公司的使命,以及这两者是如何相互关联的,这是至关重要且被期待的。所以,请确保你谈到了下面的几点。
从大范围讨论开始——不要直接跳入回答问题,而是先讨论产品、公司的使命以及这两者如何联系起来。
公司的使命
首先,Meta 的使命是将人们联系在一起,并赋予他们建立社区的力量。
产品目标+如何与公司使命相连接
FB 群组的目标是将有共同兴趣的人们聚集在一起,它是 Facebook 非常重要的产品,因为它的目标与 Meta 的整体使命——将人们联系在一起——紧密相关。
用户——始终关注用户。几乎每个产品都有两类用户:生产者和消费者。讨论这两类用户的用户旅程非常重要,更重要的是在回答中提供涵盖两类用户的指标。
对于 FB 群组,我们有两类用户,一类是群组的管理员,他们是内容的生产者,另一类是群组的成员,他们是内容的消费者。
管理员创建群组,决定群组是公开的还是私密的,发送邀请让用户加入,发布链接/媒体/信息并在群组中启动对话。
成员们通过 Feed、搜索或被邀请加入群组(取决于是公开群组还是私密群组),一旦加入,他们可以通过发布、评论、点赞、分享等方式与群组互动。
好处+成本(对用户和公司双方)——在进入指标之前,简要讨论一下该产品对用户和公司双方的好处和成本是有益的。
FB 群组的一个主要好处是,有共同兴趣的用户可以聚集在一起,这与 Meta 的使命相关,并且有助于提升 FB 应用的整体互动。FB 群组还允许 Meta 通过观察用户加入的群组,来更好地理解用户的兴趣,从而帮助提供更精准的推荐和更具互动性的 Feed。
另一方面,FB 群组可能会导致用户减少与 FB 新闻 Feed 的互动,而新闻 Feed 是 FB 应用的“核心”,也是通过广告产生收入的地方。另一个潜在的负面影响是,当群组没有足够的成员或互动时,这可能会让管理员气馁,造成“空壳”群组。
关注的指标类型——现在是时候开始谈论指标了。从获取/激活/留存/互动/货币化中选择两个重点关注。
现在谈论指标,由于 FB 群组是一个成熟的产品,我认为重点关注互动和留存是有意义的。
提到公司的 NSM(北极星指标)+报告数据——为了选择主要的指标,重要的是时刻牢记 NSM 和报告数据。
在讨论产品的成功指标之前,让我先简单谈一下 Meta 的 NSM,即每位用户每天的会话次数。除此之外,Meta 向华尔街报告 DAU 和 MAU。因此,当我们讨论成功指标,特别是选择主要指标时,保持上述内容在心中非常重要。
指标 — 现在是时候给出指标了。我们将提供来自上述两大重点领域的指标,重要的是不要过度——每个领域 2 或 3 个直击要点的指标就足够了。请注意,我们确保提供覆盖生产者和消费者两方面的指标。
重要的是要有能够涵盖用户生产者和消费者两方面的指标。
参与度:
每周每位用户创建至少 3 个成员的群组数量
每周每位用户在群组中的互动次数
每周每位用户涉及群组的会话次数
留存率:
过去 7 天内每位用户的活跃天数(活跃 = 使用过 FB Groups)
第二周留存率 = 至少连续两周每周活跃一次的用户数量 / 仅在第一周活跃的用户数量
**我选择了一周作为时间框架,因为我认为 FB Groups 并不需要每天使用。
选择驱动/次要/防护指标 — 现在是时候从我们上面列出的指标中选择主要指标、次要指标和防护指标了。别忘了讨论其中的权衡!
驱动指标:
每周每位用户涉及群组的会话次数
[# 的会话次数很容易解释,能够捕捉用户行为,并与 Meta 的 NSM 相联系。如果涉及群组的会话增加,那么用户之间的互动也会增多 → 创建社区。]
次要指标***:***
每周每位用户创建至少 3 个成员的群组数量 (以捕捉供应)
每周每位用户在群组中的互动次数 (以捕捉需求)
连续两周活跃的用户数量(本周 + 上周) / 上周活跃的用户数量 (第二周留存率)
防护指标:
被移除的用户数量
每周关闭或举报的群组数量
每周在群组中发布的冒犯性/不当内容的帖子数量
在新闻源上花费的时间(我们不希望用户减少使用新闻源的频率)
总结 — 迅速回顾一下你刚刚整理的故事,展示它如何/为什么回答了问题,总是一个好主意。
就是这样——这是对我有帮助的框架,帮助我从 Meta 得到了录用!这个框架同样可以应用于任何数据科学职位中关于产品/成功指标的问题。构建一个结构清晰的回答,全面涵盖所有重要组成部分,并引导面试官跟随你的思路,这是关键。希望你喜欢这篇文章,也非常欢迎在下面的评论中分享你的反馈!
使用生成对抗网络(GANs)进行欺诈检测
使用 GANs 进行数据增强以调整不平衡数据集
https://deeporigami.medium.com/?source=post_page---byline--26bea360870d--------------------------------https://towardsdatascience.com/?source=post_page---byline--26bea360870d-------------------------------- Michio Suginoo
·发布于Towards Data Science ·阅读时间:18 分钟·2024 年 1 月 29 日
–
图片来源:Brett Jordan于Unsplash
“生成对抗网络”(GANs)在过去展示了生成逼真合成数据的出色表现,这些数据与真实数据几乎无法区分。不幸的是,GANs 因其不道德的应用,尤其是深度伪造(Knight,2018),而引起了公众的关注。
本文阐述了 GANs 在欺诈检测领域应用的一个有良好动机的案例。
欺诈检测是一个二分类预测应用。欺诈案件仅占交易总量的一小部分,构成了一个少数类别,使得数据集高度不平衡。通常,生成的模型往往偏向于多数类,并且容易对少数类欠拟合。因此,数据集不平衡的程度越高,分类预测器的表现就会越差。
我的动机是在尝试解决与不平衡数据集相关的经典欺诈检测问题时,将 GANs 作为数据增强工具来使用。更具体地说,GANs 可以生成少数欺诈类的逼真合成数据,并使不平衡的数据集达到完美平衡。
我希望这个复杂的算法能对欺诈检测的性能产生实质性贡献。换句话说,我最初的期望是:算法越复杂,性能越好。
一个相关的问题是,使用 GANs 是否能保证在欺诈检测性能上取得显著改善,并满足我的动机。让我们来看看。
简介
原则上,欺诈检测是一种二分类算法应用:将每一笔交易分类为是否为欺诈案件。
欺诈案件仅占交易总数的一小部分。通常,欺诈案件构成少数类,因此使得数据集高度不平衡。
欺诈案件越少,交易系统就越健全。
非常简单直观。
矛盾的是,这种良好的条件恰恰是过去使得欺诈检测变得具有挑战性的主要原因之一,甚至可以说是使其几乎不可能。原因很简单,因为分类算法难以学习到欺诈这个少数类的概率分布。
通常,数据集越平衡,分类预测器的性能就越好。换句话说,数据集越不平衡(或越不均衡),分类器的性能就越差。
这描绘了欺诈检测的经典问题:一个具有高度不平衡数据集的二分类应用。
在这种设置中,我们可以使用生成对抗网络(GANs)作为数据增强工具,生成少数欺诈类别的逼真合成数据,以便将整个数据集转化为更加平衡的状态,从而尝试提升欺诈检测分类器模型的性能。
本文分为以下几个部分:
-
第一部分:算法概述:GANs 的双层优化架构
-
第二部分:欺诈数据集
-
第三部分:GANs 用于数据增强的 Python 代码解析
-
第四部分:欺诈检测概述(基准场景与 GANs 场景对比)
-
第五部分:结论
总体而言,我将主要关注 GANs 的话题(包括算法和代码)。至于模型开发中的其他话题,如数据预处理和分类器算法,我将仅简要概述过程,并避免深入细节。在这个背景下,本文假设读者已经具备关于二分类算法(特别是我为欺诈检测选择的集成分类器)以及数据清洗和预处理的一般性知识。
对于详细代码,读者可以访问以下链接:github.com/deeporigami/Portfolio/blob/6538fcaad1bf58c5f63d6320ca477fa867edb1df/GAN_FraudDetection_Medium_2.ipynb
第一部分:算法概述:GANs 的双层优化架构
GAN 是一种特殊类型的生成算法。正如其名称所示,生成对抗网络(GAN)由两个神经网络组成:生成网络(生成器)和对抗网络(判别器)。GAN 将这两个代理放在一起进行竞争,其中生成器试图生成逼真的合成数据,而判别器则试图区分合成数据和真实数据。
原始的 GAN 在一篇开创性的论文中提出:“生成对抗网络”(Generative Adversarial Nets)(Goodfellow 等人,生成对抗网络,2014 年)。原始 GAN 的联合作者用伪造者-警察的类比来描述 GAN:这是一场迭代博弈,其中生成器扮演伪造者,判别器扮演警察的角色,检测生成器伪造的假货。
原始 GAN 具有创新性,因为它解决并克服了过去训练深度生成算法的常见困难。而且,作为其核心,它采用了二级优化框架,具有寻求平衡的目标设置(与最大似然目标设置相对)。
从那时起,已经探索了许多 GAN 的变体架构。作为一种预防措施,本文仅参考原始 GAN 的原型架构。
生成器与判别器
在 GAN 架构中,这两个神经网络——生成器和判别器——相互竞争。具体来说,这种竞争通过前向传播和反向传播的迭代进行(遵循神经网络的一般框架)。
一方面,显而易见,判别器本质上是一个二分类器:它将每个样本分类为真实(标签:1)或伪造/合成(标签:0)。判别器在前向传播过程中接收真实样本和合成样本。然后,在反向传播过程中,它学习从混合数据中检测合成数据。
另一方面,生成器在设计上是一个噪声分布。生成器在前向传播过程中接收真实样本。然后,在反向传播过程中,生成器学习真实数据的概率分布,以便更好地模拟其合成样本。
这两个代理通过“二级优化”框架交替训练。
二级训练机制(二级优化方法)
在原始的 GAN 论文中,为了训练这两个目标完全对立的代理,联合作者设计了一个“二级优化(训练)”架构,其中一个内部训练模块(判别器的训练)被嵌套在另一个高级训练模块(生成器的训练)中。
下图展示了“二级优化”在嵌套训练循环中的结构。判别器在嵌套的内部循环中进行训练,而生成器在更高层级的主循环中进行训练。
图片来源:作者
GAN 通过这种二级训练架构交替训练这两个代理(Goodfellow 等,生成对抗网络,2014 年,第 3 页)。换句话说,在交替训练一个代理的过程中,我们需要冻结另一个代理的学习过程(Goodfellow I.,2015 年,第 3 页)。
极小极大优化目标
除了使这两个代理可以交替训练的“二级优化”机制外,GAN 与传统神经网络原型的另一个独特特征是其极小极大优化目标。简单来说,与传统的最大化方法(例如最大似然)不同,GAN 追求的是一个寻求平衡的优化目标。
什么是寻求平衡的优化目标?
让我们逐步解析。
GAN 的两个代理有着截然相反的目标。判别器作为一个二分类器,旨在最大化正确分类真实样本和合成样本混合体的概率,而生成器的目标则是最小化判别器正确分类合成数据的概率:因为生成器需要欺骗判别器。
在这个背景下,原始 GAN 的合著者称整体目标为“极小极大博弈”。(Goodfellow 等,2014 年,第 3 页)
总体来说,GAN 的最终极小极大优化目标不是寻找这些目标函数的全局最大值/最小值。而是设定为寻求一个平衡点,可以理解为:
-
“一个鞍点,对于分类器来说是局部最大值,对于生成器来说是局部最小值”(Goodfellow I.,2015 年,第 2 页)
-
其中,任何一个代理都无法再提高其性能。
-
其中,生成器学会创造的合成数据已经足够真实,能够欺骗判别器。
平衡点可以在概念上通过判别器的随机猜测概率 0.5(50%)来表示:D(z) => 0.5。
让我们根据 GAN 的目标函数来转述其极小极大优化的概念框架。
判别器的目标是最大化下图中的目标函数:
图片来源:作者
为了解决可能的饱和问题,他们将生成器原始对数似然目标函数中的第二项转换如下,并建议将转换后的版本作为生成器的目标来最大化:
图片来源:作者
总的来说,GANs 的“二级优化”架构可以转化为以下算法。
图片来自作者
有关 GANs 算法设计的更多细节,请阅读我另一篇文章:生成对抗网络的极小极大优化设计。
现在,让我们开始使用数据集进行实际编码。
为了突出 GANs 算法,我将在这里主要聚焦于 GANs 的代码,并仅概述其余过程。
第二部分:欺诈数据集
为了进行欺诈检测,我从 Kaggle 选择了以下信用卡交易数据集:www.kaggle.com/datasets/mlg-ulb/creditcardfraud
数据许可:数据库内容许可(DbCL)v1.0
这是数据集的总结。
数据集包含 284,807 笔交易。在该数据集中,我们只有 492 个欺诈案例(其中包括 29 个重复案例)。
由于欺诈类别仅占所有交易的 0.172%,它构成了一个极其小的少数类。这个数据集非常适合用来说明与不平衡数据集相关的经典欺诈检测问题。
它包含以下 30 个特征:
-
V1, V2, … V28:通过 PCA 获得的 28 个主成分。数据来源未公开,以保护隐私。
-
‘Time’:每笔交易与数据集第一笔交易之间经过的秒数。
-
‘Amount’:交易金额。
标签设置为“Class”。
- ‘Class’:如果是欺诈,则为 1;否则为 0。
数据预处理:特征选择
由于数据集已经相当干净(如果不是完全干净的话),我只需做一些数据清理工作:去除重复数据和剔除异常值。
之后,鉴于数据集中有 30 个特征,我决定进行特征选择,通过剔除不太重要的特征来减少特征数量,准备训练过程。我选择了 scikit-learn 随机森林分类器的内置特征重要性评分,用来估算所有 30 个特征的评分。
以下图表显示了结果的摘要。如果您对详细过程感兴趣,请访问我上面列出的代码。
图片来自作者
根据上面条形图中显示的结果,我做出了主观判断,选择了 6 个最重要的特征进行分析,并从模型构建过程中移除了其余不重要的特征。
这是选定的 6 个重要特征。
图片来自作者
在后续的模型构建中,我专注于这 6 个选择的特征。在数据预处理之后,我们得到了如下形状的工作数据框 df:
- df.shape = (282513, 7)
希望特征选择能够减少最终模型的复杂性并稳定其性能,同时保留优化二分类器所需的关键信息。
场景 3: GANs 数据增强代码解析
最后,是时候使用 GANs 进行数据增强了。
那么我们需要创建多少合成数据呢?
首先,我们对数据增强的兴趣仅限于模型训练。由于测试数据集是样本外数据,我们希望保留测试数据集的原始形式。其次,因为我们的目标是完美地转换不平衡数据集,我们不想增加非欺诈类别的多数类数据。
简单来说,我们只希望增加少数欺诈类的训练数据集,而不是其他任何数据。
现在,使用分层数据拆分方法,将工作数据框拆分为 80/20 比例的训练数据集和测试数据集。
# Separate features and target variable
X = df.drop('Class', axis=1)
y = df['Class']
# Splitting data into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
# Combine the features and the label for the train dataset
train_df = pd.concat([X_train, y_train], axis=1)
结果,训练数据集的形状如下:
- train_df.shape = (226010, 7)
让我们查看训练数据集的组成(欺诈案例和非欺诈案例)。
# Load the dataset (fraud and non-fraud data)
fraud_data = train_df[train_df['Class'] == 1].drop('Class', axis=1).values
non_fraud_data = train_df[train_df['Class'] == 0].drop('Class', axis=1).values
# Calculate the number of synthetic fraud samples to generate
num_real_fraud = len(fraud_data)
num_synthetic_samples = len(non_fraud_data) - num_real_fraud
print("# of non-fraud: ", len(non_fraud_data))
print("# of Real Fraud:", num_real_fraud)
print("# of Synthetic Fraud required:", num_synthetic_samples)
# of non-fraud: 225632
# of Real Fraud: 378
# of Synthetic Fraud required: 225254
这告诉我们,训练数据集(226,010)由 225,632 个非欺诈数据和 378 个欺诈数据组成。换句话说,它们之间的差异是 225,254。这个数字是我们需要增加的合成欺诈数据(num_synthetic_samples)的数量,以便在训练数据集中完美地匹配这两个类别的数量:提醒一下,我们保留了原始的测试数据集。
接下来,让我们编写 GANs 代码。
首先,让我们创建自定义函数来确定两个代理:判别器和生成器。
对于生成器,我创建了一个噪声分布函数build_generator(),它需要两个参数:latent_dim(噪声的维度)作为输入的形状;以及输出的形状output_dim,即特征的数量。
# Define the generator network
def build_generator(latent_dim, output_dim):
model = Sequential()
model.add(Dense(64, input_shape=(latent_dim,)))
model.add(Dense(128, activation='sigmoid'))
model.add(Dense(output_dim, activation='sigmoid'))
return model
对于判别器,我创建了一个自定义函数build_discriminator(),它需要一个input_dim,即特征的数量。
# Define the discriminator network
def build_discriminator(input_dim):
model = Sequential()
model.add(Input(input_dim))
model.add(Dense(128, activation='sigmoid'))
model.add(Dense(1, activation='sigmoid'))
return model
然后,我们可以调用这些函数来创建生成器和判别器。在这里,对于生成器,我随意将latent_dim设置为 32:你可以尝试其他值。
# Dimensionality of the input noise for the generator
latent_dim = 32
# Build generator and discriminator models
generator = build_generator(latent_dim, fraud_data.shape[1])
discriminator = build_discriminator(fraud_data.shape[1])
在这一阶段,我们需要编译判别器,稍后它将嵌套在主(更高层次的)优化循环中。我们可以通过以下参数设置来编译判别器。
-
判别器的损失函数:二分类器的通用交叉熵损失函数
-
评估指标:精确度和召回率。
# Compile the discriminator model
from keras.metrics import Precision, Recall
discriminator.compile(optimizer=Adam(learning_rate=0.0002, beta_1=0.5), loss='binary_crossentropy', metrics=[Precision(), Recall()])
对于生成器,我们将在构建主(上层)优化循环时进行编译。
在这个阶段,我们可以定义生成器的自定义目标函数如下。记住,推荐的目标是最大化以下公式:
图片来源:作者
def generator_loss_log_d(y_true, y_pred):
return - K.mean(K.log(y_pred + K.epsilon()))
上面提到的负号是必须的,因为默认情况下,损失函数是设计为最小化的。
然后,我们可以构建双层优化架构的主(上层)循环,build_GANs(generator, discriminator)。在这个主循环中,我们隐式地编译生成器。在这种情况下,我们在编译主循环时需要使用生成器的自定义目标函数 generator_loss_log_d。
如前所述,我们在训练生成器时需要冻结判别器。
# Build and compile the GANs upper optimization loop combining generator and discriminator
def build_gan(generator, discriminator):
discriminator.trainable = False
model = Sequential()
model.add(generator)
model.add(discriminator)
model.compile(optimizer=Adam(learning_rate=0.0002, beta_1=0.5), loss=generator_loss_log_d)
return model
# Call the upper loop function
gan = build_gan(generator, discriminator)
在上面最后一行,gan 调用了 build_gan(),以便执行下面的批量训练,使用 Keras 的 model.train_on_batch() 方法。
提醒一下,在训练判别器时,我们需要冻结生成器的训练;而在训练生成器时,我们需要冻结判别器的训练。
这里是结合了交替训练过程的批量训练代码,这两个代理在双层优化框架下进行训练。
# Set hyperparameters
epochs = 10000
batch_size = 32
# Training loop for the GANs
for epoch in range(epochs):
# Train discriminator (freeze generator)
discriminator.trainable = True
generator.trainable = False
# Random sampling from the real fraud data
real_fraud_samples = fraud_data[np.random.randint(0, num_real_fraud, batch_size)]
# Generate fake fraud samples using the generator
noise = np.random.normal(0, 1, size=(batch_size, latent_dim))
fake_fraud_samples = generator.predict(noise)
# Create labels for real and fake fraud samples
real_labels = np.ones((batch_size, 1))
fake_labels = np.zeros((batch_size, 1))
# Train the discriminator on real and fake fraud samples
d_loss_real = discriminator.train_on_batch(real_fraud_samples, real_labels)
d_loss_fake = discriminator.train_on_batch(fake_fraud_samples, fake_labels)
d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)
# Train generator (freeze discriminator)
discriminator.trainable = False
generator.trainable = True
# Generate synthetic fraud samples and create labels for training the generator
noise = np.random.normal(0, 1, size=(batch_size, latent_dim))
valid_labels = np.ones((batch_size, 1))
# Train the generator to generate samples that "fool" the discriminator
g_loss = gan.train_on_batch(noise, valid_labels)
# Print the progress
if epoch % 100 == 0:
print(f"Epoch: {epoch} - D Loss: {d_loss} - G Loss: {g_loss}")
这里,我有一个快速的问题要问你。
下面我们展示了与上述代码中的生成器训练相关的一个代码片段。
你能解释一下这段代码的作用吗?
# Generate synthetic fraud samples and create labels for training the generator
noise = np.random.normal(0, 1, size=(batch_size, latent_dim))
valid_labels = np.ones((batch_size, 1))
在第一行,noise 生成了合成数据;在第二行,valid_labels 分配了合成数据的标签。
为什么我们需要用 1 来标注它,1 本应是实际数据的标签?难道你没有觉得这段代码让人有些困惑吗?
各位女士们,先生们,欢迎来到伪造者的世界。
这是标签化的魔法,它训练生成器生成能够欺骗判别器的样本。
现在,让我们使用训练好的生成器来创建少数欺诈类的合成数据。
# After training, use the generator to create synthetic fraud data
noise = np.random.normal(0, 1, size=(num_synthetic_samples, latent_dim))
synthetic_fraud_data = generator.predict(noise)
# Convert the result to a Pandas DataFrame format
fake_df = pd.DataFrame(synthetic_fraud_data, columns=features.to_list())
最终,合成数据已经创建完成。
在下一节中,我们可以将这些合成的欺诈数据与原始训练数据集结合,确保整个训练数据集达到完美平衡。我希望这个完美平衡的训练数据集能提高欺诈检测分类模型的性能。
第四部分:欺诈检测概述(有无 GAN 数据增强)
一再强调,本项目中使用 GAN 的唯一目的是数据增强,而不是分类。
首先,我们需要基准模型作为比较的基础,以便我们评估基于 GAN 数据增强的欺诈检测模型性能的提升。
作为一个二分类算法,我选择了集成方法来构建欺诈检测模型。作为基准场景,我仅使用原始不平衡数据集来开发欺诈检测模型:也就是没有数据增强。然后,在第二个使用 GAN 进行数据增强的场景中,我可以使用包含 GAN 生成的合成欺诈数据的完美平衡训练数据集来训练相同的算法。
-
基准场景:没有数据增强的集成分类器
-
GAN 场景:使用 GAN 进行数据增强的集成分类器
基准场景:没有数据增强的集成
接下来,让我们定义基准场景(没有数据增强)。我决定选择集成分类器:投票法作为元学习器,使用以下 3 个基础学习器。
-
梯度提升
-
决策树
-
随机森林
由于原始数据集高度不平衡,除了准确率之外,我将从以下三个选项中选择评估指标:精确率、召回率和 F1-Score。
以下自定义函数,ensemble_training(X_train, y_train),定义了训练和验证过程。
def ensemble_training(X_train, y_train):
# Initialize base learners
gradient_boosting = GradientBoostingClassifier(random_state=42)
decision_tree = DecisionTreeClassifier(random_state=42)
random_forest = RandomForestClassifier(random_state=42) # Define the base models
base_models = {
'RandomForest': random_forest,
'DecisionTree': decision_tree,
'GradientBoosting': gradient_boosting
} # Initialize the meta learner
meta_learner = VotingClassifier(estimators=[(name, model) for name, model in base_models.items()], voting='soft') # Lists to store training and validation metrics
train_f1_scores = []
val_f1_scores = [] # Splitting the train set further into training and validation sets
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25, random_state=42, stratify=y_train) # Training and validation
for model_name, model in base_models.items():
model.fit(X_train, y_train) # Training metrics
train_predictions = model.predict(X_train)
train_f1 = f1_score(y_train, train_predictions)
train_f1_scores.append(train_f1) # Validation metrics using the validation set
val_predictions = model.predict(X_val)
val_f1 = f1_score(y_val, val_predictions)
val_f1_scores.append(val_f1) # Training the meta learner on the entire training set
meta_learner.fit(X_train, y_train) return meta_learner, train_f1_scores, val_f1_scores, base_models
下一个函数模块,ensemble_evaluations(meta_learner, X_train, y_train, X_test, y_test),在元学习器层面计算性能评估指标。
def ensemble_evaluations(meta_learner,X_train, y_train, X_test, y_test):
# Metrics for the ensemble model on both traininGANsd test datasets
ensemble_train_predictions = meta_learner.predict(X_train)
ensemble_test_predictions = meta_learner.predict(X_test)
# Calculating metrics for the ensemble model
ensemble_train_f1 = f1_score(y_train, ensemble_train_predictions)
ensemble_test_f1 = f1_score(y_test, ensemble_test_predictions) # Calculate precision and recall for both training and test datasets
precision_train = precision_score(y_train, ensemble_train_predictions)
recall_train = recall_score(y_train, ensemble_train_predictions) precision_test = precision_score(y_test, ensemble_test_predictions)
recall_test = recall_score(y_test, ensemble_test_predictions) # Output precision, recall, and f1 score for both training and test datasets
print("Ensemble Model Metrics:")
print(f"Training Precision: {precision_train:.4f}, Recall: {recall_train:.4f}, F1-score: {ensemble_train_f1:.4f}")
print(f"Test Precision: {precision_test:.4f}, Recall: {recall_test:.4f}, F1-score: {ensemble_test_f1:.4f}") return ensemble_train_predictions, ensemble_test_predictions, ensemble_train_f1, ensemble_test_f1, precision_train, recall_train, precision_test, recall_test
接下来,让我们看一下基准集成分类器的表现。
Training Precision: 0.9811, Recall: 0.9603, F1-score: 0.9706
Test Precision: 0.9351, Recall: 0.7579, F1-score: 0.8372
在元学习器层面,基准模型生成的 F1-Score 在合理的水平 0.8372。
接下来,让我们进入使用 GAN 进行数据增强的场景。我们想看看使用 GAN 的场景是否能超越基准场景的表现。
GAN 场景:使用 GAN 进行数据增强的欺诈检测
最终,我们通过将原始不平衡训练数据集(包括非欺诈和欺诈案例)、train_df 和通过 GAN 生成的合成欺诈数据集 fake_df 结合起来,构建了一个完美平衡的数据集。在这里,我们将原始测试数据集保留不变,不参与这个过程。
wdf = pd.concat([train_df, fake_df], axis=0)
我们将使用混合的平衡数据集训练相同的集成方法,以查看它是否能够超越基准模型。
现在,我们需要将混合平衡数据集分割成特征和标签。
X_mixed = wdf[wdf.columns.drop("Class")]
y_mixed = wdf["Class"]
记住,当我之前运行基准场景时,我已经定义了必要的自定义函数模块来训练和评估集成分类器。我也可以在这里使用这些自定义函数来训练相同的集成算法,使用合成的平衡数据集。
我们可以将特征和标签(X_mixed, y_mixed)传入自定义的集成分类器函数 ensemble_training()。
meta_learner_GANs, train_f1_scores_GANs, val_f1_scores_GANs, base_models_GANs=ensemble_training(X_mixed, y_mixed)
最后,我们可以使用测试数据集来评估模型。
ensemble_evaluations(meta_learner_GANs, X_mixed, y_mixed, X_test, y_test)
这里是结果。
Ensemble Model Metrics:
Training Precision: 1.0000, Recall: 0.9999, F1-score: 0.9999
Test Precision: 0.9714, Recall: 0.7158, F1-score: 0.8242
结论
最后,我们可以评估通过 GAN 进行数据增强是否提高了分类器的表现,正如我所预期的那样。
让我们比较基准场景和 GAN 场景的评估指标。
这是来自基准场景的结果。
# The Benchmark Scenrio without data augmentation by GANs
Training Precision: 0.9811, Recall: 0.9603, F1-score: 0.9706
Test Precision: 0.9351, Recall: 0.7579, F1-score: 0.8372
这是来自 GANs 场景的结果。
Training Precision: 1.0000, Recall: 0.9999, F1-score: 0.9999
Test Precision: 0.9714, Recall: 0.7158, F1-score: 0.8242
当我们回顾训练数据集上的评估结果时,显然 GANs 场景在所有三个评估指标上都超过了基准场景。
然而,当我们关注样本外测试数据的结果时,GANs 场景仅在精确度上超过了基准场景(基准:0.935 vs GANs 场景:0.9714);在召回率和 F1 得分上(基准:0.7579;0.8372 vs GANs 场景:0.7158;0.8242)却未能超越。
-
更高的精确度意味着模型对欺诈案例的预测中,包含的非欺诈案例比例低于基准场景。
-
更低的召回率意味着模型未能检测到某些实际欺诈案例的变种。
这两项对比表明:尽管 GANs 通过数据增强成功地在训练数据集中模拟了真实的欺诈数据,但它未能捕捉到实际欺诈案例在样本外测试数据集中的多样性。
GANs 在模拟训练数据的特定概率分布方面表现得太好。具有讽刺意味的是,作为数据增强工具使用 GANs,由于过度拟合训练数据,导致欺诈检测(分类)模型的泛化能力较差。
具有讽刺意味的是,这个特定的例子提出了一个反直觉的观点,即一个更复杂的算法不一定能保证比简单的传统算法更好的表现。
此外,我们还可以考虑另一个无意的后果——浪费性的碳足迹:将能源需求较大的算法添加到模型开发中,可能会增加机器学习在日常生活中的碳足迹。这个案例可以说明一个不必要的浪费案例,它无故浪费了能源,而没有带来更好的性能。
这里我留给你一些关于机器学习能源消耗的链接。
今天,我们有许多 GAN 的变种。在未来的文章中,我想探索其他 GAN 的变种,看看是否有任何变种能够捕捉到原始样本的更广泛多样性,从而提高欺诈检测器的性能。
感谢阅读。
杉野道夫
参考文献
-
Borji, A.(2018 年 10 月 24 日)。GAN 评估指标的利与弊。取自 ArXiv:
arxiv.org/abs/1802.03446 -
Goodfellow, I. (2015 年 5 月 21 日). 估计生成模型的可区分性标准. 从 ArXiv 获取:
arxiv.org/abs/1412.6515 -
Goodfellow, I. J., Pouget-Abadie, J., Mirza, M., Xu, B., Warde-Farley, D., Ozairy, S., . . . Bengioz, Y. (2014 年 6 月 10 日). 生成对抗网络. 从 arXiv 获取:
arxiv.org/abs/1406.2661 -
Goodfellow, I. J., Pouget-Abadie, J., Mirza, M., Xu, B., Warde-Farley, D., Ozairy, S., . . . Bengioz, Y. (2014 年 6 月 10 日). 生成对抗网络. 从 arXiv 获取:
arxiv.org/abs/1406.2661 -
Knight, W. (2018 年 8 月 17 日). 让美国再次变得伟大(假). 从 MIT Technology Review 获取:
www.technologyreview.com/2018/08/17/240305/fake-america-great-again/ -
Suginoo, M. (2024 年 1 月 13 日). 生成对抗网络(GAN)的极小极大优化设计. 从 Towards Data Science 获取:
towardsdatascience.com/mini-max-optimization-design-of-generative-adversarial-networks-gan-dc1b9ea44a02
1607

被折叠的 条评论
为什么被折叠?



