TowardsDataScience 博客中文翻译 2016~2018(四十二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

Keras 图像分类基础

原文:https://towardsdatascience.com/basics-of-image-classification-with-keras-43779a299c8b?source=collection_archive---------1-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我之前的帖子中,我深入研究了人工神经网络的一些理论概念。在这篇文章中,我将解释一些你在 keras 中经常需要的常见操作。首先,如何保存模型并在以后使用它们进行预测,显示来自数据集的图像,从我们的系统加载图像并预测它们的类别。

如果您还没有启动 IDE,请继续阅读。

保存模型

训练模型是一个非常缓慢的过程,没有人希望每次都这样做,幸运的是,我们只需要训练我们的模型一次,保存它,然后我们可以随时加载它,并用它来预测新的图像。

Keras 以. h5 格式保存模型,所以如果您在我发布的第一篇教程中跳过了安装 h5py,请运行

pip3 install h5py

我们还需要 matplotlib 来可视化我们的图像,因此,运行

pip3 install matplotlib

这是第一个教程的代码

import keras
from keras.datasets import mnist
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD (train_x, train_y) , (test_x, test_y) = mnist.load_data()
#train_x = train_x.astype('float32') / 255
#test_x = test_x.astype('float32') / 255print(train_x.shape)
print(train_y.shape)
print(test_x.shape)
print(test_y.shape)train_x = train_x.reshape(60000,784)
test_x = test_x.reshape(10000,784)train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)model = Sequential()
model.add(Dense(units=128,activation="relu",input_shape=(784,)))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=10,activation="softmax"))model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])
model.fit(train_x,train_y,batch_size=32,epochs=10,verbose=1)accuracy = model.evaluate(x=test_x,y=test_y,batch_size=32)print("Accuracy: ",accuracy[1])

要保存模型,只需在 model.fit()后添加以下内容

model.save("mnist-model.h5")

推理

推理是指使用我们的模型预测新图像的过程。

在代码中,注释掉

model.fit

取而代之的是

model.load_weights("mnistmodel.h5")

我们的代码现在看起来像这样

import keras
from keras.datasets import mnist
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD(train_x, train_y) , (test_x, test_y) = mnist.load_data()
#train_x = train_x.astype('float32') / 255
#test_x = test_x.astype('float32') / 255print(train_x.shape)
print(train_y.shape)
print(test_x.shape)
print(test_y.shape)train_x = train_x.reshape(60000,784)
test_x = test_x.reshape(10000,784)train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)model = Sequential()
model.add(Dense(units=128,activation="relu",input_shape=(784,)))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=10,activation="softmax"))model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])
model.load_weights("mnist-model.h5")
#model.fit(train_x,train_y,batch_size=32,epochs=10,verbose=1)#model.save("mnistmodel.h5")accuracy = model.evaluate(x=test_x,y=test_y,batch_size=32)print("Accuracy: ",accuracy[1])

我们在这里做的是从保存的模型文件中加载模型的参数,evaluate 函数在测试数据集上运行预测,并返回我们预测的准确性。

到目前为止,我已经演示了如何保存模型并在以后使用它们进行预测,然而,这都是些无聊的东西,真正的问题是能够加载特定的图像并确定它属于哪个类。

第一步是添加下面的代码,从测试中获得特定图像的预测

img = test_x[130]
test_img = img.reshape((1,784))img_class = model.predict_classes(test_img)
prediction = img_class[0]classname = img_class[0]print("Class: ",classname)

在这里,我们只是从测试集中选取一个随机图像,在这个例子中,在索引 130 处,我们创建一个展平的副本,它被整形为

(1,784)

我们把这个拷贝输入到我们的模型中,然后我们得到预测并打印出来。

注释掉代码中的 model.evaluate,添加上面的代码并运行它。

您的输出应该是这样的:

Class: 6

现在我们有了预测,我们使用 matplotlib 来显示图像及其预测的类

img = img.reshape((28,28))
plt.imshow(img)
plt.title(classname)
plt.show()

这里的整形操作对于 matplotlib 显示图像是必要的

您更新的代码应该都是这样的

import keras
from keras.datasets import mnist
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD
import matplotlib.pyplot as plt (train_x, train_y) , (test_x, test_y) = mnist.load_data()train_x = train_x.reshape(60000,784)
test_x = test_x.reshape(10000,784)train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)model = Sequential()
model.add(Dense(units=128,activation="relu",input_shape=(784,)))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=10,activation="softmax"))model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])
model.load_weights("mnistmodel.h5")img = test_x[130]
test_img = img.reshape((1,784))img_class = model.predict_classes(test_img)
prediction = img_class[0]classname = img_class[0]print("Class: ",classname)img = img.reshape((28,28))
plt.imshow(img)
plt.title(classname)
plt.show()

运行这个,你的输出应该是这样的

就是这样!非常简单,我们已经建立了一个基本的数字识别系统。

我鼓励您尝试测试图像的不同索引,亲自看看结果会是什么。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是,如果我们想要引入一个不包含在测试集中的图像,对于这个测试,请将下面的图像保存到您的系统中,并将其复制到 python 文件所在的目录中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

运行下面的代码

import keras
from keras.datasets import mnist
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD
import matplotlib.pyplot as plt
from keras.preprocessing import image (train_x, train_y) , (test_x, test_y) = mnist.load_data()train_x = train_x.reshape(60000,784)
test_x = test_x.reshape(10000,784)train_y = keras.utils.to_categorical(train_y,10)
test_y = keras.utils.to_categorical(test_y,10)model = Sequential()
model.add(Dense(units=128,activation="relu",input_shape=(784,)))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=128,activation="relu"))
model.add(Dense(units=10,activation="softmax"))model.compile(optimizer=SGD(0.001),loss="categorical_crossentropy",metrics=["accuracy"])
model.load_weights("mnistmodel.h5")img = image.load_img(path="testimage.png",grayscale=True,target_size=(28,28,1))
img = image.img_to_array(img)
test_img = img.reshape((1,784))img_class = model.predict_classes(test_img)
prediction = img_class[0]classname = img_class[0]print("Class: ",classname)
img = img.reshape((28,28))
plt.imshow(img)
plt.title(classname)
plt.show()

你可能会注意到一些新的东西,首先我们从 keras.preprocessing 导入图像

接下来我们添加了

img = image.load_img(path="testimage.png",grayscale=True,target_size=(28,28,1))
img = image.img_to_array(img)

在第一行中,我们从磁盘加载图像,并指定它的大小应该调整为 28 x 28 x 1,记住这是原始 mnist 图像的大小,所以我们保持不变是有好处的。

接下来,我们将图像转换成像素数组,就这样。

运行它并亲自检查结果,看预测值是否为 3。

任何问题或评论请在下面的评论框中留下,你也可以通过 twitter 联系我,电话: @johnolafenwa

如果你喜欢这个教程,给一些掌声。

下一篇文章将是关于使用卷积神经网络,这将把我们的准确率提高到 99%以上!!!保持联系就好。

使用 Python 的 Scikit-Learn 实现进行图像识别的基础知识

原文:https://towardsdatascience.com/basics-of-image-recognition-using-pythons-scikit-learn-implementation-5efcff465b64?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

随着机器学习和大数据分析的名气越来越大,非结构化数据分析的一个更受研究的领域是图像处理和识别。如果我们在网上看看,我们的安全部门正在努力改善图像识别,我们的智能手机使用面部识别改善图像捕捉,并使用谷歌的 TensorFlow 进行各种图像分类。

如果你一直在关注我的博客,你现在应该意识到我是 Python 的超级粉丝。虽然 Python 不是神经网络应用的最佳语言,但它仍然为快速软件开发和理解机器学习概念提供了简单的语法。Python 在许多机器学习应用程序中非常受欢迎,这仅仅是因为它的简单性及其 Scikit-Learn 机器学习库的广泛社区。

因此,我使用 MNIST 数据集为完全不熟悉图像识别的人开发了一个简单的介绍教程:

篮球分析:最好的选秀课程

原文:https://towardsdatascience.com/basketball-analytics-the-best-draft-class-13a6eac0cdb5?source=collection_archive---------9-----------------------

使用 Python 创建数据可视化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Tim Mossholder on Unsplash

介绍

NBA 内幕是电视上最好的节目。嗯,如果你热爱篮球,这是最好的节目。艾美奖获奖节目遵循了 NBA 年度最大的一些比赛的赛前和赛后分析。由厄尼·约翰逊主持,该节目涵盖了各种 NBA 话题,包括对其他工作室分析师的批判性分析:前 NBA 冠军奥尼尔和史密斯。哦,还有一个叫查尔斯·恰克·巴克利的家伙。让这个节目如此吸引篮球迷的是分析师之间的化学反应。这个节目包括 70%的篮球话题,25%的无意义话题(大部分是垃圾话题),还有 5%是厄尼试图让每个人都抓住主题。前一秒,工作人员还在谈论西部决赛的第二场比赛,然后转而谈论你应该多久给你的油箱加一次油。说真的,他们花了超过 2 分钟来谈论这个!

NBA 内部人员不断提出的一个持续的话题是老学校与新学校的辩论。沙克、肯尼和查克将会持续几天谈论他们那个时代的 NBA 球员是如何变得更好、更强,以及更有竞争力。现在,我将通过一些数据可视化来测试这一争论。还有什么更好的方法来解决与一些 Python 的争论呢!好吧,这听起来可能没什么意思,但我会努力让这个分析物有所值。

为了进行这种分析,我将只着眼于 3 个最好的 NBA 选秀(无可争议):1984 年,1996 年和 2003 年。为什么?嗯,他们每个人都有一些有史以来最伟大的球员。1984 年有哈基姆·阿卜杜尔·奥拉朱旺、查尔斯·巴克利,当然还有“山羊”迈克尔·乔丹(有争议?可能)。1996 年有阿伦艾弗森,史蒂夫纳什和科比布莱恩特。2003 年有德韦恩·韦德、克里斯·波什和勒布朗·詹姆斯(是的,我是湖人球迷)。除了是有史以来最好的选秀班,这些选秀班都代表了 NBA 不同的时代。

分析数据来自篮球参考。篮球参考从他们的网站为球迷和分析家提供统计数据,这意味着所有的统计数据都是官方的。还包括金州勇士队在 2016 NBA 总决赛3-1 领先克利夫兰骑士队的事实。但这个讨论是另一个时间。

注意:这篇文章使用的所有代码都可以在 GitHub 上找到,组织在这个笔记本上。

数据清理

我们从组织数据开始分析。

第一个数据集包含了过去 68 年来所有 NBA 球员的数据,从 1949-50 赛季开始,到 2016-17 赛季结束。

import pandas as pd
import numpy as np
import matplotlib.pyplot as pltseasons = pd.read_csv('Seasons_Stats.csv')
seasons.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马上就有很多数据不会用到。分析将集中于 20 世纪 80 年代及以后的球员。因此,我将只包括那个时期的球员数据。

years = list(range(1980,2018))
seasons = seasons[seasons['Year'].isin(years)]
seasons.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在一个 NBA 赛季中有不同类型的球员。有所有的明星球员,角色球员,和板凳球员。后者其实并不那么重要(除非你的团队中有罗伯特·萨克雷)。对于这个分析,我想把重点放在有某种影响的球员身上。因此,我将包括在 NBA 赛季中每场比赛至少打 20 分钟的球员。为此,我需要为每场比赛的分钟数(MPG)创建一个新列。

seasons['MPG'] = round(seasons['MP'] / seasons['G'], 1)seasons = seasons[seasons['MPG'] >= 20]
seasons.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我需要从我们的分析中排除的另一个方面是赛季总数。每当一个球员在 NBA 赛季中通过交易或买断为两个或更多的球队效力时,就会添加一个新行来显示球员的赛季总数。例如,2013 年,乔纳森·克雷则·雷迪克,也被称为 J.J .雷迪克(你可能不知道他的名字是乔纳森),在交易截止日期前从奥兰多魔术队被交易到密尔沃基雄鹿队。因此,数据显示相同季节的多个条目(包括一个总计条目)。

seasons[(seasons['Player'] == 'J.J. Redick') & (seasons['Year'] >= 2013)]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我将删除这些行,因为我们将在后面的分析中按球员分组统计数据。此外,我将删除一个特殊的字符,这是包括在一些球员的名字。

seasons = seasons.drop_duplicates(['Player','Year'], keep = 'first')seasons[(seasons['Player'] == 'J.J. Redick')]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第二个数据集由球员信息组成,包括球员在 NBA 打球的时间段。为了分析,我将包括 1984 年,1996 年和 2003 年被选中的每一个球员。在这里,我通过包括每个球员的新秀年来选择选秀年。例如,迈克尔·乔丹在 1984 年被选中,但是数据显示他的新秀年是 1985 年。

players = pd.read_csv('player_data.csv')years_draft = [1985, 1997, 2004]players.columns = ['Player', 'Rookie Year', 'Final Year',  'Position', 'Height','Weight','DOB','College']players = players[players['Rookie Year'].isin(years_draft)]players['Player'] = players['Player'].str.replace('*','') ### Remove special character

对于数据清理过程的最后一部分,我将创建一个新的数据表,其中包含一些我们将要分析的统计数据。因为我将按选秀级别比较 NBA 球员的职业统计数据,所以我将按选秀级别分组。

data = seasons[['Year', 'Player','G','MP','PER', 'TS%', 'FG%', '3P%','2P%', 'eFG%','OWS', 'DWS', 'WS', 'WS/48',
                'USG%','OBPM', 'DBPM', 'BPM', 'VORP']]
data = data[data['Year'].isin(years)]
data['Year'] = data['Year'].astype(object)data_draft = players.merge(data, on = 'Player')data_draft['Rookie Year'] = data_draft['Rookie Year'] - 1 ### Set the Year to the correct draft classf = {'G': ['sum'],'MP': ['sum'],'PER': ['mean'], 'TS%': ['mean'], 'FG%': ['mean'], '3P%': ['mean'],'2P%': ['mean'], 
     'eFG%': ['mean'],'OWS': ['mean'], 'DWS': ['mean'], 'WS': ['mean'], 'WS/48': ['mean'],'USG%': ['mean'],
     'OBPM': ['mean'], 'DBPM': ['mean'], 'BPM': ['mean'], 'VORP': ['mean']}data_draft = data_draft.groupby(['Rookie Year'], as_index = False).agg(f)

分析

我们如何确定哪个草稿类是最好的?很容易简单地比较每个选秀球员的职业生涯得分、篮板和助攻总数。这真的能告诉我们某个选秀职业的球员比其他人更优秀吗?大概不会。为了分析选秀职业,我想使用考虑到游戏其他方面的数据。这是用于分析的 3 个最好的统计数据:球员效率等级(PER),对替补球员的价值(VORP),以及每 48 分钟的赢球份额(WS/48)。

玩家效率等级(PER)

PER 是霍林格创造的一个统计数据,它考虑了诸如投篮命中率、罚球、三分球、助攻、篮板、盖帽和抢断等成绩,以及诸如投篮不中、失误和个人犯规等负面结果。顾名思义,这个属性评估一个球员在场上的影响力。让我们来看一下,迈克尔·乔丹和勒布朗·詹姆斯是 PER 的职业领袖。所以,这是这个分析的可靠指标。

*per = data_draft.sort_values([('PER','mean')], ascending = False).reset_index()
pos = list(range(len(per['PER','mean'])))plt.style.use('fivethirtyeight')
fig, ax = plt.subplots(figsize = (15,8))
plt.bar(pos, per['PER','mean'], width = 0.75, alpha = 0.75, label = per['Rookie Year'], edgecolor = 'gray', linewidth = 2)
for i in pos:
    plt.text(pos[i], 6, s = per['Rookie Year'][i],ha='center', va='bottom', color = 'orange', size = 50)
plt.text(x = -0.68, y = 19.5, s = 'Total Career PER - 1984 Draft Class lead in efficiency',fontsize = 30, weight = 'bold', alpha = .75)
plt.text(x = -0.68, y = 18.3, s = 'Total Career PER for all NBA players drafted in 1984, 1996, and 2003',fontsize = 19, alpha = .85)
plt.text(x = -0.68, y = -1.5, s = 'National Basketball Association                                                                                       Source: Basketball-Reference.com ', fontsize = 17,color = '#f0f0f0', backgroundcolor = 'grey')
plt.xticks([],[])
ax.set_ylabel('PER', size = 25)*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

价值超过替补队员(VORP)

VORP 是一名球员在替补级别球员之上贡献的每 100 场球队财产点数的盒子分数估计,转换为平均球队并按比例分配给 82 场比赛的赛季。这相当于棒球中的战争,它表明了一个球员对他们球队的总贡献。

*vorp = data_draft.sort_values([('VORP','mean')], ascending = False).reset_index()
pos1 = list(range(len(vorp['VORP','mean'])))plt.style.use('fivethirtyeight')
fig, ax = plt.subplots(figsize = (15,8))
plt.bar(pos1, vorp['VORP','mean'], width = 0.75, alpha = 0.75, label = vorp['Rookie Year'], edgecolor = 'gray', linewidth = 2)
for i in pos1:
    plt.text(pos1[i], .6, s = vorp['Rookie Year'][i],ha='center', va='bottom', color = 'orange', size = 50)
plt.text(x = -0.68, y = 2.55, s = 'Total Career VORP - Jordan and friends keep dominating',fontsize = 30, weight = 'bold', alpha = .75)
plt.text(x = -0.68, y = 2.4, s = 'Total Career VORP for all NBA players drafted in 1984, 1996, and 2003',fontsize = 19, alpha = .85)
plt.text(x = -0.7, y = -.15, s = 'National Basketball Association                                                                                       Source: Basketball-Reference.com ', fontsize = 17,color = '#f0f0f0', backgroundcolor = 'grey')
plt.xticks([],[])
ax.set_ylabel('VORP', size = 25)*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每 48 分钟赢得股份(WS/48)

WS/48 是一个简化了玩家每 48 分钟产生的胜利份额数(相当于一场 NBA 比赛)的统计。像 VORP 一样,win shares 计算玩家对团队胜利的总体贡献。由于每个玩家的上场时间不同,WS/48 调整了统计数据来帮助玩家之间的比较。

*ws = data_draft.sort_values([('WS/48','mean')], ascending = False).reset_index()
pos = list(range(len(ws['WS/48','mean'])))plt.style.use('fivethirtyeight')fig, ax = plt.subplots(figsize = (15,8))
plt.bar(pos, ws['WS/48','mean'], width = 0.75, alpha = 0.75, label = ws['Rookie Year'], edgecolor = 'gray', linewidth = 2)
for i in pos:
    plt.text(pos[i], 0.045, s = ws['Rookie Year'][i],ha='center', va='bottom', color = 'orange', size =50)plt.text(x = -0.7, y = 0.145, s = 'Total Career WS/48 - We get it. 1984 is the best draft class',fontsize = 30, weight = 'bold', alpha = .75)
plt.text(x = -0.7, y = 0.135, s = 'Total Career WS/48 for all NBA players drafted in 1984, 1996, and 2003',fontsize = 19, alpha = .85)
plt.text(x = -0.71, y = -.012, s = 'National Basketball Association                                                                                       Source: Basketball-Reference.com ', fontsize = 17,color = '#f0f0f0', backgroundcolor = 'grey')
plt.xticks([],[])
ax.set_ylabel('WS/48', size = 25)*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论

好吧,当沙克、肯尼和查尔斯说过去的球员更好的时候,他们可能有一点道理。虽然我的分析显示 1984 年的选秀班在 PER、VORP 和 WS/48 中表现更好,但还是有一些问题。首先,现在 NBA 中的一些规则在过去并不存在。例如,在 20 世纪 90 年代早期,三分球犯规、畅通无阻犯规和防守三秒规则都不是 NBA 的一部分。这些规则中的每一条都会导致额外的罚球,这可能会增加或减少你的 PER(取决于是否罚球)。

