优化机器学习模型性能的预测和校准技术
机器学习性能优化
Python 代码示例
Image by author
C 校准是改善预测模型误差分布的后处理技术。
机器学习(ML)模型的评估是部署之前的关键步骤。因此,有必要对一个 ML 模型进行行为分析。在许多实际应用中,除了模型的平均误差之外,了解该误差是如何分布的以及概率估计的好坏也很重要。根据我的经验,许多当前的 ML 技术在总体结果上是好的,但是具有差的误差分布评估。我将讨论常用的校准技术和使用分类的校准方法。
从科学的角度来看,ML 方法的主要目标是从给定的数据集建立一个假设(模型)。在学习过程之后,必须尽可能精确地评估假设的质量。
对于基于分类的模型,常见的度量是精度(误差的倒数)、f 度量或宏观平均。在概率分类中,除了正确分类实例的百分比之外,还使用了其他度量,如对数损失、均方误差(MSE)(或 Brier 氏评分)或 ROC 曲线下面积(AUROC)。如果输出不是二进制的,而是 0 到 1 之间的浮点数,那么分数可以用于排名。但是 0 和 1 之间的浮点数导致了概率,我们怎么知道我们是否可以相信它们是概率呢?
为什么我们需要校准的分类器:
我们需要一个好的分类器来区分真阳性和真阴性。我们这里要处理电信客户数据;因此,在" C hurn" 分析中,我们期望分类器触发" Churn “和” NoChurn "之间的标志,这允许我们通过调整阈值来校准该模型的灵敏度。这意味着,如果分类器可以检测到 90%的“流失”可能性,企业应该将其视为真正的标签。此外,大多数与分类相关的数据非常不平衡,其中*【流失】的数量远远小于无流失*。因此,我们可能想要重新采样数据以平衡它们,这样我们可能会使我们的模型过于激进,从而导致一些偏差。
二元分类器:
在处理两类分类问题时,我们总是可以把一类标为正类,而把另一类标为负类。测试集由 P 个正例和 N 个负例组成。一个分类器给他们每个人分配一个类,但是有些分配是错误的。为了评估分类结果,我们计算真阳性(TP)、真阴性(TN)、假阳性(FP)(实际上是阴性,但被分类为阳性)和假阴性(FN)(实际上是阳性,但被分类为阴性)例子的数量。它保持住了
- TP + FN = P 和
- TN + FP = N
分类器将 TP + FP 实例分配给正类,将 TN + FN 实例分配给负类。让我们定义几个众所周知和广泛使用的衡量标准:
- FPrate = FP /N
- TPrate = TP /P = Recall
- Yrate = (TP + FP) /(P + N)
- 精度= TP/ (TP + FP)
- 准确率= (TP + TN)/ (P + N)。
精度和准确度通常用来衡量二元分类器的分类质量。也可以定义用于特殊目的的其他几种度量。我们将在下面的章节中对它们进行描述
概率分类器:
概率分类器是一个函数 f : X → [0,1],它将每个例子 X 映射到一个实数 f(x)。通常,选择阈值 t,其中 f(x) ≥ t 的例子被认为是正的,其他的被认为是负的。这意味着每对概率分类器和阈值 t 定义了一个二元分类器。因此,上一节中定义的度量也可用于概率分类器,但它们始终是阈值 t 的函数。注意,TP(t)和 FP(t)始终是单调递减函数。对于有限的示例集,它们是逐步的,而不是连续的。通过改变 t,我们得到一族二元分类器。
让我们用现有的电信数据做实验。
# Loading the CSV with pandas
data = pd.read_csv(‘Telco_Customer_Churn.csv’)data.dtypes # types of data in data set
#Removing customer IDs from the data set the columns not used in the predictive model.
df = data.drop(“customerID”, axis=1)
df.info()
我们将转换分类变量(‘是’,‘否’,等等)。)转换成数值。此外,需要将“*总费用”*转换为数字数据类型。此外,“总费用有 11 个缺失值。因此它将替换数据集中的 11 行。这里的预测变量是“Churn”。因此,也有必要将预测变量转换为二进制数值变量。
df.dropna(inplace = True)df[‘Churn’].replace(to_replace=’Yes’, value=1, inplace=True)
df[‘Churn’].replace(to_replace=’No’, value=0, inplace=True)# converting all the categorical variables into dummy variables
df_dummies = pd.get_dummies(df)
df_dummies.info()
分类算法:
我们将考虑物流回归和随机森林分类器来预测客户流失。重要的是在回归中调整变量,使所有变量都在 0 到 1 的范围内。
df_dummies = df_dummies.drop(“TotalCharges”, axis=1) # removing Total Charges to avoid multi-colinearity.# Using the data frame where we had created dummy variables
y = df_dummies[‘Churn’].values
X = df_dummies.drop(columns = [‘Churn’])# Scaling all the variables to a range of 0 to 1
features = X.columns.values
scaler = MinMaxScaler(feature_range = (0,1))
scaler.fit(X)
X = pd.DataFrame(scaler.transform(X))
X.columns = features
方法:
我们的第一步是使用 train-test-split 将我们的数据分成训练集和测试集,这将允许我们稍后交叉验证我们的结果。我们还对训练-测试-分割进行了分层,以确保在我们的训练集和测试集中发现相同比例的目标变量。
拆分数据:
x 是自变量的数据,y 是因变量的数据。测试大小变量决定了数据的分割比例。在 90 的培训/10 的测试比例中,这样做是很常见的。此外,需要对培训-测试-拆分进行分层,以获得平衡的拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=101)
print(‘length of X_train and x_test: ‘, len(X_train), len(X_test))
print(‘length of y_train and y_test: ‘, len(y_train), len(y_test))
逻辑回归:
使用 ML 算法和因变量,这里的流失 1 或流失 0 是分类的。经过训练的模型可用于预测客户是否对测试数据集产生了兴趣。结果保存在“prediction_test”中,然后测量并打印准确度分数。
lr_model = LogisticRegression(solver=’lbfgs’).fit(X_train, y_train)
lr_prediction = lr_model.predict_proba(X_test)
prediction_test = lr_model.predict(X_test)
lr_pred = lr_model.predict(X_test)print(classification_report(y_test, prediction_test))
- 在第一类(NoChurn)的 557 个点中,该模型成功地正确识别了其中的 502 个点
- 在第 1 类的 147 个点中,模型正确预测了其中的 77 个点
- 在总共 704 个中,模型正确预测了其中 579 个。
准确率 82%(精确到 82.24%)。然而,考虑到数据是倾斜的,并且目标类别不平衡,这可能不是正确的衡量标准。所以,我们研究精确度,回忆,F 值。
混淆矩阵清楚地显示了模型性能,分为真阳性、真阴性、假阳性和假阴性。
- 精度是分类器不将实际上是负的实例标记为正的能力。对于每个类别,它被定义为真阳性与真阳性和假阳性之和的比率。
- 召回是分类器找到所有肯定实例的能力。对于每个类别,它被定义为真阳性与真阳性和假阴性之和的比率。
- F1 分数是精确度和召回率的加权调和平均值,最好的分数是 1.0,最差的是 0.0。
等级校准(CC):
CC 是真实类别分布与估计类别分布的近似程度。以这种方式校准模型的标准方法是通过改变确定模型何时预测“客户流失或“NoChurn”的阈值,使该阈值对“客户流失”类更严格,对“NoChurn”类更温和,以平衡比例。
y_scores=lr_prediction
prec, rec, tre = precision_recall_curve(y_test, y_scores[:,1], )def plot_prec_recall_vs_tresh(precisions, recalls, thresholds):
fig, ax = plt.subplots(figsize=(10,6))
plt.plot(thresholds, precisions[:-1], “r — “, label=”Precisions”)
plt.plot(thresholds, recalls[:-1], “#424242”, label=”Recalls”)
plt.ylabel(“Level of Precision and Recall”, fontsize=12)
plt.title(“Precision and Recall Scores as a function of the decision threshold”, fontsize=12)
plt.xlabel(‘Thresholds’, fontsize=12)
plt.legend(loc=”best”, fontsize=12)
plt.ylim([0,1])
plt.axvline(x=0.47, linewidth=3, color=”#0B3861")
plot_prec_recall_vs_tresh(prec, rec, tre)
plt.show()
正面类(【流失】)预测的准确率(58.33%)和召回率(52.38%)相对较低。交叉点上方的区域是良好性能水平的区域。下面的另一个区域是表现不佳的区域。原则上,这种类型的校准可能会产生更多的误差。事实上,通常情况下,我们希望获得一个有用的模型来解决非常不平衡的类分布问题,即少数类的例子非常少。
AUROC 曲线:
衡量二元分类器性能的一种更直观的方法是接收器工作特性(AUROC)曲线下的面积。它说明了模型在多大程度上能够区分流失和非流失。
lr_prediction = lr_model.predict_proba(X_test)
skplt.metrics.plot_roc(y_test, lr_prediction)
众所周知,AUROC 曲线很少受到类别分布变化的影响(放大对 FP 的影响很小,而我们可以看到对 TP 的一些影响)。
宏平均独立计算每个类的指标,然后取平均值(因此平等对待所有类),而微平均聚合所有类的贡献来计算平均指标。如果我们想知道系统在数据集上的整体表现,我们将考虑宏观平均。我们不应该用这个平均数做出任何具体的决定。另一方面,当我们的数据集大小不同时,微观平均是一个有用的度量。
因此,我们在这里看到,ROC 曲线未能明确显示平衡和不平衡情况之间的差异。此外,AUROC 分数不足以评估早期检索性能,尤其是当曲线相互交叉时。
我们将检查随机森林分类器;不过,我们就不再赘述了。类似的一套过程,如逻辑回归,可以做比较。
随机森林分类器:
同样,训练一个随机森林模型并在验证集上进行预测。
rf_model = RandomForestClassifier(random_state=101, n_estimators=100).fit(X_train, y_train)
rf_prediction = rf_model.predict_proba(X_test)
rf_model.score(X_test, y_test)
0.7798295454545454
概率校准(PC):
PC 伴随着概率估计的每个预测。如果我们预测我们有 99%的把握,如果我们只有 50%的时间是正确的,这是没有校准的,因为我们的估计过于乐观。类似地,如果我们预测我们只有 60%的把握,而我们 80%的时间是正确的,这是没有校准的,因为我们的估计太悲观了。在这两种情况下,正确猜测的数量或比例的期望值(在这种情况下是概率或置信度评估)与实际值不匹配。然后,校准被定义为预测概率与实际概率的接近程度。准确度和校准虽然相互依赖,但却是截然不同的两码事。
这里,我们有类别概率和标签来计算校准图的箱。
lr_y, lr_x = calibration_curve(y_test, lr_prediction[:,1], n_bins=20)
rf_y, rf_x = calibration_curve(y_test, rf_prediction[:,1], n_bins=20)fig, ax = plt.subplots()
# only these two lines are calibration curves
plt.plot(lr_x,lr_y, marker=’o’, linewidth=1, label=’lr’)
plt.plot(rf_x, rf_y, marker=’o’, linewidth=1, label=’rf’)# reference line, legends, and axis labels
line = mlines.Line2D([0, 1], [0, 1], color=’black’)
transform = ax.transAxes
line.set_transform(transform)
ax.add_line(line)
fig.suptitle(‘Calibration plot for Telecom data’)
ax.set_xlabel(‘Predicted probability’)
ax.set_ylabel(‘True probability in each bin’)
plt.legend(); plt.show()
def bin_total(y_true, y_prob, n_bins):
bins = np.linspace(0., 1\. + 1e-8, n_bins + 1)# In sklearn.calibration.calibration_curve the last value in the array is always 0.
binids = np.digitize(y_prob, bins) — 1return np.bincount(binids, minlength=len(bins))
bin_total(y_test, lr_prediction[:,1], n_bins=20)
#数组([191,88,47,58,46,32,30,32,24,24,25,22,22,19,24,17,2,1,0,0,0])
bin_total(y_test, rf_prediction[:,1], n_bins=20)
array([213,70,59,47,39,42,27,27,22,18,26,21,22,18,7,12,10,6,7,11,0])
缺失的条柱具有 75%、85%和 95%的端点值。我们希望我们的预测能够避开那些空箱子,变得有鉴别力。在分类问题中,辨别和校准是并行不悖的。如果构建模型的目标是自动做出决策,而不是提供统计估计,有时它会出现在校准之前。在这里,查看 bin 中的点数,随机森林(橙色线)似乎比逻辑回归(蓝色线)更好。
一篇关于模型校准的有趣文章可以在 这里 找到补充阅读。
总结:
校准技术通常基于导出将值或概率转换为更好的估计值的变换。在分类的情况下,大多数转换技术通常包括宁滨或排序。我将为模型拟合评估推荐一个拟合优度测试(Hosmer-Lemeshow)。如果你有兴趣,你可以阅读 这篇 的文章来了解更多。
呼唤数据科学家—停止使用准确性、精确度或召回等衡量标准!
现实世界中的数据科学
用决策者能理解的语言交流
These are important metrics, but know your audience and ensure your communicating in their language!
好吧这个标题是故意挑衅和夸张滴。正如我们的一位数据科学家所说“我被这个标题吓坏了,但最终完全同意你的观点。
我坚信机器学习和数据科学领域提供的机会,但我们必须诚实面对自己。越来越多的人持怀疑态度,期望过高,有些人甚至警告说数据科学领域正在出现的信誉危机。
此外,许多决策者没有经过适当的培训来帮助解释、理解和正确应用我们模型的输出。
与 IMPACT 沟通
为此,我们需要更好地向关键利益相关者和决策者展示我们的影响力。最后,重要的是在业务问题的背景下,用非数据科学家能够理解的语言传达影响。
“在业务问题的背景下重点构建您的模型结果”
例如,我不认为准确度、精确度和召回率这样的指标对大多数商业用户来说是特别有用的。在某些具有不平衡数据集的项目中,我们有个位数精度的数字,这导致了重大的业务影响,特别是在与模型正在取代的流程相关联的情况下。
这是关键点——我们需要确保将结果与当前的工作方式进行比较。
关键业务利益相关者通常不愿意实施甚至试验一个新模型,除非他们能够清楚地理解它如何对他们的关键业务度量产生重大影响。
如何最好地框定你的结果
如果可能的话,确保我们在最终用户能够理解的业务环境中制定结果符合我们的最佳利益。让我们想象一下,你正在与营销副总裁会面,向他展示你的诊断罕见疾病患者模型的结果。
当我们将模型结果转化为有助于支持关键利益相关方做出明智决策的信息时,请看下面的进展:
我承认这是一个简单的例子,而且还有其他需要考虑的因素,但是请把这个例子看作是说明性的。
在业务环境中,它应该是量化相对于当前流程的改进。
这就引出了两个重要的概念——'**'和一个 挑战者模型 的想法。在以分析为中心的项目的构思阶段,我们采用“切合目的”的设计原则。在直接跳到高级 ML 模型之前,确保您首先探索更简单的方法。在可能的情况下,首先考虑部署一种更简单的方法(即 challenger model ),看看是否能够实现预期的业务成果。
你的利益相关者需要什么?
Photo by Stephen Dawson on Unsplash
要记住的关键点是,您的决策者可能有不同的需求,这驱动了对重要指标的不同观点。有些人可能专注于增加销售额,有些人专注于降低成本,有些人可能专注于减少错误,而有些人只是希望你让他们的工作更容易。
“避免不必要的模型腐烂——根据利益相关者的需求定义成功”
理想的情况是,在任何项目开始之前,与您的关键利益相关者合作,讨论这些重要的指标。用利益相关者的语言定义成功是推动有意义和持续的业务采用的主要因素,而不是让你的模型在架子上腐烂。
特别感谢我们两位才华横溢的数据科学家 艾米丽·科岗 和 埃里克·舍兰 对本文的贡献。
骰子、民意测验和狄利克雷多项式
概率规划在贝叶斯统计中的一些应用
Photo by Jonathan Petersson on Unsplash
作为学习贝叶斯统计的长期项目的一部分,我目前正在阅读安德鲁·吉尔曼、约翰·卡林、哈尔·斯特恩、大卫·邓森、阿基·维赫塔里和唐纳德·鲁宾撰写的贝叶斯数据分析,第三版,通常被称为 BDA3 。虽然在过去一年左右的项目中,我一直在使用贝叶斯统计和概率编程语言,如 PyMC3 ,但这本书迫使我超越纯粹的从业者建模方法,同时仍然提供非常实用的价值。
以下是我觉得有趣的本书前几章的一些摘录。他们的目的是希望激励其他人学习贝叶斯统计,而不是试图对数学过于正式。如果有些东西在房间里受过训练的数学家看来不是 100%,请让我知道,或者只是稍微眯着眼睛看一下。;)
我们将涵盖:
- 一些常见的共轭分布
- 使用掷骰子的狄利克雷多项式分布示例
- 涉及轮询来自 BDA3 的数据的两个示例
共轭分布
在本书的第 2 章中,作者介绍了先验概率分布的几种选择,以及第 2.4 节中的共轭分布的概念。
来自维基百科
在贝叶斯概率理论中,如果后验分布 p(θ | x)与先验概率分布 p(θ)在同一个概率分布族中,则先验和后验称为共轭分布,先验称为似然函数的共轭先验。
约翰·库克在他的网站上有一张有用的图表,展示了一些常见的共轭分布族:
Conjugate Priors
共轭分布在概率论中是一个非常重要的概念,这在很大程度上是由于一些很好的数学性质使得计算后验概率更容易处理。即使有越来越好的计算工具,如 MCMC,基于共轭分布的模型也是有优势的。
贝塔二项式
共轭分布的一个更广为人知的例子是Beta-二项式分布,它通常用于模拟一系列的硬币投掷(这是关于概率的帖子中一直存在的话题)。
二项式分布代表一系列伯努利试验的成功概率,而贝塔分布则代表每次试验成功概率的先验概率分布。
因此,硬币落在头上的概率 p 被建模为β分布(参数为α和β),而头和尾的概率被假设为遵循二项式分布,参数为 n (代表翻转次数)和β分布 p ,因此
p∞β(α,β)
y∞二项式(n,p)
伽马泊松
另一种常用的共轭分布是伽马-泊松分布,这样命名是因为参数化泊松分布的速率参数λ被建模为伽马分布:
λ∞伽马(k,θ)
y∞泊松(λ)
虽然离散的泊松分布通常用于计数数据的应用,例如商店顾客、电子商务订单、网站访问,但是伽马分布用作建模这些事件发生率(λ)的有用分布,因为伽马分布仅建模正的连续值,但是在其他方面其参数化相当灵活:
Gamma Distributions
这种分布也被称为负二项分布,我们可以将其视为泊松分布的混合。
如果你觉得这很困惑,你并不孤单,也许你会开始理解为什么我们经常试图用好的旧的正态分布来近似事物…
狄利克雷多项式
一个或许更有趣但似乎很少被提及的共轭分布的例子是 BDA3 第 3 章中介绍的狄利克雷多项式分布。
思考狄利克雷-多项式分布的一种方式是,多项式(即多项选择)分布是二项式分布(即二元选择)的推广,狄利克雷分布是贝塔分布的推广。也就是说, Beta 分布模拟单个概率p概率的概率,而 Dirichlet 模拟多个互斥选择的概率,由 a 参数化,a 被称为浓度参数,代表每个选择的权重(我们将在后面看到更多)。
换句话说,把硬币想象成贝塔二项式分布,把骰子想象成狄利克雷多项式分布。
θ∞狄利克雷(a)
y∞多项式(n,θ)
在野外,我们可能会遇到狄利克雷分布,这些天经常出现在自然语言处理中的主题建模上下文中,它通常被用作潜在狄利克雷分配(或 LDA)模型的一部分,这是一种奇特的方式,即我们试图计算出一篇文章属于给定内容的某个主题的概率。
然而,为了我们的目的,让我们在简单的多项选择的背景下看一下狄利克雷多项式,让我们从投掷骰子作为激励的例子开始。
扔骰子
(如果您想尝试这里的代码片段,您需要首先导入相关的 Python 库。或者您可以跟随本文附带的 Jupyter 笔记本。)
import numpy as np
from scipy import stats
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import pymc3 as pm
让我们首先创建一些表示 122 个六面骰子的数据,其中 p 表示公平骰子每一面的预期概率,即 1/6。
y = np.asarray([20, 21, 17, 19, 17, 28])
k = len(y)
p = 1/k
n = y.sum()print(n, p)**(122, 0.16666666666666666)**
仅仅看一个简单的数据柱状图,我们就怀疑我们可能处理的不是一个公平的死亡!
sns.barplot(x=np.arange(1, k+1), y=y);
Barplot of rolls of six-sided die
然而,我们是贝叶斯统计的学生,我们想更进一步,量化我们在骰子的公平性方面的不确定性,并计算有人向我们扔骰子的概率。
让我们在 PyMC3 中建立一个简单的模型,它不仅可以计算 theta 的后验概率(即骰子每边的概率),还可以估计骰子返回 6 的偏差。为此,除了未观察到的(theta
)和观察到的(results
)随机变量之外,我们还将使用 PyMC3 Deterministic
变量。
对于θ上的先验,我们将假设非信息性的均匀分布,通过用参数a
的一系列 1 初始化狄利克雷先验,一个 1 对应一个k
可能的结果。这类似于将一个 Beta 分布初始化为 Beta(1,1) ,它对应于均匀分布(关于这个的更多信息在这里)。
with pm.Model() as dice_model:
# initializes the Dirichlet distribution with a uniform prior:
a = np.ones(k)
theta = pm.Dirichlet("theta", a=a)
# Since theta[5] will hold the posterior probability
# of rolling a 6 we'll compare this to the
# reference value p = 1/6 to determine the amount of bias
# in the die
six_bias = pm.Deterministic("six_bias", theta[k-1] - p)
results = pm.Multinomial("results", n=n, p=theta, observed=y)
从 3.5 版开始,PyMC3 包含了一个方便的函数,可以用平板符号绘制模型:
pm.model_to_graphviz(dice_model)
让我们使用默认的 NUTS 采样器从关节后部抽取 1000 个样本:
with dice_model:
dice_trace = pm.sample(draws=1000) *Auto-assigning NUTS sampler...
Initializing NUTS using jitter+adapt_diag...
Multiprocess sampling (4 chains in 4 jobs)
NUTS: [theta]
Sampling 4 chains: 100%|██████████| 6000/6000 [00:01<00:00, 3822.31draws/s]*
从跟踪图中,我们已经可以看到其中一个θ后验概率与其余的不一致:
with dice_model:
pm.traceplot(dice_trace, combined=True, lines={"theta": p})
我们将绘制每个θ的后验分布,并将其与我们的参考值 p 进行比较,以查看 95% HPD(最高后验密度)区间是否包括 p=1/6 。
axes = pm.plot_posterior(dice_trace,
varnames=["theta"],
ref_val=np.round(p, 3))for i, ax in enumerate(axes):
ax.set_title(f"{i+1}")
我们可以清楚地看到,掷出 6 的后验概率的 HPD 几乎不包括我们对公平骰子的期望值。
更准确地说,通过比较θ[Six]和 p ,让我们画出骰子偏向 6 的概率。
ax = pm.plot_posterior(dice_trace,
varnames=["six_bias"],
ref_val=[0])ax.set_title(f"P(Theta[Six] - {p:.2%})");
P(Theta[Six])
最后,我们可以通过计算参考线右侧 0:
six_bias = dice_trace["six_bias"]
six_bias_perc = len(six_bias[six_bias>0])/len(six_bias)
print(f'P(Six is biased) = {six_bias_perc:.2%}')**P(Six is biased) = 95.25%**
因此,我们的骰子有超过 95%的可能性偏向 6。最好买些新骰子…!
投票#1
让我们把狄利克雷多项式分布的回顾转向另一个例子,关于轮询数据。
在 BDA3 关于多变量模型的第 3.4 节,特别是关于分类数据的多项模型的第节中,作者引用了 1988 年老布什和迈克尔·杜卡基斯总统竞选中的一个不太成熟的投票数据示例。
对于那些当时不关注政治的人来说:布什以巨大优势获胜。自 1988 年以来,没有一位总统候选人能在选举人票或普选中获得与布什相同或更高的票数。
(Image credit: https://commons.wikimedia.org/wiki/File:ElectoralCollege1988-Large.png))
反正回到数据问题!设置如下:
- 1,447 名可能的选民接受了关于他们在即将到来的总统选举中的偏好的调查
- 他们的回答是:
T5 布什:727
杜卡基斯:583
其他:137 - 更多人投票给布什而不是杜卡基斯的概率有多大?即两个主要候选人的支持率有什么不同?
我们设置了数据,其中k
代表受访者的选择数量:
y = np.asarray([727, 583, 137])
n = y.sum()
k = len(y)
我们再次建立了一个简单的狄利克雷多项式模型,并加入了一个Deterministic
变量来计算兴趣值——布什和杜卡基斯的受访者概率之差。
with pm.Model() as polling_model:
# initializes the Dirichlet distribution with a uniform prior:
a = np.ones(k)
theta = pm.Dirichlet("theta", a=a)
bush_dukakis_diff = pm.Deterministic("bush_dukakis_diff",
theta[0] - theta[1])
likelihood = pm.Multinomial("likelihood",
n=n,
p=theta,
observed=y)pm.model_to_graphviz(polling_model)
with polling_model:
polling_trace = pm.sample(draws=1000)
看看布什和杜卡基斯的受访者之间的%差异,我们可以看到大部分的密度是大于 0% ,这表明布什在这次民意调查中有很大的优势。
我们还通过scipy.stats
将 Beta 分布拟合到该数据,我们可以看到,2θ值的差值的后验非常好地拟合了 Beta 分布(鉴于狄利克雷分布作为 Beta 分布的多元推广的特性,这是可以预料的)。
_, ax = plt.subplots(1,1, figsize=(10, 6))
sns.distplot(polling_trace["bush_dukakis_diff"],
bins=20, ax=ax, kde=False, fit=stats.beta)ax.axvline(0, c='g', linestyle='dotted')
ax.set_title("% Difference Bush vs Dukakis")
ax.set_xlabel("% Difference");
带有bush_dukakis_diff > 0
的样本百分比:
diff = polling_trace["bush_dukakis_diff"]
bush_dukakis_diff_perc = len(diff[diff>0])/len(diff)
print(f'P(More Responses for Bush) = {bush_dukakis_diff_perc:.0%}')**P(More Responses for Bush) = 100%**
投票#2
作为对前一个模型的扩展,BDA 的作者在第 3.10 章中包括了一个练习(练习 2),为我们提供了 1988 年总统竞选的民调数据,在辩论之一的之前取*,在之后取。*
两个多项观察值的比较:1988 年 9 月 25 日,一场总统竞选辩论的当晚,ABC 新闻对美国注册选民进行了一项调查;辩论前对 639 人进行了民意测验,辩论后对 639 名不同的人进行了民意测验。结果如表 3.2 所示。假设调查是从注册选民人口中随机抽取的独立样本。用两种不同的多项式分布对数据建模。对于 j=1,2 ,设 αj 为在调查 j 时偏好布什或杜卡基斯的选民中,偏好布什的比例。绘制α2-α1的后验密度直方图。转向布什的后验概率是多少?
让我们复制练习中的数据,将问题建模为概率模型,同样使用 PyMC3:
data = pd.DataFrame([
{"candidate": "bush", "pre": 294, "post": 288},
{"candidate": "dukakis", "pre": 307, "post": 332},
{"candidate": "other", "pre": 38, "post": 10}
], columns=["candidate", "pre", "post"])
转换为 2x3 阵列:
y = data[["pre", "post"]].T.valuesprint(y) **array([[294, 307, 38],
[288, 332, 10]])**
每次调查的受访者人数:
n = y.sum(axis=1)
print(n)**array([639, 630])**
每次调查中两个主要候选人的受访者人数:
m = y[:, :2].sum(axis=1)
print(m) **array([601, 620])**
对于这个模型,我们需要稍微不同地设置先验。我们需要 2 套,而不是 1 套theta,每个调查一套(辩论前/辩论后)。要做到这一点而不创建每个变量的特定前/后版本,我们将利用 PyMC3 的shape
参数,该参数可用于大多数(所有?)分布。
在这种情况下,我们需要一个二维形状参数,代表辩论的数量n_debates
和候选人的选择数量n_candidates
n_debates, n_candidates = y.shape
print(n_debates, n_candidates) **(2, 3)**
因此,我们需要用形状(2,3)
初始化 Dirichlet 分布,然后在需要的地方通过索引引用相关参数。
with pm.Model() as polling_model_debates:
# initializes the Dirichlet distribution with a uniform prior: shape = (n_debates, n_candidates)
a = np.ones(shape)
# This creates a separate Dirichlet distribution for each debate
# where sum of probabilities across candidates = 100%
# for each debate theta = pm.Dirichlet("theta", a=a, shape=shape)
# get the "Bush" theta for each debate, at index=0
# and normalize across supporters for the 2 major candidates bush_pref = pm.Deterministic("bush_pref", theta[:, 0] * n / m)
# to calculate probability that support for Bush
# shifted from debate 1 [0] to 2 [1] bush_shift = pm.Deterministic("bush_shift",
bush_pref[1]-bush_pref[0])
# because of the shapes of the inputs,
# this essentially creates 2 multinomials,
# one for each debate responses = pm.Multinomial("responses",
n=n, p=theta, observed=y)
对于具有多维形状的模型,最好在采样前检查各种参数的形状:
for v in polling_model_debates.unobserved_RVs:
print(v, v.tag.test_value.shape)**theta_stickbreaking__ (2, 2)
*theta (2, 3)* bush_pref (2,)
bush_shift ()**
标牌视觉效果也有所帮助:
pm.model_to_graphviz(polling_model_debates)
让我们以稍微多一点的抽取次数和调谐步骤进行采样:
with polling_model_debates:
polling_trace_debates = pm.sample(draws=3000, tune=1500)
快速查看 traceplot 以确保模型平滑收敛:
with polling_model_debates:
pm.traceplot(polling_trace_debates, combined=True)
让我们来看一下theta
的后验概率的平均值,表明辩论前&后每位候选人的支持率百分比:
s = ["pre", "post"]
candidates = data["candidate"].valuespd.DataFrame(polling_trace_debates["theta"].mean(axis=0),
index=s,
columns=candidates)
仅从平均值来看,我们可以看到布什的支持者人数可能在辩论后从 48.8%下降到 46.3%(作为两大候选人支持者的百分比):
pd.DataFrame(polling_trace_debates["bush_pref"].mean(axis=0),
index=s, columns=["bush_pref"])
让我们通过绘制布什%回应的辩论前/后值的后验分布和布什支持者辩论前/后差异的后验分布来直观地比较结果:
_, ax = plt.subplots(2,1, figsize=(10, 10))sns.distplot(polling_trace_debates["bush_pref"][:,0],
hist=False, ax=ax[0], label="Pre-Debate")sns.distplot(polling_trace_debates["bush_pref"][:,1],
hist=False, ax=ax[0], label="Post-Debate")ax[0].set_title("% Responses for Bush vs Dukakis")
ax[0].set_xlabel("% Responses");sns.distplot(polling_trace_debates["bush_shift"],
hist=True, ax=ax[1], label="P(Bush Shift)")ax[1].axvline(0, c='g', linestyle='dotted')
ax[1].set_title("% Shift Pre/Prior Debate")
ax[1].set_xlabel("% Shift");
从第二个图中,我们已经可以看到很大一部分后验密度低于 0,但让我们精确地实际计算一下辩论后支持从转向布什的概率:
bush_shift = polling_trace_debates["bush_shift"]
perc_shift = (
len(bush_shift[bush_shift > 0])
/len(bush_shift)
)
print(f'P(Shift Towards Bush) = {perc_shift:.1%}')**P(Shift Towards Bush) = 19.9%**
虽然这是一种迂回的方式来表明布什在 9 月的辩论中失去了支持,但希望这说明了概率模型(和 PyMC3)的灵活性和稳健性。
如果你对这篇文章有任何想法或反馈,请告诉我!
(这个帖子在 Github 上也有 Jupyter 笔记本。)
一台机器能打败世界上最好的网球运动员吗?
Photo by Marcus Nilsson
介绍
我是个网球爱好者。我喜欢每周打网球,看网球,甚至打梦幻网球。虽然梦幻网球不像梦幻足球那样普及,但世界各地都有相当多的人参与其中。有多种格式,但最常见的是括号。在括号格式中,在锦标赛开始之前,幻想网球运动员试图预测谁将是锦标赛中所有网球比赛的获胜者。
由于我既是一个超级网球迷,也是一个数据呆子,我一直想知道机器学习算法如何应对世界上最好的幻想网球运动员。它能打败他们吗?为了回答这个问题,我着手做了四件事:
- 为挑战设定规则
- 为挑战创建基准预测
- 测试最佳梦幻网球选手在挑战中的表现
- 建立一个机器学习模型,并在挑战赛上进行测试
术语网球运动员在这种情况下可能有点混乱,因为它既可以适用于幻想的网球运动员,也可以适用于实际参加网球比赛的网球运动员。为了清楚起见,每当我提到这位梦幻网球运动员时,我将在博客的其余部分使用 FTP 缩写。
1.为挑战设定规则
挑战将包括预测哪名选手将成为网球比赛的获胜者:
- 我将使用 2018 年所有 66 场 ATP 单打比赛中的 1758 场比赛,不包括 ATP 巡回赛决赛。之所以选择 2018 年,是因为在撰写本文时,这是最后一个完整的赛季。第 3 节解释了为什么没有选择本赛季的所有比赛。
- 只有比赛开始前可用的数据才能用来预测比赛的结果。
- 挑战的参赛者将会是:基准预测、FTP 和机器学习模型都将预测相同匹配的结果。
- 准确性将被用来衡量参赛者的预测有多好。这意味着成功预测最多比赛次数的选手将获胜。通过将正确预测的数量除以所有预测来计算准确度。如果 100 个匹配中有 50 个预测正确,准确率将是 50%。
2.为挑战创建基准预测
为了与 FTP 和机器学习模型的预测进行比较,我首先创建了一个基准预测。使用的简单策略是总是挑选排名最好的球员作为比赛的获胜者。ATP 排名显示了球员在过去 52 周的表现。
当应用这种策略时,1758 个匹配中有 1101 个被正确预测。这相当于精度为 62.6% 。
3.测试最佳梦幻网球选手在挑战中的表现
那么谁是世界上最好的 FTP 呢?由于不存在任何官方的梦幻网球排名,答案并不直接,可能有点主观。周围有许多不同的梦幻网球网站,但 www.tennisdrawchallenge.com 是一个支持全年所有 ATP 比赛的网站。它也是玩家最活跃的网站之一,有超过 1000 名玩家参加大满贯赛事。对于这个挑战,我选择了正确预测 2018 年比赛数量最多的 FTP:
Best fantasy tennis player of 2018
所以世界上最好的 FTP 预测 57%的匹配是正确的。但是等等,就 57%?考虑到抛硬币能让你得到 50%,这听起来很低。原因是括号格式,所有比赛都必须在比赛开始前预测**。所以当 FTP 做预测时,只有在第一轮比赛中,他才能绝对确定比赛中的网球选手是谁。随着锦标赛进入下一轮,预测的获胜者甚至可能不会参加比赛。自然,正确预测的数量会比在比赛开始后但每场比赛开始前预测的少。**
为了让 FTP 更公平一点,我只考虑了基于比赛中正确球员的预测。让我来解释一下 2018 年澳大利亚网球公开赛抽签的一些例子:
Grey = no previous match, Green = won previous match, Red = lost previous match
- 例 1 :第一轮的所有比赛都将被考虑在内,因为每场比赛中的两名选手在预测时都是已知的。对于这个例子,这将意味着由框 1 标记的所有 8 个匹配。
- 例 2 :在这场比赛中,双方球员都和 FTP 预测的一样,因此会被考虑在内。FTP 认为纳达尔将击败迈尔,这被证明是真的。
- 例 3 :这场比赛不算,因为其中一名球员不认识。FTP 认为这场比赛将是施瓦茨曼对哈利斯,但结果却是施瓦茨曼对路德。由于该预测是基于比赛中错误的球员做出的,因此将不予考虑。
在调整为仅包括两个玩家都已知的匹配后,FTP 预测 1758 个匹配中有 1168 个是正确的,这将产生 66.4%的准确率**。这是将对照机器学习模型进行测试的结果。**
4.建立一个机器学习模型,并在挑战赛上进行测试
与任何机器学习模型一样,我们在预测任何事情之前都需要数据。在这次挑战中,我使用了 Jeff Sackmann 提供的 ATP 数据。杰夫多年来一直免费分享高质量的网球数据,非常感谢他。
根据 ATP 数据,我创建了一组输入,模型应该根据这些输入进行训练。像玩家的排名,年龄,身高,与对手的正面交锋,胜率等等都被使用。
对于模型本身,测试了几种不同的机器学习模型。表现最好的是 XGBoost。所有的数据准备和建模细节都可以在我的 Github 资源库这里找到。
当机器学习模型预测到同样的 1758 个匹配时,它成功地获得了 1375 个正确,这相当于 78.2% 的准确率。
结论
在这篇文章中,我试图回答一台机器是否能打败世界上最好的 FTP 的问题。我找到了世界上最好的 FTP,看到了他在 2018 年 ATP 单打赛季期间对网球比赛冠军的预测有多准确。然后,我使用 XGBoost 分类器建立了一个机器学习模型,并在相同的网球比赛中进行了测试。结果是:
Results for challenge
结果不言自明。机器学习模型不仅打败了最好的 FTP。它会以巨大的优势做到这一点。
那么这是否意味着每个 FTP 都应该开始让机器为它们做决定呢?不一定。通常,在梦幻网球的世界里没有奖金,所以金钱不是主要的动机。大多数玩家参加比赛是为了荣誉和乐趣。让一台机器做所有的决定会减少一些乐趣。但大多数 FTP 可能会受益,并通过分析机器学习模型如何预测网球比赛来了解更多关于比赛的信息。
看来梦幻网球的世界仍有很大的改进潜力。
机器人能让你笑吗?—教人工智能讲笑话
是的,他几乎和我一样有趣!
A robot laughing at a friend’s joke (Pinterest)
Tito Joker 是一个幽默的 AI,它使用最先进的深度学习来讲笑话。他的目标是充分理解幽默,讲出真正有趣的笑话。
为什么他被命名为提托小丑?因为在菲律宾语中,“tito”翻译成英语就是“叔叔”的意思,而在菲律宾,我们都有那个说最幼稚笑话的叔叔!
Tito Joker tells riddle type jokes based on custom inputs typed in by users
欢迎在这个网站上与蒂托·小丑互动。
如上面的 gif 图所示,他不仅能够讲语法正确的笑话,而且还能讲出正确的笑话。
例如,他理解“小鸡为什么过马路?”,用一个在鸡过马路的上下文中有意义的地点或原因来回答。当然,他并不是一直都这样,但他经常这样(如下图)。
Tito Joker can tell as many jokes as you want given your input question
为了让他更有趣,我决定教他如何使用互联网上最流行的交流方式之一——gif!这个想法是,一旦他讲了一个笑话,他也试图展示一个与这个笑话相关的 GIF。
Tito Joker is able to show a GIF that matches the meaning of the joke
这怎么可能?
今年 2019 年,我在深度学习的自然语言处理(NLP)应用方面做了很多工作,特别关注去年发布的基于 Transformer 的预训练模型——BERT、 OpenAI GPT-2 和 XLNET 。
别担心,我不会在这里详细讨论 Transformer 架构,但下面是来自 Jay Allamar 的惊人的博客文章的解释图。
Transformer Architecture Illustration by Jay Alammar
作为一个爱开玩笑的人,我可以说我对幽默很有热情,所以模拟其复杂性的想法真的让我很兴奋。我们能否利用深度学习来建立一个实际上自己很有趣的 AI?也许,我们甚至可以把它带到一个可以做单口喜剧的地步!(见下文)
C-3PO telling a joke as a standup comedian
1.利用开放式 GPT-2 进行迁移学习
鉴于它在语言生成任务上的顶级性能,我决定使用 OpenAI GPT-2(简称 GPT2)作为 Tito Joker 的主干模型。GPT2 的目标很简单——给定所有前面的单词,预测语句的下一个单词(如下所示)。
Language modelling illustration by Jay Alammar
请注意,GPT2 被训练使用从 800 万个网页中抓取的 40GB 文本来完成这一任务。这是一个很大的文本!
现在,这一切都很有趣,但我们如何使用这个模型来创建一个讲笑话的人工智能?迁移学习 —使用预训练模型(例如 GPT2)并在另一个数据集上“微调”它的过程,该数据集包含您希望模型学习的信息。
从这里开始,很明显,方法将是收集包含幽默的文本数据集。通过在幽默数据集上微调 GPT2,我们可以创建一个新的人工智能模型,它理解幽默,并因此可以讲笑话——蒂托·小丑。
2.带有谜语式笑话的幽默数据集创建
来自 Kaggle 的笑话数据集被用于微调。它包含了 231,657 个不同格式的笑话,包括“Yo Mama”和“它需要多少个”各种笑话。
警告:该数据集包含 NSFW 笑话,因此 Tito Joker 的幽默也将反映这种性质的笑话。我计划在 Tito Joker 的未来版本中增加过滤这些内容的功能。
Kaggle is a platform that gives free access to data science competitions and open-sourced datasets
为了让 Tito Joker 更容易理解一个笑话的“概念”,我决定把这个笑话的范围限定为谜语类型的笑话。换句话说,我过滤了以“什么”、“如何”、“何时”或“为什么”开头的笑话。这使得笑话的数量下降到 65394 个。
除此之外,我还添加了一些特殊的标记,让模型能够理解一个谜语式笑话的“问题”和“答案”之间的区别。下表总结了这些情况:
Special tokens help Tito Joker understand the structure of a riddle type joke
带有特殊标志的笑话示例:
小鸡为什么要过马路?到另一边去。
更多详情请参考 Tito Joker 的预处理脚本。
3.用 GPT2 +幽默数据集进行 Tito Joker 训练
既然我们已经有了预训练的模型和幽默的数据集,我们现在可以训练 Tito Joker 了!Tito Joker 是通过对上一节的幽默数据集进行微调而创建的。通过这个过程,Tito Joker 有效地从幽默数据集中“学习”了幽默的概念。
Tito Joker 的端到端培训工作流程总结如下:
Tito Joker’s Training Workflow
在一台配有一个 T4 GPU、批量为 2 的 Google Colab 笔记本上,微调大约需要 30 分钟。另外,请注意,培训过程是使用与原始 GPT2 论文相同的语言建模目标和超参数执行的。
更多信息请参考铁托小丑训练脚本。
4.使用词性标注和 GIPHY 生成 GIF
词性标注被用来检测蒂托·乔克讲的笑话中的名词。一旦常见名词被识别出来,它们就被用来搜索 GIPHY API ,然后返回一个相关的 GIF。
比如,如果输入的段子是“为什么鸡要过马路?”,常见名词,鸡,将被检测并用于从 GIPHY 返回一个 GIF。
POS tagging illustration from nlpforhackers
请注意,我最初计划使用命名实体识别(NER),但决定从名词开始,因为“名称”在 GIPHY 上更难匹配。例如,“Lorenzo”(指我自己)不太可能返回我自己的相关 GIF,相比之下,常见的名词“boy”在 GIPHY API 上会很容易有匹配。
提托小丑怎么学才能更搞笑?
Tito Joker still has a lot to learn if he wants to be as funny as me 😃
1.对笑话的滑稽程度进行“评级”
一个反馈系统将允许用户“评价”蒂托·乔克讲的笑话。这些反馈将被储存起来,并可用于随着时间的推移不断提高 Tito Joker 的“滑稽度”。
从建模的角度来看,这可能意味着必须训练一个单独的“滑稽”模型,用于过滤产生的笑话。强力方法的一个例子是生成 100 个笑话,然后只返回这 100 个笑话中最有趣的一个。
2.控制要讲的笑话类型
语义控件将允许用户配置他们想从 Tito Joker 中体验的幽默类型。例如,我们可能想要明确地告诉 Tito Joker 产生 Yo Mama 类型的笑话,或者我们甚至可能想要明确地设置情绪,并最小化所讲笑话的毒性。
这将要求我们在培训和部署时考虑这些玩笑维度(例如玩笑类型、情绪和毒性)。他们的梦想是拥有类似于关的 TL-GAN 模型的东西,这种模型可以根据年龄、发际线和性别(以及其他因素)轻松配置模型生成的人脸。
3.给 Tito Joker 一个主题的上下文
上下文输入将允许用户给提托小丑上下文信息,他们希望提托小丑在讲笑话时考虑这些信息。这是基于一个想法,即语境是一个笑话的智慧的来源。例如,单口喜剧演员被认为是有趣的,因为他们能够在他们讲的笑话中嵌入相关的概念——政治、文化、时事。
实现这一点的一种方法是使用类似的规范,用 BERT 来表示 Q & A ,其中问题和上下文段落都被用作模型的输入。想象一下,能够输入一篇关于唐纳德·特朗普的文章,以向蒂托·小丑提供在讲笑话时要考虑哪种信息的背景(例如,墨西哥边境上的墙、移民、与中国的贸易战等)。).
结论
用人工智能模拟幽默仍然是一项正在进行的工作,但还有很多实验有待进行。如果我们继续朝着这个目标努力,我相信很快我们就能训练提托·小丑自己变得有趣。
如果你想试用 Tito Joker,了解更多的方法,甚至为改进模型做出贡献,请随时查看网站和 github repo 。
如果还有任何问题,请不要犹豫,在下面评论,给我发电子邮件(lorenzo.ampil@gmail.com),或者通过 Linkedin 或 Twitter 给我发信息。
承认
特别感谢:
- 拥抱脸因为他们使用 PyTorch 实现了 OpenAI GPT-2
- Streamlit 让部署 Tito Joker 成为一个网络应用变得非常简单
- 思维机器数据科学公司赞助了我运行 Tito Joker 的服务器
- 我的 TM 同事在这篇文章上给了我大量建设性的反馈。
- 空间让他们的 POS 和 NER 模型变得非常简单易用
参考
- 拉德福德等人(2018)“语言模型是无监督的多任务学习者”来自https://cdn . open ai . com/better-Language-Models/Language _ Models _ are _ Unsupervised _ multishop _ Learners . pdf
- OpenAI (2019)“更好的语言模型及其含义”,来自 https://openai.com/blog/better-language-models/#fn1
- 来自 https://jalammar.github.io/illustrated-gpt2/的 Allamar,J. (2019)“图解 GPT-2(可视化变压器语言模型)”
- 关,S. (2018)“使用人工智能生成定制的照片级真实感人脸”来自https://blog . insightdatascience . com/Generating-custom-photo-realistic-faces-using-AI-d 170 B1 b 59255
- Devlin 等人(2018)“BERT:用于语言理解的深度双向转换器的预训练”,来自https://arxiv.org/pdf/1810.04805.pdf
AI 能解决气候变化吗?
AI 是害了还是助了气候??
Photo by Markus Spiske on Unsplash
人工智能是巨大的,大到足以让 Ng 教授说“人工智能是新的电力”。所以我们知道它将被用于各种不同的行业。AI 的主要优势可以总结为一个词,自动化。由于智能代理/模型,它现在可以执行需要基本人类智能的复杂任务。
然而,一个很大的警告是,这些模型消耗大量的数据和电力。在计算机视觉和自然语言处理中,模型的碳足迹一直在增加,这种趋势不仅对环境不友好,而且昂贵,增加了参与这项研究的障碍。
坏了
Image from[2]
深度学习模型多年来变得如此之好的一个主要原因是由于模型规模的增加,无论是深度还是宽度。但随着网络中可训练参数数量的增加,训练模型所需的电力也在增加。更多的电力意味着更多的碳足迹。
碳足迹有多少?
嗯……对某些车型来说,它产生了 284 吨二氧化碳,是普通汽车一生排放量的五倍。这太糟糕了。当我们观察研究的方向时,我不认为这是结束,目前人工智能最有前途的方向之一是神经架构搜索 (NAS)。
NAS 基本上是在创建一个人工智能代理,它训练另一个人工智能模型以最有效的方式执行任务。NAS 研究的主要驱动力是去除手工工程部分。这意味着研究人员将能够让他们的计算机运行几天甚至几个月,而代理人正在寻找最有效的架构。想象一下这会留下多少碳足迹。
考虑到所有这些,我们应该停止人工智能研究吗?
等等!这并不全是坏事!
Photo by Nikita Kachanovsky on Unsplash
乍一看,人工智能似乎只对气候有害。但事实并非如此。
人工智能被用于减少碳足迹的例子很多。
例如,与谷歌合作的 Deep Mind 能够减少谷歌数据中心的能源使用。减少足够减少 40%的冷却费用!多个数据中心可以受益于这项技术,如脸书、微软和亚马逊。
这只是一个例子,在科技中心。但是机器学习可以应用于科技之外的许多不同领域。材料科学等领域可以使用机器学习来创造低碳材料,天气可以更准确地预测,运输可以更有效,智能建筑可以调节温度,同时使用更少的能源,机器学习可以为阻止气候变化提供很多东西。
所以总而言之,像大多数技术一样,人工智能可以用于好的方面,也可以用于坏的方面。而在开发过程中,当研究人员测试和建造不同的类型时,将会产生大量的碳足迹。模型建成后,我认为它可以给这个世界带来许多气候友好的应用。
与此同时,我们的工作是围绕人工智能和气候变化制定更好的政策,正如本文中所写的。我很想知道这项创新进展如何。更多类似的文章请访问我的网站或我的 YouTube 频道。
参考
- r .施瓦茨、j .道奇、n .史密斯和 o .埃齐奥尼(2019 年)。绿色人工智能。arXiv.org。检索于 2019 年 10 月 22 日,来自https://arxiv.org/abs/1907.10597
- 人工智能和计算。(2018).OpenAI。检索于 2019 年 10 月 22 日,来自https://openai.com/blog/ai-and-compute/
- 人工智能的碳足迹是汽车的 5 倍。(2019).大众力学。检索于 2019 年 10 月 22 日,来自https://www . popular mechanics . com/technology/infra structure/a 27793543/artificial-intelligence-carbon-footprint/# target text = The % 20 act % 20 of % 20 training % 20a,emissions % 20 of % 20 an % 20 average % 20 car。&target text = It % 20 was % 20 trained % 20 to % 20 process % 20 words % 20 from % 208% 2000 万%20web%20pages 。
- DeepMind AI 将谷歌数据中心的冷却费用降低了 40%。(2019).深度思维。检索于 2019 年 10 月 22 日,来自https://deep mind . com/blog/article/deep mind-ai-reduces-Google-data-centre-cooling-bill-40
- 人工智能和气候变化:它们是如何联系在一起的,以及我们能做些什么。(2019).中等。检索于 2019 年 10 月 22 日,来自https://medium . com/@ ai now institute/ai-and-climate-change-how-they-connected-and-what-we-can-do-about-it-6a A8 d 0 F5 b 32 c
- 人工智能可以帮助应对气候变化——这里有八种方法。(2019).边缘。检索 2019 年 10 月 22 日,来自https://www . the verge . com/2019/6/25/18744034/ai-人工智能-ml-气候变化-战斗-阻截
AI 能写得像莎士比亚吗?
许多真话都是在玩笑中说出来的
——莎士比亚、 李尔王
“啊,小心,我的主,嫉妒;这是绿眼睛的怪物,它嘲笑它所吃的肉。
――威廉·莎士比亚, 奥赛罗
有一颗星星在跳舞,在那颗星星下,我诞生了
――莎士比亚, 无事生非
谁能像莎士比亚那样写作?或者像莎士比亚那样拼写?我们能教人工智能像莎士比亚一样写作吗?还是这是一个无望的任务?一个 AI 神经网络能否像李尔王一样描述绝望,像奥赛罗一样感受嫉妒,或者像贝内迪克一样运用幽默?理论上,如果我们能教会它,没有理由不这样做。
从麻省理工学院的威廉莎士比亚全集网站上,我下载了三部著名的莎士比亚名著:《李尔王》、《奥赛罗》和《无事生非》。然后我在这个语料库上训练了一个深度学习 递归神经网络(RNN) 带有一个隐藏层的长短期记忆(LSTM)单元来产生自由文本。
神经网络能够像莎士比亚那样学习写作吗?如果是的话,它在模仿诗人风格方面走了多远?它能够为剧中的每一个角色产生一个有意义的文本吗?在人工智能情节中,苔丝狄蒙娜会遇到李尔王吗?这会引发奥赛罗的嫉妒吗?悲剧会战胜喜剧吗?每个角色会保持和原版戏剧一样的说话风格吗?
我相信你有更多的问题。所以,事不宜迟,让我们看看我们的深度学习网络是否能够产生诗歌,或者仅仅是装傻。
用 LSTM 神经网络生成自由文本
递归神经网络(RNN)已经被成功地用于生成自由文本。用于自由文本生成的最常见的神经网络架构依赖于至少一个 LSTM 层。
为了训练我们的第一个 Shakespeare simulator,我使用了一个只有三层的神经网络:输入层、LSTM 层和输出层(图 1)。
该网络在字符级被训练。也就是说,从输入文本中生成 m 个字符的序列,并输入到网络中。
每个字符都使用热零编码进行编码。这意味着每个字符由大小为 n 的向量表示,其中 n 是来自输入文本语料库的字符集的大小。
将大小为[m,n]的全部输入张量输入到网络中。训练网络将位置 m+1 处的下一个字符与前 m 个字符相关联。
所有这些导致了以下网络:
- 具有 n 个单位的输入层将接受[m,n]个张量,其中 n 是字符集的大小,m 是用于预测的过去样本(本例中为字符)的数量。我们任意选择 m=100,估计 100 个过去的字符可能足以预测第 101 个字符。当然,字符集的大小 n 取决于输入的语料库。
- 对于隐藏层,我们使用了 512 个 LSTM 单位。需要相对较高数量的 LSTM 单元来处理所有这些(过去 m 个字符-下一个字符)关联。
- 最后,最后一层包括 n 个 softmax 激活单元,其中 n 也是字符集的大小。事实上,这一层应该为字典中的每一个字符生成概率数组。因此,n 个输出单元,每个字符概率一个。
Figure 1. The deep learning LSTM-based neural network we used to generate free text. n input neurons, 512 hidden LSTM units, an output layer of n softmax units where n is the character set size, in this case the number of characters used in the training set.
注意,为了避免过度拟合,在 LSTM 层和输出密集层之间的训练期间,临时引入了中间的脱落层。丢弃层选择在训练阶段的每次迭代期间移除一些随机单元。然后移除脱落层用于部署。
构建、训练和部署神经网络
该网络接受了《李尔王》(King Lear)、《奥赛罗》(Othello)和《无事生非》(Ado About)的全文训练,这些文本可从威廉莎士比亚全集网站(The Complete of William Shakespeare)获得,共有 13298 个句子。
使用由 KNIME 分析平台提供的 Keras 和 TensorFlow 的基于 GUI 的集成来构建、训练和部署上述神经网络。
构建和训练网络的工作流程如图 2 所示。图 3 显示了部署网络逐个字符预测最终文本的工作流程。这两个工作流都是从博客帖子“从前…由 LSTM 网络”中实现的工作流复制和改编的,其中一个类似的网络被训练和部署来生成自由文本,已经对来自格林童话的文本进行了训练。这两个工作流都可以从 KNIME 示例服务器的 04 _ Analytics/14 _ Deep _ Learning/02 _ Keras/11 _ Generate _ Fairy _ Tales 下免费下载。
在图 2 中,定义网络结构部分(左上角)中的棕色块(节点)构建了神经网络的不同层。预处理和编码部分(左下)中的节点对数据进行清理、标准化、整形和转换。最后,训练由 Keras 网络学习者节点执行,并且网络被存储起来以供部署。
请注意,如果训练集很大,这个网络可能需要相当长的时间来训练。可以通过将 KNIME Analytics Platform 指向一个用于 GPU 的 Keras 安装来加快速度。
图 3 中的部署工作流读取并使用之前训练的网络来预测自由文本,一个字符接一个字符。
Figure 2. The training workflow trains a neural network (62 inputs -> 512 LSTM -> 62 outputs) to predict the next character in the text, based on the previous 100 characters. Training set consists of the texts of “King Lear,” “Othello,” and “Much Ado About Nothing” by William Shakespeare. Thus, the network should learn to build words and sentences in a Shakespearean style.
Figure 3. The deployment workflow takes 100 characters as the start and then generates text character after character in a loop, until 1,000 characters are generated, making the full, final Shakespeare-like text.
人工智能生成的莎士比亚文本
下面是一些结果,在对整个数据集(三部选定的戏剧)进行 50 个时期的训练后,使用 100 个过去的字符作为输入张量,并递归生成 1000 个新字符。
让我们从奥赛罗和苔丝狄蒙娜之间的对话(斜体)的 100 个字符开始,然后看看我们的网络将如何继续(纯文本)。
哦,我美丽的勇士!
——苔丝狄蒙娜
我亲爱的奥赛罗!
奥赛罗看到你比我先到这里来,我感到非常惊奇。哦,我灵魂的快乐!我是一个小人物。
——格洛斯特
我不知道,亲爱的:
我从心里发现你像个小偷
说皮尔查斯会好起来的。
将军说话就是这么
转一个人,我觉得,besoou。
-凯西奥先生,我请你撒谎:这只手里没有一份温柔和谈论;我不会被派遣威胁。
我们的好老朋友,
居士安抚国事,为他求情;
我会骗你更快!
和嫁妆的祝福:
净出足够做你;
还有那封信中的摩尔人是有缺陷的!阿布霍雷,天堂,我要去 sor
和对方也一样。
——奥赛罗
我看到他的演讲对我这样的考验,
他将生活在谎言的沼泽里
他和女儿
是一个最可怜的人,
他是这个国家最可怜的人,
一个被许多人称之为生命的人
一个不得不失去孩子的人。
先生,对我妹妹?
——奥斯瓦德我求求你,牵着你的手:你可以接受这一切,让他难过,让天堂
凯西奥把这句话藏在心里
让我说:我会永远…
— —
当苔丝狄蒙娜从对话中消失时,《李尔王》中的几个次要角色(格洛斯特、里根和奥斯瓦尔德)慢慢出现在场景中。我们从三部戏剧的不同台词出发,创造了其他自由文本,有趣的是,我们注意到悲剧《奥赛罗》和《李尔王》中的角色经常混合在一起,而喜剧《无事生非》中的角色似乎更自成一体。
该文本使用莎士比亚英语中的单词及其特有的复杂句子结构生成。不是所有的句子都有完美的意义,但大多数似乎都有。还要注意,次要角色被分配了较短的对话,而在这个例子中,奥赛罗和凯西奥得到了最长的发言——这是应该的。
用人工智能写出一个原始场景
让我们使用前 100 个字符(同样是斜体)来触发一个新的场景。在这里,我介绍了关键字“场景”、地点、涉及的角色以及第一个发言的角色的名字。神经网络完成剩下的工作。
场景一.
威尼斯。一条街道。
输入罗德利哥和伊阿古
苔丝狄蒙娜请告诉我凯西奥的事。
是的,所以我听到写信给 prive 和那里,
她会看到他现在如此巫妖 wor 老窟,
和最好的良心比在这场革命反对他:
有儿子反对父亲,
和你父亲的儿子,我们这个时代最好的没有 excel 你的忠告手表
最坏的不是一个温柔的好战的岛屿,
分裂必须采取的耻辱
的报复
让我们的命运支撑到一个力量,
在他们的本性中的视力,让安全地离开机架:我发誓,是这样的
,她会送回我的信使。
-格洛斯特
我看到枪托上的铁锈。
——李尔王
多好的一辆车啊,我可以认路
不应该这样,鄙视我的兄弟;
我已经超过了他,告诉我我很害怕,
她可能是诚实的,但他已经承认在他身上娱乐
,并认为下一个方式玷污它,
主 commet 至少
会让她喘不过气来,
她可能…
— —
事实证明,创造一个新场景比继续现有场景要困难得多。《苔丝狄蒙娜的谈话》开篇不错,和原著一致。然而,我不确定我能坚持到底。
用人工智能混合莎士比亚和现代英语
但说真的,一个产生古英语文本的人工智能引擎有多大用处?
我们能不能用一点莎士比亚的作品来改进现在的英语句子?让我们给我们受过莎士比亚训练的网络输入一些现代文本,看看会出现什么。
那么,什么样的日常,现代文本可以做一点莎士比亚的改进呢?软件许可协议?让我们看看网络能让许可协议的开始变得多有趣(斜体部分)。
本许可证是指 GNU 通用公共许可证的版本。版权也意味着版权——比克,
把我的任何东西交给他的剑
交给他的盐和最隐秘的散漫是如此为歌唱,但不是在他的事上比那更应肯定的是将被出售
作为主人比较,不要活在叛徒。祝福你的五个智慧!
——肯特
O 可惜!
先生,现在哪里还有耐心,
这离海那么远,还要招标拆除
那么多褶皱的救和诚。
——布拉班西奥
我一定不认为凯西奥的土耳其人在奇怪的会见一个魔术师的婴儿床是辱骂 libe 说
我可以欺骗他最好的优势,
在她的预言公平一点,目前在你的权力;谢谢你,先生。
-奥尔巴尼
格洛斯特,我会证明他的运动和第一 accuriors 和警卫和白色的谈话。
——李尔王
小偷在哪里?你永远也不会让船长们把信送到沼地去,如果他生气了,我们没有更好的东西就一定会值钱
——里根
我请求你,有一个比我想的更多的理由来宣布我的心,热
— —
拯救、诚实、小偷、主人、叛徒和欺骗这些词似乎符合上下文。还要注意,从许可协议的起始文本中萌发的对话有趣地主要涉及戏剧中次要的、不太悲惨的角色。
至于其他的,不可理解的部分对我来说就像原始的法律语言一样不可理解。引用我们电视网的话,“先生,现在哪里有耐心了……”
用 AI 做莎士比亚说唱
最后,让我们给我们的莎士比亚式英语人工智能注入一些不那么生硬的现代语言——一些有创意的东西。在一些说唱歌词中加入一点莎士比亚的风格怎么样?那会改变意思还是只改变单词?同样,让我们从一首说唱歌曲中触发 100 个字符的自由文本的生成。
她在你的 b***上吸着饼干,thot,thot,thot thot
在烹饪同伴,*而她所能做到的最好的不是一个男人。
诚信,持有,我恳求你的恩典,—
——李尔王
那么他还有很多。
——李尔王
你已经看到了这种平淡的一部分,我原以为会看到塞弗永远不会第二次乘风破浪去捕捉那邪恶的恶魔。
仍然通过那条我不知道该怎么办的路。
——奥赛罗
你看见她了吗?啊,不幸的女孩!
先生,这个走投无路的混蛋!什么消息?
看错了我爸!
——李尔王
你说什么?
——肯特先生,我的确认识你;去荒野和雨中,我被她带走了我的姐妹?
——李尔王
不不不!城堡在哪里?
进入格洛斯特,与法国国王和科迪莉娅·高纳里尔
先生,我没有想到这一点。
——伊阿古
的确!
——奥赛罗
的确!是的,的确是:德西姆,先生。
——康沃尔
叹着气,会!
——奥赛罗
你看这张纸我该怎么抬出一个家伙来,那使他的儿子成为一个可怜的穷权力
那使他的儿子
下雨的时候魔鬼发怒了!我已经从寒风中失去了国王
— —
有趣的是,人工智能生成的文本谈论了一个不快乐的女孩、一个邪恶的恶魔和一个绝望的混蛋,这些词和其他词表达的概念非常接近许多说唱歌曲中包含的概念。
深度学习从莎士比亚身上学到了什么
我们已经完成了这个实验。我们训练了一个带有隐藏 LSTM 层的递归神经网络来生成自由文本。我们学到了什么?
总而言之,该网络是根据莎士比亚戏剧《李尔王》、《奥赛罗》和《无事生非》的全文进行训练的。它学会了用莎士比亚的风格创作自由文本。它只需要一个 100 个字符的初始序列来触发自由文本的生成。
我们展示了一些不同的结果。我们从奥赛罗和苔丝狄蒙娜之间的对话开始,看看网络将如何继续下去。我们还根据我们提供的角色和地点,让网络写了一个全新的场景。最后,我们通过在许可协议文本和说唱歌词文本中引入一点莎士比亚的风格,探索了用莎士比亚英语改进现代英语的可能性。有趣的是,莎士比亚英语中与上下文相关的单词出现在自由生成的文本中。
这些结果很有趣,因为真实的莎士比亚英语单词被用来形成更复杂的句子结构,即使是从现代英语句子开始。神经网络正确地识别主要或次要字符,给他们或多或少的文本。拼写和标点大多准确,甚至诗歌风格,即文本的节奏,遵循莎士比亚的风格。
当然,就更有意义的对话而言,试验数据集大小、神经单元和网络架构可能会带来更好的结果。
首次发表于 信息世界。
人工智能能帮助医疗决策吗?
基于强化学习的化疗智能医生
将机器学习应用于医学领域的研究越来越受到关注。例如,计算机视觉已经被证明是为医生和医学研究人员提供分析信息的有价值的工具。
我想探索智能机器是否可以直接扮演医生的角色——自主做出医疗决策。在这个项目中,我创造了一个基于强化学习的智能医生,它可以根据患者的癌症进展情况制定最佳的化疗方案。
注:这是我提交给 2019 年纽约市科学与工程博览会的科学博览会项目。
什么是强化学习?
听说过 AlphaGo 吗? 阿尔法星?
Left: Taken From The Guardian’s article: “World’s best Go player flummoxed by Google’s ‘godlike’ AlphaGo”, Right: Taken from The Register’s article: “Human StarCraft II e-athletes crushed by neural net ace — DeepMind’s AlphaStar”
在媒体上,强化学习通常出现在游戏环境中;AI 机器人在围棋 (Deepmind 的 alpha Go)星际争霸 (Deepmind 的 alpha star)Dota(open AI 的 OpenAI Five)等游戏中击败人类职业选手。
本质上,强化学习是一个与最佳决策相关的机器学习领域:训练一个“代理”根据当前状态的观察做出最佳动作,以达到定义的理想状态。
在强化学习中,最优策略(将状态映射到最优动作的函数)是通过“试错”错误方法来学习的。代理基于对当前状态的观察来概率性地选择动作,观察结果状态,并根据定义的性能度量来接收“奖励”。也就是说,用于训练强化学习模型的数据是{ *状态、动作、奖励、下一状态}的元组。*利用这些数据,代理评估所选动作的值,并更新其参数,以便具有更好值的动作——“最优动作”——将具有更高的被选择概率。
这是对强化学习的一个非常肤浅的解释——看看我的其他博文和,我在那里详细解释了核心概念和算法!
数据收集
作为一名独立的高中研究者,我不具备获取真实医学数据的法律和专业资格。为了克服这一点,我基于一个数学模型创建了一个化疗治疗模拟,该模型表示给定当前生理状态和应用的化疗剂量时患者癌症进展的变化。
该模型由(赵,2009)中构建的常微分方程组表示:
其中 W 、 M 、 D 分别代表毒性指数、肿瘤大小指数和归一化剂量, a、b、d 为(赵,2009)中确定的模型常数。{ M > 0 }术语表示一个至关重要的假设,即一旦肿瘤大小指数减少到 0,患者就被认为是永远治愈了,并且不会有癌症复发。 N 项表示高斯噪声,该噪声用于扰乱动态,试图模拟患者间的变异性和随机生理事件。
利用这个模型,我创建了一个化疗模拟环境,灵感来自于 *OpenAI Gym。*也就是说,环境包含成员函数:
reset()
:创建一个随机的初始患者实例。reward(state, action)
:根据当前和最终的患者生理状态评估应用剂量。返回一个数字“奖励”step(state, action)
:返回后续病人状态,并奖励给定当前状态的一个当前动作。
使用这种模拟,我们可以创建合成但似是而非的治疗数据及其相应的化疗治疗方案。然后我们用它来训练我们聪明的医生。
奖励函数
奖励函数非常重要,因为它塑造了代理人试图实现的最优行为。如果你看看强化学习的一般目标函数:
即最大化预期的情景累积回报,代理人行为的优化在很大程度上取决于回报函数(在各种强化学习算法中——如在培训我的医生时所使用的——目标函数中可以添加其他项)。
我们如何评价智能医师的治疗方案?
那么,我们如何构建一个奖励函数来恰当地解决医生的目标减少肿瘤大小,同时控制累积毒性?
以下是我们如何评估聪明的医生的决定的分析:
- 如果治疗导致肿瘤尺寸减小,则奖励为正;如果治疗导致肿瘤尺寸增大,则奖励为负。
- 如果治疗导致毒性降低,则奖励为正;如果治疗导致毒性增加,则奖励为负。
- 如果患者“治愈”(即肿瘤大小缩小至 0),则为高阳性奖励。
- 如果患者“死亡”(即肿瘤大小和毒性指数的加权和超过规定的阈值),则为高负回报。
及其奖励函数公式:
培养聪明的医生
智能医师基于软演员评论家算法(Haarnoja,2018)。我打算跳过关于算法的细节(因为帖子会太长),但如果有兴趣,你可以看看 图马斯·哈尔诺贾的论文 ,或者 瓦伊沙克诉库马尔的博文 。
本质上,软演员评论家可以:
- 学习连续行动空间中的最优策略。这适合于化疗任务,因为我们想要产生我们想要应用于患者的精确的最佳剂量。相反,在离散行动空间中学习,在这种情况下,意味着从有限的、少量的预定义剂量中进行选择,永远不会是真正的最优决策(只是给定选择中的最优选择)。
- 通过最大化状态空间探索非常高效和有效地学习最优策略。软行动者批评家通过将熵项结合到其目标函数中,抑制贪婪的行动选择,并鼓励代理在学习时尽可能随机地行动。
所以,这里有一个培训聪明医生的概述:
那就是:
- 我们生成一个随机的病人实例
- 我们用现有的模型进行化疗
- 将癌症进展和治疗方案存储在智能医生的存储器中
- 用智能医生记忆中随机批次的癌症进展和治疗方案更新神经网络参数
- 对 1000 个生成的患者重复步骤 1~4。
测试训练有素的医生
在智能医生对 1000 名患者进行训练后,它在另一组 1000 名假设的患者身上进行了测试。
对于这 1000 名患者,医生展示了以下统计数据:
一般来说,在治疗结束时,医生能够完全减少患者的肿瘤块,而毒性仍然存在,但没有达到致命水平。当“治愈”被定义为最终肿瘤块时< 0.01 and final toxicity index < 0.8, ,医生治愈了 1000 名模拟患者中的 947 名。
下面是从医生那里摘录的一个成功治疗进展的例子:
Left: Cancer Progression (Blue: Tumor Mass, Orange: Toxicity), Right: optimal dosage regimen produced by intelligent physician
在这种情况下,医生似乎在初始阶段使用了大剂量治疗来快速缩小肿瘤大小,然后使用小剂量至零剂量来逐渐减少累积的毒性。
讨论
在训练聪明的医生制定最佳化疗方案方面取得了成功。医生可以有效地减小肿瘤大小,同时将毒性保持在非致命水平,并最终达到完全安全的水平。
然而,更重要的问题在于人工智能的伦理。
医疗领域的决策具有极高的风险。在癌症治疗的背景下,患者没有机会尝试多种治疗方案。因此,我必须承认我所采用的方法中的问题,以及机器学习方法的固有弱点:
- 这个模型只能和它得到的数据一样好。数学模型很难复制病人之间的变异性和决定真实世界动态的随机事件。因此,我的方法对于现实世界的应用来说永远不够健壮。
- 强化学习在现实世界的应用中变得很成问题,因为我们无法在元层面上预测或解释它的行为。我们所知道的是,行为是由定义的奖励函数塑造的,是通过数百万个数据点的训练获得的。
- 尤其是在复杂、高维的状态和动作空间中,强化学习在面对未知条件时往往泛化能力很差。因此,我们永远无法保证在现实生活中部署时不会发生灾难性的行为。
然而,现代强化学习是一个相对年轻的领域,并且正在以非常快的速度增长——我们永远无法衡量它在几十年后会有什么能力。无论如何,人工智能在现实世界中的应用应该以极大的责任感和谨慎来对待。
参考文献(在这篇博文中)
- 赵,,*癌症临床试验的强化学习设计,*北卡罗来纳大学教堂山分校,2009。
- Tuomas Haarnoja,Aurick Zhou,Pieter Abbeel,和 Sergey Levine,软行动者-批评家:具有随机行动者的非策略最大熵深度强化学习,第 35 届机器学习国际会议论文集,2018 年,ICML,瑞典斯德哥尔摩,stockholmsssan,2018 年 7 月 10 日至 15 日,2018 年,第 1856-1865 页。
自动化机器学习能胜过手工模型吗?
Can Auto-Keras really find better models than you? — Photo by Annie Theby on Unsplash
在真实数据集上测试 Auto-Keras 模型
自动机器学习(AutoML)可用于自动寻找和训练机器学习模型。您不再需要自己创建模型,AutoMl 算法将分析您的数据并自动选择最佳模型。
但是那些模型真的有多好呢?它们能与定制模型相比吗?或者它们更好吗?我们再也不需要挑选另一个模特了吗?让我们来了解一下!
简介:Auto-Keras
像谷歌这样的公司已经提供了 AutoML 产品,但是有了 Auto-Keras,还有一个开源的解决方案。在官方入门示例中,Auto-Keras 用于为 MNIST 数据集寻找最佳神经架构。当我尝试这个例子时,得到的模型达到了大约 98%的分数。这令人印象深刻,所以我决定使用 Auto-Keras 尝试在 Kaggle Titanic 数据集 上击败自己。
我在这次比赛中的最好成绩是大约 80%的精确度,这使我目前在所有参赛者中排名前 900。这是一个相当不错的分数,所以让我们看看 Auto-Keras 是否能超过我!
你可以在这里找到笔记本的完整代码
设置
我用谷歌 Colab 做这个项目。要在 Google Colab 中安装 Auto-Keras,只需运行:
!pip install autokeras
如果您想在本地运行它,您可以使用 pip 从命令行安装 Auto-Keras。
数据
对于这个例子,我使用了可以从 Kaggle 竞赛下载的数据集。要使用 Auto-Keras 模型中的数据,需要将其作为 numpy 数组导入。因为 Titanic 数据包含文本数据,所以我们需要先做一些预处理:
这是我为自己的泰坦尼克号解决方案所做的同样的预处理和特征工程。当然,每个项目的预处理是不同的,但是如果您想要使用 Auto-Keras,您将需要提供 numpy 数组。
预处理后,您可以将数据作为训练和测试数据进行加载:
寻找合适的模型
当你的数据集有了 x_train 、 y_train 、 x_test 和 y_test 之后,你可以使用 fit 方法找到最佳模型并训练它:
就是这样——两行代码就是您所需要的全部。其他一切都是自动发生的。
结果
训练完模型后,我用它来生成预测,并将预测上传到 Kaggle。我的分数是 0.79904。这比我的手工模型略差,但我们需要考虑到 Auto-Keras 仍然很新。TabularClassifier 目前仅支持 LGBMClassifier,这对于该数据集来说并不理想。如果这个项目将来继续下去,我们可能会有更好的结果。此外,找到模型非常快速和容易,所以我认为这是一个非常好的和有希望的结果!
利弊
虽然使用生成的模型来生成预测非常容易,但是您会丢失许多关于模型的知识。如果你不主动搜索,你就不知道结果模型的架构和参数值——毕竟它们是自动选择的,所以你永远不会真正需要它们。虽然这对初学者和没有经验的机器学习工程师来说可能是一件好事,但如果你后来试图适应或扩展你的模型,这可能会变得危险。
“黑盒”模型已经在机器学习项目中进行了大量讨论,但当使用 AutoML 时,整个过程甚至变得更像是一个黑盒——你只需扔进一些数据,然后期待最好的结果。
在你的机器学习项目中实现 AutoML 时,这些是你需要注意的一些风险。
对未来工作的意义
那么,AutoML 是否消除了对定制模型的需求?不,可能不会。
它能帮助你创造更好的模型吗?大概吧。
例如,您可以使用它快速找到并训练好的基础模型,稍后您可以自己对其进行改进。您还可以快速尝试不同的特性工程策略,以获得一种最佳效果的感觉。试一试,看看如何在自己的项目中实现。
我认为 AutoML 可以在未来对许多机器学习项目产生重大影响——我期待着这一领域的进一步发展和改进。
有偏见的人能创造出无偏的算法吗?
算法已经在很大程度上存在于我们之中。他们中的一些人做出重要的决定,如帮助司法系统确定累犯的可能性,支持是否延长贷款或投资哪些股票的决定,甚至诊断我们的细胞样本是否是恶性的,这决定了我们接受的治疗和提供的保险。
虽然它们的使用具有巨大的潜力来帮助我们变得更加准确和做出更好的决策,但它们也带来了一系列问题,包括隐私问题、偏见风险、错误、责任问题和缺乏透明度。
人工智能的广泛采用依赖于信任。只有当我们了解一个算法是如何做出决定的,如果我们了解它是如何工作的,我们才能认为这个算法是可信的。
因此,可解释性和透明性是可信算法的两个重要特征。
产出的公平性也是建立信任的关键。然而,算法在其生命周期的每一步都可能出现偏差:
1.算法本身的发展会有偏差,称为技术偏差。
2.训练数据集可以包含偏差。例如,如果我们向算法提供样本,其中某个特定种族群体相对于其在总人口中所占的份额而言代表过多,则该算法会根据学习到的比例调整其数学预测。
3.实际数据集可能存在固有偏差。从政的男性人数多于女性。这是一个数学上的确定性,算法不会改变,但会在其预测中重现。
4.当未知样本出现时,训练算法的反馈回路可能在其响应中有偏差,并在算法中建立偏差
5.用户对算法的配置可以反映他们的文化和经验偏见
6.最糟糕的是,这种算法几乎不可解,可能会提供完全意想不到的输出
偏见是一件复杂的事情。
数据偏倚的定义意味着可用数据不能代表研究的总体或现象。当算法的输出不是由目标人群的真实构成驱动时,它是有偏差的。然后,它产生的决策没有数学准确性的支持,被认为是不公平的。
然而,当目标人群有偏差时会发生什么?
无偏算法代表我们有偏见的世界吗?
在许多情况下,结果是有偏见的,因为现实是有偏见的。做生意的男人比女人多。从政的黑人比白人少。偏差是数学上的必然。一个算法可能是“正确的”、“可信的”,但仍会延续过去的不平等。
这种类型的偏见是人口本身固有的,消除这种偏见更多的是有意识地决定要么忠于我们有偏见的世界的现实,要么为我们希望成为的世界建立我们的算法。
如何避免算法中的偏差
有许多因素被普遍认为对限制算法中的偏差风险很重要:
**透明。**绝对清楚算法是如何工作的。
**可交代性。**能够理解一个决定是如何达成的,可以质疑思维过程和现场偏差。根据这一原则,所谓的“暗箱操作”是完全不可接受的。
**培训数据可用性。**训练数据量非常重要,可用于训练算法的数据越多,算法就越精确。但是数据集也必须代表我们打算研究的人群,以减少偏倚的风险。
**监控算法性能。**设置正确的参数并定期抽查。
人工监督。这意味着一种“人在回路中”的方法,并且如果算法没有按照预期的方式运行,就有可能忽略该算法。
**每一步都要考虑到人。**最终,算法会做出影响人们生活的决策。在生命周期的每个阶段考虑人的影响有助于更好地确定何时应该有人参与,在哪里选择而不是决策可能是一个好主意,以及何时完全依赖算法是安全的。
**多样性。**从不同的角度审查算法可以更早地识别潜在的缺失。在不同的团队中工作有助于避免算法偏差。
人类 vs 机器
我们未来的关键是尽早思考人机关系应该是什么样子。
在我们与算法的关系中设置正确的先例是很重要的。
我们是否在为算法提供权威和正当性假设,让我们受制于它们的决定?
算法从来没有好坏之分。然而,它们有可能以精确的数学方式伤害我们。
与人类相比,算法决策可以导致更受数据驱动、更客观和更公平的决定,但它也可能导致歧视和不正确的结果。
有没有可能使我们成为人类的恰恰是这样一个事实,即数学的精确性并不能决定我们所做的一切?
正如汉娜·弗莱在《Hello World》中所说,“也许将算法视为某种权威正是我们的错误所在”。
算法可能更好地用于支持人类决策,而不是决策。我们应该利用算法擅长的东西,并将其与人类更擅长的东西结合起来,而不是为算法提供不容置疑的权力和权威以及委派责任的借口。
算法并不完美,但如前所述,人类也不总是对的。然而,算法可以支持人类,并为他们提供一种工具,在某些情况下变得更公平、更准确、更有效。
鉴于我们最终要对算法的行为负责,难道我们不应该确保自己保留这一权力吗?
持有算法账户
由于知识产权的原因,许多私有和公共算法目前都是不透明或不可解释的。打着捍卫商业秘密或保护知识产权的旗号,他们在未经深入审查的情况下影响着人类生活。
作为一个社会,我们看到了依靠算法来更深入地了解人,最终了解客户,并为他们提供渴望已久的个性化产品和服务的好处。
但反过来作为一个社会,我们也有责任确保它可以避免对人类的伤害。
也许是时候考虑建立一个监管机构,在最大限度地尊重隐私和知识产权的情况下,测试算法的准确性、一致性、偏见和影响,然后根据它们可能造成的伤害或产生的不公平输出,批准或拒绝它们的使用。
预算分配与政府绩效不佳和腐败有关吗?
机器学习分析
特别感谢 Michael Greencare 教授和 UPF 巴塞罗纳管理学院。
摘要
本文旨在运用主成分分析和聚类分析研究腐败感知指数(CPI)及其与五大类预算支出和五个治理指标变量的关系。目的是通过从数据集中提取最重要的结构化信息,并以图表的形式提供综合结果,来确定不同欧洲国家之间的相似性以及 2010 年和 2016 年之间的变化。它通过运行 CPI 和分类变量之间的线性回归来进一步了解哪些类别是密切相关的。此外,该研究运行了回归树分析,以确定最有意义的变量,以制作一个潜在的解释模型。
首先简要介绍清廉指数和治理关键绩效指标。第二部分,使用的数据集和方法;在第二章和第三章解释。第四章和第五章分别给出了研究结果和结论。
关键词 :清廉指数、预算支出、治理指标、法治(RL)、主成分分析、聚类、数据、变量、R-studio。
1.介绍
对腐败的研究是一个极端而微妙的问题,世界经济论坛最近的研究表明,腐败的成本大约为每年 2.6 万亿美元。这种影响影响了社会中最脆弱的阶层,影响了国家的发展,例如,委内瑞拉是世界上最富裕的国家之一,但它淹没在一个前所未有的腐败网络中,使其陷入经济和人道主义危机。
此外,腐败对国际投资产生不利影响,从而削弱经济增长和破坏法治。同样,这些做法会带来更严重的后果;浪费公共资源和金钱,破坏公众对政府的信任,降低政府运作效率,影响经济。
国际透明组织(International Transparency)的使命是“在社会所有层面和所有部门制止腐败并促进透明度、问责制和廉正”,并创建了一个指数,根据商界人士和专家对全球 180 个国家公共部门腐败程度的看法,对这些国家进行排名。等级从 cero 到 100,cero 高度腐败,最高分 100 非常干净。
此外,全球治理指标项目报告了 200 多个国家的总体和单独治理绩效指标,使用六个不同的维度,并给它们打分,从-2.5 到 2.5,分数越高,治理绩效越好。出于本研究的目的,我们选择了前五个维度:
声音与问责(VA): 反映了人们对一个国家的公民能够在多大程度上参与选择他们的政府,以及言论自由、结社自由和自由媒体的看法。
政治稳定和无暴力(PS-AV): 衡量对政治不稳定和/或政治暴力(包括恐怖主义)可能性的看法。
政府效力(GE): 反映了对公共服务质量、公务员质量及其不受政治压力影响的程度、政策制定和执行的质量以及政府对这些政策的承诺的可信度的看法。
监管质量(RQ): 反映了对政府制定和实施允许和促进私营部门发展的健全政策和法规的能力的看法。
法治(RL): 反映了人们对代理人在多大程度上信任和遵守社会规则、合同执行质量、产权、警察和法院以及犯罪和暴力的可能性的看法。
此外,负责编制和提出欧盟预算草案的欧盟委员会按不同支出范围的类别显示了欧盟国家的预算支出。我们只选择了占总支出预算 2%以上的类别,如:
智能和包容性增长(SIG)
可持续增长(SG-NR)
安全和公民身份(SC)
行政管理
2.资料组
该数据集对应于 2010 年和 2016 年的二十八(28)个西欧国家,以查看所述期间的相关变化。此外,数据集包含十五(15)个变量,包括 CPI、治理指标、预算支出占总支出的百分比,以及五(5)个人口变量,如失业率(UNPL)、通货膨胀率(INF)、人均国内生产总值(GPD)、购买力平价(PPP)和人口(POP)。下表显示了数据集的头部,仅显示了 2010 年和 2016 年这两个时期的前六个国家。BE10 表示 2010 年的国家是比利时,依此类推。
3.方法学
3.1.了解您的数据
第一步是通过引入变量的箱线图来了解数据。这是一种通过四分位数以图形方式描绘数字数据的方法,并使用触须来表示上下四分位数之外的可变性。这种图形表示的目的是检测异常值。在数据库里。第二步是在开始分析预测变量之前了解它们的分布;这很重要,因为某些分析需要某些分布。理想情况下,最好是正态分布,不要向一侧倾斜。
3.2.聚类分析
这种分析的目的是对非结构化数据集进行分组并从中提取价值,并在尝试对其进行分析之前对国家进行逻辑分组。这种分析将允许研究人员浏览一下数据,并在深入本研究的分析主题之前,根据我们的发现形成结构。关于分析本身,聚类是具有相似属性的国家和年份的集合,并基于它们的相似性以分层的方式将它们分成不同的组。为了获得集群,我们将以下代码引入 R-Studio 程序:
此外,我们分别分析每年的数据,以便对不同群体有一个清晰的认识,并比较两个时期,看是否有显著变化。为此,我们使用以下代码将数据集分为 2010 年和 2016 年的数据:
和编码两个独立的聚类分析。
3.3.数据标准化和主成分分析
在应用主成分分析之前,数据集需要标准化,因为一些变量可能有较大的方差和其他最小的方差。这在运行 PCA 之前很重要,因为这是一种方差最大化方法。数据标准化是通过取出平均值,然后用数据除以标准偏差来完成的。将所有数据标准化后,使用的方法是主成分分析(PCA)来描述多变量数据。
我们使用这种方法的主要原因之一是因为简单,我们没有缺失值,主要是因为它不需要正态性。这种检验不是假设检验,反应变量和解释变量之间没有明显的区别(阿兰 f .祖尔,埃琳娜 n .雷诺&格雷厄姆 m .史密斯,2007)。这种方法背后的思想是将一个大的变量集减少到一个小的集合,该集合仍然包含大数据集中的大部分信息。第一个主成分解释了大部分差异,每个后续成分解释了剩余的可变性。此外,我们从 PCA 结果中提取行主坐标。
3.4.线性回归,回归树分析。
关于线性回归模型,我们首先用散点图分析因变量(腐败感知指数或 CPI)和预测变量之间的关系。LR 中的基本假设是两个变量之间的关系必须是线性的和可加的。
在第一个线性模型中,我们使用 CPI 作为自变量,治理指标作为预测因子。第二个线性回归模型使用了相同的因变量,但使用了预算支出和自变量。此外,第三个线性模型也涉及预算支出和治理指标。
此外,我们做了回归树分析来表示递归划分。每个终端节点代表分区的一个单元,每个单元只是自变量的一个常数估计。这种分析的优点是可以更快地做出预测,并且很容易理解哪些变量在做出预测时更重要。回归树是由各个线性模型中的重要变量组成的,我们可以在下面的代码中看到:
最后,使用 CPI 和其他重要变量的线性模型,以西班牙为所有国家的参考水平,以 2010 年为基准年。目的是查看 2016 年是否显著高于或低于基准年,并确定各县和参照国西班牙之间的显著性。
4.结果
4.1.第一阶段结果
第一阶段的结果,了解你的数据,非常有助于识别异常值和分布。关于异常值的识别,箱线图分析显示,2016 年,安全和公民身份(SC)有一个异常值,即马耳他。许多报告表明,马耳他的公民身份是一个非常重要的部门,因为他们向世界各地的亿万富翁和罪犯出售公民身份,作为进入欧洲的免费入口。
这可能是这个国家在这一类别中成为异类的原因之一。此外,管理(ADM)也显示出极端异常值。这两个国家是比利时和卢森堡,这些国家的许多公民在其他国家工作,因为它们非常小,更接近较大的国家,也因为它们是欧盟机构的东道国。同样,购买力平价箱线图显示了两个时期的异常值,在这种情况下是匈牙利,在 2016 年达到历史最高水平。下表包含变量的箱线图。
此外,表 3 显示了变量的分布,通过图形展示了本研究中一个变量对象的密度。
在此分析中,我们可以确认上一步中提到的异常值的存在。但最重要的是,我们可以确定变量的分布。这个想法是,分布应该接近正态分布,也就是说,不偏向一边。许多变量偏向一侧,但总体而言,该分布接近正态分布,尽管不需要进行主成分分析。
4.2.第二阶段结果
关于包括这两个时期的聚类分析的结果,我们看到许多国家聚集在一起,显示出很少的变化,但是其他国家与其他国家聚集在一起。下面的树状图显示了两个时期的结果,按年份分别分析了每个国家,例如,比利时在 2010 年和 2016 年的情况如下:
大多数国家坚持其在该组中的立场;与此同时,其他国家如爱沙尼亚也经历了巨大的变化。它从 2010 年与拉脱维亚和斯洛伐克同组,成为瑞典和荷兰等国家的一部分。我们可以假设这是一个正在取得进展的整体成就,因为它们看起来更像是发达国家。另一方面,法国(FR)也在年与年之间经历着变化。在 2010 年,它更像英国和德国,但在 2016 年底,它变得更像西班牙。马耳他是变化最大的国家。2010 年,他们被定位于爱沙尼亚和塞浦路斯,但在 2016 年,他们不太可能类似于任何国家。
如果我们深入到树状图中,如果不算蓝线,我们可以看到两个主要的集群。在最左边,我们可以看到比利时、卢森堡、英国、瑞典、荷兰和丹麦等国家。众所周知,这些国家发展良好,排名靠前。
另一方面,右边是南方国家,如西班牙、意大利、葡萄牙、希腊和其他位于欧洲西部的国家。非常有趣的是,各国在六年内会发生怎样的变化,一些国家的地位提高了,另一些国家的地位下降了,但总的来说,大多数国家保持了自己的地位。
4.3.第三阶段结果
数据集中所有变量的主成分分析结果如下图所示。为了更好地解释,国家节点用虚线连接。
第一个维度解释了总方差的 43%;同时,第二维度解释了 13.5%,这是第二大跳跃。因此,我们更多地考虑第一个来解释这种差异,尽管可持续增长(SG-NR)似乎是第二维中最重要的差异贡献者,并且它与人口规模高度相关。
治理指标声音和问责(VA)、政府效率(GE)、法治(RL)、监管质量(RG)和清廉指数(CPI)高度相关。这些相关性是有意义的,因为发达国家往往在各个方面都有良好的治理指标,这使得该国在腐败方面非常干净。正如我们所看到的,一个国家的治理指数越高,他们在感知腐败方面就越干净。
此外,前面提到的变量(用红色圈出的)与明智和包容性增长(SIG)之间存在着深刻的负相关。看来,所罗门群岛政府的支出比例越大,该国就越有可能非常腐败,治理指标也越低。由此,我们可以假设,投资于这一类别,可能是政治家从公共资金中获利的一种方式,而不会如其名称所示产生任何明智的增长。这一假设有助于欧盟委员会详细研究匈牙利等国家在这一类别中的支出,这些国家在这一类别中的支出占其总预算的 50%以上。
关于失业率,似乎与 CPI 和治理指标负相关。腐败的国家在这方面比那些比较干净的国家失业率更高。我们可以看到,西班牙、意大利和希腊等发达国家失业率较高,但 CPI 得分较低。由此,我们可以假设腐败的政府会直接影响到社会的失业率。此外,通货膨胀率(INF),安全和公民身份(SC)和人口规模(POP)是解释研究方差最小的变量。
最后,我们可以从主成分分析中得到的主要结果是,从 2010 年到 2016 年有显著的变化。大多数国家的趋势是向图表的右侧移动。结果显示,各州在腐败和治理问题上正在退步,这种情况在所有国家蔓延。看起来,欧洲国家在腐败和治理指标上的得分越来越低,这可能是欧洲议会的红色警报。有趣的是,治理得分越低,国家腐败的可能性就越大。我们可以假设,业绩差不是因为缺乏专业素养,而是缺乏价值观。
4.4.第四阶段结果
这一阶段的线性回归模型与独立变量 CPI 相关,并确定哪个预测变量解释得最多,以便进行预测。我们首先确定哪些变量更有可能与自变量相关。下表显示了这些关系。
散点图和平滑线表明,治理指标随 CPI 线性增加。其他如 SC,INF 和,PPP 显示没有线性关系。这一点通过对每一个变量进行回归分析得到了证实。
包含 CPI 和治理指标变量的回归模型显示,法治显著不同于 p 值较低的 cero。此外,回归的斜率也明显不同于零。R 表明,治理指标变量解释 CPI 的 88.6%,经调整的 R 为 87.5%。
此外,对预算支出的第二次回归表明,所有变量都与 cero 显著不同,p 值小于 5%的置信水平。模型表明变量解释了 48.4%的方差。
Figure 4. Linear Regression with budget expenditure as the explanatory variables and CPI as the target variable.
此外,我们运行回归树分析。首先,使用代码中显示的变量,将两年的所有数据集放在一起:
结果是下面的回归树:
在回归树中我们可以分析出,如果 GPD 低于 3.5+04,政府有效性小于 0.93,我们预计 CPI 得分为 45.26,非常低,有 19 个国家落在这一边。另一方面,如果国内生产总值高于结果,并且话语权和问责制得分高于 1.445,我们预计 CPI 得分将为 88.89,9 个国家落在该区域。让我们记住,国家可以被计算两次,因为我们将它们作为单独的样本,2010 年和 2016 年。
5.结论
治理指标与对腐败的看法密切相关,就腐败而言,治理得分较高的发达国家比政府绩效差的国家更干净。正如我们之前提到的,政治家缺乏价值观直接影响政府的表现,而普通民众是受影响最大的群体,这可以通过失业率反映出来。
随着我们走向未来,大多数欧洲国家表现不佳,2010 年至 2016 年之间有显著变化,我们可以在 PCA 分析中看到,所有国家在 2016 年都远离了良好治理得分。
法治(RL)是与 CPI 最相关的指标。就腐败而言,一个法治强大的国家似乎比法治指数较低的国家更干净。这个结论是有道理的,因为强有力的法律会惩罚那些腐败的政客。
许多国家在 2010 年至 2016 年间经历了变化。例如,法国在第一年的研究中就处于发达国家的行列,到 2016 年就被移到了欠发达国家。像北欧这样的发达国家保持现状,这意味着它们在研究期间没有变化。
最后,Smart 和增长支出与 CPI 之间存在很强的负相关性。在这一类别中花费大量金钱的国家,如饥饿国家,似乎有较低的 CPI 分数。
6.数据源
http://info.worldbank.org/governance/wgi/index.aspx#home
http://ec.europa.eu/budget/figures/interactive/index_en.cfm
http://EC . Europa . eu/Eurostat/statistics-explained/index . PHP/losis _ statistics
http://EC . Europa . eu/Eurostat/statistics-explained/index . PHP/File:HICP _ 所有-项目,_ 年度 _ 平均 _ 通货膨胀率,_ 2006–2016 (% 25) yb17 . png
https://data . OECD . org/conversion/purchasing-power-parity-PPP . htm # indicator-chart
https://data . OECD . org/conversion/exchange-rates . htm # indicator-chart
国会能帮助保持人工智能对消费者的公平性吗?
6 月 26 日的国会听证会为金融服务敲响了警钟。
企业如何确保人工智能系统不会对弱势群体产生不同的影响,以及监管机构和国会应该采取什么保护措施来保护消费者?
在多大程度上应该要求公司审计这些算法以便他们不会不公平地歧视?谁应该确定这方面的标准?
我们需要确保人工智能不会制造偏向歧视的倾向。
两个新的众议院工作队监管金融科技和人工智能
这些不是学术论文或社论中的问题。这些问题是 6 月 26 日美国众议院金融服务委员会听证会的证人提出的——由民主党人和共和党人,伊利诺伊州、北卡罗来纳州和阿肯色州的代表提出。
两党都认为,如果不加以控制,人工智能可能会对金融服务的公平性构成威胁。尽管这一危险的确切程度仍有争议,但美国和海外政府都承认这一必要性,并主张有权为此目的监管金融机构。
6 月 26 日的听证会为金融服务业敲响了第一记警钟:它们需要准备好应对并遵守未来要求透明和公平的立法。
在本帖中,我们回顾了这次听证会的重大事件,并探讨了美国众议院如何开始审查人工智能在金融服务中的风险和好处。
两个新的众议院工作队监管金融科技和人工智能
今年 5 月 9 日,美国众议院金融服务委员会主席,国会女议员 Maxine Waters宣布成立两个工作组【2】:一个负责金融科技,一个负责人工智能。
一般来说,工作队开会是为了调查可能需要改变政策的具体问题。这些调查可能涉及召集专家向工作队通报情况的听证会。
这两个工作小组在权限上有所重叠,但是委员会的目标暗示了一些区别:
- fintech 任务组应更关注应用(如承销、支付、即时监管)。
- 人工智能任务组应该更长期地关注风险(例如,欺诈、工作自动化、数字识别)。
沃特斯主席明确解释了她对监管的总体兴趣:
确保鼓励负责任的创新,确保监管者和法律适应不断变化的环境,以最好地保护消费者、投资者和小企业。
被任命为人工智能工作组主席的国会议员比尔·福斯特在一份类似的声明中赞扬了人工智能的潜力,但也警告说:
至关重要的是,人工智能在金融服务中的应用有助于实现对所有美国人都公平的经济。
第一次听证会确实发现了人工智能在金融服务领域的大量应用。但它也得出结论,这些担忧情绪既不是对选民的歪曲,也不是错位的。
From left to right: Maxine Waters (D-CA), Chairwoman of the US House Committee on Financial Services; Bill Foster (D-IL), Chairman of the Task Force on AI; French Hill (R-AR), Ranking Member on the Task Force on AI
人工智能的风险
在听证会后期的一次幽默交流中,众议员西尔维娅·加西亚(德克萨斯州民主党)请一位证人,萨里大学的邦妮·布坎南博士向普通美国人讲话,用 25 个或更少的单词解释人工智能。它进行得不顺利。
布坎南博士
我认为这是一组技术和过程,可以确定一般的模式识别,关系的通用近似,并试图从嘈杂的数据或感官知觉中检测模式。众议员加西亚 我想这可能让他们更加困惑。
布坎南博士哦,对不起。
除了开玩笑,众议员加西亚说得有道理。人工智能异常复杂。不仅如此,对许多美国人来说,这可能是一种威胁。正如加西亚后来所表达的,“我认为有一种想法,所有这些机器人将接管所有的工作,每个人都将进入我们的信息。”
在他的开场白中,工作小组资深成员、众议员 French Hill (R-AR)试图先发制人,至少先解决第一个问题。他引用了世界经济论坛的一项研究,称因人工智能而失去的 7500 万份工作将被 1 . 3 亿份新工作所抵消。但美国人仍然对 AI 发展感到焦虑。
在 2018 年 6 月牛津人工智能治理中心对 2000 名美国人进行的调查中,研究人员观察到
- 压倒性的支持对机器人和/或人工智能的谨慎管理(82%的支持)
- 更信任科技公司而不是美国政府为了公众的利益来管理人工智能
- 对开发高级机器智能的混合支持(定义为“当机器能够比今天的人类更好地执行几乎所有与经济相关的任务时”)
这种公众对人工智能发展的担忧也反映在任务组和专家的担忧上。在整个听证会中,个人隐私被提到了九次,特别是在国会议员安东尼·冈萨雷斯(R-OH)关于“平衡创新与赋予消费者数据权力”的宽泛问题中,专家小组没有充分解决这个问题。
但更多的时候,证人讨论的是公平 以及人工智能模型如何能够不被注意地进行区分。最值得注意的是,布鲁金斯学会(Brookings Institution)研究员尼科尔·特纳-李(Nicol Turner-Lee)博士建议实施护栏,以防止有偏见的训练数据“复制和放大历史上对有色人种和其他弱势群体的刻板印象”。
她并不孤单。另一份 2019 年 4 月的布鲁金斯报告 [5]否认了这种对不公平的担忧,“算法使用一系列变量拒绝信贷或提高利率,这些变量从根本上受到社会中根深蒂固的历史歧视因素的驱动
因此,如果我们如此担心,为什么还要费心将人工智能的潘多拉魔盒引入金融服务呢?
人工智能的好处
根据国会议员希尔的说法,人工智能的潜在好处是“收集海量数据,检测异常,解决复杂问题。”在金融服务领域,这意味着欺诈、保险和核保的模型实际上更加公平和准确。这可以同时提高银行的盈利能力,并将服务扩展到以前服务不足的银行。
Hill 和 Foster 都引用了国家经济研究局的工作论文【6】发现在一个案例中,算法贷款模型比面对面贷款者少歧视 40%。此外,ZestFinance 的首席执行官兼专家证人道格拉斯·梅里尔博士(Dr. Douglas Merrill)声称,使用他公司的人工智能工具的客户在信用卡、汽车贷款和个人贷款方面体验到了更高的批准率,并且违约率没有增加。
此外,希尔用一个关于人工智能如何重塑行业的重要观点来框定他的声明:这一进步将“对颠覆性创新者和我们现有的金融参与者都有用”。乍一看,这似乎有悖常理。
“颠覆性创新者”更加敏捷,受传统流程的阻碍更少,在实施新技术方面具有优势。[7]但是,如果没有“现有金融机构”的巨额预算和客户基础,这些颠覆者怎么可能成功呢?陷入旧方式的现任者会采用人工智能吗?
Jesse McWaters 先生是世界经济论坛的金融创新负责人,也是最后一位专家证人,他谈到了这一明显的悖论,讨论了什么将“重新绘制我们所认为的金融部门的地图”第三方人工智能服务提供商-从传统银行到小型金融科技公司-可以“帮助较小的社区银行保持与客户的数字相关性”,并“使金融机构能够向前跨越。”
国会中的自由市场支持者认为,扶持竞争性市场,尤其是在金融服务等集中行业,是一项绝对的好处。然而,以这种方式“重绘地图”会让金融业变得更大、更复杂。国会将不得不制定政策,不仅要应对更复杂的模型,还要应对更复杂的金融体系。
这种制度给代表股东利益的公司和代表消费者利益的政府都带来了风险。
企业和政府关注风险
企业已经在采取行动,避免人工智能模型故障和系统复杂性带来的潜在损失。一份【2019 年 6 月 Gartner 报告 [8]预测,到 2023 年,75%的大型组织将雇佣人工智能行为取证专家来降低品牌和声誉风险。
然而,政府认识到,企业主导的举措,如果出于保护公司品牌和利润的动机,可能只能到此为止。对于一个保护消费者、投资者和小企业的政府来说,差距可能仍然存在。
随着政府探索如何填补这一缺口,它们正在建立支撑未来指导和监管的原则。各理事机构的主题是一致的:
- 人工智能系统需要值得信赖。
- 因此,他们需要代表人民的政府给予一些指导或管制。
- 这种指导应该鼓励公平、隐私和透明。
在美国,唐纳德·川普总统于 2019 年 2 月签署了一项行政命令 [9],“以保持美国在人工智能领域的领导地位”,指示联邦机构,除其他目标外,“通过建立人工智能开发和使用指南,培养公众对人工智能系统的信任。共和党的白宫和民主党的众议院似乎总是发生冲突,但是他们在这里是一致的。
欧盟也正在建立一个监管框架,以确保可信的人工智能。同样,在他们从 2019 年 4 月【10】开始的最新沟通中,七项要求包括:隐私、透明和公平。
六月的 20 国集团峰会[11]借鉴了类似的想法,创造了他们自己的一套原则,包括公平和透明,但也增加了可解释性。
这些理事机构正处于调查事实的阶段,在指导政策之前确立原则并了解他们所面临的情况。用福斯特主席的话来说,工作组必须理解“这项技术将如何影响决策者在未来几年必须解决的问题。”
在众议员加西亚有趣的挑战前一个小时,布坎南博士思考了几个共同关心的问题。
决策者需要关心人工智能模型的可解释性。我们应该避免黑盒建模,在黑盒建模中,人类无法确定机器学习或深度学习算法的底层过程或结果。
但通过这一陈述,她提出了一个解决方案:让这些人工智能模型变得可以解释。如果人类确实能够理解模型的输入、过程和输出,我们可以信任我们的人工智能。然后,通过人工智能在金融服务中的应用,我们可以促进所有美国人的公平。
来源
[1]美国众议院金融服务委员会。"人工智能透视:我们在哪里以及金融服务的下一个前沿."https://financial services . house . gov/calendar/event single . aspx?EventID=403824 。2019 年 7 月 18 日接入。
[2]美国众议院金融服务委员会。"沃特世宣布成立金融技术和人工智能委员会工作组."https://financial services . house . gov/news/document single . aspx?DocumentID=403738 。2019 年 7 月 18 日接入。
[3]利奥波德,直到亚历山大,Vesselina Ratcheva,和萨迪亚扎希迪。《2018 年就业报告的未来》世界经济论坛。http://www3.weforum.org/docs/WEF_Future_of_Jobs_2018.pdf
[4]张、宝宝、艾伦·达福。“人工智能:美国的态度和趋势。”英国牛津:人工智能治理中心,牛津大学人类未来研究所,2019 年。https://ssrn.com/abstract=3312874
[5]克莱因,亚伦。“人工智能时代的信用否认。”布鲁金斯学会。2019 年 4 月 11 日。https://www . Brookings . edu/research/credit-denial-in-the-age-of-ai/
[6]巴特利特、罗伯特、王茂林·莫尔斯、理查德·斯坦顿、南希·华莱士,“金融科技时代的消费贷款歧视。”美国国家经济研究局,2019 年 6 月。【https://www.nber.org/papers/w25943
[7]斯奈德,斯科特。“银行如何跟上数字颠覆者。”宾夕法尼亚州费城:宾夕法尼亚大学沃顿商学院,2017 年。https://knowledge . Wharton . upenn . edu/article/banking-and-fin tech/
[8]“Gartner 预测,到 2023 年,75%的大型组织将雇佣人工智能行为取证专家来降低品牌和声誉风险。”高德纳。2019 年 6 月 6 日。https://www . Gartner . com/en/news room/press-releases/2019-06-06-Gartner-predicts-75-of-large-organizations-will-hire
[9]美国,总统行政办公室[唐纳德·特朗普]。13859 号行政命令:关于保持美国在人工智能领域领导地位的行政命令。2019 年 2 月 11 日。https://www . white house . gov/presidential-actions/executive-order-maintaining-American-leadership-artificial-intelligence/
[10]“建立对以人为中心的人工智能的信任。”欧洲委员会。2019 年 4 月 8 日。https://EC . Europa . eu/futuri um/en/ai-alliance-consultation/guidelines # Top
[11]《二十国集团关于贸易和数字经济的部长声明》2019 年 6 月 9 日。http://trade.ec.europa.eu/doclib/press/index.cfm?id=2027
原载于 2019 年 7 月 18 日https://blog . fiddler . ai。
数据科学能从物理学中获得灵感吗?
从一个做出转变的人的角度看问题。
Night sky in Poland, summer 2019. Source: private collection.
我喜欢物理。如果我没有养成在大学校园实验室之外过职业生活的习惯,我会继续学习这门课程。然而,在我生命中的某个时刻,我感觉我会享受许多软件开发人员的生活方式。自然地,数据科学似乎是两个世界中最好的,并成为我的新方向。
在这篇文章中,我想与你分享我的一些观察,关于我认为物理学如何丰富数据科学。我们将超越简单的“保持好奇”的叙述。相反,我们将关注更微妙的东西,并研究将其与软件工程区分开来的“思维模式”。希望我们会发现熟悉物理可以给数据项目带来积极影响的领域,以及它可能不足的地方。
什么是数据科学?
从形式上来说,单词 科学 表示构建和组织知识的系统企业,这是通过观察和可测试的预测来完成的。 物理学 作为自然科学的一部分,是一门用科学方法来建立对物质的认识的学科。简而言之,它研究世界并帮助预测其行为。
那么什么是数据科学呢?
Source: https://analyticsindiamag.com/.
数据科学是一个新的领域,它试图使用科学方法来构建给定数据的洞察和预测。在这里,“数据”一词可以指一些特定的物理测量,但也可以描述意见或表示任何合成或抽象的信息。正因为如此,它的主要兴趣领域与物理学非常不同。此外,由于今天数据大多是数字记录,这使得整个学科与计算机科学和软件工程紧密相关。最后,与物理学不同,数据科学主要在商业环境中运作。
然而,与计算机领域相反,数据科学应该对数据做一些事情——最好是提取信息并将其投射到未来。还有,和纯商业相反,它强调理性。
这听起来和物理学没有太大的距离,不是吗?
模拟现实
先说相似点。这两个学科中存在的一个共同的实践是对现实的建模。物理学家通过测量来研究世界,并用数学方程来描述世界。软件开发人员使用抽象来映射问题,并通过代码来表达它们。
这些抽象本身似乎源于物理学中一个众所周知的概念,即一个孤立的系统。当我们对世界进行某种理想化假设,并将其视为一个分离的实体时,我们称一个系统为孤立的。这种方法使得问题更容易描述和测试。
对于数据科学,尽管信息的性质不同,我们也试图通过隔离或抽象来创建我们所面临的问题的某种表示。这是一个好的开始。
第一性原理思维
现在,考虑以下情况:
“光子是玻色子类的物体,电子是轻子。原子是粒子和用途的实例。bond()方法形成分子……现在,这一切都是为了执行 universe.run(),对吗?”
除了跳过一百万个抽象层之外-是的。至少,它表明了思考的方向。另外,对整个宇宙建模不就是物理学作为一门科学的终极目标吗?确实是!对吗?
差不多,但不完全是。
Source: https://reddit.com.
虽然这种想法很诱人,但这不是物理学家想要的。事实上,物理学家宁愿关心积木本身,而不是试图编译所有的基本积木。物理学家知道,一旦砖块被理解,通过组合、重复、排列和重新排列这些碎片,就获得了最终的建筑。
形成一个更高的结构当然不是一件容易的事情,但是计算机工程师是寻找砖块最佳排列的专家。这也是他们最感兴趣的领域。
两者之间的推理似乎几乎相反。当计算机专家试图爬上抽象的阶梯时,物理学家会急切地走下去用放大镜检查种子。说到数据科学,两种思维路径都需要。为了创建高效的预测模型,数据科学家必须了解需要哪些数据组件,以及应该如何安排它们。哪些功能看起来有意义?如果听起来像探索性数据分析 (EDA),物理学家一直在做。
从物理学导入洞察力
Source: https://wonderfulengineering.com.
说到有意义的特性,物理学,即使是最“实用”的,也需要相当数量的洞察力。深刻理解事物运行(或不运行)的原因不仅对构建有意义的假设至关重要,而且从长远来看也是成功的关键。
相反,软件工程的重点是交付商业解决方案。它强调“如何”而不是“为什么”,这既是优点,同时也是缺点。在处理复杂性、优化性能和保证健壮性方面,这是一个优势。当一头扎进数据中,即使是领域驱动设计也没有给我们带来太多。这只是开发产品的另一种方式。换句话说,计算机科学没有计算出数据有什么意义的方法。
想到数据科学,它可能会遇到好像扩展计算机科学加上 EDA 可能会做到这一点。不幸的是,这是一个缺点。
实验的价值
Source: https://memecenter.com.
物理学可以是理论性的,但它仍然是一门实验科学。无论是在强子对撞机上还是仅仅在 格丹肯 上,它都教导如何进行从陈述假设到分析结果的过程。在构建数据产品时,软件农场变成了进行虚拟实验的大数据军事基地。虽然没有人会因为比特(和字节)的飞散而受伤,但设计和携带这些受控的数据爆炸需要的不仅仅是建立必要的基础设施和挥舞“请勿靠近”的牌子。
仅仅依靠统计方程也不能保证成功。人们必须全面考虑正在调查的问题。虽然预测模型是最终目标,但在实现之前通常需要大量的实验。
在这里,如果数据科学向物理学寻求建议,这将有助于强化实验过程。这样的过程应该有助于产生深刻的见解,但又不影响审查。它还可能包括数据收集等附带活动——只要能确保结果可信,什么都可以做。
数据科学不是物理学
到目前为止,我们在数据科学的背景下只考虑了物理学的积极方面。那些你不会从物理学中寻找灵感的领域呢?
Source: https://me.me.
一个例子是运行一个没有明确交付约束的纯数据驱动的项目。这样一个项目很容易陷入永无休止的实验中。虽然这对团队来说很有趣,但对组织来说却很昂贵。其主要原因是数据科学的业务环境,而物理学没有停止机制。
其次,对构建模块的理性理解并不能保证解决更大的问题。软件开发人员通常更有能力提取粒度级别,并在任何开发开始之前发现实现挑战。最终,让它“合二为一”是一项工程工作,而知道砖块并不能让一个人建造房子。有时候,挖得太深可能是不合理的。
最后,至少在一些物理学家中也存在一种不健康的倾向,即积累数据只是为了“以防万一”。这不仅让开发人员非常头疼,在极端情况下,整个开发甚至可能无法启动!同样,洞察力是通过问正确的问题获得的——而不是问太多的问题。
结束语
作为一门学科,物理学比计算机科学古老得多,比软件工程成熟得无可比拟。当阿基米德跳出他的浴盆时,世界还没有听说过算法当艾萨克·牛顿阐明动力学定律时,第一台处理器早就被创造出来了。相反,软件工程只有一百年的历史,而互联网的普及被认为是最近的三十年。尽管每天都面临挑战,但如果是医学,我们可以说我们只是学会了洗手。
另一方面,技术进步的速度和它在我们生活中的无所不在是前所未有的。让我们以总数据量为例,估计今天大约为 50 兆字节。如果一个字节的信息重 1 公斤,那么全世界的数据总量已经相当于月球的 2/3(到 2020 年)。再过五年,它将超过月球两倍。我们,自愿去理解这些数据的人,不能在学习中偷懒。
物理学作为一门古老的学科,确实有时间研究出一些行之有效的方法。有时我甚至认为数据科学是虚拟的物理,尽管每次我都觉得有点奇怪。然而,如果数据科学从物理学中得到一些建议,它会立即投入到实验和分析中去。
从第一原则的角度思考对数据科学也大有裨益,前提是它不会变成“过度思考”。尽管如此,历史上发生的一些最伟大的发现背后往往是第一性原理思维。记住这一点是有益的。
最后,数据科学相关活动不能脱离组织的业务模型环境。与物理学这种自由科学不同,数据科学的主要目标是帮助发展业务。如果这一点得到保证,物理学可能会为数据科学提供非常有益的观点,并确实有助于它的成功。
还会有更多…
我计划把文章带到下一个层次,并提供简短的视频教程。
如果您想了解关于视频和未来文章的更新,订阅我的 简讯 。你也可以通过填写表格让我知道你的期望。回头见!
数据科学能帮你挑宝宝名字吗?
探索各种数据科学技术如何用于缩小婴儿名字的想法
Source: Christopher Doughty
为你的宝宝找到一个完美的名字可能是一个挑战。很难找到一个不仅你和你的伴侣都喜欢的名字,而且还符合你的姓氏。此外,名字的受欢迎程度也很复杂,比如,你选择的是普通的还是独特的名字。当试图涉水通过所有这些方面时,数据科学能使名字选择过程更容易吗?
为了研究这个话题,我收集了一些关于婴儿名字的数据。名和姓的数据来自国家统计局和苏格兰国家记录[1]。我的最终数据集包含 31,697 个名和 6,453 个姓。第一个名字数据是根据 2000 年至 2017 年出生的婴儿数量按年份划分的。
TLDR: 为这个项目创建的在线应用程序可以在这里找到。
发音预测
人们倾向于避免名字和姓氏押韵。节奏一致的名和姓在你大声说出来时感觉不自然,例如汉克·班克斯。影响名字发音的另一个因素是名字和姓氏以同一个音结尾,例如 Emilie Kelly。在许多情况下,一种算法不能单独使用字母来识别一个单词的结尾音;它需要知道发音。
为了根据相似的节奏给单词打分,我需要获得如何发音的训练数据。这些数据来自 CMU 发音词典[2],经过清理,该词典包含了 117,414 个独特的单词。CMU 词典包含单词及其阿帕贝特语音组成。对于字典中没有的单词,我预测了它们的发音。这可以使用 seq2seq 模型来实现,也称为编码器-解码器模型。
我们现有字典的预处理需要标记一组独特的字母表和 ARPAbet 码。这是使用标签编码器实现的,并创建了一组 81 个独特的令牌。下面是一个 LabelEncoder 将字符转换成数字的例子,使用的是我的名字:
Source: ['C', 'H', 'R', 'I', 'S', 'T', 'O', 'P', 'H', 'E', 'R']
Target: ['K', 'R', 'IH1', 'S', 'T', 'AH0', 'F', 'ER0']#### TOKENISING ####Source: [21 37 62 39 63 65 53 60 37 25 62]
Target: [48 62 41 63 65 8 35 29]
评估输入的 CMU 数据,我发现最长的源向量是 34 个元素,最长的目标向量是 32 个元素。这些最大值似乎是合理的,因此使用填充元素 ’ < PAD > ’ 来标准化源向量和目标向量的长度。
seq2seq 模型是使用两个 LSTM(长短期记忆)网络用 Keras 构建的。该模型训练了 35 个历元,最终准确率为 95.6%,损失为 0.147。用一些原始字典中没有的名字示例来测试最终模型产生了令人满意的结果。
LEXI L EH1 K S IY
AYLA EY1 L AH0
MYA M IY1 AH0
然后将该模型应用于名和姓数据[1]。它被用来计算 31697 个名字中的 25036 个和 6452 个姓氏中的 739 个的发音。
押韵相似性
拥有所有名字和姓氏的语音意味着我现在可以对名字之间的相似性进行评分。我通过计算每个单词之间的距离来达到这个目的。此方法描述将一个字符串转换为另一个字符串所需的最少插入、删除或替换次数。
Levenshtein 距离越大,两个字符串之间的相似性越小,例如,距离为 0 意味着两个字符串相同。下面列出了创建使两个字符串相同所需的更改矩阵的代码。
# Get the length of each string
lenx = len(str1) + 1
leny = len(str2) + 1# Create a matrix of zeros
matrx = np.zeros((lenx, leny))# Index the first row and column
matrx[:,0] = [x for x in range(lenx)]
matrx[0] = [y for y in range(leny)]# Loop through each value in the matrix
for x in range(1, lenx):
for y in range(1, leny):
# If the two string characters are the same
if str1[x-1] == str2[y-1]:
matrx[x,y] = matrx[x-1,y-1]
else:
matrx[x,y] = min(matrx[x-1, y]+1, matrx[x-1,y-1]+1, matrx[x,y-1]+1)
测试代码与单词 CONTAIN 和 TODAY 的相似性,产生以下输出矩阵。使用下面的等式可以使用操作的数量来计算相似性得分:(1-(操作/最大字符串长度) 100)。*该技术计算出 CONTAIN 与 OBTAIN 的相似度为 71%,而 TODAY 的相似度仅为 17%。
Levenshtein distance calculated between different words. The similarity between the words is higher on the left (two alterations) compared to the right (five alterations)
这在我们的数据中的使用方式略有不同。这种方法不是直接应用于姓氏并根据名字的相似性来评分,而是应用于语音来评分与姓氏具有相似发音或节奏的名字。例如,如果我们使用姓 SMITH,并搜索发音最相似和最不相似的男孩的名字,分析将生成以下输出:
# TOP SCORING SIMILARITY
SETH 75.0
KIT 62.5
SZYMON 50.0# LEAST SCORING SIMILARITY
ZACHARY 8.33
HUSSAIN 9.09
PARKER 10.0
流行趋势
在这一点上,我们有了一个比较语音相似性的工作方法,去除发音相似的成分,并对名字和姓氏进行评分。我们希望考虑数据中名字的当前趋势。我们会选择一个受欢迎的、受欢迎程度增加的、受欢迎程度减少的、稳定的或在数据中相当罕见的名字吗?
我拥有的数据让我可以根据 2000 年至 2017 年的同比变化,查看每个名字的趋势变化。下图显示了 2012 年至 2017 年间英国前 10 名男孩和女孩名字的变化。这表明有大量的运动。
Top 10 boys and girls names between the years 2012 and 2017; lines show rank changes within the top 10
为了给每个名字贴上“受欢迎程度”的标签,我对每个名字的 4 年数据进行了线性回归。将每个部分的回归系数合并,以创建一个趋势数组。看起来像这样的数组[+,+,+,+,+,+]表示名字在随时间增长,像这样的数组[-,-,-,-,-]表示名字在衰落。这允许为每个名称创建与其阵列相关的配置文件。下面是我整理的七个简介:
'CONTINUED DECLINE' : Most recently declining, +1 previous
'DECLINE STABILISING' : Most recently stable, +2 decline
'RECENT DECLINE' : Most recently declining, 0 previous
'CURRENTLY STABLE' : Most recently stable, +1 previous
'GROWTH STABILISING' : Most recently stable, +2 growth
'RECENT BOOM' : Most recently growing, 0 previous
'GROWING BOOM' : Most recently growing, +1 previous
为了将简介与名字匹配,我绘制了 2017 年前 100 名女性婴儿的名字,并根据他们的简介给他们涂上颜色(如下图)。
Top 100 ranked female names of 2017 and their historical profiles
从这个数字中一个有趣的发现是,前 100 名中的许多名字都在下降。这可以通过观察每年独特名字的数量来解释(下图),因为在 2000 年至 2012 年间,名字选择的多样性增加了。
Count of unique male and female baby names by year
一些更有趣的发现…
对数据的深入研究揭示了一些更有趣的见解。其中之一是基于名字长度的婴儿频率计数。它显示大多数名字的长度在四到八个字母之间。
Frequency plot of the length of first names
另一个是在名字中使用连字符。我们可以观察到,在过去的 17 年里,这变得越来越流行。
Number of babies with hyphenated first names by year
最终想法和应用
当将发音相似性模型与姓氏和流行度数据相结合时,输出是将数千个名字减少到数百个的非常强大的方法。这是此类工具的主要好处,它减少了因过大而无法通读的数据集,并提供了对特定名称的历史和地理背景的了解。
我已经将评分模型和趋势概要数据推送到 GitHub,供任何有兴趣测试模型和趋势数据的轻量级版本的人使用:https://penguinstrikes . GitHub . io/content/baby _ names/index . html。
Source: Christopher Doughty
总之,像这样一个问题的模型不可能,也不应该提供一个“完美”的名字。像这样的任务涉及太多个人属性,无法提供一个明确的解决方案。然而,在我看来,与一些帮助准父母挑选婴儿名字的网站和文献相比,数据驱动的方法要有用得多。
参考文献
[1]根据开放政府许可 v3.0 提供的国家统计局数据
[2]http://SVN . code . SF . net/p/cmusphinx/code/trunk/cmudict/cmudict-0.7b
深度学习能帮助我们重新发现过去吗?
深度学习在考古学中的应用。
深度学习(D.L .)已经被证明是一种解决计算机视觉中广泛问题的杰出工具,并在几个领域中具有实际应用。然而,这种技术在考古学中,特别是在考古遗址的探测中,还没有被广泛地探索。在这篇文章中,我想告诉你 D.L .在机载数据分析中探测考古痕迹的应用。
Rune stone located at Lund University campus, the inscribed runic text describe the death of a King in Northern Europe. Image taken from: https://www.instagram.com/j.org.ls/
如今,从航空图像中探测考古结构几乎完全依赖于专家的分析。这是一项耗时的任务,需要高度专业化的知识,并且涉及进行分析的人的解释偏差。例如,在下图中,您可以看到两张航空照片。其中一个包含考古结构,而另一个没有。
Example of aerial photographs containing archaeological structures (right) and just a pile of rocks (left). ©Lantmäteriet: I2018 / 00119.
从航空数据中探测考古遗址所用的数据有不同的类型。它不仅限于电磁波谱可见范围内的航空照片。还使用了从 ASTER 卫星等专门卫星获得的多光谱航空图像,或使用激光雷达系统提供的激光测绘,激光雷达系统的优点是可以穿过植被并提供清晰的地形测绘。在最后一种情况下,它在探测植被非常密集的地区的考古遗址方面特别有用,例如发现隐藏在危地马拉丛林中的新遗址。对这些遗址的探测可以恢复为对可能属于古代景观遗产的地形异常的搜索。这种所谓的异常可能有不同的类型,被称为考古痕迹。
案例分析
隆德大学考古和古代史系提供的数据与来自瑞典南部波罗的海沿岸 5 个地区(skne 和 Blekinge 县)和位于马拉伦湖的 Birka 岛 Birka 的电磁波谱可见光和近红外区域的航空图像相对应。总共提供了 8 幅航空图像,其中包括与维京时代的坟墓和结构相对应的遗留痕迹和地形异常。这些结构有不同的形状,是最臭名昭著的船状墓葬。
所有图像的分辨率都是 20cm/像素,但是它们都具有不同的尺寸,因此执行平铺处理以具有如图像中所示的 100×100 像素的恒定尺寸的图像,重要的是要注意到,由于空间图像平铺的方式(将整个空间图像均匀地分成恒定尺寸的正方形,而不管其内容如何), 在一些情况下,考古结构似乎被分成不同的瓦片,而在其他一些情况下,瓦片中有不止一个单一的结构。
Example of one of the aerial images after the tiling. It is possible to see the shapes of the different structures marked in different colors. © Lantmäteriet: I2018 / 00119.
下表显示了案例研究数据的最终构成。
Composition of the data set.
从上表中,我们可以看到,有考古痕迹的瓷砖(不包括情况 5)仅占总数据的 5.7%。案例研究 4 被选作测试数据集,因此它被排除在所有其他操作、方法和流程之外,仅在最后用于测试不同的模型。考虑到带有考古痕迹的瓦片数量较少,因此决定最好的方法是开发一个分类器,该分类器可以区分两种不同类型的带有考古痕迹的数据图像(阳性案例)和不带有考古痕迹的图像(阴性案例)。
任务
当谈到分析具有网格状拓扑结构的图像或数据时,深度学习中最常用的模型类型是卷积神经网络(CNN)。这种类型的网络可以被看作是多层感知器的一种变体,但它的优点是比它的前身更轻,因为它基于共享权重的体系结构。在这个项目中,测试了 4 种不同的架构,其中 3 种是最先进的架构(它们是 VGG16 、 Inception V3 和 ReNet50 )以及一种基于典型 CNN 架构的拟议模型,如下图所示。
CNN proposed for the project.
通常,当可用的数据量足够大,并且它很好地代表了对于所选择的任务,信息可能出现的所有可能性的分布时,那么网络可以仅用该数据来训练,因为它预期它将从中学习所有需要的模式,以便在看不见的数据中表现良好。然而,当可用的数据不够时,可以应用一些其他技术。迁移学习是一种允许通过使用已经在类似任务中训练过的知识来使过程更有效的方法,它被用于前面提到的 3 个预训练模型。
使用深度学习时的一个常见错误是认为使用它需要大量数据,但这不是真的。在许多现实生活的应用中,标记的数据是有限的,正如这个问题的情况,所以为了解决这个问题,除了使用迁移学习之外,还使用了数据增强。航空图像类型数据的一个优点是,我们感兴趣检测的特征不依赖于方向,这为应用图像变换方法提供了很大的余地
在这个项目中,应用了两种不同的技术,第一种可以称为“典型的”图像数据增强,首先对所有图像应用 90°、180°和 270°的旋转,然后垂直翻转它们,这总共给出了 8 幅不同的图像。最后一步是随机选择这 8 个新创建的图像中的两个,并再次随机选择以下操作中的两个:改变亮度、对比度、色调、饱和度、相对亮度或添加高斯噪声;应用于两个选择的图像。通过使用这些技术,数据集以因子 10 增加,具有 2070 个具有正轨迹的图像和 14050 个没有正轨迹的图像的最终组成。然而,即使在某些情况下使用这种方法,前面所述的技术也不能推广到可能存在自然数据的各种情况,因为它没有在可用于训练的数据中描述。一种可以解决这个问题的方法是使用生成对抗网络(GANs)。
Graphical representation of a GAN network.
gan 是基于零和博弈的场景。在这个博弈中,有两个参与者,生成器和鉴别器。第一个可以被看作是一个函数,它试图从一个被称为潜在空间的表示空间映射到数据空间,在这种情况下是图像。第二个是从图像数据映射到图像来自真实分布而不是生成器分布的概率的函数。如果生成器分布能够完美地匹配真实的统计数据分布,那么鉴别器将被混淆,预测所有输入为 0.5。打个比方,生成器可以被视为伪造者,而鉴别者则是艺术专家。生成器创建假画的目的是逼真,而专家的目的是区分哪些是真的,哪些是假的。值得一提的是,生成器无法访问真实图像,它唯一的学习方式是通过与鉴别器的交互。
第二个数据扩充数据集是通过使用基于深度卷积 GAN (DCGAN)的模型创建的,以创建带有考古痕迹的图像。结果如下图所示。
Samples of the images generated using the DCGAN model (left) and real images with archaeological traces.
© Lantmäteriet: I2018 / 00119.
在左侧,您可以看到生成的图像,而在右侧,显示了一些真实图像的示例。其中一些确实与考古遗迹相似,但大多数遗迹的分辨率与原始遗迹不同。
该任务的另一个问题是数据中的不平衡,即 94%的图像对应于我们不感兴趣检测的类别,因此使用准确度作为性能测量不会揭示模型的真实性能,例如,将所有图像分类为负面的系统将获得 94%的准确度分数。为此,选择受试者工作特征(ROC)图及其曲线下面积(AUC)作为性能测量。ROC 曲线是显示分类器的真阳性(TP)和假阳性(FP)之间的权衡的图。这是通过改变阈值来绘制速率值而构建的。网络的输出给出了一个介于 0 和 1 之间的数字,该数字表示一幅图像属于包含考古结构的图像类别的概率。AUC 表明模型能够在多大程度上区分这两个类别。
Left: Example of a ROC curve obtained in the validation data set using the data set generated using “typical” data-augmentation techniques. Right: Confusion matrix of a binary classifier.
前面提到的每个模型(VGG16、Inception V3、ResNet50 和提议的模型)在使用前面提到的两种提到的数据扩充方法获得的两个不同数据集中进行训练。使用 4 重交叉验证,选择正则化技术漏失和 L2 的值。使用每个模型的最佳配置,进行最后一轮训练和测试,在这种情况下,在现有的 3 个数据集的每一个中训练模型:没有任何类型的数据增强的原始数据集,使用 DCGAN 生成图像的数据集,以及最后使用典型的数据增强操作的数据集。
结果
每个模型都在看不见的数据中进行了测试,在这种情况下,案例研究 4 分别针对该数据集的每种图像(可见光和红外航空图像)。下表显示了在不同训练数据集上训练的每个不同模型的测试数据集中获得的结果的摘要。
AUC values obtained in the test data set for each of the two types of aerial images and for the different models trained in the data set generated using “typical” data-augmentation techniques.
可以看出,Inception V3 是在可见光范围内的图像情况下表现更好的模型,而 VGG16 是在红外范围内的图像情况下表现更好的模型。
总的来说,观察到在使用“典型”数据扩充技术产生的数据集中训练的所有模型比在训练期间使用的另外两个数据集表现得更好。下图显示了 VGG16 和 Inception V3 的结果。
ROC curves and AUC obtained from the test data set for each of the two types of data after training VGG16 in different data sets (No data augmentation, augmentation using traditional techniques and augmentation using a DCGAN model).
ROC curves and AUC obtained from the test data set for each of the two types of data after training Inception V3 in different data sets (No data augmentation, augmentation using traditional techniques and augmentation using a DCGAN model).
为了改善结果,进行了一个额外的步骤,在这种情况下,使用系综。通过分别训练两个模型并平均它们的输出来构建集成。仅使用在不同数据集中训练的两个最佳模型。下表显示了真阳性和假阳性的百分比。
Percentage of true positives and false positives detection for the different combinations of
VGG and Inception V3 trained on the data augmented data set.
性能也可以在下面的图中可视化,其中显示了每个集合的 ROC 曲线,正如可以看到的,最低的具有 0.894 的 AUC,并且所有其余的具有高于 0.9 的值。最好的一种 AUC 为 0.96
ROC curve of the ensembles.
然而,这些结果并没有告诉太多,所以进行了视觉分析,以了解他们每个人的弱点。为此,需要一个视觉参照物,下图显示了彩色瓷砖对应的区域,这些区域中存在一些考古结构。
Case study 4 in visible light with the tiles with archaeological traces marked in purple.
© Lantmäteriet: I2018 / 00119.
Results obtained using Inception V3 in aerial images in the visible light range. The tiles
are colored according to the classification probability: blue > 0.5, light blue ∈ [0.3, 0.5], yellow
∈[0.1, 0.3]. © Lantmäteriet: I2018/ 00119
Results obtained using VGG16 in aerial images in the near-infrared light range. The tiles
are colored according to the classification probability: blue > 0.5, light blue ∈ [0.3, 0.5], yellow
∈[0.1, 0.3]. © Lantmäteriet: I2018/ 00119
下图描绘了最佳集合的图形输出,可以看到只有 3 个瓦片丢失,但正如我之前提到的,瓦片本身并不对应于结构,而是结构的一部分,实际上,在检测中没有任何结构丢失,只是它们的一些部分。此外,这里仍然存在的一些假阳性是由于所谓的“有争议的图像”。
Combined results of the predictions using Inception V3 in the visible light data and VGG16
in the infrared. © Lantmäteriet: I2018 / 00119.
现场检查揭示了遗漏检测和假阳性检测的性质。下图显示了其中的一些。
The figures in the left and in the middle row correspond to the false positives, the ones in the left is an area in which some rocks placed in a circle like order, and the one in the middle. The pictures in the right correspond to a false negatives, in this case only a small part was missed in the detection, in this case the one closer to the images. © Lantmäteriet: I2018 / 00119.
然而,该系统也能够检测到所有结构中的大部分,其中一些对于非考古专家(比如我自己)来说并不是微不足道的。下图描述了一些正确检测的示例。
Example of images correctly detected with its respective picture at the location. © Lantmäteriet: I2018 / 00119.
结论。
从非常少量的数据开始,使用不同的数据扩充技术、迁移学习方法和不同的 CNN 体系结构,有可能以 76 %的真阳性率对属于与训练数据来自的区域不同的区域的看不见的数据中 4 %的假阴性率进行预测。
我开始的问题是深度学习是否有助于考古结构的发现。所以答案是肯定的,这可能不是一个微不足道的任务,但确实是可能的。
这些方法的改进和研究非常重要,因为现在可用的数据比人类可能分析的数据要多。考古遗址的探测至关重要,因为它可以恢复和保护这些结构,这有助于了解这些古代文明的许多方面,以及整个人类历史,否则这些知识将永远丢失。
如果你想了解更多关于这个项目的细节,你可以在这里找到他们。
Penninggraven at Ängakåsen gravfält. The stone over 2 meters high was blown out in three parts in 1915 and probably would have been used as a building material for a bridge. The stone was eventually restored and now stands where it should stand. Image taken from: https://www.instagram.com/j.org.ls/
深度学习能比鸽子表现更好吗?
我第二次尝试 fast.ai 的《程序员实用深度学习》第二课
我正在学习 fast.ai 的杰瑞米·霍华德和雷切尔·托马斯(Rachel Thomas)教授的精彩的“程序员实用深度学习”课程的第二课,上周,我训练了一个深度学习模型来对怀孕测试的图像进行分类,这些测试的结果不是明显阳性或阴性,而是微弱阳性或显示蒸发线。然而,模型的准确性并不是我想要的,所以我决定重新开始一个分类问题,对于这个问题,我可以很容易地获得比棘手的怀孕测试分类问题更好的图像集。然后,我试图训练一个模型来对红杉和红杉进行分类,但再次达到了非常低的准确率,大多数错误来自被分类为红杉的红杉。红杉的树干比红杉大得多,但从图像上看,很难获得尺度感,我认为这个问题很可能是模型将红杉误认为红杉的原因。
所以再一次,我需要一个新问题。我考虑将画作归类为莫奈或马奈的作品,但我发现自己区分这两者的能力不足以检查模型的准确性,所以我决定尝试毕加索或莫奈的作品。我希望能够将我的模型的准确性与另一个模型的准确性进行比较,并且不要为这个问题找到深度学习模型,但要找到一项研究,该研究训练几组鸽子以超过 90%的准确性识别毕加索和莫奈的画作!我认为击败鸽子是我的模型可以接受的第一基准。
按照第二课讲座中的说明,我在 Google Images 上搜索“毕加索的画”和“莫奈的画”,并下载了这两组图像(见我之前的帖子,我需要对笔记本中的代码进行细微的调整)。
第一次出门,我的模型就打败了鸽子!
我的训练集损失是 0.396,而我的验证集损失是 0.086,我的错误率是 0.278。很难再提高了!不过,我的蜘蛛侠感觉在响,因为我的训练集损失高于我的验证集,我想 Jeremy 在讲座中说过,这是过度拟合的迹象。我在 fast.ai 论坛上搜索并找到了这篇文章,其中杰里米说,只要错误率低,一点点过度拟合是可以接受的。咻!
现在,对于一些超参数调谐,虽然精度如此之高,我根本不确定我可以显著提高它。我运行学习率查找器并试图绘制图表,但它显示为空白。笔记本上有一个提示,如果学习率查找器图是空白的,尝试运行learn.lr_find(start_lr=1e-5, end_lr=1e-1
。
那有效!这是图表。
根据图表,我将学习率设置在 1e-6 到 1e-4 之间:
我已经大大降低了我的训练集损失和验证集损失,但是错误率基本上是相同的(这是我所期望的)。这个模型只犯了一个错误,把毕加索的画归类为莫奈的。
我运行了 ImageCleaner,但没有发现任何质量差或有噪声的图像,所以我保留了它们。因为我的损失和错误率都很低,我想我的模型已经准备好了!
接下来,我打算在 web 应用程序中将我的模型投入生产。我以前玩过 HTML 和 CSS,就像我这样的千禧一代,很久以前我确实有一个 Geocities 网站,但我从未开发过 web 应用程序。杰里米说“建立一个 web 应用程序”,就像我可能会说“做一些咖啡”,所以也许它会相对容易?
我按照 fast.ai 的指示将[部署在渲染](https://course.fast.ai/deployment_render.html for deploying on Render (https://render.com/)上,并分叉所提供的回购。我遇到了一个小障碍:指令告诉我们编辑“app”目录中的 server.py 文件,但我在 Jupyter 目录树中的任何地方都找不到。最终,我意识到“app”目录在 GitHub 上的分叉回购中,而不是在 Jupyter 中!也许这对某些人来说是显而易见的,但对我来说不是。下一个小问题是,我们需要在 server.py 文件中编辑的变量名为“export_file_url”,而不是“model_file_url”,如说明中所示。没什么大不了的。
我继续按照部署说明进行操作,但是我的 web 应用程序无法部署,并且在我的 Render 日志中出现以下错误:TypeError: __call__() missing 2 required positional arguments: 'receive' and 'send'
。我不知道这是什么意思,所以我咨询了 fast.ai 论坛,并在找到了一个解决这个问题的帖子。显然,在 forked repo 中有一个名为 requirements.txt 的文件,它需要我的模型正在运行的各种库的版本号。我找到我的 requirements.txt 文件,在笔记本中创建一个新的单元格,并在其中运行! pip list
。我找到了 requirements.txt 文件所寻找的大部分值,但是没有 starlette、aiofiles 或 aiohttp 的条目。我在线程上复制并粘贴最近帖子中给出的值,交叉手指,但这不起作用。
所以我把贴到非常友好和有用的论坛上,并在我的 requirements.txt 文件中获取一些新的值来尝试。
进步!我的 web 应用程序部署了,但它似乎默认为回购中默认的泰迪熊分类器示例。我确实更新了 server.py 文件中的 URL 链接,但是由于我的 export.pkl 小于 100 MB,所以第一次没有生成 API 密钥。不过,也许我需要一个,所以这次我按照这些指令去做。我使用新链接再次编辑 server.py 文件,并重新部署。不,还是熊。
server.py 中仍然有一个示例链接,但它似乎被注释掉了。我试试删?但是我也编辑了类别为“毕加索”和“莫奈”,而不是熊的类型,所以那些也应该改变了。嗯……如果他们做了呢?也许它看起来像熊分类器,但它实际上是我的绘画分类器?
我接受了“有益蠕虫”的建议,试着让̶w̶a̶l̶k̶i̶n̶g̶̶t̶h̶r̶o̶u̶g̶h̶̶i̶t̶运行它。
是啊!我通过分类器运行毕加索的图像,模型对它进行了正确的分类。因此,当实际运行我的分类器时,它显示得好像是熊分类器。
我发现我需要在某个地方为面向用户的文本编辑一些代码,但是不知道在哪里做。fast.ai 论坛上非常有用的 mrfabulous1 再次出现,告诉我我需要编辑的代码是“app”目录的“view”子目录中的 index.html 文件。有用!
试试我的“毕加索还是莫奈?”给自己分类器这里!
因此,现在我有了一个准确率高达 97%的图像分类模型,并部署了一个 web 应用程序来使用它。继续第三课!
查看 GitHub 上的代码!
关于此主题的其他帖子:
第一课:fast . ai 入门
第二课(尝试 1): 对验孕结果进行分类!
第三课:一万种行不通的方法
第四课:预测服务员的小费
第五课:但是泡菜去哪了?
第六课:每个人都想成为一只猫
我是加州大学东湾分校的数学讲师,也是一名有抱负的数据科学家。在 LinkedIn 上和我联系,或者在 Twitter 上打招呼。
机器学习可以模拟简单的数学函数吗?
使用机器学习对一些基本数学函数建模
Photo Credits: Unsplash
如今,将机器学习应用于各种任务已经成为一种规范。这是一个事实的征兆,即机器学习似乎是 Gartner 对新兴技术的炒作周期中的一个永久固定装置。这些算法被视为自己解决问题的模型:将任何类型的数据分解为一系列特征,应用大量黑盒机器学习模型,评估每个模型,并选择效果最好的一个。
但是,机器学习真的能解决所有这些问题吗,或者它只是对少数任务有好处?在这篇文章中,我们倾向于回答一个更基本的问题,那就是,ML 甚至可以推导出日常生活中非常常见的数学关系吗?在这里,我将尝试使用一些流行的机器学习技术来拟合一些基本函数。让我们看看这些算法是否能辨别和模拟这些基本的数学关系。
我们将尝试适应的功能:
- 线性的
- 指数的
- 对数
- 力量
- 系数
- 三角法的
将使用的机器学习技术:
- XGBoost
- 线性回归
- 支持向量回归机
- 决策图表
- 随机森林
- 多层感知器(前馈神经网络)
准备数据
我保持因变量的大小为 4(没有理由选择这个特定的数字)。因此,X(自变量)和 Y(因变量)之间的关系将是:
f:我们试图拟合的函数
ε:-随机噪声(使我们的 Y 更真实一点,因为真实生活中的数据总会有一些噪声)
每种函数类型都使用一组参数。这些参数是通过使用以下方法生成随机数来选择的:
numpy.random.normal()
numpy.random.randint()
randint()用于获取幂函数的参数,以避免 Y 值变得非常小。normal()用于所有其他情况。
生成自变量(或 X):
对于对数,均值为 5 的正态分布(均值> >方差)用于避免获得任何负值。
获取因变量(或 Y):
噪声随机采样,平均值为 0。我让噪声方差等于 f(X)的方差,以确保我们的数据中的“信号和噪声”是可比较的,一个不会在另一个中丢失。
培养
注意:没有对任何模型进行超参数调整。
基本原理是对这些模型在上述功能上的性能进行粗略估计,因此,没有做太多工作来针对这些情况中的每一个优化这些模型。
结果
Results
大多数绩效结果都比平均基线好得多。随着平均 R 平方达到 70.83% ,,我们可以说机器学习技术在模拟这些简单的数学函数方面确实很不错。
但是通过这个实验,我们不仅知道机器学习是否可以模拟这些功能,还知道不同的技术如何在这些不同的基础功能上执行。
有些结果令人惊讶(至少对我来说),而有些则令人放心。总的来说,这些结果重新确立了我们以前的一些信念,也产生了一些新的信念。
总之,我们可以说:
- 线性回归尽管一个简单的模型在线性相关数据上胜过其他任何模型
- 在大多数情况下,决策树< Random Forest < XGBoost, according to performance (as is evident in 5 out of 6 cases above)
- Unlike the trend these days in practice, XGBoost (turning out best in just 2 out of 6 cases) should not be a one-stop-shop for all kinds of tabular data, instead a fair comparison should be made
- As opposed to what we might presume, Linear function may not necessarily be easiest to predict. We are getting best aggregate R-squared of 92.98% for Logarithmic function
- Techniques are working (relatively) quite different on different underlying functions, therefore, technique for a task should be selected via thorough thought and experimentation
Complete code can be found on my github 。
鼓掌,评论,分享。建设性的批评和反馈总是受欢迎的!
机器学习能预测股市吗?
我们测试技术是否强大到足以解开金融市场的谜团
Photo by Chris Liverani on Unsplash
如果投资正确明智,美国股市可以产生惊人的回报。跟随量化投资公司如两个适马和 Citadel 的脚步,我们有兴趣知道我们是否可以使用机器学习来预测股价走势。
注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
数据
我们使用 Alpha Vantage API 提取五只 ETF(QQQ、TQQQ、VTI、IWM、SPY)的每日价格数据,并从开盘价、最高价、最低价、收盘价和成交量开始。
特征生成
我们决定在 python 中手动创建函数来计算交易中常用的几个技术指标:柴金模数、波段、CCI、均线、MACD、OBV、RSI、SMA 和 STOCH。
简单移动平均线
移动平均线用于平滑数组中的数据,以帮助消除噪音和识别趋势。简单移动平均线实际上是移动平均线的最简单形式。每个输出值是前 n 个值的平均值。在简单移动平均线中,时间段内的每个值具有相同的权重,时间段之外的值不包括在平均值中。这使得它对数据中最近的变化不太敏感,而这对于过滤掉那些变化是有用的。
指数移动平均线
指数移动平均线是技术分析的主要部分,在无数的技术指标中使用。在简单移动平均线中,时间段内的每个值具有相同的权重,时间段之外的值不包括在平均值中。但是,指数移动平均线是一种累积计算,包括所有数据。过去的值对平均值的贡献越来越小,而最近的值贡献越来越大。这种方法使移动平均线对数据的变化更敏感。
移动平均收敛发散
移动平均线收敛发散(MACD)是两个指数移动平均线之间的差异。信号线是 MACD 的指数移动平均线。
MACD 发出趋势变化的信号,表明新趋势方向的开始。高值表示超买状态,低值表示超卖状态。与价格的背离表明当前趋势的结束,特别是当 MACD 处于极高或极低的值时。当 MACD 线穿过信号线时,就会产生买入信号。当 MACD 穿过信号线下方时,就会产生卖出信号。为了确认这个信号,MACD 应该在零以上买入,在零以下卖出。
MACD 的时间周期通常是 26 日和 12 日。但是,函数实际上使用的是 0.075 和 0.15 的指数常数,更接近于 25.6667 和 12.3333 周期。要创建时间周期不同于 MACD 内置时间周期的类似指标,请使用价格振荡器函数。
随机振荡器
随机振荡指标衡量收盘与最近交易区间的关系。值的范围从 0 到 100。%D 值超过 75 表示超买状态;低于 25 的值表示超卖状态。当快速的%D 穿越慢速的%D 上方时,是买入信号;当它穿过下方时,是卖出信号。原始%K 通常被认为太不稳定,不能用于交叉信号。
积累/分配线
累积/分配线类似于平衡交易量(OBV ),它根据收盘价是否高于前一收盘价来计算交易量乘以+1/-1 的总和。然而,累积/分布指示器将体积乘以接近位置值(CLV)。CLV 基于单根棒线内的发行变动,可以是+1、-1 或零。
积累/分配线是通过寻找指标相对于价格的背离方向来解释的。如果累积/分配线呈上升趋势,则表明价格可能会跟随上涨。此外,如果在价格仍在上涨(或下跌)时,积累/分配线变平,那么它标志着价格即将变平。
布林线
布林线由三条线组成。中间带是典型价格(TP)的简单移动平均线(一般为 20 个周期)。上下波段是中间波段上下的 F 标准差(一般为 2)。当价格波动较高或较低时,波段分别变宽和变窄。
布林线本身不会产生买入或卖出信号;它们是超买或超卖的指标。当价格接近上限或下限时,它表明反转可能即将发生。中间带成为支撑位或阻力位。上下波段也可以解释为价格目标。当价格从低波段反弹并穿过中波段时,高波段就成为价格目标。
论平衡体积
平衡交易量(OBV)是上涨和下跌交易量的累计总和。当收盘价高于前一收盘价时,成交量被加到累计总数中,当收盘价低于前一收盘价时,成交量被从累计总数中减去。
要解读 OBV,寻找随价格移动或先于价格移动的 OBV。如果价格在 OBV 之前变动,那么它就是一个未确认的变动。OBV 一系列上升的波峰或下降的波谷表明了一个强劲的趋势。如果 OBV 是平的,那么市场不是趋势。
特征生成后的数据
我们的假设
我们最初希望使用所有 ETF(QQQ、TQQQ、SPY、VTI、IWM)的数据建立一个单一模型,以预测交易所交易股票的长期价格趋势。如果未来 20 个交易日的回报率> 3%,我们将标签设为 1,否则设为 0。
然而,我们发现每个 ETF 之间的数据差异很大,所以我们决定需要为每个 ETF 建立单独的模型。我们最终只使用 QQQ ETF 数据集来构建我们的模型。
实验 1 (20 天回报率> 3%,如标签所示)
LSTM:测试 AUC 0.476
MLP 神经网络:测试 AUC 0.577
随机森林:测试 AUC 0.917
好得难以置信——虚幻的希望
我们使用 QQQ 数据集的最佳模型给出了. 917 的 AUC。我们以为我们找到了预测股票市场的方法。然而,事实并非如此,因为我们在模型中发现了一个重大缺陷。
按照惯例,在机器学习中,您需要打乱数据集,以便创建训练集和测试集。这样做是必要的,因为您希望测试集中的数据与训练数据来自相同的分布。但是,因为历史股票数据是依赖于时间的,这意味着后续日期的数据在这些后续日期发生之前不存在,所以对我们的数据进行洗牌将意味着训练数据集可以访问实际上是在未来设置的一些数据。例如,假设,如果我们要在 2017 年使用具有 2018 年数据的数据集来训练我们的模型,我们实际上不能使用这个训练数据集来训练我们的模型,因为在 2017 年,2018 年的数据还不存在。因此,在创建训练和测试数据集时,我们不能打乱数据。
对于我们的下一个模型,我们使用 2010 年至 2016 年的数据作为我们的训练集,使用 2017 年至 2019 年的数据作为我们的测试集。这种分布分割也很有用,因为它基本上允许我们“模拟”我们的模型如何处理未来数据。
可悲的是,使用这种模型,AUC 分数在相同的随机森林分类器下显著下降到 0.44。
随机森林:测试 AUC 0.440
重新思考标签分配
正如您在我们的样本数据集中看到的,所有这些行都有非常相似的 20-MAs、打开和关闭。如果 2019 年 1 月 4 日之后的 20 天有> 3%的涨幅,那么 2019 年 1 月 4 日左右的日子也将有> 3%的涨幅,对于任何股票来说都是如此,20 天内标签上涨的决定因素通常不是在第 20 天决定的。它是在记录在其 20 个未来交易周期中有重叠周期的日子里确定的。在这种情况下,如果我们提取 2019 年 1 月 6 日作为测试集,并对其余部分进行训练,模型肯定会为测试数据分配一个标签,因为它的所有特征都与它周围的日期相似,从而形成一个聚类。这种方法的另一个问题是,如前所述,模型允许训练集使用未来的数据进行预测。例如,训练集包括 2019 年 1 月 7 日-2019 年 1 月 11 日,以预测 2019 年 1 月 6 日,这在现实世界中是不可能的。
当我们不重组原始数据集,并且使用较晚的日期作为测试集时,这就成了一个问题。在这种情况下,训练集中的收盘价徘徊在每股 20 美元左右,但由于我们使用 2019 年作为测试集,价格明显不同,因此,模型在为它们分配正确的标签方面表现不佳,特别是考虑到我们的记录具有训练集中不存在的一系列值的特征。
我们想出的解决方案是将我们的标签改为每日股价变动。如果第二天的收盘价高于当天的收盘价,则标签为 1。在这里,一天的股票价格第二天是否上涨是相互独立的,这解决了我们形成集群和窥视未来数据的问题。
实验 2(第二天价格上涨/下跌,如标签所示)
1.TPOT
参考文献:
https://towardsdatascience . com/tpot-automated-machine-learning-in-python-4c 063 B3 e 5 de 9
https://epistasislab.github.io/tpot/using/
TPOT 是一个开源的 AutoML python 包,运行在特征工程和模型选择的许多不同组合中。TPOT 自动创建许多管线,包括不同的特征工程方法(PCA、MaxAbsScaler、MinMaxScaler 等)以及各种混合超参数的不同模型。
TPOT 的性能在很大程度上取决于管道的数量和您允许它运行的时间。流水线的总数等于种群大小+世代 x 后代大小,这可以在 TPOT 参数中确定。
由于我们只让 TPOT 跑了 150 个管道,只用了不到 15 分钟,所以性能并不理想:测试 AUC 0.509。然而,只要有足够的时间(几十个小时甚至几天),TPOT 可以成为一个非常强大和简单的工具来产生巨大的成果。
此外,TPOT 自动存储其搜索到的最佳管道,并允许用户将这些结果导出为. py 文件。如你所见,在我们的例子中,TPOT 对我们的数据进行了主成分分析,并选择高斯神经网络作为最佳分类模型。
2.XGBoost
使用 XGBClassifier,除了学习率、最大深度、n_estimators 和子样本之外,我们不需要配置太多。使用交叉验证和 AUC 评分标准,我们优化了超参数。最后,我们使用优化的超参数在 X-train 和 y-train 上制作最终模型。测试集的准确度(非 AUC)为 50.5%
使用 XGBClassifier,我们获得了 0.478 的测试集 AUC 分数
3.随机森林
使用随机森林分类器,我们使用强力网格搜索交叉验证在一个值范围内调整超参数。最佳参数显示为 max_depth = 3,min_samples_leaf = 3。
使用这个随机森林分类器,我们获得了 0.519 的测试集 AUC 分数
4.谷歌汽车
随着 AutoML 越来越受欢迎,我们决定将我们的数据集输入到 Google Cloud AutoML,看看它是否可以预测比我们更好的 AUC 分数。Google AutoML 有一个非常用户友好的界面,在你上传数据集后,它会自动给出一些统计数据。
在像我们这样的分类项目中,Google AutoML 允许用户选择不同的性能指标来优化最终的模型。
那么 Google AutoML 做的怎么样呢?仅仅一个小时的训练后,它返回了 0.529 的 AUC,这是我们过程中最高的。值得注意的是,随机森林的 AUC 达到 0.519,仅比 Google AutoML 低 0.01。
结论和见解
**技术分析的弱点:**在金融的世界里,技术分析(利用历史股价预测未来股价)已经被证明是徒劳的。在进一步分析中,可以考虑其他特征:
- 推文废弃:推文情感分析
- 财报电话会议记录:分析高管在财报电话会议上的语气;评估高管/分析师正在讨论的话题
- 卫星数据(油井的卫星图像有可能被用来预测石油价格)
战胜股市的唯一真正方法是获得额外的信息,例如获得未来的数据或提前知道季度收益结果,这导致不可能或非法。使用技术指标可以告诉你故事的一部分,但预测第二天的股票方向太随机,受外部因素的影响,无法创建一个强大的模型。
关键提示:只有当用于训练模型的数据和模型未来遇到的数据来自同一个分布时,机器学习项目才是有用和有效的,而当使用独立且波动的股市日收益率作为标签时,情况并非如此。
贡献者
oseph.chin@utexas.edu约瑟夫·陈,犹他·MSBA【20:j】
郝伦科林楚,UT 奥斯汀 MSITM ’ 20:colinchu@utexas.edu
威尔希尔刘,UT 奥斯汀 MSITM’20:wilshire.liu@utexas.edu
smitheitches@gmail.com 布莱恩·史密斯-艾奇斯,UT Austin MSITM '20: