巴隆多尔的历史告诉了我们什么
Photo credit: https://commons.wikimedia.org/wiki/File:Super_Ballon_d%27Or_and_Ballon_d%27Ors.jpg
对往届金球奖得主的深入分析
我坐在后面,看着克里斯蒂亚诺·罗纳尔多如何赢得 2013 年金球奖。我很生气。我认为弗兰克·里贝利应该赢得它。毕竟,拜仁慕尼黑通过赢得他们争夺的每一座奖杯,全年表现得比皇家马德里更好。
回顾那一刻,我意识到金球奖有时可以公正地颁发,而在其他时候则可以公平地颁发,就像莱昂内尔·梅西在 2015 年赢得它一样。
金球奖是一项非常有声望的奖项,根据上一赛季的表现授予世界最佳足球运动员。因此,我对这个奖项的痴迷让我对 Ballon d’or 的历史进行了分析,找出谁是最大的赢家,以及哪些球队产生了最多的赢家。
获取数据集
用于进行这项研究的数据集是通过这个链接从 Kaggle 获得的。该数据集包含精确的列,显示自 1956 年开始以来金球奖是如何授予的。
数据集被加载到 Jupyter Notebook 上,并被清理以便执行某些任务。数据集中的特征有:年份、排名、球员、球队、分数和百分比。
A snapshot of the first five rows of the dataset.
分析和探索数据集
十佳金球奖演员
在金球奖颁奖典礼之前,首先绘制了一张图表,以突出显示进入决赛的前三名球员。
The top ten players who have featured as Ballon d’or finalists
根据图表,不出所料,莱昂内尔·梅西和克里斯蒂亚诺·罗纳尔多并列第一,因为他们都创纪录地 11 次入围决赛。
然后,绘制了另一个图表来描绘赢得最多金球奖的球员。
The top ten players with the Ballon d’or awards
众所周知,梅西和罗纳尔多各获得 5 个奖项。米歇尔·普拉蒂尼、约翰·克劳夫和卡尔·海茵茨·鲁梅尼格各获得三个金球奖,并列第三。
贡献最多金球奖的球队
绘制了三张图来显示哪些球队经常为金球奖做出贡献。
第一张图显示了哪支队伍产生了最多的决赛选手。
The top 20 teams with the most finalists
图表显示巴塞罗那拥有最多的决赛席位。他们的球员已经 33 次入围金球奖决赛。皇家马德里以 27 次位居第二。拜仁慕尼黑以大约 18 次排名第三。
第二张图显示了获得最多金球奖的球队
The top 20 teams with the most Ballon d’or winners
皇家马德里和巴塞罗那都有他们的球员 11 次赢得这个美丽的奖项。尤文图斯的球员和 AC 米兰的球员获得了 8 次,拜仁慕尼黑的球员获得了 5 次。
第三张图显示了自金球奖开始以来积分最高的球队。分数是根据谁投票给一个玩家以及有多少人投票给一个玩家来决定的。
The top 10 teams that have accumulated the most points from Ballon d’or
根据图表,最终进入决赛的皇家马德里球员以创纪录的 4190 分获得了最多的分数。巴塞罗那以 3869 分位居第二。尤文图斯以 2258 分排在第三位。
历史上命中率最高的球员
在金球奖颁奖仪式上,俱乐部队长和教练会为他们认为应该获奖的球员投票。决赛选手中得分最高的选手获胜。
The top five players with the most percentages in the history of Ballon d’or
The last five players with the most percentages in the history of Ballon d’or
第一张表中,米歇尔·普拉蒂尼以 68.32 %的得票率成为 1983 年的最大赢家。有史以来最小的赢家是莱昂内尔·梅西,他在 2010 年获得了 22.65 %的选票。
结论
金球奖揭晓后,足球迷们在谁应该获奖的问题上产生了分歧。c 罗还是梅西?根据我的看法,今年将会是维吉尔·范·迪克。然而,我们必须等待,看看谁会赢得 2019 年 9 月 23 日的金球奖。
用来构建这些图的完整版本代码可以在 这里 看到。
推特是如何看待星球大战:天行者崛起的?Python 中的情感分析
Photo by Craig Adderley on Pexels
《星球大战:天行者崛起》最近在影院上映。迪士尼报告说,这部新电影的预告片获得了 4000 万美元的票房,这使它成为有史以来第五高的预告片。首映周末的票房收入在 1.7 亿到 2 亿美元之间。从这些数字来看,很明显这部新电影是票房成功的。我在这篇文章中试图回答的问题是:twitter 用户对这部电影的普遍看法是什么?
在这篇文章中,我们将使用 twitter python API tweepy 来获取与新的《星球大战》电影相关的 Twitter 消息。然后,我们将使用 TextBlob,一个用于处理文本数据的 python 库,来为与电影相关的推文生成情感分数。最后,我们将使用 python 可视化包 seaborn 和 Matplotlib 来可视化我们的结果。
首先,你需要申请一个 Twitter 开发者账户:
在您的开发人员帐户获得批准后,您需要创建一个 Twitter 应用程序:
申请 Twitter 开发者账户和创建 Twitter 应用程序的步骤在这里有概述。
为了访问 Twitter API,我们将使用免费的 python 库 tweepy。tweepy 的文档可以在这里找到。
- 安装
首先,确保您已经安装了 tweepy。打开命令行并键入:
pip install tweepy
2.导入库
接下来,打开您最喜欢的编辑器,导入 tweepy 和 pandas 库:
import tweepy
import pandas as pd
3.认证
接下来,我们需要我们的消费者密钥和访问令牌:
请注意,该网站建议您保持您的密钥和令牌私有!这里我们定义了一个假的密钥和令牌,但是在创建 Twitter 应用程序时,您应该使用真正的密钥和令牌,如上所示:
consumer_key = '5GBi0dCerYpy2jJtkkU3UwqYtgJpRd'
consumer_secret = 'Q88B4BDDAX0dCerYy2jJtkkU3UpwqY'
access_token = 'X0dCerYpwi0dCerYpwy2jJtkkU3U'
access_token_secret = 'kly2pwi0dCerYpjJtdCerYkkU3Um'
下一步是创建 OAuthHandler 实例。我们传递上面定义的消费者密钥和访问令牌:
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
接下来,我们将 OAuthHandler 实例传递给 API 方法:
api = tweepy.API(auth)
- TWITTER API 请求
接下来,我们为我们有兴趣分析的字段初始化列表。现在,我们可以查看推文字符串、用户和推文时间。接下来,我们在一个 tweepy“Cursor”对象上编写一个 for 循环。在“Cursor”对象中,我们传递“api.search”方法,为我们想要搜索的内容设置查询字符串,并设置“count”= 1000,这样我们就不会超过 Twitter 的速率限制。在这里,我们将搜索关于“星球大战”的推文。我们还使用“item()”方法将“Cursor”对象转换为 iterable。
为了简化查询,我们可以删除转发,只包含英文推文。为了了解该请求返回的内容,我们还可以打印附加到每个列表的值:
twitter_users = []
tweet_time = []
tweet_string = []
for tweet in tweepy.Cursor(api.search,q='Star Wars', count=1000).items(1000):
if (not tweet.retweeted) and ('RT @' not in tweet.text):
if tweet.lang == "en":
twitter_users.append(tweet.user.name)
tweet_time.append(tweet.created_at)
tweet_string.append(tweet.text)
print([tweet.user.name,tweet.created_at,tweet.text])
为了实现可重用性,我们可以将它封装在一个函数中,该函数将关键字作为输入。我们还可以将结果存储在数据帧中并返回值:
def get_related_tweets(key_word):twitter_users = []
tweet_time = []
tweet_string = []
for tweet in tweepy.Cursor(api.search,q=key_word, count=1000).items(1000):
if (not tweet.retweeted) and ('RT @' not in tweet.text):
if tweet.lang == "en":
twitter_users.append(tweet.user.name)
tweet_time.append(tweet.created_at)
tweet_string.append(tweet.text)
print([tweet.user.name,tweet.created_at,tweet.text])
df = pd.DataFrame({'name':twitter_users, 'time': tweet_time, 'tweet': tweet_string})
return df
如果用关键字“星球大战:天行者崛起”调用函数,我们会得到:
get_related_tweets("Star Wars: The Rise of Skywalker")
为了获得情感分数,我们需要导入一个名为 textblob 的 python 包。textblob 的文档可以在这里找到。要安装 textblob,请打开命令行并键入:
pip install textblob
下次导入 textblob:
from textblob import TextBlob
我们将使用极性得分作为积极或消极感觉的衡量标准。极性得分是一个从-1 到+1 的浮点数。
例如,如果我们定义一个 textblob 对象并传入句子“我喜欢新的星球大战电影”,我们应该得到一个正值的极性分数:
sentiment_score = TextBlob("I love the new Star Wars movie").sentiment.polarity
print("Sentiment Polarity Score:", sentiment_score)
让我们给关于“星球大战:天行者崛起”的推文打分:
df = get_related_tweets("Star Wars: The Rise of Skywalker")
df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
print(df.head())
我们也可以计算积极和消极情绪的数量:
df_pos = df[df['sentiment'] > 0.0]
df_neg = df[df['sentiment'] < 0.0]
print("Number of Positive Tweets", len(df_pos))
print("Number of Negative Tweets", len(df_neg))
同样,对于代码重用,我们可以将其全部封装在一个函数中:
def get_sentiment(key_word):
df = get_related_tweets(key_word)
df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
df_pos = df[df['sentiment'] > 0.0]
df_neg = df[df['sentiment'] < 0.0]
print("Number of Positive Tweets about {}".format(key_word), len(df_pos))
print("Number of Negative Tweets about {}".format(key_word), len(df_neg))
如果我们用“星球大战:天行者崛起”调用这个函数,我们得到:
get_sentiment("Star Wars: The Rise of Skywalker")
我们也可以试试《星球大战》:
get_sentiment("Star Wars")
如果我们能以编程方式可视化这些结果,那将会很方便。让我们导入 seaborn 和 matplotlib 并修改我们的 get _ 情操函数:
import seaborn as sns
import matplotlib.pyplot as plt
def get_sentiment(key_word):
df = get_related_tweets(key_word)
df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
df_pos = df[df['sentiment'] > 0.0]
df_neg = df[df['sentiment'] < 0.0]
print("Number of Positive Tweets about {}".format(key_word), len(df_pos))
print("Number of Negative Tweets about {}".format(key_word), len(df_neg))
sns.set()
labels = ['Postive', 'Negative']
heights = [len(df_pos), len(df_neg)]
plt.bar(labels, heights, color = 'navy')
plt.title(key_word)
get_sentiment("Star Wars: The Rise of Skywalker")
而对于《星球大战》:
get_sentiment("Star Wars")
如你所见,关于星球大战:天行者崛起的推文正面情绪多于负面情绪。我知道我很期待这个周末自己去看。收集几天的数据来观察情绪如何随时间变化会很有趣。也许我会把它留到以后的文章里。
感谢您的阅读。这篇文章的代码可以在 GitHub 上找到。祝好运,机器学习快乐!
Twitter 如何看待新款特斯拉 Cybertruck?Python 中的情感分析
最近,埃隆·马斯克(Elon Musk)推出了特斯拉 Cybertruck,这是一款由特斯拉公司(Tesla Inc .)开发的全电动电池驱动的商用车。Cybertruck 是每天销售的数千辆化石燃料驱动卡车的可持续能源替代品。最近,在一次电脑卡车的演示中,埃隆告诉卡车的主要设计师之一,向窗户扔一个小钢珠,以展示防弹玻璃的耐用性。两次投掷后,司机和乘客座位上的玻璃都碎了。
此次发布会在社交媒体上引起了大量的关注。尽管许多人对卡车的锐利轮廓、不寻常的形状以及揭幕期间的失败测试表示不满,但特斯拉收到了超过 25 万辆卡车的预订。鉴于这种差异,看看社交媒体上对使用机器学习的网络卡车的普遍看法将是有趣的。在本帖中,我们将对关于特斯拉赛博卡车的推文进行情感分析。
首先,你需要申请一个 Twitter 开发者账户:
您的开发人员帐户获得批准后,您需要创建一个 Twitter 应用程序:
申请 Twitter 开发者账户和创建 Twitter 应用程序的步骤在这里列出。
为了访问 Twitter API,我们将使用免费的 python 库 tweepy。tweepy 的文档可以在这里找到。
- 安装
首先,确保您已经安装了 tweepy。打开命令行并键入:
pip install tweepy
2.导入库
接下来,打开您最喜欢的编辑器,导入 tweepy 和 pandas 库:
import tweepy
import pandas as pd
3.认证
接下来,我们需要我们的消费者密钥和访问令牌:
请注意,该网站建议您保持您的密钥和令牌私有!这里我们定义了一个假的密钥和令牌,但是在创建 Twitter 应用程序时,您应该使用真正的密钥和令牌,如上所示:
consumer_key = '5GBi0dCerYpy2jJtkkU3UwqYtgJpRd'
consumer_secret = 'Q88B4BDDAX0dCerYy2jJtkkU3UpwqY'
access_token = 'X0dCerYpwi0dCerYpwy2jJtkkU3U'
access_token_secret = 'kly2pwi0dCerYpjJtdCerYkkU3Um'
下一步是创建 OAuthHandler 实例。我们传递上面定义的消费者密钥和访问令牌:
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
接下来,我们将 OAuthHandler 实例传递给 API 方法:
api = tweepy.API(auth)
- TWITTER API 请求
接下来,我们为我们有兴趣分析的字段初始化列表。现在,我们可以查看推文字符串、用户和推文时间。接下来,我们在一个 tweepy“Cursor”对象上编写一个 for 循环。在“Cursor”对象中,我们传递“api.search”方法,为我们想要搜索的内容设置查询字符串,并设置“count”= 1000,这样我们就不会超过 twitter 的速率限制。在这里,我们将搜索关于“特斯拉 Cybertruck”的推文。我们还使用“item()”方法将“Cursor”对象转换为 iterable。
为了简化查询,我们可以删除转发,只包含英文推文。为了了解该请求返回的内容,我们还可以打印附加到每个列表的值:
twitter_users = []
tweet_time = []
tweet_string = []
for tweet in tweepy.Cursor(api.search,q='Tesla Cybertruck', count=1000).items(1000):
if (not tweet.retweeted) and ('RT @' not in tweet.text):
if tweet.lang == "en":
twitter_users.append(tweet.user.name)
tweet_time.append(tweet.created_at)
tweet_string.append(tweet.text)
print([tweet.user.name,tweet.created_at,tweet.text])
为了实现可重用性,我们可以把它打包成一个函数,把关键字作为输入。我们还可以将结果存储在数据帧中并返回值:
def get_related_tweets(key_word):twitter_users = []
tweet_time = []
tweet_string = []
for tweet in tweepy.Cursor(api.search,q=key_word, count=1000).items(1000):
if (not tweet.retweeted) and ('RT @' not in tweet.text):
if tweet.lang == "en":
twitter_users.append(tweet.user.name)
tweet_time.append(tweet.created_at)
tweet_string.append(tweet.text)
print([tweet.user.name,tweet.created_at,tweet.text])
df = pd.DataFrame({'name':twitter_users, 'time': tweet_time, 'tweet': tweet_string})
return df
当我们用关键词“特斯拉 Cybertruck”调用函数时,我们得到:
get_related_tweets('Tesla Cybertruck')
为了获得情感分数,我们需要导入一个名为 textblob 的 python 包。textblob 的文档可以在这里找到。要安装 textblob,请打开命令行并键入:
pip install textblob
下次导入 textblob:
from textblob import TextBlob
我们将使用极性得分作为积极或消极感觉的衡量标准。极性得分是一个从-1 到+1 的浮点数。
例如,如果我们定义一个 textblob 对象并传入句子“我爱特斯拉 Cybertruck ”,我们应该得到一个正值的极性得分:
sentiment_score = TextBlob(“I love the Tesla Cybertruck”).sentiment.polarity
print("Sentiment Polarity Score:", sentiment_score)
让我们来看看关于“特斯拉赛博卡车”的推文的情绪极性得分:
df = get_related_tweets("Tesla Cybertruck")
df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
print(df.head())
我们也可以计算积极和消极情绪的数量:
df_pos = df[df['sentiment'] > 0.0]
df_neg = df[df['sentiment'] < 0.0]
print("Number of Positive Tweets", len(df_pos))
print("Number of Negative Tweets", len(df_neg))
同样,对于代码重用,我们可以将其全部封装在一个函数中:
def get_sentiment(key_word):
df = get_related_tweets(key_word)
df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
df_pos = df[df['sentiment'] > 0.0]
df_neg = df[df['sentiment'] < 0.0]
print("Number of Positive Tweets about {}".format(key_word), len(df_pos))
print("Number of Negative Tweets about {}".format(key_word), len(df_neg))
如果我们用“Tesla Cybertruck”调用这个函数,我们得到:
get_sentiment(“Tesla Cybertruck”)
如果我们能以编程方式可视化这些结果,那将会很方便。让我们导入 seaborn 和 matplotlib 并修改我们的 get _ 情操函数:
import seaborn as sns
import matplotlib.pyplot as pltdef get_sentiment(key_word):
df = get_related_tweets(key_word)
df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
df_pos = df[df['sentiment'] > 0.0]
df_neg = df[df['sentiment'] < 0.0]
print("Number of Positive Tweets about {}".format(key_word), len(df_pos))
print("Number of Negative Tweets about {}".format(key_word), len(df_neg))
sns.set()
labels = ['Postive', 'Negative']
heights = [len(df_pos), len(df_neg)]
plt.bar(labels, heights, color = 'navy')
plt.title(key_word)get_sentiment(“Tesla Cybertruck”)
如你所见,关于特斯拉电动卡车的推文正面情绪多于负面情绪。收集几天的数据来观察情绪如何随时间变化会很有趣。也许我会把它留到以后的文章里。
感谢您的阅读。这篇文章的代码可以在 GitHub 上找到。祝好运,机器学习快乐!
你的分类标准告诉了你的数据什么?
分类度量的评价策略及结果评价研究
有没有想过为什么会有很多性能指标告诉你你的分类技能?是的,他们会评估一个模型的性能,并告诉你分类的好坏,但每个人的评估方式都不一样。
把它想象成你的高中老师,有些人可能会给你高分,尽管你的答案是狗屎,因为你是一个马屁精,有些人可能会给你低分,尽管你的答案很贴切。将准确性作为你分类的主要标准也是一种犯罪!
然而,这个博客不是让你熟悉度量标准,而是如何有效地使用它们。
先决条件
- 你知道混淆矩阵是什么吗
- 你熟悉第一类和第二类错误
假设
- 零假设 H⁰=“个人有癌症”。(通常,零假设是出于拒绝它的动机)
- 以下混淆矩阵作为参考和示例。
Note: Box values depend on H0
我将在本博客中介绍以下与在线数据科学竞赛重要性相关的指标:
- 精确度和召回率
- f1-分数
- 受话者工作特性范围
注意:我采用 UCI 乳腺癌数据集来表示不同的值。为此,我故意移动超参数来表示某些条件和结果。
用于计算混淆矩阵值的 Python 辅助函数:
def find_TP(y, y_hat):
# counts the number of true positives (y = 1, y_hat = 1)
return sum((y == 1) & (y_hat == 1))
def find_FN(y, y_hat):
# counts the number of false negatives (y = 1, y_hat = 0) Type-II error
return sum((y == 1) & (y_hat == 0))
def find_FP(y, y_hat):
# counts the number of false positives (y = 0, y_hat = 1) Type-I error
return sum((y == 0) & (y_hat == 1))
def find_TN(y, y_hat):
# counts the number of true negatives (y = 0, y_hat = 0)
return sum((y == 0) & (y_hat == 0))
我用逻辑回归的两组超参数做了一个分类模型。这样做是为了在两种不同的情况下测试模型预测。
from sklearn.linear_model import LogisticRegressionclf_1 = LogisticRegression(C=1.0, class_weight={0:100,1:0.2}, dual=False, fit_intercept=True,
intercept_scaling=1, l1_ratio=None, max_iter=100,
multi_class='auto', n_jobs=None, penalty='l2',
random_state=None, solver='lbfgs', tol=0.0001, verbose=0,
warm_start=False)clf_2 = LogisticRegression(C=1.0, class_weight={0:0.001,1:900}, dual=False, fit_intercept=True,
intercept_scaling=1, l1_ratio=None, max_iter=100,
multi_class='auto', n_jobs=None, penalty='l2',
random_state=None, solver='lbfgs', tol=0.0001, verbose=0,
warm_start=False)
精确
精度是真阳性和预测的总阳性的比率。
0
精度指标关注第一类误差(FP)。当我们拒绝一个真的空 Hypothesis(H⁰时,一个第一类错误发生。因此,在这种情况下,第一类错误是错误地将癌症患者标记为非癌症患者。精度分数接近 1 将意味着您的模型没有遗漏任何真正的阳性,并且能够很好地分类正确和错误标记的癌症患者。它不能测量的是 II 型错误的存在,即假阴性,即当非癌症患者被识别为癌症患者时的情况。
低精度分数(< 0.5)意味着您的分类器有大量的假阳性,这可能是不平衡的类或未调整的模型超参数的结果。在不平衡类问题中,为了抑制 FP/FN,你必须事先准备好数据,包括过采样/欠采样或焦点损失。
对于第一组超参数:
TP = find_TP(y, y_hat)
FN = find_FN(y, y_hat)
FP = find_FP(y, y_hat)
TN = find_TN(y, y_hat)print('TP:',TP)
print('FN:',FN)
print('FP:',FP)
print('TN:',TN)precision = TP/(TP+FP)
print('Precision:',precision)
Output for the above code snippet
通过查看混淆矩阵值,您可能已经猜到 FP 为 0,因此对于给定超参数设置的 100%精确模型来说,该条件是完美的。在这种设置下,没有报告 I 型错误,即模型在抑制错误地将癌症患者标记为非癌症患者方面做了大量工作。
对于第二组超参数:
TP = find_TP(y, y_hat)
FN = find_FN(y, y_hat)
FP = find_FP(y, y_hat)
TN = find_TN(y, y_hat)print('TP:',TP)
print('FN:',FN)
print('FP:',FP)
print('TN:',TN)precision = TP/(TP+FP)
print('Precision:',precision)
Output for the above code snippet
由于在这种设置中只剩下第一类误差,因此尽管第二类误差为 0,但精度会下降。从我们的例子中我们可以推断出,只有精度不能告诉你你的模型在各种情况下的性能。
回忆或敏感度或命中率
一个 回忆 本质上是真实肯定与地面真相中所有肯定的比率
0 召回指标侧重于第二类错误(FN)。当我们接受一个假的空 Hypothesis(H⁰).时,就会出现第二类错误因此,在这种情况下,第二类错误是错误地将非癌症患者标记为癌症患者。回忆分数接近 1 将意味着您的模型没有错过任何真正的阳性,并且能够很好地分类正确和错误标记的癌症患者。
它不能测量的是 I 型错误的存在,即误报,即癌症患者被识别为非癌症患者的情况。
低召回分数(< 0.5)意味着您的分类器有大量的假阴性,这可能是不平衡的类或未调整的模型超参数的结果。在不平衡类问题中,为了抑制 FP/FN,你必须事先准备好数据,包括过采样/欠采样或焦点损失。
对于第一组超参数:
TP = find_TP(y, y_hat)
FN = find_FN(y, y_hat)
FP = find_FP(y, y_hat)
TN = find_TN(y, y_hat)print('TP:',TP)
print('FN:',FN)
print('FP:',FP)
print('TN:',TN)recall = recall_score(y, y_hat)
print('Recall: %f' % recall)
Output for the above code snippet
从上述混淆矩阵值来看,第一类错误的可能性为 0,而第二类错误的可能性很大。这就是低召回分数背后的原因。它只关注第二类错误。
对于第二组超参数:
TP = find_TP(y, y_hat)
FN = find_FN(y, y_hat)
FP = find_FP(y, y_hat)
TN = find_TN(y, y_hat)print('TP:',TP)
print('FN:',FN)
print('FP:',FP)
print('TN:',TN)recall = recall_score(y, y_hat)
print('Recall: %f' % recall)
Output for the above code snippet
这个集合中唯一持久的错误是 I 类错误,没有报告 II 类错误。这意味着这个模型在遏制错误地将非癌症患者标记为癌症方面做了很大的工作。
以上两个度量标准的主要亮点是它们都只能在特定的场景中使用,因为它们都只能识别一组错误。
精确-召回权衡
要改进你的模型,你可以提高精度或召回率,但不能两者都提高。如果您试图减少非癌症患者被标记为癌症(FN/II 型)的病例,对被标记为非癌症的癌症患者不会产生直接影响。
这里有一个描绘同样权衡的图。
from sklearn.metrics import plot_precision_recall_curvedisp = plot_precision_recall_curve(clf, X, y)
disp.ax_.set_title('2-class Precision-Recall curve: '
'AP={0:0.2f}'.format(precision))
这种权衡对现实世界的场景有很大影响,因此这意味着仅仅依靠精确度和召回率并不是很好的衡量标准。这就是为什么你会看到许多公司报告和在线竞赛敦促提交指标是精确度和召回的结合。
f1-分数
F1 得分指标结合了精确度和召回率。事实上,F1-score 是两者的调和平均值。这两个公式本质上是:
现在,高 F1 分数象征着高精确度和高召回率。该算法在查准率和查全率之间取得了很好的平衡,在不平衡分类问题上取得了很好的效果。
F1 分数低(几乎)说明不了什么——它只能告诉你在某个阈值时的表现。低召回率意味着我们没有尽力在整个测试集的大部分上做得很好。低精度意味着,在我们确定为阳性的病例中,我们没有得到很多正确的结果。但是低 F1 没说是哪个。高 F1 可能意味着我们可能对大部分决策具有高精确度和高回忆性(这是信息性的)。F1 较低时,不清楚问题是什么(低精度还是低召回率?),无论模型遭受 I 型还是 II 型误差。
所以,F1 是噱头?不完全是,它已经被广泛使用,并被认为是一个很好的指标,可以收敛到一个决策(业务)中,但也不是没有一些调整。将 FPR(假阳性率)与 F1 一起使用将有助于抑制 I 型错误,并且您将了解在您的低 F1 分数背后的坏人。
对于第一组超参数:
# F1_score = 2*Precision*Recall/Precision+Recall
f1_score = 2*((precision*recall)/(precision+recall))
print('F1 score: %f' % f1_score)
如果你还记得我们在 set-I 参数中的得分,P=1,R=0.49。因此,通过使用这两个指标,我们得到了 0.66 的分数,这并没有给你什么类型的错误是显著的信息,但在推断模型的性能时仍然是有用的。
对于第二组超参数:
# F1_score = 2*Precision*Recall/Precision+Recall
f1_score = 2*((precision*recall)/(precision+recall))
print('F1 score: %f' % f1_score)
对于第二组参数,P=0.35,R=1。f1 分数排序再次总结了 P 和 r 之间的间断,但是低 F1 也不能告诉你存在哪个错误。
受话者工作特性范围
更好地称为 AUC-ROC 评分/曲线。它利用真阳性率(TPR)和假阳性率(FPR)。
- 直观上,TPR/召回对应于相对于所有阳性数据点被正确认为是阳性的阳性数据点的比例。换句话说,TPR 越高,我们错过的正面数据点就越少。
- 直观上,FPR/辐射对应于所有负数据点中被错误地认为是正的负数据点的比例。换句话说,FPR 越高,我们错误分类的负面数据点就越多。
为了将 FPR 和 TPR 合并成一个单一的指标,我们首先用许多不同的逻辑回归阈值来计算前两个指标,然后将它们绘制在一个单一的图表上。得到的曲线称为 ROC 曲线,我们考虑的度量是这条曲线的 AUC,我们称之为 AUROC。
from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score
from matplotlib import pyplotns_probs = [0 for _ in range(len(y))]
# predict probabilities
lr_probs = clf_1.predict_proba(X)
# keep probabilities for the positive outcome only
lr_probs = lr_probs[:, 1]# calculate scores
ns_auc = roc_auc_score(y, ns_probs)
lr_auc = roc_auc_score(y, lr_probs)# summarize scores
print('No Skill: ROC AUC=%.3f' % (ns_auc))
print('Logistic: ROC AUC=%.3f' % (lr_auc))# calculate roc curves
ns_fpr, ns_tpr, _ = roc_curve(y, ns_probs)
lr_fpr, lr_tpr, _ = roc_curve(y, lr_probs)# plot the roc curve for the model
pyplot.plot(ns_fpr, ns_tpr, linestyle='--', label='No Skill')
pyplot.plot(lr_fpr, lr_tpr, marker='.', label='Logistic')pyplot.xlabel('False Positive Rate')
pyplot.ylabel('True Positive Rate')pyplot.legend()
pyplot.show()
No Skill: ROC AUC=0.500
Logistic: ROC AUC=0.996
无技能分类器是一种不能区分类别的分类器,它在所有情况下都会预测随机类别或恒定类别。无技能线的变化是基于积极类和消极类的分布。它是一条水平线,带有数据集中阳性案例的比率值。对于平衡数据集,这是 0.5。
该面积等于随机选择的正面例子排名在随机选择的负面例子之上的概率(被认为正面的概率高于负面的概率)。因此,高 ROC 仅仅意味着随机选择的正面例子的概率确实是正面的。ROC 高也意味着你的算法在测试数据的排序方面做得很好,大多数负面情况在一个范围的一端,而正面情况在另一端。
当你的问题存在巨大的阶级不平衡时,ROC 曲线不是一个好的选择。其中的原因并不简单,但可以通过公式直观地看出,你可以在这里了解更多信息。在处理不平衡设置或使用焦点损失技术后,您仍然可以在这种情况下使用它们。
除了学术研究和不同分类器的比较之外,AUROC metric 没有找到其他位置。
还有,很多人在论坛上问过这个 F1 分数低但是 AUC 分数高的问题。
正如你现在已经猜到的,两者有不同的评估策略。对于特定的 ROC,您可以有一个 F1 分数范围(取决于阈值参数)。
每个有抱负的数据科学家需要了解的网络知识
Image: https://zipinternationalinc.ca/zip-international-importance-networking/
一个典型的数据科学职位发布可以吸引数十甚至数百份申请。因此,在申请过程中要克服的最重要的障碍通常是找到吸引公司注意的方法。
因此,求职不仅仅是技能的竞争:在很大程度上,这也是带宽的竞争。申请过程越早,竞争对手就越多,吸引眼球就越困难。
但是,当决策时刻到来时,您如何确保您的应用程序得到第二次检查呢?我可能会想到两个选择:
- 优化你的简历。
- 试着完全跳过简历筛选这一步。
老实说,我认为在这里讨论第一点没有多大价值。一些原因:
- 这是一个我在之前已经谈到过的话题,而且已经有很多很棒的“如何打造一份完美简历”的帖子了。
- 除非你的简历是一个真正的垃圾箱火,它是不可能优化很多,因为每个招聘人员都喜欢不同的格式,和不同的内容。
- 发送简历而不被邀请参加面试是一个零反馈的过程,所以如果你所做的只是一次又一次地把简历扔进空白,你就不会了解到你可以从每份申请中改进什么。
出于这些原因,我们在 SharpestMinds 非常重视战略 2。因此,在接下来的内容中,我将重点关注这一点:找到避开传统简历筛选过程的方法。
提示:答案是网络。
如何跳过这条线
极不相称的雇佣人数是由已经在一家公司工作的员工推荐的。因此,你最好的进入途径,十有八九是通过与在你的目标公司工作的人的关系,而不是普通的渠道,比如求职板(这不可避免地会导致可怕的简历筛选)。
关系很重要,因为它们会给你一个信号提升,但也让你更有可能在申请中得到反馈。即使你的申请被拒绝了,你也可以向你的联系人询问如何改进。
但是,如何与成熟的数据科学家建立有意义的关系呢?我们通过两种方式成功地做到了这一点:
1.通过聚会
毫无疑问,聚会是你获得入门级数据科学职位的最佳途径。但是你必须选择正确的。
最好的聚会有以下三个特征:
- 它们是技术性的,不适合新手(好公司不会出现在“数据科学入门”聚会上进行招聘)
- 他们经常重复,至少一个月一次(理想的是每周一次或更频繁)。这可以让你了解当地社区的人,让他们了解并认可你。
- 他们不是太大(超过 100 人定期参加),也不是太小(开始参加)。第一次去的时候,你不必与任何人交谈,但很快你就会想通过在演讲后提问,并努力与其他与会者聊天来让别人知道你的存在。随着时间的推移,这种活动会越来越多,让你成为所有 Meetup 参与者的熟悉面孔。
**为每次聚会设定具体的目标。**每次去的时候,争取和其他与会者进行至少 3 次实质性的对话,或者在演讲后强迫自己至少问一个问题。
- 一个伟大的、高影响力的活动是邀请 Meetup 组织者做一个演讲。这有助于提升你在社区中的形象,也迫使你在演讲前提升你的技术水平。
- 你可以在 LinkedIn 上添加你在 Meetup 上交谈过的任何人。如果你以这种方式将某人添加到你的网络中,并且他们是一个特别有前途的潜在客户(即,你们有相似的技术或行业兴趣,或者在数据科学社区有非常好的人脉),你可以请他们喝杯咖啡,谈谈他们的工作和经历。从这里开始,按照下面 LinkedIn 行动手册中的后续步骤进行操作。
- 2.通过 LinkedIn
- 好吧,这个很系统也很乏味。但这正是其他人不这么做的原因,也是为什么这是一种脱颖而出并给自己一个信号提升的好方法:
去 LinkedIn
在你的区域搜索“数据科学家”、“机器学习工程师”、“数据分析师”,或者任何最合适的搜索术语。
- 找到至少 20 个知名数据科学家的资料(拥有 6 个月以上的经验),他们似乎与你和有相似的技术兴趣,他们在目前正在招聘的公司工作(你可以查看他们公司的网站,看看是否是这样)。理想情况下,你应该与他们有更多的共同点,而不仅仅是你们都喜欢数据科学:NLP、大数据/数据工程、计算机视觉、金融等都是额外共同点的巨大来源。
- 向每个人发送一个连接请求,并附上以下消息的适当定制版本:
- 嗨[他们的名字],
- 我刚刚看了你的简介,发现你在[零售数据分析/房地产数据可视化等]方面的工作非常引人注目(这是我特别感兴趣的领域)。我很乐意连接!
谢谢,
[您的姓名]
大部分都不会连接。有些人会的。跟踪你的联系人(我推荐 Trello )。跟进那些接受您的连接请求的人:
嗨[他们的名字],
- 感谢连接!我真的很想更多地了解您在[公司名称]所做的工作。我希望在一个类似的领域工作,并且很乐意向你请教在这个领域工作的挑战。
[您的姓名]
如果他们回复了,而且看起来很开放,接着发第三条信息,问他们是否愿意一起喝杯咖啡[在离他们工作的地方近的地方!].
你可能会被多处咬伤。如果你这样做了,很好:分别与每个人建立关系。在每一个案例中,你的目标应该是尽可能多地了解他们在日常工作中面临的技术问题,这样你就可以确定作为一名员工,你是否有能力为他们的公司增加价值。如果你不这么认为,在试图利用你的新关系进入面试之前,集中精力提高你的技能。
- 如果你在与新关系的交谈中觉得你能够胜任他们与你讨论的角色,这是一个好迹象,你应该直接问他们——不要给他们压力——你是否是一个合适的人选。仔细听他们的回答:如果这不是申请邀请,你可以问(不要咄咄逼人)为什么你还不适合。
- 一个好办法是:“谢谢你澄清了这一点,对我来说,在我继续提高技能的时候,知道自己的位置是非常有帮助的。你认为我最需要改进的地方是什么,以便更好地定位自己,在未来担任类似的角色?”这里的目标是表现出对知识的渴望,而不是对工作的渴望。
- 如果事情进展顺利,询问你的新联系人,一旦你取得了更多的进展,他们是否愿意再次与你见面,并请求他们允许你在达到一些关键技能发展里程碑时随时更新他们的信息(但只有在你打算这样做的情况下:没有什么比承诺做某事但不坚持到底更糟糕的了)。
- 当你运用这些策略时,一个总的忠告是:要真诚,不要把你的新联系人当作垫脚石。他们慷慨地自愿成为你网络中的节点,你应该尊重他们。数据科学社区(以及更广泛的技术社区)已经形成了一种强大的“向前支付”精神,正是为了帮助有抱负的开发人员克服他们在试图进入该领域时所面临的高技术壁垒。
- 这是一件伟大的事情,我们应该彼此保持良好的氛围。
因此,适用于这些情况的最佳心态是,将你的联系人的时间视为对你的投资,并尽一切努力回报这种投资,并在你在 LinkedIn 上受到曾经顶替你的人冷遇的那一天支付这笔投资。
如果你想联系,你可以在 Twitter 上找到我,地址是 @ jeremiecharris!
So the best mindset to apply to these situations is to treat your contacts’ time as an investment in you, and to do everything you can to reward that investment and pay it forward the day you get a cold reach-out on LinkedIn by someone whose shoes you once filled.
If you want to connect, you can find me on Twitter at @jeremiecharris!
每个人都忘记了机器学习
机器学习的安全性
闪亮的新功能不是免费的
我们生活在疯狂的时代。我记得小时候看《星球大战》的时候,想知道要多久我们的厨房里才会有会说话的机器人。事实证明,时间并不长。事实上不到十年。
人工智能,更具体地说是机器学习,正在真正将科幻小说带入现实——没有其他方式可以表达。每当我翻阅 Tech Review 或 TechCrunch 时,我都会被我们现在可以“随意”做的事情震惊。
看穿墙壁?容易。从视频中猜测材料的物理属性?搞定。从键盘声音估计击键?小菜一碟。如何生成逼真的人脸、身体或诗歌?还是教机器画?还是一款星际争霸的游戏?
哦,你见过这些东西四处游荡吗?
疯狂。
现在,如果你真的去和从事 AI/ML 工作的人交谈,你可能会得到两种回答中的一种。要么他们对人工智能/人工智能能做什么感到兴奋不已,并正在研究下一个大的视觉/自然语言处理/强化学习问题——要么——他们对我们这些愚蠢的人类正在建造的东西感到绝对恐惧,并相信人工通用智能很快就会把人类变成一堆无用的回形针。在我看来,这就像当今社会的普遍分裂——50%的人认为人工智能是我们的未来,50%的人认为这是我们的灭亡。
关于人工智能和机器学习是什么,我想提供第三个——也许是更平凡的——视角:对手的新攻击面。
我们来探索一下。
新发明的阴阳两极
每当一项新发明问世,大多数人都会想到这项发明带来的令人惊叹的新功能。但是,哪里有光,哪里就有阴影,所以新的能力会不经意地与新的漏洞打包在一起,供黑客利用。他们确实剥削他们。
让我们上一堂历史课,重温一下 PC 市场。第一台个人电脑(Altair 8800)于 1975 年发布,随后在接下来的 10 年里进行了一系列创新,最终在 1984 年推出了现在看起来太熟悉的鼠标“苹果麦金塔”。随之而来的是持续了整个 20 世纪 90 年代和 21 世纪初的爆炸式采用浪潮:
Source: retrocomputing + wiki.
然而,大多数用户不知道的是,恶意软件或“恶意软件”市场正在发生类似的爆炸。
1989 年,罗伯特·莫里斯用 Unix sendmail 做实验,制造了一种自我复制的蠕虫病毒,并将其发送到互联网上。最初只是一个实验,最终变成了第一次 DoS 攻击,造成的损失估计在 100,000 美元到 10,000,000 美元之间,并使整个互联网慢了好几天(当然现在是不可想象的)。
随后是 1989 年第一次勒索病毒攻击,1996 年第一次 Linux 病毒(“Staog”),1998 年第一次 AOL 木马。
Malware stats source: av-test (through wiki).
后来,在移动领域也发生了同样的事情:2007 年的 iPhone 时刻,智能手机的采用出现了爆炸性增长:
Source: statista.
…随之而来的是移动恶意软件的爆炸式增长:
Malware stats source: av-test.
那么,机器学习呢?
尽管有各种议论,机器学习的产品化仍处于萌芽状态。许多真正前沿的工作仍然局限于研究实验室和大学——但即使看看研究,我们也可以开始看到一些相同的趋势出现。
按年份和地区统计的机器学习研究论文数量:
Source: arxiv.
……vs**“对抗性机器学习”** (ML 的恶意软件版本)研究论文数:
Source: arxiv.
所以事情来了。恐慌的时候到了?
安全事务
没那么快。好消息是,随着个人电脑接管了我们的日常生活,黑客们开始入侵,另一个市场也同时发展起来——安全解决方案市场。
第一个反病毒产品是由 Andreas Lüning 和 Kai Figge 在 1987 年为 Atari ST 平台开发的。同年,McAffee、NOD、流感疫苗和 Anti4us 都诞生了——在接下来的 20 年里,更多的产品也诞生了:
Companies source: wiki + news + crunchbase.
很快,风投们意识到网络安全的重要性,资本开始涌入:
…随后是数百万美元的收购:
随着移动恶意软件的快速增长,移动安全领域也出现了类似的爆炸式增长:
Companies source: wiki + news + crunchbase.
…安全费用:
…最终,安全收购:
- 移动安全初创公司 Mobilisafe 被 Rapid7 收购
- 苹果以 3.56 亿美元收购三星的安卓安全合作伙伴 AuthenTec
- AVG 以 2 . 2 亿美元收购移动安全公司 Location Labs
那么机器学习呢?
ML 需要安全吗?
在过去的某个时候,我曾为英国最大的金融科技公司之一 GoCardless 负责反欺诈和反洗钱。我的团队每年监管超过 100 亿美元的交易量,我们一直在努力将骗子排除在 GC 的循环系统之外。很自然——在某个时候,我们屈服于炒作,决定尝试机器学习。
令我当时感到惊讶的是,它居然有效。事实上,效果很好。我们摆脱了传统的启发式方法,成功地将欺诈造成的资金损失减少了 80%,并将可疑洗钱账户的检测率提高了 20 倍。
只有一个问题。
我们以我认为的“关键”能力部署机器学习。我们交给算法一项任务,不允许它失败——如果它失败了——我们要么损失一大笔钱,要么被吊销金融执照。对于我这个直接负责 GC 安全的产品经理来说——这两个听起来都不是特别令人兴奋。
所以我需要知道曼梯·里会在什么时候以什么方式失败。我们的模式如何被利用?它固有的弱点在哪里?我如何知道 GoCardless 是否受到攻击?
在花了太多的深夜阅读军情六处的文件并在暗网上搜寻之后,我终于找到了我一直在寻找的东西。我了解到 ML 上的中毒攻击,攻击者能够通过在训练期间注入损坏的数据来影响模型的思维。我发现了对立的例子,以及模型如何容易被测试时小心扰乱的输入误导。最后,我了解到隐私攻击以及底层数据和模型本身都没有那么隐私。
然后,我发现了这个…
Source: MIT tech review.
…我吓坏了。
到 2019 年底,1/3 的企业将部署机器学习。这是你、我、我们的朋友和爱人每天使用的所有产品的 1/3——完全暴露在任何对 ML 工作原理有一丁点了解的攻击者面前。
是的,机器学习需要安全。
婴儿第一步
ML 安全是一个非常新兴的领域,目前基本上还不存在。如果说我从上面的研究中学到了什么,那就是任何没有数学博士学位的人都很难弄清楚如何让他们的 ML 安全(今天实际上没有解决方案,只有大量数学研究论文)。
考虑到我们的生活中有多少要托付给算法——我认为这是我们的责任——你的,我的,以及整个 ML 社区的责任,以确保安全性不会被抛在脑后。正如我在关于逃避、中毒和隐私攻击的帖子中所解释的那样,我们今天可以做很多事情来构建更健壮的 ML 模型。但更重要的是,我们需要转变思维方式——从“不惜一切代价保证准确性”转向更平衡的准确性和稳健性方法:
Source. C1 and C2 are two models. C1 clearly starts off as less accurate, but as the attack strength increases, it also does a better job at withstanding it. Would you pick C1 or C2 as your ML model?
这篇文章和上面的文章是我朝着更强大的 ML 未来迈出的第一小步。如果你觉得它很有见地,一定要分享你的见解。
确保每个人的安全。
2020 年的大数据到底是什么?
在本文中,我们将分解“大数据”的组成部分,什么使大数据具有挑战性,以及目前如何解决这个问题。大数据通常被用作一个时髦词,但它本质上描述了三类数据:快速、大量和复杂。让我们浏览一下这些类别,浏览一下示例,看看如何使用最新的解决方案来应对这些挑战。
“大数据是一个术语,描述大量高速、复杂多变的数据,这些数据需要先进的技巧和技术来实现对信息的、存储、分发、、和分析。”( TechAmerica 基金会的联邦大数据委员会,2012 年)
快速数据
那么什么是快数据呢?快速数据是在短时间内大量产生的数据。例子包括来自汽车工厂的传感器、心脏监视器、飞行仪器等的数据…
快速数据通常被视为实时或半实时数据流。数据流本质上是在产生时发送给消费者的数据包(想象一下通过天线接收的电视信号或通过电话中的固定电话发送的语音呼叫)。实时数据的定义是一个更深入的话题,然而,它本质上归结为需要在毫秒内更新的数据。数据流面临许多挑战。其中包括能够在不丢失数据的情况下捕获数据,处理流中的重复记录,将流数据与更大的历史数据集集成,以及执行实时分析。
传统的流服务,如 Rabbit MQ 和 Active MQ,是在单独的服务器上运行的,因此受限于服务器的容量。Apache Kafka 引入了分布式流服务的概念,其中数据流可以在多个节点(商用服务器)之间拆分。这实现了高吞吐量的流处理,允许每秒处理数百万条消息。随着向云迁移的到来,开发人员不再需要管理底层硬件。亚马逊 Kinesis 和谷歌 Pub/Sub 完全抽象出流媒体服务背后的服务器,使开发人员只需专注于业务逻辑和数据。
为了对流数据执行实时分析,通常使用 ELK 栈(弹性搜索、日志存储、Kibana)。ELK stack 是一个工具组合,使用 Log Stash 将各种来源的数据传输到弹性搜索中。弹性搜索以一种方式存储数据,在这种方式下可以很容易地搜索到某些短语和关键字。Kibana 是一个位于弹性搜索之上的工具。它在数据流入时实时分析数据,并允许用户查询数据和围绕数据创建指标。
超大数据
“大数据”的第二个定义是数据足够大。
一个非常大的数据集的例子包括一家主要投资银行 20 年的股票交易历史,过去 20 年的所有信用卡交易,或者在一个非常受欢迎的网站(如 buzz feed)上的用户交互,等等…通常,这些数据的大小在万亿字节或千兆字节的范围内。
由于存储和处理数据需要计算资源,因此处理非常大的数据集非常具有挑战性。根据存储容量,典型的商用硬盘可以存储大约 1tb 的数据。其中一些数据集的大小为数 Pb(数千个硬盘)。要处理这些数据,需要将它们存储在一个数据中心内的多个服务器(或者传统的 RAID 存储驱动器)上。此外,处理数据需要大量的物理内存和 CPU 内核。
随着 Hadoop(一种用于处理数据的开源分布式大数据生态系统)的发布,大部分数据处理成本都降低了。这个系统的核心是 Hive,一个类似 SQL 的处理系统,允许像数据库一样存储数据。数据处理在本地商用硬件上执行,使用 Map-Reduce 算法(为分布式数据处理而编写)。这些服务器中有许多存储在企业数据中心。然而,管理数据中心和 Hadoop 生态系统需要大量的成本和维护。
最近,大部分存储和处理已经转移到云中,亚马逊网络服务(AWS)和谷歌云平台(GCP)是主要参与者。AWS 和 GCP 都提供受管 map-reduce/spark 解决方案——AWS 弹性 Map Reduce 和 GCP 云数据 proc。他们还拥有大规模可扩展的数据库,分别是 Google Big Query 和 AWS Redshift,它们在 Pb 级数据集上提供关系数据库功能。这些解决方案的最大优势是用户无需管理底层硬件,而是专注于最重要的任务,即存储/移动数据和编写 SQL。
这个生态系统中另一个值得注意的参与者是 Snowflake,它提供了一个基于 AWS 环境的预付费数据处理生态系统。
复杂数据
“大数据”的第三个方面是复杂数据。为了解释是什么让数据变得复杂,让我来描述一下理想的数据集是什么样子的。理想的数据集有一个定义好的模式,每个数据类型(字符串、数字、日期)都用一个主键和一个定义良好的数据字典来定义。该数据集中没有重复项,并且该数据集中的所有值都准确无误。
复杂数据代表的是与这一理想截然相反的数据。所有数据集都有一定程度的复杂性,但是,有些数据集处理起来本来就比较混乱。通常,这些复杂的数据集是非结构化的(不遵循行、列结构的数据),不断变化,并且很差或没有文档记录。
示例包括手动输入的表单,如医生的说明、来自博客帖子的书面文本、不断更新的 web 应用程序日志,以及深度嵌套的 XML 或 JSON 文件。
关于复杂数据的一个小提示是,大多数坏数据应该从源头上解决。数据工程师需要建立足够强大的系统来快速捕捉和过滤这些数据集,但是,数据最终应该由数据生产者进行校正。此外,建议尽可能与上游数据生产者达成定义明确的服务水平协议,以限制坏数据的数量,并使数据更易于管理。
解开复杂的数据集,并使它们符合一个结构化和干净的格式需要做大量的工作。每个数据质量问题都需要单独解决,例如重复记录、不存在的主键以及格式错误的字符和字符串。
有许多工具可以帮助理清这些数据。数据科学家和工程师通常使用 Jupyter 笔记本电脑和 Pandas 或 Spark 来处理、分析和可视化这些数据集。Jupyter notebook 为开发人员提供了一个交互式环境,他们可以在其中一行一行地遍历数据集并保存结果,最终节省了大量时间。Databricks 是另一个解决方案,它提供了一个现成的数据分析和处理环境,包括一个强大的 Jupyter 笔记本用户界面、专有的 Spark 功能和易于使用的节点管理功能。
还有第三方工具,如 Trifacta,它通过提供用户界面和现成的功能来自动化一些数据清理任务,并加快清理和分析工作,从而取代从头编写数据清理代码的需要。谷歌云有一个版本的云数据准备工具,作为 GCP 生态系统的一部分提供。
摘要
可以看出,这些挑战中的任何一类都很难解决。然而,大多数公司都在处理这三个问题的变种。这里的挑战变得更加巨大,因为人们必须权衡不同的工具和方法来解决他们的具体问题。
向云计算的转变大大降低了处理和管理大数据的障碍,因为公司不再需要数据中心和大量预算来购买专有软件。然而,很难雇佣到具备理解如何应用正确的工具来解决特定大数据问题的技能的人。
进一步降低使用大数据的障碍的下一步是应用机器学习来自动理解数据的结构并检测数据周围的变化。随着熟练人才成为大数据工作的瓶颈,未来 5-10 年内推出的下一代工具极有可能将围绕这一类别展开。
希望这篇文章为您提供了关于大数据的全面而简洁的概述!
Kubernetes 到底是什么?
我在 Azure Kubernetes 上部署了一个 web 应用程序,这是一个非常好的旅程,我想告诉你这个有趣世界的所有秘密。
我的 Kubernetes 路线图
自从我在 2015 年末发现 Docker 以来,我对部署可以像源代码一样处理的事实印象深刻。是的,我认为这就是容器填补的空白:制作源代码并提供同样的服务。当您在订单控制器上提交您的更改时,您可以提交托管订单控制器的新服务器。这是一场革命,想想开发人员手动上传文件到生产环境,或者幸运的话用 DevOps 工具移动文件。这开启了新的场景,其中基础架构也是由 DevOps 工具部署的。老实说,并不是所有的应用程序都需要一个点击一下就可以复制的基础设施。这是 Saas 软件的一个需求,但是对于大多数 simples 业务用例来说,这是一个昂贵的附加需求。然而,回到 Docker,仍然需要一些努力来部署和扩展它。我在开发、测试和生产环境中使用了它,不怪 docker。我喜欢它。但是,它需要转换开发人员在开发中使用容器的旧方式,以便在生产环境中获得精益流程的所有好处。我们这样做是为了让大多数开发人员在他们的 PC 上有 docker,可以运行容器或运行“docker-compose up”并使用服务器集群。
这太好了,许多在不同环境中开发的问题或开发人员的设置成本都被砍掉了。生产部署仍然完全由 DevOps 流程管理,那么还有什么呢?在我内心深处,我发现少了些什么。仍然有一些部分困扰着我…拉容器,运行容器,暴露体积,这很好,docker 本身给了我们解决方案,但我缺少一些东西。我不知道当时到底发生了什么,但可以肯定的是。后来有一天我发现了 Kubernetes。有效载荷是“生产级容器编制器”。我不记得当时是什么了,但是相信我……管弦乐队这个词打开了我的思路。我需要一些东西来编排容器,协调它们的工作:Kubernetes 是我所怀念的。自从我在生产环境中测试它之后,开发过程中的摩擦减少了,设置时间减少了,开发工作也减少了。
Kubernets is the revolution in containers!
什么是 Kubernetes
我已经非常肯定地谈到了容器。我希望所有这些容器都是运输和运行我们的应用程序的好方法。在生产环境中,我们也有许多要求,首先,您希望部署时不停机,或者在负载增加时不扩展。也许你会想,如果一个容器倒了,另一个会启动。把 Kubernetes 想象成一个弹性运行分布式系统的框架。它可以满足您的扩展需求、故障转移、部署模式等。
Kubernetes 提供的开箱即用功能:
- 服务发现和负载均衡: Kubernetes 提供了一个名为“ingress controller”的瑞士工具。它可以由不同的附加组件管理,但基本上,使用 DNS 或 IP 地址公开一个容器。这很酷,因为如果流量很高,Kubernetes 会平衡流量并进行分配。此外,这可以实现 HTTPS 到 HTTP 的机制,这样内部容器就可以用 HTTP 进行通信,而不必担心每个容器上的运输证书。如果你愿意的话,你也可以进行某种 URL 重写,将许多应用托管到一个域中,例如,你可以在 www.mysite.com 的使用 angular SPA,在 www.mysite.com/api/的使用 REST API app
- **存储协调:**如果您还记得 docker 卷的话,这个概念是相同的,但是有所改进。您可以将存储链接到 Kubernetes 集群,然后归咎于容器中的卷。非常酷的是,“存储”可能意味着本地驱动器是一种基于云的服务。
- **自动推出和回滚:**你可以通过在某个地方添加一些 YAML 文件来自动创建容器。你只需要描述你的平台如何伸缩以及你的容器如何相互作用。
- **自动装箱:**最终,Kubernetes 也需要物理资源来工作。这意味着您仍然需要 CPU、RAM 和磁盘来让容器工作。好消息是您可以指定每个容器的资源需求。这将有助于 Kubernetes 在扩展方面做出更好的决策。
- 自愈: Kubernetes 是容器保姆。他照顾一切。如果容器出现故障,它会尝试替换它。如果容器没有反应,它就杀了他,以此类推。
- 秘密和配置管理:【Kubernetes 非常好的一点是可以将配置从容器中分离出来。这有点像环境变量,但是更酷。每个配置都可以被全局管理,附加到一个或多个容器。此外,一些称为“秘密”的变量被加密以确保安全。这对于敏感信息非常有用,比如密码、认证令牌或 ssh 密钥。
Kubernetes 不是什么
Kubernetes 是很多好东西,我希望已经明确揭露所有 Kubernetes 的好处。Kubernetes newbie 的主要问题是,他们发现这并不像他们想象的那样是一个 PaaS(平台即服务)系统。Kubernetes 是很多东西,但不是一个“全包”服务。它很棒,减少了工作量,特别是在系统管理员方面,但是除了基础设施之外,它没有为您提供任何东西。
他说,您在完全托管的系统中寻找的大部分东西都在那里:简化的部署、扩展、负载平衡、日志记录和监控。通常,你会从你的主机上得到一个标准配置,但是如果你真的需要的话,理论上你可以自定义它。
Kubernetes 的局限性:
- 它不限制支持的应用程序类型。所有的东西都被写入容器中,所以每个容器应用程序,无论在技术上,都可以运行。与之相对应的是,您仍然需要手工定义容器。
- *它不提供自动化部署。*您只需将构建的图像推送到 docker 存储库中,仅此而已。如果您已经在持续集成、交付和部署(CI/CD)的过程中工作,这是非常容易的,但是考虑到没有它将是非常棘手的。
- 它不提供任何应用级服务,只提供基础设施。如果你需要一个数据库,你必须购买一个服务或者在一个专用的容器中运行它。当然,负责备份等等。
- 大多数与系统的交互都是通过包装 API 的命令行进行的。这非常好,因为它允许自动化每个设置。命令的语法非常简单,但是,如果您正在寻找一个完全由 UI 管理的系统,那么您正在寻找最糟糕的地方。
Kubernetes 如何工作
让我们开始对技术部分进行更深入的研究。现在不是全面概述组件的时候,我也不想吹毛求疵。我的目的是描述最重要的组成部分,并弄清楚所有这些将在本文的后续部分中出现。当然,如果你打算自学 Kubernetes,开始知道你在哪里是一个很大的优势。
吊舱
将 Pod 视为容器的高级抽象。在这个抽象中,pod 可以是一个单独的容器实例或一个组。Pod 由一个或多个容器组成,这些容器共享资源并位于主机上。每个 pod 都分配有一个唯一的 IP 地址,这意味着一个 pod 可以像 docker 环境中的传统容器一样相互通信。pod 内的每个容器可以到达虚拟网络中的所有其他 pod,但是不能深入到其他 pod 上的其他容器。这对保证 pod 抽象很重要:没有人必须知道 pod 在内部是如何组成的。此外,分配的 IP 是易变的,因此您必须始终使用服务名(直接解析到正确的 IP)。像 Docker 容器一样,POD 可以定义可以与共享网络驱动器进行比较的卷。这对于保存数据或在 pod 之间共享文件很有用。
您可以使用 API 或者只是在 shell 上点击命令来管理 pods。
服务
信息学中的“服务”这个名称被滥用了。在 Kubernetes scope 中,把服务想象成你想提供的东西。Kubernetes 服务涉及一组 Pod,可能提供复杂的功能,或者只是用一个容器公开一个 Pod。因此,您可以拥有一个提供 CMS 功能的服务,其中包含数据库和 web 服务器,或者两个不同的服务,一个用于数据库,一个用于 web 服务器。这取决于你。
入口控制器
服务是您可以对外公开的组件。为此,有一个入口控制器做一些类似于负载平衡器的事情。它实际上将来自外部的流量转发给服务。在此步骤中,根据您选择的入口实施,您可以添加 HTTPS 加密,根据主机名或 URL 段路由流量。唯一的服务可以链接到入口控制器,而不是 pod。
卷
默认情况下,Pod 存储是不稳定的。知道这一点很重要,因为在第一次重启时,你会失去一切。Kubernetes 卷允许将容器硬盘的某个部分映射到一个安全的地方。该空间可以在容器之间共享。装载点可以是容器的任何部分,但是一个卷不能装载到另一个卷中。
命名空间
把名称空间想象成使 Kubernetes 成为多租户的特性。名称空间是租户级别的。每个名称空间可以划分资源以隔离服务、入口和许多其他东西。这个特性有助于在应用程序之间进行强有力分离,安全地委托给不同的团队,并在单个基础设施中拥有独立的环境。
秘密和配置
可以通过配置图进行全局配置。这种机制以这种方式工作。首先,您有一个或多个配置清单,然后您将容器的环境变量链接到全局变量。好处显而易见。如果一个变量改变了,你只需要改变它一次。而且对于一些敏感信息,有一个很酷的机制叫做“秘密”。Secrets 变量加密存储在系统中,任何人都无法访问。秘密只被送到需要它的舱里
Kubernetes 即服务
作为每个非系统管理员,我讨厌戴上系统管理员的帽子。或者更好…一切都很有趣,直到事情打破。也许我反应过度了,或者这只是嫉妒,但有一点是神圣的不要做别人的工作。现在有这么多的服务给你免费的 Kubernetes,不使用它是如此愚蠢,我不想谈论它。我们说的不是手工制作的果酱,而是软件。如果可以的话,就从更好的玩家那里买。谷歌、亚马逊、微软、IBM……它们都有自己的 Kubernetes 服务,并且都采用相同的定价模式:来找我吧,所有的 Kubernetes 服务都是免费的,你只需为你要使用的资源付费。许多供应商给你一个免费层或信用试用期,所以很容易开始玩它。我选择 Azure 撰写本文是因为在源代码集成过程中有一些便利,但是您将在本系列文章中学到的大部分内容将适用于所有内容。Kubernetes 即服务的另一个伟大概念是,这不需要您的应用程序与云耦合。由于你的应用程序只是一个原始容器,并且这是由一些符合 Kubernetes 的配置文件编排的,你将能够轻松地从 azure 迁移到 google,反之亦然(至少不需要改变源代码)。
因此,Kubernetes 服务是免费的,你只需为它支付硬件费用,这里的“硬件”指的是 Kubernetes 使用的虚拟机。
带什么回家
Kubernetes 是一个非常棒的平台,可以安全地退出传统的虚拟机保护,转向云。它带来了活力,降低了系统管理员的成本,并提高了服务的质量水平,这是很难保证的。许多传统问题,如网络和数据保护,都可以通过 Kubernetes 本身的高级配置来解决。
我不能说 Kubernetes 适合你所有的项目,但是相信我,如果我告诉你你必须考虑你所有新项目的选择。
准备好下一步了吗?刚刚阅读了如何在实践中使用 Kubernetes 部署 web 应用程序!
觉得这篇文章有用?在 Medium 上关注我(丹尼尔·丰塔尼),看看我下面最受欢迎的文章!请👏这篇文章分享一下吧!
学术人工智能研究人员遵循 AlphaStar 的是什么?
DeepMind 继续取得进展,但学术界人工智能研究人员的前进道路尚不明朗。
十年前,我向全球人工智能研究人员发出挑战,要他们为《星际争霸 1》打造一个专业级机器人。育雏战争 API 最近发布,学者和专业人士首次可以在竞争激烈的 RTS 游戏上测试人工智能系统。在接下来的几年里,一些人工智能比赛举行了,虽然机器人开始进入更高的等级,但要达到专业水平的游戏还有很大的差距。当 DeepMind 宣布我们将在 2016 年推出星际争霸 2 时,我预计将需要几年的时间来改进现有的方法,并达到专业水平的游戏性。但我错了,AlphaStar 上周展示了深度强化学习可以用来训练一个与职业游戏玩家竞争的机器人。
虽然许多人对比赛的限制表示担忧,神族在一张地图上镜像比赛有很高的 APM 限制,但我预计 AlphaStar 可以通过额外的训练克服这些限制。也有人担心 AlphaStar 是在与一名职业选手而不是星际争霸的大师竞争。无论这种批评是否成立,AlphaStar 能够击败专业水平的玩家这一点仍然成立。鉴于演示的强大效果,我认为星际争霸是一个已经解决的问题,并建议我们转向新的人工智能挑战。
但对人工智能研究人员来说,尤其是在学术界,最大的问题是我们如何在 AlphaStar 展示的进展基础上继续发展?首先,大多数学术研究人员不会获得 DeepMind 可以获得的资源类型:
- 大规模计算: DeepMind 利用一个 TPU 农场来训练 AlphaStar 玩上百年的游戏。同样,OpenAI 在为 Dota 2 构建 OpenAI Five 时也使用了大量计算资源。
- **开放 API:**deep mind 团队可以接触到暴雪的工程师,确保 API 按预期运行,而 BWAPI 由于被逆向工程而出现问题。
- 训练数据集: DeepMind 能够在职业选手的匿名回放上进行训练,以引导学习过程。
我之前写了关于 OpenAI Five 与专业人士竞争时的这些限制,尽管 DeepMind 在第二和第三点上有了显著改善,但事实仍然是学术界在资源方面有巨大的劣势。另一个问题是缺乏可用于建设 AlphaStar 进展的材料。例如,直到其他研究人员可以测试他们的机器人与这个系统。
AlphaStar 对人工智能来说是一个巨大的进步,但对于希望致力于大型公开挑战的人工智能研究人员来说,在这些类型的问题上取得进展的最佳机会是离开学术界,加入 DeepMind 或 OpenAI 等公司。短期内这可能不是太大的问题,但它确实为建立长期的人工智能人才管道制造了一个问题。
对于学术界的 AI 研究人员来说,我们需要重新思考我们可以取得进展的问题类型。如果问题可以通过投入大量计算资源来解决,那么对 AI 基准进行增量改进就不再可行。以下是我对从事游戏人工智能研究的学术界人工智能研究人员的建议:
- 确定较小规模的问题:我把星际争霸作为一项重大的人工智能挑战,因为它有太多的人工智能系统需要解决的问题。虽然这些类型的问题可能是获得资金的有用环境,但较小的挑战也可以取得进展。例如,King 一直在使用深度学习为 Match 3 游戏执行自动化游戏测试,这比《星际争霸》容易控制得多。
- **构建可复制的人工智能:**为了鼓励增量研究,为已发表的论文发布源代码和数据集是很有用的。我采用了这种方法,并为构建顺序预测发布了一个数据集,但没有发布代码。我后来复制了这个作品,写了关于这个过程。
- 为了评估人工智能系统的性能,经常与人类对手进行测试是很有用的。这是我在论文项目中采用的一种方法,我进行了一项消融研究,其中不同的推理组件被禁用,生成的机器人与人类进行了对比测试,如下图所示。如有必要,确保获得 IRB 的批准。
- **探索用更少的计算进行学习:**强化学习的一个问题是学习策略所需的培训量。研究人员可以在不使用大量计算资源的情况下在这一领域取得潜在进展。
- **重温迁移学习:**早期 RTS 研究探索的方法之一是迁移学习,有 TIELT 等系统。鉴于训练网络需要大量计算,迁移学习似乎是研究人员取得进展的一个好领域。
学术界仍然需要探索重大的人工智能挑战,但解决方案可能来自私营公司。
Testing my bot versus human opponents on ICCup.
我发现 AlphaStar 最吸引人的一点是,随着越来越多的计算投入到问题中,它会继续学习。这并不是说问题很容易,而是说 DeepMind 构建的系统很新颖,并且可以通过额外的经验继续学习,这对 AI 来说是一个巨大的进步。DeepMind 无法解决星际争霸仅仅是因为资源,而是通过巧妙的设计和大规模的计算。我之前在的博客中谈到了 DeepMind 必须克服的一些挑战,其中许多问题似乎都由 AlphaStar 解决:
- 战争迷雾: AlphaStar 执行类似于职业玩家的侦察行为,不断与对手交战以获取情报。然而,由于 AlphaStar 专注于跟踪者的构建,尚不清楚该机器人是否对对手的构建顺序进行正向推理。
- **决策复杂性:**从演示视频中还不清楚 AlphaStar 如何将建造顺序决策从微观管理中分离出来,但看起来机器人在决定下一步建造哪个单元或结构时会使用尽可能多的信息。AlphaStar 已经通过构建推理系统解决了这个问题,该系统可以很好地处理星际争霸问题空间的分解。
- 观看演示时需要了解的一件很酷的事情是,AlphaStar 正在对不同的机器人联盟进行训练,这些机器人不断尝试新的策略。这种方法应该有助于游戏中的小变化,但当新地图引入机器人时,可能不会翻译得很好。
- **奶酪:**机器人侦察得很好,并在最初的比赛中派出额外的工人调查侦察单位,这表明机器人可能已经学会适应早期的冲刺策略。然而,奶酪往往是地图特定的,不清楚 AlphaStar 将如何概括。
- **模拟环境:**我的一个假设是,AlphaStar 必须进行正向建模,才能在专业水平上玩游戏,但目前还不清楚机器人是否做了任何明确的规划。这对于职业比赛的目标来说并不是必须的,但我认为这是一个先决条件。
- 实时: AlphaStar 似乎对游戏性有很好的分解,当意味着一旦进行训练,在任何给定时间采取的行动都不会占用大量资源。
所有这些训练的结果是一个给对手施加很大压力的机器人,并且在整场比赛中表现出不同的策略。但是有一个批评仍然存在,那就是 AlphaStar 正在以一种人类不可能的方式开发单位(潜行者)。这与第一届星际争霸 AI 比赛的结果类似,伯克利的 Overmind 以一种新颖的方式使用了飞龙。虽然当目标是通过图灵测试时,这是一个有效的批评,但这不是我为星际争霸 AI 设定的目标,我希望 DeepMind 正在进行的工作能够超越这一策略。
AlphaStar 是 RTS AI 向前迈出的一大步,我很高兴看到今年暴雪展示了什么。然而,对于学术人工智能研究人员来说,这是人工智能需要巨大计算才能进步的另一个证明。我的建议是探索可以取得进展的较小问题,并在扩大规模之前展示学习和转移学习。
本·韦伯是 Zynga 的首席数据科学家。我们正在招聘!这篇文章是基于我在学术界的经验,不代表 Zynga
你应该使用什么形式的交叉验证?
优化和机器学习
优化样本外预测误差的正确代理
Photo by Josh Calabrese on Unsplash
C 通过对整个数据集的样本外预测误差进行平均,我们希望交叉验证误差可以作为模型在未知测试数据上表现的代理。如果它作为一个准确的代理,那么我们可以使用交叉验证作为指导来调整模型,以便在一般情况下实现更好的性能。
K 重交叉验证将数据集随机划分为 K 个不重叠的子集。模型被训练 k 次,每个子集依次被排除并用作样本外测试数据。对于较小的 k 值,k 倍的计算成本可能较低,但它具有不吸引人的特性,即它将随机性引入交叉验证结果。
留一交叉验证 (LOOCV)是一种 k 折形式,其中 k 等于数据集的大小。与常规 k-fold 相比,LOOCV 结果没有随机性,因为每个数据点总是被划分到自己的子集。虽然在一般情况下这可能很昂贵,需要模型适合数据集中的每个点,但对于某些模型,如岭回归,LOOCV 可以有效地计算和优化,以找到最佳的模型参数。
如果可行,LOOCV 应优先于其他形式的 k 倍;但是它仍然有一些不理想的特性。让 X 和 y 代表数据集的 n×p 特征矩阵和目标值。如果 Q 是一个 n×n正交矩阵,则放
假设我们用岭回归模型来拟合数据集。如果 b 代表模型的回归变量,那么 b 在旋转回归问题上的误差与在原始问题上的误差相同
因此,回归问题**X’,y’**和 X,y 之间是等价的,然而 LOOCV 对于旋转不是不变的。
此外,当一个特征的方差只集中在几个数据点时,LOOCV 的表现尤其差。在最极端的情况下,假设
当排除第 I 个数据向量(i ≤ p)时,剩余数据集中没有方差来拟合第 I 个回归系数,因此 LOOCV 为
并且独立于正则化矩阵。
广义交叉验证
广义交叉验证(GCV)背后的思想是修改 100c v,以便它是在原始回归问题的旋转上计算的,其中旋转矩阵是以非常特殊的方式选择的,以便 1) GCV 对于原始回归问题的旋转是不变的,以及 2)特征向量的方差在变换矩阵**x’**⁴.上均匀地“展开”
设 U 、 S 、 V 代表 X 的奇异值分解
其中 S 为矩形对角矩阵 U 和 V 为正交矩阵。让 W 代表一个酉矩阵 (GCV 使用复数旋转)。放
设X′,**y′**表示这个矩阵的旋转回归问题。然后
现在,准备
W 的列是 n×n个循环矩阵的公共特征向量,因此对于任意对角矩阵 D
是一个循环矩阵,其形式为
因此,
是对角线上有常数的循环矩阵。另外,对于**x′的任意一行,它与x′**的其他行的协方差由相同的移位 vector⁵.表示
计算 GCV
设γ表示岭回归的正则化矩阵。那么回归问题 X , y 的 LOOCV 可以用 equation⁶有效地计算
在哪里
相同的等式可以用于旋转回归问题**X’,y’来计算 GCV,只是我们需要考虑到X’,y’**是复数值的事实。那么,GCV 方程就变成了
在哪里
(注意: A 和 b̂ 对于旋转是不变的,因此它们保持不变)
我们还可以对 LOOCV 的导数方程进行同样的修改,以计算 GCV 导数,这使得应用优化器来最小化关于γ的 GCV 成为可能。
一个特例
假设我们用单个变量来参数化我们的正则化矩阵γ
那么**h′**就是的对角线
和
现在,因为
是一个对角矩阵,由此可见
是循环矩阵。因此,**h′**是一个常数值向量,等于
或者,由于轨迹对于旋转是不变的,
将其代入 LOOCV 方程,并利用旋转回归问题具有相同误差平方和的特性,单变量正则化的 GCV 为
这是 GCV 最常见的表现形式。但是注意:对于由多个变量参数化的γ的一般情况,这个简化的方程不会计算出正确的 value⁷.
现实世界的问题
我们将在一个示例问题上比较设置正则化参数的不同方法的性能。数据取自 1974 年美国杂志《汽车趋势》,任务是从其他给定的属性预测车辆的燃油效率。我们将在数据的留一交叉验证中比较以下模型:
- 最小二乘回归
- RR-LOOCV-1: 通过二阶优化器设置单个正则化参数的岭回归,以最小化训练数据上的 LOOCV 误差。
- RR-LOOCV-p: 与 RR-LOOCV-1 相同,但对于每个主分量具有单独的正则化参数。
- RR-GCV-1: 通过二阶优化器设置单个正则化参数的岭回归,以最小化训练数据上的 GCV 误差。
- RR-GCV-p: 与 RR-GCV-1 相同,但对每个主成分使用单独的正则化参数。
注意:在这个实验中有两个水平的交叉验证。在最高层,我们为每个数据点形成一对训练数据和测试数据来训练模型;在较低层次,岭回归模型对训练数据执行另一个交叉验证,以设置它们的正则化参数。
下表显示了从 best 到 worse⁸.订购的每个型号的 LOOCV 的均方根误差(RMSE)
结论
岭回归是机器学习中最常用的模型之一。通过正确的正则化矩阵,它经常优于最小二乘法。使用优化器,我们可以设置正则化参数来最大化某些形式的交叉验证的性能;但是为了获得良好的样本外性能,我们需要使用交叉验证作为样本外预测误差的准确代理。我们看到了 LOOCV 在某些情况下会有问题,并且有一个不受欢迎的特性,就是它对旋转很敏感。我们引入 GCV 作为旋转不变的替代方案,并通过展开特征矩阵的方差来处理 LOOCV 的问题情况。我们比较了不同岭回归模型在一个示例问题上的表现,发现 GCV 给出了最好的结果。
要找到优化留一交叉验证或广义交叉验证的正则化参数,请查看building block . ai。
脚注
[1]:参见如何更好地进行岭回归,了解如何将优化器与 LOOCV 一起使用以找到正则化参数的详细信息。
[2]:请参见https://github . com/rn burn/ridge-regression-doc/blob/master/notebooks/loo cv-rotations . ipynb了解 loocv 如何对旋转敏感的示例。
[3]:GCV 作为 LOOCV 在旋转回归问题上的问题案例和表述摘自
Golub G .、Heath M .和 Wahba G .,广义交叉验证作为选择良好岭参数的方法 (1979 年),《技术计量学》,第 21 卷,第 2 期
[4]:为了使“分散方差”的概念更精确,让 K 表示数据向量的协方差矩阵
其中我们假设 X 的列居中,p 是特征向量的长度。注意到 K 的 Frobenius 范数对于 X 的旋转是不变的;并且在 GCV 旋转之后,协方差矩阵**K′**是循环的,因此每一列对 Frobenius 范数的贡献相等。
[5]:https://github . com/rn burn/ridge-regression-doc/blob/master/notebooks/gcv-rotation . ipynb验证 GCV 旋转矩阵是否循环
[6]:参见如何更好地做岭回归高效 LOOCV 方程的推导
[7]:参见https://github . com/rn burn/ridge-regression-doc/blob/master/notebooks/gcv-formulas . ipynb单变量 GCV 方程的验证
[8]:完整实验可在https://github . com/rn burn/ridge-regression-doc/blob/master/notebooks/motor-trends-regression . ipynb获得
上升的必然下降
回归均值的意义
Photo by JC Dela Cuesta on Unsplash
1933 年,统计学家 Horace Secrist 出版了一本名为《商业平庸的胜利》的书,他在书中大胆地提出:随着时间的推移,市场竞争导致表现最好的企业变得更差,表现最差的企业变得更好,从而导致平庸的“胜利”。用他自己的话说,
在竞争激烈的商业行为中,平庸往往占上风。[……]这就是工业(贸易)自由带来的代价。
然而,他的结论存在严重缺陷。让我解释一下。
平庸胜利的幻觉
首先,赛克里斯特查看了哪些特定数据?自 20 世纪初以来,他跟踪了数百家企业的收入和支出等绩效指标。例如,他在 1916 年编制了一份 120 家服装店的名单,根据销售额与费用的比率对它们进行排名,并将名单分为六组,最上面的一组代表最好的商店,最下面的一组代表最差的商店。他期望看到的是,随着时间的推移,顶层群体的商店会变得更加成功,反之亦然。
然而,他发现了相反的情况:顶级公司的排名总是会下降,而在接下来的几年里,垫底公司的排名会上升。他在他观察的所有行业中都发现了这种模式。塞克里斯特用市场竞争解释了这种模式:公司会向行业中的佼佼者看齐,并致力于超越他们或窃取他们的一些市场份额,导致第二年表现更差。
听起来合理吗?嗯,这是他推理中的缺陷。塞克里斯特成了我们今天所说的回归谬误的受害者。他观察到的不是竞争性市场力量的结果,而是真正的统计效应,即回归均值。
回归平均值
尽管名为回归均值,但它实际上是一种选择效应。这里有一个非常简单的例子。考虑 600 个人扔骰子。其中大约 100 人可能会投 6 分。现在让每个人第二次掷骰子,会发生什么?当然,被选中的 100 个最初的 6 投掷者中的绝大多数现在将投掷一个小于 6 的数字,仅仅是因为它更有可能(即 5 倍的可能性)。你会怀疑是某种神秘的力量导致最初的 6 掷者在第二轮失去了他们的骰子“技能”吗?当然不是。
回到赛克里斯特的企业清单。在他的排名列表中,排名最高的企业是那些投了 6 分的企业:他们做得非常好,部分是因为技能,部分是因为运气。就像掷骰子的人一样,如果大多数顶级企业在接下来的一年里表现得更加温和,我们也不应该感到惊讶。
第一个指出赛克里斯特的错误结论的是数学统计学家哈罗德·霍特林,他指出回归均值可以完全解释结果。用霍特林的话说,
“这本书的主题,如果解释正确,基本上是微不足道的。”
哎哟。霍特林说得更直白,他说塞克里斯特的工作类似于通过将大象排成行和列来“证明”数学乘法规则,然后对各种动物重复同样的练习。
Psychologist and winner of the Nobel Price in Economics, Daniel Kahneman (source)
表扬还是指责?
心理学家丹尼尔·卡内曼讲述了一个故事,当他试图教一群来自以色列空军的飞行教官时,表扬比责备更能有效地促进学习。一名教官不同意这种说法:根据他的经验,表现特别好并随后受到表扬的飞行学员第二次表现更差,而表现特别差并随后受到责备的学员第二次表现更好。对他来说,这证明了责备比表扬更能促进学习。
卡尼曼意识到导师的结论是有缺陷的,因为忽略了回归均值。用他自己的话说,
这是一个欢乐的时刻,在这个时刻,我明白了一个关于世界的重要真理:因为我们倾向于在别人做得好的时候奖励他们,在别人做得不好的时候惩罚他们,而且因为存在回归均值的现象,这是人类条件的一部分,我们因为奖励别人而受到统计上的惩罚,因为惩罚别人而受到奖励。
此处的要点是,预计下一次出色的(积极的或消极的)表现很可能会带来更温和的表现。这是一个数学事实。然而,人类渴望知道事情发生的原因,一种叙事,比如飞行教练的叙事,责备有效,表扬无效。
在《T4 思考,快与慢》一书中,卡尼曼认为我们人类有两种不同的思考“系统”:快速、直觉、类似动物的系统 1 和缓慢、深思熟虑的认知系统 2。记叙文,如飞行教员的表扬/责备解释,是系统 1 处理信息的结果。另一方面,在结果中识别回归平均值需要更为深思熟虑的系统 2。
吓得直哆嗦
这是回归谬误的另一个例子。这个由美国首创并被世界其他国家采用的项目让少年犯参观监狱,在那里他们见到了囚犯,囚犯告诉他们如果他们不停止犯罪行为,将会面临怎样的监狱生活。它受到了政策制定者和家长的高度赞扬,也是 1978 年阿诺德·夏皮罗导演的纪录片的主题。
但是这个项目成功了吗?看起来确实如此:新奥尔良的一个代表性项目发现,在参加了“惊吓直道”后,参与者因犯罪而被捕的次数比以前减少了一半。
Footage from a TV show around the Scared Straight program (source)
但是,再一次,想想回归均值。当然,如果你找一群少年犯,你是在选择社区中表现最差的孩子的样本。这些孩子明年可能会表现得更好一点(或者被抓到的机会少一点),这完全是偶然的。
考虑到回归到平均值所造成的影响,对这个项目进行有意义的评估的唯一方法是随机试验,在这个试验中,你将参加过“恐惧直男”项目的少年儿童与没有参加的少年儿童进行比较。1978 年 4 月,罗格斯刑事司法学院的詹姆斯·芬克诺尔教授是第一个进行这种 T4 研究的人。基于这些数据,他得出结论说,事实上,参加这个项目的孩子比那些没有参加的孩子将来更有可能犯罪。《直吓》的效果与它为设计的效果正好相反。
2000 年,Anthony Petrosino 和他的合作者发表了一份对大量对照研究的荟萃分析,都指向同一个方向。害怕直道根本不起作用。Petrosino 强调了在没有随机试验的情况下评估此类项目的危险性。
再一次,想想卡尼曼的两个系统:“少年儿童如果参观真正的监狱,他们会感到害怕,因此他们会表现得很好”是一个很好的叙事,我们的系统 1 喜欢叙事。它需要更具分析性的系统 2 来实际查看数据并发现真相。这个叙述结果证明是一派胡言。
结论:哪里有随机性,哪里就有回归均值
生活中有些事情,比如象棋,本来就是确定性的,胜负直接反映了一个棋手的技术水平。然而,生活中的大多数事情不像国际象棋,它们包含确定性成分(技能)和随机成分:商业表现、考试分数、逮捕率、心脏健康、运动队的成功或书籍销售都是一些例子。
每当一件事情有随机成分时,它就会向均值回归,这可能会在我们没有意识到的情况下愚弄我们。出色的表现很可能会伴随着更一般的表现,但我们的自动系统 1 总是会很快找到一个简单的故事来解释这种模式。这就是回归谬误。意识到这一点——用你的系统思考 2。
参考
- 乔丹·艾伦伯格,如何不犯错:数学思维的力量
- 丹尼尔·卡内曼,思考,快与慢
在我的个人资料页面上找到更多我的故事,例如:
圣经代码、投资基金、彩票和“看别处”效应的诅咒
towardsdatascience.com](/the-statistics-of-the-improbable-cec9a754e0ff) [## 如何少犯错误
用有限数据预测未来的贝叶斯指南
towardsdatascience.com](/how-to-be-less-wrong-5d6632a08f)
谷歌和 Salesforce 分别收购 Looker 和 Tableau 软件对首席信息官来说意味着什么
BI 分析工具领域正在整合,以与微软的业务分析(BA)产品进行竞争,该产品承诺解决整个工作流-数据生成、数据捕获、数据存储、按角色分层的数据访问和数据可视化。为什么?因为数据是新的货币。能够从数据中获利的组织仍将是各自行业的领导者。对相关数据的访问越快,业务决策者的反应就越快,从而推动用户参与、减少用户流失,并构建持续令人愉悦的无与伦比的产品功能。
随着谷歌上周宣布以 26 亿美元收购 Looker,以及 Salesforce 今天宣布以 153 亿美元收购 Tableau Software,一种新的“一站式商业分析工具套件”趋势正在形成。这两家各自的科技巨头都有可能创建一站式云产品,解决从数据生成到数据访问和可视化的整个数据工作流,以与微软的 Azure 和 PowerBI 工作流竞争。而且,还不止于此。我完全期待这三家公司继续开发人工智能和 NLP 驱动的——“问我任何问题,我都会给你一个图表/答案”功能,这将使公民分析师更容易使用数据。
然而,建立像 Capital One 或 Airbnb 那样的数据文化,让每个员工都能“思考数据”和“行动数据”,需要的不仅仅是数据的成熟度。构建数据文化要求下面列出的所有 4 D 都保持一致。
1.**数据成熟度:**微软的 Azure to Power BI 工作流以及对谷歌和 SalesForce 的收购专注于提供数据成熟度——对单一真实来源的简单、快速、可扩展、用户级访问。
2.数据素养: Tableau、PowerBI 和所有领先的商业分析工具都有一个问题。这是一个低采用率——定义为得到有意义使用的席位/许可证的百分比。对于大多数顶级业务分析工具来说,这一比例在 20–30%之间,即 70–80%的许可证未得到利用或利用不足。你能相信吗?
顺便说一下,我们在这里谈论的工具非常容易使用,具有直观的拖放功能以及“问我一个问题”功能。尽管几乎所有的工具推广都是在工具培训之后进行的,但采用率仍然很低。你知道为什么 BA 工具使用率低吗?
在我与大型成熟组织一起为他们开发数据 DNA 的 7 年多的工作中,我们反复发现低数据素养是低工具采用率的关键驱动因素。数据素养是指读取和使用数据得出有意义的结论以做出决策的能力。许多领导人可能会忍不住在这里过早地说——“哦,我可以提高识字率,让我们给人们一些图表和图形方面的培训。”我见过这种方法失败的例子,即使在与顶尖大学建立战略合作关系,然后推出所有人的必修课(这是“所有人”都讨厌的)之后,公司也没有改变他们的数据素养指数。我自己也是这股潮流的一部分。在早期,我们在为我们的合作伙伴组织建立数据文化方面失败得很惨,但幸运的是,我们很快学会了将这些失败转化为经验,现在我们能够为我们的客户推动成功和转型。我将很快分享我们的经验。
3.**数据驱动型领导:**与任何其他企业范围的战略计划一样,发展数据文化始于数据驱动型领导。诚然,当我们从任何组织开始时,并非所有的领导者都处于同一水平,但是,当我们完成时,大多数领导者都相信使用数据来推动决策的力量(因为他们已经看到了由数据扫盲计划推动的关键指标的巨大变化),并愿意以身作则-让他们的团队负责,零基础预算,遵循决策制定流程而不是基于“因为我知道”的决策,等等。
4.**决策流程:**最后,一个成功的数据文化需要一个数据驱动的决策流程,通过数字进行规划、行动和执行、衡量和纠正过程,并回头评估和决定下一组行动。
总之,以下是我对首席信息官在各自组织中推动数据文化的一些建议。
a.数据素养需要分层解决方案 —即不同的工作角色需要不同的数据素养水平。例如,客户支持代理可能只需要成为“数据爱好者”,而索赔分析师则需要成为“公民分析师”。
b.不同的组织有不同的数据素养目标因此,尽管不同组织的数据素养角色可能相似,但推广几乎总是根据客户需求和内部公司文化定制的。
c.发展数据文化是一个变革管理过程,因此必须像对待任何其他文化变革计划一样对待,包括全面规划、分阶段、强有力的沟通、领导者的宣传等等。
d.成功的数据文化转型总是推动顶级财务和客户指标— 在我们所有成功的数据文化推广中,我们一直专注于为顶级团队构建数据印章,同时他们为公司解决顶级战略项目。因此,我们的数据扫盲计划在 9-12 个月内显示出在收入、增长、保留率和盈利能力方面取得了成功,您的计划也应该如此。
对这些科技巨头来说,未来的几个月和几年将会是一段有趣的时光。我预测,超越数据成熟度、实现数据素养和数据文化的商业分析平台将获得巨大的市场份额。首席信息官和首席技术官希望在 2019/2020 年投资数据基础设施,请注意!
Hadoop 怎么了?你现在应该做什么?
拼接机的蒙特·兹韦本和赛义德·马哈茂德
Apache Hadoop 于 2006 年出现在 IT 领域,承诺为组织提供使用商用硬件存储前所未有的数据量的能力。这一承诺不仅解决了数据集的规模,还解决了数据的类型,例如企业越来越有兴趣分析的物联网设备、传感器、服务器和社交媒体生成的数据。数据量、速度和多样性的结合通常被称为大数据。
读取模式在 Hadoop 的流行中发挥了至关重要的作用。企业认为他们不再需要担心定义哪些表包含哪些数据以及它们如何相互连接的繁琐过程,这个过程需要几个月的时间,并且在完成之前没有一个数据仓库查询可以执行。在这个勇敢的新世界中,企业可以在基于 Hadoop 的存储库中存储尽可能多的数据,这些存储库被称为数据湖,并担心以后如何分析这些数据。
企业中开始出现数据湖。这些数据湖是通过商业大数据分发实现的,商业大数据分发是一个平台中支持的许多独立的开源计算引擎,这些平台将为数据湖提供动力,以不同的方式分析数据。最重要的是,所有这些都是开源的,可以免费尝试!什么会出错?
读取模式是一个错误
与生活中的许多事情一样,Hadoop 被吹捧为其优势的特性也成为了它的致命弱点。首先,随着写模式限制的解除,数 TB 的结构化和非结构化数据开始流入数据湖。由于 Hadoop 的数据治理框架和功能仍在定义中,企业越来越难以确定其数据湖的内容及其数据的血统。此外,数据还没有准备好被消费。企业开始对数据湖中的数据失去信心,慢慢地,这些数据湖开始变成数据沼泽。“构建它,它们就会到来”的读取模式哲学失败了。
Hadoop 复杂性和胶带式计算引擎
其次,Hadoop 发行版提供了许多开源计算引擎,如 Apache Hive、Apache Spark 和 Apache Kafka,仅举几个例子,但这被证明是一件好事过多的情况。一个恰当的例子是,一个商业 Hadoop 平台由 26 个这样的独立引擎组成。这些计算引擎操作起来很复杂,需要专门的技能来将它们连接在一起,这在市场上很难找到。
错误的焦点:数据湖与应用程序
第三,也是最重要的一点,数据湖项目开始失败,因为企业优先考虑将所有企业数据存储在一个中心位置,目标是让所有开发人员都可以使用这些数据——如果你愿意,这是一个 uber 数据仓库,而不是考虑数据将如何影响应用程序。因此,Hadoop 集群经常成为企业数据管道的网关,用于过滤、处理和转换数据,然后将这些数据导出到其他数据库和数据集市,以便向下游报告,并且几乎从未在运营结构企业中找到真正的业务应用程序。因此,数据湖最终成为一组庞大的不同计算引擎,运行不同的工作负载,共享相同的存储。这很难管理。这个生态系统中的资源隔离和管理工具正在改进,但它们仍有一段路要走。所有这些复杂性—只是为了报告。
在大多数情况下,企业无法将注意力从将数据湖用作廉价的数据存储库和处理管道转移到消耗数据和驱动任务关键型应用程序的平台上。举个例子,Apache Hive 和 Apache Spark 是 Hadoop 数据湖中使用最广泛的计算引擎。这两个引擎都用于分析目的,要么处理类似 SQL 的查询(Hive),要么执行类似 SQL 的数据转换并构建预测模型(Spark)。这些数据湖实现没有充分关注如何在应用程序中操作性地使用数据。
未来战略
因此,如果您的组织担心 Hadoop 生态系统的最新发展,并且在展示数据湖的价值方面面临越来越大的压力,您应该首先关注运营应用程序,然后再研究数据。
Photo by Tiago Gerken on Unsplash
通过专注于应用程序的数据和智能现代化,您将最终获得能够利用数据根据经验预测未来可能发生的事情的应用程序,并在产生卓越业务成果的时刻主动做出决策。以下是成功的应用程序现代化战略的五个要素:
- 选择一个需要现代化的应用:首先,选择一个你想要现代化的应用,而不是集中精力集中数据。这方面的主要候选是许多定制应用程序中的一个,这些应用程序已经落后于市场,需要变得更加敏捷、智能和数据驱动。一旦您确定了可以为您的组织带来竞争优势的应用程序,那么您就可以专注于获取支持该应用程序所需的数据,以及是否可以从数据湖中获得该数据。
- 使用横向扩展 SQL 实现您的应用程序现代化 : SQL 多年来一直是企业中工作负载的主力,您的组织中有数百名开发人员、业务分析师和 IT 人员完全熟悉 SQL,无需花费额外的时间、费用和风险将您的原始 SQL 应用程序重新编写为低级 NOSQL API。选择一个平台,使您能够保持熟悉的 SQL 模式和强大的功能来更新应用程序,但要在一个可以在廉价基础架构上弹性扩展的架构上进行。横向扩展将整个集群的能力用于计算,比在集中式系统上运行的旧 SQL 系统快得多。借助横向扩展,您可以添加更多容量,也可以随着工作负载的变化而减少容量。
- 采用一个 ACID 平台 : ACID 合规性是一种机制,通过这种机制,事务保持数据库的完整性,并允许用户执行提交和回滚等操作。这是支持操作应用程序的一个关键功能,因为它确保了在发出 commit 之前,数据库不会对其他人进行更改。选择一个在数据库中的单个事务级别提供 ACID 功能的平台。否则,所有这些一致性问题都需要在应用程序代码中处理。所有传统的 SQL 系统都是 ACID 兼容的。数据湖错误地丢弃了这一点,使得应用程序很难编写。
- 统一分析引擎:根据最近 Gartner 博客的报道,从历史上看,将 IT 基础设施分为运营(OLTP)和分析(OLAP)组件是有充分理由的,但现在不再是这样了。ETL 用延迟扼杀了我们的 SLA。过去的情况是,运营和分析工作负载相互干扰,您必须将它们分开。此外,遗留数据平台的性能很差,我们不得不将操作模式转换为更适合分析工作负载的星型模式或雪花型模式。不再需要这个 ETL,您可以在操作平台上运行分析,通常使用操作模式。通过实施该平台,您将确保您的应用程序运行在一个最大限度减少数据移动且不会增加应用程序延迟的平台上。与昨天或上周的数据相比,这可以提供您当前的见解、报告和仪表盘。
- **嵌入本机机器学习:**使您的应用程序现代化的主要原因之一是将 AI 和 ML 注入其中,以便它可以从经验中学习,动态适应变化,并做出即时决策。为了使您的应用程序智能化,选择一个在数据库级别内置机器学习的平台至关重要,这样模型就可以随时使用更新的数据进行实验、训练和执行。
这从根本上说是一种不同于迄今为止您使用的数据湖的方法。这种方法通过现在可以利用数据湖的应用程序,更快地向业务线交付有形的业务价值。
这种方法将确保除了使为您的企业提供竞争优势的应用程序现代化之外,您还可以保护您在数据湖中的投资。
如果您想免费尝试一个具有嵌入式分析和机器学习的横向扩展、ACID 兼容的 SQL RDBMS 示例,请单击此处的。
当我尝试用机器学习进行市场预测时,发生了什么
Image by Pexels on Pixabay
就在你开始第一个基本回归或分类模型的时候,它至少会出现在你的脑海中。大量的时间序列数据,加上年轻时退休的可能性,就像在你祖父的阁楼里找到一张旧藏宝图一样,有着不可抗拒的吸引力。你怎么能不想呢?可以用机器学习预测市场吗?
我至少得试一试。以下是我所做的,以及我所学到的。
网上有很多小规模的教程,是一个很好的起点。他们向你展示如何拉下一只股票的历史,也许计算一些指标,并将其输入回归算法,并试图预测第二天的价值。或者,他们使用一个分类器来预测股票是上涨还是下跌,而不预测价值。
对于下一步该怎么走,我有两个想法。首先,我想做大。我的理论是,一些股票、货币和金融指标之间可能存在隐藏的关系,这些关系太微妙了,肉眼无法发现。我想机器学习算法也许能把它们挑出来。
第二,我不会选择我想预测的股票。我打算为它们训练模型,看看哪些股票表现最好。我的想法是,有些公司可能比其他公司更容易预测,所以我需要找到它们。
我首先下载了标准普尔 500 大部分股票的历史,一堆货币价值历史,和几十个金融指标。一个 Python 脚本负责将它们转换成一致的格式,填充缺失的值,并删除至少不能追溯到 2000 年代早期的时间序列。总之,当尘埃落定时,我在一个包含 18 年数据的漂亮的 Pandas 表中有一千多列。
一旦完成,我使用优秀的 TA-lib 库为 5 天、10 天和 30 天的窗口计算每个时间序列的一系列指标。我没有金融背景,不知道哪些会真正增加价值,所以我采取的方法是增加一大堆,然后让模型把它们分类。这使得列数激增。数据集已准备好输入到超过 32000 列的训练模型中。
我选择 XGBoost 作为我的算法,是因为它的整体性能,以及能够很容易地看到模型使用哪些特性来进行预测。我将它设置为遍历数据集中的所有股票,为每只股票训练两个模型。第一个是分类器,它可以预测股票第二天是涨还是跌。第二个是回归模型,预测第二天的收盘价。
对于每个模型,我用 95%的可用数据训练它,然后用剩下的数据进行验证测试,模拟它从未见过的股票数据。剩下的 5%大约是 3 个月的交易数据。任何机器学习模型都将在预测它接受训练的数据方面做得很好——诀窍是让它更通用,并在它从未接触过的数据上表现良好。
对于验证运行,开始时模拟投资 1000 美元。如果预测股票会上涨,它就买入;如果预测会下跌,它就卖出。没有考虑交易成本,因为我想看看没有交易成本的结果是什么样的。
我开着我的杰特森 TX2 全速跑了一个月。
它发现了什么?
不出所料,对于大多数股票来说,结果很糟糕——准确性比扔硬币好不了多少。不过,有一些似乎在验证数据上表现得非常好。相当多的人在 3 到 6 个月内将我的模拟资金翻了一倍或两倍,有几个人在这段时间里获得了 20 倍的利润。事实证明,图表可以让你的心跳加速。谁知道呢?
请记住,这是该算法以前从未见过的数据-最后 5%被排除在训练数据集之外。
Top is stock closing price, bottom is cash. Dips to near zero are buys.
我找到了吗?有没有一些股票与市场指标微妙地联系在一起,从而可以被预测?如果是这样,我可以从价格波动中赚钱。
当我编写代码并运行它的时候,已经过了几个月,因为我下载了我的巨大数据集。我更新了它,加入了最近的交易数据,并决定看看这些模型在这段时间内会做些什么。他们在验证过程中做得很好——如果我在过去几个月里与他们进行实时交易,他们会做得一样好吗?这时候我变得非常兴奋。
结果令人困惑,令人沮丧。在最初的训练和验证运行中表现出色的模型可能在以后的数据运行中表现良好,但也可能会严重失败,烧掉所有的种子资金。一半时间模拟会赚钱,一半时间会破产。有时候,这比抛硬币好几个百分点,而其他时候,情况会糟糕得多。发生了什么事?它看起来很有希望。
吸取的教训
我终于明白我做了什么。
如果股票价格是随机游走,那么 50%左右的结果正是你所期望的。通过让我的程序在数百只股票中寻找它做得好的股票,它确实偶然发现了一些它碰巧在验证时间框架内预测得好的股票。然而,仅仅几周或几个月后,在随机漫步的另一个片段中,它失败了。
没有微妙的潜在模式。这个模型有几次完全是因为运气好,我就挑了这些例子。这是不可重复的。
因此,机器学习不是魔术。它不能预测随机序列,在训练模型时,你必须非常小心自己的偏见。仔细验证至关重要。
我确信我不会是最后一个被阁楼上的旧藏宝图召唤的受害者,但是要小心。如果你想学习的话,可以玩的随机时间序列要少得多。仔细模拟、验证,并意识到自己的偏见。
最初发表于【http://shortcircuitsandinfiniteloops.blogspot.com】。
通过分析 50 万个数据点,我发现了机会区域
最近有很多关于机会区的讨论,这是可以理解的;这是联邦政府为低收入城市和农村人口普查区创造长期投资的最新举措。一旦被指定为合格的机会区,这些地方就能够通过专门为投资这些地区而设立的机会基金获得投资。
然而,尽管美国 12%的人口普查区域中共有 8700 个机会区,但令人惊讶的是,几乎没有分析来确定投资的“理想”区域。迄今为止发表的许多文章包括推荐美国主要大都市地区的前 10 名名单,任何人都可能猜到,这似乎是对大量地区被选为合格机会区的一种伤害。
我的分析试图为基于 5 个经济指标的所有机会区开发一个排名系统,并查看是否有通常不讨论的高于平均水平的增长领域。我相信结果表明,美国有许多机会区在所有 5 个指标上都排名很高,其中许多实际上并不位于沿海地区。
总的来说,我们发现美国东北部和南部地区的整体表现最好,而中西部和西部地区的表现明显好于其他类似地区。我们还发现,失业率和自有住房的中值是我们数据集中最大的差异,排名偏差几乎是其他 3 个指标的两倍。
疯狂的方法
从一开始,我就采用了一种更具分析性的方法来考察机会区域,并确定是否有潜在的高度可取的投资领域未被发现。首先,我选择从美国人口普查局发现的 5 个数据集提取 5 年(2011-2016)的估计值:
- 总人口
- 16 岁及以上人口的失业率%
- 房主自住住房的中值
- 合同租金中位数
- 过去 12 个月的家庭收入中位数(HHI)
在此分析中,每个数据集的重要性是未加权的,这意味着每个普查区域的所有 5 个排名在每个机会区域的最终“排名”中同等重要。对属性进行加权和/或调整所包含的属性可能会导致完全不同的结果。根据所检查的属性,确实有许多机会区显示出这些属性的有利趋势,这些机会区可能存在于整个美国。
结果呢
提取数据后,我为每个属性的每个机会区域指定了一个等级,8,700 为“最好”,1 为“最差”。一旦每个机会区域都有了所有 5 个属性的等级,我将所有 5 个等级平均为每个机会区域的“总平均等级”:
在对所有的机会区域完成这些操作后,我想看看它在地图上的样子。由于人口普查区域在地理上非常小,我将结果汇总到美国各县,这将数据集减少到看起来更合理的 2000 个左右的点。结果是:
看着这个图像,我们可以看到……嗯,什么都没有。有太多的事情正在发生,无法从这张地图中获得有意义的见解。看到这一点也让我质疑缺乏考虑的区域性——“最好的”人口普查区域可能会受到邻近地区 5 年时间框架内的经济趋势的影响。
在此基础上,我编写了代码来自动将相似地区的人口普查区域组合在一起。K-means 聚类是实现这一点的一个很好的方法,在阅读了卡尔·安德森关于加权 K-means 分析的帖子后,我将它应用到我的用例中。我的目标是使用每个机会区域的“总平均等级”来影响每个聚类的中心在地图上的位置。
用 Carl 的例子来解释,如果地图上有 4 个点,其中一个点的“总平均排名”比其他点高得多,那么创建的新点将倾向于排名最高的点:
Unweighted vs. Weighted
我需要做的最后一件事是弄清楚我想要创建多少个“集群”。确定簇的“正确”数量在很大程度上仍然是一门艺术而不是科学,依靠人对问题的知识和定性的洞察力来确定理想的数量。我选定了 25——它提供了视觉消化性的最佳权衡,同时也将美国均匀地分割成足够大的区域,以产生宏观的区域洞察力。这里是一个覆盖了 Voronoi 可视化的最终输出,以更好地“显示”区域是如何划分的:
所以我们现在只剩下地图告诉我们两件事:
- 8700 个机会区如何划分为 25 个区域
- 每个区域的中心点向高排名机会区的集中加权
为了提供更多的背景信息,下面是每个聚类的总体评分和每个数据集分析的最终细目分类,等级越高表示“最好”:
分析中有许多有趣的见解,总结如下:
- 在最高水平上,东北部和南部地区(美国人口普查定义的)的整体表现最好(平均 4683),中西部和西部地区平均排名约为 4216
- 尽管地区平均水平较低,中西部和西部声称在地图上排名前 3 位的集群(10/4/5),平均排名几乎是表现最差的集群区域的两倍(15/18)
- 影响排名的最重要因素似乎是失业率——第 5 类和第 10 类的失业率分别为 8.56%和 6.65%,几乎是所有 25 类平均失业率(13.70%)的一半
- 群组 4 和群组 5 的平均 5 年人口增长率也最高(0.46%和 0.58%),而所有群组的平均增长率为 0.16%
- 第 4 类也有最高的自有住房中值,为 1.10%,这更令人印象深刻,因为 13 类都有负值升值,最低的是第 18 类(-2.22%)
- 集群 10 中的 HHI 中值增长最快,为 1.02%,轻松超过第二好的集群(南部的集群 9,为 0.58%),几乎是所有集群平均值(0.26%)的 4 倍
- 集群 4 的平均合同租金涨幅最高(1.53%),紧随其后的是集群 8/10/9/11(均在 1.32-1.22%之间)。
- 将这些发现与其他数据集(如美国主要城市)叠加,可以了解主要大都市对每个地区“中心”的影响程度。例如,集群 6 的中心几乎直接落在凤凰城的顶部,尽管周围有大片区域符合机会区的条件。
Opportunity Zone regions(left) vs cluster w/ major city pops in orange (right)
查看各州的综合统计数据,我们还可以收集各州选择指定机会区的不同策略。例如,下面的图表显示了每个州的机会区域的数量(Y 轴)以及每个州的“总平均排名”(X 轴)。一半的机会区位于 8 个州内(加利福尼亚州/纽约州/德克萨斯州/佛罗里达州/伊利诺伊州/俄亥俄州/宾夕法尼亚州/密歇根州),这些机会区往往高度集中在这些州内的主要城市周围。美国中西部各州倾向于选择更少的机会区,尽管与沿海地区相比,机会区的面积更大。东南部地区倾向于在城市和非城市地区跨州选举大量的地区。
Histogram per state of count of Opportunity Zones (Y-Axis) and Total Average Rank (X-Axis)
像纽约这样的州也惊人地集中了大量的高评级区域,如上图中的倾斜所示。总的来说,ND 和 WY 是排名最高的地区,而 IL 和 NV 的排名最低。
…更多数据和地图?!
最后,本文有意简要介绍了生成最终数据集的技术步骤。管理数据集中的缺失数据(插补)、创建等级、聚类汇总等步骤。,但它们是最终分析的主要组成部分。如果有足够的兴趣,我很乐意在未来的帖子中深入探讨这些机制。同时,我在下面提供了一个交互式 ARCGIS 地图,以便您进一步探索聚类和其他数据集图层,从而为进一步分析提供一个切入点!
带 VORONOI 和图层的交互式 ARCGIS 地图 http://arcg.is/1zu14z
构建成功的 AI PoC 后我学到了什么
我最近完成了一个已经投入生产的人工智能概念验证,我想分享一下我所学到的如何提高人工智能概念验证的机会。
只有少数公司开始了他们的人工智能之旅。事实上,基于人工智能的解决方案仍处于早期阶段。因此,决策者通常倾向于首先依赖 PoC。冷酷的事实是,它们中的大多数都没有进入生产阶段。
简而言之,概念验证的目标是测试是否值得在技术解决方案上投入时间和金钱。不用说,构建一个 AI PoC 很难,因为它需要大量的技能。
在实施人工智能以获得竞争优势的竞赛中,公司执行的概念验证的数量不断增加。人工智能行业可能预示着非常高的“成功率”。然而,当我们看到已经成功转化为产品的概念验证的数量时,这些数字和观点并不那么明显。
根据我的经验,我可以告诉你,POC失败主要是因为以下原因:
公司需要人工智能概念证明
我注意到,大多数公司仍然没有足够的内部人工智能技能。事实上,对于处于人工智能之旅早期阶段的公司来说,这无疑是最大的挑战之一。
此外,人工智能工作流可能会变得技术性,公司将不得不应对一系列与硬件、数据安全和大量新数据相关的问题,以进行训练。因此,相当多的公司会倾向于外包人工智能解决方案的开发。
对于公司来说,评估模型效率和人工智能解决方案成熟度的最便捷方式是首先依赖概念验证。一次成功的概念验证并不能保证解决方案能够扩展,但这是一个良好的开端!
PoC 将涵盖许多元素。它涉及数据科学家使用训练数据和管理参数来进行迭代测试运行。通过这种方法,数据科学家和技术团队可以在分派模型进行更广泛的培训和调整之前,检查模型的初始准确性。
训练和调整人工智能模型的过程是人工智能工作流程中计算最密集的部分。作为这一过程的一部分,数据科学家在处理与基础架构管理相关的传统 IT 问题时,会根据可用的训练数据确定他们的模型在哪些参数下收敛最有效。
在开始 AI PoC 之前
我见过太多 AI PoCs 因为各种原因失败。首先也是最重要的一点,我建议公司确保成功的重点是价值证明和与公司战略的一致性。找到合适的执行发起人并让他们参与进来至关重要。概念验证的目的是让愿景成为现实,并克服困难,让决策者相信这一愿景是有帮助的。
以下元素可用作公司决策者考虑 AI PoC 的清单:
这可能是显而易见的,但你应该怀疑你的项目在技术上是否可行。我建议你咨询专家来验证项目的整体复杂性。在我最新的项目中,我们认为深度学习将帮助我们识别特定的包装,但这并不那么容易……其次,对 AI 开发的投资往往只是整体解决方案的一部分,组织应该计算解决方案的总成本(包括运行成本)。
**在构建 PoC 时,确定业务价值是关键。例如,这个解决方案将如何改善你的品牌形象?**我个人认为,如果商业价值很小,那么我会建议看看非 AI 选项,因为尝试机器学习或其他 AI 子领域的成本相当高。
**概念验证与您拥有的数据一样好。你有足够的数据吗?你能用这些数据吗?等等。**简单来说,如果你没有数据或者它的质量需要提高,那么你应该推迟你的 AI 项目,甚至在考虑一个 AI PoC 之前。
不要期望概念验证达到 100%的准确率。决策者需要提前知道什么样的准确度足以说服他们继续进行概念验证。我的经验表明,概念验证的准确性水平不应该太高,这在很大程度上取决于项目的性质。准确性的水平也与投资水平有关…
概念验证的目的是产生附加值。您不能试图让模型达到部署它所需要的可信度。
对于我最新的项目(使用迁移学习识别包装的深度学习),我们花了大约 5 个月的时间达到 85%的准确率,我们不得不使用数据增强技术,因为公司无法为我们提供足够的数据。
PoC 项目需要一个多元化的团队。为了优化您的 PoC 成功机会,我建议决策者建立一个由技术和业务专家/用户组成的多元化团队。人工智能开发不可能不涉及终端用户。我从来没有见过一个人工智能概念验证不需要因为商业专家和数据科学家之间的讨论而改变方法。
成功的概念验证需要时间。通常,我们在这样的项目中使用敏捷技术。决策者往往会低估交付特定 PoC 所需的时间。
所有的概念验证都是不同的,但是一个普通的概念验证项目需要大约 1-2 个日历月才能完成。
确定一个人来弥合决策者、数据科学家和最终用户之间的差距。事实上,从技术角度来看,人工智能需要在选择算法、配置和调整网络、提高数据质量、优化基础设施和验证结果方面进行实验。然而,一个成功的概念验证还必须涉及多个利益相关方。我意识到,有一个项目经理可以缩小这些不同项目成员之间的差距,促进合作,这是一个真正的项目附加值。
构建可靠的概念证明
再次,确保你的商业案例可以通过使用机器学习或任何其他人工智能子领域来解决。我的意思是,数据科学家可以从他们处理的数据中找到相关模式,并从中做出足够好的预测或聚类模型。
所有的概念证明都是不同的,但是一个普通的概念证明项目大约需要 1-2 个月才能完成。
**在我看来,对概念验证进行深度投资是没有意义的。**在某些情况下,使用现成的算法、查找开源训练数据、购买样本数据集、创建自己的功能有限的算法和/或标记自己的数据就足够了。
目标是找到对你有效的方法来证明你的项目将实现公司的目标。
最终,一个成功的 POC 是获得项目其余部分资金的必要条件。
我建议你从收集所有你怀疑有能力完成任务的数据开始,选择那些在大多数情况下能够自给自足的数据。
我意识到,在一个人工智能项目中,很容易变得贪婪,并考虑包含大量输入的解决方案:例如,用户的位置可能会让我洞察他们的下一次购买是什么。现实情况是,很容易迷失在混合不同意义/性质的各种输入中,最终什么也没有提供。
在构建您的 AI PoC 时,关注简单、自给自足的输入。
PoC 的成功在很大程度上取决于您所掌握的数据。随着你进一步训练你的算法来提高准确性,复杂度将会不断上升。使您的系统投入生产所需的模型准确性的预期改进将需要大量的新训练数据。
扩展成功的人工智能概念验证概念验证
PoC 通常通过做出某些假设来简化解决方案:
**构建 AI PoC 只是开发的一个方面。**例如,要将机器学习模型投入生产,您需要花时间构建 PoC 本身不需要的组件,如 API 或重新训练模型的过程等。您还需要确保模型在客户子集上的性能可以推广到更广泛的人群。
基础设施在这类项目中很重要。在低于标准的基础架构上和与生产环境不一致的环境中执行的概念验证很少在实际项目部署期间得到扩展。
最后,你需要为最终用户建立一个接口,潜在地与人工智能交互,并将你的人工智能组件与公司更广泛的基础设施集成,因为其他服务将必须收集输入,发出 API 请求,等等。
走向生产
更高的精度需要更多的数据……
在人工智能开发中,我可以提到很多可能的问题,但我想集中讨论其中的几个。让我们假设,根据您在项目早期定义的标准,您的 PoC 是成功的。实际上,让我们想象一下,您使用预先标记的数据的概念验证使您的模型达到了 70%的准确率。你能考虑上线一个只有 70%准确率的解决方案来展示你的品牌吗?很多时候,决策者会因为显而易见的原因而拒绝。因此,团队必须想出一个如何达到更高精确度的计划。嗯,答案往往是一样的……更多的训练数据!
决策者倾向于认为,如果我们在两个月内达到 70%的准确率,那么我们只需要几周就可以达到可以接受的程度(大约 95%)。这是一个错误,因为事实是模型对训练数据有贪得无厌的胃口,从 70%到 90%的准确率可能需要更多的训练数据才能达到最初的 70%。需求成指数增长,显然更多的时间意味着需要更多的钱来资助项目。
还有不断出现的边缘情况,每种情况都需要训练数据。
正如我们所见,数据的缺乏对公司来说是一个巨大的挑战。然而,其他陷阱也确实存在,比如偏见。
机器学习偏差,也称为算法偏差或 AI 偏差,是一种由于机器学习过程中的错误假设而导致算法产生系统性偏差的现象
事实上,你的团队监控并消除训练数据中的任何样本、算法或偏见是非常关键的。在这一步,我建议您依靠敏捷实践来尽早识别这些事情并做出调整。
最后,我想提一下一个 AI 项目的成本。这不应该是一个惊喜,但人工智能团队和训练数据的过程是昂贵的。我很少见过在上线前不需要额外预算的项目… 我们越接近生产,你需要额外预算的机会就越大。就我而言,与最初的预算相比,经常会有 10-20%的额外预算。
虽然人工智能概念验证通常需要相当大的预算,但要获得批准会有一些障碍,利益相关方可以设计一种机制,让解决方案提供商对成功负责并获得奖励,而不是让组织承担前期投资的负担。
虽然并非所有 POC 都能成功地在实际环境中复制项目,但利益相关方(包括公司和解决方案提供商)之间的协作可以确保 POC 实现预期的投资回报(ROI)。
公司必须努力避免概念验证陷阱。对我来说,这是一个公司建立奇妙的原型来评估它们并开始投资人工智能,但却无法部署它们的时刻,因为它没有合适的基础设施、业务流程或文化来支持它。
不幸的是,当决策者没有看到人工智能集成的全貌时,就会发生这种情况。在我看来,在花了无数时间工作和改进人工智能之后,该公司发现在实施人工智能解决方案之前,它需要首先升级基础设施。
不用说,在开始 AI PoC 之前,您的公司需要支持实验、质疑、支点、学习和失败。
我希望这篇文章能够帮助您更好地理解如何让 AI PoC 取得成功。如果你有问题,我很乐意帮助你。
我从(两届)卡格大师阿布舍克·塔库尔那里学到了什么
从 Abhishek Thakur 的 NLP 内核中汲取灵感
Photo by Georgie Cobbs on Unsplash
快速简历
Abhishek Thakur 曾在遍布德国的多家公司担任数据科学家,他在 NIT Surat 获得了电子工程学士学位,在波恩大学获得了计算机科学硕士学位。目前,他拥有挪威 boost.ai 首席数据科学家的头衔,这是一家“专门从事对话式人工智能(ai)的软件公司”。但我印象最深的是阿布舍克的影响力。
你可以点击这里访问他的简介。以下是他所获荣誉的快照:
- 比赛特级大师(17 枚金牌和空前的世界排名第三)
- 内核专家(他属于 Kagglers 的前 1%之列)
- 讨论特级大师(65 枚金牌和空前的世界排名第二)
我想看看 Abhishek 的教程,在 Kaggle 上接近(几乎)任何 NLP 问题。我选择 Abhishek 的这个内核是因为我自己一直在试图学习更多关于自然语言处理的知识,我怎么能拒绝学习 Kaggle 的万圣节主题幽灵作者数据集呢?
Abhishek 的自然语言处理方法
我强烈建议您阅读这篇关于内核的文章。如果你真的想更牢固地掌握 NLP 或一般的数据科学,确保你理解 Abhishek 的每一行代码,在你浏览他的内核时自己写。
只是我们不要忘记——我们的任务是确定作者(EAP——埃德加·爱伦·坡;HPL—h . p . love craft;MWS——玛莉·渥斯顿克雷福特·雪莱)。
1。探索数据和理解问题
在导入必要的 Python 模块和数据之后,Abhishek 对数据调用 head()方法来查看前五行是什么样子的。由于 Abhishek 是专家,这是一个 NLP 问题,与涉及数字数据的问题相比,探索性数据分析(你最常看到的是 EDA)是肤浅的。数据科学新手可能会从更彻底的 EDA 中受益。对数据的深入研究可以发现任何缺失的值,让您知道需要清理多少数据,并帮助您在问题的后期做出建模决策。
Abhishek 还提醒我们,我们正在处理一个多类文本分类问题。不要忘记我们正在努力实现的目标,这总是一个好主意!他注意到 Kaggle 将使用什么评估标准来对提交的内容进行评分。对于这场比赛,Kaggle 使用多类对数损失来衡量提交模型的性能。理想情况下,我们的多类分类模型的对数损失为 0。如果你感兴趣,这里有更多关于原木损耗的内容。
2。预处理
接下来,Abhishek 使用 scikit-learn 中的 LabelEncoder()方法为每个作者分配一个整数值。通过用整数值(0,1,2)对 author 列中的值的文本标签进行编码,Abhishek 使数据更易于他的分类模型理解。
对作者标签进行编码后,Abhishek 使用 scikit-learn 中的 train_test_split 将数据分成训练集和验证集。他选择 90:10 的训练/验证分割(Python 数据科学中最常用的分割通常在 70:30 到 80:20 之间)。所以他打算用数据集中 90%的句子来训练模型,然后他会用剩下的 10%的数据来评估他的模型的准确性。
3。建立模型
在创建他的第一个模型之前,Abhishek 对数据使用了 TF-IDF(术语频率——逆文档频率)。TF-IDF 将对出现在文本列的句子中的单词进行加权。因此,TF-IDF 将帮助我们理解当我们试图确定哪个作者写了一个特定的句子时,哪些词是重要的——诸如“the”之类的词对于分类任何作者来说都不重要,因为“the”出现频率很高,不会透露太多信息,但是,例如,“Cthulhu”之类的词在分类 H.P. Lovecraft 所写的句子时将非常重要。更多关于 TF-IDF 的信息可以在这里和这里找到。
对数据运行这个 TF-IDF 是特征提取的一种形式。在这里,我们需要推导出某种重要的预测因子或数据特征,来帮助我们找出哪个作者写了一个特定的句子。使用 TF-IDF,我们有了一个单词重要性的统计度量,可以帮助我们预测句子的作者。
在对训练集和验证集拟合 TF-IDF 后,Abhishek 准备了一个逻辑回归模型。如果这种类型的分类模型对您来说是新的,请在继续之前阅读此。在拟合了逻辑回归模型之后,Abhishek 计算了他的逻辑回归模型的对数损失(回想一下,他在内核的开头附近编写了多类对数损失函数)。多类对数损失函数返回逻辑回归模型的对数损失值 0.626 。虽然拟合 TF-IDF 和逻辑回归模型给了我们一个良好的开端,但我们可以改善这一对数损失评分。
4。模型调整
因此,我们对 0.626的对数损失分数不满意,希望优化这一评估指标。从这里,我们可以采取多条路线,这正是 Abhishek 所做的。在我们探索和预处理了我们的数据之后,我们剩下了许多不同的特征提取和模型拟合的组合。例如,Abhishek 使用字数来进行特征提取,而不是 TF-IDF。使用这种特征提取技术,他的逻辑回归模型的对数损失分数从 0.626 提高到0.528*——这是一个巨大的 0.098 的提高!*
总结
由于 Abhishek 的内核从这一点开始变得越来越详细,我将让他来解释其他分类模型。
我们讨论的内容如下:
- EDA :如果我们想要理解数据集,探索性数据分析是至关重要的,当我们开始构建模型时,EDA 可以节省我们的时间
- 多类分类问题:这类问题要求我们预测哪些观察值属于哪个类,其中每个观察值可能属于三个或更多类中的任何一类
- 预处理:在建立任何模型之前,我们必须对数据进行预处理。在这个例子中,为了我们的模型,我们需要使用 LabelEndcoder()将文本标签转换成整数值
- 特征提取:每当我们有一个原始数据的数据集(在我们的例子中是句子摘录)时,我们将需要导出一些预测器,帮助我们确定如何对我们的观察进行分类。Abhishek 向我们展示了如何使用 TF-IDF 和字数统计
从这里开始,由我们来提取具有高预测能力的特征,选择与问题匹配的模型,并优化我们关心的指标。不要害怕弄脏自己的手,尝试几种模型——你很可能会找到一种模型,通过更多的实验来优化你的评估指标。我希望读完这篇文章后,你能更好地理解如何处理 NLP 问题,并且你也能欣赏 Abhishek 的工作。
附录
这里是本文中提到的 Abhishek 的所有代码。我想重申一下,这是我自己的工作——这个要点旨在帮助初学者跟随 Abhishek 的 NLP 教程。
Credit to Abhishek Thakur for this NLP tutorial
作为初创公司的第一个数据工程师,我学到了什么
作为一家初创公司的第一位数据工程师,而不是以前的数据工程师,是一项挑战,但也是值得的。以下是我从中学到的东西。
面试不仅仅是寻找适合我们公司的人,还要让他们相信我们值得他们花时间——对于技术职位来说尤其如此。上个月,当我们在 EmCasa 面试一个数据工程师职位的时候,我们意识到我们已经做了很多事情。我们简要地向他解释了我们在数据基础设施方面所做的工作,他对此印象深刻。但事情并不总是这样。在这篇文章中,我将解释我们已经做了什么,我们从中学到了什么。
当我接到 EmCasa 数据工程面试的电话时,我是另一家公司的数据科学家。他们在找人开始组织他们的数据。当我问他们已经有哪些数据时,回答很诚恳:“只有我们后端 PostgreSQL 数据库中的几个表。我们还尝试了 BI 工具,仅此而已。”当我听到这一点时,我不得不非常清楚地告诉他们:我没有学位,我以前从未做过数据工程师,不知道 Spark,不知道 flow,我不是 ETL 专家,我不知道测试,不知道 git,顺便说一下,我也不是开发人员。但是我有一些过去的经验,我看到了一些行之有效的东西,一些行之有效但可以改进的东西,还有很多根本行不通的东西。我的想法是尽量不要做我已经知道行不通的事情。我不知道他们到底是怎么决定的,也不知道为什么,但我被聘为他们的第一个数据工程师。
当我加入公司时,我注意到向我描述的情景是真实的。看起来我有足够的空间以我认为最好的方式做每件事。在我工作的第一周,我们定义了本季度的一些 okr:
- 从脸书广告、谷歌广告、SalesForce 和其他第三方服务中提取和存储数据
- 选择并实施商务智能平台
- 将财产估价算法的精确度提高 20%
- 将估价模型设计为独立的 API
- 更新/改进网页抓取
为了从第三方服务中提取数据,我们开始寻找一些集成/ETL 服务,如 StitchData、Fivetran、Segment、Alooma、Rivery 等。这里的决定是我们需要尽快开始工作。为每个服务 API 构建一个定制集成会花费太多时间。使用 ETL 服务将为我们节省几个月的开发时间和大量的维护时间。我们决定继续使用 Rivery,在两周内,我们有了一个红移集群,所有来自第三方服务的数据每天都在更新。此时,Luca 加入了我们,成为我们的商业智能分析师。他已经有足够的数据可以利用。那时,我们还决定为我们的仪表板使用元数据库。到目前为止一切顺利。我们正式拥有了数据,它不再是 PostgreSQL 上的几个表了!
接下来的事情是改进我们的财产估价模型,使它作为一个独立的 API 工作(以前的模型绑定到后端)。但是我们没有数据来创建一个新的模型,实际上我们有,但是还不够好。所以我看了看我们正在使用的网络抓取工具。它是用 Elixir 写的(我们的后端运行在 Elixir 上),我不知道 Elixir。所以我决定用 Python 从头开始构建另一个刮刀。为了完成这个任务,我创建了一个名为 Spatula 的私有 Python 包,它从其他网站收集列表并保存到 S3。这个时候我们已经雇佣了 Priscila,我们的数据科学家,她正在和旧数据做斗争。我在本地运行了 Spatula,她有大量的好数据可以用 Athena 查询并开始建模。
当她在研究数据科学时,我开始研究气流。哦,天啊!我被卡住了。一件事是学习如何编写 Dag,另一件事是学习如何以可靠的方式将气流部署到 AWS。我花了很多时间来学习足够的 Airflow、Terraform、Docker 和 AWS ECS,以进行第一次部署(我们分叉了 Nicor88 的这个 repo)。然后花了更多的时间按照我们需要的方式定制它。我开始害怕花太长时间来完成这项任务,所以我问我的经理我是否应该推迟它,并以另一种方式安排任务(错误的方式,我知道这种方式从长远来看行不通)。答案是:“安德烈,当我们雇用你时,我们知道你不懂很多东西。所以,花点时间去学习它,并让它以正确的方式工作。”嗯……这是一种管理姿态和对做正确事情的承诺,我在我工作过的任何其他公司都没有过。所以为了完成气流的配置,我们又多费了一点力气,然后我们设置了刮铲刮泥机,从那里每周运行一次。
One of our frontend screens that collects information from users to predict a property sale price. At this screen we ask property details such as how many rooms, suites bathrooms and garage spots.
此时,我们由 Priscila 制作的新估价模型已经准备就绪。但是还没有准备好生产。所以我的方法是和她一起做一些结对编程,展示我在改变什么,为什么以及如何改变。然后我们一起部署了 Priceteller,这是我们的第一个机器学习模型。它作为一个 Flask API 运行在 AWS Lambda 和 API gateway 上。它响应来自这个通量的请求。在部署它之前,我们还与我们的开发团队讨论了许多代码质量、测试和文档。他们不想从生产向不可靠的 API 提出请求——他们这样提高标准是绝对正确的。当我们最终达到他们的标准时,我们的第一个机器学习模型就可以在线提供给我们的客户了。最近,我们还部署了第二个名为 Selekta 的实时模型,我们使用它根据用户的偏好向他们推荐列表。
Diagram showing our first Machine Learning Model, from data acquisition to deploy.
Priscila 还告诉我他们在她之前的公司是如何使用气流的。因为我以前从未使用过它,所以我试图通过反复试验来学习最佳实践。她提出了一系列改进措施,我全都接受了。从那时起,我们开始在 AWS Glue 上运行一些 Spark 任务,由一个气流任务触发和监控。我们每小时运行一次作业来从后端提取数据,同时运行其他任务来保存用户日志事件。我们还创建了一个推荐模型,每天在气流上批量运行。我确实需要提到一个副作用:现在我们在 S3 上有一个超过 2 Tb 数据的数据湖。
That’s how our data infrastructure looks like so far.
这发生在短短六个月内。我们已经建立了我们公司的数据基础。我们正在使用强大的工具和技术。我们以正确的方式处理数据。
但是,我从中学到了什么?
如果你有目标,学起来并不复杂
对于数据科学出身的人来说,做数据工程并不复杂。作为一名数据科学家,我们感受到没有正确的数据或工具来完成工作的痛苦。所以你对事物应该是什么样子有一种直觉。你要怎么做可以学习。气流,AWS,Spark,Git,Python,你能想到的,如果你知道你要去哪里,可以在短时间内学会。学习没有目标(也没有薪水)的东西更难。
面试公司
知道需要做什么和 T2 能够执行这些有很大的不同。而这和你公司的文化有关。我在面试的时候就注意到,我加入了一个地方,在那里我可以自主地以我认为正确的方式解决问题。你可以通过在面试时询问数据对公司有多重要来注意到这一点。是支持区吗?还是公司成长战略的一部分?他们对你真诚吗?如果数据不是增长战略的真正组成部分,那么很可能你不会花时间去计划和做正确的事情。
数据是一种产品
构建作为独立产品工作的 API、模型和仪表板为数据团队提供了极大的灵活性。但是必须满足标准才能将这些部分连接到工作的产品代码。通过创建数据作为产品文化,我们可以保护团队免受日常业务问题的困扰——有很多分析师可以回答这些问题。我们有一个保护我们不受无关需求影响的经理,所以我们可以专注于学习和做正确的事情。
寻求他人帮助
有些山你将不得不独自攀登,但是问一个以前见过最佳路径的人会节省你很多时间。如果你和一个高层团队一起工作,问问他们在其他公司看到了什么。即使他们不知道怎么做,他们也会知道什么可行,什么不可行。寻求指导肯定会给你指明正确的方向。
不要浪费时间学习,直到真的有必要
有些事情可以通过第三方工具轻松完成,比如我在本文开头描述的 ETL 服务。如果您的数据仓库中没有任何来自脸书的数据,就没有必要浪费时间学习如何连接到脸书洞察 API。如果没有在 EMR 上运行的作业,您不需要学习如何用 EC2 设置 Spark 集群,如果没有任何粘合作业,您也不需要使用 EMR,如果没有在 Athena 上编写任何查询,您也不需要粘合作业。
首先尝试使用最简单的健壮解决方案(不需要持续维护的解决方案)。当该解决方案不再满足您的需求时,开始研究其他工具。从最复杂的开始会浪费你的时间。专注于用最简单、最强大的解决方案尽可能快地交付商业价值。
建造不需要维护的东西
可能发生的最糟糕的事情是花半天时间修理坏掉的东西。如果它经常出错,那么要么是你没有做好,要么是你用错了工具,或者两者都有。从一开始就做正确的事情会花费更长的时间,但会为你将来节省很多时间和负担。
永远真诚
如果你不知道什么,那就说出来,但是也要证明你可以并且愿意学。通过这种方式,你或许可以利用一些工作时间来学习新东西。
分享你的知识
教给其他团队成员他们不知道的东西。这将有助于你专注于学习,也可以避免不同立场之间的摩擦。如果每个人都在同一页上,那么数据工程、数据科学和机器学习工程之间的工作将变得更加流畅。结对编程是分享知识和获得实时输入的好方法。花些时间分享你的知识,看看你能给别人什么。
当别人寻找他们能拿走的东西时,一个真正的国王寻找他能给予的东西。 -木法沙。《狮子王》
The Lion King — Disney
在项目之间休息一段时间
如果您刚刚完成一个大项目,比如部署一个新的 ETL 管道,那么花一些时间在次要任务上是一个好主意,比如编写一些文档或修复遗留的 bug。试图马上开始另一个大任务可能会让你慢下来。
我从 2019 年纽约数据展中学到了什么
上周二晚上,坐在从范库弗峰飞往纽约的红眼航班上,我的脑海里开始响起艾丽西亚·凯斯和 Jay Z 的《帝国精神状态》:
在纽约,
混凝土丛林里,梦想是由
做成的,没有什么是你做不到的
Probably one of my most favorite songs of all time!
我下了飞机,感觉筋疲力尽(‘因为经过一夜的飞行,谁不累呢?),却又很兴奋。透过我从 JFK 到曼哈顿下城的 Lyft 车窗,我意识到它并没有多大变化!它仍然给我留下了我在 2016 年 11 月第一次旅行时的确切印象——忙碌却充满活力,小却如此大。
这是我第四次来纽约。这一次,不是和大学朋友去公司旅游,也不是毕业后和家人度假。是为了 DataX 大会,这是我从市场营销转行到数据科学后参加的第一个数据大会。通过这次会议,我学到了很多东西,我很乐意与你们分享!
最重要的数据科学技能可能不是我们期望听到的
New York City Subway — C Line on Fulton Street. New York City. November 2019
当我们在互联网上搜索进入数据科学并成为一名优秀的数据专业人员所需的技能时,我们经常会发现这些关键词:统计学、编程、数据可视化和机器学习。这些绝对是我们进入数据科学的一大基础。
在 DataX 期间的多次会谈和讨论中,这两项技能被强调为与上述基础技能同等重要。对我来说,他们将数据科学家/分析师与优秀的数据科学家/分析师区分开来。
1。讲故事
- 这是一个具有挑战性的问题。但是你可以通过阅读《纽约时报》、《哈佛商业评论》或其他许多知名杂志来获得数据故事的灵感,从而开始积累
2。领域知识或业务知识
- 为了收集这种技能,我们可以阅读公司网站和报纸。也有来自不同公司的数据团队的博客文章和采访视频,你可以查看更多
- 与来自不同团队的同事一起喝咖啡也是扩展您的网络和了解更多关于数据团队可以支持的正在发生和即将发生的事情的好方法
有效的数据沟通是很多公司的通病,即使是顶级公司也不例外!
Hudson Bagel on 9th Ave because I want that salmon bagel so bad. This place was recommended by Tommy, my New Yorker colleague. New York City. November 2019
1。呈现 A/B 测试结果
我记得我第一次向我的利益相关者,一群 UX 设计师展示 A/B 测试结果。我把最喜欢的关键词扔给了会议:“这里是 p 值和置信区间。看到这些,我们知道我们的测试是统计显著的。”肖娜在那里打断了我:“这些是什么意思?”。多亏了肖娜,我被拉回到了现实中,我在和设计师交谈,而不是和数据窥视者。我想让他们带走的不是 p 值,而是我们是否应该使用新的设计!
猜猜看,Valerie Kroll 发表了一篇关于模板的演讲,我们可以用这个模板向商业利益相关者展示 A/B 测试结果。我多么希望早点遇见她啊!
如果我的情况听起来和你一样,你可以在这里下载她的模板,然后开始你的下一次测试结果演示!
2。增强数据理解
Eli Brumbaugh 和 Marie Sbrocca 发表了一篇关于 AirBnB 如何利用数据用户体验的演讲。他们提到了一个让我印象深刻的公式:
明智的决策=对数据的理解+领域知识+对分析工具的理解+适当的信任+对不确定性的认识
我在 Eli 和 Marie 的演讲后见到了他们,问他们 Airbnb 是如何处理这个公式的第一部分的,即对数据的理解。随着产品的增长,这家公司拥有庞大的数据生态系统。因此,除了有效地交流分析结果,他们还致力于改进他们的数据字典——考虑人们在查看表格时搜索的流行元数据,或者考虑表格的数据质量分数的想法。
您是否缺少数据科学项目?一些想法开始
Hudson Bagel on 9th Ave — So many choices of cream cheese. This place was recommended by Tommy, my New Yorker colleague. New York City. November 2019
如果你想知道个人或专业项目的下一步该做什么,你并不孤单!在一些演讲和观众的提问中,缺乏对数据科学项目的想法是主题之一。以下是给你的一些建议:
- 早投资干净的数据。验证数据,找出丢失数据的来源等等。非常重要,因为这一过程可以为您的下一个数据项目节省时间,让人们信任您的工作,并且(最重要的是)在您的数据生态系统增长时,将您从一场巨大的灾难中解救出来
- 自动化简单的事情和重复的事情。我一直遵循受大卫·罗宾逊启发的三法则——“当你写了三次相同的代码,就写一个函数”。所以写函数,做包,致力于自动化你的过程
那么下一步是什么?要注意的应用和职业趋势
Spoiled Brats Pet Store on W 49th Street made me think of my dog, Guava. New York City. November 2019
随着数字、文本、图像和视频形式的数字足迹时代的到来,在产品和职业角色方面,有几个趋势值得关注。
- 我最喜欢的演讲嘉宾之一希拉里·梅森谈到了随着技术的进步,更多数据产品的趋势,这些产品利用了视频和图片分析和自然语言处理。这已经通过纽约时报和 Vox 关于他们如何应用 NLP 来建议在他们的文章上放置广告的谈话得到了证明。
- 希拉里还提到了随着越来越多的数据产品被开发出来,需要提防的一种新型角色,那就是数据产品经理。这些人是目前拥有基本机器学习知识的项目经理,或者是希望将自己的角色扩展为项目经理的数据专业人士。
- Courtney Harding,Friends With Holograms的创始人讲述了他们在培训公司的虚拟现实应用关于工作场所的性别歧视和性骚扰——培训主题需要深切的同情和情感投入才能取得成功。这让我大吃一惊,我相信这将是一个很好的工具,可以用来训练任何需要涉及情感的话题
- JT·科斯特曼,前时代公司首席数据官,现任 ProtectedBy 首席执行官。AI 围绕网络犯罪发表了令人印象深刻的演讲。他说:*“恶意软件攻击增加了 2000%,到 2021 年网络犯罪的成本将超过每年 6 万亿美元。”*想想我们所有的数据,无论是在线还是离线收集的。它随时都有或将会有危险。然而,我们可以使用数据科学来保护自己,JT 建议关注一种趋势,包括安全领域的数据科学应用和安全数据科学家。
结束了
Gyro stall in front of Central Park. New York City. November 2019
在飞回温哥华之前,我在中央公园走了一圈,帝国心态又开始在我脑海中播放。如果你在这个公园的边缘漫步,你会看到树木和…许多建筑!看着眼前的混凝土丛林,一个有趣的想法冒了出来:“也许今晚我会做一个数据梦,因为我在两天内学到了这么多。”
那天晚上我没有做数据梦,但是我确实有很多来自 DataX 的想法,我需要在忘记之前写下来。
我从采访顶级数据科学团队中学到的东西——给有抱负的数据科学家的提示
下一次面试要准备什么
Photo by Daniel McCullough on Unsplash
在过去的一年里,我花了相当多的时间寻找数据科学方面的工作。我很幸运地面试了几家拥有不可思议的数据科学团队的公司。面试过程很紧张,但同时也很有启发性。我从这些面试中学到了很多东西,无论你在哪里面试数据科学职位,这些东西都是有帮助的。
在这篇文章中,我不打算讨论的是如何在优秀的公司获得面试机会。如果你正在努力争取面试机会,去看看我写的这篇关于在第一份工作之前积累经验的文章。一旦你得到了面试机会,真正的乐趣就开始了。
有广博的知识
对于大多数入门级的工作,你不需要成为任何特定数据科学领域的专家(除非你专门申请 NLP 职位或类似的职位)。然而,人们期望你了解数据科学领域的许多事情。几乎在我面试的所有地方,第一次面试都是技术性的。我被问了很多问题,从 p 值到随机森林,到时间效率编程,等等。公司不想要的是知道如何即插即用 scikit-learn 的人,所以请确保您对数据科学的关键领域有很强的基本理解。如果你不知道从哪里开始,GitHub上的这些讲座涵盖了很多基础知识。还有很多类似的资源也能很好地工作。测试你是否“准备好面试”的一个好方法是你是否能回答以下三个问题:
- 我知道什么是 _ _ _ _ _ _ _ _ _?
- 我能直观地解释一下 _ _ _ _ _ _ _ _ _ 是如何工作的吗?
- 如果给我无限的时间,我能根据我目前的理解从头开始编写 _ _ _ _ _ _ _ _ _ 代码吗?
如果你能对大多数话题的第一个问题做出肯定的回答,你就不会崩溃,但你也不会大吃一惊。如果你对第二个问题的回答是肯定的,那么你就处在一个很好的位置,很可能会抓住面试的问题。如果你对第三个问题的回答是肯定的,那么你将会粉碎任何关于这个主题的问题。尽管大多数公司不会要求你从头开始编写梯度下降法或 K-最近邻法,但如果你可以的话,你可以回答他们向你提出的任何问题。
在你尽可能多的了解了周围的面试角色之后,还是很有可能,甚至很有可能,你会被问到一个技术问题,这个问题要么你一无所知,要么你只知道上面问题 1 的水平。不要惊慌。从我的经验来看,大多数面试官并不指望你对所有事情都了如指掌。他们所期望的是,你能正确回答大多数问题,并且当新概念出现在你面前时,你表现出理解新概念的能力。所以,如果你被抛出一个曲线球,就和你的面试官好好谈谈。
解决问题胜过技术技能
如果你没有敏锐的技术技能,你将无法通过大多数第一轮面试。如果你不能用那些技术技能去解决一个问题,你将永远找不到工作。毫无疑问,我面试过的每家公司都进行了案例研究面试。我看到了一个场景和可用的数据,并被要求大声思考这个问题。呈现给我的场景几乎总是团队过去已经解决的,或者当前正在处理的。这些面试可能会带来一些困难。首先,当面试官盯着你,评判你的每一句话时,你很难站起来思考。第二,我发现,当给定他们过去解决的问题时,面试官很容易希望你告诉他们他们是如何解决问题的,而不是敞开心扉与你讨论其他想法。虽然这两件事你都无法改变,但有几种方法可以让面试变得更容易。
Photo by Olav Ahrens Røtne on Unsplash
拥有丰富的技术知识将有助于这类面试。如果你过去曾用技术知识解决过问题,它会更有帮助。对案例研究的最好准备是拥有大量解决问题的实际经验。这可能来自工作、学校或副业。不过,我意识到,在申请第一份工作之前,你可以获得多少经验。下一个最好的事情是实践案例研究。你可以在网上找到很多案例研究的例子。你甚至可以联系你在 LinkedIn 上的关系网,联系当前的数据科学家,询问他们是否可以给你一个他们曾经做过的案例研究。这将是巩固你的人脉和准备面试的好方法。最后,研究一家公司可能是有用的,因为大多数案例研究问题来自他们过去参与的项目。再说一次,他们不指望你知道所有的事情。做好准备,把自己不明白的事情说透,大声解释自己的想法。
你不需要硕士学位来竞争
许多入门级数据科学家的招聘信息要求硕士或博士学位。我碰巧两样都没有。我发现真的没关系。我避开了任何专门要求只有博士学位的招聘信息,而是自由地申请了要求硕士学位的有趣工作。我得到了很多我可能看起来不胜任的面试。每次我飞到现场面试时,我是那里唯一的本科生,这似乎对我的面试结果没有任何影响。
如果你是本科生,不要害怕申请要求研究生学位的工作。如果你了解自己的工作,并且有丰富的经验,你将会有机会面试并证明你是值得雇佣的。硕士学位会给你更多的机会吗?大概吧。但重要的是要知道,这不是一项要求,没有它你也能获得一份令人惊叹的数据科学工作。
不要只关注一家公司
有一家理想的公司为之工作是很棒的。我认为在申请第一份工作时,纠结于为一家公司工作是不健康的。我申请的时候有一家公司是我特别想去的。我以为这是命中注定的。我进入了最后一轮面试,但是没有通过。在那之后我心碎了好一阵子。这对我的求职和其他一些面试产生了强烈的负面影响。从那以后,我意识到拥有一份你知道会让你快乐的工作比拥有一家你知道会让你快乐的公司重要得多。
最后的想法
数据科学面试很难,大多数人都讨厌它。我认为他们提供了一个学习和自我反省的好机会。学习你不知道的和你不擅长的是有价值的。被拒绝后我发现,很容易想到一家公司的面试过程有多愚蠢,或者我是如何被问到不公平的问题的。被拒绝后自我反省,提高自己为下一次面试做准备要困难得多。毫无疑问,从面试中学习和成长最终会让你找到让你开心的工作。
如果这篇文章能帮助你准备(或者更好,绝对搞定)一次面试,我很乐意听听。欢迎通过 LinkedIn 联系我,或者发表评论,告诉我你的经历。
我从一年来每周写一篇数据科学文章中学到了什么
School of Athens by Raphael (Source)
数据科学写作改变生活的力量
应该有一条法律限制人们只能用“改变生活”这个词来描述生活事件。今早喝了一杯改变人生的咖啡。嗯,希望它是好的,因为这是你得到的一个使用!如果这项立法得以通过,那么我会用我的配额来决定写关于数据科学的文章。这篇文章直接带来了两份数据科学的工作,改变了我的职业规划,让我穿越了整个国家,最终让我比我还是一名可怜的机械工程大学学生时更加满意。
2018 年,我做出了写数据科学的承诺,每周至少发表篇文章,共 98 篇。对我来说,这是变化的一年:大学毕业,4 份工作,5 个不同的城市,但唯一不变的是数据科学写作。作为一种文化,我们痴迷于条纹,并确信那些完成条纹的人一定获得了渊博的知识。与其他迷恋不同,这一点可能是有意义的:长期坚持做一件事,无论是编码、写作还是维持婚姻,都需要令人印象深刻的承诺。做一件新的事情很容易,因为我们的大脑渴望新奇,但是一旦新鲜感消失,重复做同样的事情需要不同程度的投入。现在,为了延续 streak completers 写下他们获得的智慧的伟大传统,我将描述在“数据科学写作年”中学到的经验教训。
每周数据科学写作的五个收获是:
- 不需要正式的指导 ,你就可以学到在数据科学领域取得成功所需的一切
- 数据科学由好奇心驱动**
- 一致性是任何追求中进步的最关键因素
- 数据科学是经验性的:你必须通过实验来找出可行的方法,而不是依赖已被证实的最佳方法**
- 写关于数据科学或任何东西的文章是一种互利的关系,因为它有利于你和整个社区**
每份外卖都附有我的中等文章统计图表。你可以在这里找到 Jupyter 笔记本或者通过这篇文章获得你自己的统计数据。
Started and Published Date of All Articles
1.数据科学的一切都可以不用上学就能学会
机械工程,我很不幸在大学学的,要在一个机构教。一个人(至少一个有正常资源的人)不可能收集“机电”教育所需的设备——实验室、原型机、风洞、制造车间。幸运的是,数据科学没有类似的限制:无论该领域的主题多么先进,对于世界上任何一个有互联网连接并愿意学习的人来说,都不是禁区。
虽然我在大学里确实上过一些有用的统计学课程(注意:这些课程中的所有内容都包含在免费的统计学习介绍中),但我大学里的数据科学课程已经过时了。我们被教导的工具和技术在几年前就已经失宠了。有几次,我向教授展示了这方面的证据,结果却被告知:“好吧,我要教我所知道的东西,因为它对我有用。”更重要的是,这些课程是面向研究的,这意味着编写低效、混乱的代码,只运行一次就能得到论文的结果。从来没有提到过为产品编写代码:像单元测试、可重用功能,甚至代码标准之类的东西。
我没有依赖大学课堂,而是从书籍和在线课程/文章中自学(并继续学习)数据科学/机器学习。我选择通过示例教学的资源,并关注当今数据科学实践中实际使用的内容。(根据这些标准,最好的课程来自 Udacity ,最好的书是Aurelien Geron 的《通过 Scikit-Learn 和 TensorFlow 进行机器实践学习》。)不用花钱买素材: fast.ai 免费提供深度学习上最前沿的课程;Kaggle 让您有机会处理真实世界的数据,并向数千名数据科学家学习;而且,像《Python 数据科学手册》这样的书不需要任何费用!(对数据科学也有用)。
最初,我不确定这些资源是否足以在数据科学领域取得成功,但进入该领域后,我发现这些资源绰绰有余。当谈到数据科学时,很少有人知道他们在谈论什么,如果你已经研究了网上可用的最新资料,你将领先于大多数其他人。事实上,我认为你最好从不断更新的在线资源/课程中学习,而不是从每年最多修改一次课程的教育机构中学习。
所有这些并不是说学习数据科学很简单:你仍然需要意志力和毅力来日复一日地学习(详见 3 中关于一致性的内容。).也就是说,我发现当使用通过实践例子教授的材料时,更容易保持动力和理解概念。我没有先研究理论,然后再看应用,而是使用 fast.ai 的杰瑞米·霍华德所说的自上而下的方法:从解决问题的概念的实现开始,最好是用代码。然后,有了一个框架,根据需要回去学习理论。
最后,我学会了不要让数据科学/机器学习词汇吓倒你。进入这一领域最困难的部分可能是学习术语,因为当人们使用你从未听说过的词汇时,你很难找到方向。不要害怕要求澄清你不知道的单词,一旦你知道了一个长单词的意思,不要只是为了显得聪明而使用它。如果你使用容易理解的语言,你会听起来更聪明,更有帮助。(如果你需要一些帮助,这里有一个有用的机器学习词汇)。
Scatterplot Matrix of Variables
2.好奇心推动数据科学
如果你看我 2018 年的文章,有一个模式立刻凸显出来:没有模式!这些文章从一个话题——Python 中的随机森林——突然转向另一个话题——贝叶斯回归——转向第三个话题——古德哈特定律——转向第四个话题——递归神经网络——没有任何趋势。这是我无法满足的好奇心的直接结果:如果我在有声读物的脚注中听到一些奇怪的东西,阅读一篇晦涩的参考论文,或者看到一条奇怪的推文,我必须获得一些数据,编写一些代码,并做一些分析。这可能是福也可能是祸,但幸运的是,数据科学是一个值得好奇的好领域:数据科学奖励好奇心:你必须愿意探索新的方法和技术,以便随着该领域的发展保持相关性。
此外,对新工具保持好奇有助于避免依赖一个库,这是我从惨痛的教训中学到的。我花了太多时间使用 matplotlib,因为在我切换到 plotly 之前,我花了太多时间学习它。不到 30 分钟,我就像花了 50 个小时学习 matplotlib 一样熟练了,这表明我应该更快地做出改变!在寻找新工具或使用你已经知道的工具之间的平衡在探索-利用问题中有一个形式化。你可以花时间探索——利用你已经知道的东西——或者探索——寻找一种可能比现有方法更好的新方法。
目前,数据科学的回报在于探索方面:那些能够寻找和学习新工具的人处于优势,因为该领域的变化速度很快。
当你实际从事数据科学时,好奇心也是有帮助的:探索性数据分析的目标是在数据中发现有趣的模式。一个有点相关的话题是,理查德·费曼,可以说是 20 世纪最聪明的人,可能是好奇心态好处的最佳支持者。作为一名理论物理学家,他因学习技能(如破解保险箱)或恶作剧而闻名,正如他在量子力学方面的工作一样。根据他的作品,这种好奇心是他作为一名科学家不可或缺的,也让他的生活更加愉快。
One of several enjoyable books by Feynman (source).
费曼不是被对荣誉或财富的渴望所驱使,而是因为他真诚地想把事情搞清楚!这也是我在数据科学项目中采取的态度:我做这些项目不是因为它们是必须的,而是因为我想找到隐藏在数据中的难题的答案。这种基于好奇心的态度也让我的工作变得愉快:每当我开始做一些数据分析时,我都把它当作一项令人满意的任务。
Rolling Average of Words Per Week
3.一致性是关键因素
我 2018 年发表的 98 篇文章,共计 264894 字。每发表一个词,至少有一个词没有通过编辑。这相当于每天 53 万字或 1500 字。全职学习和工作的唯一可能方式是确保我每天都在我的项目上写作和取得进展。我的观点很简单:任何努力最难的部分都是开始,所以一旦你度过了这一关,为什么要停下来呢?
持续写作/工作的回报的最佳类比是定期向储蓄账户存款。日复一日,你不会注意到太多的变化,但有一天你醒来,你的初始投资增加了两倍(或者你已经写了 100 篇数据科学文章)。如果你只看昨天到今天的进步,可能很难看到好处,但是如果你能退一步,从长远来看,你就会看到每天取得一点进步的价值。
实际上,你不需要每天写 1500 字。为了达到这一点,我不得不做出牺牲(我平均每周花 20 个小时写文章——没有报酬,所以谢谢你的鼓励)。尽你所能,不管是 300 个单词,还是写几行代码。关键是你创造了一种心态,在这种心态下,写作或从事兼职项目不是额外的麻烦,而是每天的一部分。
写作和做数据科学项目是习惯,像任何习惯一样,随着足够的重复,它们变得根深蒂固。
此外,写作不一定要在媒体上,甚至不一定要写博客。所有的写作(甚至推文)都有助于你提高。从在你的笔记本上写更多开始。笔记本环境是数据科学的一个伟大工具,但当人们忘记了它的预期目的时,它被滥用了(看看这个演示)有文化的编程 )。Donald Knuth 提出的文化编程意味着在同一个文档中混合文本、代码和输出,遵循将思想转化为产生结果的代码的自然过程。
除了用注释完整地记录代码之外,使用文本单元格(你可以得到无限的数量,所以可以随意制作更多)来解释你的思维过程。文档对于确保其他人能够理解你的所作所为是至关重要的,也是通过写作来解释自己的一个很好的练习。
写作很难,但却是一项有益的活动。作为一个好的规则,生活中最困难的事情——锻炼、教育、写作——也是那些带来最大长期利益的事情。此外,所有这些努力都会随着常规练习而提高。现在就开始在你的空闲时间定期捐款,你未来的自己会感谢你的远见。
Heatmap of Correlations within Data
4.数据科学是经验性的,而不是理论性的
随机森林中的最佳树数是多少?梯度助推机应该跑几轮助推?哪个优化器最适合你的卷积神经网络?对于高度相关的特征,最有效的降维技术是什么?
所有这些问题的答案都是一样的:你必须自己去试验和发现。在数据科学中,仍然很少有一成不变的规则可以遵循,对于事情为什么会如此顺利的解释就更少了。这意味着数据科学/机器学习几乎完全是经验性的:结果不是通过理论而是通过实验产生的。
这种缺乏公认解决方案的情况令人沮丧。我应该如何设置我的随机森林的超参数?与此同时,它也可能是有利的:没有“正确”的答案,这对于喜欢试验的修补者来说是非常好的。至少,你需要准备好问一个问题,然后被告知你必须写代码自己去发现。
(注意,我认为有必要将最佳实践*——比如代码评审和遵循 pep8 的代码风格——与用于回归或降维等任务的最佳方法分开。有最佳实践可以遵循,但方法仍在整理中。)*
研究数据科学的一个好方法是将自己视为一个永远的初学者。知道得多总比知道得少好,但这也可能是一种限制。你看不到过去你一直使用的方法,而是刚刚发明的更好的选择(还记得探索/利用吗?).接受你永远不会到达“数据科学知识的尽头”的事实,即使没有其他人到达,也要愿意尝试新技术。此外,当有人告诉你在机器学习中只有一种正确的方法时,要非常怀疑。数据科学仍然是一个公平的领域,专家不一定是解决特定问题的最佳人选;如果你认为有人(尤其是我)在做一些次优的项目,指出来!
Total Views and Reads in 2018
5.写作给作者和读者带来了真正的好处
互利共生是一种共生的形式,在这种形式中,双方都从某种关系中受益。我们的肠道细菌就是一个完美的例子:当我们享受健康益处时,它开始以我们的消化产物为食。将这与数据科学联系起来,写作也是一种共生关系,因为作者和读者都走在前面。当我完成一篇关于数据科学的文章时,我不知道是我还是那些阅读这篇文章的人获得了更大的利益。
写作就是字面上的思考。它迫使你理清思路,向别人解释概念——尤其是用简单的语言——需要深刻的理解。写作不仅驱使我学习更多的东西,这样我就知道我写的是什么,而且它还让我形成简单的解释,我可以在工作中用这些解释向广大(非技术)观众解释概念。
我从写作中获益的另一个方式(除了挣两份工作)是成为一个更大的社区的一部分。写作和看到其他人从我的文章中受益比我每天做的任何事情都给我更大的成就感。不要太多愁善感,但作为一名“作家”是我现在自我定义的一部分,它给了我周末早起为社区做贡献的动力。
在这种关系的另一方面,我当然希望人们从这种写作中受益。在我向数据科学转型的过程中,我从社区获得了大量的帮助,而写作是我向前回报的小小方式。此外,我的文章可以免费阅读,因为我相信当知识被允许无障碍地传播时,一个领域中的每个人都会受益。
除了免费知识,当更多不同的人被吸引到数据科学领域时,它会变得更好。一个领域因其多样化而受益,因为不同的个人带来了处理和解决问题的新方法(这不仅听起来不错,而且已经被证明)。数据科学是一个伟大的领域,我不想看到它被同质化所削弱。如果我的文章可以帮助将数据科学扩展到更广泛的受众,那么整个社区将会更加丰富。
我经常看到这样的想法,如果有人在他们的领域取得了成功——例如他们已经获得了一份稳定的工作——他们的工作就完成了。相比之下,我认为一旦你进入一个领域,你就有义务回头帮助下一个人。更好的是,建造一部电梯,让尽可能多的人进入这个领域。
Percentage of reads (reads / views) by Reading Time Binned
结论
总而言之,这些是“数据科学写作年”的收获
- 数据科学不需要正规教育
- 好奇心驱动数据科学
- 数据科学和写作是随着实践变得更好的习惯
- 需要数据科学方面的实验
- 写作会让你和社区受益
虽然我可以用时间做很多其他事情,但很难想象还有什么事情能像写数据科学这样给自己和他人带来如此多的好处。尽管我今年已经转向数据新闻业(减少对数据世界的误解),但我将继续撰写标准数据科学:项目、工具和技术,您可能会发现它们很有用。
作为最后一点,请考虑这一点:写作是我们生活中能完全控制的少数活动之一。从一张空白页开始,经过几天或几周的时间,把你的想法写在纸上,最终,你会有一个完全由你自己的想法创作的作品,它可以在几秒钟内传遍世界,带给数百万人,可能会改善你和他们的生活。这就是魔法的定义——现在出去练习数据科学写作吧。
一如既往,我欢迎建设性的批评和反馈。可以在 Twitter @koehrsen_will 上找到我。
我在人工智能时代的 RSNA 放射学聚焦课程中学到了什么
人工智能将如何影响放射学?
Photo by Owen Beard on Unsplash
简介
大约一个月前,我有机会参加 RSNA 聚焦课程“人工智能时代的放射学”,在那里,甚至吴博士也发表了他对这个主题的看法。(而且我居然有机会和他合影!😄)。
在这里,我将总结一下我在每一次会议中学到的一些材料,不幸的是,我不能参加每一次演讲,但我希望我将要讨论的一些材料也能对你有所帮助。
人工智能是新的电力:人工智能在医学成像应用中的颠覆性力量— Andrew Y. Ng 博士
Can’t believe I actually got to meet Dr. Ng
吴博士受他父亲的影响很大。他的父亲创造了一个机器学习算法(很久以前)来帮助医生。
如今,机器学习的大多数好处都来自监督学习设置。由于大量的数据,人工智能现在可以自动化许多不同的任务。
这很好,但是,没有大量的数据,今天的学习方法就不会成功。尤其是在我们没有很多数据的医疗行业。
在研究实验室中运行良好的模型在现实世界中可能不太适用,因为数据分布是不同的。这种分布上的变化很成问题。
那么问题来了,如何保持模型的泛化能力?可能还没有一个明确的答案,但最好的做法需要建立在放射学上,作为一种监管形式。
此外,人工智能将用于增强临床医生的能力,而不是取代他们。计算机科学家和放射学家必须一起工作。
炉边聊天和问答
对放射学家和计算机科学家进行教育,开一个课程或训练营是个好主意。创新的关键是将人们聚集在一起,解决我们今天在放射学中面临的一些严重问题。
其中一个问题是数据标记,以及如何从放射学报告中提取信息。(更多与 NLP 任务相关)。
破解艾(XAI)黑匣子之谜——萨夫万·哈拉比,医学博士
我们如何解释模型的决定?我们拥有的大多数方法都是强黑盒模型(以及弱黑盒模型)。
神经网络很难理解和审计,因为它有太多的参数。从系统的角度来看,我们不知道一个神经元扮演什么样的角色,也不知道每个连接是如何建立的。
提出这个问题的另一种方式是维度问题,因为我们有如此多的参数,理解具有如此多参数的模型超出了人类的能力。解释“什么导致了什么”是一个很难解决的挑战。
最后,还有一个透明度问题。(模型查看的是输入数据的哪一部分?).当然,我们有反褶积、积分梯度、深度提升等方法,但我们能说这个问题已经解决了吗?
放射科医生需要了解的数据科学知识— 休·哈维,MBBS 理学学士
Photo by Drew Hays on Unsplash
作为一名放射科医生(或研究人员)如果你想使用数据科学(机器学习),你应该建立自己的算法还是应该与一家公司合作?数据有多干净?
这些都是值得思考的有趣想法,他们还开发了从 D 级到 a 级的数据清洁度。
D 级 →原始数据
C 级 →数据去标识,访问数据需要伦理批准。最后,它是非结构化的。
B 级 →结构化数据和质量控制,无标签
A 级 →清理和标记数据
在所有这些步骤中,获得数据的伦理批准需要花费最多的时间。
医学人工智能的偏见与启示— 医学博士、公共卫生硕士
以一个关于使用神经网络对坦克进行分类的城市传说开始这个话题。
当计算机系统出现意外结果时,我们需要知道这些错误发生在哪里,为什么会发生。
在医学领域,可以有三种类型的偏见医院,计算和认知。
医院偏见→不同的医院使用不同的机器以不同的方式采集数据。从一个医院数据源训练的模型在另一个数据源中可能表现不佳。
计算偏差→对手攻击。
认知偏差→这更像是人类的偏差,因为人类在不同的情况下会有不同的表现。
乳房成像中的人工智能— Hugh Harvey,MBBS 理学学士
Photo by Jon Tyson on Unsplash
有趣的是,许多与乳腺癌相关的数据都来自欧洲。
这一研究领域的一些问题包括不同的公司使用不同的机器和预处理方法来创建乳腺摄影图像,我们如何才能使它们标准化?
这种不同的来源会产生偏差,并且基于补片的分析对于乳腺癌乳房 x 线照相术图像来说是不成功的。即使是细分,数据标注也是关键。因为分段是许多不同过程的支柱,如果我们不能正确地做到这一点,可能会导致一些问题。
艾在人体成像— 巴维克·n·帕特尔,医学博士,MBA
CT 图像广泛用于医疗环境,当与人工智能配对时,从分割和分类开始,有很多潜力。
然而,也有很多挑战,在诸如肺癌或前列腺癌分类的诊断中,信噪比非常关键。克服数据分布的严重不平衡是另一个挑战。(加上少量的训练数据,就变得更难了)。
即使模型可能是在自然图像上训练的,使用预先训练的模型也是一个非常好的主意。
最后的话
这是一个令人惊叹的会议,我见到了吴博士!那是改变我一生的时刻。请点击此处,查看计划详情及更多内容。我希望这里的一些信息也能帮助你。
如果人工智能模型很容易理解会怎样?
当我带你浏览谷歌的假设分析工具时,你会看到人工智能分析的实际应用
让我们来谈谈假设工具,就像在*“*假设工具 看看你的模型性能和 数据 在 ML/AI 开发过程中不是一件如此令人头疼的事情吗?”(或者忽略我的喋喋不休,直接滚动到下面的穿越截图!)
为什么要为人工智能的分析而烦恼?
能够掌握你的进展是快速迭代到一个令人敬畏的 ML/AI 解决方案的关键,所以为在机器学习领域工作的分析师设计的好工具帮助他们帮助你满足雄心勃勃的目标并在伤害你的用户之前抓住像 AI 偏见这样的问题。
假设分析工具 是用于快速机器学习分析,旨在加速迭代模型开发和训练。
分析不是为了证明什么,所以这个工具帮不上忙。相反,它将帮助您更快地发现数据中未知的未知部分。在这里了解更多关于可解释人工智能( XAI )及其局限性。
关于假设工具
假设工具用于快速机器学习分析,旨在加速迭代模型开发和训练。第一个版本(2018 年末发布)很漂亮,但除非你全押在 TensorFlow 上,否则你无法使用它。作为欣赏像 Scikit Learn 这样的工具的便利性的人,我很高兴假设工具现在面向所有使用 Python 中的模型的分析师。
不再有 TensorFlow 独享!
我们一直在整合来自内部和外部用户的反馈,以使该工具对数据科学家、研究人员和公司的大团队等来说都非常棒。点击了解更多关于我们的 UX 之旅。事不宜迟,让我给自己做一个 hexpresso,用最新的版本来告诉你我对什么是好什么是坏的看法。
假设工具有什么了不起的?
易于使用且功能多样
在当前版本的假设分析工具中,我们扩展了对 TensorFlow 爱好者之外的魔法的访问。是的,没错——不再有 TF-exclusive!这是用于特征选择/预处理洞察的模型理解和快速数据探索,即使你对*tensor flow*过敏。想对比 Scikit Learn 或 PyTorch 制作的模型?站起来!它能与标准的 Jupyter 笔记本兼容吗?你打赌!它也适用于合作实验室,因为我们知道你更喜欢选择你的武器。该工具旨在减少您查看数据所需编写的代码量,因此它是为易于使用而构建的。
In this screenshot, we’re using the tool to compare two classifiers (deep neural network on the x-axis, linear model on the y-axis) trained on the UCI Census Income Dataset to predict whether someone will earn more than $50,000 a year. Numbers closer to 1 indicate that a model is giving a stronger YES vote. The scatterplot shows the votes of one model versus the other. See the notebook here and play with it yourself if you’re feeling curious — no install required.
As expected, there’s a positive correlation but the models don’t give identical results. (Working as intended! They’re different models, after all.) If I’m curious about how the model votes are related to, say marital status, it’s very easy to find out — simply select that feature from the dropdown menu.
Voilà! Most of our dataset shows civil marriages and we see an interesting preponderance of other statuses where the models disagree with one another or both vote a strong no. Remember, this is analytics, so don’t jump to conclusions beyond our current dataset!
假设分析工具不会为您提供您可能想要探索数据的每种方式的每个视图的每个片段。但是它的设计很棒:第一次开始时不费力。它也适用于子样本,这意味着你可以快速浏览,而不必支付内存成本来摄取和处理你所有的数据。为速度欢呼!
它的设计非常棒:第一眼看起来不费吹灰之力。
战斗 AI 偏向
假设工具 也是你对抗 AI 偏见 的秘密武器。要了解原因,请在此查看我对 AI 偏见 的讨论。它捕捉偏见的功能并不是偶然的——该项目的核心团队有很大一部分来自谷歌大脑的 PAIR 倡议,旨在以人为中心的研究和设计,使人工智能伙伴关系富有成效,令人愉快,并且公平。
In the fairness tab, we can play with all kinds of uncomfortable questions. For example, we can find out where we’d have to set our classification thresholds (the ones you’d naively want to put at 50%) for males vs females in our test set to achieve demographic parity between them. Uh-oh.
更智能的 ML/AI 迭代
假设分析工具 整合了刻面工具,该工具在没有模型理解组件的情况下处理数据分析部分。
In the features tab, I can get a quick look at histograms to show me how my features are distributed. Oh my goodness, capital loss is a super imbalanced feature with only ~4% nonzero values. I’m already itching to try dropping it and rerunning both models. If you’ve been around the block a few times (or studied the math) you’ll know that putting something like that in a linear model is bad news indeed. I see similar trouble with capital gains. (If you insist on using ’em, how about doing some light feature engineering to combine them? Minuses are awesome.) Ah, and here’s a question for the more advanced analysts among you: can you see why optimizing for accuracy should make us very nervous?
What-If 把两者放在一起,帮你智能迭代。你可以这样想:要想知道在厨房下一步该做什么,你需要一种简便的方法来比较几种潜在食谱的美味度(通过模型理解),还需要了解你的购物袋里有什么(通过数据分析,这样你就不会不小心使用烂番茄。 Facets 让你看到你的配料,而 What-If 工具 更进一步,提供了加食谱对比。如果你一直在盲目地烹饪,你会喜欢这个用于迭代模型开发和训练的工具。
探索反事实
永远不要低估问自己假设问题的能力,比如“如果我们延长这个人的工作时间并改变他们的性别会怎么样?模型如何反应?” T he 假设分析工具是专门为让你更好地理解假设分析/ 反事实问题而设计的。该工具可以很容易地看到,如果你改变一个变量(最后!)并向您显示是否存在某个预测行为可疑的值,并让您看到分类从“否”到“是”的确切变化。尝试使用反事实选项,在不同的预测类别中找到一个数据点的最相似对应项。这是查看细微差异对模型输出的影响的好方法。**
Back to our first tab. That red point I’ve selected is one where the models are having an argument: neural network says nah, but linear model says a gentle yes to high income. What-If… I want to do a quick deep dive into that point off the diagonal? I simply click on it and there’s the info. Turns out the linear model is right, this is a high income earner. Moreover, it’s a married woman who works 10 hours per week. I love how quickly I could see that.
What’s this “visualize” thing on the left? Let’s see what happens if we try toggling the “counterfactual” setting.
Aha! Here’s the nearest buddy where neural network changes its mind and correctly predicts a large salary. And it is a buddy indeed: this is a male executive who works 45 hours a week. What-If… we do a deep dive and see which of these differences the models are most sensitive to?
Looking at the partial dependence plots, we can see that the neural network (blue) seems to expect pay to go up with hours worked, while the linear model (orange) slopes down. Curious. The statistician in me is shouting at all of us not to get excited — they’re probably both wrong in their own way, so we shouldn’t learn anything grand about the universe, but seeing how models react to inputs is very valuable for picking approaches to try next. Our mystery candidate’s lower hours worked look more compelling to the linear model (yeah, quiet down friends, obviously the economist in me is just as suspicious as the statistician). I bet we also want to take a quick look at other features here — how about gender…?
Interestingly, the linear model (orange) is not getting itself too excited about gender, but the neural network (blue) seems more reactive to it. How about our mystery woman’s question-mark of an occupation? Could that be contributing to her lower score by the neural network?
Whoa, while the linear model (orange) is stoic again, the neural network (blue) gives execs a pretty big prediction boost relative to those with missing occupation information. Now isn’t the time to say that snarky thing about linear models versus neural networks, is it? Well, maybe I’ll restrain myself… the whole point of the tool is to give you eyes on your data so you can iterate wisely, not let biases take you by surprise, and create a more awesome model faster. We’re not done yet! (But I sure have a few ideas I’m inspired to try next.)
Learn more about our two model types here.
假设分析工具有什么烦人的地方?
正在进行的工作
这个工具还不完善。例如,你偶尔会无意中发现一些肯定会让 Tufte 粉丝皱眉的事情——例如,下面的截图让我在最近的一次会议上咆哮。(如果你看不出为什么,这是一个很好的机会来上一堂数据 viz 课:为什么文本标签“年轻”和“不年轻”是唯一的视觉线索?为什么不塑形?因为我们正努力在这方面和其他方面做得更好,但是完美需要时间。作为合作的一部分,我代表你们大声疾呼,以帮助这些问题迅速消失。)
还有…那些轴标签呢?
无制导探索
这个工具会跟随你的好奇心,但是如果你没有创造力,你会怎么做呢?也许你希望这个工具更加规范,引导你的眼睛去关注什么是重要的?你的反馈在我们的雷达上,我们正在努力,但对于那些认为如果你的探索受到限制,美好的东西可能会丢失的人,不要害怕!我们相信选择,也明白不是每个人都想要事物的规定性,就像不是每个人都想玩有固定故事情节的电子游戏,而不是开放的世界。
限量定制
你想要阳光下的每一个定制,这是一个数据科学的说法。我也说过类似的话——我记得在统计学博士生的强制 SAS 培训中,我问的第一个问题是:“我如何自己编写这些函数,以便它们准确地完成我想要的功能?”。**
所以当你问关于假设工具的同样问题时,我会告诉你那天我的教授告诉我的:这就是原始的 T2 Python 和 T4 R T5 的用途!(或者,如果你真的要走那么远,上帝会帮助我们的,C/C++。)像假设工具这样的可视化工具不是替代品,它们是加速器。他们用最少的努力给你第一眼,所以你知道在哪里挖掘,但是一旦你选择了你的位置,你可能会想要写你自己的代码去完全按照你喜欢的方式挖掘。如果你是一名专家分析师,有自己令人敬畏的做事方式,我们的目标是帮助你缩小搜索范围,这样以后就可以少写代码,而不是取代你的整个方法。****
张量流术语
另一件让我恼火的事情(我敢肯定,还有其他类似于统计学家的)是,为了我们的 TensorFlow 用户群,我们不得不在术语上做出妥协,保留了一些 TensorFlow 遗留的行话,这让传统的数据科学家想要敲打一些东西。是啊,那个“推论”不是 推论 。TensorFlow 是一个热闹的词汇桶,被挪用并迅速被误用——各位书呆子,甚至不要让我开始使用它的“实验”、“验证”、“估计器”或批量与小批量之类的东西……就让这成为一个教训,当只有你和你的朋友在车库里蹦出一些想法时,要仔细思考你叫什么。如果项目成功了,每个人都必须接受你的选择,那该怎么办?叹气。
判决
总而言之,这些抱怨是微不足道的。总的来说,我真的很喜欢假设工具,我希望你也会喜欢。
看它在行动!
虽然假设分析工具不是为新手设计的(你需要知道你的基本方法,如果这不是你第一次使用 Python 或笔记本的话最好),但它对执业分析师和 ML 工程师来说是一个令人敬畏的催化剂。
如果你渴望看到运行中的假设分析工具,你不需要安装任何东西——只需点击这里。我们有大量令人眼花缭乱的演示和文档。如果你想真正开始使用它,你甚至不需要安装 TensorFlow 。简单地 pip 安装 witwidget 。
如果你是谷歌云平台的粉丝,你可能会对刚刚宣布的新集成感到兴奋。现在,您只需调用一个方法就可以将您的 AI 平台模型连接到假设工具!在这里查看如何。
感谢阅读!人工智能课程怎么样?
如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:
Enjoy the entire course playlist here: bit.ly/machinefriend
喜欢作者?与凯西·科兹尔科夫联系
让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?用这个表格联系。