我应该在做分析之前提出这些问题吗?也许吧。然而,这证明了我分析的全部观点:让我们停止比较几代人,享受这场表演吧!所有这些代人都是不同的,这是篮球最好的部分。魔法和鸟是不同的。乔丹是不同的。勒布朗不一样。斯蒂芬库里是不同的。篮球不应该太关注过去,而应该更多的关注未来。

批量标准化

原文:https://towardsdatascience.com/batch-normalization-8a2e585775c9?source=collection_archive---------0-----------------------

这个想法是,我们不只是将网络的输入标准化,而是将网络中层的输入标准化。它被称为“批量”归一化,因为在训练期间,我们通过使用当前小批量中的值的均值和方差(通常是零均值和单位方差)来归一化每一层的输入。

批量标准化的好处

批量归一化优化网络训练。已经证明它有几个好处:

  1. 网络训练更快 —每次训练迭代实际上会更慢,因为正向传递过程中需要额外的计算,反向传播过程中需要训练额外的超参数。然而,它应该收敛得更快,所以训练应该更快。
  2. 允许更高的学习速率 —梯度下降通常需要较小的学习速率来使网络收敛。随着网络越来越深,它们的梯度在反向传播过程中变得越来越小,因此它们需要更多的迭代。使用批量标准化允许我们使用更高的学习率,这进一步提高了网络训练的速度。
  3. 使权重更容易初始化 —权重初始化可能会很困难,在创建更深的网络时甚至更困难。批量标准化似乎允许我们在选择初始权重时不那么小心。
  4. 使更多的激活功能变得可行 —一些激活功能在某些情况下不能很好地工作。Sigmoids 很快就会失去梯度,这意味着它们不能用于深层网络。ReLUs 经常在训练中消失,在那里他们完全停止学习,所以我们需要小心输入他们的值的范围。因为批量标准化调节进入每个激活函数的值,在深度网络中似乎不太好工作的非线性实际上又变得可行了。
  5. 简化更深层次网络的创建 —由于上面列出的前 4 项,当使用批量标准化时,更容易建立和更快地训练更深层次的神经网络。事实证明,更深的网络通常会产生更好的结果,这很好。
  6. 提供一点规范化 —批量规范化会给你的网络增加一点噪音。在某些情况下,比如在初始模块中,批处理规范化已经被证明和删除一样有效。但是一般来说,将批量规范化视为一种额外的规范化,可能允许您减少一些可能添加到网络中的丢失。
  7. 总体上可能给出更好的结果 —一些测试似乎显示批量标准化实际上提高了训练结果。然而,它确实是一种帮助更快训练的优化,所以你不应该认为它是一种让你的网络变得更好的方法。但由于它让你更快地训练网络,这意味着你可以更快地迭代更多的设计。它还能让你建立更深层次的关系网,这通常会更好。因此,当你把所有因素都考虑进去时,如果你用批量规范化来构建你的网络,你可能会得到更好的结果。

我们在fully_connected函数中给层添加了批量标准化。以下是一些要点:

批量归一化的图层不包含偏差项。在 tf.layers.conv2d()和 tf.layers.dense()中设置 use_bias=False

