TowardsDataScience 博客中文翻译 2019(三百四十五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

午夜黑客 1:可视化我的 Swiggy 订单历史

原文:https://towardsdatascience.com/midnight-hack-episode-1-visualizing-my-swiggy-order-history-f1cce25cbff6?source=collection_archive---------9-----------------------

却没有耐心去阅读?别担心。

下面是 可视化仪表盘 仪表盘预览 下面是项目 Github 链接

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

现在是晚上 11 点,当我在去订多份午夜餐的路上时,我心想:

我不太清楚自己的点餐习惯。有趋势吗?我能否从我的订购历史中获得一些有意义的见解?

当我在 Swiggy(一个印度食品订购和交付应用程序)上浏览甜点选项时,我试图弄清楚如何才能获得我的订单历史数据。现在,我从过去的经验中了解到,有时友好的请求会奏效。让我们试试那个。

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

所以是的,那没有成功,但是有志者事竟成。

我大概可以在订单历史页面上拦截对 Swiggy 应用的网络请求。我知道像 Drony 这样的应用可以做到这一点。但是我必须开发一个定制的应用程序,以便遍历所有的订单页面并汇总结果。aggggggghhhhhhhhh……好像工作量太大了。我们称这个计划为 b 计划吧。如果没有别的办法,b 计划会回来的。

我想网络会是更好的选择。相对更容易黑。我只希望他们的网站上还有订单历史页面。

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

耶,他们有一个功能齐全的网站。我以为他们已经完全移动化了。嗯,对我来说不错。他们甚至有订单历史页面。我现在泪流满面。戴夫眼泪:')

让我们打开 chrome 开发工具,看看一些网络请求,好吗?

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

Order list response

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

GET request headers

哦,那个甜甜的 JSON 回复:)

看起来 order_id 是分页的参数。

他们似乎在使用 CSRF 代币。查看请求头,似乎他们使用 cookies 来维护会话,并使用 CSRF 令牌来避免第三方客户端请求。我以为他们会使用一些简单的 JWT 令牌,所以我打算使用 python 来处理网络请求,但我想这不是一个选项。

最好通过浏览器访问 API。不确定这是否可行,但让我们试一试。

var xmlHttp = new XMLHttpRequest();
xmlHttp.open( “GET”, “[https://www.swiggy.com/dapi/order/all?order_id=](https://www.swiggy.com/dapi/order/all?order_id=)", false );
xmlHttp.send( null );
console.log(xmlHttp.responseText);

当我登录时,这个简单的 JS 片段应该能够使用会话 cookies 获取订单数据。

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

Order response through JS snippet

而且成功了:')

我没想到它会和他们采取的所有安全措施一起工作,但是嘿嘿嘿……

现在,我所要做的就是修改脚本,这样它就可以对所有页面进行分页,并为我提供汇总数据。

order_array=[]
order_id=’’
page = 1try {
    while(true){
        var xmlHttp = new XMLHttpRequest()
        xmlHttp.open( “GET”, “[https://www.swiggy.com/dapi/order/all?order_id=](https://www.swiggy.com/dapi/order/all?order_id=)"+order_id, false )
        xmlHttp.send( null )
        resText=xmlHttp.responseText
        var resJSON = JSON.parse(resText)
        order_id=resJSON.data.orders[resJSON.data.orders.length-1].order_id
        order_array=order_array.concat(resJSON.data.orders)
        console.log(“On page: “+page+” with last order id: “+order_id)
        page++
    }
}
catch(err) {
    console.log(order_array)
}

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

Complete order history

总计 53 页和 518 订单。

*看着他松软的肚子。

还不错。一点也不差。*内心呐喊

现在,我可以添加一些代码来保存文件中的数据,但有一个更简单的方法。右键单击数据>存储为全局变量。使用命令复制复制剪贴板中的数据。

copy(temp1)

将其粘贴到记事本中并保存。瞧,现在你有了整个 Swiggy 的历史。

文本数据5MB ,信息很多。最初,我想以文本形式获得一些见解,但是,看看这些数据,最好创建一个可视化的仪表板。

我真的没有任何创建可视化的经验,但是在浏览了大量的文档和评估工具之后,比如 J upyter Notebooks,Matplotlib,Plotly,Dash;我决定和达什一起去。它有一个非常直接的布局过程,并且与 python 配合得很好。

现在是第二天下午 4:20。经过一整夜的分析和设计,这是最终的结果。

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

Screencap of Visualization Page

你可以在这里 查看我的可视化仪表盘 。如果您想可视化自己的 Swiggy 订单历史,所有需要的资源都托管在 这里

我认为我从这个项目中得到的最有用的见解是我在食物上花了多少钱,这也是从一个单一的来源得到的。我不知道自己在 Swiggy 上花了多少钱。

直到下一次…

千禧一代最喜欢的水果:用 ARIMA 模型预测鳄梨价格

原文:https://towardsdatascience.com/millennials-favorite-fruit-forecasting-avocado-prices-with-arima-models-5b46e4e0e914?source=collection_archive---------20-----------------------

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

It’s a fruit. — Photo by Thought Catalog on Unsplash

如果你知道关于金融的第一件事,你就会知道在千禧年和白色栅栏之间的唯一障碍是鳄梨吐司。如果信息时代的孩子们能站起来,离开早午餐桌,把他们捣碎的鳄梨和荷包蛋放在全麦面包上,那么他们也许能买得起他们在爱荷华州艾姆斯的梦想中的两居室明明

为了声援千禧一代的鳄梨吐司引发的金融危机,我想更深入地研究一下美国最受欢迎的水果。是的,鳄梨是一种水果——甚至是一种浆果。我的研究还表明,鳄梨实际上并不是烤面包制造商为了卖出更多烤面包的阴谋。

因此,在这篇文章中,我将分析来自哈斯牛油果委员会(HAB) 的数据,这是一个为行业专业人士提供全球牛油果价格研究和数据的贸易组织。如果你想了解鳄梨相关的研究,你可以在这里找到数据。

数据

HAB 数据集由从 2015 年 1 月 4 日到 2018 年 3 月 25 日的 168 周每周时间序列数据组成。在此期间,该数据集提供了美国 54 个地区的常规和有机鳄梨的平均价格和总量数据,总计超过 18,000 次观察。

所以让我们进入正题——我们的鳄梨长什么样?

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

视力测试告诉我们,有机鳄梨的平均价格比传统鳄梨更高,也更不稳定。深究这些数字,所有地区传统鳄梨的平均价格为 1.16 美元,标准差为 0.26 美元。同时,有机鳄梨的平均价格为 1.65 美元,标准差为 0.36 美元。

然而,看看销售的鳄梨,发现有机鳄梨只占同期美国销售的所有鳄梨的 3%。2015 年 1 月至 2018 年 3 月期间,消费者购买了超过 3300 万个常规鳄梨和不到 100 万个有机鳄梨。

我们知道传统鳄梨的平均价格更高,在销售方面远远超过有机鳄梨。所以,这就提出了一个问题——价格和销售量之间的关系本质是什么?

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

(Conventional) Pearson’s Correlation = -0.51 p-value<0.001 | (Organic) Pearson’s Correlation = 0.02 p-value=0.75

在为期 168 周的研究中,传统鳄梨的平均价格和销售量呈中度负相关。这里没有什么不寻常的,而是经济学的基本原理——需求量随着价格的下降而增加。

有机鳄梨讲述了一个不同的故事。有机鳄梨的价格标签和销售量之间没有统计上的显著关系。需求持平,这意味着无论价格如何,消费者都不太可能大幅改变他们的需求量。背景对于理解这种关系很重要。

研究表明,收入较高的消费者、小孩和/或大学学历的人比他们的同龄人更有可能成为“忠实”的有机消费者。在这种情况下,“投入”表示消费者在有机水果和蔬菜上的支出高于其家庭收入的平均水平。因此,有理由认为定期有机鳄梨消费者属于一个非典型的人群。不幸的是,我没有足够的资源来找出这种平淡关系背后的因果因素,但我当然可以(也很乐意)大胆猜测。经常购买有机商品的消费者(可能)更有可能出于某种原则而购买。也许消费者认为有机食品比非有机食品更健康或更道德。因此,由于有机食品价格的简单变动,有机消费者不太可能消费非有机食品,因此我们对有机鳄梨的需求曲线是平坦的。

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

Right: Average Price (USD) | Left: Total Volume (Avocados Sold)

接下来,我想快速浏览一下各个地区的价格和销量。东北人(我的人民)和华盛顿人(也是我的人民)为这个国家的有机和传统鳄梨支付了最高的价格。东北人平均为传统鳄梨支付 1.34 美元,为有机鳄梨支付 1.86 美元。与此同时,普通鳄梨的全国平均价格为 1.09 美元,有机鳄梨为 1.55 美元。

就数量而言,西方人平均每周消费最多的鳄梨,包括传统的和有机的。西方人每周消费超过 618 万个传统鳄梨和 22 万个有机鳄梨。与全国平均水平相比,西方人消费了美国销售的 18%的传统鳄梨和 23%的有机鳄梨。

有很多鳄梨吐司。

预报

我认为可以很有把握地说,就买得起我前面提到的那套两居室而言,这艘船已经航行了几千年。我的意思是,美国人每周在鳄梨上花费大约 700 万美元,所以几千年来对白色栅栏的所有希望都应该破灭。

谢天谢地,根据皮尤研究中心的调查,我属于 Z 世代。当然,这意味着我需要了解鳄梨经济将如何影响我实现与栅栏相关梦想的机会。

为此,我求助于 ARIMA 预测。 A uto- R 过度 I 积分 M 移动 A 平均模型是一类通用模型,允许通过“差分”使预测模型稳定平稳性是预测中的一个重要条件,因为非平稳性会破坏传统置信区间、假设检验和预测的可靠性。

ARIMA 模型可以分为三个部分,AR,I 和 MA。首先,AR 组件描述了一个线性多元回归,其中给定数量的 Y 的先前值作为 *Y(t)的预测值。*I 分量描述了使模型稳定所需的差分顺序。MA 组件类似于 ar 组件,因为它将滞后值引入模型。然而,滞后值是以前的误差项,而不是以前的值。

感谢像我这样的 ARIMA 新手,Rob Hyndman 在 R 中的“预测”包配备了 auto.arima 函数。Auto.arima 测试了几个 arima 模型,并根据 Akaike 信息标准选择了最佳模型,为选择最终模型提供了一个良好的起点。

使用扩展的 Dickey-Fuller 检验,检验可能偏向 OLS 估计量的单位根,我得出结论,对于我的四个模型——常规价格、常规交易量、有机价格和有机交易量——中的每一个,一阶差分都是必要的。此外,我选择使用季节性 ARIMA 模型,它包含另一组给定期间(在本例中为 52 周或一年)的 AR、I 和 MA 参数。

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

那么,我们能从我们的模型中学到什么?首先,我们的平均价格模型似乎告诉我们,鳄梨价格在每年的秋季达到顶峰。2017 年 10 月,传统鳄梨达到 1.65 美元的峰值,我们的模型预测,秋季的峰值将持续到 2018 年和 2019 年。然而,该模型预测,在接下来的两年里,传统鳄梨的价格将呈下降趋势。2015 年至 2018 年间,常规鳄梨的平均价格为 1.09 美元。2018 年至 2020 年,预测平均价格为 1.01 美元,下降约 7%。

与之形成鲜明对比的是,该模型预测有机鳄梨价格将在波动性较小的支撑下温和增长。2018 年至 2020 年的预测平均价格为 1.84 美元,而 2015 年至 2018 年为 1.55 美元。该模型当然显示了有机鳄梨价格的温和上涨趋势。

然而,平均价格的增长也部分归因于波动性的降低,预测期内价格的标准差从 2015 年至 2018 年期间的 0.36 美元标准差降至 0.16 美元。

据预测,在 2018 年至 2020 年期间,传统和有机鳄梨的销量都将出现强劲增长。传统鳄梨产量预计将增长 40%以上,平均每周售出 3370 万至 4760 万个鳄梨。

有机鳄梨预计会经历更迅猛的增长。预计 2015 年至 2018 年之间的持续增长趋势将持续到 2019 年,2018 年至 2020 年之间的增长率将高达 74%。2015 年至 2018 年间,供应商每周售出约 97 万个有机牛油果。2018 年至 2020 年间,这一数字预计将跃升至 168 万个有机鳄梨。

讨论

我认为这些模型真的很令人兴奋。首先,在模式识别方面,有趣的是看到模型在季节趋势上有所回升。价格模型捕捉到了秋季的价格上涨,而交易量模型捕捉到了每年 2 月鳄梨交易量的峰值。

此外,诊断看起来相当不错。平均绝对百分比误差(MAPE)用于测量预测值和观测值之间的误差,因此较低的值表示模型拟合度较好。在四个模型中,有机体积模型的 MAPE 最高,约为 6%,表明该模型的准确率约为 94%。我对这种契合度非常满意,我对所有的车型都很有信心。至少,我像一个预测新手一样自信。

如果我不得不发表评论(我很乐意这样做),我会说有机鳄梨产量的增长预测有些乐观。我不确定仅仅两年 74%的增长有多现实,但是测试几个模型得出了类似的结果。

或者,我认为传统的鳄梨价格模型有些悲观。随着 2015 年以来秋季价格上涨逐年增加,我很惊讶该模型预测整体价格下降。然而,如果这种情况持续到 2020 年,你将不会看到我在早午餐时抱怨。

结论

朋友们,这就是我对 ARIMA 天气预报的小小介绍,还有一个像鳄梨这样有价值的测试主题。尽管传统鳄梨的价格可能会下降,但鳄梨销量的增加似乎将阻止下一代人实现郊区房产天堂的梦想。

我希望你喜欢我对预测的尝试,我希望很快回到这个主题,有更多改进的 ARIMA 模型和其他更复杂的模型。嘿,也许投资有机鳄梨种植者——你可能会看到 74%的回报。

嗯,可能不会。

读心术算法

原文:https://towardsdatascience.com/mind-reading-algorithms-368bdf412eb2?source=collection_archive---------17-----------------------

推荐系统介绍

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

Photo by Virginia Johnson on Unsplash

今晚的游戏计划:一顿热饭,一张温暖的床,和几个小时的网飞。最棒的是,你即将让它发生。

你把钥匙放在前门,转动锁,把门推开…

《黑镜》的最后一集有点令人不安。也许今晚我应该给索尔打个电话……

你已经穿过前门一半了…

…可能不会像《绝命毒师》那么好,但是…等等,那是什么?

附近正在播放音乐。你出去听着。它来自你大楼旁边的那家新商店。这是你过去几天一直在想的一首歌。商店前面铺着红地毯。

*“电子商店”,*你喃喃自语,读着商店顶部发光的红色霓虹灯上的内容。你几次路过这里时,都没怎么注意这个地方。

你将对展出的东西进行快速检查。毕竟,几分钟的逛街不会伤害任何人。

你走进商店,注意到里面灯光明亮。有各种各样的货架上摆放着物品,一些店员在移动和整理物品。商店中心有一个小舞台,配有一张沙发和一个小架子。

仔细一看,你注意到舞台上小小的架子上只有你的尺码和你喜欢的运动品牌的跑鞋。你一直在考虑重新开始跑步。

是我做点什么的时候了吗?

你挑选了一双鞋,走向收银台。在去那里的路上,你看到一个放着跑步衬衫和裤子的架子。看一眼就会发现,有些可以和你的新鞋搭配成一套很棒的衣服。你很快就会看到。

我不能像个业余选手一样出去!

现在你有了完整的跑步装备,你可以继续去收银台了。在把东西交给店员时,你注意到一张海报,上面是你最喜欢的演员在跑马拉松。他们穿的衣服几乎和你将要购买的一样。唯一的区别是,你漏掉了他们戴的智能手表。

几率有多大

店员微笑着指着收银台旁边展示的智能手表。你愉快地忍受着。

离开商店后,几个小时后,你开始反思你的疯狂消费。除了装备和智能手表,你还买了一副太阳镜、蛋白粉、健身房订阅和健康计划。

也许逛街并没有那么有害……

对于实体店来说,这似乎是一个遥不可及的故事,但却是许多互联网服务的基础。故事中的E(vil)store用来吸引你注意力的策略,你可以在这篇文章的参考资料中找到一个现有的数字类比。这些技术中的大多数都与被称为推荐系统的领域相关。

现在推荐人无处不在。很有可能你正在阅读这篇文章是因为一个建议产生的。他们负责用户在 Amazon⁴购买的 35%的东西,人们在网飞观看的 75%的东西,以及在 YouTube⁵.观看的 70%的时间

这些算法在我们的社会中是如此根深蒂固,以至于人们甚至开始警惕他们的 risks⁶.反 vaxxers,平地球支持者和其他阴谋论者已经学会操纵这些系统,以不成比例的高比率推荐他们的内容。那些主张一个由互联网驱动的新启蒙时代的人很可能没有想到今天的 YouTube。

到目前为止,这篇文章并没有帮助恢复推荐系统的形象。但我的目标是关注他们积极的一面。推荐者为我们提供了一项有价值的服务:通过减少选择的不确定性来做出决策。此外,正如我们将在接下来的章节中看到的,在一个充满无限选择的数字世界中,这不是一件容易的事情。

通过这篇文章,我想分享一个关于推荐人的什么,为什么,如何的直观想法。我不打算涵盖实现或技术细节。所以,如果这就是你想要的,请小心。

简而言之,如果你需要向老板解释什么是推荐人,这篇文章可能会有所帮助。相反,如果你需要为你的老板建立一个推荐者,这篇文章可能有助于在你搜索其他文章时分散他的注意力!

推荐系统 101

推荐系统推荐器是一套技术,用于根据用户的需求向他们推荐最合适的项目。尽管这个定义听起来很简单,但它隐藏了许多细节。

在推荐者的上下文中,一个项目是一个非常具有延展性的想法。它可以是娱乐应用程序中的电影或歌曲,也可以是约会应用程序中可能的爱情或配偶。基于项目的质量,推荐器试图猜测哪些项目最适合推荐给给定的用户。因此,如果你有看动作片的历史,你很可能更喜欢收到像《速度与激情》这样的推荐,而不是网飞最新的浪漫剧。

合适也是一个主观的问题。从用户的角度来看,你期望一个推荐者为你的需求尽可能快地提供最好的选择,并且支付最少的费用。另一方面,一家企业试图谋生,因此推荐者提供建议的方式需要反映这一目的。人们可以预期,用户和企业的需求有时会发生冲突。

查尔斯·杜希格(Charles Duhigg)推广了一个建议走得太远的生动例子。在《习惯的力量》一书中,他提到了一个案例,一位愤怒的父亲通过定向广告发现他十几岁的女儿怀孕了。广告公司利用他女儿的购买历史,认为她可能很快就会需要婴儿服装,并为此发送了优惠券。不知情的父亲收到了邮件,发现了优惠券。在向公司代表投诉后不久,从他女儿那里得知她确实怀孕了。

在这篇文章中,我选择了推荐系统的定义,它并不局限于软件或*计算机系统。*这是因为这些系统不是只有大的技术公司才能建立的技术问题。此外,它们不局限于数字世界,甚至不局限于人类事务。

狩猎采集文明需要向他人推荐他们生存的最佳觅食地。国王们有部长小组来建议政府重要领域的行动方针。即使在动物界,蚂蚁也会留下痕迹,向蚁群中的其他成员提示去 food⁷.的最佳路线

最近,推荐系统的使用扩展到广泛的数字服务。在选择过多的应用程序中,这变得很有必要。对这种系统的研究始于 70 年代的杜克大学。然而,第一个基于软件的推荐系统 Tapestry 花了 20 年才问世。它是在施乐帕洛阿尔托研究中心(PARC)开发的,并发表在 1992⁸.的《美国计算机学会通讯》杂志上

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

Xerox PARC researchers during an informal meeting⁹. Probably complaining about all the cat images filling their inboxes.

由于电子邮件的使用越来越多,施乐 PARC 公司的研究人员试图用 Tapestry 处理他们收到的所有不必要的文件。这个系统利用人们的合作,根据他们的反应来标记文档。然后,这些标签被用来创建个人过滤器,减少每个用户收到的文档数量。例如,爱丽丝可以创建过滤器,只接收鲍勃和乔标记为有趣的文档,接收玛丽·⁰.标记为重要的文档

但是,一个最初作为文档过滤器的算法是如何在我们今天的数字服务中如此根深蒂固的呢?这就是我们将在下一节讨论的内容。

为了简单起见,从现在开始我们将只关注基于软件的推荐器,并且将使用广义的术语推荐系统、推荐器系统和 推荐器来指代它们。

小书架和无限书架的问题

想象一下,你将要在你的镇上开一家书店。现在亚马逊主导了市场,这感觉是一个可怕的想法。即便如此,没有人会阻止你的创业动力。你已经签了一个小但位置好的地方的租约,还计划向顾客提供你的招牌浓缩咖啡。

不久前,您收到了来自几家出版社的书籍目录,今天您需要挑选哪些书籍将会摆满书架。但是,当你通读第一个目录时,做决定会越来越困难。

我应该订购保罗·柯艾略的新书吗?…

饥饿游戏系列怎么样?…

还有我的朋友德里克最近出版的《牧场着装专家的回忆》?

书架的空间限制了你一次可以拥有多少本书。因为你可能想长期生存下去,所以明智的做法是只向公众提供最受欢迎的书籍。对不起,德里克……

在这种情况下,照顾顾客的个人需求是不可能的,因为你没有足够的空间放这么多书。如果你想赚钱,你需要展示你知道的有需求的东西。一些客户可能找不到他们想要的书,但是大多数人只要买了最受欢迎的书就会很开心。

现在,想象几年过去了。你的策略非常有效。顾客对你选择的书籍和招牌浓缩咖啡非常满意。如此之多,以至于一家大型连锁书店最近出高价收购你的书店。他们想任命你为首席执行官来推动他们新建立的数字战略。

最后,你再也不用担心有限的货架空间了。该公司的主页是一个无限的、完全可定制的书架。此外,你可以访问像亚马逊一样大的库存。你只需要从 5000 万本书中找出哪些书展示给你下个月期待的 1000 万名顾客……嗯……

你可以坚持以前的策略,在主页上给每个顾客展示最受欢迎的书籍。然而,数以百万计的顾客对你向他们展示的东西不感兴趣。此外,你不会开发你的巨大库存的潜力。最终结果可能是数百万愤怒的顾客和业绩不佳的销售。

另一个选择是在主页上显示所有可用的书籍。尽管如此,你还是面临着选择悖论的风险。当人类面对丰富的选择时,非但没有感到快乐,反而变得烦躁和焦虑。因此,你很有可能最终会让顾客更加恼火,减少销售额。

你担任首席执行官才几周,董事会已经在重新考虑你的任命……

绝望中,你走出办公室,走进雨夜。看着天空,你尖叫,要求一条出路…

突然,你的手机震动了…

你在雨中花了几秒钟努力解锁手机,直到你能看到通知…

“想看什么?在你湿淋淋的屏幕上,一条来自网飞的小横幅上写着“我们建议黑镜:Bandersnatch”。

呃…谢谢,但现在不是时候…

或者……是吗?

这就是推荐系统介入的地方。通常,以不太戏剧化的方式。

在向用户提供所有可能的选择或向所有用户提供通用选择之间存在一条中间道路。通过使用推荐器,可以向每个用户提供一些经过深思熟虑的建议。

为此,你不需要关心书籍的受欢迎程度。您可以将每个客户的兴趣与书籍的属性(如流派、长度和作者)相匹配。例如,你可能会发现一些客户会对《光明使者》系列而不是《权力的游戏》(GoT)反应更好。在网上书店,这是你可以也需要关心的事情。在实体店,这些顾客很可能需要购买 GoT 系列。

在线世界和现实世界满足顾客需求的差异被称为长尾*。下图有助于理解这一现象。水平轴上的每个条形代表一个项目。这些条按照流行度(在垂直轴中表示)以递减方式排序。*

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

The Long Tail. Physical stores define what they show to users by their shelf space limitations. Online stores use Recommenders to define what to show.

垂直虚线左边的条是实体店由于空间限制可以展示的商品。相比之下,网上商店可以展示所有的商品:尾巴和受欢迎的商品。推荐器旨在解决在线环境中显示过多选项的问题。

到目前为止,我们已经看到了什么是推荐器以及它们解决的问题。现在,我们将回顾推荐者产生建议的不同方式。

神奇的推荐者和在哪里可以找到他们

除了推荐器的 WhatWhy 之外,了解这些系统通常是如何构建的也是有意义的。为此,我们将回顾标准的六类推荐人⁴以及哪些科技公司使用了它们⁵:

  • 基于内容(CB): 推荐与用户喜欢的项目相似的项目。为了识别相似性,推荐器使用项目的特性或特征。对于书籍推荐者,该算法可以使用流派、作者或书籍长度作为推荐类似书籍的特征。使用者:脸书和亚马逊
  • 协同过滤(CF): 推荐其他口味相似的用户过去喜欢的用户项目。CF 背后的推理是“两个或两个以上在一个领域有相似兴趣的人也倾向于购买其他领域的相似物品或产品。”使用者:亚马逊、脸书、LinkedIn 和 Twitter
  • **人口统计:**根据用户的人口统计资料推荐商品。这些系统通常按照特定于业务的规则对用户进行细分,并基于这些细分生成推荐。使用人:易贝
  • **基于知识:**通过将明确的用户需求与商品特征相匹配来推荐商品。例如,您指定卧室的数量、占地面积,网站会返回最佳匹配房屋的列表。
  • **基于社区:**利用用户朋友的喜好推荐物品:告诉我你的朋友是谁,我告诉你你喜欢什么。
  • **混合:**这种类型的推荐器推荐结合了两种或两种以上先前技术的项目。一个典型的例子是将协同过滤方法与基于内容的系统相结合。使用者:亚马逊和网飞

在这六种类型的推荐器中,前两种,基于内容和协同过滤,是最受欢迎的。这两个网站上都有丰富的资料。如果你想深入挖掘推荐者或者自己建立一个,就从这里开始吧。

结束语

本文从推荐系统的技术介绍开始。然而,经过一点研究,我注意到已经有数百篇文章有类似的目标。

因为我没有动力去做同样的事情,所以我把一些叙述和理论混合在一起,写了这篇科学怪人的文章。我希望它对理解推荐者有所帮助,也许会给你——至少——一个同情的笑声。

我们现在处于一个时代,这些算法正在塑造我们日常生活的重要部分。我们应该理解我们在社交媒体订阅源、在线购物建议和其他数字服务中看到的东西背后的含义。本文试图以一种可理解的方式填补这一空白。

我希望你喜欢这篇文章。如果你有任何问题或意见,请随时给我留言。

后续步骤

最后,如果你想了解更多关于推荐者的信息,我有一些建议作为起点:

理论

申请

数据集

参考

[1] Mailchimp,什么是重定目标? (2019,访问日期)

[2] R. Reshef,了解协同过滤方法 (2015)

[3] A .钱德拉舍卡,f .艾买提,j .巴西利科和 t .杰巴拉,网飞的艺术作品个性化 (2017)

[4] I. MacKenzie、C. Meyer 和 S. Noble,零售商如何跟上消费者步伐 (2013 年)

[5] A. Rodriguez, YouTube 的推荐驱动了我们观看的 70%(2018)

[6] G. Chalot,YouTube 上的 Twitter 帖子的推荐 (2019)

[7] R. Sharma,R. Singh,推荐系统从古代到现代的演变:调查 (2016)

[8] R. Sharma,R. Singh,推荐系统从古代到现代的演变:调查 (2016)

[9]计算机历史,施乐 PARC (2019,访问日期)

[10] Huttner,Joseph,从 Tapestry 到 SVD:为推荐系统提供动力的算法综述 (2009)

[11]_ Curly _ Council,这是一个我可以预见自己会进入的职业 (2013)

[12] P .希伯特,选择的悖论,10 年后 (2017)

[13] J. Leskovec,A. Rajaraman,J. Ullman,挖掘海量数据集,第 9 章 (2014)

[14] F. Ricci,L. Rokach,B. Shapira,推荐系统手册介绍,第 1 章 (2011)

[15] R. Sharma,R. Singh,推荐系统从古代到现代的演变:调查 (2016)

读心术正义女士

原文:https://towardsdatascience.com/mind-reading-lady-justice-215ec8e2c2f5?source=collection_archive---------27-----------------------

使用机器学习预测法院判决

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

Photo by walknboston

几个月前,我正在寻找一个机器学习的兼职项目,这时我撞上了联邦承包商不当行为数据库。由非营利组织政府监督项目 (POGO)策划,数据库中的每个条目都代表一家为联邦政府工作的公司被指控违反法律或法规的事件。POGO 公开发布数据库,以阻止联邦机构与罪犯签署进一步的协议。

一个示例条目:

**Instance**            Inadequate Number of Anesthesiologists in Texas
**Contractor(s)**       Humana
**Misconduct Type**     Consumer Affairs
**Date Type**           Date of Consent Orders
**Date**                10/8/2018
**Contracting Party**   None
**Enforcement Agency**  State/Local
**Court Type**          Administrative
**Disposition Type**    Fine
**Total Penalties**     700000

上图中,你可以看到保险公司 Humana 被指控在德克萨斯州的医疗保健网络中没有足够的麻醉师。他们必须是联邦承包商才能进入数据库,但没有列出合同方,所以违规不是特定工作的一部分。德克萨斯州政府将他们告上行政法庭,最终他们被罚款 70 万美元。

我决定开发一个机器学习软件,它可以根据数据库中的其他信息预测承包商不当行为的结果。在上面的例子中,如果系统正确地预测到 Humana 将被罚款,那么它将运行良好。

还有其他机器学习系统 预测 法院案件结果。在我看来,最强有力的价值主张是,知道你胜诉的可能性有助于你决定你应该有多愿意庭外和解,这要么改善结果,要么节省时间和金钱。对于这个项目,我们可以想象,要么是被指控行为不当的承包商,要么是指控他们的执法机构,可能会为法院判决的足够好的预测买单。出于我在这里的目的,我没有考虑一些对熟悉这一法律领域的人来说显而易见的事情,例如,我的系统不知道只有当法院类型是Criminal时结果Found Guilty才是可能的。

我开始筛选我的系统可用的输入字段或特征。我放弃了日期字段,因为它的含义不一致,还放弃了承包商的身份,因为我希望我的预测器同样适用于没有事故记录的承包商。这给我留下了四个特征,都是绝对的。

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

High level data flow of prediction in this project

和机器学习问题一样,我的主要问题是可用的数据量有限。POGO 的数据库维护得很好,但只有大约 2500 个条目。在分离出一些测试数据后,我降到了 2000 以下。并且一键编码我的分类特征使维度数量膨胀到 112。虽然还可以更好,但这个比例符合通常使用的经验法则,即每个特性有十个训练示例。但是我也有 14 个目标类,或者可能的结果,来匹配输入,所以我没有让我的期望太高。

在建模之前,我t-SNEd 并绘制了数据:

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

The relatively orderly separation between the colors here implies it should be possible to make decent predictions. Click through to explore individual incidents.

准备好开始建模,我从 scikit-learn 建立了一系列标准分类器,在缺乏更具体目标的情况下,通过对所有可能结果进行平均的 F₁评分来比较它们。非线性支持向量分类器表现最好,径向基函数核 SVC 位于顶部,平均 F₁为 0.663。不是特别靠谱,但是比猜测好多了。(随机猜测处置类型但频率正确的虚拟分类器得分为 0.087。)

说客数据

不当行为数据库的前提是,政府机构倾向于错误地重新雇用有不良记录的承包商,忽略更合适的投标。如果这种偏袒是真实的,它会不会也影响到不当行为案件的判决呢?例如,如果一家公司的高管与政府决策者生活在同一个社交圈,那么该公司可能会赢得不应得的合同,也会得到监管机构的宽大处理。如果是这样的话,知道一家公司关系良好将有助于我们更好地预测他们在法庭上的结果。

我决定加入第二个数据源,这个数据源反映了一家公司在华盛顿的整体影响力。游说似乎是一个很好的起点。由于 2007 年通过的透明法,国会游说者被要求公开报告关于他们的客户、员工和活动的信息。每个季度,每个游说公司都会提交一份包含这些信息的披露表,然后以 XML 文件的形式在网上公开。

为了从披露表中获取数据,我必须编写代码来解析它们,并提取我需要的部分。这些表格是由游说公司手工填写的,标准化程度很低,具有固有的灵活结构(例如,列出的游说者人数各不相同),所以我不得不在获取干净数据时制定启发式规则。在我的探索性分析中,我很高兴地看到,无论是谁在管理众议院游说者的披露,都没有费心从生产数据库中删除他们的测试提交,留下了几十个标题类似Ms. QA Test Cycle 6.0.0的表格。

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

一旦我的数据提取开始运行,我试图从原始数据库中找出哪些承包商也被列为游说公司的客户。令我惊讶的是,通过编写一些简单的字符串匹配代码,我能够为其中的 70%找到说客。我从说客披露的信息中提取了几个字段,并将其添加到承包商数据集中,即:

  • 承包商是否有说客
  • 游说公司将他们列为客户的总次数
  • 这些条目下列出的个人游说者的总数

将这些特征添加到我的数据集中,并重新运行基于 RBF 的 SVC,我的平均 F₁略有提高,从 0.663 提高到 0.676。

这一结果表明,了解一家公司游说努力的规模有助于你判断他们在法庭上会得到什么结果。很难说为什么。也许公司明确地与国会议员合谋来逃避起诉。也许法官会无意识地偏袒更有声望的公司,这些公司也往往有更多的说客。也许公司雇佣了很多说客以为他们可以绕过监管,但是他们还是被抓住了。我的最佳猜测是,这只是钱的问题;在法庭上花更多钱请律师的公司,可能也会花更多钱请律师代表他们去见国会议员。

有很多方法可以改进这个项目,但是我最感兴趣的是引入另一个新的数据源。我们可以通过将游说者的数据与同一家公司更丰富的信息来源进行比较,来测试这些数据是否提供了任何独特的见解,这些信息来源在商业上有很多。另一种选择是提取与不当行为指控本身相关的特征。在法律文件上使用自然语言处理和其他技术是研究创业的活跃领域。考虑到项目的范围,我最满意的是我能够获得两个最初看起来不相关的公开可用的数据源,并迅速将它们组合起来,以产生对我的预测器的具体改进。

你可以在这里找到我这个项目的代码

Luke Persola 是旧金山的一名数据科学家和工程师。我目前正在寻找一个全职的数据科学职位!更在

关注机器:关于数据科学工作和人工智能未来的播客

原文:https://towardsdatascience.com/mind-the-machines-a-podcast-about-data-science-jobs-and-the-future-of-ai-a450eb67b1e1?source=collection_archive---------27-----------------------

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

自从我们推出sharpes minds以来,我们已经了解了很多关于数据科学就业市场的情况。我们已经采访了数千名有抱负的数据科学家,我们已经让 100 多人获得了他们在该领域的第一份工作,我们已经就人工智能的未来展开了比我们能够计数的更激烈的争论。

我们还认识了很多优秀组织中的全明星数据科学家、数据分析师和机器学习工程师,如谷歌大脑、Twitter Cortex、亚马逊、特斯拉汽车、微软等,这样的例子不胜枚举。我们从与这些有趣的人交谈中学到了很多,所以我们想与更多的观众分享一些。那就是你!

让我们知道你的想法,并在 Twitter @jeremiecharris@neutronsNeurons@russ_poll 上与我们联系!

程序员的正念

原文:https://towardsdatascience.com/mindfulness-for-programmers-da6f92147b8f?source=collection_archive---------22-----------------------

编程时 3 个简单的练习

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

Photo by Fatos Bytyqi on Unsplash

有时候我讨厌编码,就像我喜欢编码一样。我的脚本无法运行,毫无帮助的模糊错误不断在屏幕上嘲笑我,我只想用手提钻钻进我的笔记本电脑,收集球,声称周二是开始周末的合适日子。代码有严格的规则,任何有严格规则的东西在某些时候都会令人非常沮丧。这可能看起来很愚蠢,但是如果我让它发生,我不能解决的一段代码可能会毁了我一整天。

应对挫折

如果我能足够早地意识到我将变得非常沮丧,并且这可能是我最好离开一会儿或寻求某人帮助的时刻之一,我可能会挽救我的一天免受破坏,并通过打破沮丧循环为自己赢得一些时间。这就是正念发挥作用的时候。

如果我从不感到沮丧(或者我的代码非常完美,从不出错),我需要正念吗?

正念带来创造力

在我看来,编程是一门需要创造力和创新的艺术。我所知道的最好的程序员是有创造力的,并且在他们所有的项目中寻求创造力。令人惊讶的是,作家和程序员有很多共同点。如果你坐在电脑前,至少 80%的时间盯着屏幕,按照严格的语法规则书写,你可能是其中之一。虽然成为一名作家听起来像是梦想中的生活,但当许多人想象一名作家从他可爱的办公桌上看着日落,在他的笔记本电脑旁边放着一杯酒,一堆纸上潦草地写着长句时,大多数人认为程序员的生活是孤独、乏味、无聊的,浪漫主义显然已经死亡,创造力是一个愚蠢的词。

正如我在之前关于正念和创造力的文章中提到的,一个有创造力的头脑需要休息和空间。研究已经多次表明,正念练习和冥想对创造性思维有积极的效果。这对于被认为是浪漫的作家来说很重要,但对于程序员来说也很重要。

[## 为了增加你的创造力,什么都不要做。

达到目标的关键可能是简单地学习如何什么都不做。

medium.com](https://medium.com/swlh/to-increase-your-creativity-do-nothing-dcc39d7eb4d1)

断开连接

当我在编程时,我经常全神贯注于我的任务,我的大多数同事也是如此。它代表了我们最有效率、最专注、处于他们所谓的“T0”表现模式“T1”的时刻。尽管如此,我注意到许多程序员(包括我自己)当他们真正专注于他们的任务并与外界断开联系时,会变得稍微粗鲁、不体贴或只是沉默寡言。尽管专注对生产力有积极的影响,但我们大多数人都必须在团队中工作,并不是每个人都会在一天中的同一时间获得“专注时刻”。我们都没有头顶上的灯亮着,表示“走开,我在区域”当它发生时,大多数试图联系我们的人通常没有打扰我们的目的(希望如此)。当有人在可以被定义为“错误的时刻”向我寻求帮助时,注意到我现在(或曾经)在这个区域的事实帮助我做出了适当的反应。

作为一名程序员,开始练习正念的简单步骤

1。感受你的键盘

作为一名程序员和作家,我花在触摸键盘上的时间可能是全世界最多的。当你意识到你的手在一天中的大部分时间都放在一台你几乎没有联系的机器上时,这听起来可能有点悲伤。一天中的一些时刻,我试着用心打字,并意识到我的手指在知道字母在哪里方面有多快,以及留心它会使它变得更糟、更好或只是有点奇怪。像这样的小练习可以让你回到现实,让你暂时摆脱思绪。当我开始疯狂地打字,并因打字错误或感觉与任务脱节而感到沮丧时,我会试着深呼吸几次,看着自己打字的手,表现得好像它们有自己的想法。

2。引导冥想

我安装了几个应用程序(比如 Headspace 或者 Insight Time )就开始冥想了,从一周一次到一周几次。公平地说,正常的练习一开始会感觉非常奇怪。开始几次我非常不安。我坐在地板上,或者椅子上,什么也不做,观察我的呼吸,或者感觉我屁股在座位上的重量。经常出现的许多想法之一是“我到底在这里做什么?我有更好的事情要做,我太忙了,没时间听这些废话。尽管如此,我还是坚持住了,每次练习时不安的感觉一点点减少。

一些被引导的练习可以是非常灵性的,比如说联系、审视你自己等等。其他人会非常实际,会给你简单的指导,让你的头脑安静下来,进行简单的冥想练习。选择适合你的。我讨厌人们说得太多,所以既然我现在知道了冥想的基本步骤,我更喜欢使用应用 Insight Timer,因为它有一个简单的计时器(因此得名),有一首好听的轻音乐,我可以选择冥想多长时间。

3。每当你的代码运行/编译时,深呼吸几下或者站起来

每当我运行我的代码时(或者每隔一段时间,这取决于代码运行的速度),我试着活在当下,深呼吸几下,然后意识到我是否感到不安、无聊或者还好。我有时会站起来,走到厕所或咖啡机旁,在那里我会做一个简短的冥想散步,感觉我的脚接触地板,注意颜色、灯光、人和声音。当我正在解决代码中的一个错误,并希望避免再次使用手提钻钻孔时,这是一个非常有用的练习。

自己补练习!

显然,你可以利用你的日常活动和提醒(例如,在你每天站起来的时候关注你的身体姿势),自己进行任何正念练习,只要它有助于你处于当下,注意你的任务和注意他人。对于一般的日常正念练习,我很推荐《如何训练一头野象 》这本书。它和大象完全没有关系,但是如果你想从正念练习开始,它是一个很棒的工具。

“如果在正念中完成,任何任务都是麻烦的感觉将很快消失.”—一行禅师

更多关于念动编程、数据科学、机器学习、AI 或领导力的文章,关注我 推特

如果你想阅读更多我的故事

[## 韧性作为座右铭:如何获得成功所需的一项技能

所有的成功故事都有一个共同点。但是这个技能可以教吗?

medium.com](https://medium.com/swlh/resilience-as-a-motto-how-to-get-the-one-skill-required-to-succeed-9c1af901082d) [## 你能成为榜样吗?

STEM 领域的女性需要更多的榜样。但是如果他们已经在外面了呢?

medium.com](https://medium.com/swlh/can-you-be-a-role-model-68e52c9f759a)

MindfulR —应用商店评论挖掘

原文:https://towardsdatascience.com/mindfulr-how-app-store-review-mining-can-boost-growth-improve-product-and-increase-monetization-4d50e20e9834?source=collection_archive---------23-----------------------

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

你有没有被淹没在思绪中?你希望变得更加专注和专注吗?

冥想已经被证明可以减轻压力,提高注意力,为健康、宁静的睡眠创造合适的条件。训练头脑比许多人想象的更具挑战性。因此,引导冥想应用市场有了巨大的增长,以帮助人们改善心理健康,获得更多的正念。

基于我过去在 6 个不同冥想应用中的经历,我一直想知道哪一个应用应该推荐给哪一种类型的观众。因为每个应用程序都有不同的内容,解决心理健康方面因人而异的特殊问题。所以我想:“为什么不挖掘应用评论的数据来比较这些应用呢?”。我挑选了 App Store 和我自己的经历认可的前 6 个冥想应用来分析——head space、Calm、 Insight Timer 、Oak、冥想工作室和 Shine

为了保持文章的简洁,我只展示了一些精选的可视化效果,并对代码进行了匿名处理。更多的可视化和数据集可以在我的 Github 上找到

[## 吉金恩/明德富尔

对顶级冥想应用的应用商店评论的自然语言处理分析

github.com](https://github.com/giginghn/mindfulR)

你准备好今天获得一些正念了吗?

本帖期待什么?

  1. 概观
  2. 数据
  3. 应用评级分布
  4. 应用评级季节性
  5. 每个版本的应用评级
  6. 情感分析
  • AFINN 词典
  • NRC 词典

7.文本挖掘

  • 二元模型分布
  • 二元关系

8.使用自然语言处理的上下文分析

  • 词性标注
  • 每个应用评论中的独特名词
  • 每个应用评论中的唯一动词

9.结论

这个帖子的灵感来自于: 的伟大作品

  1. 泰勒 西姆兰·瓦斯塔
  2. App Store 评论挖掘与 R 作者弗雷德里克·塞德洛夫
  3. 《圣经》中整齐的文字、词性、独特的词语 作者安德鲁·海斯

1。概述

为什么 app 评论分析很重要?

应用程序评论可以包含来自用户的宝贵见解,这些见解可以纳入产品改进流程,包括用户可用性、UX/用户界面、痛点、产品支持,等等!应用评论最棒的地方在于,它们经常是最新的,所以你可以利用它们来获得最新的见解。因此,利用最先进的文本分析来提高用户满意度和构建杀手级应用程序是至关重要的!

评分和评论对你的应用有多重要?

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

下面是一个简洁的例子,说明了文本分析如何作为基础来构建更强大的功能,以加速应用程序的增长并提高其健康程度。

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

2。数据

a .使用的工具:

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

我在这个分析中使用了大量的 R 包,但是上面的 6 个包是我用来操作和挖掘文本数据的主要工具。我将谈论我特别用于文本分析的四大工具:

  1. itunesr 是一个健壮的包,它读取 App Store review 的 API 并提取到 R

阅读 App Store API 的一个小缺点是,用户只能导出每个国家最新的 500 条评论。因此,这将导致 6 个冥想应用程序的聚合数据不具有相同的日期范围。

  1. dplyr 是 R 中非常流行的工具,被许多数据科学家广泛使用。我们将使用 dplyr 中的 tidytext 来标记评论并删除停用词。

  2. spaCyr 是 Python 中的 spaCy 和 r 之间的集成。这是用于自然语言处理的最先进的工具,如词性标注、名称实体标注、翻译等。它还可以利用机器学习来进行预测。

4.脸书预言家是一种基于加法模型预测时间序列数据的程序,其中非线性趋势符合每年、每周和每天的季节性,加上假日影响。它最适用于具有强烈季节效应的时间序列和几个季节的历史数据。 这是我在 iPython Jupyter 笔记本:D 中编写的项目中唯一的包

我将使用itunes Sr包简要介绍一下我的数据收集过程:

  1. 安装包后,我去 App Store 找我要刮的 App ID

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

2.将应用 ID 和国家代码一起插入到包命令中

3.出于分析的目的,我们可以

只保留美国的人口,所以我使用国家代码“us”

4.最后,我输入了行号,让它知道应该检索多少行评论,在本例中是每个应用程序最近的 500 行

b .数据帧概述

数据结构

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

以下是数据框的一个片段

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

在让你对我们的数据有一个大概的了解之后,让我们直接进入分析。我将首先向您介绍高级分析流程,然后我们开始挖掘 6 款冥想应用的季节性、情绪和独特性。

3。App 评分分布

a. App 评分分布

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

总体而言,这 6 款应用中的大多数在 App Store 上获得了相当高的评分。但是,有一些亮点我想指出来:

  • 可悲的是,《平静》的 1 星低评数量约等于 5 星低评数量,我们将在后面的文章中更多地讨论人们评价低的原因
  • Shine 与 calendar 也遵循类似的模式,1 星相对于 2 星、3 星和 4 星评价较高
  • 橡树对我来说是最突出的,因为它几乎没有任何 5 星评价,接受 4 星评价

b .一段时间内的评级数量

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

从每个应用程序的评分量可以看出,Headspace,Calm,Insight Timer 和 Shine 在 2019 年 2 月至 7 月期间都有最近的 500 条用户评论。然而,Oak 和冥想工作室没有太多的用户参与,所以他们最近的 500 条评论包含了从 2017 年到现在的评论。

4。App 评分季节性

了解平均收视率在一个月的不同日子里是如何变化的会很有趣。操纵时间序列数据来检测一周中各天的季节性,以发现季节性和高/低评级之间是否存在任何相关性,这也很重要。

首先,我们根据每月的每一天来查看应用评级的平均分布。

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

从这个柱状图来看,评级在整个月内波动几乎相同。因此,检查季节性图更有帮助。为了使数据平稳,并绘制出一周中各天的季节性,我使用了来自脸书预言家的时间序列包来拟合每周季节性模型。

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

从拟合模型中,我们可以看到 Headspace、calculate、冥想工作室和 Shine 通常在一周开始时评级较低,而在一周结束时评级攀升。另一方面,Oak 和 Insight Timer 从周一到周四有相当高的收视率,然后他们就暴跌了。

→这可用于制定策略,在应用程序中显示何时发送用户应用程序评级弹出窗口,以获得最高评级。

5。每个版本的应用评级

为了了解用户对每个具有更新功能的新版本的反应,我们可以绘制每个应用程序版本的平均评分。这将为公司提供衡量每个发布版本成功与否的大图。

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

6。情绪分析

在对应用评级进行整体概述后,我想全面了解每个评论的核心,以及每个词的情绪如何影响应用的整体品牌。为此,我们需要将复习句子分解成单词,这可以通过 R tidytext 中的标记化文本来完成。

机器学习和 NLP 算法中有一个常用短语——垃圾进,垃圾出。没有同样好的数据,我们不可能有最先进的结果。因此,我们首先清理和删除停用词,标点符号和罕见的短语。文字清理功能请参考我的 Github。

然后,我们在 3 种通用词典中分析情感:

  • Finn RUP Nielsen 的“AFINN”

“AFINN”词典给单词打分在-5 到 5 之间,负分表示消极情绪,正分表示积极情绪。

  • 来自赛义夫·穆罕默德和彼得·特尼。

“NRC”词典将单词分为积极、消极、愤怒、期待、厌恶、恐惧、快乐、悲伤、惊讶和信任等类别。

答)阿芬:

由于“AFINN”会根据积极/消极的程度给这些词分配一个情感分数,我计算了分数的总和以及这些词在每次评论中出现的次数,列出了计数最多的前 20 个词,并绘制了它们的分布图。

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

从图表中我们可以看到,6 款冥想类 app 在评论中的正面词都多于负面词,尤其是“爱”这个词在评论中出现了 2500 多次。

“焦虑”是最负面的词,这是有道理的,因为这些冥想应用程序旨在解决焦虑,并给用户带来更多的快乐。然而,如果我们看第二个最消极的词,我们有“支付”。

当我查看 6 个应用程序的订阅价格时,他们仍然收取非常高的价格——大约 59 美元到 69 美元/月。我认为情况不应该是这样的,因为这些应用程序旨在缓解压力,改善心理健康,而不是给用户增加更多的经济负担。因此,解决和改进这些应用程序,让世界各地的人们更容易使用,将是一个新出现的问题。Headspace Student 的案例是一个很好的例子,说明了这款应用如何让有需要的人买得起。

我还对每个应用程序的分布进行了细分,并绘制了积极和消极字数之间的比较。这张图表证实了我们之前的评级分布图,即 Calm 仍然是负面评价高、1 星评级多的应用程序。

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

为了了解应用的情绪如何随着时间的推移而发展,我们可视化了每个应用的应用评论数据中的平均情绪得分。

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

我们可以看到,对应用程序评论的看法随着时间的推移而波动,然而,Oak 是唯一一个应用程序评论情绪得分最稳定的应用程序,并且直到现在都在略微下降。

b. NRC 词典

NRC lexicon 是 Saif M. Mohammad 和 Peter D. Turney 在“众包一个单词情感关联词典”的研究中的惊人成果,该词典将单词分为不同的类别,而不仅仅是积极和消极的类别——愤怒、预期、厌恶、恐惧、快乐、悲伤、惊讶和信任。

请遵循他们网站上关于如何为您的项目检索数据集用于非商业用途的说明:【http://sentiment.nrc.ca/lexicons-for-research/】

对于 NRC lexicon 的最后一次可视化,我使用雷达图来查看每个应用程序中的评论如何根据这八种情绪相互叠加。

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

根据 NRC 雷达图,我们清楚地看到,与用户评价中的其他 5 款应用相比,Calm 缺乏“快乐”、“预期”,尤其是“信任”。同时,冷静的评论更倾向于“愤怒”和“悲伤”。

→这可能是为什么与其他应用程序相比,Calm 的差评如此之多的原因之一。但是是因为教训还是因为付出才让人对平静感到忧郁? 让我们在接下来的几个环节中一探究竟。

7。文本挖掘

到目前为止,我们认为单词是一个词,意思是个体单位,以及它们与情感的关系。然而,大多数有见地的文本分析通常基于单词之间的关系,无论是检查哪些单词倾向于紧随其他单词,还是检查哪些单词在同一文档中同时出现。这被称为 N-grams 单词分析。

通过检查单词之间的关系,我们提供了更多关于单词在评论中如何措辞的上下文,而不仅仅是情感。在这篇文章中,我在二元模型中标记了评论并分析了数据。

a .二元模型分布

在 bigrams 标记化之后,我对每个应用程序中的前 20 个词进行了排名,并绘制了它们的分布。

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

总的来说,大多数应用程序都提供指导冥想课程,但顿悟计时器似乎在这个功能上胜过其他应用程序。另一方面,Oak 是唯一一款提供 引导和非引导冥想 课程以及有效呼吸练习的应用。

如果我们仔细看看 Calm,除了它的主要功能“睡眠故事”和“入睡”之外,还有许多词围绕着订阅和支付问题,如“支付 70”、“70 美元”或“花钱”,而其他 5 个应用程序则不是这样。

Headspace 主要关注正念、生活方式和压力缓解,因此用户如何享受他们的指导冥想以“”是完全令人惊讶的。这很有趣,因为 Sleep Story 是 Calm 上最受欢迎的功能,现在用户正在转向 Headspace。

→在检查了 bigrams 之后,我们对 Calm 如何接受这些评论家的评论有了更好的了解,同时也揭示了用户喜爱的每个应用程序的功能。

b .二元模型关系

除了分布图之外,我们还可以查看二元模型关系网络,以便在更清晰的上下文中充分理解短语是如何相互连接的。

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

8。使用 NLP 进行上下文分析

我们一直在使用 tidytext 来标记单词,并应用不同的词汇来分析单词的情感。现在,我进一步尝试机器学习方法。在这篇文章的 NLP 部分,我使用 spaCy 来对标记进行词汇化,并应用词性标注(POS tagging)。这种方法的目的是更深入地挖掘每个应用程序的用户评论的独特名词和动词。

答:词性标注:

你可以通过我的 Github 找到在 R 中实现 spaCy 的代码,这里我只给你展示了词汇化和词性标注的结果数据框。

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

在我们跳入寻找 App 评论中独特的名词和动词之前,我们要计算每个词的 词频-逆文档频率(tf-idf) 来确定它们的独特性。Tf-idf 只是作为一个词出现在文档中的频率,但被该词在总共 6 个应用程序的评论中的频率所抵消。

在这一节中,我给出了 tf-idf 对 6 个应用程序中独特的名词和动词的概述,并只展示了一些最重要的应用程序的 wordcloud 图。

b .独特名词

以下是每个应用程序中出现频率最高的 3 个名词的 tf-idf 概述。

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

我们注意到 Insight Timer 和冥想工作室共享一个最常见的名词“老师”,因为这两个应用程序强调从不同的老师那里选择冥想课程的灵活性。

现在我对每个应用程序进行 wordcloud 绘图,看看每个应用程序有哪些独特的名词脱颖而出。

  • 顶空

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

这个图加强了我们上面的发现。尽管 Sleepcast 在 Headspace 上并不是一个大张旗鼓宣传的功能,但这个隐藏的 gem 功能显然是一个杀手级应用!此外, 友好可爱的动画 似乎极大地吸引了更多用户对应用的参与。

  • 洞察计时器

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

顿悟计时器专注于传统的冥想方法,因此毫不奇怪,该应用程序中最独特的名词是“”、“ 祈祷 ”、“ ”等。此外,我们可以在应用程序上发现一些杀手级功能,如 课程书签个人资料统计 。**

  • 冥想工作室

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

冥想工作室似乎是最好的应用程序,可以让用户选择各种各样的 冥想老师 ,并将冥想的 遗产 【传递给更多的人。""也许是冥想工作室的潜在市场利基,因为它在其他应用程序的其他地方没有提到。

b .独特动词

以下是每个应用程序中出现频率最高的 3 个动词的 tf-idf 概述。

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

现在让我们来挖掘这些独特动词的 wordcloud 情节!

  • 平静

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

我们现在完全可以理解 App Store 上差评冷静的原因了。评论中提到的大多数动词大多与认购问题相关— 【取消】【退款】【折腾】【rip】【退出】** 等。这是红旗,以冷静的价格策略来赢回用户,并有更多的战略货币化计划!**

  • 橡木

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

Oak 给用户一种成就感,这种成就感带有个人色彩。他们用橡木“ 【挣徽章】 ”、 上升 ”和 振动 。然而,设计或用户可用性仍然相当“”以供用户在应用程序中导航。

  • 闪耀

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

尽管 Shine 也面临类似的问题,如冷静对待“ ”取消 ”付款,但在 App 评论上的动词频率要少得多。另一方面,灵儿似乎做得很好,通过冥想帮助用户“ 反映 ”、“ 杂志 ”、“ 认知 ”和“ 连接

8。结论

这个项目花费了我大量的时间和精力,但帮助我学会了如何在应用商店评论中利用文本挖掘和自然语言处理,并对产品、增长和盈利产生影响。

对于那些对其他冥想应用的可视化感兴趣的人,他们可以在这里找到。请随意阅读我的 Github Repo 并摆弄数据&代码。

我知道每个单词的不同大小会有更多的改进空间,请随时通过我的 LinkedinTwitter 与我分享你可能发现的任何有趣的事情。

鸣谢:我要感谢 Simran Vasta、Keith 阿蒂恩萨、陈彦蓉和 Sylvia Tran 与我分享资源并帮助我完成这篇文章。我觉得自己很幸运,在我的生命中有这么多了不起的人。

** [## 吉金恩/明德富尔

对顶级冥想应用的应用商店评论的自然语言处理分析

github.com](https://github.com/giginghn/mindfulR)**

数据科学家的最小熊猫子集

原文:https://towardsdatascience.com/minimal-pandas-subset-for-data-scientists-6355059629ae?source=collection_archive---------5-----------------------

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

您需要的所有熊猫功能

熊猫是一个巨大的图书馆。

对于 pandas 来说,数据操作轻而易举,它已经成为 it 的一个标准,许多并行化库,如 Rapids 和 Dask,都是按照 Pandas 的语法创建的。

尽管如此,我总的来说还是有一些问题。

在 Pandas 中有多种方法可以做同样的事情,这可能会给初学者带来麻烦。

这启发了我想出一个我在编码时使用的熊猫函数的最小子集。

我都试过了,目前,我坚持一种特定的方式。它就像一个思维导图。

有时是因为它很快,有时是因为它更易读,有时是因为我可以用我现有的知识来做。而且有时候因为知道某个特定的方式长期下去会很头疼(想多指标)

这篇文章是关于用一种简单明了的方式来处理 Python 中的大多数数据操作。

通篇都是一些零星的建议。

我将使用 IMDB 上过去十年中 1000 部流行电影的数据集。你也可以在 Kaggle 内核中跟随。

一些默认的熊猫要求

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

尽管 Jupyter 笔记本很好,但在与熊猫一起工作时,有些事情仍然需要详细说明。

有时候你的笔记本不会把所有栏目都给你看。如果你打印数据帧,有时它会显示所有的行。在导入熊猫时,您可以通过设置自己的一些默认值来控制这种行为。你可以使用将这个添加到你的笔记本上来实现自动化。

例如,这是我使用的设置。

import pandas as pd
# pandas defaults
pd.options.display.max_columns = 500
pd.options.display.max_rows = 500

用熊猫读取数据

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

我们做的第一件事是读取数据源,这是代码。

df = pd.read_csv("IMDB-Movie-Data.csv")

推荐: 我本来也可以用pd.read_table来读文件的。问题是pd.read_csv的默认分隔符是,,这样可以节省一些代码。我也真心不明白pd.read_table的用途

如果您的数据在某个 SQL 数据源中,您可以使用下面的代码。您将获得数据帧格式的结果。

# Reading from SQL Datasourceimport MySQLdb
from pandas import DataFrame
from pandas.io.sql import read_sqldb = MySQLdb.connect(host="localhost",    # your host, usually localhost
                     user="root",         # your username
                     passwd="password",   # your password
                     db="dbname")         # name of the data basequery = "SELECT * FROM tablename"df = read_sql(query, db)

数据快照

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

看到一些数据总是有用的。

您可以使用带有选项的简单的headtail命令来指定行数。

# top 5 rows
df.head()# top 50 rows
df.head(50)# last 5 rows
df.tail()# last 50 rows
df.tail(50)

您还可以使用以下命令查看简单的数据帧统计信息。

# To get statistics of numerical columns
df.describe()

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

# To get maximum value of a column. When you take a single column you can think of it as a list and apply functions you would apply to a list. You can also use min for instance.print(max(df['rating']))# no of rows in dataframe
print(len(df))# Shape of Dataframe
print(df.shape)---------------------------------------------------------------
9.0
1000
(1000,12)

推荐: 一般用 Jupyter 笔记本工作, 我特别注意让笔记本的前几个单元格包含这些数据的快照 。这有助于我随时看到数据的结构。如果我不遵循这个实践,我注意到我在代码中重复了很多次.head()命令。

处理数据框架中的列

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

a.选择列

出于某种原因,Pandas 允许您以两种方式选择列。像df.Title一样使用点运算符,像df['Title']一样使用方括号

我更喜欢第二个版本。为什么?

从长远来看,使用方括号版本会更好,这有几个原因。

  • 如果您的列名包含空格,那么点版本将不起作用。比如df.Revenue (Millions)不会工作而df['Revenue (Millions)]’会。
  • 如果您的列名是countmean或任何 pandas 预定义的函数,它也不会工作。
  • 有时您可能需要在列名上创建一个 for 循环,其中列名可能在变量中。在这种情况下,点符号将不起作用。例如,这是可行的:
colname = 'height'
df[colname]

虽然这不会:

colname = 'height'
df.colname

相信我。省几个字不值得。

建议:停止使用点运算符 。它是一个源自不同语言®的结构,应该保留在那里。

b.获取列表中的列名

您可能需要一个列列表,以便进行后续处理。

columnnames = df.columns

c.指定用户定义的列名:

有时您想根据自己的喜好更改列名。我不喜欢我的列名中有空格,所以我这样更改它们。

df.columns = ['Rank', 'Title', 'Genre', 'Description', 'Director', 'Actors', 'Year',
       'Runtime_Minutes', 'Rating', 'Votes', 'Revenue_Millions',
       'Metascore']

我本可以用另一种方式。

在这种情况下,两个版本都很重要。当我必须更改许多列名时,我使用上面的方法。当我必须更改一两个列的名称时,我会使用:

df.rename(columns = {'Revenue (Millions)':'Rev_M','Runtime (Minutes)':'Runtime_min'},inplace=True)

d.设置特定列的子集:

有时,您只需要处理数据帧中的特定列。例如,分离数字列和分类列,或者移除不必要的列。比如说在我们的例子中。我们不需要描述、导演和演员栏。

df = df[['Rank', 'Title', 'Genre', 'Year','Runtime_min', 'Rating', 'Votes', 'Rev_M', 'Metascore']]

e.查看列类型:

调试时非常有用。如果您的代码抛出一个错误,说明您不能添加一个strint,您将希望运行这个命令。

df.dtypes

在数据帧上应用函数:Apply 和 Lambda

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

applylambda是我在熊猫身上学到的一些最好的东西。

每当我为一个新的列或过滤器构建复杂的逻辑时遇到困难,我就会使用applylambda

a.创建列

您可以通过多种方式创建新列。

如果你想要一个列是列的和或差,你可以使用简单的基本算法。在这里,我得到了基于 IMDB 和标准化 Metascore 的平均评级。

df['AvgRating'] = (df['Rating'] + df['Metascore']/10)/2

但是有时我们可能需要围绕新列的创建构建复杂的逻辑。

举一个复杂的例子,假设我们想要基于各种因素构建一个自定义的电影评分。

比方说,如果电影是惊悚片,我想在 IMDB 评分保持小于或等于 10 的条件下,在 IMDB 评分上加 1。如果一部电影是喜剧,我想从评分中减去一分。

我们怎么做呢?

每当我掌握了如此复杂的问题,我就使用apply/lambda。让我首先向您展示我将如何做这件事。

def custom_rating(genre,rating):
    if 'Thriller' in genre:
        return min(10,rating+1)
    elif 'Comedy' in genre:
        return max(0,rating-1)
    else:
        return rating

df['CustomRating'] = df.apply(lambda x: custom_rating(x['Genre'],x['Rating']),axis=1)

一般结构是:

  • 您定义了一个函数,该函数将接受您想要处理的列值,以得出您的逻辑。在这里,我们最终使用的两列是流派和评级。
  • 沿着 axis=1 的行使用带有 lambda 的应用函数。一般语法是:
df.apply(lambda x: func(x['col1'],x['col2']),axis=1)

您应该能够使用 apply/lambda 创建几乎任何逻辑,因为您只需担心自定义函数。

b.过滤数据帧

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

熊猫使过滤和子集化数据框架变得相当容易。您可以使用普通运算符和&,|,~运算符对数据帧进行过滤和子集化。

# Single condition: dataframe with all movies rated greater than 8df_gt_8 = df[df['Rating']>8]# Multiple conditions: AND - dataframe with all movies rated greater than 8 and having more than 100000 votesAnd_df = df[(df['Rating']>8) & (df['Votes']>100000)]# Multiple conditions: OR - dataframe with all movies rated greater than 8 or having a metascore more than 90Or_df = df[(df['Rating']>8) | (df['Metascore']>80)]# Multiple conditions: NOT - dataframe with all emovies rated greater than 8 or having a metascore more than 90 have to be excludedNot_df = df[~((df['Rating']>8) | (df['Metascore']>80))]

很简单的东西。

但有时我们可能需要进行复杂的过滤操作。

有时我们需要做一些操作,而仅仅使用上面的格式是做不到的。

例如:我们假设 我们想要过滤电影标题中字数大于或等于 4 的那些行。

你会怎么做?

尝试下面的会给你一个错误。显然,你不能做任何简单的事情,比如用一个系列分割。

new_df = df[len(df['Title'].split(" "))>=4]
-------------------------------------------
AttributeError: 'Series' object has no attribute 'split'

一种方法是首先使用 apply 创建一个标题中包含字数的列,然后对该列进行过滤。

#create a new column
df['num_words_title'] = df.apply(lambda x : len(x['Title'].split(" ")),axis=1)#simple filter on new column
new_df = df[df['num_words_title']>=4]

这是一个非常好的方法,只要你不需要创建很多列。但我更喜欢这个:

new_df = df[df.apply(lambda x : len(x['Title'].split(" "))>=4,axis=1)]

我在这里做的是 我的 apply 函数返回一个可以用来过滤的布尔值。

现在,一旦你理解了你只需要创建一个布尔列来过滤,你就可以在你的apply语句中使用任何函数/逻辑来得到你想要构建的复杂逻辑。

让我们看另一个例子。我会试着做一些复杂的事情来展示这个结构。

我们想找到收入低于该年平均收入的电影?

year_revenue_dict = df.groupby(['Year']).agg({'Rev_M':np.mean}).to_dict()['Rev_M']def bool_provider(revenue, year):
    return revenue<year_revenue_dict[year]

new_df = df[df.apply(lambda x : bool_provider(x['Rev_M'],x['Year']),axis=1)]

这里有一个函数,可以用来写任何逻辑。只要我们能够处理简单的变量,这就为高级过滤提供了强大的功能。

c.更改列类型

我甚至使用 apply 来更改列类型,因为我不想记住更改列类型的语法,也因为它让我可以做更复杂的事情。

在 Pandas 中,更改列类型的常用语法是astype。因此,如果我的数据中有一个str格式的名为 price 的列。我可以这样做:

df['Price'] = newDf['Price'].astype('int')

但有时并不会如预期般奏效。

你可能会得到错误:ValueError: invalid literal for long() with base 10: ‘13,000’.也就是说,你不能将一个带有“,”的字符串转换为整型。要做到这一点,我们首先要去掉逗号。

在一次又一次地面对这个问题之后,我现在已经完全停止使用astype 了,只使用 apply 来改变列类型。

df['Price'] = df.apply(lambda x: int(x['Price'].replace(',', '')),axis=1)

最后,还有progress_apply

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

progress_applytqdm包附带的单一功能。

这为我节省了很多时间。

有时,当您的数据中有很多行,或者您最终编写了一个非常复杂的 apply 函数时,您会发现 apply 可能需要很长时间。

我见过应用程序在使用 Spacy 时花费数小时。在这种情况下,您可能希望看到带有apply的进度条。

你可以使用tqdm来实现。

在笔记本顶部进行初始导入后,只需将apply替换为progress_apply,一切都保持不变。

from tqdm import tqdm, tqdm_notebook
tqdm_notebook().pandas()df.progress_apply(lambda x: custom_rating_function(x['Genre'],x['Rating']),axis=1)

你会看到进度条。

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

推荐: 每当看到要创建自定义复杂逻辑的列,就想到applylambda。也尝试使用progress_apply

数据帧上的聚合:g roupby

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

groupby会在你想汇总数据的时候出现很多次。Pandas 通过groupby功能让你高效地完成这项工作。

有很多方法可以使用groupby。我见过很多版本,但我更喜欢一种特定的风格,因为我觉得我使用的版本简单、直观,并且可以针对不同的用例进行扩展。

df.groupby(list of columns to groupby on).aggregate({'colname':func1, 'colname2':func2}).reset_index()

现在你看到它是非常简单的。你只需要担心提供两个主要的信息。

  • groupby的列列表,以及
  • 列和要应用于这些列的函数的字典

reset_index()是一个重置数据帧索引的函数。每当我执行 groupby 时,我总是应用这个函数,您可能会认为它是 groupby 操作的默认语法。

让我们来看一个例子。

# Find out the sum of votes and revenue by yearimport numpy as np
df.groupby(['Year']).aggregate({'Votes':np.sum, 'Rev_M':np.sum}).reset_index()

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

您可能还想按多列进行分组。这相当简单。

df.groupby(['Year','Genre']).aggregate({'Votes':np.sum, 'Rev_M':np.sum}).reset_index()

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

推荐: 坚持一个语法对于groupby.不喜欢我的就挑自己的但是坚持一个。

处理多个数据帧:连接和合并:

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

a. concat

有时我们从不同的来源获得数据。或者有人带着多个文件来找你,每个文件都有特定年份的数据。

我们如何从单个数据帧创建单个数据帧?

这里我们将人工创建我们的用例,因为我们只有一个文件。我们首先使用已知的基本过滤操作创建两个数据帧。

movies_2006 = df[df['Year']==2006]
movies_2007 = df[df['Year']==2007]

这里我们从两个数据帧开始:movies_2006包含 2006 年发行的电影的信息,而movies_2007包含 2007 年发行的电影的信息。我们希望创建一个包含 2006 年和 2007 年电影的单一数据框架

movies_06_07 = pd.concat([movies_2006,movies_2007])

b.合并

您将遇到的大多数数据永远不会出现在单个文件中。其中一个文件可能包含特定电影的评级,另一个文件可能提供电影的投票数。

在这种情况下,我们有两个需要合并的数据帧,这样我们就可以在一个视图中拥有所有的信息。

这里我们将人工创建我们的用例,因为我们只有一个文件。我们首先使用已知的基本列子集操作创建两个数据帧。

rating_dataframe = df[['Title','Rating']]
votes_dataframe =  df[['Title','Votes']]

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

我们需要在一个数据框架中包含所有这些信息。我们该怎么做?

rating_vote_df = pd.merge(rating_dataframe,votes_dataframe,on='Title',how='left')rating_vote_df.head()

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

我们为这个合并函数提供了四个属性——第一个 DF、第二个 DF、在哪一列上连接以及连接标准:['left','right','inner','outer']

推荐: 我通常最后总是用left join。你将很少需要使用outerright.来连接,实际上无论何时你需要做一个right 连接,你实际上只需要一个左连接,在合并函数中数据帧的顺序是相反的。

重塑数据框架:熔化和透视表(reverseMelt)

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

大多数时候,我们并没有得到我们想要的精确形式的数据。

例如,有时我们可能有列中的数据,而我们可能需要行中的数据。

让我们再创造一个人为的例子。你可以看看下面我用来创建这个例子的代码,但是真的没关系。

genre_set = set()
for genre in df['Genre'].unique():
    for g in genre.split(","):
        genre_set.add(g)
for genre in genre_set:
    df[genre] = df['Genre'].apply(lambda x: 1 if genre in x else 0)working_df = df[['Title','Rating', 'Votes',
       'Rev_M']+list(genre_set)]working_df.head()

所以我们从这样一个working_df开始:

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

现在,这并不是一个特别好的存放数据的结构。如果我们有一个只有一个列类型的数据帧,我们可能会更喜欢它,并且我们可以为同一部电影重复多行。所以电影《普罗米修斯》可能有三行,因为它有三种类型。我们如何做到这一点?

我们使用melt:

reshaped_df = pd.melt(working_df,id_vars = ['Title','Rating','Votes','Rev_M'],value_vars = list(genre_set),var_name = 'Genre', value_name ='Flag')reshaped_df.head()

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

所以在这个融化函数中,我们提供了五个属性:

  • 数据帧名称=工作数据帧
  • id_vars:仅在当前表单中需要的变量列表。
  • value_vars:我们希望融合/放入同一列的变量列表
  • for value _ vars 的列名
  • value _ name:value _ vars 的值的列名

还剩下一件事。对于普罗米修斯,我们看到它是一部惊悚片,旗帜为 0。标志 0 是我们可以过滤掉的不必要的数据,我们将得到我们的结果。我们只保留带有标志 1 的类型

reshaped_df  = reshaped_df[reshaped_df['Flag']==1]

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

如果我们想回去呢?

我们需要将一列中的值变成多列。怎么会?我们用pivot_table

re_reshaped_df = reshaped_df.pivot_table(index=['Title','Rating','Votes','Rev_M'], columns='Genre', 
                    values='Flag', aggfunc='sum').reset_index()re_reshaped_df.head()

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

我们为 pivot_table 函数提供了四个属性。

  • 索引:我们不想改变这些列结构
  • 列:将该列分解为多个列
  • 值:使用此列进行汇总
  • aggfunc:聚合函数。

然后我们可以使用fillna用 0 填充缺失的值

re_reshaped_df=re_reshaped_df.fillna(0)

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

推荐: 多列对一列:melt和一列对多列:pivot_table。做melt——stack还有其他方式做pivot_table : pivotunstack.不要管他们,只用meltpivot_table。这有一些合理的原因,比如unstackstack会创建多索引,我们不想处理这个问题,而且pivot不能将多个列作为索引。

结论

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

有了熊猫,选择就越少

在这里,我试着描述了熊猫中我最常用的一些最有用的功能。

Pandas 是一个庞大的库,有很多功能和定制选项。这使得你必须有一个思维导图,在这个思维导图中,你要坚持使用特定的语法来处理特定的事情。

我在这里分享了我的,你可以继续下去,随着你对这个库的理解的增长,它会变得更好。

我希望这篇文章对你有用,值得你花时间。我试图让这尽可能简单,但是你可能总是问我或者查看文档中的疑问。

全部代码和数据都发布在 Kaggle 内核中。

另外,如果你想学习更多关于 Python 3 的知识,我想从密歇根大学调出一门关于学习中级 Python 的优秀课程。一定要去看看。

我以后也会写更多这样的帖子。让我知道你对他们的看法。在 媒体 关注我或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系到我。

尽量减少 Python 中 for 循环的使用

原文:https://towardsdatascience.com/minimize-for-loop-usage-in-python-78e3bc42f03f?source=collection_archive---------10-----------------------

蟒蛇短裤

如何以及为什么应该在 Python 代码中最小化 for 循环的使用?

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

Photo by Etienne Girardet on Unsplash

Python 为我们提供了多种风格的编码。

在某种程度上,它是相当包容的。

一个人可以来自任何语言,开始写 Python。

但是,学会写语言和用优化的方式写语言是两回事。

在这一系列名为 Python Shorts 的帖子中,我将解释 Python 提供的一些简单但非常有用的构造,一些基本的技巧和我在数据科学工作中经常遇到的一些用例。

在这篇文章中, 我将谈论 Python 中的 ***for*** 循环以及你应该如何尽可能避免它们。

编写 for 循环的 3 种方法:

让我用一个简单的例子来解释这一点。

假设你想在一个列表中取 的平方和。

每当我们想要计算 n 维中两点之间的距离时,这是机器学习中我们都面临的一个有效问题。

使用循环可以很容易地做到这一点。

事实上,我将向你展示三种我见过人们使用的完成相同任务的方法,并让你自己选择你认为最好的方法。

x = [1,3,5,7,9]
sum_squared = 0for i in range(len(x)):
    sum_squared+=x[i]**2

每当我在一个 python 代码库中看到上面的代码,我就明白这个人来自 C 或 Java 背景。

一个稍微大一点的的做法是:

x = [1,3,5,7,9]
sum_squared = 0for y in x:
    sum_squared+=y**2

好多了。

我没有给名单编索引。我的代码可读性更好。

但是,pythonic 的方法仍然是在一行中。

x = [1,3,5,7,9]
sum_squared = sum([y**2 for y in x])

这种方法叫做列表理解,这可能是我喜欢 Python 的原因之一。

在列表理解中也可以使用if

假设我们想要一个偶数的平方数列表。

x = [1,2,3,4,5,6,7,8,9]
even_squared = [y**2 for y in x if y%2==0]
--------------------------------------------
[4,16,36,64]

***if-else?***

如果我们想要偶数的平方和奇数的立方呢?

x = [1,2,3,4,5,6,7,8,9]
squared_cubed = [y**2 if y%2==0 else y**3 for y in x]
--------------------------------------------
[1, 4, 27, 16, 125, 36, 343, 64, 729]

太好了!!!

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

所以基本上遵循特定的**准则:**每当你想写一个for陈述的时候,你应该问自己以下问题:

  • 没有for环能做到吗?大多数蟒蛇
  • 使用列表理解可以做到吗?如果有,就用吧。
  • 不索引数组可以吗?如果没有,可以考虑使用enumerate

什么是enumerate?

有时我们既需要数组中的索引,也需要数组中的值。

在这种情况下,我更喜欢用枚举而不是索引列表。

L = ['blue', 'yellow', 'orange']
for i, val in enumerate(L):
    print("index is %d and value is %s" % (i, val))
---------------------------------------------------------------
index is 0 and value is blue
index is 1 and value is yellow
index is 2 and value is orange

规则是:

如果没有列表也可以,那就不要索引列表。

试着用字典理解

还可以尝试使用字典理解,这是 Python 中一个相对较新的功能。语法非常类似于列表理解。

让我用一个例子来解释。我想为 x 中的每个值得到一个(key: squared value)的字典。

x = [1,2,3,4,5,6,7,8,9]
{k:k**2 for k in x}
---------------------------------------------------------
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

如果我想要一个偶数值的字典呢?

x = [1,2,3,4,5,6,7,8,9]
{k:k**2 for k in x if x%2==0}
---------------------------------------------------------
{2: 4, 4: 16, 6: 36, 8: 64}

如果我们想要偶数键的平方值和奇数键的立方数呢?

x = [1,2,3,4,5,6,7,8,9]
{k:k**2 if k%2==0 else k**3 for k in x}
---------------------------------------------------------
{1: 1, 2: 4, 3: 27, 4: 16, 5: 125, 6: 36, 7: 343, 8: 64, 9: 729}

结论

最后,我要说的是,虽然将你从其他语言中获得的知识转移到 Python 中似乎很容易,但如果你一直这样做,你将无法欣赏到 Python 的美妙之处。当我们使用 Python 的方式时,它会更加强大,也更有趣。

所以,当你需要一个 **for** 循环的时候,使用列表理解和字典理解。如果需要数组索引,使用 **enumerate**

避免像瘟疫一样形成循环

从长远来看,您的代码将更具可读性和可维护性。

另外,如果你想了解更多关于 Python 3 的知识,我想向你推荐密歇根大学的一门优秀的中级 Python 课程。一定要去看看。

将来我也会写更多初学者友好的帖子。让我知道你对这个系列的看法。在 媒体 关注我或者订阅我的 博客 了解他们。

一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。

原载于 2019 年 4 月 23 日https://mlwhiz.com

数据科学中最少的可行领域知识

原文:https://towardsdatascience.com/minimum-viable-domain-knowledge-in-data-science-5be7bc99eca9?source=collection_archive---------15-----------------------

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

Image by Gerd Altmann from Pixabay

大约十年前,当我完成物理学博士学位时,源源不断的物理学家转向金融、生物学和其他非常需要定量技能的领域。这种举动在很大程度上是由一种信念推动的,这种信念带有一丝傲慢,即一个人在攻读物理学博士学位时获得的建模专业知识可以转移到其他领域。这些举措有些成功,有些失败。据我所知,最终取得成功的物理学家是那些谦逊地认识到高效建模在很大程度上取决于某个领域的语义,并有毅力学习相关领域知识的人。

在我读完博士后的几年里,小溪变成了波浪。现在有一个从定量领域到各种工业和研究部门的大规模迁移。在完成博士学位后的某个时候,我也加入了这群领域移民——数据科学家。从我自己和我的同行的经验来看,我很确定十年前对我的物理学家同行来说是正确的,对数据科学家来说也是正确的。没有足够的领域知识,根本不可能进行有用的数据科学研究。

这不是一个新的认识。数据科学家最古老的原型来自 Drew Conway,他把数据科学家描绘成精通数学/统计、编程(黑客技能)和领域知识(实质性专业知识)的人。然而,尽管有大量的书籍、文章、课程和自助指南致力于数据科学的数学/统计和编程方面,但很少有关于数据科学的关键领域方面的文章。在这篇文章中,我将根据我和我的同龄人的经验,提出我自己对这个话题的观点。

自从“数据科学家”被宣布为 21 世纪最性感的工作,数据科学对不同的人有着不同的含义。我认为数据科学是为复杂系统建立计算模型的行为,同时利用适度到大量的数据。领域知识为构建这些模型提供了背景。领域知识有三个主要的可区分但又相互关联的方面:问题上下文、信息上下文和数据收集机制。

问题语境

如果一个人不明白自己需要解决什么,那么他解决问题的机会就很小。但是理解数据科学中的问题上下文真正意味着什么呢?考虑推荐系统的例子。没有人愿意为了建推荐系统而建推荐系统;也许一个企业想增加收入,并相信建立一个推荐系统将有助于实现这一目标。

第一步是明确并正式确定目标,例如增加收入。数据科学家构建的模型将用于计算某些东西。数据科学家需要具备领域知识,以清楚地阐明领域特定的假设,这些假设可用于将问题目标与计算的数量相关联。在推荐系统的例子中,该模型可以计算用户对产品的亲和力。使用这种计算,可以向用户显示他最接近的产品(由模型计算)。这里的假设是,如果向用户展示他们最喜欢的产品,那么他们就有更大的可能性购买这些产品,从而增加企业的收入。

通常情况下,无法直接衡量一个模型是否实现了它的目标。相反,我们需要基于代理——评估指标——来做出判断。数据科学家需要能够提供推理(最好是定量的和数据驱动的),说明为什么选择的评估指标是合适的。通常,这归结为一个归属问题。例如,可以使用点击率作为在线产品推荐系统的评估指标。然后,我们需要一个合理的模型,将一部分收入归因于推荐产生的点击。这需要数据科学家了解用户如何浏览网上商店。

给定一个模型和一个数据集,人们只能计算出一定精度的数量。通常,建立具有中等至良好精度的模型相对容易,但是需要大量投资来提高超过这一点的精度。另一方面,实际需要的准确度在很大程度上取决于手头的问题。数据科学家应该非常清楚准确性的不断提高所产生的价值。在许多情况下,价值与准确度的关系图看起来像一个 s。如果低于某个阈值,模型将生成几乎为零或负值的值,之后会有一个范围,在该范围内,准确度的小增量将导致价值的成比例或指数回报,然后会有一个阈值,在该阈值之后,准确度的任何进一步增加都将导致回报递减。值对精度图的其他轮廓也是可能的。见这篇阐述这个话题的优秀作品。只有当数据科学家很好地理解了提高准确性带来的回报(即产生的额外价值)时,他才能就什么级别的准确性足够好做出明智的决策。

数据科学问题几乎从来都不是无约束优化问题,总是存在约束。这些限制中的一些本质上是技术性的,例如对可用计算资源量的上限。其他约束将是与域相关的,例如与公平性和隐私相关的约束或者与用户体验相关的约束。数据科学家需要具备领域知识,以理解这些约束设置的界限,并确保模型保持在这些界限内——否则,模型在生产中就没有什么希望了。

如果可能的话,数据科学家会理解问题的背景

  • 将问题目标形式化,并将其与模型的计算量和评估指标联系起来
  • 至少画一个价值与准确度的半定量图表
  • 表明模型与问题的约束是一致的

信息背景

问题上下文处理模型的输出。信息语境处理其输入。围绕大数据和机器学习的大肆宣传已经在某些方面产生了的想法,即人们可以简单地将原始数据放在算法的一端,而在另一端生成有意义的见解。那个算法不存在 —深度学习或者其他。

深度学习相当成功的一个领域是图像识别(尽管考虑到深度神经网络对敌对攻击的敏感性,人们应该小心不要夸大这种情况)。如今,我们甚至有预先训练好的图像识别模型,人们可以下载并使用,只需很少甚至不需要微调。

让我们考虑一下这一成功背后的原因。图像总是由像素组成。像素具有颜色和强度的属性,并且它们总是排列在规则的网格上。出于图像识别的目的,我们希望答案在某些变换下不变,例如平移、旋转和光照变化。这些信息都不是从 math/stat 或黑客那里获得的。相反,它们是图像领域知识的一部分。在图像识别方面取得成功的机器学习模型,例如那些使用卷积神经网络的模型,就是建立在这一领域知识的基础上的。

从某种意义上说,图像识别是一个“容易”的领域。图像是几何对象,因此更容易形式化关于图像的领域知识。自然语言处理最近在建立通用模型方面也取得了一些成功。同样,虽然书面文本不像图像那样结构化,但人们仍然可以将单词识别为语言的基本实体,文档是单词的有序列表,即数据有一些自然的结构。

不幸的是,大多数领域中的数据并不具有这样的自然结构。对于大型跨国公司或研究机构来说,它们也不够大或有趣,不足以投资构建特定领域的算法。在这些领域中,由在战壕中工作的数据科学家来确定数据的信息上下文。

有人可能认为信息上下文只不过是数据中的结构。但远不止如此。算法的训练数据或模型的输入,如一组向量或张量,或有序的标记列表,它们都有结构。但是,它们本身没有任何信息上下文。信息上下文本质上由领域中可识别的概念组成——实体、关系及其属性。例如,像素(实体)、它们的颜色和亮度(属性)以及它们在网格中的相对位置(关系)形成了图像域中的信息上下文。数据科学家应该能够确定相关的信息上下文,并将其分配给数据。

强调信息背景的原因之一是可解释性。记住,可解释性总是特定于领域的。如果一个人不理解领域的概念,他就很难建立可解释的模型。但是,它超越了模型的可解释性,进入了模型的可改进性。尽管模型与数据一起工作,但建模发生在概念层面。对于一个名副其实的“数据科学家”来说,她应该能够设计出明智的策略来逐步改进模型,而不仅仅是基于试错法(hyper)的参数调整。没有对该领域的概念性理解,根本不可能设计出这样的策略。

如果可能的话,数据科学家会理解信息上下文

  • 根据实体、关系及其属性,形式化领域的相关概念
  • 将算法的训练数据集和结果模型的输入/输出映射到前面提到的概念形式。

数据收集机制

大多数(如果不是全部的话)数据驱动的建模方法对可用数据集相对于感兴趣的总体的代表性做出一些假设。在实践中,这种假设很少得到满足,这限制了人们对最终模型的信任。数据集的非代表性程度强烈地依赖于数据收集机制,而数据收集机制又依赖于领域。在其他地方,我已经详细讨论了这个代表性假设在不同的场景中是如何被违反的。我将不在这里重复讨论。可以说,数据科学家需要对数据收集机制有一个清晰的理解,以理解模型输出的健壮性。

理解数据收集机制也很重要,还有另一个原因。一般来说,有两种方法可以提高模型性能— (i)更强大的算法,(ii)更高质量和/或更多数量的数据。数据科学家需要对数据收集机制有足够的了解,以确定是否有任何手段可以获得更高质量或更多的数据。

考虑这样一个场景,我们被要求对所有在一个房间中生成的图像进行分类(包括带标签的数据)。假设我们已经建立了一个相当精确的模型。基于更强大算法的任何进一步改进都需要在算法开发方面进行大量投资。然而,假设我们可以控制房间里的照明。在这种情况下,我们可能会调整照明以获得更好的图像质量,从而更好地建模,而无需在构建更强大的算法方面进行巨额投资。

如果可能的话,数据科学家会理解数据收集机制

  • 确定由于数据集的非代表性而导致的模型的局限性
  • 设计减轻非代表性问题的技术,例如,为显示随机预测制定勘探预算
  • 建议调整数据收集机制,这可能会导致更好的模型性能。

在这篇文章的结尾,我将重申我在开头说过的话。一个人在定量领域学到的建模技能可以高度转移到其他领域。但是,你只能建立正确的模型,如果你知道什么是正确的模型。世界上所有的数学或黑客都不足以解决这个问题。花点时间去真正理解你要塑造的是什么,威尔。语境才是王道!

医学文档的挖掘和分类

原文:https://towardsdatascience.com/mining-and-classifying-medical-text-documents-1876462f73bc?source=collection_archive---------8-----------------------

临床数据科学

使用 Scikit-Learn 和 Streamlit 为自然语言处理开发和部署机器学习应用程序。

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

Photo by Annie Spratt on Unsplash

介绍

在医疗领域,会产生来自多个专业的大量(数字)文本文档,无论是患者健康记录、信件还是临床研究文档。事实上,文本数据,通常是非结构化,促成了全球数据量的巨大增长——仅社交媒体一项。因此,从文本中检索信息成为一项越来越重要的任务。

这篇文章的目的有两个:

  1. 演示方法为 文本挖掘文档分类用于 自然语言处理
  2. 展示使用 Scikit-LearnStreamlit 在 Python 中自动生成文本分类器的应用的开发部署

最终产品看起来像这个应用程序,名称为 医学语言模型学习者(MLML) 。(原始数据可在 kaggle 上获得)。)

自然语言处理 ( NLP )是语言学计算机科学信息工程人工智能的一个子领域,涉及计算机与人类(自然)语言之间的交互,特别是如何编程计算机处理和分析大量的自然语言数据。

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

Possible look of a Streamlit application. (image by author)

语言建模

Andrew Ng explaining embeddings, sequence models, recurrent neural networks.

嵌入

一个重要的考虑是,文本由 字符串 组成,但是数学模型依赖于数字,有不同的方式将文字转换成数字向量。另外,根据问题的定义,对语言建模有不同的可能性。一个常见的任务是将来自某个领域的序列(例如某种语言的文本/语音)映射到另一个领域的序列(例如另一种语言的文本/语音),称为 序列到序列模型 。例如,为了从文本( [文本到语音](http://An important consideration is the fact that text consists of strings, but mathematical models rely on numbers.) )生成语音,使用 递归神经网络 以及预训练的单词(例如用于单词表示的 全局向量手套)。在那种情况下,一个单词就变成了一个 n 维空间中的向量,类似于具有 n 个主成分的空间中的数据点。

不同的维度(也称为 、潜在变量 )可以被认为是描述单词的属性/特性,例如面包、水果和苹果等单词的属性“可食用”;像椅子、汽车和动物这样的词会出现在相反的方向。因此,在这个维度上,“苹果”和“椅子”会相距更远,但是“苹果”和“水果”会更近。至于“动物”这个词,这应该是中间的某个地方,因为有些动物是被吃掉的。请注意,通常不可能提取不同潜在变量的含义。

由于这些嵌入,与 1 选 1 的 K 编码方法相比,维数降低了。例如,具有 K 个单词的字典在 1-out-of-t 10】K 空间中具有 K 个维度(每个单词都是与所有其他单词正交的向量),但是嵌入可以将维度降低到 100,从而降低计算复杂度。(如果 K =10.000 且 n =100,则压缩系数为 100。)

预训练的嵌入可以下载,不必先构建。然而,每一个可能的单词都必须已经在嵌入中可用——或者嵌入必须首先被训练。嵌入是与上下文无关的,即单词“bank”在类似于“bank account”或“he sat on a bank”的表达中被视为相似。

词汇袋

或者,可以忽略语言的顺序方面,将文本建模为单词的集合( 单词袋 方法)。这是文本挖掘中最常见的表现形式,是从文本中获取高质量信息的过程。为了以这种方式描述文本,通过使用最频繁出现的单词n-grams(根据文本中的单词总数进行原始计数或归一化)来构建字典,但是这样的字典可能不太具有区分性,因为每个文本都包含像“a”、“the”、“is”等表达。****

为了解决这个问题,开发了一种叫做 词频-逆文档频率 ( tf-idfTFIDF )的解决方案;tf-idf 是一个数字统计量,旨在反映一个单词对文档集合中的一个文档有多重要。tf-idf 值与单词在文档中出现的次数成比例地增加,并根据语料库中包含该单词的文档数量进行修改,这有助于调整某些单词通常更频繁出现的事实。tf-idf 是当今最流行的术语加权方案之一;数字图书馆中 83%的基于文本的推荐系统使用 TF–IDF

术语频率-逆文档频率

词频(针对每个文档进行计算)通常是特定单词 i (例如“子宫颈”)的计数除以文本 L 中的总单词量,从而调整文档长度。

逆文档频率通过计算包含单词 i 的文档的逆分数( N/ni )并应用对数变换来获得。出现在几乎每个文档中的单词在对数变换之前将具有接近 1 的值,因此在对数变换之后接近 0。

tf-idf 是为一组 N 文档中的每个文档 k 中的每个单词 i 定义的。它由 tf 和 idf 相乘计算得出。这样,几乎每个文档 k 中都出现的一个字 i 降低了 tf-idf 值。对于文本挖掘,在字典中保留具有低 tf-idf 值的单词是没有意义的,因为它们对于特定的文档类没有区别。

想象一下,一个数据科学家想要建立一个区分生物和法律文档的模型;他应该关注哪些单词?像“是”或“a”这样无处不在的词一点帮助都没有,但是像“蛋白质”或“合同”这样的术语有帮助——这些是有趣的。如果模型应该进一步区分生物文档的子类(更高的分辨率),它需要细化字典。例如,“DNA”、“酶”或“途径”等词在微生物学中比在生态学中使用得更频繁,而“生物多样性”、“栖息地”或“种群”等词则相反。如果期望所述更高的分辨率,可能需要更大的字典。或者,人们必须更有选择性地将最大和最小 tf-idf 值包括在尺寸为 d 的字典中。

tf-idf 计算的结果是一个维数为 N x D 的矩阵,即文档数乘以字典大小,其中填充了用作特征的 tf-idf 值T3。注意,这很可能是一个 稀疏矩阵 。此外,在矩阵构造过程中存在可调参数,并且显然 tf-idf 变换对于模型性能具有一些影响。

sci kit-作为文本文档的内置转换器学习。

**import** pandas **as** pd **from** sklearn.feature_extraction.text **import** TfidfVectorizer
**from** sklearn.preprocessing **import** LabelEncoder
enc = LabelEncoder()# Load data.
data = pd.read_csv("mtsamples.csv", index_col=0, usecols=[0,1,2,4])
data = data.dropna()
samples = data.transcription
text_labels  = [label_name.lower() for label_name in data.medical_specialty]
labels = enc.fit_transform(np.array(text_labels))# Transform data.
max_df = 0.2
min_df = 0.001
max_features = 1000
ngram_range = (1,1)tfidf_vectorizer = TfidfVectorizer(max_df=max_df, min_df=min_df, max_features=max_features, stop_words='english', ngram_range=ngram_range)tfidf = tfidf_vectorizer.fit_transform(samples)
feature_names = tfidf_vectorizer.get_feature_names()

由于有几个自由参数,Streamlit 可用于构建滑块来更改值,并手动尝试不同的组合;这样,可以快速评估许多不同的选项。

**import** streamlit **as** st
**from** streamlit.logger **import** get_logger# Title.
st.sidebar.header("Constructing dictonary of words.")# Upper bound for tf-idf value.
max_df = st.sidebar.slider("Maximum tf-idf value for a word to be considered.", min_value=0.05, max_value=0.4, value=0.3, step=0.01)# Lower bound for tf-idf value.
min_df = st.sidebar.slider("Minimum tf-idf value for a word to be considered.", min_value=0.00, max_value=0.05, value=0.01, step=0.01)# Size of dictionary.
max_features = st.sidebar.slider("Size of dictionary.", min_value=100, max_value=1000, value=500, step=100)

最终产品看起来应该是这样的。

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

Checkboxes and sliders. (image by author)

降维

一个可能的应用是根据医学文档的医学专业对其进行分类。一旦构建了文档-单词矩阵,并且将文本转换成数学表示,就可以使用维数减少方法,例如 截断奇异值分解 和图表库,例如 Altair 来可视化它们。

**from** sklearn.decomposition **import** TruncatedSVD
**import** altair **as** alt# Dimensionality reduction.
dim_red = TruncatedSVD(n_components=2)
data_red = dim_red.fit_transform(tfidf)# Plot.
scatter = alt.Chart(data_red,title="dimensionality reduction",height=400).mark_circle().encode(x='principal component 1', y='principal component 2', color=alt.Color('class', scale=alt.Scale(scheme='blues')),tooltip=["class"]).interactive()st.altair_chart(scatter)

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

Dimensionality reduction of medical documents. (image by author)

该图显示了两个主成分空间中的不同文档,解释了原始 tf-idf 空间中的最高方差。已经可以看出,这些类之间有很多重叠——至少对于构造的字典来说是这样——并且分类器的性能会很低。

数据集包含 40 个类。然而,还不知道一个特定的类在数据集中出现的频率。例如,可以预期在倾斜的数据集中,低丰度类被错误分类的频率更高,因此丢弃或合并稀有类可能是合理的。

模型结构

为了建立文本模型,可以使用任何分类算法,例如 随机森林;与 逻辑回归 相比,随机森林的优势在于可以构造任意形状的决策边界,而无需基扩展。为了找到最佳的随机森林超参数,可以执行网格搜索。

**from** sklearn.ensemble **import** RandomForestClassifier# Number of trees.
n_estimators = 1000# Define classifier.
forest_clf = RandomForestClassifier(n_estimators=n_estimators, max_depth=None, max_leaf_nodes=None, class_weight='balanced', oob_score=True, n_jobs=-1, random_state=0)# Define grid.
parameters = {'max_leaf_nodes':np.linspace(20,35,14,dtype='int')}# Balanced accuracy as performance measure.
clf = RandomizedSearchCV(forest_clf, parameters, n_iter=10, cv=3,iid=False, scoring='accuracy',n_jobs=-1)# Train/optimize classifier.
classifier = clf.fit(tfidf, labels)# Retrieve optimum.
forest = classifier.best_estimator_
feature_importances = forest.feature_importances_
indices = np.argsort(feature_importances)[::-1]

手动调整这些超参数可能也很有趣。(在当前版本中,只有一个文本输入容器,所以必须将字符串转换为整数。)

st.sidebar.header("Customizing the model.")n_estimators = st.sidebar.text_input('Number of trees in random forest.', '1000')max_leaf_nodes = st.sidebar.text_input('Maximum number of leaf nodes in a tree.', '25')max_depth = st.sidebar.text_input('Maximum depth of a tree.', '5')class_weight = st.sidebar.selectbox("Class weights for the model.",('balanced','balanced_subsample'))

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

Input and selection fields. (image by author)

为了解释该模型,从随机森林获得的特征重要性应该在用条形图训练之后进行评估。

# Retrieve values.
feature_importance = classifier.feature_importances_# Plot.
bars = alt.Chart(feature_importance, height=400, title="discriminative power of features").mark_bar(color='steelblue', opacity=0.7).encode(y='features:N', x='feature importance:Q', tooltip="feature importance")st.altair_chart(bars)

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

Feature importance of words to discriminate between documents. (image by author)

可以看出,大多数重要程度是相似的。由外袋得分确定的整体表现较低(0.41)。很可能在类别之间有太多的重叠,这由维度减少来支持。

模型评估

评估模型相对于F1 得分混淆矩阵 进行计算。

****from** sklearn.metrics **import** f1_score, confusion_matrix# Retrieve values.
y_true = labels
y_pred = classifier.predict(tfidf)# Compute scores.
f1_score_ = f1_score(y_true,y_pred,average="weighted")
cm = confusion_matrix(y_true,y_pred)# Plot.
heat = alt.Chart(source, height=500, title="confusion matrix").mark_rect(opacity=0.7).encode(x='predicted class:N', y='true class:N', color=alt.Color('count:Q', scale=alt.Scale(scheme='blues')), tooltip="count")
st.altair_chart(heat)**

F1 分数为 0.49,因此精确度和/或召回率较低。从混淆矩阵中可以看出,该模型在区分医学文档方面存在困难。目前,文档之间使用的单词似乎过于相似,即许多相同的单词在不同的医学专业中使用,或者根本找不到任何模式。

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

Confusion matrix for all classes. (image by author)

显然,该模型现在可以用于预测。在这种情况下,必须提供一个样本作为输入,将其转换为 tf-idf 格式,并提供给分类器,然后分类器将返回该样本属于任何类别的概率预测。

部署

应用程序中的代码应该如下所示:

**LOGGER = get_logger(__name__)def run():
   # code for appif __name__ == "__main__":
    run()**

为了在本地测试它,终端被打开并被引导到带有“app.py”文件的位置。键入以下代码启动本地测试会话。

**streamlit run app.py**

要在云提供商如 Heroku 上部署应用程序,需要一个帐户和 git 。首先,创建一个文件名为“setup.sh”、内容如下的 shell 脚本

**mkdir -p ~/.streamlit/echo "\
[general]\n\
email = \"email@website.com\"\n\
" > ~/.streamlit/credentials.tomlecho "\
[server]\n\
headless = true\n\
enableCORS=false\n\
port = $PORT\n\
" > ~/.streamlit/config.toml**

接下来,创建一个 requirements.txt 文件。它的内容应该是这样的。

**pandas
sklearn
numpy
streamlit
altair**

对于 Heroku 来说,必须编写一个所谓的 Procfile ,其中包含以下代码行——假设该应用程序名为“app.py”。请注意,Procfile 没有类型规范。

**web: sh setup.sh && streamlit run app.py**

该应用程序可以部署在终端中(这里是在 Unix/Mac 操作系统上)。为此,shell 和所有文件都是定向的。

**$ cd Documents/Projects/App**

接下来,必须在 Heroku 上创建一个应用程序(这里命名为“myapp”)。之后,使用“app.py”文件在目录中初始化 git 存储库。

**$ git init
$ heroku git:remote -a myapp**

代码被提交到存储库并部署在 Heroku 上。

**$ git add .
$ git commit -am "make it better"
$ git push heroku master**

最后,应用程序应该是在线的。

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

Photo by Chris Ried on Unsplash

用组学和机器学习诊断疾病

原文:https://towardsdatascience.com/mining-biomarkers-from-breath-2975740b2d24?source=collection_archive---------22-----------------------

临床数据科学

使用特征选择方法发现生物标记。

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

Photo by Robina Weermeijer on Unsplash

介绍

组学领域包括生物学(名称以后缀*-组学*结尾)中的各个学科,如 基因组学蛋白质组学代谢组学糖组学中的组学问题 中的组学问题的共同点是变量(特征)的数量远大于样本的数量,因此遭受所谓的 维数灾难 ,因此需要控制模型复杂度的方法(例如正则化)。

通过研究不同人群(例如健康和非健康患者)的基因组蛋白质组代谢组,研究人员旨在发现疾病的潜在机制,同时也发现可用于诊断/监测疾病的新的 生物标志物 。来自肺病学的一个例子(基于在医疗设备开发、生物标记发现和病理学领域的一些出版作品)很好地说明了这一点。关于 呼吸分析 、是诊断学中的一项新兴技术,能够实现呼吸成分表征。

“小”分子在肺部从血液分配到空气中,然后被呼出。这些化合物通常是属于某些代谢途径的代谢物(偶尔我们也会发现从环境中吸收的分子,如污染物/增塑剂)。疾病可以通过改变基因组、转录组或蛋白质组(例如,由于 活性位点 的突变或阻断)来扰乱路径,因此将导致代谢组的“移位”。

这个想法是通过 质谱 监测呼吸成分的“扭曲”(以及代谢组的变化)。为此目的,受试者对着一个装置呼气,在 15 到 20 分钟的短暂实验中获得呼吸成分(作为每个单独化合物的信号 强度)。相比之下,血液测试(或多或少)是痛苦的,可能需要几个小时到几天,直到测试结果出来。由于是非侵入性和快速的,呼吸分析将是临床领域的一个巨大突破。通常,在一个实验中可以测量多达两千种不同的化合物,其中一个研究问题是如何从这些数据中找到生物标志物。(例如,研究人员在最近的一项研究中研究了肺癌患者呼出气体的成分。)

在本研究中,检验了该方法的再现性再现性,并在一个月的时间内收集了四名受试者的数据。尽管没有发现病理——因为所有受试者都应该是健康的——但这里的想法是展示一些从呼吸中检索生物标志物的可能技术。

预处理

分析是在 Python 中完成的,带有像 PandasMatplotlibScikit-Learn 这样的库。首先,导入所有库。

**import** pandas as **pd**
**import** matplotlib.pyplot as **plt
from** sklearn.feature_selection **import** SelectKBest, f_classif
**from** sklearn.ensemble **import** RandomForestClassifier
**from** sklearn.manifold **import** TSNE

现在,数据被加载到具有多级索引的数据框中。

filename = 'metabolites.xlsx'
data = pd.read_excel(filename, header=0, index_col=[0,1])

在下一步中,必须清理数据。因为它包含一些现在不相关的列,所以它们将被删除(“就地”以节省内存)。

data.drop(columns=['CO2','V','Q','p'], inplace=**True**)

此外,由于测量中有许多伪像,因此去除它们也很重要。为此,太弱和太强的信号(低于/高于某个阈值的中值)被确定,并且相应的特征被丢弃(阈值由领域知识确定)。

data.drop(columns=data.keys([data.median().values<1e5], inplace=**True**)
data.drop(columns=data.keys([data.median().values>1e9], inplace=**True**)

在 104 次实验中得到的特征数是 1510。我们将通过绘制直方图来查看所有信号的分布。

fig = plt.figure(figsize=(2.95,2.95))
ax = fig.add_subplot(111)
ax.hist(data.values.flatten(), 40000, stacked=**True**, density=**True**)
plt.show()

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

Figure 1: Distribution of intensities across all metabolites, subjects, and experiments. (image by author)

所得的强度分布如下所示,并且数据不是正态分布的,即大多数代谢物的强度较低。其强度与血浆中代谢物的浓度成正比,也与其 波动性膜通透性 成正比。不能蒸发或不能透过细胞膜扩散的代谢物是不可测量的。

因此,如果代谢物 A 比代谢物 B 的强度更高,血液水平不一定要包含相同的关系,甚至可能完全相反——只是因为代谢物 A 可能更具挥发性或渗透性。只要存在从血液水平到信号强度的唯一映射,这就不是问题。此外,将不会有一个单独的分子作为一种特定疾病的标记,而是一整套分子,你可以想象这将更加可靠。

特征选择

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

Figure 2: Representation of all metabolites in all experiments. (image by author)

在将每个特征缩放到 0 和 1 之间的范围后(归一化),通过将数据绘制成图像来“从顶部”查看数据可能是有用的。首先,有一些特征(代谢物)在大多数实验中强度较低。接下来,有许多样本显示强度降低,这可能暗示了 批次效应 。最后,大多数特征以相似的方式表现,均匀地分散在 0 和 1 之间的区间中。(有可能在绘制图像之前对患者或分子集进行聚类,这称为 聚类图 。)

数据现在可以被挖掘了。提取受试者中具有不同水平的分子的一种可能性是进行单变量统计测试。由于有两组以上,方差分析( F 检验 )是选择的方法。该算法将找到最重要的分子(即具有最低的 p 值)。

selector = SelectKBest(f_classif, k=9)
data_red = selector.fit(data, data.index.get_level_values("Subject")).transform(data)
selected_features = data.columns[selector.get_support()]

由于这是一种参数方法,每个受试者的强度分布必须是正态的,这可以通过绘制小提琴图来检查。为了自动生成概述,使用了下面的代码块。

for i in range(0,9):
    to_plot = [data_reduced[data.index.get_level_values("Subject")==1,i]/max(data_reduced[:,i]),             data_reduced[data.index.get_level_values("Subject")==2,i]/max(data_reduced[:,i]),          data_reduced[data.index.get_level_values("Subject")==3,i]/max(data_reduced[:,i]),         data_reduced[data.index.get_level_values("Subject")==4,i]/max(data_reduced[:,i])] fig = plt.figure(figsize=(2.95,2.95))
    ax = fig.add_subplot(1,1,1)
    ax.set_title(selected_features[i])
    vp = ax.violinplot(to_plot, widths=0.2, points=100, showmeans=False, showmedians=True, showextrema=True)
    ax.set_ylim((0, 1.2))
    ax.set_ylabel('normalized intensity / a.u.')
    ax.set_xlabel('subject')
    plt.show()

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

Figure 3: Statistically significant different biomarkers. (images by author)

尽管一些分子的分布范围很广,但受试者之间的差异是明显的。这种特征选择方法的缺点是它受样本大小的驱动。对于许多样本,组间的每个微小差异都可能具有统计学意义,尽管这可能是不相关的。

一个 随机森林 也可以确定最重要的特征来区分四个主体。特征的重要性可以在训练后恢复。

forest = RandomForestClassifier(n_estimators=5000)
forest.fit(data, data.index.get_level_values("Subject"))
importances = forest.feature_importances_

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

Figure 4: Feature importances as determined by a random forest. (image by author)

相应的特征重要性标绘了所有有助于区分四个受试者的分子。或者,一个规则化的支持向量机神经网络会做类似的工作。请注意,这些分子中的一些(例如 C10H10、C14H24)之前已经被发现,因此这些方法之间存在一致性

结论

最后,知道受试者是否与他们自己聚集在一起,也就是说,如果每个受试者都有一些“平均”的呼吸成分,围绕着它波动,这可能是有趣的。为此,我们可以使用像 t 分布随机邻居嵌入 这样的无监督学习方法。

dim_red = TSNE(n_components=2, perplexity=30)
Y = dim_red.fit_transform(data)

标记的大小设置为与之前发现的分子之一成比例(C13H16)。

fig = plt.figure(figsize=(2.95,2.95))
ax = fig.add_subplot(111)
ax.scatter(Y[:, 0], Y[:, 1], c=data.index.get_level_values("Subject"), cmap=plt.cm.viridis, s=50*data['C13H16']/np.max(data['C13H16']), edgecolors='k', alpha=0.75)
plt.show()

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

Figure 5: Scatter plot that captures the complete metabolome. Each subject clusters with himself (more or less). (image by author)

事实上,受试者似乎有一种呼吸印记,这种印记在一个月的时间内或多或少是稳定的。(注意,如果使用稀疏的 主成分分析 来代替,负载的大小也可以用作特征选择方法。)

这个简短的分析表明,在不久的将来,呼吸分析可以用作诊断疾病(甚至可能识别个体)的技术。

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

Photo by Jair Lázaro on Unsplash

挖掘 Twitter 数据进行事件情感分析

原文:https://towardsdatascience.com/mining-live-twitter-data-for-sentiment-analysis-of-events-d69aa2d136a1?source=collection_archive---------9-----------------------

Twitter 是一个丰富的信息来源。从每分钟的趋势到围绕主题的一般性讨论,Twitter 是一个项目的巨大数据源。此外,Twitter 已经为开发人员构建了一个惊人的 API 来使用这些数据。我们能追踪一个事件,看看人们在想什么吗?随着事件的发展,有可能对世界的想法进行情绪分析吗?我们能否追踪 Twitter 数据,看看它是否与影响股市走势的新闻相关?当我最近开始挖掘 Twitter 数据时,这些是我脑海中的一些问题。

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

Let’s Use Twitter for Sentiment Analysis of Events

如果你更喜欢听这个博客的音频版本,我也为这个博客录了一段播客——在这里我会详细介绍每个步骤,包括注意事项和需要避免的事情。你可以在苹果播客SpotifyAnchor.fm 上听,或者在我最喜欢的播客应用之一:阴天上听。

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

Audio version of this available in podcast episode

让我们进入使用 Twitter 数据进行事件情感分析的步骤:

1.获取 Twitter API 凭据:

首先,访问这个链接并访问一个开发者账户。

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

Apply for access to Twitter API

一旦您注册,您将有权访问消费者令牌,消费者秘密,访问密钥以及访问秘密。你将需要提到申请 API 访问的原因,你可以提到“学生学习项目”或“学习使用 Python 进行数据科学”等原因作为理由。

2.在 Python 中设置 API 凭证:

将您的凭证保存在一个配置文件中,并运行source ./config将密钥作为环境变量加载。这是为了避免在 Python 脚本中暴露您的键。确保不要将这个config文件提交到 Github 中。
我们将用 Python 中的tweepy库来访问 Twitter API。它是原始 Twitter API 的一个很好的包装器,为创建 API URLs 和 http 请求提供了大量的支持。我们只需要提供第一步中的密钥,Tweepy 负责与 Twitter API 对话——这很酷。
运行pip install tweepy在您的虚拟环境中获得tweepy包。(我一直在用[pyenv](https://github.com/pyenv/pyenv-virtualenv)管理不同版本的 Python,印象非常深刻。您还需要[pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv)包来为您管理虚拟环境——但这本身是另一个博客)
在 Python 中,您可以键入:

import os
**import json
import** tweepy
**from** tweepy **import** Stream                   # Useful in Step 3
**from** tweepy.streaming **import** StreamListener # Useful in Step 3consumer_key = os.getenv(**“CONSUMER_KEY_TWITTER”**)
consumer_secret = os.getenv(**“CONSUMER_SECRET_TWITTER”**)
access_token = os.getenv(**“ACCESS_KEY_TWITTER”**)
access_token_secret = os.getenv(**“ACCESS_SECRET_TWITTER”**)auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

这将设置您的环境变量,并设置可用于访问 Twitter API 数据的api对象。

3.通过流式 API 获取推文数据:

设置好凭证后,现在是时候通过 API 获取 Tweet 数据了。我喜欢使用流式 API 来过滤我感兴趣的话题的实时推文。还有 Search API,它允许您搜索历史数据,但是正如您从这个图表中看到的,它对免费访问的限制很少,最多可以访问过去 7 天的数据。对于付费计划,根据我在网上看到的情况,价格可以从 149 美元到 2499 美元/月(甚至更多)——我在 Twitter 网站上找不到确切价格的页面。

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

Types of Categories for Twitter Search API

要设置流式 API,您需要定义自己的类方法on_data,该方法从流式 API 的data对象中执行一些操作。

**class** listener(StreamListener):
    **def** on_data(self, data):
        data = json.loads(data)
        # Filter out non-English Tweets**if** data.get(**"lang"**) != **"en"**: **return True****try**:
            timestamp = data[**'timestamp_ms'**]            
            # Get longer 280 char tweets if possible
            **if** data.get(**"extended_tweet"**):
                tweet = data[**'extended_tweet'**][**"full_text"**]**else**:
                tweet = data[**"text"**]
            url = **"https://www.twitter.com/i/web/status/" +** data[**"id_str"**]
            user = data[**"user"**][**"screen_name"**]
            verified = data[**"user"**][**"verified"]  **                
            write_to_csv([timestamp, tweet, user, verified, url])

        **except** KeyError **as** e:
            print(**"Keyerror:"**, e)

        **return True

    def** on_error(self, status):
        print(status)

我没有包含write_to_csv函数,但它可以使用csv库实现,一些例子可以在这里看到

你也可以将推文保存到 SQLite 数据库 esp 中。如果有几十万条推文。SQLite 还允许您通过 SQL 命令对所有信息进行命令行访问。对于 CSV,你必须在笔记本上加载一个熊猫数据框。只是看你更喜欢哪个工作流程了。通常情况下,您可以保存到 SQLite 数据库中,并使用 pandas 中的read_sql命令将其转换为 dataframe 对象。这允许我从命令行和 pandas 访问数据。

最后,运行这个函数stream_and_write来启动流 API 并调用我们上面写的监听器。最主要的是使用extended模式调用Stream API,因为它会让你访问更长的、潜在的信息丰富的推文。

**def** stream_and_write(table, track=**None**):
    **try**:
        twitterStream = Stream(auth, listener(), 
                               tweet_mode=**'extended'**)
        twitterStream.filter(track=["AAPL", "AMZN", "UBER"])**except** Exception **as** e:
        print("Error:", str(e))
        time.sleep(5)

另一件需要注意的重要事情是,您可以使用流式 API 跟踪的项目数量。在我的测试中,我无法跟踪超过 400 个左右的track列表中的项目。在构思你的想法时,请记住这一点。

4.获取情感信息:

一旦我们收集了所有的 tweet 数据,情感分析可以在上面的监听器中完成,也可以离线完成。
我们可以在 Python 中使用开箱即用的情感处理库。从我看到的,我喜欢 TextBlobVader 感悟TextBlob提供主观性评分和极性评分。Vader提供一个posneuneg和一个compound分数。对于两个库的-1 和 1 之间的单个情感分数,使用来自 TextBlob 的polarity和来自 Vader 情感的compound
根据维达情怀的 Github 页面,

VADER 情绪分析。VADER (Valence Aware 字典和情感推理器)是一个基于词典和规则的情感分析工具,专门针对社交媒体中表达的情感,对其他领域的文本也很有效。

对于 TextBlob,

**from** textblob **import** TextBlob
ts = TextBlob(tweet).sentiment
print(ts.subjectivity, ts.polarity) # Subjectivity, Sentiment Scores

对维德来说:

**from** vaderSentiment.vaderSentiment **import** SentimentIntensityAnalyzer
analyzer = SentimentIntensityAnalyzer()
vs = analyzer.polarity_scores(tweet)
print(vs["compound"], vs["pos"], vs["neu"], vs["neg"])

将情绪信息与推文一起保存,可以让您随着时间的推移为不同的股票或事件构建情绪得分图。Vader vs TextBlob 将取决于您自己的项目,我也尝试了上述两个库的组合,但不知何故喜欢使用一个库完成不同任务的简单性。
理想情况下,你可以用对你来说重要的东西来训练你自己的情感分析模型,但这需要收集你自己的训练数据,并建立和评估一个机器学习模型。为了能够捕捉像“我期待一部精彩的电影,但结果不是”这样的句子中的负面情绪,我们需要能够处理序列数据的模型,并认识到not to be正在否定早先的amazing,这需要从神经网络中的长短期记忆(LSTM)细胞建立的模型。训练和建立一个 LSTM 情感分析网络可能是另一篇博文,如果你有兴趣阅读,请在下面留下评论。

5。剧情情感信息:

当曼联在冠军联赛四分之一决赛中 0:3 输给巴塞罗那时,我绘制了这种情绪。正如你所看到的,情绪随着时间的推移而下降,当球队在 4 月 16 日下午比赛时,情绪开始下降。

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

Sentiment Dropping as Manchester United lose to Barcelona

虽然情绪得分在体育赛事中表现不错,但股市呢?以下是高通(QCOM)在苹果放弃与高通的诉讼的一周内的表现(确切消息来自 4 月 16 日)。我们预计围绕这一消息的积极情绪会显著增加,但很难在下面得出结论:

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

QCOM stock performance during the week when their lawsuit with Apple was dropped

这使得从情感分析中提取 alpha 变得更加困难。我觉得这是一个很好的工具,可以用来观察新闻事件或体育活动的情绪,但试图将情绪与股市表现联系起来更难,因为这涉及到过滤掉嘈杂的推文,还需要做大量的特征工程工作来获得信号。

6.在 AWS 或 Google 云平台上进行设置:

你不希望在你的计算机上运行流式 API,因为当你关闭它时,脚本也会停止。您应该在 AWS EC2 实例或 Google 云平台服务器上运行它。我不打算详细说明如何设置,有很多很棒的资源可以使用[AWSGCP]。使用tmuxscreen运行上述脚本,并在 Twitter 上访问您感兴趣的话题!

从 Twitter 上获取数据和构建情感分析引擎非常有趣。正如你所期望的那样,看到事件的向下或向上的情绪趋势是非常令人满意的。下一步将是准确地绘制情绪,而不是先保存推文,这将需要像[dash](https://plot.ly/products/dash/)这样的库。

祝你探索 Twitter 数据好运——愿你能如你所愿看到趋势!感谢阅读。

资源:
1。text blob:【https://textblob.readthedocs.io/en/dev/
2。维德:https://github.com/cjhutto/vaderSentiment3。获得 Twitter API 访问:https://developer.twitter.com/en/apply-for-access
4。比较其中一些库的博客:https://Neptune . ai/blog/情操分析-python-text blob-vs-Vader-vs-flair

在 IBM 云平台上挖掘 Twitter

原文:https://towardsdatascience.com/mining-twitter-on-ibm-cloud-platform-2adab9fb60ed?source=collection_archive---------23-----------------------

在 IBM 云存储上将 Tweets 保存为 JSON

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

This photo is made from a photo in this ©twitter post and ©IBM Watson Studio Logo

去年,我开始了对网络说服的多学科研究。我找不到足够的推特数据集。我需要创建自己的推特数据集,让我能够实现研究目标。

Twitter 免费 API 是有限的,根据我的经验,它会在检索 4000 条左右的推文后暂停大约 15 分钟。为了克服这一点,我使用了时间循环。我需要一个云平台来检索带有时间循环的 50 个查询的推文。

我第一次尝试从 twitter 流中检索推文是在 Watson——IBM 云平台上。Tweet 对象呈现为 JSON,因此保存它们是明智的。嗯——在 IBM 云存储上保存为 JSON 和在本地保存是不一样的。此外,以前没有人问如何做,尽管如此,回答它,所以这里是我的答案。

关于 IBM Watson studio 的几句好话:它是一个非常友好的云计算平台,尤其是对于第一次使用它的人。你可以在这里报名。点击几下之后,你就可以在 Jupyter 笔记本上工作了。你可以在这里阅读关于如何开始使用沃森工作室。

连接

在处理任何云项目时,一个必要的步骤是将您的项目连接到您的项目资源。正如我所说,Watson Studio 非常友好,只需两次点击:一次点击工具栏上的三个垂直点,第二次点击Insert project token,如下图所示:

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

将创建如下代码:

作为该项目的管理员,您可能需要批准这一点,但 Watson 将指导您并重新引导您。

在 Watson 上工作时,您可能需要在每次重新连接时安装[tweepy](https://www.tweepy.org/) 。为了检索推文,这些是最少的必要导入和安装:

为了连接到 twitter API ,你需要一个 twitter 开发者账户和你的账户凭证。访问您的密钥和令牌的一种方式是通过应用和应用详细信息——如果需要,您还可以在那里重新生成它们。
如此处所示:

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

稍后插入您的凭证,如下所示:

在连接您的项目和资源,并连接到您的 twitter API 之后,下一步是检索 tweets。

检索推文

在下面的代码要点中,有一个如何使用 tweepy 的示例,它包含过滤器、查询、语言和要检索的项数。你可以过滤推文并使用任何你喜欢的查询。

保存到 JSON

挖掘 twitter 数据的最后一步是保存它。
沃森存储上的节约语法是:

project.save_data(data=json.dumps(all_data),file_name=data.json,overwrite=True)

与本地保存 JSON 文件的语法不同:
with open(data.json, w) as f: ... json.dump(all_data, f)

在 Wason 上加载数据也只需两次点击:

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

它将插入连接到您的云存储的代码,将添加所需的导入,并将数据作为 pandas 数据帧读取。它看起来像这样:

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

使用 Watson studio 非常简单:

1.连接到云资源和 twitter API。

2.检索推文。

3.节约。

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

Photo by freestocks.org from Pexels

现在,至于理解 twitter 元数据?好吧,那是另一个时间的另一篇博文。

墙上的魔镜魔镜谁是他们当中最喜欢猫的?

原文:https://towardsdatascience.com/mirror-mirror-on-the-wall-who-is-the-most-cat-of-them-all-b078a0b7f632?source=collection_archive---------32-----------------------

询问训练过的神经网络对世界的看法。

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

Riddle me this: How does a cat look like to you?

训练神经网络

用神经网络进行图像分类现在已经不是什么新鲜事了。通常,训练神经网络的过程是这样的:

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

为了训练这样一个神经网络,我们需要大量的训练数据。训练数据中的每一项都由一幅图像和一个标签组成(标签告诉我们图像上显示的是什么对象)。

网络显示图像并产生一些输出(红框)。将此输出与预期结果(绿框)进行比较。考虑到网络的“错误程度”,下次它会做得更好。

神经网络的输出是一系列数字。列表的长度等于网络可以检测到的不同对象的数量(上图中为 2)。列表中的每个数字对应于该对象出现在当前图像中的概率。

逆转训练

我们已经看到神经网络是如何被训练用于图像分类的。但它到底学到了什么?

有一篇很好的博文描述了一种可视化神经网络各个部分所学内容的方法:

[## 如何用 40 行代码可视化卷积特征

发展解释网络的技术是一个重要的研究领域。本文解释了您可以如何…

towardsdatascience.com](/how-to-visualize-convolutional-features-in-40-lines-of-code-70b7d87b0030)

扩展本文的思想,我们可以使用网络来生成在特定类别中产生最高置信度的图像。例如:“生成一张你最确信是一只猫的图片。”

下图显示了实现这一目标所需的培训过程中的细微变化:

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

我们不是从随机网络开始,而是从随机图像开始。预期的结果是对我们想要可视化的类赋予 100%的置信度。

[## DDI 编辑推荐:5 本让你从新手变成专家的机器学习书籍|数据驱动…

机器学习行业的蓬勃发展重新引起了人们对人工智能的兴趣

www.datadriveninvestor.com](https://www.datadriveninvestor.com/2019/03/03/editors-pick-5-machine-learning-books/)

然后更新最初的随机图像,使其更符合预期的结果。运行这个程序几次(希望如此)会揭示网络认为猫长什么样。

ImageNet

对于这个实验,我使用了一个在 ImageNet 数据集上预先训练的神经网络。这个数据集包含超过 1400 万张图片,每张图片属于 1000 个类别中的一个。

我在谷歌实验室上运行了可视化程序。如果你需要帮助在 Colab 上做你自己的深度学习实验,这里有一篇博客文章,详细介绍了如何设置你的环境:

[## 为深度学习实验设置 Google Colab

不是每个人都有带 GPU 的本地机。幸运的是,你可以免费得到一个。

medium.com](https://medium.com/datadriveninvestor/setting-up-google-colab-for-deeplearning-experiments-53de394ae688) [## 在 Google Colab 上加速你的图像训练

获得一个因素 20 加速训练猫对狗分类器免费!

medium.com](https://medium.com/datadriveninvestor/speed-up-your-image-training-on-google-colab-dc95ea1491cf)

我的实现严重依赖于这个笔记本:

[## nbviewer 笔记本

想法如下:我们从包含随机像素的图片开始。我们将评估模式下的网络应用于…

nbviewer.jupyter.org](https://nbviewer.jupyter.org/github/anhquan0412/animation-classification/blob/master/convolutional-feature-visualization.ipynb)

1000 节课

既然一切都准备好了,我就开始实验。为 imagenet 中 1000 个不同的类中的每一个生成一个图像需要几个小时,但谢天谢地 GoogleColab 坚持下来了,没有崩溃。

生成的图像大多不是很有趣。我筛选了整个堆栈(是的,通过所有 1000 张图片…)并挑选了最好的。

以下是我的首选,大致分为几类。尽情享受吧!

(如果没有时间看完所有图片,可以滚动到底部。最好的在那里)

随机对象

这些图像通常显示一个对象的多次出现,相互堆叠。

衣服

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

水果

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

混搭程式

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

军事保护

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

军事武器

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

数字

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

涂鸦

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

技术的

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

工具

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

景色

这些图像通常不仅显示生成它们的物体,还显示某种周围的场景。

衣服

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

食物

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

运动

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

商店

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

动物

啊,是的,动物。他们不可爱吗?嗯,除了蟑螂可能…

国产+熊

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

昆虫

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

海洋的

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

厚皮

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

热带的

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

最好的

下面的图片是我个人最喜欢的,拼图玩具以很大优势赢得了第一名。

个人最爱

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

自然的

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

运动

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

技术的

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

就是这样。我希望你喜欢这场画展。让我知道哪个是你最喜欢的!

镜子、自动驾驶卡车、无意识偏见和机器学习/人工智能

原文:https://towardsdatascience.com/mirrors-self-driving-trucks-unconscious-bias-and-machine-learning-artificial-intelligence-24c162c55eb?source=collection_archive---------34-----------------------

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

https://www.youtube.com/watch?time_continue=82&v=ARJ8cAGm6JE

这个月我去拜访了我在爱尔兰的一个朋友,他刚刚改造了一所房子。她买了一面大镜子,问现场的工人是否可以把它挂在餐厅里,然后她就出去了。当她回来时,她发现虽然镜子被正确地挂在墙上,但她只能在镜子里看到自己的头顶。考虑到镜子已经存在了几个世纪,而且它们的用途也很好理解,为什么镜子被挂得这么高呢?会不会是挂镜子的人只能看到自己,而无法进入他人的体验?

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

给定精确的统计数据,机器人会做得更好吗?2014 年,爱尔兰男性的平均身高为 178.9 厘米(5 英尺 10 英寸),女性的平均身高为 165.1 厘米(5 英尺 5 英寸)。也许机器人在摆放位置上会更客观?

我再次阅读和与跨行业的人聊天,思考各种形式的无意偏见。对于那些喜欢了解他人思维基础的读者,你可以通过阅读这篇纽约时报文章或这篇来自麻省理工学院的白皮书来了解我的想法。还有,我刚刚开始读这本

让我们从一个有趣的事实开始:美国劳工统计局预计,在 2006 年到 2028 年间,55 岁及以上的美国工人的比例将从 16.8%上升到 25.2%。2018 年,55 岁以上潜在工薪阶层的比例为 23.1 %。2019 年 7 月,他们的失业率约为 2.7%。如果你从事技术和/或软件行业,看看你的办公室。你看到这些超过 55 岁的工人了吗?他们中有没有人参与针对这群打工仔的产品设计?

鉴于预测在不到十年的时间里,超过四分之一的潜在劳动力年龄将超过 55 岁,这将是机器人可能做出更理性决定的又一个例子吗?如果人们的预期是,人口中某一部分的工薪阶层将会增加,那么机器人/智能代理进行招聘是否反映了对更大的潜在客户同理心的需求?根据最近的一篇关于雇佣的文章,我们确实知道,按照人类的雇佣方式,在美国,科技工作者的平均工资在 40 岁之后会趋于稳定。

一个聪明的代理人真的会做得更好,在招聘中更少年龄歧视吗(假设相同的技能)?也许不是。基于 ImageNet 轮盘;如果把外表考虑进去的话,肯定不是。人工智能模型对训练数据的依赖意味着,同样的偏见(甚至可能被标记数据的一小部分人放大)可能会使智能代理比人类更有偏见。

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

https://www.travelblog.org/Photos/2494174

转向自动驾驶卡车或其他自动驾驶车辆。无人驾驶车辆的一个明显好处是,机器比人类需要更长的时间才会疲劳。人们最初可能会认为,对于卡车运输公司来说,让他们的司机在公路上睡觉,而卡车自己行驶,然后让司机接管更具挑战性的外城/内城地区或有驼鹿的山口,会更安全、更具成本效益。这种方法将保持目前每辆卡车一名司机的做法,并利用我们现有的公路基础设施。可能会增加一些州提议的卡车专用车道。

从我们对个人主义和对汽车的热爱的历史偏见中退一步,如果为了长途运输和公共交通而放弃或建设宝贵的土地是一个挑战,你将如何设计一个既能处理轻轨又能处理小型货运的系统?轮子?足迹?集装箱在下面,人坐在上面?你将如何装载它们?如果这能让变形金刚想起你的童年,那就更好了!

无意识的偏见可以被那些经验有限的人和那些“思想陈旧”的人植入非人类的“智力”中:那些年龄在 30-90 岁之间的人,他们的思想因为工作或生活环境缺乏改变而变得停滞不前。

周末愉快,尽情发挥你的想象力,挑战你的偏见!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值