TowardsDataScience 博客中文翻译 2016~2018(一百一十五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

机器学习算法可以帮助我们评估金融决策的风险

原文:https://towardsdatascience.com/financial-data-analysis-bf4b5e78c45c?source=collection_archive---------9-----------------------

贷款资格预测:数据处理-2

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

在本系列的最后一部分的中,我展示了基本的数据处理操作,包括:移除恒定特征、移除重复特征、移除重复行、移除与 85%缺失值相关的特征>。这些是我们需要在几乎每个数据集上执行的初步步骤。完成上述处理后,我们最终将特征从 153 个减少到 93 个。在这一部分,我将手动检查每个特性,处理它们并删除不必要的特性。

在最后一部分中,我们将所有数据点存储到一个数据帧“df”中。让我们开始检查数据的形状。

df.shape
(457728, 93)

我们看到现在有 93 个特征。在我们检查每个特性之前,我们需要创建一个用于可视化的绘图函数。我从这个链接借用了下面的函数。

上述函数接受两个参数;第一个是特征名,第二个是布尔变量:特征是连续的还是分类的。如果特征是连续的,那么函数绘制两个子图:(1)特征的分布和(2)基于 loan_status 类的两个箱线图。另一方面,如果特征是分类的,那么第一个子图是计数图,第二个子图基于 group_by loan_status 类。

下面的代码大多是不言自明的。我有时会省略详细的解释。

功能 0–10:

df.iloc[0:5, 0: 10]

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

First 10 features

功能:贷款金额

### Feature: loan_amnt
-------------------------------len(df.loan_amnt.value_counts())
1415plot_feature('loan_amnt', True)

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

看起来所有的贷款都不是唯一的。一定量出现几次。可能是这个原因;公司有一定范围或一定额度可以放贷。

功能:期限

### Feature: term
-------------------------------df.term = df.term.str.replace('months', '').astype(np.int)
df.term.value_counts()36    341042
60    116686
Name: term, dtype: int64plot_feature('term', False)

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

功能:利率

### Feature: int_rate
-------------------------------df.int_rate = df.int_rate.str.replace('%', '').astype(np.float32)
len(df.int_rate.value_counts())
200
plot_feature('int_rate', True)

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

看起来,那些无力还贷并最终被取消贷款的申请人不得不支付更高的利率。

特征:坡度和路基

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

看起来等级和子等级与贷款状态具有相同的形状和关系。在这种情况下,我会保留 sub_grade,因为它比等级包含更多信息。

特征:职务

### Feature: emp_title
-------------------------------
len(df.emp_title.value_counts())
128310It looks like emp_title has lots of unique value, which may not strongly be associated with predicted loan_status. Therefore, I delete the feature.features_to_be_removed.extend(['emp_title', 'id'])

11–20 个特征

df.iloc[0:5, 6: 20] 

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

从右边的图来看,emp _ lenght 似乎不是一个强有力的预测器,并且与贷款状态关系不大。我现在保留这个功能,基于模型性能我们可能会删除它。

功能:Home_ownership

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

功能:验证状态

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

verification_status 功能在某种程度上是有区别的,因为来源经过核实的申请人更有可能被注销,这有点复杂。

功能:Issue_d

### Feature: issue_d
### ------------------df.issue_d.value_counts()
Oct-2014    33699
Jul-2014    25974
Jul-2015    23990
Jan-2015    22750
Oct-2015    22431
Nov-2014    21186
Apr-2015    20097
Dec-2015    19106
May-2015    17964
Aug-2015    17492
Apr-2014    17140
May-2014    17133
Aug-2014    16780
Nov-2015    16540
Jun-2015    15304
Jun-2014    15207
Mar-2015    14997
Mar-2014    14988
Feb-2015    14464
Jan-2014    14464
Feb-2014    13945
Sep-2015    13838
Sep-2014     9344
Dec-2014     8283
Jan-2017     5912
Mar-2017     5008
Feb-2017     4241
May-2017     3644
Apr-2017     3431
Jun-2017     2849
Jul-2017     2366
Aug-2017     1863
Sep-2017     1298
Name: issue_d, dtype: int64

“issude _ d”特征是字符串。由于我们正在处理三年的数据,并保持我们的模型独立于年份,所以我只提取月份,然后将它们转换成类别。

df['issue_month'] = pd.Series(df.issue_d).str.replace(r'-\d+', '')
plot_feature('issue_month', False)

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

看起来,在 12 月份借款的人比在其他月份借款的人更有可能被冲销。确实有趣。

df.issue_month = df.issue_month.astype("category", categories=np.unique(df.issue_month)).cat.codesdf.issue_month.value_counts()
10    56130
5     52330
4     43126
0     40668
8     38741
9     37726
1     36135
7     34993
6     33360
3     32650
2     27389
11    24480
Name: issue_month, dtype: int64df['issue_year'] = pd.Series(df.issue_d).str.replace(r'\w+-', '').astype(np.int)df.issue_year.value_counts()
2015    218973
2014    208143
2017     30612
Name: issue_year, dtype: int64

由于 URL 与 loan_status 无关,我干脆把它去掉。

功能:用途

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

看样子,目的可以很好的区别对待。例如,为可再生能源贷款的人比为汽车或教育目的贷款的人更有可能被注销。

因为标题和邮政编码有许多唯一的值,所以我简单地将它们从特征空间中删除。

特征:地址状态

“地址状态”特征具有五十个唯一值,因为有五十个状态。如果我们看下面的图表,我们会发现某些州的申请者比其他人偿还的更多。因此,这个特征可能是歧视性的。

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

21–30 功能

31–40 个特征

df.iloc[0:5, 25: 40]

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

41–50 个特征

df.iloc[0:5, 35: 50]

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

51–60 特征

61–70 特征

71–80 特征

81–90 特征

91 至其余特征

df.iloc[0:5, 85:]

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

移除特征

手动检查每个功能后,我最终有 61 个不相关的。让我们看看选择要删除的功能。

len(set(features_to_be_removed))
61print(features_to_be_removed)['emp_title', 'id', 'url', 'title', 'zip_code', 'issue_d', 'mths_since_last_delinq', 'mths_since_last_record', 'inq_last_6mths', 'mths_since_last_delinq', 'mths_since_last_record', 'total_pymnt', 'total_pymnt_inv', 'total_rec_prncp', 'total_rec_int', 'total_rec_late_fee', 'recoveries', 'collection_recovery_fee', 'last_pymnt_d', 'last_pymnt_amnt', 'last_credit_pull_d', 'last_fico_range_high', 'last_fico_range_low', 'collections_12_mths_ex_med', 'mths_since_last_major_derog', 'acc_now_delinq', 'tot_coll_amt', 'tot_cur_bal', 'total_rev_hi_lim', 'avg_cur_bal', 'bc_open_to_buy', 'bc_util', 'chargeoff_within_12_mths', 'delinq_amnt', 'mo_sin_old_il_acct', 'mo_sin_old_rev_tl_op', 'mo_sin_rcnt_rev_tl_op', 'mo_sin_rcnt_tl', 'mths_since_recent_bc', 'mths_since_recent_bc_dlq', 'mths_since_recent_inq', 'mths_since_recent_revol_delinq', 'num_accts_ever_120_pd', 'num_actv_bc_tl', 'num_actv_rev_tl', 'num_bc_sats', 'num_bc_tl', 'num_il_tl', 'num_op_rev_tl', 'num_rev_accts', 'num_rev_tl_bal_gt_0', 'num_sats', 'num_tl_120dpd_2m', 'num_tl_30dpd', 'num_tl_90g_dpd_24m', 'num_tl_op_past_12m', 'pct_tl_nvr_dlq', 'percent_bc_gt_75', 'tot_hi_cred_lim', 'total_bal_ex_mort', 'total_bc_limit', 'debt_settlement_flag', 'total_il_high_credit_limit']

最后,我放弃上述所有功能:

df_selected = df.drop(list(set(features_to_be_removed)), axis = 1)
df_selected.shape(457728, 36)

在上面的代码中,我们看到有 36 个最终特性为创建贷款预测模型做好了准备。让我们也检查在所选择的 36 个特征中是否有任何缺失值。

如果运行上面的代码,您会看到“dti”和“revol_util”分别缺少 21 和 223 个值。我使用 panda 的 dropna() 方法来删除那些与缺失值相关的例子。

特征编码

是时候对一些分类特征进行编码了。在下面的代码中,我对“目的”、“家庭所有权”、“年级”、“子年级”、“地址状态”进行了编码:

好了,让我们保存包含所选要素的最终数据集。

df_selected.to_csv('./data/df_selected.csv', index = False)

系列的下一部分中,我将进行一些探索性的分析。如果可能的话,做一些特征工程。与此同时,如果您对这部分有任何疑问,请在下面写下您的意见,或者联系我:

Email: sabbers@gmail.com
LinkedIn: [https://www.linkedin.com/in/sabber-ahamed/](https://www.linkedin.com/in/sabber-ahamed/)
Github: [https://github.com/msahamed](https://github.com/msahamed)
Medium: [https://medium.com/@sabber/](https://medium.com/@sabber/)

利用数据科学找到你喜欢的音乐

原文:https://towardsdatascience.com/find-music-you-like-by-using-data-science-1920c4da12f5?source=collection_archive---------6-----------------------

看看 Outlier 的新播客的第一集:数据驱动的讨论!

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

我很高兴地宣布我们的播客“数据驱动的讨论”正式发布。在数据驱动的讨论中,我们与许多行业的领导者交谈,询问他们如何使用数据来帮助他们的企业取得成功。

在这第一集我采访了 亚历克斯·怀特 。Alex 是 Next Big Sound 的创始人和负责人,该数据集团位于领先的在线音乐服务: Pandora 。音乐是一个竞争激烈的行业。尽管音乐行业是由艺术创造力驱动的,但它也是由数据驱动的。Alex 向我们介绍了获得可靠的音乐数据有多困难,以及数据如何成为竞争优势。

在本次讨论中,我们将回答许多关于该行业的问题,包括:

  • 像 Next Big Sound 这样的服务是如何收集人们对音乐看法的数据的? (3:28)
  • Alex 在评估商业智能工具时寻找什么? (11:49)
  • 妮琪·米娜是如何骗过 Next Big Sound 的高级算法的? (13:35)

听下面这一集:

如果你喜欢这一集并想听更多,一定要给我们留下评论,并在 苹果播客 上订阅数据驱动讨论。

找出名人在推特上谈论最多的话题

原文:https://towardsdatascience.com/find-out-what-celebrities-tweet-about-the-most-6f498d89266b?source=collection_archive---------7-----------------------

使用不到 40 行 R 代码的 WordCloud

猜猜是谁的 twitter 句柄给了这个词 cloud?这里有足够的暗示。你说得对,这是吴恩达在 Coursera 上发布的关于他新的深度学习课程的推文!看到数据运行总是很有趣;不是吗?让我们试着为三位世界领袖创建一个类似的 wordcloud,即。美国总统唐纳德·特朗普、印度总理纳伦德拉·莫迪和俄罗斯总统弗拉基米尔·普京。

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

单词云是一种数据可视化技术,其中每个单词的大小表明其在相关文本中的频率或重要性(即,单词在语料库中出现的次数越多,单词就越大)

既然您对使用 R 从 twitter 句柄创建一个 wordcloud 感兴趣,我将有把握地假设您已经拥有了这两者,一个您名下的 Twitter 帐户和安装在您机器上的 RStudio。如果没有,现在是时候了😊

你还必须有一个 Twitter 开发者账户,作为提取推文的媒介。如果你需要帮助,这里有一个快速指南

让我们开始吧。我们将采取以下步骤来完成这项任务:

  1. 使用句柄获取 Twitter 数据(2 行代码!)
  2. 为视觉化做准备(真正有趣的部分)
  3. 最后,创建一个单词云(单行代码!)

提取推文

让我们加载必要的库并与 Twitter 建立连接

#Getting tweets from twitter
library(twitteR)
#Twitter-R Authentication
library(ROAuth)
#Text processing
library(stringr)
#Text mining 
library(tm)
#Wordcloud creation
library(wordcloud)#Connect to twitter API using the saved credentials
load("twitter authentication.Rdata")
setup_twitter_oauth(credentials$consumerKey, credentials$consumerSecret, credentials$oauthKey, credentials$oauthSecret)

我们现在去收集一些数据。这里有几件事需要注意-

  1. 一个人只能从关注与 API 相关联的 Twitter 账户的用户那里获得数据。或者,从公共帐户(相对于私有帐户)
  2. Twitter API 限制用户可以从特定时间线获得的推文数量为 3200 条,包括 RTs,即使它被设置为 FALSE。不过,有一些工具可以让你绕过这个限制。在这篇文章中,我们将坚持自己的极限
  3. Twitter API 还对一次可以收集多少条推文有一个速率限制。如果您试图一次收集太多,它可能会失败或返回部分结果。解决这个问题的最好方法是在 API 调用之间引入延迟,这样代码运行时您就不必在旁边了

获取你想查找的人物的 twitter 账号。确保这些是真实的 twitter 帐户,否则会出现错误。
screenName <- c(‘realDonaldTrump’, ‘PutinRF_Eng’, ‘narendramodi’)

使用 twitteR 收集关于这些句柄的信息。
checkHandles <- lookupUsers(screenName)

获取每个句柄的用户数据,并创建一个便于访问的数据框。用这个检查推特和私人账户的数量。删除私人帐户(如果有)。

UserData <- lapply(checkHandles, function(x) getUser(x))
UserData <- twListToDF(UserData)
table(UserData$name, UserData$statusesCount) #Check tweet count
table(UserData$name, UserData$protected) #Check Private Accounts
usernames <- subset(UserData, protected == FALSE) #Public Accounts
usernames <- as.list(usernames$screenName)

接下来,我们从用户时间轴中获取推文列表,将它们转换为数据帧,并在进行另一个 API 调用之前等待 5 分钟。将所有数据帧合并成一个数据帧,对推文进行预处理。请注意,我们将只能获得这些句柄的 3200 条最新推文。特朗普和莫迪发的推特远不止这些。

x <- userTimeline(‘realDonaldTrump’,n=3200,includeRts = FALSE)#Convert tweets list to dataframe
TrumpData <- twListToDF(x)#Wait 5 minutes 
Sys.sleep(300)x <- userTimeline(‘PutinRF_Eng’,n=3200,includeRts = FALSE)
PutinData <- twListToDF(x)
Sys.sleep(300)x <- userTimeline(‘narendramodi’,n=3200,includeRts = TRUE)
ModiData <- twListToDF(x)Trump.df <- data.frame(TrumpData)
Putin.df <- data.frame(PutinData)
Modi.df <- data.frame(ModiData)#Now create a dataframe that combines all of the collected tweets
tweets <- data.frame()
tweets <- Trump.df
tweets <- rbind(tweets,Putin.df)
tweets <- rbind(tweets,Modi.df)

预处理推文

既然我们已经将所有相关的推文放在了一个地方,那么是时候对它们进行预处理了。我这里的意思是,让我们去掉不需要的字符、符号和单词。您不希望文字云中出现图形字符、文章、符号和数字。您可以根据需要跳过这些预处理步骤。

#Convert tweets to ASCII to avoid reading strange characters
iconv(tweets$text, from=”UTF-8", to=”ASCII”, sub=””)#Clean text by removing graphic characters            tweets$text=str_replace_all(tweets$text,"[^[:graph:]]", " ")#Remove Junk Values and replacement words like fffd which appear because of encoding differences            
tweets$text <- gsub("[^[:alnum:]///' ]", "", tweets$text)#Convert all text to lower case            
tweets$text <- tolower(tweets$text)#Remove retweet keyword            
tweets$text <- gsub("rt", "", tweets$text)#Remove Punctuations            
tweets$text <- gsub("[[:punct:]]", "", tweets$text)#Remove links            
tweets$text <- gsub("http\\w+", "", tweets$text)#Remove tabs            
tweets$text <- gsub("[ |\t]{2,}", "", tweets$text)#Remove blankspaces at begining            
tweets$text <- gsub("^ ", "", tweets$text)#Remove blankspaces at the end            
tweets$text <- gsub(" $", "", tweets$text)#Remove usernames 
tweets$text <- gsub("@\\w+", "", tweets$text)

一旦我们对 tweets 进行了预处理,现在让我们为每个句柄创建一个语料库,并删除诸如“my”、“do”、“today”等停用词。

#After preprocessing the data, subset for tweets for each handle
Trump <- subset(tweets, screenName==“realDonaldTrump”, select= text)
Putin <- subset(tweets, screenName== “PutinRF_Eng”, select= text)
Modi <- subset(tweets, screenName== “narendramodi”, select= text)#Create corpus of individual twitter handles 
Trump <- Corpus(VectorSource(Trump))
Putin <- Corpus(VectorSource(Putin))
Modi <- Corpus(VectorSource(Modi))#Remove English Stopwords from the tweets
Trump <- tm_map(Trump, removeWords, stopwords(“en”))
Putin <- tm_map(Putin, removeWords, stopwords(“en”))
Modi <- tm_map(Modi, removeWords, stopwords(“en”))

创建 WordCloud

如果你熬过了所有这些步骤到达这里,你应该得到一个诗意的款待!(宣称即将开始令人兴奋或危险的活动)看我的…

现在我们已经拥有了我们需要的一切,
让我们满足我们的贪婪
把他们发的微博做成云,
就像当初我们同意的那样

一个函数wordcloud()让你定义 wordcloud 创建的参数。输入语料库、要显示的单词的最小频率、云的大小和形状、单词的颜色和顺序、显示的最大单词等。调整这些,玩一玩。

wordcloud(Trump,min.freq = 3, scale=c(6,0.5),colors=brewer.pal(8, “Dark2”),random.color= FALSE, random.order = FALSE, max.words = 110)wordcloud(Putin,min.freq = 4, scale=c(7,0.8),colors=brewer.pal(8, “Dark2”),random.color= FALSE, random.order = FALSE, max.words = 100)wordcloud(Modi,min.freq = 3, scale=c(6,0.5),colors=brewer.pal(8, “Dark2”),random.color= FALSE, random.order = FALSE, max.words = 110)

语法及解释( 来源 ):

wordcloud(words, freq, min.freq, scale, max.words, random.order, random.color, rot.per,colors, ordered.colors,…)
  1. 单词:要在云中绘制的单词
  2. freq:这些词在文本中的出现频率
  3. 最小频率:频率低于最小频率的单词将不会被标绘
  4. scale:长度为 2 的向量,表示单词大小的范围
  5. max.words:要绘制的最大字数;最不常用的词语被删除
  6. random.order:随机排列单词。如果为假,它们将以递减的频率绘制
  7. random.color:从颜色中随机选择颜色。如果为假,则根据频率选择颜色
  8. rot.per:旋转 90 度的比例字
  9. 颜色:颜色词从最少到最多
  10. ordered.colors:如果为 true,则颜色按顺序分配给单词

您可以根据您选择的顺序和颜色向您的单词云添加更多信息。您可以指定非随机颜色(random.color = FALSE ),这将基于频率进行颜色分配,然后使用调色板(来自 RColorBrewer 包的 brewer.pal)为颜色选择一个值,该值按照您喜欢的顺序排列。

你也可以根据他们的情绪给单词标上颜色,比如积极和消极的情绪。这可以通过在数据库中增加一个定义该属性的列来实现,然后用它来定义颜色,如下所示–

wordcloud(df$words,df$freq, min.freq = 3, scale=c(6,0.5), random.color= FALSE, ordered.colors=TRUE, colors=brewer.pal(8, “Dark2”)[factor(df$sentiment)], random.order = FALSE, max.words = 110)

创建云之后,您可能会看到一些不相关的单词或数字,并且没有提供任何附加信息。在这种情况下,你需要再调整一下你的云。例如,当我创建这些云时,我看到‘amp’和‘will’这两个词是特朗普和莫迪的云中出现频率最高的词。我使用了下面的代码行并删除了它们。下面是我做了这些修改后得到的单词云。

#Remove numbers if necessary
#Putin <- tm_map(Putin, removeNumbers)#Remove specific words if needed
#Trump <- tm_map(Trump, removeWords, c(‘amp’,’will’))
#Modi <- tm_map(Modi, removeWords, c(‘amp’,’will’))

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

Russian President will make America Great again with Indian People 😝

我还创建了一个 GitHub 库,所有代码都在一个地方。那个为阿米塔布·巴坎、桑德尔·皮帅、维拉特·科利和吴恩达创造了文字云

结束语

除了了解一个特定的 Twitter 账号发布的最多的是什么,我们还可以使用 wordclouds 做很多其他很酷的事情。一个这样的例子是对产品的情感分析。使用 hashtag 获取关于产品的所有推文,处理它们以获得有意义的单词并构建云,砰!如果最常用的词是正面的,你就知道你的产品做得很好。

希望你玩推特玩得开心。如需更多此类文章,请关注该出版物,并在下面发表评论以获取问题或建议。

使用自动编码器的相似图像检索

原文:https://towardsdatascience.com/find-similar-images-using-autoencoders-315f374029ea?source=collection_archive---------2-----------------------

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

Fig 1: Querying a test burger image in a small training set of steakhouse food images

在本文中,我们将解释如何使用自动编码器在未标记的图像数据集中查找相似的图像。除此之外,我们还提供了一个图像相似性推荐系统的 Python 实现,该系统在牛排餐厅的食物图像上进行训练,网址为:

https://github . com/ankonzoid/artificio/tree/master/image _ retrieval

更多我关于深度学习和强化学习的博客、教程、项目,请查看我的 和我的 Github

问:什么是自动编码器?

自动编码器是由编码器和解码器组成的神经网络。目标是用编码器压缩您的输入数据,然后用解码器解压缩编码的数据,以便输出是您的原始输入数据的良好/完美的重建。

问:为什么自动编码器有用?

作为一个黑盒,自动编码器可能看起来毫无用处:如果我们已经有了数据,为什么我们还要费心去重建一个不那么完美的数据副本呢?说得好。但是 autoencoder 的真正价值在于编码器和解码器本身是独立的工具,而不是重建输入数据的联合黑盒。例如,如果我们充分降低编码维度,我们可以指导自动编码器在训练过程中学习数据的最显著特征(并忽略数据的“噪声”),启发式方法是,自动编码器被迫减少其重建误差,限制只有有限的可用自由度,因此自动编码器将优先保留数据的最宏观细节。注意,自动编码器属于无监督学习的范畴,因为基础事实目标是数据本身。训练自动编码器通常通过反向传播来完成,输入数据和重构之间的差异是权重更新的误差在整个网络中传播的原因。

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

Fig 2: A schematic of how an autoencoder works. An image of a burger is encoded and reconstructed.

好的好的。既然我们可以训练一个自动编码器,那么我们如何将自动编码器用于实际目的呢?事实证明,编码器给出的编码表示(嵌入)是相似性检索的重要对象。大多数原始和高度非结构化的数据,例如您的面部图像,通常嵌入在非人类可解释的向量空间表示中。因此,我们可以使用一个训练有素的编码器将你的面部图像转换为更低维的嵌入,而不是在 RGB 像素空间中费力地操作,这有望成为更有意义的维度,如“图像亮度”、“头型”、“眼睛位置”、“头发颜色”等。利用这种压缩编码表示,嵌入之间的简单向量相似性度量(例如余弦相似性)将在图像之间创建更多人类可解释的相似性。

相似图像检索推荐码

利用我们所描述的通过训练过的编码器(从自动编码器中提取)来使用嵌入图像的方法,我们在这里提供一个简单的具体例子,说明我们如何在数据库中查询和检索相似的图像。如前所述,我们类似的图像推荐系统的代码可以在以下位置找到:

https://github . com/ankonzoid/artificio/tree/master/image _ retrieval

具体来说,我们使用一个小型的训练数据库,包含 5 种常见的牛排餐厅项目类别:牛排、汉堡、沙拉、薯条、芦笋。在下图中,我们展示了牛排餐厅食物嵌入的 t-SNE 可视化(图 3),测试汉堡图像的 top k=5 图像检索(图 4),以及一些训练牛排餐厅食物图像的一些重建图像(图 5)。所提供的算法的性能远非完美,但为任何对深度学习图像检索感兴趣的人提供了一个良好的起点。

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

Fig 3: t-SNE visualizations of the training steakhouse food item images

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

Fig 4: Test burger image retrieval from the training set

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

Fig 5: Steakhouse food item image reconstructions using a convolutional autoencoder

使用 OpenCV 和 Tensorflow 实时查找停车位置

原文:https://towardsdatascience.com/find-where-to-park-in-real-time-using-opencv-and-tensorflow-4307a4c3da03?source=collection_archive---------5-----------------------

用数据做酷事!

介绍

有多少次你开车在停车场转来转去寻找停车位。如果你的手机能告诉你最近的停车位在哪里,那该有多方便啊!

事实证明,这是一个使用深度学习和 OpenCV 相对容易解决的问题。只需要一张停车场的航拍照片。请看下面的 GIF,我的模型突出显示了洛杉矶机场停车场所有可用的停车位,并显示了可用停车位的数量。最棒的是,这一切可以实时工作!

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

Real time parking spot detection

你可以找到我在我的 Github repo 上使用的代码。

步骤概述

建立停车检测模型有两个主要步骤:

  1. 检测所有可用停车位的位置
  2. 识别停车位是空闲的还是被占用的

由于这里的摄像机视图已经安装,我们可以使用 OpenCV 对每个停车点进行一次性映射。一旦你知道每个停车点的位置,你就可以使用深度学习来预测它是否空置。

检测所有可用停车位的位置

我用来检测停车点的基本想法是,这里所有的停车点分隔线都是水平线,一列中的停车点大致等距。我先用 Canny 边缘检测得到一个边缘图像。我还屏蔽了没有停车位的区域。见下文:

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

Canny edge detection output

然后我在边缘图像上做了霍夫线变换,画出了它能识别的所有线。我通过只选择斜率接近于零的线来分离水平线。请参见下面的霍夫变换输出:

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

Line Detection using HoughLines

如您所见,hough lines 在识别停车线方面做得相当不错,但输出并不清晰——许多停车线被多次检测到,而有些却被遗漏了。那么我们如何清理这个?

然后我用观察和直觉从这里开始。使用 hough lines 返回的坐标,我对 x 观察值进行聚类,以确定主要的停车车道。聚类逻辑通过识别检测到的车道线的 x 坐标中的间隙来工作。这让我能够识别这里的 12 条停车道。见下文

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

Identify parking lanes by clustering x-coordinates from hough lines

如果这一切看起来很复杂,不要担心——我已经在 github 上的 jupyter 笔记本中一步一步地记录了代码。

现在我很清楚所有的停车道在哪里,我通过假设所有的停车位都是相同的大小来识别每个单独的停车位,这是一个合理的假设。我目测了一下结果,以确保尽可能准确地捕捉到斑点之间的边界。我终于能够标出每个停车位了。见下文。

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

Each parking spot marked out

现在我们完成了——我们可以为每个点分配一个 ID,并将它的坐标保存在字典中。我把这本字典腌了起来,以便以后检索。这在这里是可能的,因为相机是固定的,我们不需要一次又一次地计算每个点在它视野中的位置。

识别该点是否被标记

现在我们有了停车地图,我认为有几种方法可以确定这个位置是否被占用:

  1. 使用 OpenCV 检查一个点的像素颜色是否与一个空停车位的颜色一致。这是一个简单的方法,但容易出错。例如,照明的变化会改变一个空停车位的颜色,这将使这种逻辑在一天中难以工作。此外,如果逻辑可能会将灰色的汽车混淆为空停车位
  2. 使用对象检测来识别所有汽车,然后检查汽车的位置是否与停车位重叠。我尝试了一下,发现可以实时工作的对象检测模型真的很难检测小尺寸的对象。不超过 30%的汽车被检测到
  3. 使用 CNN 查看每个停车点,并预测是否被占用。这种方法最终效果最好

要建立一个 CNN,我们需要有有车和没有车的停车场的图像。我提取了每个景点的图像,并将其保存在文件夹中,然后将这些图像分组为已占用或未占用。我也在 Github 上分享了这个培训文件夹。

由于在尺寸为 1280x720 的图像中有接近 550 个停车点,所以每个停车点的大小只有大约 15x60 像素。请参见以下空位置和已占用位置的示例图像:

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

Occupied spot

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

empty spot

然而,由于被占用的位置和空的位置看起来很不一样,这对 CNN 来说应该不是一个挑战性的问题

然而,我只有大约 550 两个类的图像,所以决定使用转移学习的前 10 层 VGG 和添加一个单一的 softmax 层到 VGG 模型的输出。你可以在这里找到这个迁移学习模型的代码。模型的验证准确率达到了 94% 。见下文:

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

CNN model test and train accuracies

现在,我将停车点检测与 CNN 预测器结合起来,构建了一个停车点检测器。它惊人的准确。

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

Empty Spot Predictions.

我还在笔记本中包含了在视频流中运行这个的代码。

结论

我惊讶于现在链接不同的工具并使用深度学习来构建实际应用变得如此容易。我在两个下午做了这项工作。

进一步探索的几个额外想法:

  • 如果停车点检测逻辑可以扩展到任何可能使用深度学习的停车地图上,那将非常好。OpenCV 的局限性在于需要针对每个用例进行调优
  • CNN 中使用的 VGG 模型是一个相当重的模型。愿意尝试重量更轻的模型

我有自己的深度学习咨询公司,喜欢研究有趣的问题。我已经帮助许多初创公司部署了基于人工智能的创新解决方案。请到 http://deeplearninganalytics.org/来看看我们。

你也可以在https://medium.com/@priya.dwivedi看到我的其他作品

如果你有一个我们可以合作的项目,请通过我的网站或 info@deeplearninganalytics.org 联系我

使用 Python 中的客户细分找到您的最佳客户

原文:https://towardsdatascience.com/find-your-best-customers-with-customer-segmentation-in-python-61d602f9eee6?source=collection_archive---------1-----------------------

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

Photo credit: Pixabay

概观

当谈到找出谁是你最好的客户时,老 RFM 矩阵原则是最好的。RFM 代表近期、频率和货币。是一种利用过往购买行为将客户分组的客户细分技术。

RFM 分数计算

最近度®: 自上次购买后的天数
频率(F): 总购买次数
货币价值(M): 该客户的总消费金额

步骤 1:计算每个客户的 RFM 指标。

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

Source: Slideshare

步骤 2:将段号添加到 RFM 表中。

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

Source: Slideshare

第三步:根据最佳客户的 RFM 得分(得分 111)进行排序。

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

Source: Blast Analytics Marketing

由于 RFM 是基于用户活动数据,我们首先需要的是数据。

数据

我们将使用的数据集与我们进行购物篮分析在线零售数据集时的数据集相同,可以从 UCI 机器学习库下载。

import pandas as pd
import warnings
warnings.filterwarnings('ignore')df = pd.read_excel("Online_Retail.xlsx")
df.head()
df1 = df

该数据集包含一家总部位于英国的注册在线零售商在 2010 年 1 月 12 日和 2011 年 9 月 12 日之间发生的所有交易。

加载数据需要几分钟,所以我保留了一份备份。

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

探索数据—验证和新变量

  1. 重要列中缺少值;
  2. 每个国家的客户分布情况;
  3. 单价和数量应该> 0;
  4. 发票日期应为< today.
df1.Country.nunique()

38

共有 38 个独特的国家,如下所示:

df1.Country.unique()

数组([‘英国’、‘法国’、‘澳大利亚’、‘荷兰’、‘德国’、
、‘挪威’、‘爱尔兰’、‘瑞士’、‘西班牙’、‘波兰’、‘葡萄牙’、
、‘意大利’、‘比利时’、‘立陶宛’、‘日本’、‘冰岛’、【T28 '、‘海峡群岛’、‘丹麦’、‘塞浦路斯’、‘瑞典’、‘奥地利’、【T29 '、‘以色列’、‘芬兰’、‘巴林’、‘希腊’、‘香港’、‘新加坡’、
、‘黎巴嫩’、‘阿拉伯联合酋长国’、‘沙特阿拉伯’、‘捷克’、
、‘加拿大’、'未指明

customer_country=df1[['Country','CustomerID']].drop_duplicates()customer_country.groupby(['Country'])['CustomerID'].aggregate('count').reset_index().sort_values('CustomerID', ascending=False)

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

数据中 90%以上的客户来自英国。一些研究表明,客户群因地理位置而异,因此这里我将数据仅限于英国。

df1 = df1.loc[df1['Country'] == 'United Kingdom']

检查每列中是否有缺失值。

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

CustomerID 列中缺少 133,600 个值,因为我们的分析是基于客户的,所以我们将删除这些缺少的值。

df1 = df1[pd.notnull(df1['CustomerID'])]

检查单价和数量列中的最小值。

df1 = df1[pd.notnull(df1['CustomerID'])]

0.0

df1.Quantity.min()

-80995

删除数量列中的负值。

df1 = df1[(df1['Quantity']>0)]
df1.shape
df1.info()

(354345,8)

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

清理完数据后,我们现在处理 354,345 行和 8 列。

检查每列的唯一值。

def unique_counts(df1):
   for i in df1.columns:
       count = df1[i].nunique()
       print(i, ": ", count)
unique_counts(df1)

发票号:16649
库存代码:3645
描述:3844
数量:294
发票日期:15615
单价:403
客户 ID : 3921
国家:1

为总价添加一列。

df1['TotalPrice'] = df1['Quantity'] * df1['UnitPrice']

找出数据中的第一个和最后一个订单日期。

df1['InvoiceDate'].min()

时间戳(’ 2010–12–01 08:26:00))

df1['InvoiceDate'].max()

时间戳(’ 2011–12–09 12:49:00 ')

由于最近是针对某个时间点计算的,并且最后一个发票日期是 2011 年 12 月 9 日,因此我们将使用 2011 年 12 月 10 日来计算最近。

import datetime as dt
NOW = dt.datetime(2011,12,10)df1['InvoiceDate'] = pd.to_datetime(df1['InvoiceDate'])

RFM 客户细分

RFM 分割就是从这里开始的。

创建一个 RFM 表

rfmTable = df1.groupby('CustomerID').agg({'InvoiceDate': lambda x: (NOW - x.max()).days, 'InvoiceNo': lambda x: len(x), 'TotalPrice': lambda x: x.sum()})rfmTable['InvoiceDate'] = rfmTable['InvoiceDate'].astype(int)
rfmTable.rename(columns={'InvoiceDate': 'recency', 
                         'InvoiceNo': 'frequency', 
                         'TotalPrice': 'monetary_value'}, inplace=True)

计算每个客户的 RFM 指标

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

解释:

  • CustomerID 12346 的频率为 1,货币价值为 77,183.60 美元,最近时间为 325 天。
  • CustomerID 12747 的频率为 103,货币值为 4,196.01 美元,最近时间为 2 天

让我们检查一下第一个顾客的详细情况。

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

第一位顾客只购物过一次,购买了一件数量巨大的产品(74,215 件)。单价很低;也许清仓大甩卖。

拆分指标

将指标分割成多个部分的最简单方法是使用四分位数。

  1. 这给了我们详细分析的起点。
  2. 4 段易于理解和解释。
quantiles = rfmTable.quantile(q=[0.25,0.5,0.75])
quantiles = quantiles.to_dict()

创建分段 RFM 表

segmented_rfm = rfmTable

最低的最近,最高的频率和金额是我们最好的客户。

def RScore(x,p,d):
    if x <= d[p][0.25]:
        return 1
    elif x <= d[p][0.50]:
        return 2
    elif x <= d[p][0.75]: 
        return 3
    else:
        return 4

def FMScore(x,p,d):
    if x <= d[p][0.25]:
        return 4
    elif x <= d[p][0.50]:
        return 3
    elif x <= d[p][0.75]: 
        return 2
    else:
        return 1

向新创建的分段 RFM 表添加分段编号

segmented_rfm['r_quartile'] = segmented_rfm['recency'].apply(RScore, args=('recency',quantiles,))
segmented_rfm['f_quartile'] = segmented_rfm['frequency'].apply(FMScore, args=('frequency',quantiles,))
segmented_rfm['m_quartile'] = segmented_rfm['monetary_value'].apply(FMScore, args=('monetary_value',quantiles,))segmented_rfm.head()

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

RFM 细分市场将客户群分割成一个难以想象的 3D 立方体。不过,我们可以整理一下。

添加一个新列来合并 RFM 得分:111 是我们之前确定的最高分。

segmented_rfm['RFMScore'] = segmented_rfm.r_quartile.map(str) 
                            + segmented_rfm.f_quartile.map(str) 
                            + segmented_rfm.m_quartile.map(str)
segmented_rfm.head()

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

很明显,第一个客户根本不是我们的最佳客户。

谁是我们的前 10 大最佳客户

segmented_rfm[segmented_rfm['RFMScore']=='111'].sort_values('monetary_value', ascending=False).head(10)

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

了解更多信息

有兴趣了解更多信息吗?

  1. Kimberly Coffey 有一个优秀的教程关于同一个数据集使用 r。
  2. 丹尼尔·麦卡锡和爱德华·沃兹沃斯的 R 包— 买直到你死—一个演练
  3. 来自 yhat 博客的葡萄酒销售商的客户细分。

创建这个帖子的源代码可以在这里找到。我将很高兴收到关于上述任何反馈或问题。

参考:爆炸分析和营销

查找和管理研究论文:工具和产品调查

原文:https://towardsdatascience.com/finding-and-managing-research-papers-a-survey-of-tools-and-products-9151810d1b4d?source=collection_archive---------12-----------------------

在本帖末尾你可以找到一个 TL;博士与我的建议,最有用的工具,以改善您的工作流程与科学论文。

重大更新(2020):
我们发布了一个可视化查找和探索学术论文的工具。请看我们的
发布博文 获取 连接论文

作为研究人员,特别是在(过度)多产的领域,如深度学习,我们经常发现自己被大量的论文淹没,无法阅读和跟踪我们的工作。我认为其中一个很大的原因是没有充分利用现有的工具和服务,这些工具和服务的目的是让我们的生活更轻松。另一个原因是缺乏一个真正好的产品,在一个界面下满足我们所有的需求,但这是另一篇文章的主题。

最近,我进入了 ML 的一个新的子领域,并对优先排序、阅读和管理相关文件的过程感到非常沮丧……我最终寻找工具来帮助我处理这一过载,并希望与您分享我发现的产品和服务。我们的目标是改善任何从事科学论文工作的人的工作流程和生活质量。

我将主要关注纸张消耗(相对于写作)并涵盖:

  1. 参考管理者(又名纸质图书馆)
  2. 分享知识的社交平台
  3. 自动论文分析以获得额外的元数据(关键词、相关数据集、重要引用等)

参考管理者(又名纸质图书馆)

在这些平台上,你可以创建和组织你过去和未来阅读的清单,添加个人笔记,并与一个小组分享。图书馆与云端同步,这意味着你的论文可以在任何地方查阅。认为 goodreads ,但是对于论文。选择以下选项之一:

  1. 门德利:这不是最好看的产品,但它有一个免费增值的商业模式,并支持多种平台,包括 web、PC、Mac 和移动设备。除了一般的纸质笔记,您还可以直接注释和突出显示 pdf。你要为额外的云存储付费(几百篇论文之后必须的)。
  2. Paperpile :付费订阅(没有免费版),但是看起来感觉很现代。很容易从其他服务中导入你的库。图书馆与你自己的谷歌硬盘同步,这是一个优势。目前只适用于 chrome 浏览器。
  3. Zotero :一个免费增值和开源的实现,你需要为额外的云存储付费。与门德利相似,但用途较少。

还有更多 选项,不过这些都是我试过的,都没问题。如果我不得不选择一个,它将是 Mendeley 的平台通用性和免费增值。

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

Mendeley’s Interface

ArXiv 增强剂

ArXiv 从 1991 年开始出现,在过去的十年里变化很小,而出版量却急剧增加[1]。很自然,今天我们有不同的要求和需求,从我们的主要仓库的文件。我们想要执行论文分析的算法,我们想要找到实现论文的代码,我们想要一个可以共享信息的社交层,也许我们不想看双栏 pdf。

在互联网上搜索现有的解决方案时,我发现了许多这样的工具:

社会阶层

  1. Shortscience :分享论文摘要的平台;目前超过 1000 摘要和增长。适用于任何具有 DOI 的纸张(因此,比 arXiv 更适用)。
  2. OpenReview :一个透明的论文审核流程,也对公众审核开放,目前仅适用于选定的会议,如 NIPS 和 ICLR。除了官方评论之外,最近许多论文都有来自原作者的积极回应。
  3. Scirate :在 arXiv 的克隆体上添加 like (ehh,“scite”)按钮。添加注释部分。大多不活跃。

寻找论文的代码实现

  1. 代码为的论文:自动将论文连接到实现它们的 github 库,并按 github stars 排序。每篇论文可以有多个未合并的条目。
  2. Github pwc :一种极简主义的方法,自动(?)将 papers 连接到一个代码实现,显示为一个简单的表格。
  3. GitXiv :合作策划项目 feed。每个项目方便地呈现为 arXiv + Github + Links + Discussion。不幸的是这个项目不再维护

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

Some links from Github pwc

其他的

  1. arXiv-sanity :给 arXiv 改头换面,提供公开的摘要、论文预览和非常基本的社交和图书馆功能。Andrej Karpathy 在业余时间大胆尝试将上述许多想法结合在一起。想法都在那里,但在我看来,实现不够好,不足以成为研究人员的首选工具,而且该项目在过去一年中并不活跃。
  2. arXiv-vanity :将来自 arXiv 的学术论文呈现为可响应的网页,这样你就不必斜眼看 PDF 了。

论文搜索和分析

  1. Google scholar :当今搜索论文、查看论文统计以及引用和参考文献、通过关注作者或论文为新论文设置提醒,以及保留自动推荐的基本库。
  2. IBM 科学摘要器:摘要是通过分析论文的内容,以及它们的结构、章节、段落和关键术语而生成的。它并不总是工作得很好,但它在不断改进,非常适合快速浏览文章。
  3. 语义学者:外部素材聚合的论文语义分析。功能包括:暴露引用和参考文献并衡量其影响,显示论文数字,自动生成关键词(主题),分析作者,在互联网上查找其他资源(例如相关的 youtube 视频)并建议推荐论文。
    AI2 支持的新的伟大努力。最近他们对上面提到的 Paperswithcode 和 arXiv 本身做了一个小的集成。).

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

Semantic Scholar: author profile page

作者工具

  1. 背页:协作、在线 LaTeX 编辑器。想想写论文的谷歌文档。执行得非常好。
  2. Authorea:21 世纪在线合作撰写论文的一种方式,旨在大部分情况下放弃 LaTeX,支持现代的 WYSIWYG 编辑器。支持内联代码和数据的可复制性、内联公共注释和其他非常有意义的特性。
  3. 代码海洋:基于云的计算再现平台。我的理解是,你上传你的研究作为 Jupyter 环境代码,在线运行它,并复制作者得到的相同的图形/输出。这里有一个的例子(按右上方的 Run)。

Tl;dr —我的推荐

我希望这篇文章至少向你介绍了一种可以改善你工作流程的服务。如果你知道这篇文章中没有提到的有用的工具,请在下面分享给大家。

[1]截至 2016 年 10 月,提交率已增长至每月 10,000 多份。https://en.wikipedia.org/wiki/ArXiv

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

arXiv submission by Topic, from their statistics page

在小型会议中发现巨大价值

原文:https://towardsdatascience.com/finding-big-value-in-small-conferences-d5178295d773?source=collection_archive---------11-----------------------

你可能已经看到了我之前的帖子,关于什么是 DataScienceGO 2018,它在哪里举行,谁将参加。现在,我们将与您分享它是价格最好的会议的原因。

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

Check it out!

数据科学的真相

面向专业人士的数据科学和技术会议很常见。在美国和更远的地方有很多人参加。如果你想参加的话,当然不会缺少会议。

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

我成立了 SuperDataScience,作为一家电子学习公司,为每一位数据科学家和数据爱好者提供有价值的内容。这一切都是为了向数据科学家提供他们可以用来推进其职业生涯的信息。

数据科学家需要做的主要事情之一是建立网络和提高技能。这就是为什么我们设立了data science ego,这是一个价格合理的会议,面向那些寻求将其职业生涯提升到一个新水平的数据从业者。

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

会议—为什么数据科学家应该参加

参加专业会议是数据科学家建立联系和增加就业能力的重要途径。数据科学是一个发展最快的领域,关于什么是数据科学有很多困惑。即使在行业内,每个数据科学家的工作方式都不一样,每个人都有不同的背景。

数据科学从业者需要相互交流他们是如何成为数据科学家的。他们还需要脱颖而出,而做到这一点的最佳方式就是参加数据科学会议。

问题是,它们很贵。很少有低于 1000 美元的费用,这还只是为了参加活动!如果你必须支付会议期间的差旅费和住宿费,这个数字即使不是三倍,也是两倍。

行业和专业会议是你结识该领域专家、客户、导师、朋友甚至商业伙伴的好地方。你将有机会了解即将到来的趋势、软件和技术突破。您将能够了解行业的陷阱,从专家的主题演讲中学习,并发现行业的秘密。

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

最重要的是,你将能够避免犯你的同龄人在职业生涯中犯过的错误。你将能够找到你职业生涯的最佳路径。在 DSGO,你的周围都是对数据充满热情和兴奋的人,就像你一样。

DataScienceGO——是什么让它与众不同?

SuperDataScience 的成立是为了让数据科学变得更容易理解。我相信,如果有足够的动力、热情和好奇心,任何人都可以成为数据科学家,这就是为什么我们让我们的会议和课程定价合理——教育应该触手可及。

DSGO 也不例外。它的价格实惠,因此任何对数据科学感兴趣或想成为数据科学家的人都可以做到这一点,而不会倾家荡产。我们希望人们聚集在 DSGO,讨论他们是如何成为数据科学家的,并向新来者解释为什么他们也应该成为数据科学家。

对于崭露头角的数据科学家来说,DSGO 是最有价值的会议之一。对于刚进入这个行业的人来说,这是一个完美的会议,而且比其他会议便宜得多,尤其是对圣地亚哥地区的人来说。

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

为期三天的会议的全票不到 500 美元(如果你快,会更便宜),如果你是团体旅行,还有折扣。这使得许多刚刚进入这个行业的人都可以使用它。与大多数会议相比,DataScienceGO 更小,更个性化,更平易近人,这也是它成本更低的原因。

好事成双

DSGO 的价格合理,因此,这是一个更加个人化和私密的会议。许多大规模的技术和数据会议让人应接不暇。它们在大型会议中心举行。这不仅使得在演讲者的活动之间导航变得不同,而且几乎不可能见到人并和他们说话。

大型活动是令人惊奇的,但是如果你离开附近就找不到任何人,那么参加活动来促进你的职业发展和建立关系网就没有意义了。DSGO 更加个人化,让你有足够的机会见到你的同龄人和你的偶像。

DSGO 也是一个专门为数据科学家举办的会议,因此,它是针对你的问题和疑问的,特别是那些与你的职业道路有关的问题和疑问。你会给 DSGO 留下很多信息,这些信息会对你和你的职业非常有用。

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

不到 500 美元,DSGO 是一个方便的,负担得起的会议,为已建立的数据科学家和那些有兴趣开始他们的数据科学职业生涯。你将带着信息、经验、教训和人际关系离开。DSGO 是彻底腾飞的第一步!

还没决定?以下是你应该参加的原因

DSGO 很小,很个性化,是为数据科学家设计的。当我们说“数据科学家”时,我们指的是那些对数据科学感兴趣但尚未投身其中的人,以及那些希望将自己的数据科学职业视为可以不断发展的人。我们希望为每个对数据科学感兴趣的人提供一个学习如何在他们的领域取得战略性进展的地方。

DSGO 2018 大会上,你会听到业内专家(包括我自己)以及那些好奇想了解更多入门知识的人的观点。我们希望你有职业发展、目标和成功。我们为个人和团体提供实惠的价格,我们还为学生提供 50%的折扣,因为我们希望让每个人都有机会参加。

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

我们还设立了专门的网络午餐,您将获得免费午餐,并有机会与您最喜爱的数据科学家或数据爱好者交流。这 90 分钟的时间是很多会议都没有的宝贵机会。在享用免费午餐的同时,你可以了解事情的本质、陷阱和错误。所以带上你的名片吧!

去 DSGO 2018

我们毫不犹豫地投资于我们的大学教育、我们的笔记本电脑、智能手机和 WiFi 连接。这些都是我们认为对推进我们的生活和事业不可或缺的东西。按照这种逻辑,我们为什么不投资这个机会去参加一个专门针对我们职业需求的会议呢?

数据科学正在成为一个饱和的行业,因此我们需要确保自己脱颖而出。做到这一点的一个简单的方法是把我们自己放在那里,和那些在位置上的人握手,引导我们走向成功。

坐在电脑前是我们工作的主要组成部分,我们从电脑上收集所有的数据和研究。不幸的是,我们无法在舒适的办公椅上学会如何交谈。我们可以学习技术诀窍,但我们不会得到职业建议,也不会与其他数据科学家面对面交流。

寻找 TED 演讲的特点

原文:https://towardsdatascience.com/finding-characteristics-of-ted-talks-911879560146?source=collection_archive---------3-----------------------

今天我想了解一下 TED 演讲的特征分布——它们被用户评价为优美、巧妙还是啰嗦?

为了做到这一点,我用 TED 点击了最新的数据集,其中包括从年初到今年迄今的所有有评级的谈话,将 json 列解析为包含 14 个正面和负面特征的数据框架,从有说服力到有创意到令人讨厌到令人瞠目结舌,然后根据谈话的最大值对这些特征进行归一化(否则观看最多的人也会因为观众基数较大而显得最冗长),并将它们绘制在平行坐标上,以获得它们分布的概览。

平行坐标乍看之下可能不是最容易理解的视图,但它有一个优点,可以清晰地布局多元数据集的分布。这里每条线代表一个谈话,它们与多轴的交点代表不同的特征。

在根据最大属性对每个演讲进行标准化后,我通过关注这些属性在 0.95 到 1 范围内的人,放大到最美丽、勇敢、率真、有说服力和令人讨厌的演讲。

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

最美丽的谈话很少不鼓舞人心或引人入胜。

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

最有勇气的谈话往往鼓舞人心,但不那么引人入胜。

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

最巧妙的谈话往往是鼓舞人心的,引人入胜的,信息丰富的。其中有一个被评为不可信,这是一个 beatjazz 表演。

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

最有说服力的演讲通常也被认为是信息丰富和鼓舞人心的。

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

也有一些令人讨厌的,包括一个音乐家的呼吸和音乐表演(可能太前卫了)。

这是我关于数据科学和视觉故事的# 100 日项目的第 61 天。我的 github 上的全部代码。感谢阅读。如果你喜欢,请分享。欢迎新主题的建议和反馈。

用 Python 查找歌曲中的合唱

原文:https://towardsdatascience.com/finding-choruses-in-songs-with-python-a925165f94a8?source=collection_archive---------4-----------------------

如何使用一些非常简单的模式识别找到音乐中的合唱

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

Popular Song Structure

你有没有觉得现在的歌曲重复了很多遍?

我甚至没有谈论像蠢朋克的这样围绕着单词的歌曲,其中相同的 4 个小节基本上重复了 7 分钟(尽管它超级朗朗上口)。在多种流派中,似乎一旦你录制了一首独唱和合唱,你可以复制/粘贴几次,然后*瞧,*你就有了一首完整的歌曲。独唱—合唱—独唱—合唱—桥听起来像合唱—合唱的结构一如既往的受欢迎。

事实上,歌曲中的重复是分析它们的一个很有价值的工具。这是我最近在研究用机器学习寻找歌曲结构时偶然看到的一篇论文的主题。这个想法非常简单,而且效果非常好,我认为它值得探索。

大致来说,歌曲结构指的是识别引子-独唱-合唱-桥梁等。当我们听一首歌的时候,我们会自然地认出这些部分。在这篇文章中,我们将特别考虑如何找出歌曲的哪些部分包含副歌或叠句,这是一个比找出整个结构更简单的问题。这有许多应用程序,例如为 iTunes/Google Play 选择歌曲预览,为像 songpop 这样的琐事游戏选择可识别的剪辑,甚至自动生成 DJ 提示点。

这是即将到来的一个小小的预览。您可以跳到结果部分获得更多输出:

算法概述

在高层次上,由于副歌是通常重复次数最多的部分,我们试图找到歌曲中重复次数最多的部分。算法大致如下

  1. 找出歌曲中任何时刻正在播放的音符
  2. 将歌曲的短部分与其他部分进行比较,看哪里有重复的部分
  3. 寻找那些重复多次且连续重复之间有很大间隔的长片段

让我们深入研究一下实现,看看这是如何做到的。假设有一些编程和音乐理论的基础知识,所有代码都可以在https://github.com/vivjay30/pychorus找到并安装

pip install pychorus

正在演奏什么音符

我们需要做的第一件事是把歌曲的 1 和 0 变成有用的东西。最简单的方法是使用频率,因为频率告诉我们存在什么音符(例如,A 是 440 赫兹)。将原始声音信号转换成频率涉及到大量的数学运算,但幸运的是,我们有库来为我们做这件事。为了这篇文章我选了一首经典的流行歌曲, 尖叫和呼喊 靠意志。这绝对是我高中时的最爱。

import pychorus
chroma, _, _, _ = pychorus.create_chroma("scream_and_shout.mp3")

这主要是一个 librosa 库的包装器,做两件事。首先,它使用傅立叶变换将原始波形转换成频率。然后,它使用不同八度的音符频率知识(不同八度的 A 为 440hz、880hz、1760hz 等)来了解任何时刻正在播放的音符。歌曲中任何时刻播放的音符列表称为色谱图。

也许你已经可以从频谱中看出一些歌曲结构了。

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

Frequencies present at any moment of the song

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

Notes present at any moment. Lighter means more of that note

最简单的思考方式就像视频帧。声音是连续的,但计算机处理的是离散的数据。这个色谱图每秒大约有 5 帧,每一帧告诉我们在 0.2 秒的音乐片段中播放了什么音符。因为在西方音阶中有 12 个音符,所以每个帧是 12 个元素的向量,其中每个值在 0 和 1 之间。例如,如果我们正在听一个纯音符 A,向量将是[0,0,0,0,0,0,0,0, 1 【T7,0,0],如果音乐完全无声,那么它将全为零。对于一个 4 宋敏,这给出了一个 1200×12 的矩阵。

尽管查看原始频率是可行的,但出于几个原因,我们将其转换为音符。首先,它对不同合唱中的乐器变化提供了更强的鲁棒性。例如,如果最后一个合唱团有一个额外的吉他或更多的鼓,频率可能会非常不同,但实际的音符和和弦将是相似的。此外,处理音符允许我们在更低维度的空间中工作(12 个可能的音符与人类可以听到的 5000 个不同的频率)。

寻找相似之处

现在让我们考虑如何找到长的重复部分。

听听这首歌中的两个不同的合唱部分。我们将专注于检测这些特定的合唱。

First chorus, 0:44–1:00 in the song

Second chorus, 2:30–2:45 in the song

这些部分听起来是一样的,但是我们如何测量呢?

因为我们的歌曲是每个 12 个音符的帧的集合,所以我们需要一个相似性函数来比较任何给定的歌曲帧。如果 V₁和 V₂是歌曲中任意两个实例的 12 个音符矢量,那么我们将使用下面的相似度函数:

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

直觉:我们首先求向量的差,然后看范数。如果演奏相同的音符,那么差异的范数将接近于 0,如果音符不同,那么这个范数将很大。我们除以√12 使得结果总是在 0 和 1 之间,我们从 1 中减去使得相似的音符得到高分,反之亦然。

我们现在需要做的是迭代所有可能的歌曲帧对,看看哪些是相似的,并寻找具有相似的连续帧的两个区域。形式上,我们可以创建一个矩阵 M ,其中M[x][y]=相似性(x,y) ,使用上面的相似性函数*。*这叫时间-时间相似度矩阵。请参见下面生成它的示例代码。实际上,我们可以用 numpy 广播更快地做到这一点,但是较慢的例子更容易理解

完整的时间-时间矩阵如下图所示。注意一些属性

  1. 它关于对角线对称,因为帧 xy 之间的相似性与帧 y 和帧x:*M[x][y]= M[y][x]*之间的相似性相同
  2. 对角线全是 1,因为每一帧听起来都完全像它自己:具体来说 M[x][x]=1

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

Time-Time similarity matrix for the entire song

现在让我们来看看这些合唱部分相交的地方

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

Time-Time Similarity for a repeated chorus

请注意 x 轴上从 2:30 到 3:00 延伸的黑色对角线,y 轴上从 0:45 到 1:15。这对应于上面播放的第一和第二合唱之间的匹配。

直观地说,如果 0:45–1:15 的片段与 2:30–3:00 的片段相似,那么这意味着 0:45 的帧应该与 2:30 的帧匹配,0:46 的帧与 2:31 的帧匹配,直到 1:15 的帧与 3:00 的帧匹配。希望你能看到重复的部分总是用对角线表示。

“重复部分是时间-时间相似性矩阵中的对角线”

时滞相似矩阵

不幸的是,检测矩阵中的对角线比检测垂直线或水平线更加困难和缓慢。正因为如此,我们可以应用一个简单的线性变换,使重复的和弦显示为水平线,而不是对角线,使以后的处理更容易。这是通过创建时间滞后相似性矩阵来完成的。如果时间-时间矩阵测量帧 x 和 y 之间的相似性,那么时间滞后矩阵测量帧 x 和 y 秒前发生的帧之间的相似性。形式上,时滞矩阵T[x][y]= M[x][x-y]=相似度(x,x-y)。

让我们来看看之前看到的那场合唱比赛。

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

Time Lag matrix zoomed into the match between first and second chorus

我们的对角线现在变成了水平线。x 轴是一样的,但是现在这条线在 1:45 左右有一个恒定的 y 值。由于 2:30–3:00 的第二次合唱与 0:45–1:15 的合唱相似,所以这条线告诉我们,2:30 的帧与 1:45 之前的帧相似。2:31 的画面与 1:45 前的画面相似…3:00 的画面与 1:45 前的画面相似

综上所述,2:30–3:00 的音乐与歌曲中发生在 1:45 之前的部分相似。这就是为什么我们在 y 坐标 1:45 处有一条从 2:30 到 3:00 的线。

“重复部分是时间滞后相似矩阵中的水平线”

因为我们知道我们正在寻找水平线,我们可以做一些很好的一维去噪和平滑技术来隔离这些线。这基本上是现在的计算机视觉,去噪后可以看到那个合唱交集的结果。

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

从这个去噪矩阵中,我们可以通过迭代每一行并使用最小检测分数和最小线长度的阈值来容易地识别线(重复部分)。

为了简单明了,我们将在时间-时间空间(对角线)中演示算法的其余部分,但实际上,为了速度和更容易实现,该算法是在时间滞后空间(水平线)中实现的。

计算所有重复的部分

现在我们有了检测歌曲中重复部分的方法,我们需要一种方法来计算合唱重复的次数。理论上,如果合唱在歌曲中出现了 n 次,我们应该有 n 条线代表所有可能的交叉点。我们很少能探测到所有的合唱,但只有少数几个是必要的,以了解合唱团在哪里。请参见下面的动画来计算行数。

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

Example of finding 9 line segments for 3 choruses in the time-time diagram

在这个例子中,我们显示了 9 条对角线,对应于 3 个彼此匹配的合唱。事实上,有超过 3 个合唱团,你可能会看到不止 9 个突出线。

注意所有检测到的线是如何水平或垂直匹配的。对于每个线段,我们只需在水平和垂直方向寻找其他线段,并根据我们相交的其他线段的数量来得分。为了输出合唱,我们可以选择任何重复的合唱部分,但我们将选择具有最强相似性得分的最多交叉点的部分。(同样,理论上它们都有相同数量的交集,但实际上总有一个交集的相似性得分更高)。

结果

现在是有趣的部分!我们一边寻找至少 15s 的合唱,一边看看算法输出的是什么样的小节。

为了表明它不仅适用于流行音乐,下面是著名的富尔·伊利斯钢琴曲的合唱部分:

为了好玩,我决定在世界各地的蠢朋克上运行它。老实说,一个随机数生成器也会找到这首歌的副歌部分。

这是世界各地时间-时间相似性矩阵的一部分。记住对角线是重复的部分。是的,这是很多重复,尤其是一个 1 分钟的剪辑。

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

Section of time-time similarity matrix for Around the World

缺点和今后的工作

一个主要的问题是,这种方法对于以不一致的速度录制的音乐不起作用。例如,很多旧音乐,如摇滚,通常是在没有节拍器的情况下录制的,但鼓手会跟上节奏。如果一个合唱比另一个快或慢,那么它通常不会被拾取。

以下是披头士黄色潜水艇在时滞空间的重复合唱。

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

这条线应该是水平的。然而,第二次合唱明显比第一次慢,这导致线明显向下倾斜。这意味着我们的水平线检测器没有拾取重复,并且我们没有合唱检测。

取而代之,我们采用一种方法,其中我们对矩阵进行阈值处理,并且寻找在 x 轴上具有足够大跨度的连通分量。这只有在我们知道这首歌是在没有节拍器的情况下录制的情况下才能做到。开始时,我们可以使用节拍检测器,查看节拍之间的标准偏差。对于严格定时的歌曲,标准差基本为 0,而自由录制的歌曲标准差要大得多。

这项功能尚未发布,是其他变化中的计划功能,例如可以选择输出哪个合唱团(而不仅仅是得分最高的一个)。

结论

我们从观察到歌曲会自我重复开始,最后用一种快速简单的方法来检测合唱。

这种方法的主要优点之一是,它可以在几秒钟内在 cpu 上运行一首完整长度的歌曲,这与需要更多计算或 gpu 的神经网络方法相反。尽管机器学习模型几乎肯定会做得更好,但这种算法很容易理解,也是对信号处理和音乐模式识别的很好介绍。

我鼓励你尝试在一些歌曲上运行源代码,看看你会得到什么样的结果!

如果有任何问题,也可以随时联系,或者在 twitter 上关注我在【https://twitter.com/vivjay30】T4 的更多项目和更新!我总是很乐意与对人工智能和音乐感兴趣的人交谈和合作。

用 OpenCV 实时查找车道线

原文:https://towardsdatascience.com/finding-driving-lane-line-live-with-opencv-f17c266f15db?source=collection_archive---------2-----------------------

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

你好,在这个项目中,我将尝试从仪表板摄像头视频饲料找到车道线。一旦我们检测到车道线,我们将在原始视频帧上标记它们并回放。所有这些都将使用 OpenCV 函数在线完成,没有任何延迟。

我们的方法是开发一系列功能来检测车道线。在编写这个函数时,我们将使用一个“样本”图像,一旦我们能够成功地检测到几个“样本”图像上的车道线,我们将把完整的程序合并到一个函数中,该函数可以接受实时馈送图像并返回相同的图像帧,其中车道线高亮显示。所以没有太多的延迟,让我们开始吧。

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

Sample Image

首先,我们输入样本图像帧。这一行将在最终代码中进行注释,其中“图像”将是由视频捕获发送的帧。

image = cv2.imread('test_images/whiteCarLaneSwitch.jpg')

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

Greyed Image

为了减轻我们处理器的负担(这在嵌入式系统中是非常稀缺的资源),我们将以图像的“灰度”版本而不是原始的彩色版本来进行所有的图像处理。这有助于用更少的资源更快地执行我们的程序。以下函数将彩色图像转换为灰度图像

grey_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

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

Image Blurring (Image Smoothing)

接下来,我们将通过模糊图像来去除噪声。图像模糊是通过将图像与低通滤波器核进行卷积来实现的。这对于消除噪音很有用。它实际上删除了图像中的高频内容(例如:噪声、边缘)。所以在这个操作中边缘有点模糊。OpenCV 提供了 4 种不同类型的模糊技术,高斯模糊是最流行的一种。

我们可以选择不同的内核大小,其中结果滤波器将简单地取内核(内核大小的行×列矩阵)区域下所有像素的平均值,并用平均值替换中心元素。同样,5 是一个相当标准的值,并且对我有效。

kernel_size = 5blur_gray = cv2.GaussianBlur(grey_image,(kernel_size, kernel_size),0)

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

Canny Edge Detection

Canny 边缘检测是一种流行的边缘检测算法。事实上,Canny edge function 还实现了我们在前面步骤中使用的 5x5 核高斯滤波器,但在我接触的许多文献中,它总是建议在 Canny 边缘检测之前实现自己的模糊。边缘检测背后的基本理论是,只要有边缘,边缘两侧的像素在它们的强度之间就有很大的差异(也称为梯度)。首先,在水平和垂直方向上扫描输入图像,以找到每个像素的梯度。在获得梯度大小和方向后,对图像进行全扫描,以去除可能不构成边缘的任何不想要的像素。为此,在每个像素处,检查像素是否是其邻域中的局部最大值。

low_threshold 和 high_threshold 决定检测到的边沿强度。如果梯度高于“high_threshold”,则梯度被视为边缘的一部分。但是一旦检测到边缘,即使下一个像素大于“low_threshold ”,它也会包含在边缘中。

low_threshold = 50high_threshold = 150edges = cv2.Canny(blur_gray, low_threshold, high_threshold)

参考我们的示例图像,很明显,在边缘条件下,尤其是车道线所在的位置,相邻像素之间存在巨大的对比度差异,车道线为白色,相邻道路像素为黑色。

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

Region of Interest

需要考虑的一点是,我们不想找到图像中的所有边缘。我们只是对找到图像中心区域周围的车道感兴趣。直观上,这是有意义的,因为图像的右上/左上部分的边缘极不可能是车道。查看样本图像,我们可以有把握地说,车道线应该在梯形区域内,图像底部的边缘较宽,图像顶部的边缘越来越窄。

以下四条线标记了我们的边缘检测图像中的感兴趣区域。首先,我们找出图像的大小,其次我们创建梯形的四个角(这一步,和许多其他步骤一样,是一个迭代过程,其中我们需要尝试不同的值来找出最佳情况)。第三,我们用上面的顶点创建梯形,最后我们做一个逐位运算,这样只有在感兴趣的区域内并且被分类为边缘的像素被标记为 1。

imshape = image.shapevertices = np.array([[(0,imshape[0]),(450, 320), (500, 320), (imshape[1],imshape[0])]], dtype=np.int32)cv2.fillPoly(mask, vertices, ignore_mask_color)masked_edges = cv2.bitwise_and(edges, mask)

接下来,我们执行霍夫线变换,以便从上述边缘检测图像中检测一条线。请记住,边也可以是圆形边,但我们在应用中感兴趣的边是车道的直线边。

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

Hough Line Transform

简而言之,霍夫变换法将一条直线从其传统的 y = mx + b 形式变换为ρ= x * cos(θ)+y * sin(θ)其中ρ是从原点到该直线的垂直距离,θ是该垂直线与水平轴形成的角度。

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

我们知道一条线(y = mx + b)在 m vs b 图中表示时只是一个点,x,y 框架中的一个点在 m vs b 框架中表示为一条线。

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

所以我们在图像空间中寻找直线的策略是在霍夫空间中寻找相交的直线。为此,我们将霍夫空间划分为一个网格,并将相交线定义为通过给定网格单元的所有线。在霍夫空间中许多直线相交的地方,我们宣布我们已经找到了描述图像空间中一条直线的点的集合。

我们有一个问题,垂直线在 m 对 b 的表示中有无限的斜率,这就是ρ对θ参数化的需要。

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

现在图像空间中的每个点对应于霍夫空间中的正弦曲线(rho vs theta)。如果我们取一整行点,它就转化成霍夫空间中的一整串正弦曲线。您可以将霍夫空间中的正弦曲线视为相当于 m vs b 空间中的一条线,它表示图像空间中的一个点。同样,霍夫空间中这些正弦曲线的交点给出了直线的表示。回到我们的代码,我们首先定义霍夫变换的参数,然后调用函数本身。

rho = 2 # distance resolution in pixels of the Hough gridtheta = np.pi/180 # angular resolution in radians of the Hough gridthreshold = 15     # minimum number of votes (intersections in Hough grid cell)min_line_length = 40 #minimum number of pixels making up a linemax_line_gap = 30    # maximum gap in pixels between connectable line segmentsline_image = np.copy(image)*0 # creating a blank to draw lines on

输出“线”是包含检测到的线段的端点的数组。

lines = cv2.HoughLinesP(masked_edges, rho, theta, threshold, np.array([]),min_line_length, max_line_gap)

迭代输出“线”并在空白图像上画线。

for line in lines:
        for x1,y1,x2,y2 in line:
            cv2.line(line_image,(x1,y1),(x2,y2),(255,0,0),10)

在原图上画线,还回来。

lines_edges = cv2.addWeighted(image, 0.8, line_image, 1, 0)return lines_edges

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

Lane Lines on a single frame

在样本图像上成功检测车道线之后,我们将视频作为输入,检测车道线并回放视频。请注意,这里我处理的是以前录制的视频,但这可以很容易地应用到使用相同 cv2 的现场视频。视频捕捉功能。

首先,我们使用 cv2 创建一个视频对象。视频捕获命令。当‘video _ capture’运行时,我们读取它。Read()函数将返回两个变量,其中第一个变量是布尔值,分别用 true 或 false 值指示读取操作的成功或失败,第二个对象是捕获的帧本身。因此,每当“ret”为真时,我们就获取帧,并简单地将其传递给我们刚刚在上面构建的 processImage 函数。从 processImage 接收的输出显示在捕获帧顶部的车道标记上。

video_capture = cv2.VideoCapture('test_videos/solidWhiteRight.mp4')while (video_capture.isOpened()):
    ret, frame = video_capture.read()
    if ret:
        output = processImage(frame)
        cv2.imshow('frame',output)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break# Release everything if job is finished
video_capture.release()
cv2.destroyAllWindows()

仅此而已。希望这篇文章写得足够好,让你愉快地阅读,并希望学到一两件事。显然,在上述程序中可以实现更多的改进,例如,检查检测线的斜率,以检查检测线是否实际上与车道线一致,并移除异常值。等等。欢迎提出任何改进建议,也欢迎提出有助于我成长的建议。完整的代码与样本图像和视频可以找到这里

如果你喜欢这篇文章,在 Twitter 或 Claps 上关注、转发它,在我继续我的博客世界之旅时,Medium 上的赞会鼓励我写新文章。

直到下一次…干杯!!

找到好的学习率和一个周期的政策。

原文:https://towardsdatascience.com/finding-good-learning-rate-and-the-one-cycle-policy-7159fe1db5d6?source=collection_archive---------1-----------------------

简介

学习速率可能是深度学习中最重要的超参数,因为学习速率决定了要反向传播多少梯度。这反过来决定了我们向极小值移动了多少。小的学习率使模型收敛缓慢,而大的学习率使模型发散。所以,学习率需要刚刚好。

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

Gradient descent with small(top) and large (bottom) learning rates. Source: Andrew Ng’s Machine Learning course

找到并设定正确的学习速度更多的是尝试和错误。最简单的方法是尝试不同的学习速率,选择一个损失值最小的速率,而不牺牲学习速度。(验证损失对于欠拟合/过拟合也很重要)。

本文对描述不同超参数设置方法的两篇论文进行了简要总结。这篇文章假设读者知道反向传播,梯度下降和超参数。

有没有更好的办法?

在经历 程序员实用深度学习第 1 部分 mooc 时,提到了 Leslie N. Smith 的论文 用于训练神经网络的循环学习率

该论文提到了几个时期的范围测试运行,以找出良好的学习率,其中我们从一些低学习率开始训练,并在每个小批量之后增加学习率,直到损失值开始爆炸。

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

Learning Rate Increase After Every Mini-Batch

想法是从小学习率(如 1e-4、1e-3)开始,并在每次小批量后增加学习率,直到损失开始激增。一旦损失开始爆发,停止范围测试运行。绘制学习率对损失图。选择比损失最小的学习率低一个等级的学习率(如果损失很低,为 0.1,则开始的好值为 0.01)。这是损失仍在减少的值。论文建议这是模型良好学习率值。

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

Test run on CIFAR-10 with batch size 512, resnet 56 , momentum=0.9 and weight decay=1e-4. The learning rate ~10⁰ i.e. somewhere around 1 can be used.

这就是我们在每次小批量后更新学习率的方式:

n =迭代次数
max_lr =要使用的最大学习率。通常我们使用更高的值
,比如 10,100。请注意,在范围测试期间,我们可能达不到这个 lr 值。
init_lr =较低的学习率。我们将从这个值开始范围测试。我们使用非常小的值,如 1e-3,1e-4。
设 q 为我们在每次小批量后增加学习率的系数。
下图显示了计算第 I 个小批量后学习率的公式。

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

一旦我们找到最佳学习率,我们就用它来训练模型。范围测试是非常有用的工具,因为它提供了一种用少量历元运行找到良好学习率的方法。

循环学习率:

该论文进一步建议在完整运行期间在下限和上限之间循环学习速率。传统上,随着学习开始随时间收敛,学习速率降低。那么循环学习率背后的动机是什么呢?

直观上,将学习速率向更高的学习速率振荡是有帮助的。因为较高的学习率可能有助于摆脱鞍点。如果鞍点是复杂的平台,较低的学习率可能无法从鞍点获得梯度。

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

A saddle point in the error surface (Img Credit: safaribooksonline)

周期是我们从下限学习率到上限再回到下限的迭代次数。周期在时期上可能没有边界,但是在实践中它通常有。步长是周期的一半。所以步长是我们希望学习率从一个界限到另一个界限的迭代次数。

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

Cyclic Learning Rate(Image: https://arxiv.org/pdf/1506.01186.pdf)

单周期政策

在论文“神经网络超参数的训练方法:第 1 部分—学习速率、批量、动量和权重衰减”中,Leslie Smith 描述了设置超参数(即学习速率、动量和权重衰减)和批量的方法。特别是,他建议应用学习率的一个周期政策。

作者建议做一个周期的学习率 2 步等长。我们使用范围测试来选择最大学习速率。我们使用较低的学习速率作为最大学习速率的 1/5 或 1/10。在步骤 1 中,我们从较低的学习率到较高的学习率,然后在步骤 2 中回到较低的学习率。我们选择这个周期长度略小于要训练的总时期数。在最后剩余的迭代中,我们将学习率消除到低于较低的学习率值(1/10 或 1/100)。

这背后的动机是,在学习过程中,当学习率较高时,学习率作为正则化方法工作,并防止网络过度拟合。这有助于网络避开陡峭的损耗区域,更好地获得平坦的最小值。

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

CIFAR -10: One Cycle for learning rate = 0.08–0.8 , batch size 512, weight decay = 1e-4 , resnet-56

如图所示,我们从 0.08 的学习率开始,进行 41 个时期的步骤,以达到 0.8 的学习率,然后再进行 41 个时期的步骤,回到 0.08 的学习率。然后我们再做 13 个纪元,以达到学习率下限的 1/10(0.08)。

使用 CLR 0.08–0.8、批次大小 512、momentum 0.9 和 Resnet-56,我们在 CIFAR-10 上的 95 个历元中获得了大约 91.30%的准确度。

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

循环动量

动量和学习率密切相关。在 SGD 的权重更新方程中可以看出,动量对权重更新的影响与学习速率相似。

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

作者在他们的实验中发现,当学习速率增加时,减小动量会给出更好的结果。这支持了直觉,即在训练的那一部分,我们希望 SGD 快速进入新的方向以找到更好的最小值,因此新的梯度需要被赋予更多的权重。

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

实际上,我们选择 2 个动量值。在一个循环中,我们做动量的两步循环,在第一步中,我们从上限到下限减少动量,在第二步中,我们从下限到上限增加动量。根据该论文,这种循环动量给出了相同最终结果,但这节省了用不同动量值运行多个完整循环时间和精力。

用一个周期政策和周期动量,我可以复制论文中提到的结果。其中,该模型在 9310 次迭代中实现了 91.54%的准确性,而使用一个周期,学习率为 0.08-0.8,动量为 0.95-0.80,使用 resnet-56,批量为 512,而没有 CLR,则需要大约 64k 次迭代才能实现这一准确性。(论文达到了 92.0±0.2 的准确率)。

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

Accuracy vs Iterations

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

Training and Validation loss vs epochs

这允许我们以更高的学习速率训练模型。在学习率为 0.3–3 的情况下,我们可以通过训练 resnet-56 仅 50 个时期来获得 85.97%的训练准确率。

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

重量衰减值也很重要。

重量衰减也是一个重要的超参数。重量衰减也作为正则化因子。但是它与学习速度或动量有很大不同,因为作者发现最佳值应该在整个训练过程中保持不变。

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

Resnet 56 Accuracy after 50 epoch on CIFAR-10 with weight decay = 1e-3(left) vs 1e-5(right)

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

Resnet 56 training and validation losses after 50 epoch on CIFAR-10 with weight decay = 1e-3(left) vs 1e-5(right)

从上面可以看出,图 1e-3 是非常差的重量衰减值,因为在 50 个时期后,精确度勉强达到 60%,而重量衰减 1e-4 和 1e-5 的精确度分别为 85.97%和 87.78%。(CLR 范围为 0.3–3,动量范围为 0.95–0.8,批量为 512)

作者建议,用不同权重衰减值的 CLR 和循环动量进行组合运行,以同时确定学习率、动量范围和权重衰减。如果不知道什么是正确的重量衰减值,该论文建议首先使用 1e-3、1e-4、1e-5 和 0 这样的值。另一方面,如果我们知道,比如说 1e-4 是正确的值,本文建议尝试三个平分指数的值(3e-4、1e-4 和 3e-5)。

总批量

该论文建议将可装入存储器的最大批量值用作批量。

结论

范围测试方法提供了一种定义的方法,通过少量的运行迭代来找出一个好的学习率值。一个循环和循环动量似乎允许模型以更高的学习速率被训练并且收敛得更快。单周期政策提供了某种形式的规范化。因此,其他形式的监管也需要相应调整。

上面提到的实验很少能在笔记本这里找到。

参考资料:

  1. 训练神经网络的循环学习率
  2. 神经网络超参数的训练方法:第 1 部分——学习速率、批量、动量和权重衰减
  3. 吴恩达的 Coursera 课程
  4. 法斯泰图书馆
  5. 程序员实用深度学习,第 1 部分
  6. https://sgu gger . github . io/how-do-you-find-a-good-learning-rate . html
  7. http://teleported.in/posts/cyclic-learning-rate/
  8. https://sgugger.github.io/the-1cycle-policy.html

如果你喜欢这篇文章,请一定给我一个掌声,并关注我以获取我未来文章的更新。

还有,随时在LinkedIn上联系我或者在Twitter上关注我。

如果你喜欢我的作品,请考虑赞助我,它会帮助我推出更多这样的作品。

利用边缘检测寻找农田土地面积

原文:https://towardsdatascience.com/finding-land-area-of-farm-plots-using-edge-detection-5b070cc05c5a?source=collection_archive---------14-----------------------

为农业目的使用现代技术

我不会特意让我的项目与农业相关。然而,我继续发现图像处理和机器人技术在农田中的应用。也许是许多农场地块的几何一致性,或者是工程和学术界推进这个乡村话题的更大愿望。

在最近的一次假日聚会上,我与一位经济学家进行了交谈,他需要获得不同农场地块大小的数据。对于美国的很多农场来说,这个数据是存在的。然而,获取这些数据通常需要付出高昂的代价。此外,许多外国和发展中国家没有现成的地块面积数据。这个数据很有意思。

幸运的是,有大量卫星图像形式的公开农场数据。把你的视野放在美国中西部的任何一个地区,你一定会发现一片片的农田。这就产生了将图像处理算法应用于农田以确定单个农场所占面积的想法。

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

A set of farms used to test the algorithm

我选择追求的概念包括使用导数滤波器。这是有意义的,因为它似乎与人类区分土地或形状的方式相匹配。当我们扫描一个物体时,我们使用对比和阴影来确定物体的形状、用途和身份。类似地,导数滤波器可以用于寻找对比区域。如果像素值与其周围像素值之间的差值大于阈值,则用 1 标记,否则用 0 标记。这将创建一个二进制图像,并选择原始图像的边缘。

在此之前,建议对图像应用模糊滤镜。原始图像中有大量的噪声和细节会降低算法的成功率。这可以用任何模糊过滤器来完成,并且鼓励用户实现这种算法实验。由于我主要对去除噪声和微小的细节感兴趣,同时出于对比目的保留了图的颜色,所以我使用了 4x4 中值滤波器。一个标准的高斯滤波器也可以。模糊滤波器之后是灰度图像,以便应用边缘检测。

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

Blurred and gray scaled farms

实验了三种边缘检测方法来寻找最佳结果。我将简要描述每一种方法及其结果,但是我鼓励好奇的读者自己研究每一种方法以获得更彻底的理解。

第一个被测试的边缘检测滤波器,也可能是最著名的,是 Sobel 滤波器。此滤镜对图像中的每个像素执行渐变检查。内置的 Matlab 函数执行水平和垂直方向的运算,并合并结果。

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

内置 Sobel 滤波器的 Matlab 返回最干净的结果。最终的图像几乎没有噪声。不幸的是,将过滤后的图像与原始图像进行比较,可以看到许多图之间的分隔线没有被很好地拾取。这一点在农场与相邻地块颜色差异不大的地区尤为明显。可能需要使用 Sobel 滤波器中的值来获得这些更加混合的区域。

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

测试的第二种方法是 Canny 滤波器。从左侧查看 Canny 滤波器的结果,可以立即看到 Canny 滤波器拾取了更多的边缘。缺点是也拾取了相当多的噪声。考虑到 Canny 算法采用通过幅度阈值函数的像素和通过稍低阈值函数的相邻像素的并集,这是预料之中的。Canny 算法比简单的 Sobel 滤波器更复杂。它还依赖于预先执行的高斯平滑。中值滤波器的使用可能会妨碍最佳结果。

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

The Laplacian of Gaussian filter returned the best results

测试的最后一个滤波器是高斯的拉普拉斯滤波器。当比例是一个因素时,该滤波器非常适合边缘检测。无论我们使用什么过滤器,我们看到大多数突出的道路被捕获。来自小的农作物阴影或邻近道路的可能的房屋的噪声的标记依赖于滤波器。与道路相比,这些是不同比例的小细节。农场图像的这一特性使其成为高斯拉普拉斯滤波器的理想选择。从测试结果来看,呈现了一个相当理想的结果。找到噪音最少的最大数量的道路。

为了进一步去除图像中的噪声,使用 Matlabs 区域属性函数来去除总像素面积小于平均像素面积值的所有白色区域。当然,这个阈值还可以进一步实验,但是我们发现它在这个测试用例中工作得很好。

反转过滤后的图像,给出标绘土地的区域。然而,道路只有一个像素宽。这为应该分割的区域连接留下了很好的可能性。仅需要单个公共像素来形成两个应该被分割、组合的区域。排除这种可能性,在图像上执行维数为 4 的膨胀正方形。此外,一个像素的黑色边框被添加到整个图像,以识别将图像作为一个区域的地块。

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

Dilated Image

有了这张图片,寻找每块土地的面积就一目了然了。Matlab 的(或者 OpenCV 的)regionprop 函数可以用来求每个区域的面积。仍有一小块土地不是小块土地。有些是残留的道路或其他细节。为了减少这些面积,我只包括面积大于平均值减去一个标准差的区域。

然后每个区域被着色,其像素尺寸被印在它的点上。结果可以在下图中看到。打印的尺寸是该区域像素的实际数量。除非像素和图像尺寸之间存在已知的比例,否则这些值是没有用的。我知道卫星应用程序,如谷歌地图,往往有一个规模。我让感兴趣的开发人员来实现这个特性。

总的来说,我对结果很满意。该应用程序能够将大部分地块分成各自特定的区域。有一些例外,例如像素值为 47,680 的大橙色部分将两个区域混合在一起。这可以通过调整膨胀值来解决。另一个要考虑的因素是,道路的扩张确实侵蚀了农场的像素区域。为了得到农场更精确的价值,把侵蚀的结果加到农场的总面积上可能是有意义的;未来发展的另一个话题。

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

Result of our test farm

我想简单地评论一下所探索的另一种方法。代替使用边缘检测来寻找农场,超级像素可以是一种有效的方法。在与前面提到的经济学家探讨了这项任务之后,超级像素被测试并展示了同等的(如果不是更好的)结果。

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

Another farm example (top) and its result (bottom). Note, larger images need better thresholding strategies.

Github 脚本链接:

[## TimChinenov/农用绘图仪

下面是一个 Matlab 脚本,它使用图像处理来确定图像中农场地块的数量并打印…

github.com](https://github.com/TimChinenov/FarmPlotter)

使用 Twitter 数据查找本地事件

原文:https://towardsdatascience.com/finding-local-events-using-twitter-data-18298f03ead6?source=collection_archive---------12-----------------------

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

Photo by Giammarco on Unsplash

无人监督的学习

陈亦飞、阿什温·古普塔、Shruthi Krish、Raghav Prakash、王巍的项目

Twitter 是一个社交媒体平台,数百万用户用它来分享自己的生活更新。通常,这些推文是关于用户周围发生的本地事件。尽管新闻机构报道当地的事件,但是新闻机构了解、调查和报道事件所花费的时间是相当长的,尤其是与事件的持续时间相比。相比之下,用户对可能发生的事件的解释会实时上传到 Twitter 上,他们的 Twitter 订阅源的追随者可以在新闻机构广播信息之前了解到事件。

在这个项目中,我们分析来自给定地理区域的推文,以确定某个事件是否已经发生。然后,我们报告与该事件相关的最具描述性的推文。解决这一问题将是一种快速提醒用户其所在区域可能发生事故的方法。我们的方法将数据分成位置桶,识别推文活动中的峰值,然后根据相似性对推文进行聚类。

一.项目概述

  • **目标:**给定带地理标签的 Twitter 数据,识别一个本地事件
  • **应用:**如果实时完成,用户可以在新闻媒体报道之前得到当地事件的通知。确切的应用因确定的事件类型而异。例如,如果检测到交通延迟,用户可以通过选择替代路线来避免延迟。我们的系统也将能够向新闻站提供信息,以便他们能够进一步调查。

方法概述

  1. 获取并预处理特定区域的推文
  2. 将推文分成位置桶
  3. 发现异常
  4. 定义重大事件
  5. 相应地选择一个标题

这个项目的代码可以在 GitHub 上找到。

东京大学的 Muhammad Khan 和 Danushka Bollegala 进行了使用 tweets 识别事件的研究。台湾国立高雄应用科技大学的钟李洪也进行了类似的研究。

二。数据

背景

在我们的项目中,我们需要在短时间内获得带有地理标签的推文。由于计算上的限制,我们选择分析某个特定地理区域的推文。我们最初的想法是使用 Twitter 搜索 API 从纽约大都市地区收集数据。然而,考虑到我们的时间限制和 Twitter API 的速率限制,收集所需数量的数据是不可能的。我们选择在互联网上找到一个具有以下特征的现有数据集。

相关特征

  • 所有的推文需要来自世界上同一个地区。
  • 我们需要访问每条推文的正文日期发布时间发布
  • 每条 tweet 都必须有一个相关联的地理标签,指定纬度经度

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

Required information from each tweet. All tweets used in our project are public on Twitter, but this user’s information has been masked for privacy. (Source: Twitter)

我们的数据集

在寻找适合我们项目的数据集时,我们发现绝大多数推文都没有地理标记。这使得找到满足我们所有要求的数据集变得更加困难。然而,经过大量搜索,我们找到了一个来自英国的带有地理标签的推文的数据集。这些推文在 2016 年 4 月的活动中持续了 9 天。

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

该数据集最初包含大约 170,000 条具有上述特征的地理标记推文。

初始预处理

由于伦敦是英国最大的大都市,我们决定将我们的数据仅限于伦敦及其周边地区发布的推文。我们首先根据纬度和经度缩小数据范围,重点关注在纬度范围 51.3794444 到 51.6275813 和经度范围-0.4598808 到 0.0994444 发布的推文。

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

在查看了我们的推文的语言分布后,我们从数据集中删除了所有非英语推文。因为我们五个人都非常熟悉英语,所以用其他语言来验证一个事件是否被正确地检测到是很困难的。也有一些 tweets 缺少经度值,因此我们通过用该地区的平均经度填充这些值来完成初始预处理阶段。

三。学习和建模

将推文分成位置桶

在完成数据的初始预处理后,下一步是按位置将数据划分成簇。这些集群是设置推文基线活动的基础。我们希望聚类足够大以包含多个 tweets,但又足够小以用于识别“本地”事件。为此,我们尝试了许多不同的模型,包括 k-means、层次聚类、DBSCAN 和 HDBSCAN。

K-means 的工作方式是首先随机选取 K 个起始点来调用中心点,然后根据哪些点最接近定义的中心来迭代计算新的中心点。这一直持续下去,直到中心点不再移动,并且每个点都在它的最终分区中。在我们的例子中,K-means 没有很好地工作,因为它对噪声没有弹性,并且需要我们指定聚类的数量。此外,k-means 更喜欢绘制直线来划分点,而不是动态绘制形状来聚集点,这对于我们的项目来说并不理想。下面的地图显示了 k-means 如何划分我们的数据,其中每个点代表一条推文,不同的颜色代表不同的聚类。

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

K-means location clusters

DBSCAN 通过遍历每个点并将预设ε距离内的点添加到同一个聚类中来生成聚类。在找到所有聚类之后,任何小于预定最小值的聚类都被作为噪声丢弃。DBSCAN 解决了 k-means 的两个最大问题,因为它对噪声具有鲁棒性,并且不需要预定义的聚类数。然而,DBSCAN 仍然不是完美的,因为它不能很好地处理变化的密度。运行 DBSCAN 时,伦敦市中心将是一个巨大的集群,而周围地区将有非常稀疏的集群,如下所示。伦敦市中心可能会举办许多当地活动,所以我们希望在市中心内外都能找到较小的集群。

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

DBSCAN location clusters

HDBSCAN 的工作方式与 DBSCAN 非常相似,但它不需要用户定义的 epsilon,而是根据不同区域的密度分层选择 epsilon。最后,我们决定使用 HDBSCAN,因为它对噪声具有很强的鲁棒性,并且可以处理可变密度的集群。下图显示了伦敦市中心包含至少 20 条推文的集群。这些聚类比 k-means 和 DBSCAN 发现的聚类更集中。

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

HDBSCAN location clusters

检测异常

使用位置聚类,下一个目标是识别能够反映事件发生高概率的推文集。对于每一个单独的位置桶,我们想要识别具有代表事件的高概率的推文组。在这一步中,我们将连续的时间间隔离散化为特定位置集群的每小时 tweet 活动组。接下来,我们计算每个位置聚类的统计数据,例如每小时推文的平均值和标准差。

下一步是为每小时的推文率建立基于标准差的阈值,以标记包含潜在事件的时间。由于我们想要标记与正常小时数有很大不同的小时数,我们使用平均值的两个标准偏差的阈值(假设正态分布,95%的数据位于两个标准偏差内)。当查看阈值的上限时,使用 0.025 的 alpha 级别,我们能够发现不同位置群集的推文中的尖峰,潜在地对应于给定群集中的事件。下图显示了特定集群位置的每小时 tweet 数据以及阈值。

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

在一个峰值内找到相似的推文

在检测到 tweets 数量的峰值后,我们首先确定峰值是否是由事件引起的。如果尖峰是由某个事件引起的,那么我们希望找到哪些导致尖峰的推文构成了该事件。峰值可能是由同时发送的不相关的推文引起的,但我们不想将此归类为一个事件。此外,一个事件可能正在发生,但可能有一些不相关的推文充当噪音,不能定义该事件。我们的目标是输出几组 tweet,其中每组对应一个事件,一组中的每条 tweet 代表检测到的事件。

为了做到这一点,我们通过删除 URL、提及、转发和标签来清理每条推文的正文。然后我们对每条推文进行词干分析和标记。接下来,我们将每条 tweet 转换为一个向量,每个词有一个维度,并用字数填充这个维度。然后,我们通过文档词频(TF-IDF)对每个向量进行归一化。最后,使用 DBSCAN 对相似的 tweets 进行聚类。由于每个集群都有属于它的最少数量的推文,所以不是所有的推文都会加入集群。如果聚类后在同一个聚类中有点,我们从结果聚类中选择最大的聚类。这可以确保有足够多的推文是关于同一个主题的,还可以找到哪些推文在内容上是相似的。

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

Example cluster of tweets defining a potential event

最初,为 DBSCAN 找到合适的ε参数是困难的,因为没有定量地定义找到合适的聚类。经过一番努力,我们决定尝试 HDBSCAN,因为它会根据密度自动找到合适的 epsilon 参数。这种算法执行得不是很好,因为它倾向于将具有相似内容的推文分开,这是有意义的,因为许多推文在 TF-IDF 向量空间中将倾向于靠得很近。最后,我们决定通过观察不同值输出的集群来调整 epsilon 参数。在我们的例子中,值 1.2 似乎工作得很好,但并不完美。我们如何检测事件的细节可以在下面的结果部分找到。

选择摘要推文

我们项目的最后一步是,给定一组与事件相关的推文,确定哪条推文提供了关于事件的简明而有用的信息。为了做到这一点,我们首先对每条推文进行标记化(分割成一个单词列表),并从每条推文中找到内容单词。然后,我们使用评分标准(术语频率-逆文档频率)找到最能概括事件的推文。

为了对 tweets 集进行标记,我们尝试了 NLTK 库中的 Twitter 专用标记器和 spaCy 标记器。Twitter 特定标记器在拆分推文上具有更好的准确性。然而,出于性能原因,我们使用默认的 spaCy tokenizer。更具体地说,由于我们需要使用 spaCy 的实体标记功能(下面解释),使用 spaCy 标记 tweet 更有意义,这样我们就可以直接访问这些功能。

要找到实词,重要的是定义什么是实词。一个快速而非正式的实词定义是一个传达高度信息的词。在 2015 年的一篇论文中。al 指出了三种传达高度信息的实体:数字、名词和主要动词。因此,我们使用 spaCy 的命名实体识别功能来查找标记,并在我们的标记化 tweets 列表中将它们设置为内容词。

在为每条推文找到我们的内容词之后,我们现在需要找到包含最高信息密度的推文。为了做到这一点,我们使用一种称为术语频率-逆文档频率(TF-IDF)分数的度量来对单词进行评分。我们使用这个标准来确定可能的实词列表中的词的“有用性”。由于我们已经在上一节中去除了候选推文中的大部分噪声,我们可以根据内容词在我们的集合中的频率对其进行评分,以找到包含可能对我们的用户有帮助的附加信息的推文。

在对我们的内容词进行评分后,我们就可以找到最大化内容词密度的推文了。本质上,我们试图解决一个优化问题:(1)我们希望找到具有最高内容分数的推文,给定约束条件(2)我们希望最小化用于获得最高内容分数的字数,以及(3)推文不应超过 150 个字。这类优化问题也称为整数规划,是 NP 完全的。为了解决这个整数规划问题,我们使用整数线性规划(ILP ),它使用一个叫做 pymprog 的数学建模库。这个库使得在 Python 中建模、求解、分析、修改和操作线性程序变得简单而高度灵活。

在解决了这个整数规划问题之后,我们得到了一个整数数组,该数组对应于选择了哪些 tweets 来最大化内容分数密度。上一步中显示的集群的最终输出是“Muse rocking the O2!!!@氧气。”

四。结果

确定如何评估准确性很困难,因为数据集没有标记,事件是主观定义的。为了了解我们的项目执行得有多好,我们仔细检查了数据,找到了数据集中发生的所有事件。然后,我们将此与我们的项目发现的事件进行了比较。本质上,我们标记数据集是为了验证的目的。

在强制要求 tweet 峰值必须由至少 10 个事件组成后,我们的模型发现了 26 个潜在事件。6 个尖峰被正确分类为事件,15 个尖峰被正确拒绝,因为它们不对应于事件。我们的模型错误地将四个尖峰分类为事件,并且意外地拒绝了一个尖峰作为事件。

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

我们正确识别的事件的一个例子是 O2 竞技场的 Muse 音乐会。

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

我们发现的一个更大规模的事件是女王的生日。

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

动词 (verb 的缩写)结论

我们这个项目的目标是使用地理标记的推文来识别当地事件。使用现有的数据集,我们将推文分成位置桶,使用 DBSCAN 定义重要事件,并选择最能代表每个事件的标题推文。我们能够识别出一些事件,比如在伦敦 O2 竞技场举行的音乐会和女王的生日。

在这个过程中,我们学到了很多东西;最重要的是我们需要更多的数据!有了更多的数据,我们可以减少噪音,并有希望找到更多的事件,减少错误分类率。除此之外,我们还假设推文通常会被用来报道某种类型的事件。然而,随着越来越多的人使用该平台进行简单的个人更新,情况并非如此。从机器学习的角度来看,我们发现评估无监督问题的性能是具有挑战性的,因为通常没有量化的措施来验证。

未来的工作

将来,我们将从收集更多的数据开始。理想情况下,我们会希望收集更密集区域和不同位置的数据。我们也有办法改进识别异常的方法。我们可以查看基于时间的推文密度,以识别不同长度的事件,让我们有机会区分每小时和一整天的事件。我们还可以尝试改变位置群集的大小。这可以突出显示在不同地理区域发生的事件。

此外,为了报告更好的摘要推文,我们可以通过将与事件相关的所有推文的重要方面拼凑在一起,而不是从现有推文中选择最佳的一个,来找出如何生成新的标题。最后,实时处理推文和定义事件将是这个项目产生有意义的商业影响的最终目标。

寻找魔法:具有潜在狄利克雷分配的聚集原型

原文:https://towardsdatascience.com/finding-magic-the-gathering-archetypes-with-latent-dirichlet-allocation-729112d324a6?source=collection_archive---------2-----------------------

结合纸牌游戏和主题建模

这篇文章在 reddit 上引发了一场有趣的 讨论 ,并被《海岸奇才》的 精选

我使用机器学习完成的最酷的项目之一,围绕着使用一种叫做潜在狄利克雷分配(LDA)的主题建模方法。主题建模仅仅意味着将主题分配给文档。这可能是为一个新闻故事找到一个类别,为一本书找到一个流派,或者为一副纸牌游戏找到一个原型。

我从十二岁左右就开始玩魔法:聚会。我想知道将 LDA 应用于魔术甲板工来发现原型是否有意义。结果令人惊喜!

甲板建筑人工智能

LDA 是一种无监督学习算法,它接受一组文档(甲板列表)和一些主题(原型)作为输入。通过无监督的学习,我的意思是我不会给它任何提示什么牌属于什么原型。我甚至没有试图去描述原型——我只是向它展示了一个甲板水手的集合,并询问原型的数量。

通过 LDA,我们可以发现什么样的卡片与什么样的原型相关联。也许我们要求它用三种原型来描述所有的牌组,它会返回对应于攻击、组合和控制牌组的牌列表。或者,举例来说,如果我们让它找出五个原型,它可能会简单地将卡片分成基本颜色:白色、蓝色、黑色、红色或绿色。

更有趣的是,我们还得到了一个原型中牌的概率分布。这意味着对于每一个原型,都有一对卡片和概率,其中所有的概率自然加起来就是一。继续上面的例子,我们可能会发现蓝色原型中最受欢迎的牌是快照法师,其次是血清幻象,然后是驱散等等。

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

Draw, go.

解析地寻找分布通常是困难的,并且包括估计难以处理的积分。来自一个叫做贝叶斯推理的学科的方法被用来从我们所知道的信息中得到分布的最佳猜测。在这种情况下,“我们所知道的”是我们的一套甲板货,这有助于我们很好地估计潜在的原型是什么样子的。

通过实例学习

作为统计学和机器学习的一般规则:我们拥有的数据越多,我们就能做出更好的估计。获得好的数据通常是一项困难的任务。因为我们给算法越来越多的甲板看起来像什么的例子,它将变得更好地理解一种格式,它看到更多的甲板清单。

MTG·戴克斯的天使好心为我们提供了这篇文章的数据。我将为本文分析的数据集由最近比赛中的 500 名现代甲板水手组成。

我应该在这里强调,数据是由原始的卡片列表组成的。人工智能不会收到任何关于牌组名称、谁建造了它、在哪里或什么时候玩过等等的信息。只有 500 张 75 张的单子。

确定原型

接下来,我们决定寻找一些原型。如果我们将它设置为 1,那么我们将得到一个包含数据集中所有卡片的原型。如果我们将其设置为 500,那么我们可以预期我们的 500 副牌中的每一副都是一个原型。

要寻找的原型数量是 LDA 的一个超参数*。这意味着它是我们在算法执行之前提供给它的一个额外的数字。机器学习的一个不幸方面是超参数优化——这是一个“尝试不同的值,直到你对结果满意”的花哨术语。*

低数量的原型,大约 1-20,大部分发现原型具有相同颜色的副牌或使用相似卡片的副牌。这些原型大多可以用“包含山脉和平原的甲板”或“包含流放之路的甲板”等来概括。值在 20-30 左右时,结果大多是好的,但被一个又一个退化原型破坏了,例如,亲和电子混合物。

将原型设置为 30 对我找到已知的原型很有效。

机器学到了什么

让我们来看看被发现的一些原型的前十六张卡片:

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

For each archetype, the algorithm returns a list of cards and their respective probabilities. These are the probabilities that: an unknown card of a deck, of a given archetype, is a specific card. We can interpret this as indicating how many copies of a given card are usually in a deck of the given archetype. Modern players will recognize archetype 27 as Infect and archetype 26 as Tron*.*

由于我已经有一段时间没有玩游戏了,我不得不参考 MTG 甲板上的元游戏原型来检查我的结果是否有意义。我要求找到 30 个原型,所以我收到了 30 张带有相关概率的卡片列表。原型本身是未命名的,只有一个与之相关联的整数——我必须自己找出原型的名称。看起来原型 27 和感染很匹配,原型 26 和艾尔德拉兹创匹配。

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

Which archetype is this?

我以前玩标准版,那时 Skullclamp 无处不在,Arcbound 掠夺者威胁着 meta。在注意到我的老朋友蹂躏者后,我更仔细地检查了原型 13,果然——它是亲和力

为了更好地理解这些数字,请注意 0.031 ≈ 2.3/ 75。这可以解释为一副 75 张的牌中平均有 2.3 张牌是“原型 13”。

但是考虑一下 Blinkmoth Nexus: 0.068 ≈ 4.1 / 75。一副牌中不能有超过四张非基本地的副本!记住,一副牌被建模为原型的混合物:一副牌不太可能被描述为 100%是任何给定的原型。如果人工智能看到一副亲和牌,那么它可能会说这是 97%的原型 13,给 Blinkmoth Nexus 每副牌 4 张牌的预期数量。

我们也可以将顶级卡片的值视为原型中卡片种类的度量。比较亲和力与感染,我们看到前 16 个亲和力卡有更高的概率和,表明这个原型有更多的 4-of staples。

创造性人工智能

关于 LDA 的另一件很酷的事情是,它是一个生成模型。这意味着我们可以用它来创建新的甲板。为此,我们首先选择一个原型,比如说亲和力。然后我们抽取新的卡片,一次一张。给定的卡被添加的概率由其每个原型的卡分布决定。然而,LDA 不知道魔术中的甲板构造规则,所以如果它使甲板非法,我们可能不得不重新做一个样本。

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

A deck with mixed main deck and sideboard generated from the multinomial distribution defined by the affinity probability vector. I sampled the cards, one at a time, sampling again if I would end up with 5 copies of a card.

该模型可以扩展到区分主甲板卡和餐边柜卡。例如,首先标记在数据集中频繁出现为餐边柜卡片的卡片。然后在主副牌的抽样过程中将这些牌的概率设置为零,对于餐具柜牌则相反。

进一步阅读

如果您想亲自看看如何重现本文中的结果,请参考带有代码的我的笔记本

该方法最初是由 Blei 等人在本文中提出的,但是维基百科的文章也给出了该方法的一个很好的技术概述。

我使用 python 包 gensim 来生成结果,其中有很好的教程和文档。

寻找意义:社会科学中小区域分析的数据问题

原文:https://towardsdatascience.com/finding-meaning-the-data-problem-with-small-area-predictive-analysis-in-the-social-sciences-part-9fba1e2c981b?source=collection_archive---------11-----------------------

更新:好消息!在这方面已经取得了很大进展。请阅读我对这篇文章的回应,因为我将在未来几天发表它们! 下面是 的第一个。

你可以在这里找到这个系列的第 2 部分。

你会在这篇文章中发现什么

  • 为什么我对小区域分析感兴趣…那到底是什么?
  • 所有的数据都在哪里?
  • 为分析准备数据——使用 Pandas 清理和聚合 Python 中不同来源的数据
  • 初步可视化

为什么我对小区域分析感兴趣…那到底是什么?

我曾经是纽约市一所特许学校的教师。我教普通和特殊教育学生高中数学、科学和计算机科学。根据我自己的经历和我同事的经历,我知道这个城市所有五个区的学生的故事。我知道社区健康和环境风险因素在特殊教育项目的学生比例以及学生的整体表现中占很大比重。从轶事经验来看,我发现这些学生无法控制的因素严重影响他们高中毕业以及高中毕业后继续接受教育的机会。

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

我也知道这种风险因素在城市的不同社区之间有很大的不同。例如,连接曼哈顿和新泽西的乔治·华盛顿大桥是每天最繁忙的桥梁之一。这座桥位于华盛顿高地附近的一个人口密集区,导致了整个城市最高的空气污染率。众所周知,空气污染会导致许多健康和发展问题,尤其是对非常年轻的人。

因此,我开始尝试使用小区域分析来发现教育程度和环境因素以及社区健康指标(如预期寿命、饮酒情况、早产率和许多其他指标)之间的统计显著联系。小区域分析将允许我分析整个城市的趋势如何变化,特别是因为“成为纽约人”的含义变化如此之大,以至于相距仅十个街区的两个家庭之间的生活可能会非常不同。小区域分析背后的想法是帮助确定不同社区的具体需求。

数据都在哪里?

我遇到的第一个问题是寻找数据。我最初开始从任何一个大都市地区(希望是几个)寻找数据,将我需要的数据聚集到适当大小的邻域中,并按适当大小的邻域进行分隔。最初,我希望找到按邮政编码聚合的数据。我搜遍了国家和州政府网站——没有运气。很快很明显,我所寻求的粒度的数据并不容易被公众获得,因为这是社会科学中一个相对的新想法。

最终,我去了我所知道的地方,并专门查看了纽约市,看看他们的政府网站或任何城市倡议是否会有我正在寻找的那种公开数据。最终,我偶然发现了纽约市社区健康调查,该调查将该市分为 59 个社区区,如下图所示。

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

社区健康调查(CHS)有我正在寻找的教育信息,以及我想要分析的许多公共健康和社区统计数据。然而,我仍然遗漏了许多我希望包括在内的环境风险因素,所以我继续寻找。我发现了大量的环境数据,但很少是按社区跟踪的,因此无法用于我的分析。此外,我可以使用的数据是以与来自 CHS 的数据完全不同的方式建立的。

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

NYC Community Health Survey Data

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

NYC Environmental & Health Data Portal

正如您所看到的,环境和健康数据(EH)要混乱得多,实际的相关数据值在三列中的任何一列中(在标有NULL的列之前)。此外,与 CHS 数据中的列标题不同,每个功能名称都使用第三列和第四列之间的组合来列出。显然,我必须找到一种方法来处理所有这些,以创建一个连贯的数据集。

为分析准备数据——使用 Pandas 清理和聚合 Python 中不同来源的数据

我首先必须决定我想看什么因素。在社区卫生服务数据集中,我对人口统计数据不感兴趣,对每个功能从 1 到 59 的排名不感兴趣,对组成前六列的城市和行政区范围的统计数据也不感兴趣。这是一个足够简单的练习来削减这些规格的数据集。

# Eliminating unwanted summary information
CD_CHS_data = raw_CHS_data.iloc[6:,:] # Eliminating data ranking each Community District on each feature by implementing a regular expression filter
CD_CHS_data.drop(list(NYC_data.filter(regex = 'rank')), axis = 1,            
                 inplace=True)

此外,所有的人口统计数据都集中在前面的列中,所以我使用original_CHS_columns = raw_CHS_data.columns.values.tolist()创建了一个列标题列表,删除前 33 列非常容易。

因此,我必须检查 CHS 数据中的NaN值,令我吃惊的是,有许多列都有这样的值,所以我使用下面的代码将它们聚集到一个列表中,发现除了一列(第一列)之外,所有列都只是“可靠性注释”。在以后的数据传递中,我可能会考虑这些,但是我想得到一些基线,所以我简单地删除了“可靠性注释”栏。

# Creating a list of the columns with NaN values
CHS_NaN_columns = []for column in original_CHS_columns:
    if CD_CHS_data.loc[:, column].isna().any():
    CHS_NaN_columns.append(column)# Deleting desired columns
CHS_columns_to_delete = CHS_NaN_columns[1:]
CHS_data_to_merge = CD_CHS_data.drop(columns=CHS_columns_to_delete)

唯一剩下的有NaN值的列是“avertable deaths _ rate ”, 59 个中只有 5 个——不到 10%,所以我决定简单地估算那些有平均值的。在进一步检查数据源和收集技术后,使用不同的方法替换这些值可能是明智的,但同样,获得基线是我当时的首要任务。此外,我知道 EH 数据将花费我更多的时间来准备与 CHS 数据合并。

如前所述,EH 数据集使用两列来描述每个测量或特征。应用一个lambda函数来合并这两列非常简单:

CD_EH_data['labels'] = CD_EH_data.apply(lambda row: ''.join([row[2], row[3]]), axis=1)

更困难的部分是讨论的另一个问题,即实际数据分布在数据集中的三个不同的列中。我用下面的方法着手解决这个问题。

# Because much of the data in many column was words (names of neighborhoods) first it is necessary to convert all the data to numeric data, "coercing" non-numeric data to be represented as NaN
for column in [8, 9, 10, 11]:
    CD_EH_data.iloc[:,column] =  
           pd.to_numeric(CD_EH_data.iloc[:,column], errors='coerce')# Following the pattern observed in the CSV file, the first numeric value starting from the right of the dataframe would be the desired value
def get_value(row):
    if not np.isnan(row[11]):
        value = row[11]
    elif not np.isnan(row[10]):
        value = row[10]
    elif not np.isnan(row[9]):
        value = row[9]
    else:
        value = row[8]
    return value

CD_EH_data['values'] = CD_EH_data.apply(lambda row: 
                                        get_value(row), axis=1)

最后,为了合并这两个数据集,我必须在合并之前用 EH 数据创建一个数据透视表。

# Create the pivot table with desired features
EH_data_to_merge = CD_EH_data.pivot_table(index='ID', 
                                          columns='labels', 
                                          values='values')# Merge the datasets
NYC_data = EH_data_to_merge.merge(CHS_data_to_merge, how='outer', 
                                  left_index=True, right_index=True)

初步可视化

热点图是直观查看数据集中不同要素之间相关性的绝佳方式。下面是使用 sci-kit 的“RobustScaler”缩放每个功能后,使用 seaborn 和 matplotlib 库创建的热图。

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

该数据集中有许多要素,在下一部分中,我将“放大”查看要素集的几个子集,以对结果进行一些分析。

另一种可视化数据的方法是使用主成分分析,它允许我们通过分解这些特征(使用大量复杂的数学运算)将数据尽可能多地分布在二维图形上,来可视化具有许多特征(每个特征都有自己的维度)的数据。

在这两个图表中,红点代表教育程度最高的社区区域不是高中毕业,黄点代表教育程度最高的区域是高中毕业,可能是大学毕业,蓝点代表教育程度最高的区域是大学毕业或更高。

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

正如您在上面看到的,标准化每个属性的数据稍微有助于将每个组聚集在一起,尽管还有许多需要改进的地方。

在我的下一篇文章中继续阅读这个项目,第二部分!

利用机器学习发现《权力的游戏》中的死亡模式

原文:https://towardsdatascience.com/finding-patterns-of-death-in-game-of-thrones-using-machine-learning-68cf95d7f1d1?source=collection_archive---------2-----------------------

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

Valar Morghulis ( 所有人都必须死)是任何 GoT 粉丝最难忘的一句话。几乎每一集都有令人震惊的死亡。大多数角色,包括杰出人物,都遭遇了暴力的结局。但是死亡是随机发生的呢,还是发生在具有相似特征的特定角色身上呢?那些死去的人和那些设法活下来的人之间有某种模式吗?

当你玩权力的游戏时,你要么赢,要么死。

机器学习是一种技术,它允许计算机找到隐藏的洞察力,而无需显式编程去哪里寻找。它从足够多的过去的例子中学习来预测未来。在这个项目中,我将机器学习应用于 Kaggle 上的《权力的游戏》数据集,以识别影响角色死亡的特征。(数据集基于《冰与火之歌》这本书,而非该剧。)

因为真正的粉丝看书。

数据集

该数据集包括总共 27 个特征(标题、性别、文化、年龄、贵族、在每本书中的出现、死亡关系的数量、受欢迎程度等)。)大约 2000 个字符。它还描述了角色在第五本书(《与龙共舞》)结束时是生是死。

功能选择

在将分类特征转换成数字特征后,我总共有 685 个特征。然后,我使用带有线性支持向量分类器的 SelectFromModel 来选择最佳的 32 个特征。

交叉验证和超参数优化

我将数据集分为训练集和测试集(80–20)。具有 10 重交叉验证的线性 SVC 在测试集上提供了 0.76 的准确度。调整内核参数将精确度提高到 0.78。优化的随机森林分类器进一步提高了 0.82 的精度。

方法性能

我使用 TP(真阳性,即正确预测的死亡人物)、FP(假阳性,即活着的人物预测死亡)、TN(真阴性,即正确预测的活着的人物)和 FN(假阴性,即死亡的人物预测活着)的比率来测量精确度、召回率和 f 分数。

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

我的模型的预测结果是:

+--------+-----------+--------+---------+
| Labels | Precision | Recall | F-Score |
+--------+-----------+--------+---------+
| Alive  | 93%       | 85%    | 86.5%   |
| Dead   | 47%       | 70%    | 63.5%   |
+--------+-----------+--------+---------+

重要特性

在随机森林中使用特征重要性度量,发现以下特征贡献最大(从贡献最大到贡献最小排序):

  1. 与角色相关的死亡角色的数量
  2. 《乌鸦的盛宴》中的人物形象
  3. 《与龙共舞》中的人物形象
  4. 角色的性别
  5. 《权力的游戏》中的人物形象
  6. 性格的高贵
  7. 《刀剑风波》中的人物形象
  8. 角色的头衔(社会地位)
  9. 角色所属的房子
  10. 《国王的冲突》中的人物形象
  11. 角色的受欢迎程度

探索特征与死亡的关系

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

Is there a relationship between survival and number of dead relatives?

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

Does appearing in more books relate to survival?

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

Does belonging to a noble family make you prone to death?

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

How does house relate to survival? (Only houses with more than 10 members have been considered.)

做好准备,冬天来了!更多的死亡和情节曲折也是如此。虽然我们只能等待冬天的风来看看接下来会发生什么,但这一分析可能会帮助我们做好准备。因为黑夜是黑暗的,充满了恐惧。

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

我将收集更多的数据,并对上述结果进行进一步的分析,以预测未来书籍中人物的命运。你可以在 Github 上找到我的代码,并在 Twitter 上与我联系,讨论一些很酷的想法。让我们的极客来展示我们对这本书和这个节目的热爱吧。

除非他杀光他们…

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

用 BOW,TFIDF 和 Xgboost 寻找相似的 Quora 问题

原文:https://towardsdatascience.com/finding-similar-quora-questions-with-bow-tfidf-and-random-forest-c54ad88d1370?source=collection_archive---------4-----------------------

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

photo credit: Pixabay

Google 长期以来在索引和信息检索中使用 TFIDF 来计算给定关键字对给定页面的重要性

Quora 是一个问答网站,它的用户社区以意见的形式提问、回答、编辑和组织问题。

2018 年 9 月,Quora 报告月度用户达到 3 亿。每个月有超过 3 亿人访问 Quora,所以很多人问重复的问题也就不足为奇了,也就是说,这些问题有着相同的意图。比如像“我怎样才能成为一个好的地质学家?”以及“我该怎么做才能成为一名伟大的地质学家?”是重复的问题,因为它们都有相同的意图,应该只回答一次。

Quora 非常努力地消除重复问题,但是 NLP 是一个非常困难的问题。有这么多方法来描述同一个意思,看看上面的例子就知道了。Quora 用户提供了很大的帮助,合并了类似的问题,比如:

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

source: Quora

在这篇文章中,我们将开发一个机器学习和 NLP 系统来分类问题对是否重复,我们从一个带有 Xgboost 的模型 BOWTF-IDF 开始。

BOW 和 TF-IDF 是人们在信息检索中最常用的两种方法。一般来说,支持向量机和朴素贝叶斯更常用于分类问题,但是,因为它们的精度依赖于训练数据,所以 Xgboost 在这个特定的数据集中提供了最好的精度。XGBoost 是一个梯度增强框架,已经变得非常流行,尤其是在 Kaggle 社区中。因此,我决定使用这个模型作为基线模型,因为它设置简单,易于理解,并且有合理的机会提供体面的结果。我们的基线模型将允许我们快速获得性能基准。如果我们发现它提供的性能不够充分,那么检查简单模型的问题可以帮助我们选择下一个方法

数据预处理

Quora 重复问题公共数据集包含超过 40 万对 Quora 问题。在我们的实验中,我们将数据随机分为 70%的训练样本和 30%的测试样本。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inlinedf = pd.read_csv('quora_train.csv')
df.dropna(axis=0, inplace=True)
df.groupby("is_duplicate")['id'].count().plot.bar()

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

Figure 1

这些职业并没有完全平衡,但这并不坏,我们不会去平衡它们。

在清理文本之前,我们预览几个问题对,以确定如何清理它们。

df.drop(['id', 'qid1', 'qid2'], axis=1, inplace=True)
a = 0 
for i in range(a,a+10):
    print(df.question1[i])
    print(df.question2[i])
    print()

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

Figure 2

你可能已经注意到我们在文本清理方面有很多工作要做。经过一些检查,一些尝试和来自的想法 https://www . ka ggle . com/Currie 32/the-importance-of-cleaning-text,我决定对文本进行如下清理:

  • 不要删除停用词,因为像“什么”、“哪个”和“如何”这样的词可能有强烈的信号。
  • 不要词干。
  • 去掉标点符号。
  • 纠正错别字。
  • 将缩写改为其原始术语。
  • 删除数字之间的逗号。
  • 将特殊字符转换为单词。诸如此类。

clean

清理文本后,我们再次预览这些问题对。

a = 0 
for i in range(a,a+10):
    print(df.question1[i])
    print(df.question2[i])
    print()

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

Figure 3

好多了!

特征工程

一段时间以来,我们在对单个文本进行分类方面很有经验——但是对文本之间的关系进行精确建模的能力相对较新。这里我使用 Panda 的concat函数将来自问题 1 和问题 2 的两个文本对象连接成一个。scipy.sparse.hstack用于水平堆叠稀疏矩阵(按列)。

词袋+ Xgboost 模型

这种后续策略(计数矢量器)被称为**单词包。**通过单词出现次数来描述文档,而完全忽略单词在文档中的相对位置信息。它对文档进行标记,计算标记的出现次数,并以稀疏矩阵的形式返回它们。

Xgboost 与以下参数一起使用,这些参数是根据验证数据中的性能选择的:

max_depth=50
n_estimators=80
objective='binary:logistic'
eta=0.3

bow_xgboost

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

Figure 4

字级 TF-IDF + Xgboost

TF–IDF是两个统计量的乘积,术语频率和逆文档频率,它是当今最流行的术语加权方案之一。

我们将 tf-idf 归一化应用于出现计数的稀疏矩阵,从单词级、n-gram 级和字符级。

word_tfidf_Xgboost

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

Figure 5

关于特征工程的一个微妙之处是,它需要知道我们在实践中很可能不知道的特征统计。为了计算 tf-idf 表示,我们必须基于训练数据计算逆文档频率,并使用这些统计来缩放训练和测试数据。在 scikit-learn 中,在训练数据上安装特征转换器相当于收集相关的统计数据。然后,可以将安装好的变压器应用于测试数据。

N-gram 级 TF-IDF + Xgboost

N_gram_tfidf_Xgboost

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

Figure 6

人物等级 TF-IDF + Xgboost

character_tfidf_Xgboost

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

Figure 7

我们的最高验证分数是 0.80,对初学者来说一点也不差!

到目前为止,我们最好的 Xgboost 模型是字符级 TF-IDF+Xgboost,重复问题的召回率,即我们的模型能够检测的重复问题占重复问题总数的比例是 0.67。这对于手头的问题至关重要,我们希望检测并尽可能多地消除重复问题。

考虑到这一点,我们将开发一个 word2vec 和 Xgboost 模型,看看这个结果是否可以改进,这将是下一篇文章的

这篇文章的 Jupyter 笔记本可以在 Github 上找到。周末快乐!

用 Word2Vec 和 Xgboost 寻找相似的 Quora 问题

原文:https://towardsdatascience.com/finding-similar-quora-questions-with-word2vec-and-xgboost-1a19ad272c0d?source=collection_archive---------4-----------------------

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

photo credit: Pixabay

如何使用自然语言处理来识别任何文本数据集中的相似记录

上周,我们探索了使用 BOW、TFIDF 和 Xgboost 识别相似文档的不同重复数据删除技术。我们发现传统的方法如 TFIDF 可以取得一些令人印象深刻的结果。这也是谷歌长期以来在索引和信息检索中使用 TFIDF 来计算给定关键词对给定页面的重要性的原因之一

为了继续我们的学习之旅并增长我们的技能,今天,我们将探讨如何使用不同的方法解决相同的匹配和重复数据消除问题,同样,我们将把重复数据消除作为分类器的扩展来处理。我们开始吧!

数据

Quora 重复问题对的任务是确定一对问题是否具有相同的含义。数据包含一对问题和一个由人类专家标记的基本事实标签,标记这对问题是否重复。请注意,这些标签是主观的,这意味着并非所有人类专家都同意这一对问题是否重复。因此,这些数据应被视为有根据的,而不是 100%准确的。

df = pd.read_csv('quora_train.csv')
df = df.dropna(how="any").reset_index(drop=True)
a = 0 
for i in range(a,a+10):
    print(df.question1[i])
    print(df.question2[i])
    print()

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

Figure 1

计算单词移动者的距离

WMD 是一种允许我们以一种有意义的方式评估两个文档之间“距离”的方法,不管它们有没有共同点。它使用单词的矢量嵌入。它将两个文本文档之间的差异度量为一个文档的嵌入单词需要“行进”以到达另一个文档的嵌入单词的最小距离。让我们看一个例子,下面的问题对被标记为重复:

question1 = 'What would a Trump presidency mean for current international master’s students on an F1 visa?'
question2 = 'How will a Trump presidency affect the students presently in US or planning to study in US?'question1 = question1.lower().split()
question2 = question2.lower().split()question1 = [w for w in question1 if w not in stop_words]
question2 = [w for w in question2 if w not in stop_words]

我们将使用 word2vec 预训练的谷歌新闻语料库。我们将这些加载到一个 Gensim Word2Vec 模型类中。

import gensimfrom gensim.models import Word2Vec

model = gensim.models.KeyedVectors.load_word2vec_format('./word2Vec_models/GoogleNews-vectors-negative300.bin.gz', binary=True)

让我们用 wmdistance 方法计算这两个句子的 WMD。记住,这两句话表达的是同一个意思,在原 quora 数据中被标注为重复。

distance = model.wmdistance(question1, question2)
print('distance = %.4f' % distance)

距离= 1.8293

这两个句子之间的计算距离相当大。这就把我们带到了规范化的大规模杀伤性武器。

标准化 word2vec 向量

当使用 wmdistance 方法时,首先规范化 word2vec 向量是有益的,这样它们都具有相等的长度。

model.init_sims(replace=True)
distance = model.wmdistance(question1, question2)
print('normalized distance = %.4f' % distance)

归一化距离= 0.7589

正常化后,距离变小了很多。

再来一对试试,这次这两道题不重复。

question3 = 'Why am I mentally very lonely? How can I solve it?'
question4 = 'Find the remainder when [math]23^{24}[/math] is divided by 24,23?'question3 = question3.lower().split()
question4 = question4.lower().split()question3 = [w for w in question3 if w not in stop_words]
question4 = [w for w in question4 if w not in stop_words]distance = model.wmdistance(question3, question4)
print('distance = %.4f' % distance)

距离= 1.2637

model.init_sims(replace=True)
distance = model.wmdistance(question3, question4)
print('normalized distance = %.4f' % distance)

归一化距离= 1.2637

归一化后,距离保持不变。WMD 认为第二对没有第一对相似。成功了!

模糊的

我们已经介绍了 Python 中模糊字符串匹配的一些基础知识,让我们快速浏览一下 FuzzyWuzzy 是否可以帮助我们解决问题重复数据删除问题。

from fuzzywuzzy import fuzzquestion1 = 'What would a Trump presidency mean for current international master’s students on an F1 visa?'
question2 = 'How will a Trump presidency affect the students presently in US or planning to study in US?'
fuzz.ratio(question1, question2)

53

fuzz.partial_token_set_ratio(question1, question2)

100

question3 = 'Why am I mentally very lonely? How can I solve it?'
question4 = 'Find the remainder when [math]23^{24}[/math] is divided by 24,23?'
fuzz.ratio(question3, question4)

28

fuzz.partial_token_set_ratio(question3, question4)

37

基本上,Fuzzywuzzy 不认为第二对问题是相似的。那很好。因为根据人类评价,第二对是不相似的。

特征工程

首先,我们创建几个函数来计算 WMD 和归一化 WMD 以及单词到向量的表示。

wmd_normWmd_sent2vec

我们将创建的新功能包括:

  • 单词的长度。
  • 字符的长度。
  • 问题 1 和问题 2 之间常用词的长度。
  • 问题 1 和问题 2 之间的长度差。
  • 向量 question1 和 question2 之间的余弦距离。
  • 城市街区(曼哈顿)矢量问题 1 和问题 2 之间的距离。
  • 向量 question1 和 question2 之间的雅克卡距离。
  • 向量问题 1 和问题 2 之间的堪培拉距离。
  • 向量 question1 和 question2 之间的欧几里德距离。
  • 向量 question1 和 question2 之间的闵可夫斯基距离。
  • 向量问题 1 和问题 2 之间的 Bray-Curtis 距离。
  • 向量问题 1 和问题 2 的偏度和峰度。
  • 大规模杀伤性武器
  • 标准化大规模杀伤性武器

所有的距离计算都可以通过使用scipy.spatial.distance函数来完成。

new_features1

word 2 虚拟建模

我们将使用 word2vec 预训练的谷歌新闻语料库。我下载并保存到“word2Vec_models”文件夹中。然后,我们将这些加载到一个 Gensim Word2Vec 模型类中。

model = gensim.models.KeyedVectors.load_word2vec_format('./word2Vec_models/GoogleNews-vectors-negative300.bin.gz', binary=True)
df['wmd'] = df.apply(lambda x: wmd(x['question1'], x['question2']), axis=1)

归一化 Word2vec 建模

norm_model = gensim.models.KeyedVectors.load_word2vec_format('./word2Vec_models/GoogleNews-vectors-negative300.bin.gz', binary=True)
norm_model.init_sims(replace=True)
df['norm_wmd'] = df.apply(lambda x: norm_wmd(x['question1'], x['question2']), axis=1)

获取问题 1 和问题 2 的向量,然后计算所有距离。

new_features2

Xgboost

Xgboost

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

Figure 2

我们创建的所有新功能的 Xgboost 实现了 0.77 的测试准确性,低于字符级 TF-IDF + Xgboost 的 0.80,但是,我们能够将重复问题的召回率从 0.67 提高到 0.73,这是一个显著的改进。

Jupyter 笔记本可以在 Github 上找到。祝你一周工作顺利!

参考:

https://www . LinkedIn . com/pulse/duplicate-quora-question-abhishek-thakur/

寻找创业公司——在早期风险投资基金中担任新数据科学家的工作笔记

原文:https://towardsdatascience.com/finding-startups-notes-on-work-as-a-new-data-scientist-in-an-early-stage-vc-fund-7e994c8f390e?source=collection_archive---------18-----------------------

(合著 【保罗·迈因豪森】 )

上个月,我作为一名数据科学家加入了早期风险投资基金 Montane Ventures ,在班加罗尔工作。我加入 Montane 是因为有机会与几家伟大的初创公司一起研究有趣的数据和技术问题,也因为我喜欢早期初创公司与小团队一起开发产品时的信噪比。

我的一部分时间将花在 Montane 已经投资(或正在合作投资)的初创公司上;帮助他们提升数据科学成果和能力。我还会花时间做风险投资分析师更传统的工作:帮助寻找和识别投资的创业前景。

风险投资通常是为了支持那些以雄心勃勃和创新的方式使用技术的公司。Montane Ventures 的团队认为,风险投资本身的工作可以通过雄心勃勃的创新技术得到改善。随着技术和数据科学的使用在过去几十年中以各种方式发展,如果我们以二三十年前投资者的方式确定有前途的投资,那将是奇怪的。这是我被雇佣的很大一部分原因;这是我将与团队紧密合作的事情。

让数据科学软件成为风险投资的有效工具本身就雄心勃勃且困难重重(世界上还有其他几个基金或多或少地公开参与了类似的努力)。在 Montane,我们正在探索将数据科学融入风险投资的多种方式。这篇文章是为了追踪我们的一些想法,特别是关于使用数据科学来帮助我上面确定的第二个主要职责所涉及的内容:确定投资的初创公司。

在这篇文章的剩余部分,我将

  1. 解释风险投资如何受益于数据科学,
  2. 描述我们使用的数据为什么以及如何产生。
  3. 概述数据科学可以应用的两个主要领域,以及
  4. 分享我们关于数据科学将如何增加价值的一些具体假设

投资不容易

那么为什么需要数据科学来寻找创业公司进行投资呢?从外面看,风险投资似乎很容易:投资者有资本;大多数(全部?)创业公司要资本;投资者只需要选择谁得到它,然后进行投资。

只是没那么简单。想象一下,投资者有一定的时间来完成他们所有的工作。现在减去他们筹集新资本、管理基金以及与已经投资的公司合作所需的时间。我们剩下的时间让他们去寻找新的投资项目。用这种基本方式来表达有助于明确我们的目标:有效利用时间。我们甚至可以把它变成一个非常简单的等式:

I = T — (R+P)

其中:
I 是分配给对初创公司进行新投资的时间,
T 是可用的总时间,
R 是行政管理基金和筹集新资本所需的时间,
P 是与基金的投资组合合作并支持该投资组合(已投资的初创公司)所需的时间。

该基金需要在寻找投资的初创企业中进行分配。比方说,如果每年有 10 家初创公司准备融资,那么你可以为每家初创公司分配大约 10%的时间(或更少),决定支持哪家,然后专注于你选择的 1 或 2 家初创公司。有超过 10 家初创公司在寻求投资。有几百或几千个。创业公司的数量是造成这一分配问题的部分原因。

图片是澄清问题的另一个有用的工具。下图从概念上将投资决策过程建模为一系列依次更小的子集:

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

由于被投资的创业公司是你所知道的创业公司的一个子集,最终投资子集的质量受到初始群体质量的制约。

现在要澄清的是,没有人知道一个生态系统中初创公司总数的准确规模(让我们以印度为例——我们暂且不谈生态系统本身的流动性和难以划分的问题)。但是我们可以把理论上的总人口看作是我们分配问题的数据集。第一个挑战是收集我们的数据集(并保持其最新),它将保持真实人口总数的样本,并希望尽可能接近它。我们将这部分问题称为扫描

继续说印度的创业生态系统,这一估计认为印度的科技创业公司数量约为 4750 家。我们将以这个数字为起点。由于市场的不断变化,初创公司是一个有趣的库存问题。他们只在特定的时间点筹集资金,如果你是一个专注于特定阶段的基金,那么你真的只能在每个初创公司作为初创公司存在的时间子集(他们筹集资金的间歇时间段)的子集(例如 A 轮)投资该初创公司。

我们希望我们的数据集中有尽可能多的创业公司,因为这是我们要从中选择的样本。如果有一些我们应该考虑投资的初创公司不在我们的初始人口数据集中,我们就会遇到数据收集和样本偏差的问题。

如果有一些我们应该考虑投资的初创公司不在我们的初始人口数据集中,我们就会遇到数据收集和样本偏差的问题。

下一步是选择我们将花时间仔细考虑的创业公司子集。我们将这部分问题称为过滤。我们希望我们的过滤功能尽可能好:避免误报(我们让初创公司通过了过滤,然后花太多时间考虑它们是否很适合我们的基金)和漏报(没有通过过滤但实际上具有良好投资潜力的初创公司)。

接下来的两节概述了扫描和过滤问题。

扫描

为 VC 开发数据科学软件并不是为了自动化 VC(先明确一点!).投资者做的很多事情不会被机器取代。投资者在长期任期内培养的个人关系会带来内向推荐,这通常是老牌风险投资基金的一大优势。总的来说,内向流量(联系投资者而不是相反的创业公司)是风险投资渠道的重要组成部分。除了个人推荐之外,入站流量还受到来自在线和离线媒体的一般声誉的驱动,如故事、采访和资金公告。正是风险投资的在线存在,使得基金能够被寻找投资的初创公司发现。

我们不想取代以上任何一个。我们只是认为,将过滤数据集局限于入站会给我们留下一个有缺陷的数据集——一个不包含和不具有代表性的实际创业人口样本。

除了通过集客活动寻找创业公司,互联网和在线资源已经是任何投资者寻找过程的重要组成部分。局限性在于,对许多投资者来说,搜索过程大多是手动的。投资者会阅读创业新闻和社交媒体等,并发现他们决定跟进以进行进一步调查的创业公司,或者指派分析师或合伙人进行跟进。数据科学可以帮助建立一个补充的搜索过程,使我们的过滤数据集尽可能全面。

收集数据的互联网来源可以分为几类。

  • 聚合网站是最直接、最重要的来源。他们以结构化的格式呈现数据,并努力做到尽可能全面和详细。更开放的两个最著名的网站是 CrunchbaseAngellist 。像 Tracxn 这样的网站是付费/订阅网站和服务的好例子。
  • 资金公告是另一个强大的来源。这些网站没有聚合网站那么结构化,但通常是融资活动的第一份公开文件。印度的 VCCircle 是一个发布半结构化融资公告的网站。你的故事又是一个。
  • 加速器/孵化器是早期创业公司的良好来源。如果只有一两个,您可以很容易地手动跟踪它们。然而有很多这样的并且他们每隔几个月就有新的一批;理想情况下,你不希望每隔几个月就必须记得手动检查每个网站,以找到关于一家初创公司的信息。

并非所有信息都可以在网上获得。然而,初创公司会在网上分享自己的信息有三个原因,我们可以在网上高效地找到这些信息:

  1. 他们需要筹集资金,他们希望投资者找到他们
  2. 他们需要招聘,他们希望员工找到他们;
  3. 他们需要销售,他们希望顾客找到他们

任何新公司都会在这三个动机中的至少两个下运作。

过滤

一旦我们有了未来 6(或 N)个月内可能成为投资目标的所有初创公司的数据集,下一个任务就是筛选它们。

投资的大部分筛选和最终决策都必须借助人类投资者的专业知识和洞察力来完成。我们不期望让软件来做投资的最终决定。因此,我们的目标应该更加明确。我们制定了两个,我们仍然认为假设,而不是结论性的目标:

  1. 能够对创业公司进行更系统的比较,而不是对每一家创业公司进行简单的是或否的决定。
  2. 在投资过程的早期,要注意危险信号或需要密切关注的领域。

1。在初创公司之间进行更系统的比较,而不是对单个初创公司做出孤立的是或否的决定,是有价值的。

这第一个目标是我们通过反思我们的投资经验而制定的。每个初创企业的投资过程通常看起来是有序和分散的。在你没有深入投资尽职调查过程的时候,你会定期会见和评估初创公司。一旦你决定一家初创公司看起来很有趣,你通常会开始花更多的时间和他们在一起,考虑他们的论点和商业模式。随着你花更多的时间在一家初创公司上,你有更少的时间进行介绍会议和对其他初创公司的探索性评估。你在一家初创公司呆的时间越长,它就越偏离另类投资,比较就变得不那么频繁和有用。

这可以被建模为一种隧道过程,你越深入隧道,就越难与其他创业公司进行比较;因为你在考虑这个创业公司的所有细节和背景。

这种方法有一些缺陷,因为投资者并没有真正做出是否投资的决定。他们已经筹集到了资金,人们认为他们会进行投资。真正的问题是,是投资(时间和注意力以及最终的资本)创业公司 E 还是创业公司 F(或者创业公司 G……)。这总是一个权衡。虽然你必须评估所有支持和反对投资创业公司 E 的理由,但分析应该尽最大可能包括对现有的替代投资进行明确和系统的比较。在整个投资过程中,这种比较应该尽早、定期地进行。

2。在投资过程中尽早意识到危险信号或需要密切关注的领域。

当我们发展了我们的假设和建立了我们的原型过程,我们喜欢识别非常真实的、具体的和特定的例子来说明我们可以给投资过程增加的价值。对于我们的第二个假设,我们将分享一个在班加罗尔真实创业的例子。请注意,这并不是要谴责或批评某个特定的创业公司。只是有时候学习来源于明确承认和关注不幸的故事。

2015 年和 2016 年是许多金融科技初创公司在印度成立和获得资金的时期。那个时期的创业公司之一是班加罗尔的一家名为 Finomena 的公司。他们受到了很多关注,并得到了活跃在印度的一家主要全球风险投资基金的支持,有一段时间,他们被认为是该领域最知名的初创公司之一。到 2018 年,他们已经关闭了。虽然 Finomena 关闭的确切原因并不为公众所知,但在社区内部,人们认为存在领导问题以及资本和财务管理问题。当风投决定投资一家公司时,这是他们渴望避免的结果。

那么,数据科学如何在收集和识别信息方面发挥作用,而这些信息可以通过分析来帮助及早发现这些问题呢?举个例子,Finomena 的员工在 Glassdoor 上的评论表明了管理层的问题,也可能是公司文化的问题。在评估中,前员工和管理层之间不断提出同样的抱怨和反复的争论是一个警告信号。一旦你的数据管道建立起来,这是一个简单的步骤,自动扫描 Glassdoor 的数据集中的任何公司,并快速过滤危险信号。

提醒一下,不是所有的危险信号都会出现在任何特定的地方。初创公司可以在网上的个别地方人为粉饰自己的形象。尽管有操纵公众形象的能力,但仍有一个很好的理由来系统地、定期地扫描网上信息来源,并将这些信息纳入你的决策过程。

结论

在 Montane,我们仍处于开发这一领域工作的早期阶段。我们很高兴能成为其中的一员,并将数据科学的工具和方法带入 VC 的世界。我们将继续发展我们的思维,并通过这些帖子分享我们的工作实例。因此,如果你有兴趣将技术和数据科学引入风险投资,请继续关注!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值