TensorFlow 有[tf.layers.batch_normalization](https://www.tensorflow.org/api_docs/python/tf/layers/batch_normalization)函数来处理数学。

我们告诉tf.layers.batch_normalization网络是否在训练。这是重要的一步。

我们在调用激活函数的之前添加了规范化**。**

def conv_layer(prev_layer, layer_depth, is_training):
  conv_layer = tf.layers.conv2d(prev_layer, layer_depth*4, 3, strides, 'same', use_bias=False, activation=None)
  conv_layer = tf.layers.batch_normalization(conv_layer, training=is_training)
  conv_layer = tf.nn.relu(conv_layer)

学分:来自课堂讲稿:https://classroom.udacity.com/nanodegrees/nd101/syllabus

批量规范化:理论和如何与 Tensorflow 一起使用

原文:https://towardsdatascience.com/batch-normalization-theory-and-how-to-use-it-with-tensorflow-1892ca0173ad?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“time-lapse photography of highway road” by Clément M. on Unsplash

不久前,深度神经网络还很难训练,在合理的时间内让复杂的模型收敛是不可能的。如今,我们有许多技巧来帮助他们收敛,实现更快的训练,并解决当我们想要训练深度学习模型时出现的任何类型的麻烦。本文将探讨其中的一个技巧:批量规范化。

为什么你应该使用它

为了理解什么是批处理规范化,首先我们需要解决它试图解决的问题。

通常,为了训练一个神经网络,我们对输入数据做一些预处理。例如,我们可以将所有数据标准化,使其类似于正态分布(也就是说,零均值和一元方差)。我们为什么要做这个预处理?原因有很多,其中一些是:防止像 sigmoid 函数这样的非线性激活函数过早饱和,确保所有输入数据都在相同的值范围内,等等。

但是问题出现在中间层,因为激活的分布在训练期间不断变化。这减慢了训练过程,因为每一层都必须在每个训练步骤中学会适应新的分布。这个问题被称为内部协变移位

那么…如果我们强制每一层的输入在每一个训练步骤中具有近似相同的分布,会发生什么?

事实真相

批量标准化是一种我们可以用来标准化每一层输入的方法,以解决内部协变量偏移问题。

在训练期间,批处理规范化层执行以下操作:

  1. 计算层输入的平均值和方差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Batch statistics for step 1

2.使用之前计算的批次统计数据对图层输入进行归一化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Normalization of the layers input in step 2

3.缩放和移动以获得层的输出。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Scaling and shifting the normalized input for step 3

请注意, γβ 是在训练期间学习的以及网络的原始参数。

所以,如果每批有 m 个样品,那么 j 批:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Inference formulas

**编辑:**在测试(或推断)时,均值和方差是固定的。使用之前计算的每个训练批次的平均值和方差来估计它们。

我们如何在 Tensorflow 中使用它

幸运的是,Tensorflow API 已经在TF . layers . batch _ normalization层中实现了所有这些数学运算。

为了在您的模型中添加批处理规范化层,您只需使用以下代码:

获得 Tensorflow 文档中所述的更新 ops 非常重要,因为在训练时间内,必须更新层的移动方差和移动平均值。如果不这样做,批量标准化将无法工作,网络将无法按预期训练

声明一个占位符来告诉网络它是处于训练时间还是推理时间也是有用的(我们已经讨论过训练和测试时间的区别)。

注意这一层有很多 更多的参数(你可以在文档中查看它们),但是这些是你应该使用的基本工作代码。

参考

如果您对批量标准化感到好奇,我建议您看看这篇论文和视频:

请随时关注我的 Twitter 或 LinkedIn T21,让我知道你对这篇文章的看法。感谢阅读!

深度学习框架之战——第一部分:2017,更多框架和接口

原文:https://towardsdatascience.com/battle-of-the-deep-learning-frameworks-part-i-cff0e3841750?source=collection_archive---------1-----------------------

深度学习的格局在不断变化。Theano 是第一个被广泛采用的深度学习框架,由深度学习的先驱之一 Yoshua Bengio 领导的 MILA 创建和维护。然而,事情发生了变化。今年 9 月,MILA 宣布在发布最新版本后,将不会在 2018 年对 Theano 进行进一步的开发工作。这个消息并不意外。在过去的几年中,不同的开源 Python 深度学习框架被引入,通常由大型科技公司之一开发或支持,其中一些获得了很多关注。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

State of open source deep learning frameworks in 2017

目前,谷歌的 TensorFlow 似乎是最常用的深度学习框架——基于 Github stars & forks 和堆栈溢出活动。一些人预计,随着 TensorFlow 的推出,谷歌将主导市场多年。然而,看起来其他框架也吸引了越来越多的热情用户。最值得一提的可能是 PyTorch 的引进和成长。PyTorch 由脸书等公司于 2017 年 1 月推出。它是流行的 Torch 框架(用 C 实现,用 Lua 封装)的移植,Torch 二进制文件用 GPU 加速的 Python 封装。

除了 GPU 加速和内存的有效使用,PyTorch 流行背后的主要驱动力是动态计算图的使用。这些动态计算图已经被其他鲜为人知的深度学习框架使用,如 Chainer。这些动态图的优点在于,这些图是由运行定义的(“由运行定义”),而不是传统的“定义并运行”。特别是在输入可能变化的情况下,例如对于文本这样的非结构化数据,这是非常有用和高效的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

PyTorch dynamic computational graph — source: http://pytorch.org/about/

其他科技巨头也没有坐以待毙。微软开发了一个名为 CNTK 的内部深度学习框架,并在更名为微软认知工具包后于 2017 年正式推出 2.0 版本。2017 年,脸书也推出了咖啡馆 2 。它是著名的 Caffe 框架的继承者。最初的 Caffe 框架是由 Berkeley Vision and Learning Center 开发的,在它的社区、它在计算机视觉中的应用以及它的模型动物园(一组预先训练好的模型)中非常受欢迎。然而,似乎咖啡 2 还没有步咖啡的后尘。

另一个流行的深度学习框架是 MXNet ,由微软和亚马逊支持。MXNet 已经存在一段时间了,但是当 MXNet 被称为深度学习框架时,我经常听到人们回应“那不是 R 的深度学习框架吗?”。是的,但不止如此。它实际上支持许多语言,从 C++到 Python、JavaScript、Go,事实上还有 MXNet 突出的地方是它的可伸缩性和性能(请继续关注第二部分,在那里我们将比较最流行的框架的速度和其他指标)。

这些只是众多框架中的一小部分。其他开源深度学习框架包括 Deeplearning4j 和 Dlib(基于 C++的)。同样在 2017 年,谷歌的 DeepMind 发布了 Sonnet(基于 TensorFlow 构建的高级面向对象库)。其他值得一提的框架还有 H20.ai 和 Spark。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Straightforward model building with Keras — source: https://github.com/keras-team/keras

除了所有这些框架,我们还有包装在一个或多个框架周围的接口。深度学习最广为人知和广泛使用的界面毫无疑问是 Keras 。Keras 是一个高级深度学习 API,用 Python 编写,由谷歌深度学习研究员 Franç ois Chollet 创建。谷歌在 2017 年宣布选择 Keras 作为 TensorFlow 的高层 API。这意味着 Keras 将包含在下一个 TensorFlow 版本中。除了 TensorFlow,Keras 还可以使用 Theano 或 CNTK 作为后端。

Keras 很强大,因为通过堆叠多个层来创建深度学习模型真的很简单。当使用 Keras 时,用户不需要做层背后的数学计算。这似乎是快速原型制作的理想选择,Keras 也是 Kaggle 竞赛中的流行工具。

因此,一方面,我们目前有高级别的 Keras API,可以让您轻松构建简单和高级的深度学习模型,另一方面,低级别的 TensorFlow 框架可以让您在构建模型时更加灵活。两者都有谷歌的支持。正如预期的那样,竞争并没有坐以待毙,2017 年 10 月,微软和亚马逊的 AWS 联合发布了 Gluon API。Gluon 是一个高级 Python 深度学习接口,它包装了 MXNet,很快它还将包括微软的 CNTK。胶子是 Keras 的直接竞争对手,尽管 AWS 声称他们强烈支持所有深度学习框架,但他们当然将赌注押在胶子上,以实现人工智能的民主化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Stacking convolutional and dense layers and parameter initialization with Gluon

令人惊讶的是,如今 TensorFlow 最大的竞争对手似乎是 PyTorch。随着社区对 PyTorch 越来越感兴趣,例如,在 Kaggle 的最新比赛中,用户经常选择使用 PyTorch 作为他们解决方案的一部分,并且它也被用于最新的研究论文中,因此 TensorFlow 于 2017 年 10 月推出了 Eager Execution 。TensorFlow 的“运行定义”界面。通过此次发布,谷歌希望赢回爱上 PyTorch 及其动态图形的用户。

对于热门深度学习课程 fast.ai 的开发者来说,这种变化来得太晚了。9 月, fast.ai 宣布从 Keras & TensorFlow 切换到 PyTorch 。fast.ai 的创始研究员、Kaggle 的前总裁兼首席科学家杰瑞米·霍华德认为 PyTorch 将能够保持领先地位。只有时间能证明一切。

有了这些深度学习框架,新来者选择一个框架可能会很有挑战性。坦率地说,即使是经验丰富的研究人员和开发人员也很难跟上最新的发展。一个积极的消息是开放神经网络交换(ONNX) 的发布。ONNX 于 2017 年 9 月宣布,并于 12 月发布了 V1,是一种表示深度学习模型的开放格式。这允许用户更容易地在不同的框架之间移动模型。例如,它允许您构建 PyTorch 模型,并使用 MXNet 运行该模型进行推理。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Open Neural Network Exchange (ONNX) Github page — source: https://github.com/onnx/onnx

ONNX 是由微软、AWS 和脸书等公司推出的。谷歌不在这个名单中并不令人惊讶。ONNX 从一开始就支持 Caffe2、Microsoft Cognitive Toolkit、MXNet 和 PyTorch,但是与其他开源项目一样,社区也已经为 TensorFlow 添加了一个转换器。

2017 年有很多令人兴奋的发展,这类似于深度学习和人工智能领域的快速发展。很难预测新的一年会发生什么。我们可能会看到一些整合,不过,大型科技公司肯定会希望使用和推广自己的技术。很高兴看到不同的框架,由不同的技术巨头支持,推动彼此更快地创新。在第二部分中,我们将根据不同的度量标准,如速度、内存使用、可移植性和可伸缩性,更详细地比较不同的框架。

最大似然估计的贝叶斯分类器

原文:https://towardsdatascience.com/bayes-classifier-with-maximum-likelihood-estimation-4b754b641488?source=collection_archive---------5-----------------------

监督学习的基本概念是给你带标签的数据来训练模型。并且我们假设有一个最优且相对简单的分类器,它将给定的输入映射到大多数输入的适当分类。训练模型后,目标是找到一个与最佳分类器一样有效的近似分类器,以便相同的分类器可以用于未标记/看不见的数据。

统计模型方法

开始时,标记的训练数据用于训练目的。利用测试数据,假设某个概率分布,并且预先计算其所需的参数,以便在分类器中使用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

当给定初始数据时,此处假设数据是独立选取且同分布的(i.i.d .),然后检查数据类型以决定可以使用什么概率模型。例如,如果数据是掷硬币,则使用伯努利模型,如果是掷骰子,则可以使用多项式模型。在我下面的例子中,使用了高斯模型,这是最常见的现象。为了确保分布是正态的,通常会进行正态性测试

在学习算法阶段,其输入是训练数据,输出是分类器所需的参数。为了从训练数据中选择分类器的参数,可以使用最大似然估计(MLE)、贝叶斯估计(最大后验概率)或损失准则的优化。在本文中,我将介绍一个使用最大似然估计贝叶斯分类器参数的例子。

使用最大似然估计分类器的参数

第一步是我们需要弄清楚什么是样本分布。给定一系列训练数据,假设正态高斯总体,sigma 和 mu 的估计值是多少?使用统计方法,我们将假设一个概率模型,这意味着我们将预测假设某个概率分布模型的数据的可能性有多大?然后,我们可以通过似然估计找到最佳拟合概率模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf NOTE: L is for likelihood and P is for probability model

概率模型和可能性之间的差异:

(1)它们有不同的图形(2)当你对一个函数求导时,你对不同的变量求导(3) argmax 是针对不同的变量计算的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

值得注意的是,对于特定的θ和 X 值,似然函数和概率函数具有相同的输出(注意:我说的是一个特定的输出,而不是输出列表,因为它们的结果是不同的图形)。因此,给定参数θ,似然函数和概率函数的概率分布是相同的。在似然函数中,给定θ,你可以计算特征向量的概率分布。

单变量高斯例子

例如给定一个人的体重,这个人是男是女?

设 X 是一组重量数据。设 x_i 为第 I 个权重值。

设 Y 是一个类,y_0 是男性,y_1 是女性

分类器 : 贝叶斯分类器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

argmax 选择提供最大输出值的输入。在这种情况下,给定一个权重值,它选择给出最高后验概率的性别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

利用贝叶斯定理,将 P[Y|X]替换为 P[X|Y]*P[Y]/P[X]。请注意,我们只对给出最高概率的 Y 值感兴趣,所以 P[X]不是我们感兴趣的,它独立于 P[Y]。所以,它可以从等式中去掉。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

在对 y = y_0 计算上述等式一次和对 y = y_1 计算第二次之后,选择具有最高概率的 y 值。

但是我们不知道 PX|Y和 PY。这就是 MLE(最大似然估计)在估计这些概率时发挥作用的地方。

P[Y]的估计

P[Y]在学习阶段用最大似然估计。为了估计男性或女性的人口比例,使用 MLE 从训练数据计算男性或女性的比例。这里“m”是指男性群体,p 代表从测试数据中得到只有男性数据序列的概率,而(1-p)代表女性数据序列的概率。“n”代表总样本量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了得到 P[Y],即男性或女性的分数人口,似然函数的导数设置为 0,我们可以求解 P。然后我们得到 m/n 作为分数人口。

P[X | Y]的估计

P[X|Y]是得到体重输入数据的概率(不管有无标注),假设男性或女性。为了得到这个概率,我需要知道什么是(1)权重的总体概率分布以及(2)该分布所需的参数。假设概率分布为正态高斯分布;在本例中,单变量高斯分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

但是我不知道 mu 和 sigma。因此,我将使用 MLE(最大似然估计)从我的训练数据中估计 mu 和 sigma 的值

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 5

每个模型是以给定的 x 值权重作为输入的 mu 和 sigma 的不同常数值的概率分布。请注意,权重的 x 值由似然函数提供。因为有无限对 mu 和 sigma,所以有无限多的这些模型。例如,假设女性的平均体重为 135 磅,给定的体重值为 110 磅,则输出概率约为 0.005。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www.wolframalpha.com/input/?i=plot+PDF%5BNormalDistribution%5B135,+15%5D,+x%5D+from+x+%3D+0+to+200

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www.wolframalpha.com/input/?i=plot+PDF%5BNormalDistribution%5B135,+15%5D,+x%5D+from+x+%3D+0+to+200

似然函数所做的是采用具有 mu 和 sigma 值及其概率的模型,并输出获得 mu 和 sigma 的给定权重值的概率作为输入。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

想象一下,图 5 围绕着一个 for 循环,它为每个模型运行;在这种情况下,无限数量的模型。结果,上面的三维图形被绘制出来。因为我们这里的目标是估计 sigma 和 mu 值,所以具有最高概率的 sigma 和 mu 值对(在图中具有峰值)将被选为估计值。

为了估计 sigma 和 mu 值,我们需要从似然函数图中找到最大值概率值,并查看 mu 和 sigma 值给我们的值。因此,我们对似然函数求导,将其设为 0,并求解 sigma 和 mu。然后这些值被用来计算 P[X|Y]。

多元高斯例子

例如给定一个人的体重 x 身高,这个人是男是女?

这与前面的例子非常相似。

首先,确定分类器为贝叶斯分类器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

P[Y =男性]和 P[Y =女性]是在学习算法阶段计算的类先验值。对于 P[X|Y =男性]和 P[X|Y =女性],在学习算法阶段估计多元高斯分布参数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

这是我们模型的概率分布:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

这是可能性函数的图表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www.cs.columbia.edu/~verma/classes/ml/lec/lec1_intro_mle_bayes_naive_evaluation.pdf

贝叶斯分类器和朴素贝叶斯的区别:

与贝叶斯分类器不同,朴素贝叶斯假设特征是独立的。在我们的上述示例中,使用朴素贝叶斯,我们将假设体重和身高相互独立,并且其协方差为 0,这是多元高斯模型所需的参数之一。

现在的问题是**为什么我们要使用贝叶斯分类器?**因为它是最优分类器,这里证明的是。

那么这是否意味着我们的分类问题解决了?不会,因为我们需要极其多的数据根据赫夫丁不等式。

如果我希望我的错误率小于 20%,那么在从下面的不等式中求解 n 之后,我需要 10 个⁰⁰数据。注意:D 代表维度

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我知道我的概率分布的一个参数/s,那么我应该从下面的等式中解出 n 来估计所需的最小数据量:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于贝叶斯分类器的最优性需要太多的数据,分类问题仍在进行中。

如果您有任何反馈,请留下您的评论或给我发电子邮件至 logicdevildotcom@gmail.com

应用贝叶斯规则

原文:https://towardsdatascience.com/bayes-rule-applied-75965e4482ff?source=collection_archive---------1-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在现实世界问题上使用贝叶斯推理

贝叶斯推理的基本思想是用更多的数据变得“更少的错误”。这个过程很简单:我们有一个最初的信念,称为先验,当我们获得更多信息时,我们会更新它。虽然我们不认为这是贝叶斯推理,但我们一直在使用这种技术。例如,我们最初可能认为有 50%的机会在季度末获得晋升。如果我们从经理那里得到积极的反馈,我们会向上调整我们的估计,相反,如果我们把咖啡机弄得一团糟,我们可能会降低概率。随着我们不断收集信息,我们会改进我们的估计,以更接近“真实”的答案。

我们的直觉行为被形式化为一个简单而强大的等式,称为贝叶斯法则:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们将左侧称为后验概率,作为给定事件 b 的事件 A 的条件概率。在右侧,P(A)是我们的先验,或事件 A 的概率的初始信念,P(B|A)是可能性(也是条件概率),我们从我们的数据中得出,P(B)是使概率分布总和为 1 的归一化常数。贝叶斯规则在统计语言中的一般形式是后验概率等于似然性乘以先验除以归一化常数。这个简短的等式引出了贝叶斯推理的整个领域,贝叶斯推理是一种对世界进行推理的有效方法。

虽然 A 和 B 可能是很好的占位符,但它们对让我们了解如何使用这个概念没有太大帮助。为了做到这一点,我们可以将贝叶斯规则应用于现实世界数据的问题。

我在自己的生活中一直在探索的一个问题是睡眠模式。我有来自我的 Garmin Vivosmart 手表的 2 个多月的数据,显示我何时入睡和醒来。在之前的一篇文章中,我用马尔可夫链蒙特卡罗(MCMC)方法计算出了我在给定时间睡着的概率。最终模型显示最有可能的睡眠时间分布(MCMC 是一种近似方法)如下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是我睡着的概率,只考虑时间。如果我们知道时间并且有额外的证据呢?知道我卧室的灯亮着会如何改变我睡着的概率?这就是我们使用贝叶斯规则来更新我们的估计的地方。对于特定时间,如果我们知道我卧室灯的信息,我们可以使用上面分布的概率作为先验,然后应用贝叶斯方程:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

左边是后验概率,给定我卧室灯的状态(开或关),睡眠的条件概率。给定时间的概率将作为我们的先验,P(sleep),或者在没有额外信息的情况下我们使用的估计值。比如晚上 10 点,我睡着的先验概率是 27.34%。如果我们有更多的信息,我们可以使用从观测数据中得到的可能性P(bedroom light |sleep)来更新这些信息。根据我的习惯,我知道假设我睡着了,我卧室的灯亮着的概率大约是 1%。那就是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

假设我睡着了,我的灯熄灭的概率是1–0.01 = 0.99(这里我用减号(-)表示相反的情况。)这是因为条件概率分布的总和必须为 1。如果我们知道我睡着了,我卧室的灯要么开着,要么关着!

等式的最后一部分是归一化常数P(light)。这代表我的灯亮着的总概率。我的灯亮着有两种情况:我睡着了或者我醒着。因此,如果我们知道睡眠的先验概率,我们可以计算归一化常数为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我的灯亮着的总概率考虑了我睡着时灯亮着的几率和我醒着时灯亮着的几率。(P(-sleep) = 1 — P(sleep)是我醒着的概率。)

假设我没有睡着,我的灯亮着的概率P(light | — sleep),也是通过观察确定的。在我的例子中,我知道如果我醒着,我卧室的灯有大约 80%的可能性是亮着的(这意味着如果我醒着,我的灯有 20%的可能性是不亮的)。

使用我的灯亮着的总概率,贝叶斯公式是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

假设我的灯亮着,这代表我睡着的概率。如果我的灯关了,那么我们用P(-light|...替换每一个P(light|...

只有单词的方程已经够多了,让我们看看如何将它用于数字!

如果我们知道我的灯是亮着的,我们将在晚上 10:30 应用这个等式。首先,我们使用时间计算我睡着的先验概率,得到的答案是 73.90%。先验为我们的估计提供了一个很好的起点,但是我们可以通过加入关于我的光的信息来改进它。知道我的灯亮着,我们可以用相关的数字填充贝叶斯方程:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我的灯亮着,这一事实极大地改变了我们对我睡着的概率的估计,从超过 70%变成了 3.42%。这显示了贝叶斯法则的力量:我们能够通过加入更多的信息来更新我们对形势的最初估计。尽管我们可能已经直观地做到了这一点,但从形式方程的角度来考虑它,可以让我们以严格的方式更新我们的信念。

让我们试试另一个例子。如果现在是晚上 9:45,我的灯关了怎么办?试着从 0.1206 的先验概率开始解这道题。

我没有总是手工做这个推断,而是写了一些简单的 Python 代码来做这些计算,你可以在 Jupyter 笔记本中玩这些计算。代码输出以下答案:

Time: 09:45:00 PM 	Light is OFF.

The prior probability of sleep:    12.06%
The updated probability of sleep:  40.44%

我们再次看到额外的信息改变了我们的估计。现在,如果我的妹妹想在晚上 9:45 打电话给我,她不知何故知道我的灯亮着,她可以参考这个等式来确定我是否会接电话(假设我总是在醒着的时候接电话)!谁说日常生活中不能用 stats?

看到数字结果是有帮助的,但是可视化也有助于使观点更加清晰。如果仅仅通过看方程式不能表达想法,我总是试图结合情节来表达想法。在这里,我们可以使用额外的数据来可视化睡眠的先验和条件概率分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我的灯亮着的时候,曲线向右移动,表明在给定的时间我睡着的概率较低。同样,如果我的灯关闭,曲线会向左移动。从概念上理解一个统计概念可能是困难的,但是这个例子精确地说明了为什么我们使用贝叶斯法则。如果我们想减少对世界的错误,那么额外的信息应该改变我们的信念,贝叶斯推理使用系统的方法更新我们的估计。

使用更多的证据!

为什么停在我卧室的灯前?我们可以在模型中使用尽可能多的信息,它将继续变得更加精确(只要数据告诉我们一些关于这种情况的有用信息)。例如,如果我知道在我睡着的情况下,我的手机正在充电的可能性是 95%,我们可以将这一知识纳入模型。

这里,我们将假设我的手机正在充电的概率是给定我是否在睡觉的信息的情况下我的灯打开的概率的有条件独立(独立是一个稍微高级一点的概念,但它允许我们简化许多问题)。使用额外信息的贝叶斯方程被表达为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这看起来有点吓人,但是使用一点 Python 代码,我们可以创建一个函数来为我们进行计算。我们在任何时候输入,以及我的灯是否亮着和手机是否在充电的任何组合,函数返回更新的我睡着的概率。

我将跳过数学(我让我的计算机来做)并显示结果:

Time is 11:00:00 PM 	Light is ON 	Phone IS NOT charging.

The prior probability of sleep:    95.52%
The updated probability of sleep:  1.74%

在晚上 11 点,没有额外的信息,我们几乎可以肯定地猜测我睡着了。然而,一旦我们有了我的灯亮着而手机没有充电的额外信息,我们就断定我睡着的可能性微乎其微。这是另一个查询:

Time is 10:15:00 PM 	Light is OFF 	Phone IS charging.

The prior probability of sleep:    50.79%
The updated probability of sleep:  95.10%

根据具体情况,概率会变低或变高。为了证明这一点,我们可以看看光和电话证据的四种配置,以及它们如何改变概率分布:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这个图表中有很多信息,但是关键的想法是概率曲线根据证据而变化。随着我们获得更多的数据,我们可以进一步完善我们的估计。

结论

当只使用字母或虚构的情况给出抽象方程时,贝叶斯规则和其他统计概念可能难以理解。我上过很多课,贝叶斯法则都是用不太有用的例子来展示的,比如掷硬币或者从瓮中抽出彩球,但是直到这个项目,我才最终理解了贝叶斯推理的适用性。如果你正在纠结一个概念,寻找一个你可以应用它的环境,或者看看别人已经这样做的案例!

当我们把概念转化为问题时,真正的学习就来了。我们不仅可以通过这种方式学习新技能,还可以做一些非常酷的项目!数据科学的成功在于不断学习,将新技术添加到您的技能组合中,并找出不同任务的最佳方法。在这里,我们展示了贝叶斯推理如何让我们更新我们的信念来解释新的证据,以便更好地模拟现实。随着我们收集更多的证据,我们需要不断调整我们的预测,贝叶斯方程为我们提供了合适的框架。

一如既往,我欢迎反馈、讨论和建设性的批评。可以通过 Twitter @koehrsen_will 找到我。

贝叶斯定理:数据科学的圣杯

原文:https://towardsdatascience.com/bayes-theorem-the-holy-grail-of-data-science-55d93315defb?source=collection_archive---------1-----------------------

贝叶斯定理的直观推导

贝叶斯定理可能是数理统计和概率论领域中最重要的定理。由于这个原因,这个定理经常在数据科学领域得到应用。
在本文中,我将用一个实际问题来直观地推导贝叶斯定理。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果你喜欢这篇文章,并想分享你的想法,问问题或保持联系,请随时通过 LinkedIn 联系我。

1。简介

以 18 世纪英国数学家托马斯·贝叶斯命名的阿耶斯定理是一个确定条件概率的数学公式。这个定理在数据科学领域有巨大的重要性。例如,贝叶斯定理的许多应用之一是贝叶斯推理,一种特殊的统计推理方法。

贝叶斯推理是一种方法,在这种方法中,随着更多的证据或信息变得可用,贝叶斯定理用于更新假设的概率。贝叶斯推理在广泛的活动中得到了应用,包括科学工程哲学医学体育和法律

在金融中,例如,贝叶斯定理可以用来对借钱给潜在借款人的风险进行评级。在医学中,通过考虑任何给定的人患病的可能性以及测试的总体准确性,该定理可用于确定医学测试结果的准确性。

现在让我们实际一点…

2.问题陈述

Con side 两个碗 XY ,里面放满橘子和蓝莓。在这种情况下,你确切地知道两个碗里各有多少橘子和蓝莓。

如果我问你从碗×碗 中挑出一个橘子的可能性有多大,你可以准确说出这个概率。由于碗中有 11 件物品×11 件 并且其中 3 件是橙子,所以挑选一个橙子的概率将是 p(橙子) =3/11。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Bowl X and Bowl Y filled with oranges and blueberries.

颠倒的情况

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

I pick blindly an item and get a blueberry.

但是如果我从一个随机的碗中选一样东西会怎么样呢?假设我摘了一颗蓝莓。你能说出蓝莓是从哪个碗里摘的概率吗?

这个问题可以用贝叶斯定理来回答。

3.贝叶斯定理推导

为了推导贝叶斯定理,我们要模拟一个实验。在这个实验中,我们掷骰子。每次骰子显示的数字小于或等于 4 时,我们将从碗中选择一个项目,对于数字大于或等于 5 时,我们将从碗 Y 中选择一个项目。而且我们要这样做 N =300 次。为了简化问题,我们引入以下缩写:

蓝莓:= B,橘子:= O,碗 X := X,碗 Y := Y

在我们掷骰子 N =300 次之后,我们将获得一些关于从两个碗中挑选的物品数量的统计结果。实验的假设结果如图 1 所示。此处的 s 代表一个碗或一个物品被挑选的“来源”。 y 为可观察变量(蓝莓或橙子)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig. 1 Statistical results

该图告诉我们,我们已经选择了…

  • … 148 次碗里的一颗蓝莓 X: n(s= X ,y= B )=148
  • … 26 次碗里的蓝莓 Y: n(s= Y ,y= B )=26
  • …碗里一个橘子的 51 倍 X: n(s= X ,y= O )=51
  • …碗里一个橘子的 75 倍 Y: n(s= Y ,y= O )=75

鉴于这些统计数字,我们现在可以问一些有趣的问题…

从碗 X 中随机选取一个物品的概率是多少?

为了获得我们表示为 p(s=X) 的概率,我们必须将仅从碗 X 中拾取的物品数除以总拾取数 N =300。这里是 n(s= X ,y= B )=148X中摘下的蓝莓数 n(s= X ,y =O= 51X中摘下的橙子数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Eq. 1 Probability to pick an item from bowl X.

:这种概率称为“先验概率”。在贝叶斯统计推断中,先验概率是在收集新数据之前某一事件的概率。在这种情况下, p(s=X) 给出了从 X 中选择一个物品的概率,而不知道它到底是哪个物品。

因此,从 Y 中选择一个项目的概率 p(s=Y) 为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Eq. 2 Probability to pick an item from bowl Y.

挑选一个橙子/蓝莓的概率有多大?

这一次,我们想知道在不考虑特定碗的情况下,选择橙子或蓝莓的可能性有多大。我们将这些概率表示为 p(y=O)p(y=B) 。计算类似于前一种情况。我们将特定商品的提货次数除以总提货次数。由此产生的概率由等式给出。3 和情商。4:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Eq. 3 Probability to pick an orange.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Eq. 4 Probability to pick a blueberry.

从 X 中挑出一颗蓝莓的概率有多大?

现在我们要计算联合概率 p(s=X,y=B) ,它告诉我们从 X 中采摘蓝莓的可能性。

:联合概率是事件 Nr.1 与事件 Nr 同时发生的概率。2 发生。在这种情况下,一个事件是从碰巧是 X 的碗中挑选。另一件事是我们摘了一颗蓝莓。

为了计算联合概率,我们需要将我们从 X 中采摘蓝莓的次数除以采摘的总次数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Eq. 5 Probably to pick a blueberry from X.

因此,从 Y 中采摘蓝莓的概率为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Eq. 6 Probably to pick a blueberry from Y.

X 中挑选一个橙子的概率是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Eq. 7 Probably to pick an orange from X.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

给定我们从 X 上摘的,它是蓝莓的概率是多少?

现在变得有趣了。我们计算第一个条件概率。在这种情况下,我们肯定知道我们从哪个碗中选择。在这种情况下,比方说,我们从 X 中选择。有了这些知识,我们可以计算出概率,告诉我们选择蓝莓的可能性。

这个条件概率表示为 p(y=B| s=X)s=X 是我们从 X 中挑选物品的条件。为了计算 p(y=B| s=X) 我们需要用从 X 中采摘的蓝莓的次数除以从 X 中采摘的商品总数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Eq. 8 Probably to pick a blueberry, given that we pick from X.

乘积规则

是时候制定第一条重要的统计规则了。这里,我们采用之前推导出的从 X p(s=X,y=B) 中采摘蓝莓的概率,并通过在分母和分子中乘以( n(s=X,y=B)+n(s=X,y=O)) 来扩展该等式。我们可以这样做,因为概率 p(s=X,y=B) 的值不会因为这个扩展而改变。

现在,如果你仔细看看这个等式,你会注意到新的表达式由我们之前推导出的另外两个概率 p(y=B|s=X)p(s=X) 的乘积组成。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Eq. 9 Product rule

概率之间的这种关系叫做乘积法则。乘积法则允许我们利用条件概率 p(y=B| s=X) 和先验概率 p(s=X)来计算联合概率 p(s=X,y=B)

求和规则

现在让我们重温一下先验概率 p(s=X ) ,它给出了我们从 X 中选择任何项目的可能性。如果你把方程分成两个被加数,如方程第二行所示。10 你可以观察到,这两个被加数只不过是我们先前推导出的两个联合概率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Eq. 10 Sum rule

这种关系叫做求和规则。求和规则允许通过对包含来自先前的随机变量 s=X 和任何其他随机变量 y 的联合概率求和来计算先前的 p(X) 概率。

贝叶斯规则

对于乘积规则,联合中随机变量的顺序无关紧要。因此 p(s,y)p(y,s) 具有相同的值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们使值 p(s,y)p(y,s) 相等,并做一些重组,我们得到一个新的数学表达式。p(s | y)的这个新表达式就是贝叶斯规则。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Eq. 12 Bayes’Theorem/Rule.

最后:蓝莓是从哪个碗里取的?

贝叶斯定理为我们提供了条件概率p(s | y)的计算公式,这就是我们最初问题的答案。

我们摘了一颗蓝莓的事实可以用条件 y=B 来表示。为了回答蓝莓是从哪个碗里摘的这个问题,我们必须为 s=Xs=Y 计算 p(s|y=B)p(s|y) 的两个值都告诉我们蓝莓是从碗 X 或碗 Y 中采摘的可能性。

***我们来做一下 s=X 的计算。幸运的是,我们需要的所有概率,我们已经在前面的章节中计算过了。如果我们将这些概率插入等式中的 p(s=X|y=B) 。13 我们得出以下结论:*假设我们摘了一颗蓝莓,这颗蓝莓从碗 X 中摘下的概率约为 86 %。对于任何其他情况,可以类似地进行计算。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Eq. 13 Bayes’Theorem

如果没有贝叶斯定理,p(s|y) 的计算将非常困难。然而,这个定理允许我们用更容易计算的概率来计算这个概率。这就是贝叶斯定理的神奇之处:难以计算的概率分布用非常容易计算的概率来表示。

Bayesball:击球率的贝叶斯分析

原文:https://towardsdatascience.com/bayesball-bayesian-analysis-of-batting-average-102e0390c0e4?source=collection_archive---------5-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Joshua Peacock on Unsplash

除了我将附上的简短代码块,你可以在这篇文章的末尾找到整个 Jupyter 笔记本的链接。

我发现数据科学或统计学中的一个有趣但难以理解的主题是贝叶斯分析。在我的大会数据科学沉浸式训练营期间,我有机会探索贝叶斯统计,但我真的认为我需要一些复习和强化。

这是我个人的努力,以更好地理解贝叶斯思维,以及如何将它应用到现实生活中。

对于这篇文章,我的灵感主要来自于 Youtube 上的一个系列,作者是拉斯姆斯·贝斯,“贝叶斯数据分析介绍”。他真的很擅长让你对贝叶斯分析有一个直观的认识,不是用所有复杂的公式来轰炸你,而是给你提供一个贝叶斯统计的思维过程。

我为这篇文章选择的主题是棒球。老实说,我不是一个体育迷。我很少看体育比赛。作为一个韩国人,棒球是韩国最著名的运动,我相信在 MLB 也有一些韩国球员。承认这一点有点尴尬,但我听说过 Chan-Ho Park,但仅此而已。

那为什么选择棒球?

“我不知道你是否知道,但棒球的吸引力是小数点。没有其他运动像它那样完全依赖于连续性、统计数据和有序性。棒球迷比注册会计师更关注数字。”—体育记者吉姆·默里

他们说棒球可能是世界上记录最好的运动。历史累积了过去一百年棒球统计的记录。然而,仅仅收集数据并不能让棒球在统计学方面变得有趣。可能更重要的方面是游戏的个体性。例如,在击球时,谁在外场打球对击球手能否打出本垒打影响很小。在其他体育项目中,尤其是足球和篮球,个人数据的意义可能会被球场上其他地方发生的事情的重要性所冲淡。这就是棒球统计数据对球员比较有用的地方。

棒球统计数据由许多指标组成,有些很直接,有些很高级。我选择看一看的指标是击球率(AVG) 。在棒球运动中,平均击球率是由击球次数除以击球次数来定义的。通常报告到小数点后三位。

对击球率可能会有批评,但根据 C. Trent Rosecrans 的说法,“尽管如此,击球率相对于所有其他统计数据来说确实是历史和背景。我们都知道 0.300 的打者是什么,我们知道 0.200 的打者有多差,0.400 的打者有多棒。”

常规赛好像还没开始,马上就要开始了(3 月 29 日)。但是有春季训练。在美国职业棒球大联盟(MLB),春训是常规赛开始前的一系列练习和表演赛。

我想回答的问题如下:

  • 我应该如何解读 2018 春训的击球率
  • 我如何比较两个球员的击球率

在我进入代码之前,我将简要介绍一下 Rasmus B eth 在他的视频中解释了什么。

我们首先需要三样东西来实现贝叶斯分析。
1。数据
2。生成模型
3。在先的;在前的

在我的情况下,数据将是 2018 年春训的击球率记录。数据仅仅是我们观察到的。

创成式模型是在给定参数作为输入时生成数据的模型。这些参数是生成分布所需的值。例如,如果您知道平均值和标准偏差,您可以通过运行下面的代码轻松地生成所选大小的正态分布数据。稍后我们将看到其他类型的分布用于贝叶斯分析。

import matplotlib.pyplot as plt
import numpy as npmu, sigma = 0, 0.1 # mean and standard deviation
s = np.random.normal(mu, sigma, 1000)
plt.hist(s)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在贝叶斯分析的情况下,我们反转生成模型,并尝试用观察到的数据来推断参数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image Courtesy of Rasmus Bååth, “Introduction to Bayesian data analysis part 1

最后,先验是模型在看到数据之前所拥有的信息。任何概率都是同等可能的吗?或者我们有一些可以利用的先验数据吗?或者我们能做出什么有根据的猜测吗?

我将首先定义一个函数来为一个玩家抓取福克斯体育的统计页面。我将其定义为能够提取春训或常规赛的击球数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

import pandas as pd
import seaborn as sns
import requests
from bs4 import BeautifulSoupplt.style.use('fivethirtyeight')%matplotlib inline
%config InlineBackend.figure_format = 'retina'def batting_stats(url,season):
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'lxml')
    table = soup.find_all("table",{"class": "wisbb_standardTable tablesorter"})[0]
    table_head = soup.find_all("thead",{"class": "wisbb_tableHeader"})[0]
    if season == 'spring':
        row_height = len(table.find_all('tr')[:-1])
    else:
        row_height = len(table.find_all('tr')[:-2])
    result_df = pd.DataFrame(columns=[row.text.strip() for row in table_head.find_all('th')], index = range(0,row_height)) 

    row_marker = 0
    for row in table.find_all('tr')[:-1]:
        column_marker = 0
        columns = row.find_all('td')
        for column in columns:
            result_df.iat[row_marker,column_marker] = column.text.strip()
            column_marker += 1
        row_marker += 1
    return result_df

现在来看看我该选谁来分析。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面的屏幕是纽约大都会队的春季训练统计页面(正如我已经承认的,我对棒球知之甚少,我选择纽约大都会队是因为我喜欢它的标志)。如果你按照球员的击球率(AVG)来排列球员,你可以看到多米尼克·史密斯(DS)是第一名,加文·切基尼(GC)是第二名。他们是好运动员吗?我不知道。但是如果只看 AVG 的话,DS 1.000 AVG 是最好的。

但是通过谷歌搜索,我发现“近年来,全联盟的平均打击率通常在 0.260”左右徘徊。如果是这样,那么 DS 和 GC 的 AVG 似乎太高了。通过进一步观察两位球员的 At-Bats (AB),Hits (H),很明显 DS 只有 1 个 AB,CS 有 7 个。此外,通过进一步查看其他球员的 AB,2018 年最高 AB 为 13,2017 年纽约大都会队的最高 AB 为 60。

场景 1

假设我对他们过去的表现一无所知,唯一观察到的数据是 2018 年春训。我不知道我应该从 AVG 那里期待什么样的价值范围。基于此,我应该如何解读 2018 年春训的统计数据?

让我们刮一下 DS 的春季训练数据。

ds_url_st = "[https://www.foxsports.com/mlb/dominic-smith-player-stats?seasonType=3](https://www.foxsports.com/mlb/dominic-smith-player-stats?seasonType=3)"
dominic_smith_spring = batting_stats(ds_url_st,'spring')
dominic_smith_spring.iloc[-1]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

n_draw = 20000
prior_ni = pd.Series(np.random.uniform(0, 1, size = n_draw)) 
plt.figure(figsize=(8,5))
plt.hist(prior_ni)
plt.title('Uniform distribution(0,1)')
plt.xlabel('Prior on AVG')
plt.ylabel('Frequency')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

先验代表我们在看到数据之前的信念。在上面的分布中,任何概率几乎都是等概率的(由于随机生成,会有细微的差别)。因此,这意味着我对这个球员一无所知,我甚至没有任何关于 AVG 的有根据的猜测。我假设 0.000 AVG 等同于 1.000 AVG 或者 0 到 1 之间的任何其他概率。

现在我们观察到的数据表明有 1 个 AB 和 1 个 H,因此有 1.000 个 AVG。这可以用二项式分布来表示。具有二项式分布的随机变量 X 表示在一系列 n 个独立的是/否试验中的成功次数,每个试验以概率 p 产生成功。在 AVG 的情况下,AVG 是成功的概率,AB 是试验的次数,H 是成功的次数。

记住这些,我们可以定义我们的逆向生成模型。

我们将从我们定义的均匀分布中随机选取一个概率值,并将该值用作我们的生成模型的参数。假设我们随机选取的值是 0.230,这意味着在二项分布中有 23%的成功几率。试验次数为 1 (DS 有 1 个 AB),如果生成模型的结果与我们观察到的结果相匹配(本例中 DS 有 1 H),那么我们保持概率值为 0.230。如果我们重复这种生成和过滤,我们将最终得到一个概率分布,它生成了与我们观察到的结果相同的结果。

这成为我们的后路。

def posterior(n_try, k_success, prior):
    hit = list()
    for p in prior:
        hit.append(np.random.binomial(n_try, p))
    posterior = prior[list(map(lambda x: x == k_success, hit))]
    plt.figure(figsize=(8,5))
    plt.hist(posterior)
    plt.title('Posterior distribution')
    plt.xlabel('Posterior on AVG')
    plt.ylabel('Frequency')
    print('Number of draws left: %d, Posterior mean: %.3f, Posterior median: %.3f, Posterior 95%% quantile interval: %.3f-%.3f' % 
      (len(posterior), posterior.mean(), posterior.median(), posterior.quantile(.025), posterior.quantile(.975)))ds_n_trials = int(dominic_smith_spring[['AB','H']].iloc[-1][0])
ds_k_success = int(dominic_smith_spring[['AB','H']].iloc[-1][1])
posterior(ds_n_trials, ds_k_success, prior_ni)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

后验分布中 95%的分位数区间称为可信区间,应该与频率主义者意义上的置信区间略有不同。您可以使用另一个可信的区间,当我提到 Pymc3 时,我会回到这个问题。

贝叶斯可信区间和 Frequentist 置信区间的一个主要区别是它们的解释。贝叶斯概率反映了一个人的主观信念。按照这种方法,我们可以声称真实参数在一个具有可测概率的可信区间内。这个属性很有吸引力,因为它使您能够对参数做出直接的概率陈述。许多人发现这个概念是理解概率区间的一种更自然的方式,也更容易解释。另一方面,置信区间使您能够声称区间覆盖了真实参数。如果我们收集一个新样本,计算置信区间,并重复多次,我们计算的 95%的区间将在该区间内具有真实的 AVG 值。

可信区间:“根据我们观察到的数据,AVG 的真实值有 95%的可能性落在可信区间内”

置信区间:“当我根据这类数据计算置信区间时,AVG 的真实值有 95%的可能性落在置信区间内。”

注意区别:可信区间是给定固定界限的参数值的概率陈述。置信区间是给定固定参数值时关于边界的概率。

通常在现实生活中,我们想知道的是真实参数而不是边界,在这种情况下,贝叶斯可信区间是正确的方法。在这种情况下,我们感兴趣的是球员的真实 AVG。

根据上述后验分布,我 95%确定 DS 真实 AVG 将在 0.155 到 0.987 之间。但这是一个非常宽泛的说法。换句话说,在我观察了一个没有先验知识的试验后,我不太确定 ds 的真实 AVG。

场景 2

对于第二个场景,让我们假设我们知道去年的春训数据。

dominic_smith_spring.iloc[-2:]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在我们有了 2017 年春训统计,我们的先验应该反映了这一知识。这不再是均匀分布了,因为我们知道在 2017 年春训中,DS 的 AVG 是 0.167。

贝塔分布是具有两个参数的连续概率分布,阿尔法贝塔。它最常见的用途之一是对实验成功概率的不确定性进行建模。特别是,在已经观察到 n 次试验中的 k 次成功的情况下, X 的条件分布是β分布,其中参数 k+1α,参数n k+1β

n_draw = 20000
prior_trials = int(dominic_smith_spring.iloc[3].AB)
prior_success = int(dominic_smith_spring.iloc[3].H)
prior_i = pd.Series(np.random.beta(prior_success+1, prior_trials-prior_success+1, size = n_draw)) 
plt.figure(figsize=(8,5))
plt.hist(prior_i)
plt.title('Beta distribution(a=%d, b=%d)' % (prior_success+1,prior_trials-prior_success+1))
plt.xlabel('Prior on AVG')
plt.ylabel('Frequency')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

posterior(ds_n_trials, ds_k_success, prior_i)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

与情形 1 中的均匀先验的后验相比,95%分位数区域已经变窄。现在我可以说,我 95%确定 DS 的真实 AVG 将在 0.095 到 0.340 之间。然而,考虑到 0.300 以上的 AVG 通常被称为最佳击球手,该声明意味着该球员可以是最差的击球手或最佳击球手。我们需要更多的数据来缩小我们的可信区域。

场景 3

对于这个场景,我们假设我不仅有 2017 年春训的统计数据,还有 2017 年常规赛的统计数据。这对我拿到后路后的说法有什么影响?

ds_url = "[https://www.foxsports.com/mlb/dominic-smith-player-stats?seasonType=1](https://www.foxsports.com/mlb/dominic-smith-player-stats?seasonType=1)"
dominic_smith_reg = batting_stats(ds_url,'regular')
dominic_smith = dominic_smith_reg.append(dominic_smith_spring.iloc[3], ignore_index=True)
dominic_smith

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ds_prior_trials = pd.to_numeric(dominic_smith.AB).sum()
ds_prior_success = pd.to_numeric(dominic_smith.H).sum()n_draw = 20000
prior_i_02 = pd.Series(np.random.beta(ds_prior_success+1, ds_prior_trials-ds_prior_success+1, size = n_draw)) 
plt.figure(figsize=(8,5))
plt.hist(prior_i_02)
plt.title('Beta distribution(a=%d, b=%d)' % (ds_prior_success+1,ds_prior_trials-ds_prior_success+1))
plt.xlabel('Prior on AVG')
plt.ylabel('Frequency')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

posterior(ds_n_trials, ds_k_success, prior_i_02)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在我可以说,我 95%确定 DS 的真实 AVG 将在 0.146 到 0.258 之间。这可能不是精确的,但与情景 1 和情景 2 相比,可信区间现在要窄得多。

场景 4

我想比较两个球员,看看谁在 AVG 方面更好。我观察到的数据是 2018 年春训的结果,我的先验知识是 2017 年春训和常规赛。现在我想比较一下 DS 和 GC。

直到场景 3,我通过拒绝产生与我观察到的结果不同的所有参数来模拟采样。但是这种类型的随机样本生成和过滤通常在计算上是昂贵的,并且运行缓慢。但幸运的是,我们可以使用一个工具,使采样器在高概率区域花费更多时间,从而提高效率。概率编程工具如 Pymc3 可以通过使用巧妙的算法如 HMC 坚果有效地处理抽样程序。

让我们先从福克斯体育台的加文·切奇尼的数据开始。

gc_url_st = "[https://www.foxsports.com/mlb/gavin-cecchini-player-stats?seasonType=3](https://www.foxsports.com/mlb/gavin-cecchini-player-stats?seasonType=3)"
gc_url_reg = "[https://www.foxsports.com/mlb/gavin-cecchini-player-stats?seasonType=1](https://www.foxsports.com/mlb/gavin-cecchini-player-stats?seasonType=1)"
gavin_cecchini_spring = batting_stats(gc_url_st,'spring')
gavin_cecchini_reg = batting_stats(gc_url_reg,'regular')
gc_n_trials = int(gavin_cecchini_spring.iloc[1].AB)
gc_k_success = int(gavin_cecchini_spring.iloc[1].H)
gc_prior = pd.DataFrame(gavin_cecchini_reg.iloc[1]).transpose().append(gavin_cecchini_spring.iloc[0])
gc_prior

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

gc_prior_trials = pd.to_numeric(gc_prior.AB).sum()
gc_prior_success = pd.to_numeric(gc_prior.H).sum()def observed_data_generator(n_try,observed_data):
    result = np.ones(observed_data)
    fails = n_try - observed_data
    result = np.append(result, np.zeros(fails))
    return resultds_observed = observed_data_generator(ds_n_trials,ds_k_success)
gc_observed = observed_data_generator(gc_n_trials,gc_k_success)

现在我们已经准备好安装一个 Pymc3 模型。

import pymc3 as pm
with pm.Model() as model_a:    
    D_p = pm.Beta('DS_AVG', ds_prior_success+1, ds_prior_trials-ds_prior_success+1)
    G_p = pm.Beta('GC_AVG', gc_prior_success+1, gc_prior_trials-gc_prior_success+1)
    DS = pm.Bernoulli('DS', p=D_p, observed=ds_observed)
    GC = pm.Bernoulli('GC', p=G_p, observed=gc_observed) 
    DvG = pm.Deterministic('DvG', D_p - G_p)
    start = pm.find_MAP()
    trace = pm.sample(10000, start=start)pm.plot_posterior(trace, varnames=['DS_AVG','GC_AVG','DvG'],ref_val=0)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们在 Pymc3 中使用 plot_posterior 函数绘制 DS_AVG、GC_AVG 和 DvG (DS_AVG — GC_AVG)的后验分布,我们会看到 HPD 项而不是分位数。最高概率密度(HPD)区间是另一种我们可以用于后验概率的可信区间。HPD 区间选择最窄的区间,这将涉及选择包括众数在内的最高概率密度值。

我再次发现的另一个帖子由拉斯姆斯·贝斯提供了一个易于理解的分位数区间和最高密度区间的直观比较。以下是模式和最高密度区间,涵盖了六种不同后验分布 95%的概率密度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image Courtesy of Rasmus Bååth, “Probable Points and Credible Intervals, Part 1: Graphical Summaries

分位数区间包括中间值,50%的概率在它的左边,50%的概率在它的右边,分位数区间在两边留下 2.5%的概率(在 95%可信区间的情况下)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image Courtesy of Rasmus Bååth, “Probable Points and Credible Intervals, Part 1: Graphical Summaries

在 DS 和 GC 的击球率的情况下,看起来众数和中位数没有太大的不同,如果是这样,HPD 区间将类似于分位数区间。让我们看看他们看起来怎么样。

pm.summary(trace)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到,对于 DS 和 GC,HPD 区间和分位数区间要么完全相同,要么在小数位数上略有不同。

我想回答的问题是,就 AVG 而言,谁是更好的球员,我应该说我不能确定。至少,我不能 95%确定这两个球员在 AVG 方面是不同的。我计算并绘制的差异表明,两个玩家的 AVG 差异(DS-GC,因此如果 DvG 更正,则意味着 DS 更好,否则如果 DvG 更负,则意味着 GC 更好),可以在-0.162 到 0.033 之间。

该区间包括 0.000,这表示两个玩家的 AVG 之间没有差异。因此,有一些证据表明 GC 比 DS 更好(因为 DvG 后验分布在负区域比在正区域具有更大的区域),但是我不能 95%确定这两个玩家在 AVG 方面是不同的。

也许有了更多的数据,我就能确定它们的区别。毕竟,这是贝叶斯思维的精髓。这并不是说真相不存在,而是我们不能完全了解它,我们所能希望做的就是随着越来越多的证据变得可用,更新我们的理解。

感谢您的阅读,您可以从下面的链接中找到整个 Jupyter 笔记本。

https://github . com/tthustle a/Bayes ball/blob/master/Bayes ball . ipynb

“贝叶斯可加回归树”论文摘要

原文:https://towardsdatascience.com/bayesian-additive-regression-trees-paper-summary-9da19708fa71?source=collection_archive---------0-----------------------

本文原载于【blog.zakjost.com】

一.背景

本文开发了一种贝叶斯方法来集成树。对于一篇学术论文来说,它非常具有可读性,如果你觉得这个主题有趣,我建议你花时间去读一读。

贝叶斯加法回归树(BART)类似于梯度推进树(GBT)方法,因为它们对连续弱学习者的贡献进行求和。这与随机森林相反,随机森林平均许多独立的估计。但是贝叶斯方法不是像 GBT 那样将每个顺序树乘以一个小常数(学习速率),而是使用一个先验。

通过使用先验和似然来获得预测的后验分布,我们得到了比经典回归方法的点估计更丰富的信息。此外,贝叶斯框架有一个内置的复杂性惩罚,这意味着我们不再需要对正则化、最大树深度和我们通常通过交叉验证调整的其他选项进行经验选择。

在评估的 42 个不同的数据集上,该方法的性能也优于所有其他被比较的方法,包括 GBM 和 Random Forests。

二。有什么新消息

这篇论文的新颖之处实际上是之前三部作品的结合:在贝叶斯树模型论文中的单个树的贝叶斯框架;梯度推进树的想法;以及使用 贝叶斯回填 对一般可加模型的后验分布进行 MCMC 采样。如果你能做出一个贝叶斯树,并且你知道如何从任何一个基本学习者的模型中取样,那么你就有了 BART。

三。方法

以一种可以连贯地定义先验参数分布的方式构建树问题的任务并不简单。这项工作大部分是在先前链接的树形模型论文中完成的。本质上,整个先验被分成三个子先验:一个用于树结构(深度、分割标准),另一个用于以树结构为条件的终端节点中的值,最后一个用于剩余噪声的标准偏差。提出一些聪明但直截了当的论点,以得出合理的默认建议。例如,有人认为函数的均值很可能在训练数据的 y_min 和 y_max 之间,所以它被设计成使得大部分先验质量都在这个区域。

有趣的是,在树的数量上的选择, m ,没有给出先验,这是由于计算的考虑。实际情况是,这个参数对结果的鲁棒性令人难以置信,所以他建议将其设置为 200,然后继续。事实上,结果似乎对合理的先验选择非常稳健,他主要推荐使用指定的默认值。

第二个重要部分是从模型的后部取样。像许多问题一样,这是通过 Metropolis-Hastings 算法来完成的,在该算法中,您从一个分布中生成一个样本,然后根据它的表现来保留/拒绝它。在这种情况下,它主要归结为:在加法序列中选择一棵树,通过在一些规则(修剪、生长等)中随机选择来变形它,从这个新树中,从终端节点值分布中采样,然后根据它们的后验概率比选择是保留这个新树还是原始树。通过这种方式,树被不断地改变以平衡它们的复杂性和解释数据的能力。选择先验自然有利于更简单的树,所以只有在有必要解释数据时才选择更深的先验。

四。结果

该框架应用于 42 个不同的真实数据集,并与其他流行的方法进行比较:Lasso/L1 正则化的线性回归、梯度推进树、随机森林和具有一个隐藏层的神经网络。这些模型通过各种参数选择进行了调整。笑点是:巴特赢了。如果对超参数调整执行交叉验证,您将获得最佳性能,这类似于您对所有其他模型调整参数的方式,但您可以避免所有这些,只需使用 BART 和默认值即可获得极具竞争力的结果。

此外,结果表明,高度稳健的变化选择的先验。贝叶斯理论的辉煌之处在于,它表明,即使当预测器中加入了许多无用的随机变量时(当我们在不清楚哪些变量最重要的情况下建立模型时,这种情况经常发生),与其他方法相比,它的表现也非常好。

作者还提出了一种变量选择技术,该技术涉及人工限制树的数量,然后在生成的树的分裂规则中计算变量的流行度。虽然这可能是一个很好的启发,但变量选择的问题是一个复杂的问题,它没有经过任何严格的探索。

动词 (verb 的缩写)讨论

这是一篇超级酷的论文,给出了令人印象深刻的结果。虽然我很难理解贝叶斯回填算法的细节以及吉布斯采样实际上是如何实现的,但基本原理似乎与其他 Metropolis-Hastings 方法基本一致。

最终,这种方法提供了一组“开箱即用”的默认值,这些默认值在统计上非常稳健,具有同类最佳的性能,并且能够适应超参数选择的变化。我认为这很好地展示了贝叶斯概率框架如何避免传统的、特别的方法中的许多问题,这些方法主要依赖于最大似然法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不及物动词你试试

最令人失望的事实是,我找不到这个算法的 Python 实现。作者创建了一个 R 包( BayesTrees ),它有一些明显的问题——主要是缺少“预测”功能——另一个更广泛使用的实现叫做 bartMachine 被创建。

如果你有实现这种技术的经验或者知道一个 Python 库,请在评论中留下链接!

贝叶斯分析和复制危机:外行人的观点

原文:https://towardsdatascience.com/bayesian-analysis-the-replication-crisis-a-laypersons-perspective-241f9d4f73db?source=collection_archive---------14-----------------------

免责声明:我没有使用贝叶斯分析的任何经验,但我一直在试图理解基本概念。如果在这方面有更多知识的人发现任何错误,请在评论中指出来。

近年来,在复制危机之后,借助更强大的计算能力,贝叶斯统计分析方法越来越受欢迎。虽然我们很多人听说它是大多数人熟悉的 Frequentist 方法的替代方法,但没有多少人真正理解它的作用和使用方法。这篇文章希望简化贝叶斯分析的核心概念,并简要解释为什么它被提出作为解决复制危机的方法。

如果你只能从试图理解贝叶斯分析中得到两样东西,下面两条原则应该是最重要的:

  1. 贝叶斯分析试图通过一个通常被称为贝叶斯更新的过程,将先前的信息与当前的证据相结合,以测试一个观察结果是否支持某个假设。
  2. 贝叶斯分析中的零假设和替代假设都被认为是可能的,但可能程度不同。贝叶斯因子表明哪种假设更有可能,但它并不能得出明确的结论。

在统计分析的 Frequentist 方法中,假设检验仅使用从单一观察中收集的证据来完成。研究人员根据单个时间点测试的统计显著性来判断假设是否成立。研究人员有时会将该观察结果与以前类似观察结果进行比较,并注意最新的观察结果是否被重复,以了解观察到的效应有多大可能是真实的。

然而,贝叶斯方法会立即考虑之前收集的信息,以及最近收集的证据,以决定观察到的效应有多大可能是真实的。如下图所示,先验信念的概率分布用当前证据的概率分布更新,以生成后验信念的概率分布。后验概率与先验概率的比值给了我们贝叶斯因子,它表明哪个信念更有可能发生。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Probability distributions of Prior Beliefs, Posterior Beliefs and Current Evidence. (Image by Neeraj Singh Sarwan via Team AV)

在 Frequentist 方法中,确定一个观察到的效应的存在几乎是一个基于接受或拒绝零假设的二元是/否决策。但是在贝叶斯方法中,无效假设和替代假设继续保持它们自己的概率。例如,可能有 5%的几率零假设为真,25%的几率替代假设为真。(事实上,将假设表示为概率只能用贝叶斯方法而不能用频率主义方法,但这种错误是频率主义者经常犯的。)这意味着替代假设的可能性是零假设的 5 倍。参照统计学家哈罗德·杰弗里斯开发的解释贝叶斯因子的量表,贝叶斯因子 5 表示替代假设的适度证据。如果贝叶斯因子为 1,则意味着零假设和备择假设的概率相等;如果贝叶斯因子在 0 和 1 之间,这意味着证据支持零假设。下表解释了不同级别的贝叶斯因子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Scale for interpretation of Bayes Factors developed by Jeffreys (1961) [1].

与当p-值小于 0.05 时拒绝零假设的频率主义方法不同,贝叶斯方法显然没有接受或拒绝某个假设的明确界限。它只是说,根据当前的证据如何更新先前的信息,一个假设比另一个更有可能。但是不管哪种假设更有可能,贝叶斯仍然会记住,任何一种假设都有可能是正确的。贝叶斯分析的这些核心原则是它被提议作为复制危机的解决方案的原因,这将在下一节中解释。

贝叶斯分析如何帮助解决复制危机

到目前为止,您可能已经看到,包含先验信息是贝叶斯分析的关键。如果我们仔细想想,这其实很有意义。当在没有考虑先验信息的情况下进行研究时,当观察效果的基本比率非常低时,犯I 型错误(检测假阳性)的风险特别高。下面的 xkcd 漫画很好的说明了这一点:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

How a Frequentist and Bayesian determine whether the sun has exploded. (Image by xkcd.com)

简单来说,频率主义者根据探测器说谎的概率小于 0.05 的阈值来判定中微子探测器是对的。这种单一的观察没有考虑到这样一个事实,即根据历史记录,太阳爆炸的可能性极小。通过将该先验信息分解到分析中,贝叶斯确定检测器的输出不应该对先验信念有太大影响,如果有的话。(此处见详细解释。)

虽然这幅漫画可能是一个极端的例子,但它凸显了一种可能性,即常客往往会忽视这种可能性,并最终过于相信单一观察的结果。这部分解释了为什么一些研究不能被重复,因为观察到的效应仍然可能是偶然出现的假阳性。因此,贝叶斯分析可以通过尽可能简单地考虑先验信息来潜在地解决这个问题,作为对意外或反直觉发现的现实检查。

贝叶斯分析有助于解决复制危机的第二个原因是,它处理假设检验的方式与频率主义方法非常不同。如前所述,频率主义者的目标是基于一个二元的是/否决策来确定一个效应是否真的存在。在他最近发表的关于“统计仪式:复制错觉和我们如何到达那里”[2]的文章中, Gerd Gigerenzer (2018)强调了研究如何演变成一种“无效仪式”,对统计数据的解释成为一种仪式化的过程,在没有更深入理解的情况下使用理论。他还认为,当研究人员认为统计显著性证明了一种效应的存在时,过度自信也是一个问题。他建议学校把重点放在教学生理解统计信息的细微差别上,而不仅仅是学习遵循惯例。他还建议,期刊不应该接受仅仅报道结果为“重要”或“不重要”的论文。

贝叶斯分析本质上不存在这些问题。这种分析从整体上检查所有信息,它对通过二元是/否决策来确定影响的存在不感兴趣。如前所述,它只是表明一个假设与另一个假设相比有多大的可能性,事实上认为所有的假设都包含一定程度的可能性。这种方法允许研究人员欣赏收集的证据的细微差别,而不是简单地根据硬阈值得出结论。通过对证据的深入理解,研究人员将对他们的研究的可复制性有一个更现实的预期,也将更好地解释为什么他们的研究不能被复制。然而, Andrew Gelman (2014)正确地警告说,如果贝叶斯因子被用来以类似于 p 值的方式接受或拒绝假设,分析将最终失去其细微差别,并重新陷入同样的困境[3]。


我希望我已经解释了贝叶斯分析的基本原理,以及它的原理如何帮助解决复制危机。我没有深入研究如何进行各种贝叶斯测试的技术细节,因为我自己对它们并不熟悉,而且无论如何也可以在网上找到许多其他参考资料。我推荐的一篇文章是另一位叫做 Ankit Rathi 的媒体作家写的,他成功地以非常简洁的方式解释了贝叶斯和频率主义者之间的区别。我想澄清的是,这篇文章的目的并不是提倡在未来的研究中用贝叶斯分析取代频率主义分析。这篇文章的目的是揭开贝叶斯分析背后的概念,以及帮助人们认识到研究结论可能并不总是确定的,理解科学可能是一个更加微妙的努力。

以复制危机作为结束,虽然许多学校没有训练研究人员在统计上更加严谨可能是事实,但问题的核心可能在于谦逊的问题。《危机中的心理学》一书的作者布莱恩·休斯 (2018)在英国心理学会博客上写了一篇文章[4],“人们本能地以自我吹捧的方式解读歧义,将工作的积极方面归因于优点,将消极方面归因于机遇。心理学家也不例外。结果是一种真诚的信念,即我们的见解是深刻的,我们的疗法是杰出的,我们的研究比实际情况更强大。”不可否认,在研究中,在生活中,都存在着模糊性和随机性。但是,与其抱着一切都可以被解释以符合我们的假设的心态,不如谦虚一点,接受我们观察到的不一定符合我们的意愿。我们可能很难将自己从我们自己的研究的意义中脱离出来,但是如果忽视了这一点,所有解决复制危机的努力可能都将是徒劳的。

关于贝叶斯分析和复制危机的更多信息,请访问以下链接:

[## 用 Bayes 因子代替 p 值:心理学可复制性危机的神奇疗法

科学应该如何工作外行人、本科生和教科书作者有一个简单的科学模型…

replicationindex.wordpress.com](https://replicationindex.wordpress.com/2015/04/30/replacing-p-values-with-bayes-factors-a-miracle-cure-for-the-replicability-crisis-in-psychological-science/)

参考文献:

  1. 杰弗里斯,H. (1961)。 概率论(第 3 版。) 。牛津。第 432 页。
  2. Gigerenzer,G. (2018 年)。统计仪式:复制错觉和我们如何到达那里心理科学方法与实践进展,2515245918771329。
  3. 赫尔曼(2014 年)。统计学和科学复制的危机显著性12 (3),23–25。
  4. 休斯,B. (2018,10 月)。心理学面临夸张危机吗?。检索自https://the psychologist . bps . org . uk/volume-31/December-2018/does-psychology-face-夸张-危机

原文发布于:https://learn curily . WordPress . com/2018/10/14/Bayesian-analysis

Python 中的贝叶斯线性回归:使用机器学习预测学生成绩第 1 部分

原文:https://towardsdatascience.com/bayesian-linear-regression-in-python-using-machine-learning-to-predict-student-grades-part-1-7d0ad817fca5?source=collection_archive---------1-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

探索性数据分析、特性选择和基准测试

即使在与贝叶斯线性建模理论斗争了几个星期并写了一篇关于它的博客文章之后,我也不能说我完全理解了这个概念。因此,抱着边做边学是最有效的技术的心态,我开始做一个数据科学项目,使用贝叶斯线性回归作为我选择的机器学习模型。

这篇文章是两篇记录该项目的文章中的第一篇。我想展示一个完整的数据科学管道的例子,所以这第一篇文章将集中于定义问题、探索性数据分析和设置基准。的第二部分将完全专注于实现贝叶斯线性回归并解释结果,所以如果你已经有了 EDA,前往那里。如果没有,或者如果您只是想看一些不错的图,请留在这里,我们将介绍如何开始解决数据科学问题。

该项目的完整代码可以在 GitHub 上的 Jupyter 笔记本中找到。我鼓励任何感兴趣的人来看看,并把自己的旋转这个项目。请随意使用、构建和以任何方式分发代码!

我喜欢专注于使用真实世界的数据,在这个项目中,我们将探索从葡萄牙中学收集的学生表现数据。这些数据包括学生的个人和学术特征以及期末成绩。我们的目标是创建一个可以根据学生信息预测成绩的模型。这个数据集,以及许多其他用于测试模型或尝试数据科学技术的有用数据集,可在 UCI 机器学习库上获得。

探索性数据分析

解决数据科学问题的第一步(一旦你清理了数据)是探索性数据分析(EDA) 。这是一个开放式的过程,我们在数据集中寻找异常、有趣的趋势或模式以及相关性。这些本身可能是有趣的,它们可以为我们的建模提供信息。基本上,我们使用 EDA 来找出我们的数据可以告诉我们什么!

首先,我们来看一个熊猫数据帧的数据快照:

import pandas as pddf = pd.read_csv(‘data/student-mat.csv’)
df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总共有 633 个观察值和 33 个变量。每行是一个学生,每列包含一个不同的特征。等级列是我们的目标变量(也称为响应),这使得这成为一个监督、回归机器学习任务。它是受监督的,因为我们有一组已知目标的训练数据,在训练过程中,我们希望我们的模型学会根据其他变量预测分数。我们将把等级视为连续的,这使得这成为一个回归问题(从技术上讲,等级只取整数值,所以它是一个名义变量)。

感兴趣的主要变量是分数,所以让我们来看一下分布,以检查偏斜:

import matplotlib.pyplot as plt# Histogram of grades
plt.hist(df['Grade'], bins = 14)
plt.xlabel('Grade')
plt.ylabel('Count')
plt.title('Distribution of Final Grades')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分数接近正态分布,众数为 11(该学校的分数范围为 0-20)。虽然总体分数没有明显的倾斜,但是某些类别的学生可能会有倾斜的分数。为了观察分类变量对等级的影响,我们可以制作等级分布的密度图,用分类变量的值来着色。为此,我们使用了 seaborn 库和kdeplot函数。以下是按位置(城市或农村)绘制分布图的代码:

import seaborn as sns# Make one plot for each different location
sns.kdeplot(df.ix[df['address'] == 'U', 'Grade'], 
            label = 'Urban', shade = True)
sns.kdeplot(df.ix[df['address'] == 'R', 'Grade'], 
            label = 'Rural', shade = True)# Add labeling
plt.xlabel('Grade')
plt.ylabel('Density')
plt.title('Density Plot of Final Grades by Location')

我们可以使用类似的代码来绘制 guardian 的分数分布,结果如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

密度图上的实际值很难解释,但我们可以用图的形状进行比较。地理位置似乎对学生成绩没有实质性的影响,卫报也没有。诸如此类的图可以为我们的建模提供信息,因为它们告诉我们知道地点或监护人是否有助于预测最终分数。当然,我们想用一个比单一情节更严谨的衡量标准来得出这些结论,后面我们会用统计数据来佐证我们的直觉!

特征选择

正如我们从图中看到的,我们并不期望每个变量都与最终成绩相关,所以我们需要执行特征选择(也称为维度缩减)来只选择“相关”变量。这取决于问题,但因为我们将在这个项目中进行线性建模,我们可以使用一个简单的测量方法,称为相关系数来确定预测分数最有用的变量。这是一个介于-1 和+1 之间的值,用于衡量两个变量之间线性关系的方向和强度。

为了选择有限数量的变量,我们可以找到那些与最终成绩有最大相关性(或正或负)的变量。在熊猫身上寻找相关性非常简单:

# Find correlations and sort
df.corr()['Grade'].sort_values()**failures     -0.384569
absences     -0.204230
Dalc         -0.196891
Walc         -0.178839
traveltime   -0.129654
goout        -0.111228
freetime     -0.105206
health       -0.096461
age          -0.042505
famrel        0.072888
Fedu          0.204392
studytime     0.249855
Medu          0.278690**

至少以我的基本社会科学知识来看,这些相关性似乎是有道理的!failures是以前上课失败的次数,与成绩呈负相关,absences也是,缺课的次数。这种负相关说明随着这些变量的增加,最终成绩有下降的趋势(虽然我们只能说这是一种相关而不是一个变量导致另一个变量下降)。另一方面,每周学习的量studytime和母亲的教育水平Medu都与成绩呈正相关。

相关性只能在数字变量之间计算,因此要找到分类变量和等级之间的关系,我们必须对分类变量进行一次性编码,然后计算相关系数。 One-hot encoding 是为分类变量中的每个类别创建一列的过程。以下是一次性编码前后的分类列示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一键编码是机器学习管道中的标准步骤,使用 pandas 库很容易做到:

# Select only categorical variables
category_df = df.select_dtypes('object')# One hot encode the variables
dummy_df = pd.get_dummies(category_df)# Put the grade back in the dataframe
dummy_df['Grade'] = df['Grade']# Find correlations with grade
dummy_df.corr()['Grade'].sort_values()**higher_no           -0.343742
school_MS           -0.227632
Mjob_at_home        -0.158496
reason_course       -0.138195
internet_no         -0.131408
address_R           -0.128350
address_U            0.128350
internet_yes         0.131408
Fjob_teacher         0.160938
Mjob_teacher         0.173851
reason_reputation    0.185979
school_GP            0.227632
higher_yes           0.343742**

我们再次看到直观上有意义的关系:higher_no表示学生不想继续接受高等教育,并且与分数负相关,higher_yes 表示学生确实想要接受高等教育,并且显示出正相关。Mjob_at_home 表示母亲待在家里,与成绩负相关,Mjob_teacher表示母亲教书,与成绩正相关。

在这个问题中,我们将使用这些结果来进行特征选择,只保留与最终成绩高度相关的 6 个变量。6 是一个任意的数字,我发现它在模型中工作得很好,这表明很多机器学习只是实验!

在特征选择后,我们最终使用的最后六个变量(详见笔记本)显示在新数据帧的快照中。(我重命名了这些列,以便它们更直观):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

变量的完整描述在 UCI 机器学习库中,但这里有一个简要概述:

  • failures:以前的班级失败
  • higher_edu:二元表示学生是否会接受高等教育
  • mother_edu:母亲的教育水平
  • studytime:每周学习量
  • father_edu:父亲的受教育程度
  • absences:学期内缺课

当我们执行特性选择时,我们还使用 Scikit-learn 函数将数据分成训练集和测试集。这是必要的,因为我们需要有一个坚持测试集来评估我们的模型,并确保它不会过度拟合测试数据:

from sklearn.model_selection import train_test_split# df is features and labels are the targets 
# Split by putting 25% in the testing set
X_train, X_test, y_train, y_test = train_test_split(df, labels, 
                                                   test_size = 0.25,
                                                    random_state=42)

这留给我们 474 个训练观察和 159 个测试数据点。

检查所选要素

我最喜欢的图形之一是对图,它非常适合显示变量的分布以及变量对之间的关系。这里我使用 seaborn PairGrid函数来显示所选特性的 Pairs 图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个情节里编码了很多信息!在上面的三角形中,我们绘制了每个变量的散点图。请注意,大多数变量都是离散整数,这意味着它们只取特定的值。在对角线上,我们有直方图显示单个变量的分布。右下角有二维密度图和变量之间的相关系数。

为了解释该图,我们可以选择一个变量,并查看行和列,以找到与所有其他变量的关系。例如,第一行显示了我们的目标Grade与其他变量的散点图。第一列显示了Grade和其他变量之间的相关系数。我们看到failures在绝对量级上与最终成绩的相关性最大。

作为对所选数据的另一种探索,我们可以绘制每个变量的分布图,如果分数高于 12 的中值,则用颜色标记。为了绘制这些图,我们在数据框中创建一个列,将等级与 12 进行比较,然后将所有值绘制在密度图中。

这产生了以下图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

绿色分布代表成绩处于或高于中间值的学生,红色代表低于中间值的学生。我们可以看到,有些变量与成绩更为正相关(如studytime),而另一些变量则是低成绩的指标,如低father_edu

EDA 让我们对数据集有了很好的了解。我们制作图表,找到变量之间的关系,并使用这些来执行特征选择,以便只保留与我们的任务最相关的变量。虽然 EDA 是建模的先驱,但它本身也很有用,许多数据科学问题可以通过我们在这里制作的图表和统计数据来解决。

建立基线指标

机器学习管道中最容易被忽视的一个方面是建立基线。是的,如果您的分类模型达到 99%的准确率,这可能看起来令人印象深刻,但是如果我们每次都通过猜测相同的类来获得 98%的准确率,会怎么样呢?我们真的想花时间为这个问题建立一个模型吗?一个好的基线允许我们评估我们的模型(或者任何模型)是否适用于这个任务。

对于回归,一个好的简单基线就是猜测测试数据中每个观察值的目标中值。在我们的问题中,中位数是 12,所以让我们评估一个模型的准确性,该模型天真地预测测试集上的每个学生都是 12。我们将使用 2 个指标来评估预测:

  • 平均绝对误差(MAE) :预测值与真实值之差的绝对值的平均值。
  • 均方根误差(RMSE) :预测值和真实值之间的平均平方差的平方根。

平均绝对误差很容易解释,因为它代表了我们平均离正确值有多远。均方根误差对较大误差的惩罚更重,通常用于回归任务。根据具体情况,这两个指标可能都合适,我们将使用这两个指标进行比较。(这里讨论一下这些指标的优点。)

当我们对测试集上的每个例子预测 12 时,我们得到这些结果:

**Median Baseline  MAE: 2.1761
Median Baseline RMSE: 2.6777**

如果我们的机器学习模型无法击败这些指标,那么我们要么需要获得更多数据,尝试另一种方法,要么得出机器学习不适用于我们的问题的结论!

我们的建模重点是贝叶斯线性回归,但将我们的结果与标准技术(如线性回归、支持向量机或基于树的方法)的结果进行比较会有所帮助。我们将在数据集上评估其中的几种方法。幸运的是,这些都很容易用 Scikit-Learn 等 Python 库来实现。检查笔记本上的代码,但这里是 6 个不同模型的结果以及原始基线:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

幸运的是,我们看到所有的模型最好的基线表明机器学习将为这个问题工作。总体而言,梯度增强回归方法表现最佳,尽管普通最小二乘(OLS)线性回归 ( 线性建模的频率主义方法)也表现良好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作为最后的练习,我们可以解释 OLS 线性回归模型。线性回归是最简单的机器学习技术,在具有大量特征的复杂非线性问题上表现不佳,但它具有易于解释的优势。我们可以使用训练好的模型从线性回归中提取预测公式。下面是公式:

**Grade = 9.19 - 1.32 * failures + 1.86 * higher_edu + 0.26 * mother_edu + 0.58 * studytime + 0.03 * father_edu - 0.07 * absences**

截距,9.19,代表我们的猜测,如果一个学生的每个变量都是 0。系数(也称为权重或模型参数)表示相应变量单位增加的影响。例如,每增加一次以前的失败,学生的分数预计会减少 1.32 分,母亲的教育每增加一分,学生的分数增加 0.26 分。在解决问题时,我经常喜欢从线性回归开始,因为如果它足够好,我们就有了一个完全可以解释的模型,我们可以用它来进行预测。

结论

虽然机器学习得到了所有的关注,但它通常只是数据科学项目的一小部分。大部分工作——也是大部分价值——来自于获取、清理和探索数据。只有当我们牢牢掌握了数据的结构和其中的关系,我们才应该着手建立机器学习模型。我想展示这个项目的整个过程,以展示一个典型的数据科学工作流程。在这个项目的前半部分,我们:

  • 探索数据以发现有趣的模式、趋势或异常
  • 检查特征和目标之间的相关性
  • 使用相关值执行特征选择
  • 建立了基线和基准机器学习模型

这些技术同样适用于任何机器学习问题,所以请随意将它们作为您下一个项目的起点。虽然特定机器学习模型的确切实现细节可能不同,但数据科学问题的总体结构是相当一致的

在本系列的下半部分,我们将使用 Python 中的 PyMC3 实现一个贝叶斯线性回归模型。我们将建立模型,训练模型(在这种情况下,这意味着从后验抽样),检查模型的推论,并使用结果进行预测。我们在那里见!

一如既往,我欢迎反馈和建设性的批评。你可以在推特上找到我。

Python 中的贝叶斯线性回归:使用机器学习预测学生成绩第 2 部分

原文:https://towardsdatascience.com/bayesian-linear-regression-in-python-using-machine-learning-to-predict-student-grades-part-2-b72059a8ac7e?source=collection_archive---------0-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实施模型、解释结果和做出预测

在这个贝叶斯机器学习项目的第一部分中,我们概述了我们的问题,进行了全面的探索性数据分析,选择了我们的特性,并建立了基准。这里我们将在 Python 中实现贝叶斯线性回归来构建模型。训练完模型后,我们将解释模型参数并使用模型进行预测。这个项目的全部代码可以在 GitHub 上的 Jupyter 笔记本中找到,我鼓励任何人去看看!

提醒一下,我们正在研究一个监督的、回归的机器学习问题。使用学生成绩的数据集,我们希望建立一个模型,该模型可以根据学生的个人和学术特征来预测最终学生的分数。特征选择后的最终数据集为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们有 6 个特征(解释变量)用于预测目标(响应变量),在这种情况下是分数。训练集中有 474 名学生,测试集中有 159 名学生。为了了解变量分布(因为我真的很喜欢这个图),这里有一个变量对图,显示了散点图、直方图、密度图和相关系数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关于这个情节的细节和所有变量的意义请查看第一部分和笔记本。现在,让我们继续用 Python 实现贝叶斯线性回归。

贝叶斯线性回归

让我们简单回顾一下频率主义者贝叶斯线性回归。线性回归的 Frequentist 观点假设数据是从以下模型生成的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中,响应 y 由模型参数β乘以输入矩阵 X 加上随机采样噪声或潜在变量引起的误差得出。在普通的最小二乘法(OLS)中,模型参数β是通过寻找使训练数据的误差平方和最小的参数来计算的。OLS 的输出是给定训练数据的“最佳”模型参数的单点估计。然后,这些参数可用于预测新的数据点。

相反,贝叶斯线性回归假设响应是从概率分布中取样的,例如正态(高斯)分布:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

高斯均值是参数β和输入 X 的乘积,标准差是σ。在贝叶斯模型中,不仅响应被假设为从分布中抽样,而且参数也被假设为从分布中抽样。目标是在给定输入 X 和输出 y 的情况下,确定模型参数的后验概率分布:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

后验概率等于数据的似然性乘以模型参数的先验概率,再除以归一化常数。如果我们有一些领域知识,我们可以用它来分配模型参数的先验,或者我们可以使用非信息先验:不假设任何变量的具有大标准偏差的分布。使用无信息的先验意味着我们“让数据说话”一个常见的优先选择是对β使用正态分布,对σ使用半柯西分布。

实际上,对于连续值来说,计算精确的后验分布在计算上是很困难的,因此我们求助于抽样方法,如马尔可夫链蒙特卡罗 (MCMC)从后验中抽取样本,以逼近后验。蒙特卡洛是指抽取随机样本的一般技术,马尔可夫链是指抽取的下一个样本仅基于上一个样本值。这个概念是,随着我们抽取更多的样本,后验概率的近似值最终将收敛于模型参数的真实后验分布。

贝叶斯线性建模的最终结果不是对模型参数的单一估计,而是一个分布,我们可以用它来对新的观察结果进行推断。这种分布允许我们在模型中展示我们的不确定性,并且是贝叶斯建模方法的好处之一。随着数据点数量的增加,不确定性应该会降低,表明我们的估计具有更高的确定性。

用 Python 实现贝叶斯线性建模

目前 Python 中概率编程和贝叶斯推理最好的库是 PyMC3。它包括许多用于构建贝叶斯模型和使用 MCMC 方法推断模型参数的实用程序。我们将使用 PyMC3 的广义线性模型(GLM)模块,特别是GLM.from_formula函数,它使得构建贝叶斯线性模型极其简单。

使用该模块执行贝叶斯线性回归只需要两个步骤:

  1. 构建一个将特征与目标相关联的公式,并确定数据可能性的先验分布
  2. 使用 MCMC 的参数后验分布样本

公式

我们不需要为每个模型参数分别定义概率分布,而是传递一个 R 风格的公式,将特征(输入)与目标(输出)联系起来。以下是将分数与学生特征联系起来的公式:

**Grade ~ failures + higher_edu + mother_edu + studytime + father_edu + absences**

在此语法中,~,读作“是的函数”。我们告诉模型,等级是波浪号右侧六个特征的线性组合。

该模型是在使用with语句的上下文中构建的。在对GLM.from_formula的调用中,我们传递公式、数据和数据可能性族(这实际上是可选的,默认为正态分布)。该函数解析公式,为每个要素添加随机变量(以及标准差),添加数据的似然性,并将参数初始化为合理的起始估计值。默认情况下,模型参数先验被建模为正态分布。

一旦建立了 GLM 模型,我们就使用 MCMC 算法从后验样本中进行采样。如果我们不指定哪种方法,PyMC3 会自动选择最适合我们的方法。在下面的代码中,我让 PyMC3 选择采样器,并指定样本数 2000,链数 2,调谐步数 500。

在这种情况下,PyMC3 选择了不掉头采样器,并用 jitter+adapt_diag 初始化采样器。老实说,我真的不知道这些是什么意思的全部细节,但我假设比我聪明得多的人正确地实现了它们。有时仅仅知道如何使用工具比理解实现的每个细节更重要!

采样器运行几分钟,我们的结果存储在normal_trace中。这包含每个模型参数的所有样本(,除了被丢弃的调谐样本)。跟踪本质上是我们的模型,因为它包含了我们进行推理所需的所有信息。为了了解贝叶斯线性回归的作用,我们可以使用 PyMC3 中的内置函数来检查轨迹。

轨迹图在左侧显示了模型参数的后验分布,在右侧显示了在变量轨迹中绘制的样本的进展。这两种颜色代表采样的两个差分链。

pm.traceplot(normal_trace)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里我们可以看到,我们的模型参数不是点估计,而是分布。每个分布的平均值可以作为最可能的估计,但是我们也使用整个范围的值来表明我们不确定真实值。

查看后验分布的另一种方式是直方图:

pm.plot_posterior(normal_trace)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里我们可以看到平均值,我们可以用它作为最可能的估计,也可以看到整个分布。95% HPD 代表 95%的最高后验密度,是我们参数的可信区间可信区间是频率统计中置信区间的贝叶斯等价(尽管有不同的解释)。

我们还可以看到所有模型参数的摘要:

pm.df_summary(normal_trace)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以用与 OLS 线性回归大致相同的方式来解释这些权重。例如在模型中:

  • 以前的课堂失败和缺席有负面影响
  • 高等教育计划和学习时间有积极的影响
  • 母亲和父亲的教育有积极的影响(尽管母亲的更积极)

标准偏差栏和 hpd 限值让我们了解我们对模型参数的信心程度。例如,father_edu 特性的 95% hpd 从-0.22 到 0.27,这意味着我们不能完全确定模型中的影响是积极的还是消极的!数据似然性也有较大的标准偏差(sd行),表明目标存在较大的不确定性。总的来说,我们在模型中看到了相当大的不确定性,因为我们处理的样本数量很少。只有几百名学生,我们没有足够的数据来精确地确定模型参数。

解释可变效应

为了查看单个变量对成绩的影响,我们可以在保持其他变量不变的情况下改变该变量的值,并查看估计的成绩如何变化。为此,我们使用plot_posterior_predictive函数,并假设除了感兴趣的变量(查询变量)之外的所有变量都处于中值。我们为查询变量生成一系列值,函数通过从后验分布中提取模型参数来估计整个范围内的等级。代码如下:

结果显示了来自后验样本的 100 个样本的估计等级与查询变量范围的关系:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每条线(每个图中有 100 条线)是通过从后验迹线中选取一组模型参数并评估查询变量范围内的预测坡度而绘制的。线的分布显示了模型参数的不确定性:线越分散,模型对该变量的影响就越不确定。

对于一个变量,父亲的教育程度,我们的模型甚至不能确定增加变量的效果是积极的还是消极的!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们使用这个模型来做决策,我们可能要在部署它之前三思,而不是首先收集更多的数据来形成更确定的估计。只有几百名学生,模型参数有相当大的不确定性。例如,我们不应该声称“父亲的教育水平对成绩有积极影响”,因为结果表明这个结论几乎没有什么确定性。

如果我们使用频率主义方法,并且只看到一个点估计,我们可能会因为有限的数据量而做出错误的决策。在数据集有限的情况下,贝叶斯模型是显示模型中不确定性的绝佳选择。

做预测

说到预测,贝叶斯模型可以用来估计分布。我们记得贝叶斯线性回归的模型是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中,β是系数矩阵(模型参数),X 是数据矩阵,σ是标准差。如果我们想要对新的数据点进行预测,我们可以通过将模型参数乘以我们的数据点来找到平均值,并使用模型参数的标准偏差,从而找到估计输出的正态分布

在这种情况下,我们将从轨迹中取每个模型参数的平均值作为参数的最佳估计值。如果我们取轨迹中参数的平均值,那么预测的分布就变成:

**Grade ~ N(9.20 * Intercept - 1.32 * failures + 1.85 * higher_edu + 0.26 * mother_edu + 0.58 * studytime + 0.03 * father_edu - 0.07 * absences,  2.28^2)**

对于新的数据点,我们代入变量的值,并构建等级的概率密度函数。作为一个例子,这里有一个来自测试集的观察结果以及概率密度函数(参见笔记本中构建这个分布的代码):

**Test Observation:
failures = 0, higher_edu = 1, mother_edu = 2, studytime = 1,
father_edu = 2, absences = 8**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**True Grade = 12
Average Estimate = 11.6763
5% Estimate = 7.7618    95% Estimate = 15.5931**

对于该数据点,平均估计值与实际等级相符,但也存在较大的估计区间。如果我们有更多的学生,估计的不确定性会更低。

我们还可以对不在测试集中的任何新点进行预测:

**New Observation:
absences = 1, failures = 0, father_edu = 1
higher_edu = 1, mother_edu = 4, studytime = 3**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**Average Estimate = 13.8009
5% Estimate = 10.0696    95% Estimate = 17.4629**

与标准机器学习模型的比较

在本系列的第一部分中,我们计算了许多标准机器学习模型的基准以及一个简单的基线。为了计算 MAE 和 RMSE 度量,我们需要对测试集中的所有数据点进行单点估计。我们可以使用估计分布的平均值做出“最有可能”的预测。产生的指标以及基准测试的指标如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

贝叶斯线性回归实现了与最佳标准模型几乎相同的性能!然而,贝叶斯线性建模的主要好处不在于准确性,而在于可解释性和量化我们的不确定性。任何模型都只是对真实世界的估计,在这里我们已经看到了我们应该对基于有限数据训练的模型有多么缺乏信心。

后续步骤

对于任何想开始学习贝叶斯建模的人,我建议看看这本笔记本。在这个项目中,我只研究了一半的学生数据(我使用了数学成绩,另一半包含葡萄牙语课程成绩),所以可以对另一半进行同样的分析。此外,我们可以改变数据可能性的分布——例如,改变为一个学生的 t 分布——然后看看这如何改变模型。与大多数机器学习一样,通过尝试不同的设置,可以学到相当多的东西,而且往往没有单一的正确答案!

结论

在这一系列文章中,我们走过了用于解决数据科学问题的完整机器学习过程。我们从探索性数据分析开始,进而建立基线,尝试几种不同的模型,实施我们选择的模型,解释结果,并使用该模型进行新的预测。虽然模型实现的细节可能会改变,但这个的总体结构将很好地服务于大多数数据科学项目。此外,希望这个项目让你了解了贝叶斯机器学习的独特能力,并为你的技能组合增加了另一个工具。学习新技能是数据科学最令人兴奋的方面,现在您又多了一项部署来解决您的数据问题。

一如既往,我欢迎反馈和建设性的批评。你可以在推特上找到我。

基于模型强化学习的随机输入贝叶斯神经网络

原文:https://towardsdatascience.com/bayesian-neural-networks-with-random-inputs-for-model-based-reinforcement-learning-36606a9399b4?source=collection_archive---------3-----------------------

我在这里描述我们最近的 ICLR 论文[1][code][talk)],它介绍了一种基于模型的强化学习的新方法。这项工作的主要作者是 Stefan Depeweg ,他是我共同指导的慕尼黑工业大学的博士生。

关键贡献在于我们的模型:具有随机输入的贝叶斯神经网络,其输入层包含输入特征和随机变量,这些变量通过网络向前传播,并在输出层转换为任意噪声信号。

随机输入使我们的模型能够自动捕获复杂的噪声模式,提高我们基于模型的模拟的质量,并在实践中产生更好的策略。

问题描述

我们处理随机动力系统中的策略搜索问题。例如,要操作燃气轮机等工业系统:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这些系统的抽象如下所示。系统的当前状态表示为 s_t,并且与每个状态 s_t 相关联的是由函数 c 给出的成本 c (s_t)。在每个时间步,我们施加一个动作 a_t,它将影响下一个时间步 s_t+1 的系统状态。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从 s_t 到 s_t+1 的转变不仅由动作 a_t 决定,还由一些我们无法控制的噪声信号决定。该噪声信号由图中的方块表示。在涡轮机的例子中,噪声的产生是因为我们观察到的状态仅由传感器测量值组成,这些测量值是对系统真实状态的不完整描述。

为了控制系统,我们可以使用一个策略函数 a _ t = 𝜋(s_t;𝜃)将当前状态 s_t 映射到动作 a_t,例如𝜋(;𝜃)可以是具有权重𝜃.的神经网络

我们的目标是找到一种策略(𝜃的一个值),它将在一系列状态轨迹上产生平均较低的成本函数值。例如,我们的目标是最小化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意,上面的表达式是随机的,因为它取决于初始状态 S1 的选择和状态转换中的随机噪声。

批量强化学习

我们考虑批量强化学习场景,在学习过程中我们不会与系统交互。这种情况在现实世界的工业设置中很常见,例如涡轮机控制,在这种情况下,探索受到限制,以避免对系统造成可能的损害。

因此,为了找到最佳策略,我们只有从已经运行的系统获得的状态转换形式的一批数据 D = {(s_t,a_t,s_t+1)},并且我们将不能收集任何额外的数据。

首先,我们从 D 得知 p(s_t+1|s_t,a_t)的模型,即下一个状态 s_t+1 的预测分布,作为当前状态 s_t 和应用的动作 a_t 的函数。然后我们把这个模型和政策联系起来,得到 p(s_t+1|s_t,a _ t = 𝜋(s_t;𝜃),它描述了系统在𝜋(政策控制下的演变;𝜃).

先前的分布可用于执行展开或状态轨迹的模拟。我们从随机采样的状态 s_1 开始,然后从 p(s_t+1|s_t,a _ t = 𝜋(s_t;𝜃))来获得状态 S1,…,s_T 的轨迹

然后,可以在采样的 s_1,…,s_T 上评估成本函数,以逼近 cost(𝜃).这种近似的梯度可用于执行随机优化,并在产生平均低值 cost(𝜃).的方向上移动

最优控制中噪声的影响

状态转换中存在的噪声会显著影响最优策略。这可以通过醉酒蜘蛛的故事来说明,这个故事最初是由 Bert Kappen [2]提出的,我们在这里用它作为一个激励的例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一只蜘蛛有两条回家的路:要么过桥,要么绕湖行走。在没有噪声的情况下,桥接选项更受青睐,因为它更短。然而,在大量饮酒后,蜘蛛的动作可能会随机向左或向右偏离。因为桥很窄,而且蜘蛛不喜欢游泳,所以现在更喜欢沿着湖走。

前面的例子显示了噪声如何显著影响最优控制。例如,最佳策略可以根据噪声水平是高还是低而改变。因此,我们希望通过以高精度捕获状态转换数据中存在的任何噪声模式,在基于模型的强化学习中获得显著的改进。

具有随机输入的贝叶斯神经网络

在实践中,大多数状态转移数据的建模方法只是假设 s_t+1 中的加性高斯噪声,即,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 f_W 例如是具有权重 W 的神经网络。在这种情况下,通过最大可能性学习 W 是非常容易的。然而,加性高斯噪声的假设在现实世界中不太可能成立。

通过使用 f_W 中的随机输入可以获得更灵活的过渡动态噪声模型。特别是,我们可以假设

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在该模型下,输入噪声变量 z_t 可以通过 f_W 以复杂的方式进行变换,以在 s_t+1 中产生作为 s_t 和 a_t 的函数的任意随机模式。

然而,现在学习 W 不再能够通过最大似然法来完成,因为 z_t 是未知的。一个解决方案是遵循贝叶斯方法并在 W 和 z_t 上使用后验分布。该分布捕捉了我们在看到 D 中的数据后对这些变量可能取值的不确定性。

计算精确的后验概率是困难的,但是我们可以学习高斯近似法。这种近似的参数可以通过最小化相对于真实后验概率的偏差来调整。变分贝叶斯(VB) 是一种流行的方法,它通过最小化 Kullback-Leibler 散度来工作。

α发散最小化

不使用 VB,我们通过最小化****α-散度【3,4】**来学习分解的高斯近似 q 。**通过改变该散度中的α值,我们可以在符合真实后验概率 p 中的一个模式或旨在覆盖 p 中的多个模式的解之间进行平滑插值,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有趣的是,VB 是α = 0 时α散度最小化的一个特例。另一个众所周知的近似贝叶斯推断方法是期望传播,它是在α = 1 时获得的。在我们的实验中,我们使用 α = 0.5 ,因为这通常在实践中产生更好的概率预测[4]。

玩具示例的结果

下图显示了我们的贝叶斯神经网络在两个玩具例子中随机输入的结果。每个示例的训练数据显示在最左边的列中。第一行显示了双模态预测分布的问题。底部一行显示了异方差噪声的问题(噪声幅度取决于输入)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

中间一列显示了用仅假设加性高斯噪声的模型获得的预测。该模型不能捕捉数据中的双模态或异方差。最右边的列显示了我们的贝叶斯神经网络对随机输入的预测,它可以自动识别数据中存在的随机模式的类型。

湿鸡问题的结果

我们现在考虑一个强化学习基准,其中一名划独木舟的人正在二维河流上划桨,如下图中最左侧的图所示。河流中有一个漂流将独木舟者推向位于顶部的瀑布,漂流右侧较强,左侧较弱。如果划独木舟的人掉进了瀑布,他必须从河底重新开始。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

河中还有湍流,左边变强,右边变弱。划独木舟的人离瀑布越近,得到的奖励就越高。因此,他会想靠近瀑布,但不要太近,这样他可能会掉下去。这个问题被称为 wetchicken 是因为它和游戏小鸡有相似之处。

湍流和瀑布将使 wetchicken 成为一个高度随机的基准:从瀑布上落下的可能性导致了状态转换中的双模态,而变化的湍流引入了异方差。

图中间的图可视化了使用我们的贝叶斯神经网络随机输入发现的策略。这是一个近乎最优的策略,在这个策略中,划独木舟的人试图停留在 x ≃ 3.5 度和 y ≃ 2.5 度的位置。

右图显示了使用高斯过程(GP)模型发现的策略,该模型仅假设了加性高斯噪声。由于 GP 不能捕获数据中存在的复杂噪声模式,因此所产生的策略在实践中表现很差。

工业基准的结果

我们还在实验中评估了我们的贝叶斯神经网络在随机输入下的性能,该实验使用了一个称为*“工业基准”*【5】的工业系统模拟器。根据作者的说法:“‘工业基准’旨在现实的意义上,它包括了我们发现在工业应用中至关重要的各种方面。”

下图显示了对于一个固定的动作序列,使用对应于 1)假设加性高斯噪声(MLP)的多层感知器和 2)变分贝叶斯(VB)或 3)α= 0.5 的α-散度最小化训练的贝叶斯神经网络的模型产生的展开。模拟轨迹以蓝色显示,由“工业基准”生成的地面真实轨迹以红色显示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该图清楚地显示了使用我们的贝叶斯神经网络通过随机输入和α-散度最小化产生的展开如何更接近地面真实轨迹。

结论

我们已经看到,在学习最优策略时,考虑过渡动态中复杂的噪声模式是很重要的。我们的带有随机输入的贝叶斯神经网络是捕捉这种复杂噪声模式的最先进的模型。通过用α = 0.5 最小化α-散度,我们能够在这样的贝叶斯神经网络中执行精确的近似推断。这使我们能够产生现实的基于模型的模拟,可以用来学习更好的政策。

延伸阅读

在[6]中,我们研究了具有随机输入的贝叶斯神经网络预测中不确定性的分解。不确定性来源于 a)由于数据有限(认知不确定性)而缺乏关于网络权重的知识,或者 b)网络的随机输入(随机不确定性)。在[6]中,我们展示了如何将这两种类型的不确定性应用于主动学习和安全强化学习。

我们还推荐这篇 由 Alex Kendall 撰写的关于计算机视觉深度神经网络中前述两种不确定性的优秀博文。

参考

[1]德佩韦格 s .、埃尔南德斯-洛巴托 J. M .、多希-维勒兹 f .和乌德卢夫特 S. 贝叶斯神经网络在随机动力系统中的学习和政策搜索,ICLR,2017。

[2] H.J .卡彭特。**最优控制理论的路径积分和对称破缺。**统计力学杂志:理论与实验,P11011 页,2005 年。

[3]明卡,托马斯·p .发散度量和信息传递。技术报告,微软研究院,2005 年。

[4]埃尔南德斯-洛巴托 J. M .,李 y .,罗兰 m .,布伊 T. D .,埃尔南德斯-洛巴托 d .和特纳 R. E. 黑盒阿尔法散度最小化,ICML,2016

[5]丹尼尔·海因、亚历山大·亨切尔、沃尔克马尔·斯特津、米歇尔·托基奇和斯特芬·乌德勒夫特。“工业基准”简介。arXiv 预印本 arXiv:1610.03793,2016 年

[6] Depeweg,Stefan 等.具有潜在变量的贝叶斯神经网络中的不确定性分解arXiv 预印本 arXiv:1706.08495 (2017)。

定量交易的贝叶斯优化

原文:https://towardsdatascience.com/bayesian-optimization-for-quantitative-trading-20b257497a8?source=collection_archive---------13-----------------------

在本教程中,我们将了解贝叶斯优化如何减少训练稳健的系统交易策略所需的回溯测试总数,该策略包括在一袋股票中分配资本,以最小化给定预期回报的估计风险。

更新:我开了一家法律科技公司。你可以在这里找到更多

交易策略

我们将实施一个标准的 Markowitz 投资组合优化策略(MPT ),它将有许多可调参数。MPT 用两个量进行预测:风险和预期收益。我们以下列方式对一组证券中的每一个估计这两个数量:

波动率 在现代金融中经常被用作风险的代理(想想比特币;高波动性意味着高风险),这在数学上可以表示为方差。通过在可优化的时间长度(窗口)内对股票进行两两相关,我们可以生成一个协方差矩阵,然后在 Markowitz 算法中用于投资组合分配。

为了估算 预期收益 ,为了透明起见,我们简单地使用一个线性回归器,并假设一只股票在我们持有它的持续时间内将继续向同一个方向移动。

使用我们的协方差矩阵和预期回报向量,我们现在可以使用 MPT 在选择股票时分配我们的资本,同时最小化风险,但保持所需的预期回报。

在这个方法中,有许多可优化的参数。具体来说,我们将优化以下内容:

  • 计算协方差矩阵的方法(皮尔逊最大信息量 C 系数或斯皮尔曼
  • 每对股票的成对相关窗口长度
  • MIC 的α、c 和估计参数
  • 用于估计每只股票回报的线性回归预测窗口长度
  • 卖出前投资组合策略的持有时间

总体策略如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们希望为我们的策略确定最佳的参数配置,使我们在回溯测试中的回报最大化。

我们已经用 Python 编写了策略代码,并将使用 OPTaaS 来执行贝叶斯优化。

计分功能

**def scoring_function(holding_time, correlater, forecaster_windows):**
    forecaster = LinearForecaster(forecaster_windows, tickers)
    simulator = SingleObjectiveSimulator(correlation_method=make_correlater(correlater, tickers), forecast_method=forecaster, 
                                         holding_time=holding_time, capital=10000)
    simulator.trade(data = prices.iloc[:-50])
    score = simulator.evaluate(prices)
    demo.display_values(locals(), score)
    return score

连接 OPTaaS

每个用户都有自己的基本 URL 和 API 键来连接 OPTaaS。连接只需要 1 行代码!

client = OPTaaSClient(OPTaaS_URL, OPTaaS_API_key)

创建一个 OPTaaS 任务

然后,您需要定义参数空间(类型、界限、分布)。标签可以匿名,但出于演示的目的,我们保留了它们。然后,我们需要为 OPTaaS 创建一个任务:

correlation_windows = GroupParameter("correlation_windows", items=[
    IntParameter(pair_name, minimum=2, maximum=5) for pair_name in ticker_pairs
])parameters = [
    IntParameter('holding_time', minimum=0, maximum=50),
    ChoiceParameter('correlater', choices=[
        GroupParameter('Pearson', items=[correlation_windows]),
        GroupParameter('Spearman', items=[correlation_windows]),
        GroupParameter('MIC', items=[
            correlation_windows,
            FloatParameter('alpha', minimum=SMALLEST_NUMBER_ABOVE_ZERO, maximum=1),
            FloatParameter('c', minimum=SMALLEST_NUMBER_ABOVE_ZERO, maximum=30),
            CategoricalParameter('est', values=["mic_approx", "mic_e"])
        ]),
    ]),
    GroupParameter("forecaster_windows", items=[
        IntParameter(ticker, minimum=2, maximum=5) for ticker in tickers
    ])
]task = client.create_task(
    title='Trading Demo v2',
    parameters=parameters,
    initial_configurations=initial_configurations

)

运行任务

我们需要做的就是按照用户指定的迭代次数(在本例中为 10 次)运行任务,输出将在下面的视频中捕获。

task.run(scoring_function, 10)

结果:

正如我们所看到的,不到 10 次迭代,OPTaaS 就能够确定一个有利可图的战略。此外,OPTaaS 能够在每次迭代后提高对策略搜索空间的理解,并能够快速了解哪些配置效果最好。

将贝叶斯优化应用于定量交易的好处

贝叶斯优化允许您减少为您的策略确定最佳配置所需的回溯测试次数,这允许您通过考虑更大的参数搜索空间,在策略构建过程中更加积极主动。

贝叶斯优化也可用于识别对输入扰动稳定的 【鲁棒】 配置。这可以在多目标设置中实现,目标是逼近多目标函数的 Pareto 集合(最大夏普、最小压降、最小周转等)。下图提供了一个示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Return vs Risk for various trading strategy parameter configurations

然后,您可以从满足您的风险/回报标准的“稳定”集群中抽取配置样本,构建您的“稳健”策略。

感谢 AlistairConstantinos 在 OPTaaS 内部开发和实施 MPT 战略。

如果你想在自己的算法交易策略上测试 OPTaaS,请不要犹豫要一个 API 密匙!

注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

其他资源:

教程:https://tutorial . opta as . mind foundry . ai

API 文档:https://opta as . mind foundry . ai

研究http://www . robots . ox . AC . uk/~ mosb/projects/project/2009/01/01/bayesopt

数据科学家应该向软件工程师学习的 4 件事

原文:https://towardsdatascience.com/be-a-better-data-scientist-1a5ad87fe48?source=collection_archive---------2-----------------------

任何数据科学家都应该掌握的软件工程实践

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

执行机器学习(ML)研究被认为是一项“艺术”工作,因此它通常几乎没有技术标准或通用的技术最佳实践。

在 CRISP-DM 流程模型中,端到端 ML 项目的不同阶段很容易可视化,如下图所示。从高层次的角度来看,任何机器学习项目都有两个主要阶段:研究阶段:从业务理解到对所选模型技术的清晰性能评估,以及生产阶段(又名部署)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The CRISP-DM Process

虽然很明显,我们在开发生产代码时要求的相同级别的软件实践在做研究时并不需要或不相关,但我确实认为大多数数据科学家在他们的日常研究工作中没有利用足够的软件工程实践,这最终影响了他们的成果和效率。

在这篇文章中,我想回顾一些众所周知的软件工程实践,这些实践很容易实现,并且对任何数据科学家都非常有益。无论您是单独工作还是作为团队的一部分,在编写自己的研究代码时采用这些实践肯定会让您成为更好的数据科学家。我们开始吧。

使用你的版本控制系统

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

版本控制系统(VCS)是伟大的工具,不仅因为它们让我们在不同的团队成员之间共享和同步相同的代码(或者仅仅是文件)。对于一个开发者来说,它们也是很好的工具,可以享受:版本化你的代码,回滚,远程备份等等。

VCS 已经被工程团队广泛采用,令人高兴的是,使用某种形式的 VCS 工具的数据科学家越来越多。然而,从我的经验来看,大多数使用 VCS 的 DS 倾向于对如何正确使用它们有一个知识缺口。这些糟糕的做法有双重影响,一方面,数据科学家觉得工具没有给他带来足够的价值,而他需要投入大量时间来使它工作(复杂的合并,代码以意想不到的方式被更改等等)。以下是我在观察数据科学家 VSC 的工作时遇到的一些常见陷阱。在我的示例中,我使用 git 作为 VSC 特定的参考,但是在其他 VSC 系统中,概念也非常相似:

  • 提交\推送\拉取很少 —提交是使用 VCS 时最原子化的部分。不经常提交,可能会使您面临代码丢失的风险,而不经常与集中的存储库同步将总是导致代码冲突和与其他团队成员的长时间合并。
  • 提交冗余文件 —并非所有文件都应该提交给 git。有些文件只是本地配置文件,或者可能是本地的中间结果文件,您最好自己保存它们。Git ignore 是一个很好的工具,可以用来管理那些你想在 Git 中忽略的文件。在您的提交中包含本地文件会导致冗余的提交、长的同步周期以及每当团队成员从远程存储库推/拉时反复出现的冲突。
  • 不利用树枝\标签 —很多人根本不知道树枝和标签的真正力量。当真正的意图和需要是维护同一代码库的不同版本时,许多人只是使用主要的“主”分支,甚至覆盖现有的代码,而不是使用在主要建模里程碑上版本化代码的能力,以及并行维护不同分支的可能性。

手动做可以轻松自动化的事情

在敏捷商业环境中拥有工作软件的需求是开发 CI\CD 工程实践的关键触发因素。作为任何 CI/CD 实践核心的最基本的概念是自动化。我们希望确保一个特定的流程在每一次执行中,以及在不同的环境中运行时,能够自动地、系统地工作。

在进行 ML 研究时,我认为自动化在两个主要方面对高效研究至关重要:

  • 数据准备 —每个数据科学家都知道,做研究是一项迭代任务,在这项任务中,你经常要从头开始重建数据集。原因可能有很多:您决定添加更多的要素,您发现了数据集中的数据问题,您想要添加更多的数据源,您发现了一些数据泄漏,或者您甚至想要选择不同的样本进行处理。不管原因是什么,事实是,在您的研究过程中,您可能会多次重建数据集。数据准备工作通常是 ML 项目中最耗时的阶段,因此也需要大部分数据科学家的编码工作。结合对迭代过程的需要,它是如此大的时间和代码消费者的事实,以及确保我们使用通过一些基本测试的数据准备代码(见我的下一个项目)是很好的激励因素,以确保我们的数据准备代码被正确处理,并且我们可以在单击按钮时重新创建用于建模的基本数据集。
  • 打包&部署 —我们的代码几乎总是使用某种形式的第三方和对其运行环境的假设。在 python 中,我们可能会导入第三方包,并假设特定的 python 和包版本。在 R 中,代码假定了特定的 R 版本和已安装的包。除了确保我们使用语言最佳实践来管理代码依赖关系(如 python 中的“需求”文件), docker containers 也可以是很好的工具,确保您的代码将在(几乎)任何使用虚拟化概念的环境中运行。对于这种方式,我们的目标应该是有一个基本的打包脚本(或 docker 构建脚本),当执行时,它安装所需的代码依赖项,并可以容易地部署在任何新的计算机\远程环境中。拥有这样的自动化应用程序打包,可以在不同的团队成员之间轻松共享,而不需要在他们的开发环境中做任何假设,并且当试图在远程环境中执行您的代码和模型时,这也是一个很好的工具。在研究过程中,一个非常有益的常见情况是利用云资源,通常是在本地资源不足以完成任务时。在这种情况下,您可能需要为任何远程执行打包和部署您的应用程序。强烈建议能够自动执行这一周期性任务。

你测试过你的代码吗?

在常规的软件开发中,开发工作和测试工作之间有着明显的区别。很明显,没有通过任何测试的代码不应该被部署到产品中(换句话说,它不会被实际使用)。然而,令人惊讶的是,在做研究时,测试的概念相当模糊或者根本不存在,即使这样,数据科学家也是根据这个研究代码来总结其工作和发现的。我想强调一下,让我们再说一遍,但这次是从相反的方向:通常,数据科学家得出的结论和模型是基于根本没有经过任何测试的代码!

虽然研究代码中的错误可能不会影响系统的功能,但是它可能会导致错误的结论和非最优的解决方案(相对于功能故障,这实际上更难发现,因为它们需要随着时间的推移监控生产中模型的质量)。显然,这些隐藏的错误有可能严重影响业务决策。

QA(质量保证)的概念在工程团队中得到了很好的发展,并且可以以多种形式出现,从单元测试到系统测试。考虑到研究环境中代码的动态特性,这些方法中的一些在做研究时应用起来似乎过于复杂。然而,我确实认为有两个基本的实践是任何数据科学家都应该经常做的,这可以显著提高你的研究代码的质量和保证水平。

  • 先测试再用——就这么简单。你写完了你的研究代码。握住你的手指,不要用它。首先做一些健全性测试,看看它是否如预期的那样工作(甚至手动测试在这里也会有所帮助)。一个基本且重要的例子是测试您的数据准备代码。在开始建模阶段之前,导出数据集的样本,确保数据集是按预期创建的。使用你的描述性统计工具和知识。确保每个场分布看起来合理,看看简单的相关矩阵,看看基本的相关性是否有意义,等等。
  • 执行代码评审——与同事一起进行代码评审不仅是发现潜在错误或代码问题的好工具,也是确保一些基本编码标准的好方法,也是确保技术/科学团队之间知识共享的好方法。让一个同行查看您的代码,不仅会发现一些代码错误,还会发现一些概念上的误解或错误,比如检测数据泄漏或糟糕的评估过程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

维护或创建编码标准

许多人认为代码标准实践只与大型开发团队相关。然而,任何在生活中做过编码的人都知道,你可能认为是编码时间的大约 90%的时间实际上是花在阅读和理解你面前的代码的行为上,即使那是你自己的代码!拥有一个混乱的代码,你需要投入大量的时间和精力去理解代码的编写方式,甚至在处理它实际做什么之前,这是一种浪费时间的行为。

代码标准是一个很大的概念,通常每种语言都有自己的最佳实践。对于研究阶段,我确实认为保持清晰和标准的编码格式可以节省大量时间,无论是对于需要使用别人编写的代码的同行,还是对于消耗自己代码的单个数据科学家。

这种格式编码标准可以包括:

清晰的项目结构、标准的函数和变量命名约定、模块化的功能代码(而不是很长的单一脚本)、适当的注释、删除冗余的依赖、代码缩进等等。

当我开始用 R 编程时,我非常惊讶,我发现没有正式的明确约定\ R 项目看起来应该如何的最佳实践。

我认为任何数据科学家都应该确保他的代码是干净的,并且符合最著名的行业标准。如果这样的标准不存在,创建一个你自己的。如果你是团队的一员,那么团队就要就一些明确的工作标准达成一致,这一点甚至更为重要。

柳文欢·拉松 是一位经验丰富的首席技术官,拥有超过 12 年的经验,在初创公司和全球企业中领导基于人工智能的产品从业务开始到生产。

柳文欢是一家基于机器学习隐形模式的初创公司的联合创始人,之前是一家成功的机器\深度学习专业服务公司 YellowRoad 的联合创始人。

做一个更高效的数据科学家,用这个指南掌握熊猫

原文:https://towardsdatascience.com/be-a-more-efficient-data-scientist-today-master-pandas-with-this-guide-ea362d27386?source=collection_archive---------2-----------------------

Python 是开源的。这很棒,但是有开源固有的问题:许多包做(或试图做)同样的事情。如果您是 Python 的新手,很难知道特定任务的最佳包。你需要有经验的人来告诉你。我今天告诉你:有一个包你绝对需要学习数据科学,它叫做熊猫

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

而熊猫真正有意思的是,里面还藏着很多其他的包裹。Pandas 是一个核心包,具有各种其他包的附加功能。这很好,因为你可以只用熊猫来工作。

pandas 就像 Python 中的 Excel:它使用表格(即数据帧)并对数据进行转换。但是它可以做得更多。

如果你已经熟悉 Python,你可以直接跳到第三段

让我们开始:

Don’t ask me why “pd” and not “p” or any other, it’s just like that. Deal with it 😃

熊猫最基本的功能

读取数据

sep means separator. If you’re working with French data, csv separator in Excel is “;” so you need to explicit it. Encoding is set to “latin-1” to read French characters. nrows=1000 means reading the first 1000 rows. skiprows=[2,5] means you will remove the 2nd and 5th row when reading the file

最常用的函数:read_csv、read_excel
其他一些很棒的函数:read_clipboard(我经常使用它,从 excel 或 web 上复制数据)、read_sql

写入数据

index=None will simply write the data as it is. If you don’t write index=None, you’ll get an additional first column of 1,2,3, … until the last row.

我通常不喜欢其他功能,比如。to_excel,。to_json,。从那以后。to_csv 很好地完成了这项工作。因为 csv 是保存表格最常用的方式。还有。to_clipboard 如果你像我一样是个 Excel 狂热者,想把你的结果从 Python 粘贴到 Excel。

检查数据

Gives (#rows, #columns)

Computes basic statistics

看到数据

Print the first 3 rows of the data. Similarly to .head(), .tail() will look at the last rows of the data.

Print the 8th row

Print the value of the 8th row on “column_1”

Subset from row 4 to 6 (excluded)

熊猫的基本功能

逻辑运算

Subset the data thanks to logical operations. To use & (AND), ~ (NOT) and | (OR), you have to add “(“ and “)” before and after the logical operation.

Instead of writing multiple ORs for the same column, use the .isin() function

基本绘图

matplotlib 包使这一特性成为可能。正如我们在介绍中所说,它可以直接用于熊猫。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Example of .plot() output

Plots the distribution (histogram)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Example of .hist() output

If you’re working with Jupyter, don’t forget to write this line (only once in the notebook), before plotting

更新数据

Replace the value in the 8th row at the ‘column_1’ by ‘english’

Change values of multiple rows in one line

好了,现在你可以做一些在 Excel 中很容易做到的事情了。让我们挖掘一些在 Excel 中做不到的惊人的事情。

中级功能

计数出现次数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Example of .value_counts() output

对整行、整列或所有数据的操作

The len() function is applied to each element of the ‘column_1’

的。map()操作将函数应用于列的每个元素。

A great pandas feature is the chaining method. It helps you do multiple operations (.map() and .plot() here) in one line, for more simplicity and efficiency

。apply()将函数应用于列。使用。应用(,axis=1)在行上执行此操作。

。applymap()将函数应用于表格(DataFrame)中的所有单元格。

独一无二的 tqdm

当处理大型数据集时,熊猫可能需要一些时间来运行。map(),。apply(),。applymap()操作。tqdm 是一个非常有用的包,有助于预测这些操作何时完成执行(是的,我撒谎了,我说过我们将只使用 pandas)。

setup of tqdm with pandas

Replace .map() by .progress_map(), same for .apply() and .applymap()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

This is the progress bar you get in Jupyter with tqdm and pandas

相关矩阵和散布矩阵

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

.corr() will give you the correlation matrix

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Example of scatter matrix. It plots all combinations of two columns in the same chart.

处理缺失值

The inplace=True will fill the missing values directly in your dataset. If you don’t write inplace=True, it will temporarily fill the missing values, not permanently.

熊猫的高级操作

SQL 连接

加入熊猫太简单了。

Joining on 3 columns takes just one line

分组

一开始并不简单,你需要先掌握语法,你会发现自己一直在使用这个特性。

Group by a column, the select another column on which to operate a function. The .reset_index() reshapes your data as a DataFrame (table)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

As explained previously, chain your functions in one line for optimal code

遍历行

的。iterrows()一起遍历两个变量:行的索引和行(上面代码中的 irow )。

总的来说,熊猫是 Python 如此伟大的语言的原因之一

我本可以展示许多其他有趣的熊猫特征,但这已经足以理解为什么数据科学家离不开熊猫。

总而言之,熊猫是

  • 简单易用,隐藏了所有复杂和抽象的计算
  • (通常)直觉
  • 快速,如果不是最快的数据分析包(它在 C 语言中高度优化)

它是帮助数据科学家快速阅读和理解数据并提高工作效率的工具。

我希望这篇文章对你有用,如果有用,考虑至少给 50 次掌声:)

通过更智能的销售报告提高利润

原文:https://towardsdatascience.com/be-more-profitable-with-a-smarter-sales-report-7a9c0202e0e6?source=collection_archive---------12-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在是星期四晚上 10 点。在餐馆工作了 12 个小时,送走了最后一批顾客后,我,老板,终于有机会坐下来检查每天的销售报告。但是我只有几分钟的时间,因为我有一张明天之前要做的其他事情的清单。

我们很好奇,想知道为什么我们采访的餐馆似乎很少关注每日销售报告。决定一家餐馆是否经营良好的重要成功标准是什么?是否有每周或每月检查一次的更复杂的报告?

当今餐馆如何使用销售报告

不同的餐厅从不同的 POS 系统得到不同的销售报告。通过与 50 多名餐馆老板交谈,他们中的大多数人都回顾了当天的总销售额、付款方式和封面数量。总销售额让所有者清楚地了解他们的业务表现如何,他们是否赚了足够的钱来支付成本,如果是,赚了多少。审查这只需要几秒钟,似乎是“足够”的大多数业主。

我们经常被告知,他们“非常了解业务”,花“大约 10 到 50 分钟”检查不同卡系统的卡支付,包括每天清点钱柜中的现金,会有明显的好处。

“如果有时间,我还会查看客人的数量。系统里有,但是我没有打印出来。把这个数字和主菜的销售额对比一下,我就知道有多少人来这里吃一顿饭或者喝下午茶。”—玛丽,一个临时餐馆老板。

在真实世界中观察 POS 和报告

餐饮企业确实关心有关他们业务的数据和见解,但他们不会去检查。从我们的采访来看,目前的报道似乎需要太长时间来“消化”。许多 POS 系统打印出大量数据,但仍然需要时间来理解。这些数据没有立即反映出明确的行动。我们被告知,从 POS 系统“很容易获得”报告。然而,报告的价值似乎没有超过导出它们的努力。如前所述,经理们似乎每天只对少数几个关键数字感兴趣。

我们看到的每个 POS 系统都有某种版本的销售报告。从接受订单到支付账单,这些系统似乎收集了大量数据。餐馆老板可以选择他们想看的数据。但是,过多的选择和灵活性会不会成为一种负担,而不是一件富有成效的事情。

以下是我们的一些其他重要观察结果:

  • 餐馆老板每天只花时间检查直接影响他们日常业务表现的数据。
  • 目前还不清楚什么是对餐馆老板最有用的数据
  • 获得关于业务的有用见解需要太多时间。他们有生意要做。

如何从销售报告中获得更多

73%的餐馆经营者同意投资餐馆技术使他们的经营更有利可图。(1)

技术的作用应该是以“正确的方式”帮助一个企业。我们认为“正确的方式”是当一个企业可以看到利益,而不妨碍他们想要如何经营他们的业务。利用餐馆的数据还可以做更多的事情。简单地列出一长串数据点是没有用的,而且需要时间来“消化”。在一天结束前被告知你可能无法完成今天的目标不是更有帮助吗?或许还有一些关于如何行动的建议?

许多餐馆和咖啡馆可以从一份更直接回答关键商业问题的报告中受益。通过将企业数据呈现为更有意义和更方便使用的内容,技术可以帮助所有者腾出更多时间来处理企业事务。

让我们看一个例子(见图 1 ),并从下面选择一些数据点(如总销售额、每位客人的销售额、不同菜肴的销售额等):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Diagram 1. Example sales data from a POS system

乍一看,我们可以看到周二的总销售额(以橙色表示)比周一要好(分别为 20,750 美元和 19,250 美元)。周一有 250 个订单(蓝色),周二少了 50 个订单。如果我们只看到总销售额和订单总数,结论可能是“在星期二,餐馆不太忙,但出售价格更高的商品”。但我们不能肯定地说。可能只是星期二的顾客吃了更贵的东西。

那么,如果我们还获得了客人总数,并显示了每位客人每天的销售额(绿色)。在上面的例子中,周一的客人多花了 12.50 美元。

你想知道你的客人周一买了什么,以便你能监控如何影响周二的销售吗?一份更好的销售报告可以告诉你这一点,甚至更多。

现在,让我们看看总利润(红色),我们会发现餐馆在星期一和星期二都有 10,000 美元的利润。虽然周二实际上更忙,但周一销售了更多有利可图的项目(如甜点、开胃菜)。烹饪主菜比开胃菜和甜点需要更多的时间。因此,总销售额和总订单数并不总是能显示这些有用的信息。

那么,更好的报告能减少思考时间,让所有者更好地控制如何获得更多利润吗?

掌握有用的见解

一份“有用”的销售报告应该有助于所有者更好地监控他们的业务,而无需过多的思考。它需要快速和简单,因为所有者和管理者没有时间考虑如何使他们的数据更有用。可视化正确的数据有助于这一点。

  1. 不同时间的总销售额和总订单数有助于店主制作花名册,从而降低劳动力成本。如果从中午 12 点到下午 2 点有更多的订单,只在午餐时间雇用一名兼职人员。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Diagram 2. Total sales and total orders

2。订购的特殊项目的比率给了企业如何调整菜单上的项目的想法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Diagram 3. Ratio of “Recommended” and “Gluten free” items ordered

突出重点菜式可以帮助你更好地了解顾客和他们喜欢什么,例如,推荐的饮料或符合特殊饮食要求的主菜。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.点的饮料、甜点、配菜和主菜的比例和组合给出了如何 促销其菜单产品的商业思路 。如果一家餐馆为一种饮料提供特价,能让 10%的顾客点它,餐馆能获得更多利润吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Diagram 4. Ratio of drinks, desserts and sides to mains

在图表 4 中,周一和周二的饮料销售是相同的,但是周一的销售比例(50%)远远多于周二(28.6%)。和饮料类似,周一的甜点、头盘、配菜的比例(75%、50%、12.5%)都比周二(14.2%、14.2%、7%)好。如果餐馆在星期二提供半价饮料(8 美元),并且 10%的顾客(例如 80 人)点了它,它将带来 640 美元的额外销售额。因此,利润将增加 400 美元。

4。最上面的有序菜单项帮助厨房决定哪些项目保留在菜单上,哪些项目改变。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Diagram 5. The top 5 menu items ordered

通过更智能的报告让您的业务数据变得有用

在上面的例子中,通过更快地理解星期二发生的事情,很快就找到了增加利润的方法。想象一下,无论是在会议间隙还是在休息时,您都可以通过手机或平板电脑随时随地安全地访问这些内容。有了更多有用的数据,企业所有者和管理者可以腾出一些时间来经营企业的其他部分,或者利用这些时间来改善企业。

如果你能结合从多年经验中获得的知识和业务数据来实现更多的目标,会怎么样?敬请期待:)

数据和图表均来自 Atumio 。您想了解其他有用的报告吗?有什么想法可以分享吗?请随时联系 hello@atumio.com。在 Instagram脸书上有很多有趣的发现。

餐厅技术:明天成功的关键

Atumio——通过漂亮的社交菜单拉近人们的距离

足智多谋—在数据科学领域取得成功的最重要技能之一

原文:https://towardsdatascience.com/be-resourceful-one-of-the-most-important-skills-to-succeed-in-data-science-6ed5f33c2939?source=collection_archive---------1-----------------------

然而,这是最容易被遗忘的技能之一

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

足智多谋是指找到并使用可用资源来解决问题和实现目标的能力。

在数据科学和生活中追求成功的过程中,没有比足智多谋更重要的特质了。

我在数据科学领域已经工作了相当长一段时间,我一直在研究和学习许多成功的数据科学家的品质——无论是他们职业生涯中的专业品质,还是他们个人生活中的品质。

您可能会想,要成为一名成功的数据科学家,无非是以下维恩图中的组合:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(Source)

从技术上讲,这没有错,而且你是绝对正确的。然而,在学习、理解和与各种数据科学家交谈之后,缺少了一些东西——是的,软技能——而足智多谋是作为一名数据科学家取得成功的要素之一。

在这篇文章中,您将了解为什么足智多谋对于学习和追求数据科学道路至关重要,我也将分享我的经验,希望展示您如何使用这一被遗忘的技能来追求数据科学的成功,最重要的是,在生活中。

所以让我们开始吧!

1.足智多谋是一种心态

足智多谋是一种心态。句号。

当你设定的目标或问题很难实现,或者你无法想象一条清晰的路径去实现你的愿望时,这一点尤其重要。

这完全没问题。我们中的许多人(包括我)经常没有一个清晰的路径或方法来解决我们的问题以实现我们的目标。

未来存在不确定性是正常的。但是停滞不前是不行的,哪里也不去,只能等待奇迹发生。因为很有可能,它们不会发生。很遗憾告诉你真相,但现实总是残酷的。

💡足智多谋就是要主动

特别是对于有志于从事数据科学职业的数据科学家来说,有大量的资源等待着他们去发掘。然而,他们中的大多数往往是一个被动的观察者,而不是积极主动地寻找和创造自己的资源。

当我们在这里谈论资源时,我们指的是书籍、在线课程、开源项目(Kaggle 等。)、黑客马拉松和竞赛,最重要的是网络。

有了足智多谋的心态,我们就有动力去寻找方法。没有等待。我们会一直努力找到方法,一直。

当我第一次开始学习和追求我的数据科学职业生涯时,我像其他有抱负的数据科学家一样被大量的资源所困惑,其中每一个都声称是最好的。不知所措。我尽可能多地阅读书籍和文章,向尽可能多的数据科学家寻求建议,尽可能多地参加在线课程(不管是好的还是差的),尽可能多地犯错误,并从中吸取教训。

学习的道路是不确定的,但我是积极的。最终,我筛选出了一些最有用的资源,它们帮助我在尽可能短的时间内进入了数据科学领域。而且我还写了一篇文章——如何走进数据科学? —用实用指南汇编所有资源。希望对你也有帮助。

你看。当你足智多谋时,你不会让外界环境决定你何时或如何采取行动,否则你将永远满足于现状。

足智多谋的态度会激发创新思维,产生新的想法,以及想象所有可能的方式来实现你的愿望的能力。

拥有足智多谋的心态需要你保持积极。每个问题都有解决的办法,即使这意味着方向的改变。

2.足智多谋是一种技能

足智多谋是一种技能。

好消息是:这项技能是可以学习和掌握的。

我不会说我已经掌握了这项技能,因为我仍然是一个足智多谋的学习者,现在是,将来也永远是。

仅仅拥有足智多谋的心态不足以解决问题和实现我们的目标。这就是将心态付诸行动的技巧所在。

掌握足智多谋的技能在数据科学中尤为重要,因为这个领域还很年轻,没有明确的发展道路。正是这种微妙性让这个领域变得如此富有挑战性、令人兴奋,同时又有回报。这正是我在这里写数据科学的原因,因为我热爱它!

💡足智多谋就是知道找谁/找什么,问什么

下面就来说说在工作中要想在数据科学上取得成功,应该找谁。

不管承认与否,我们无法掌握数据科学中的一切,肯定有一些我们不知道和不理解的东西。因此,找到合适的人寻求帮助和建议是极其重要的。

你可能会花几个小时去理解一些重要的技术概念。但是,如果你去问你的一个朋友或同事,他是这个领域的主题专家(SME ),会怎么样呢?过去的几个小时有可能被缩短为几分钟甚至更短。

有时候答案可能就在一个问题之外。

我得对你说实话。在我工作的头几个月,我在理解领域知识、使用的数据管道、一些技术术语等方面遇到了很多困难。是的,我本可以花时间问自己或者疯狂地在网上搜索答案,但是我决定接近我的团队成员,和他们一起澄清我的问题。砰!!大多数时候,这些问题都得到了解答,并让我加快了工作速度。

但这是棘手的部分。

既然我们知道要找什么和谁,我们需要知道要问什么,并以正确和最有效的方式问。换句话说,我们需要知道问什么以及如何问正确的问题来解决我们的问题。

除了向同事寻求帮助,作为一名数据科学家,我们还会在谷歌上寻求帮助和答案。栈溢出数据科学中心Quora分析 Vidhya …你说得出的。

有很多次,我键入一些关键字来搜索解释和解决方案,但谷歌返回给我一些我不感兴趣的资源。沮丧。我试着稍微调整一下关键词,结果完全不同,给了我更准确的结果!

**如果说我从这次经历中学到了什么的话:**提出正确的问题不仅重要,我们还必须使用正确的关键词进行搜索,以获得最佳结果。

再说一遍,这里有很多资源。足智多谋,从合适的资源中学习。

最后的想法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(Source)

简而言之,只有当我们把足智多谋的心态和技能结合起来时,才能获得足智多谋。

在今天的数字时代,从来没有比现在更多的噪音,因此,对我们来说,从浩瀚的信息海洋中提取信号以充分利用资源是至关重要的。

感谢您的阅读。我希望这篇文章能让你对足智多谋在数据科学以及生活中取得成功的重要性有所了解。

一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。在那之前,下一篇文章再见!😄

关于作者

Admond Lee 目前是东南亚排名第一的商业银行 API 平台【Staq】**—**的联合创始人/首席技术官。

想要获得免费的每周数据科学和创业见解吗?

加入 Admond 的电子邮件简讯——Hustle Hub,每周他都会在那里分享可行的数据科学职业建议、错误&以及从创建他的初创公司 Staq 中学到的东西。

你可以在 LinkedInMediumTwitter脸书上和他联系。

[## 阿德蒙德·李

让每个人都能接触到数据科学。Admond 正在通过先进的社交分析和机器学习,利用可操作的见解帮助公司和数字营销机构实现营销投资回报。

www.admondlee.com](https://www.admondlee.com/)

内容概要:本文由《未来产业新赛道研究报告》整理而成,涵盖了未来产业在全球范围内的发展态势和竞争形势。报告指出,引领型国家通过全方位体制机制创新,在先进制造、人工智能、量子科技、新一代通信等领域建立了全面领先优势。文中引用了麦肯锡和GVR的数据,预测了人工智能和人形机器人等未来产业的巨大经济潜力。报告还详细介绍了国外和国内对未来产业赛道的重点布局,如量子科技、人工智能、先进网络和通信技术、氢能与储能、生物技术等。此外,报告列举了中国重点省市如北京、上海等的具体发展方向,以及知名研究机构对未来产业热点的分析。最后,报告提出了构建我国未来产业重点赛道目录的建议,包括通用人工智能、高级别自动驾驶、商业航天、人形机器人、新型储能、低空经济、清洁氢、算力芯片、细胞与基因治疗和元宇宙等十大重点赛道。 适用人群:对科技趋势和未来产业发展感兴趣的政策制定者、投资者、企业家和研究人员。 使用场景及目标:①帮助政策制定者了解全球未来产业发展动态,为政策制定提供参考;②为企业提供未来产业布局的方向和重点领域;③为投资者提供投资决策依据,识别未来的投资机会;④为研究人员提供未来科技发展趋势的全景图。 其他说明:报告强调了未来产业在全球经济中的重要性,指出了中国在未来产业布局中的战略定位和发展路径。同时,报告呼吁加强国家顶层设计和行业系统谋划,探索建立未来产业技术预见机制,深化央地联动,推动未来产业高质量发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值