TowardsDataScience-博客中文翻译-2019-七十一-

龙哥盟 / 2024-10-14 / 原文

TowardsDataScience 博客中文翻译 2019(七十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

使用 Seaborn 可视化统计图

原文:https://towardsdatascience.com/visualizing-statistical-plots-with-seaborn-6b6e60ce5e71?source=collection_archive---------22-----------------------

这是关于可视化的第二篇文章。你可以阅读第一篇文章,在那里我讨论了使用 matplotlib 进行可视化的基础知识。

概括地说,可视化让我们看到数据是如何分布的,检测异常值,并让我们更有效地传达信息。这就是为什么数据科学家/分析师知道如何可视化以及他们有哪些可用选项非常重要。在本文中,我将介绍如何使用 seaborn 来可视化统计图表。

为此,我们将利用 seaborn 自身的一些数据集。这避免了我们必须下载和导入数据集的麻烦。您可以在这个链接中看到可用数据集的完整列表。

Photo by Luke Chesser on Unsplash

我们将从导入所需的库开始。

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

接下来,让我们加载“虹膜”数据集,看看它。

iris = sns.load_dataset('iris')
iris.head()

Iris dataset

Iris 数据集包含三种不同物种的花的细节。由于这个数据集主要包含数字列,我们将使用它来探索适合数字数据的可视化。

所以我们能做的第一件事是检查任何一列的分布。

sns.set(style = 'darkgrid')
sns.distplot(iris['sepal_length'])

Fig 2

第一行允许您设置图形的样式,第二行构建分布图。这个“distplot”命令在同一个图形中构建直方图和 KDE 图。

但是我们可以选择定制上面的图表,甚至将它们分开。

sns.distplot(iris['sepal_length'], kde = False, bins = 30)

Fig 3

在这里,我们不仅删除了 KDE 图,而且还能够在图中添加更多的箱,以便更好地了解分布情况。这是分别通过“kde”和“bin”参数实现的。

KDE 图可以在 KDE plot 命令的帮助下单独查看。

sns.kdeplot(iris['sepal_length'])

Fig 4

使该图更好的一种方法是能够显示各种数据点的存在,以便更好地理解数据的分布。类似于直方图,但具有小的柱。这是在地毯图的帮助下完成的。

sns.kdeplot(iris['sepal_length'])
sns.rugplot(iris['sepal_length'])

Fig 5

上面的图称为地毯图,给出了点的分布和密度。

仅仅可视化一个变量就够了,如果你想看看两个变量是如何相对于彼此分布的呢?

假设我们想知道花的萼片和花瓣长度之间的关系。在这种情况下,我们可以使用 jointplot 来可视化它。

sns.jointplot(x = 'sepal_length', y = 'petal_length', data = iris)

Fig 6

上面的图不仅给出了联合分布,也给出了沿轴的个体分布。从上图可以看出,除了在较低端,两者之间几乎是线性关系。

joinplot 的一个很酷的特性是能够拟合数据的回归线。

sns.jointplot(x = 'sepal_length', y = 'petal_length', data = iris, kind = 'reg')

Fig 7

通过将' reg '传递给 kind 参数,我们可以添加一条回归线,并将 kde 图添加到边上的直方图中。

最后,如果我们想一次性快速了解全部数据,我们可以使用 pairplot 函数。

sns.pairplot(iris)

Fig 8

唯一要传递的参数是数据集名称,它将自动为数据中出现的所有数字列构建上面的图。它将每一个数字列与其他数字列相对照,有助于快速浏览数据。

但是上面的图仍然缺少一列 species,这恰好是一个分类列。我们可以在此包含关于分类列的信息吗?

sns.pairplot(iris, hue = 'species', palette = 'magma')

Fig 9

在每个单独的图中,分类数据以颜色方案的形式表示。参数“色调”可用于传递此信息,而“调色板”控制绘图的颜色方案。

现在让我们来看看包含更多分类列的可视化数据。为此,我们将使用“提示”数据集。让我们把它装上来看一看。

tips = sns.load_dataset('tips')
tips.head()

Tips data

“小费”数据集包含就餐者支付的小费及其信息,如账单金额、性别、时间等。让我们从观察小费金额的分布及其与总账单金额的关系开始。

sns.distplot(tips['tip'], kde = False, bins = 30)
sns.jointplot(x = 'total_bill', y = 'tip', data = tips, kind = 'kde')

Fig 11

Fig 12

现在让我们看看给的小费是否每天都不同。这可以在箱线图的帮助下完成。

sns.boxplot(x = 'day',y = 'tip',  data = tips, palette = 'coolwarm')

Fig 13

也许我们想通过用餐者的性别进行比较。像在 pairplot 中一样,我们也可以通过“色调”参数来指定

sns.boxplot(x = 'day',y = 'tip',  data = tips, hue = 'sex', palette = 'coolwarm')

Fig 14

这根据性别为每天创建了两个箱线图。

另一种在小提琴的帮助下可视化上述数据的方法。

sns.violinplot(x = 'day',y = 'tip', data = tips, palette = 'rainbow')

Fig 15

小提琴图可以被认为是盒子图和 kde 图的组合。中间的粗线表示四分位数之间的范围,两边都是顶端的 kde。

类似于盒子情节,我们可以用‘性’来创造两个并排的小提琴情节来比较。但在这种情况下我们有更好的选择。

sns.violinplot(x = 'day',y = 'tip',  data = tips, hue = 'sex', split = True, palette = 'rainbow')

Fig 16

通过将“split”指示为 true,我们能够在中心线的每一侧创建两个不同的 kde。这让我们可以并排看到差异,而不会排挤剧情。

之前我们看到,我们能够使用配对图来查看整个数据,并包括一个分类列。但是在这种情况下,我们有多个分类列。这些可以通过小平面网格整合到绘图中。

g = sns.FacetGrid(tips, col="time",  row="smoker")

Fig 17

上面的命令创建了一个 2 x 2 的图来说明“时间”和“吸烟者”之间的四种可能性。对于用餐时间和用餐者是否吸烟的每种组合,都有一个曲线图。

在这些图中,我们可以添加数字数据,并比较它们在上述“时间”和“吸烟者”两列中的差异。

g = sns.FacetGrid(tips, col="time",  row="smoker")
g = g.map(plt.hist, "tip")

Fig 18

我添加了小费值的分布,以观察它们在“时间”和“吸烟者”之间的差异。每个图的上方有一条线,指示它对应的“时间”和“吸烟者”值。

类似地,我们也可以绘制两个数字列,并查看两者之间以及“时间”和“吸烟者”之间的关系。

g = sns.FacetGrid(tips, col="time",  row="smoker",hue='sex')
g = g.map(plt.scatter, "total_bill", "tip").add_legend()

Fig 18

上图显示了小费和账单金额之间的关系,以及“时间”和“吸烟者”之间的关系。此外,每个地块的配色方案也显示了性别。通过使用分面网格,我们可以创建包含多个数字和分类列的图。

最后,我想介绍一下热图和聚类图。

在下图中,我使用了热图来显示所有数值之间的相关性。

sns.heatmap(tips.corr(), cmap = 'coolwarm', annot = True)

Fig 19

命令“tips.corr”给出了所有数值变量之间的相关性。通过将“不能”表示为真,我们也可以在图上得到相关值。

为了构建聚类图,我首先透视小费数据集,以获得不同日期和性别的小费金额。

tip_pivot = tips.pivot_table(values='tip',index='day',columns='sex')

Pivoted table

利用这一点,我可以创建一个关于小费价值和日期之间距离的聚类图。

sns.clustermap(tip_pivot, cmap = 'coolwarm', standard_scale = 1)

Fig 21

因为只有两种性别,所以没有什么可看的。但是在星期几的例子中,我们看到星期六和星期四被组合在一起,表明这两天给小费的数量相似。

上面的聚类图非常简单,因为每个轴上没有很多类别。当有多个允许辨别相似性和模式的类别时,一个聚类图会非常出色。

这涵盖了一些可以使用 Seaborn 构建的统计图和可视化。希望你觉得有用。

你也可以通过 LinkedIn 与我联系。

使用 Matplotlib 和 Gym 绘制优雅的股票交易代理

原文:https://towardsdatascience.com/visualizing-stock-trading-agents-using-matplotlib-and-gym-584c992bc6d4?source=collection_archive---------3-----------------------

我们将扩展我们在上一个教程中编写的代码,以使用 Matplotlib 呈现环境的可视化效果。如果你没有读过我的第一篇文章 从头开始创造定制的健身房环境 ,你应该停下来先读一下。

如果你对matplotlib库不熟悉,不用担心。我们将检查每一行,以便您可以创建自己的gym环境的自定义可视化。一如既往,本教程的代码将在我的 Github 上提供。

下面是我们将在本文中创建的内容的预览:

如果看起来很复杂,其实也没那么糟糕。只有几个关于每个step的图表更新,注释了一些关键信息。我们开始吧!

股票交易可视化

在上一个教程中,我们编写了一个简单的render方法,使用print语句显示代理的净值和其他重要指标。让我们将这个逻辑转移到一个名为_render_to_file的新方法中,这样我们就可以在必要时将一个会话的交易指标保存到一个文件中。

***def*** _render_to_file(*self*, *filename*='render.txt'):
  profit = self.net_worth - INITIAL_ACCOUNT_BALANCE

  file = open(filename, 'a+') file.write(*f*'Step: {self.current_step}\n')
  file.write(*f*'Balance: {self.balance}\n')
  file.write(*f*'Shares held: {self.shares_held} (Total sold: 
    {self.total_shares_sold})\n')
  file.write(*f*'Avg cost for held shares: {self.cost_basis} (Total 
    sales value: {self.total_sales_value})\n')
  file.write(*f*'Net worth: {self.net_worth} (Max net worth: 
    {self.max_net_worth})\n')
  file.write(*f*'Profit: {profit}\n\n') file.close()

现在,让我们继续创建新的render方法。它将利用我们新的StockTradingGraph类,我们还没有写。我们下一步会谈到这个。

***def*** render(*self*, *mode*='live', *title*=None, ***kwargs*):
  # Render the environment to the screen **if** mode == 'file':
    self._render_to_file(kwargs.get('filename', 'render.txt'))
  **elif** mode == 'live':
    **if** self.visualization == None:
      self.visualization = StockTradingGraph(self.df, title)

    **if** self.current_step > LOOKBACK_WINDOW_SIZE:        
      self.visualization.render(self.current_step, self.net_worth, 
        self.trades, *window_size*=LOOKBACK_WINDOW_SIZE)

我们在这里使用[kwargs](http://book.pythontips.com/en/latest/args_and_kwargs.html)将可选的filenametitle传递给StockTradingGraph。如果你不熟悉kwargs,它基本上是一个向函数传递可选关键字参数的字典。

我们还为可视化传递了self.trades,但是还没有定义它,所以让我们开始吧。回到我们的_take_action方法,无论何时我们买入或卖出股票,我们现在都要将交易的细节添加到self.trades对象中,在我们的reset方法中我们已经将它初始化为[]

**def** _take_action(self, action):
  ... **if** action_type < 1:
    **...
**    
    **if** shares_bought > 0:
      self.trades.append({'step': self.current_step,
        'shares': shares_bought, 'total': additional_cost,
        'type': "buy"}) **elif** action_type < 2:
    **...** **if** shares_sold > 0:
      self.trades.append({'step': self.current_step,
        'shares': shares_sold, 'total': shares_sold * current_price,
        'type': "sell"})

现在,我们的StockTradingGraph已经拥有了呈现股票价格历史和交易量所需的所有信息,以及我们代理的净值和它所做的任何交易。让我们开始渲染我们的可视化。

首先,我们将定义我们的StockTradingGraph和它的__init__方法。在这里我们将创建我们的pyplot人物,并设置每个要渲染的支线剧情。date2num函数用于将日期重新格式化为时间戳,这在以后的呈现过程中是必要的。

**import** numpy **as** np
**import** matplotlib
**import** matplotlib.pyplot **as** plt
**import** matplotlib.dates **as** mdates***def*** date2num(*date*):
  converter = mdates.strpdate2num('%Y-%m-%d')
  **return** converter(date)***class*** **StockTradingGraph**:
  """A stock trading visualization using matplotlib made to render 
    OpenAI gym environments"""***def*** __init__(*self*, *df*, *title*=None):
    self.df = df
    self.net_worths = np.zeros(len(df['Date'])) # Create a figure on screen and set the title
    fig = plt.figure()
    fig.suptitle(title) # Create top subplot for net worth axis
    self.net_worth_ax = plt.subplot2grid((6, 1), (0, 0), *rowspan*=2,     
      *colspan*=1)

    # Create bottom subplot for shared price/volume axis
    self.price_ax = plt.subplot2grid((6, 1), (2, 0), *rowspan*=8, 
      *colspan*=1, *sharex*=self.net_worth_ax) # Create a new axis for volume which shares its x-axis with 
      price
    self.volume_ax = self.price_ax.twinx() # Add padding to make graph easier to view
    plt.subplots_adjust(*left*=0.11, *bottom*=0.24, *right*=0.90, 
      *top*=0.90, *wspace*=0.2, *hspace*=0) # Show the graph without blocking the rest of the program
    plt.show(*block*=False)

我们使用plt.subplot2grid(**...**)方法首先在我们的数字顶部创建一个子图来呈现我们的净值网格,然后在它下面为我们的价格网格创建另一个子图。subplot2grid的第一个参数是子情节的大小,第二个参数是在图中的位置。

为了呈现我们的交易量棒线,我们在self.price_ax上调用twinx()方法,这允许我们在顶部覆盖另一个共享相同 x 轴的网格。最后,也是最重要的,我们将使用plt.show(block=False)将我们的图形渲染到屏幕上。如果您忘记通过block=False,您将只能看到呈现的第一步,之后代理将被阻止继续。

接下来,我们来写我们的render方法。这将从当前时间步骤中获取所有信息,并在屏幕上实时显示。

***def*** render(*self*, *current_step*, *net_worth*, *trades*, *window_size*=40):
  self.net_worths[current_step] = net_worth window_start = max(current_step - window_size, 0)
  step_range = range(window_start, current_step + 1) # Format dates as timestamps, necessary for candlestick graph
  dates = np.array([date2num(x)
    **for** x **in** self.df['Date'].values[step_range]])

  self._render_net_worth(current_step, net_worth, window_size,   
    dates)
  self._render_price(current_step, net_worth, dates, step_range)
  self._render_volume(current_step, net_worth, dates, step_range)
  self._render_trades(current_step, trades, step_range) # Format the date ticks to be more easily read
  self.price_ax.set_xticklabels(self.df['Date'].values[step_range], 
    *rotation*=45, *horizontalalignment*='right') # Hide duplicate net worth date labels
  plt.setp(self.net_worth_ax.get_xticklabels(), *visible*=False) # Necessary to view frames before they are unrendered    
  plt.pause(0.001)

在这里,我们保存net_worth,然后从上到下渲染每个图形。我们还将使用代理在self.render_trades方法中进行的交易来注释价格图表。这里调用plt.pause()很重要,否则在最后一帧真正显示在屏幕上之前,下一次调用render会清除每一帧。

现在,让我们看看图表的每一种呈现方法,从净值开始。

***def*** _render_net_worth(*self*, *current_step*, *net_worth*, *step_range*, 
                      *dates*):
  # Clear the frame rendered last step
  self.net_worth_ax.clear() # Plot net worths
  self.net_worth_ax.plot_date(dates, self.net_worths[step_range], '-
    ', *label*='Net Worth') # Show legend, which uses the label we defined for the plot above
  self.net_worth_ax.legend()
  legend = self.net_worth_ax.legend(*loc*=2, *ncol*=2, *prop*={'size': 8})
  legend.get_frame().set_alpha(0.4) last_date = date2num(self.df['Date'].values[current_step])
  last_net_worth = self.net_worths[current_step] # Annotate the current net worth on the net worth graph
  self.net_worth_ax.annotate('{0*:.2f*}'.format(net_worth),     
    (last_date, last_net_worth),
    *xytext*=(last_date, last_net_worth),
    *bbox*=*dict*(*boxstyle*='round', *fc*='w', *ec*='k', *lw*=1),
    *color*="black",
    *fontsize*="small") # Add space above and below min/max net worth
  self.net_worth_ax.set_ylim(
    min(self.net_worths[np.nonzero(self.net_worths)]) / 1.25,    
    max(self.net_worths) * 1.25)

我们只是调用我们的净值支线剧情上的plot_date(**...**)来绘制一个简单的线图,然后用代理当前的net_worth进行注释,并添加一个图例。

价格图的呈现有点复杂。为了简单起见,我们将使用不同于音量条的方法来渲染 OHCL 条。首先,如果你还没有这个包,你需要pip install mpl_finance,因为这个包是我们将要使用的蜡烛图所需要的。然后将这一行添加到文件的顶部。

**from** mpl_finance **import** candlestick_ochl **as** candlestick

很好,让我们清除前一帧,压缩 OHCL 数据,并向self.price_ax子情节渲染一个蜡烛图。

***def*** _render_price(*self*, *current_step*, *net_worth*, *dates*, *step_range*):
  self.price_ax.clear() # Format data for OHCL candlestick graph
  candlesticks = zip(dates,
    self.df['Open'].values[step_range],  
    self.df['Close'].values[step_range],
    self.df['High'].values[step_range], 
    self.df['Low'].values[step_range]) # Plot price using candlestick graph from mpl_finance
  candlestick(self.price_ax, candlesticks, *width*=1,
    *colorup*=UP_COLOR, *colordown*=DOWN_COLOR) last_date = date2num(self.df['Date'].values[current_step])
  last_close = self.df['Close'].values[current_step]
  last_high = self.df['High'].values[current_step] # Print the current price to the price axis
  self.price_ax.annotate('{0*:.2f*}'.format(last_close),
    (last_date, last_close),
    *xytext*=(last_date, last_high),
    *bbox*=*dict*(*boxstyle*='round', *fc*='w', *ec*='k', *lw*=1),
    *color*="black",
    *fontsize*="small") # Shift price axis up to give volume chart space
  ylim = self.price_ax.get_ylim()
  self.price_ax.set_ylim(ylim[0] - (ylim[1] - ylim[0])
    * VOLUME_CHART_HEIGHT, ylim[1])

我们用股票的当前价格对图表进行了注释,并向上移动图表以防止它与成交量棒线重叠。接下来让我们看看体积渲染方法,这是非常简单的,因为没有注释。

***def*** _render_volume(*self*, *current_step*, *net_worth*, *dates*, 
                   *step_range*):
  self.volume_ax.clear() volume = np.array(self.df['Volume'].values[step_range])

  pos = self.df['Open'].values[step_range] - \
    self.df['Close'].values[step_range] < 0
  neg = self.df['Open'].values[step_range] - \
    self.df['Close'].values[step_range] > 0 # Color volume bars based on price direction on that date
  self.volume_ax.bar(dates[pos], volume[pos], *color*=UP_COLOR,
    *alpha*=0.4, *width*=1, *align*='center')
  self.volume_ax.bar(dates[neg], volume[neg], *color*=DOWN_COLOR,
    *alpha*=0.4, *width*=1, *align*='center') # Cap volume axis height below price chart and hide ticks
  self.volume_ax.set_ylim(0, max(volume) / VOLUME_CHART_HEIGHT)
  self.volume_ax.yaxis.set_ticks([])

这只是一个简单的条形图,每个条形显示为绿色或红色,这取决于价格在该时间步长内是上升还是下降。

最后,让我们进入有趣的部分:_render_trades。在这个方法中,我们将在价格图上绘制一个箭头,在这里代理进行了一笔交易,并标注了交易的总金额。

***def*** _render_trades(*self*, *current_step*, *trades*, *step_range*):
  **for** trade **in** trades:
    **if** trade['step'] **in** step_range:
      date = date2num(self.df['Date'].values[trade['step']])
      high = self.df['High'].values[trade['step']]
      low = self.df['Low'].values[trade['step']] **if** trade['type'] == 'buy':
        high_low = low
        color = UP_TEXT_COLOR
      **else**:
        high_low = high
        color = DOWN_TEXT_COLOR total = '{0*:.2f*}'.format(trade['total']) # Print the current price to the price axis   
      self.price_ax.annotate(*f*'${total}', (date, high_low),
        *xytext*=(date, high_low),
        *color*=color,
        *fontsize*=8,
        *arrowprops*=(*dict*(*color*=color)))

就是这样!我们现在有了一个在上一篇文章中创建的股票交易环境的漂亮的、实时的可视化效果!太糟糕了,我们仍然没有花太多的时间来教经纪人如何赚钱…我们下次再谈吧!

不算太寒酸!下周,我们将基于本教程的代码创建不会赔钱的比特币交易机器人。

[## 创造不赔钱的比特币交易机器人

让我们使用深度强化学习来制造有利可图的加密货币交易代理

towardsdatascience.com](/creating-bitcoin-trading-bots-that-dont-lose-money-2e7165fb0b29)

感谢阅读!一如既往,本教程的所有代码都可以在我的 Github 上找到。如果您有任何问题或反馈,请在下面留下评论,我很乐意收到您的来信!我也可以通过@notadamking 的Twitter联系到。

你也可以通过下面的链接在 Github 赞助商 或者Patreon上赞助我。

[## GitHub 赞助商

嗨,我是亚当。我是一名开发人员、作家和企业家,尤其对深度…

github.com](https://github.com/users/notadamking/sponsorship)

Github 赞助商目前正在 1:1 匹配所有捐款,最高可达 5000 美元!

[## 亚当·金正在创造改变世界的内容

嗨,我是亚当。我是一名开发人员、作家和企业家,尤其对深度…

patreon.com](https://patreon.com/notadamking)

可视化自杀率和世界幸福

原文:https://towardsdatascience.com/visualizing-suicide-rates-and-world-happiness-bc4e6411732f?source=collection_archive---------15-----------------------

两者有关系吗?

由阿纳维 & 娜塔莉

一般来说,一个幸福指数较高的国家的自杀率应该较低。然而,一个相当不为人知的事实是,挪威、芬兰等北欧国家的幸福指数更高,自杀率也更高。

通过这个项目,我们想调查这个异常现象,并通过可视化大量关于这个主题的数据来探索一个国家的自杀率和幸福指数之间是否有关系。我们想看看是否能找到这些矛盾存在的原因,并以历史事件或政府干预的形式揭示它们背后的故事。

初始阶段

背景研究

我们进行了一次文献回顾,了解到自杀背后的原因可能很多,而且非常复杂。我们很清楚,这个项目的目的不是讨论一个特定国家自杀率背后的原因,而是试图了解这些年来自杀率的变化,并确定可能导致这种变化的潜在因素。例如,如果它与全球趋势有关,如经济危机、历史事件或政府干预(后面会有更多这方面的例子)。

头脑风暴&素描

在文献回顾的基础上,我们讨论了一些可能的可视化方法,包括线图、线形图和条形图。这给了我们一个很好的起点来构思随之而来的设计元素。一次头脑风暴会议让我们迅速勾画出一些数据可视化的想法,以尽可能最有效的方式呈现我们的数据。

Multi-dimensional World Map & Interactive Timeline with Historical Event Hover

形象化

最终的可视化效果由 2 个仪表盘和它们自己的图形组成——自杀仪表盘幸福仪表盘

他们都是从这种想象开始的:

Average of World Happiness & Suicide 2015–2016

自杀仪表盘

从上面的第一张地图中选择一个国家后,接下来的三张图会相应地改变,以获得该国正在发生的事情的详细图片。

  1. 世界幸福感变化&2015-2016 年自杀率(散点图)

这显示了 2015 年至 2016 年世界幸福和自杀率的变化。深色代表 2016 年,浅色代表 2015 年。用户可以将鼠标悬停在线上,查看是哪个国家,并查看两个指标的值。

用户还可以过滤年份,这样它将只显示所选年份的值。选择两个年份后,用户可以看到两个参数的变化。通过散点图,我们可以很容易地看出没有负相关,这意味着更高的幸福分数并不能保证更低的自杀率,反之亦然。

Scatter plot with Switzerland selected; Scatter plot showing happiness score and suicide rate of the year 2015

2.各国自杀率&年龄(折线图)

为了更深入地了解这些年来自杀率的变化,我们制作了这个折线图。下图显示了从 1985 年到 2016 年的自杀率趋势。用户也可以选择国家,性别和年龄组进行过滤。一个有趣的发现是,从 1985 年到 2016 年,全球女性自杀率通常远低于男性自杀率。

3.各州自杀率(Choropleth)

这张图表显示了美国各州的平均自杀率。从图表中,我们可以看出蒙大拿和阿拉斯加的自杀率较高。用户也可以过滤选择年份。

幸福仪表板

从上面的第一张地图中选择一个国家后,接下来的两张图会相应地改变,以获得该国正在发生的详细情况。

  1. 2015-2016 年世界幸福指数(堆积条形图)

这个 viz 显示了 2015-2016 年幸福得分的七个属性的分布。根据《世界幸福报告》,衡量幸福得分的属性包括经济(人均 GDP)、家庭、健康(预期寿命)、慷慨、自由、对政府的信任和反乌托邦残余。该图表显示了每个属性的值,以及它们如何在给定的一年中对一个国家的幸福分数做出贡献。用户可以将鼠标悬停在每个条形上,以查看幸福分数的总值及其对每个属性的分解。用户还可以快速了解哪个国家的幸福指数最高。

2.2015-2016 年世界幸福指数(饼状图)

这些饼状图允许用户按年份比较构成某个国家幸福得分的七个属性的总体贡献。用户可以过滤年份并查看不同年份的值。这与前一个不同,因为它不是数值的平均值,而是给出了各年的清晰图像。

有趣的发现

  1. 没有证据表明幸福指数高的国家自杀率低,反之亦然。
  2. 自杀背后的原因不容易确定。每个国家都有不同的社会和文化背景,导致不同的自杀原因。
  3. 几乎每个国家的女性自杀率都比男性低得多。
  4. 芬兰是一个高幸福指数和高自杀率国家的典型例子。从数据中,我们发现芬兰的自杀率实际上自 1990 年达到顶峰后大幅下降。经过调查,我们发现这种改善的潜在原因可能是由于 20 世纪 80 年代末发起的全国自杀运动。这有助于提高对精神病治疗的认识和对康复的支持。[1]

Line Chart Showing the Trend of Suicide Rate for Denmark, Finland, Greece, Japan, Norway, South Korea, Sweden, and United States

5。希腊当前的经济危机激起了我们的兴趣,看看它是否对其自杀率有任何影响。然而,根据这个图像,与我们感兴趣的其他国家相比,希腊这些年的自杀率相对较低。我们发现的另一篇论文证实了这一发现。[2]

6。在过去的 15 年里,韩国的自杀率急剧上升,仅仅 10 年后,就从 15/10 万上升到了 40/10 万。这可能有几个潜在的原因,如高失业率和网络欺凌的高发生率。我们发现,韩国政府已经采取行动,如建立当地福利和安全支持系统,为那些试图自杀的人提供善后护理,并根据年龄、性别和社会经济地位量身定制医疗保健计划。[3]

7。美国——蒙大拿州的自杀率是美国最高的。从 2016 年的 25.90/100k 上升到 2017 年的 28.90/100k。统计数据显示,蒙大拿州只有不到四分之一的精神卫生保健提供者需要为其居民服务。此外,浓厚的枪支文化、大量饮酒、冬季日照不足和高海拔都导致了高自杀率。[4]2017 年,面临预算短缺,政府削减了该州卫生部门的预算,包括心理健康资金,这进一步加剧了问题。

视频演示

查看我们制作的视频,了解所有的交互和功能!

有待改进的领域

  1. 更多“相关事实”

由于国家数量众多,我们无法调查所有数据的差异,并且只有少数几个国家的信息。此外,如果能够通过包含某种插图或图标,用更多的视觉设计元素来呈现这些数据,那就更好了。然而,即使我们收集了少量的数据,我们仍然得到了一些很好的见解。

2。更多状态数据

美国是此次发布中唯一一个拥有各州自杀数据的国家。有了更多的信息,我们将有更多的数据来分析,并找出更多的“相关事实”来支持我们的可视化。此外,这将有助于那些没有大的跳跃或变化的国家。在这种情况下,小的起伏可能是由于几个州的个别变化,这可能更容易指出。

3。更多最新数据

我们使用的数据集只到 2016 年。拥有直到 2019 年或至少 2018 年的数据可能会更好,因为这将使我们能够更好地将这些发现与更近期的事件联系起来。

谢谢大家!

作者:阿纳维 & 娜塔莉

参考

[1]欧盟统计局:芬兰自杀率下降接近欧洲平均水平https://yle . fi/uutiset/osasto/news/Eurostat _ Falling _ silicon _ rate _ in _ Finland _ nears _ European _ average/10324113

[2]《经济危机期间希腊克里特岛的自杀率:年龄、性别、失业和心理健康服务提供的影响》https://bmcpsychiatry . biomed central . com/articles/10.1186/s 12888-018-1931-4

[3]韩国瞄准高自杀率https://www . VOA news . com/east-Asia/南朝鲜瞄准高自杀率

[4]蒙大拿州的自杀率是全国最高的。然后预算削减来袭。https://www . NBC news . com/news/us-news/Montana-have-first-rate-country-then-cuts-hit-n 904246

用 Python 实现流水线中的主成分分析和 SVM

原文:https://towardsdatascience.com/visualizing-support-vector-machine-decision-boundary-69e7591dacea?source=collection_archive---------3-----------------------

管道、网格搜索和等高线图

Decision Boundary (Picture: Author’s Own Work, Saitama, Japan)

在之前的一篇文章中,我已经详细描述了关于主成分分析的和支持向量机(SVM)算法背后的数学。在这里,我将结合 SVM、主成分分析和网格搜索交叉验证来创建一个管道,以找到二元分类的最佳参数,并最终绘制一个决策边界来展示我们的算法表现得有多好。你希望在这篇文章中学到/回顾的东西—

  • 通过 Seaborn Library 以有意义的方式联合绘制和表示数据。
  • 如果主成分分析中有 2 个以上的成分,如何选择和表示哪 2 个成分比其他成分更相关?
  • 使用 PCA 和 SVM 创建管道,通过网格搜索交叉验证找到最佳拟合参数。
  • 最后,我们选择 2 个主成分来表示 3d/2d 图中的 SVM 决策边界,使用 Matplotlib 绘制。

1.更好地了解数据集:联合图和 Seaborn

在这里,我使用了 scikit-learn 癌症数据集,这是一个相对简单的数据集,用于研究二元分类,分为恶性和良性两类。让我们来看几行数据帧。

如我们所见,数据集中总共有 569 个样本和 30 个特征,我们的任务是将恶性样本与良性样本进行分类。在确认没有缺失数据后,我们检查特征名称并检查平均特征的相关图。

下面是使用 seaborn 库封装的平均特征的相关图。正如所料,“面积”、“周长”和“半径”高度相关。

Fig. 1: Correlation plot of mean features.

我们可以使用' seaborn jointplot '来了解各个特征之间的关系。让我们看看下面的两个例子,作为散点图的替代,我选择了 2D 密度图。在右边的面板上,我使用了“十六进制”设置,通过直方图,我们可以了解一个小的六边形区域内的点的数量的集中程度。六边形越暗,落在该区域的点(观察值)越多,这种直觉也可以用绘制在两个特征边界上的直方图来检验。

Fig. 2: Joint-plots can carry more info than simple scatter plots.

在左侧,除了绘制在边界上的单个要素的直方图之外,等值线表示 2D 核密度估计(KDE)。不仅仅是离散的直方图,KDE 直方图通常是有用的,你可以在这里找到一个奇妙的解释。

我们还可以绘制一些配对图,以研究哪些特征与区分良性样本和恶性样本更相关。让我们看下面的一个例子——

Fig. 3: Pair plots of few features in Cancer data-set. Code can be found in my GitHub.

一旦我们玩够了数据集来探索和理解我们手头的东西,那么,让我们转向主要的分类任务。

2.管道、GridSearchCV 和支持向量机:

2.1。主成分:

现在,我们将按照以下步骤,使用 StandardScaler、PCA 和支持向量机创建一个管道—

  • 从分割训练集和测试集中的数据集开始

  • 检查主成分分析的效果:PCA 以这样一种方式降低特征空间的维度,使得最终特征彼此正交。因为我们在癌症数据集中有 30 个特征,所以可视化 PCA 实际上做什么是很好的。你可以在我关于 PCA 的另一篇文章中读到更多细节。在应用 PCA 之前,我们通过减去平均值来标准化我们的特征,并使用标准缩放器将其缩放到单位方差。所以,我们从选择 4 个正交分量开始—

让我们绘制这四个主要成分的癌症数据——

Fig. 4: Which principal components are more relevant?

从图中可以看出,前两个主成分与区分恶性和良性样本更相关。方差比怎么样?

正如预期的那样,前两个因素占总方差的 80%。这与在选择 2 个分量来绘制决策边界之前显示相关,因为您可能有一些具有许多特征的数据集,其中选择 2 个主分量在百分比方差比方面是不合理的。在使用 PCA 和一些分类器创建管道之前,最好检查两个主成分的选择。

2.2。管道&网格搜索交叉验证:T3

一旦我们看到 PCA 对于分类和为分类器绘制决策边界是多么重要,现在,我们用标准缩放器、PCA 和 SVM 创建一个流水线。

你可以查看更多关于管道和网格搜索交叉验证的细节,那是我单独写的。我选择了 2 个主成分,因为我们的目标是在 2D/3D 图中绘制决策边界,并且使用径向基函数核的 SVM 的最佳参数“C”和“Gamma”是通过固定数量的主成分值获得的。让我们检查一下拟合参数—

在这里,我们看到,使用 2 个主成分和 4 个交叉验证,我们的管道与 SVM 分类器获得了 94%的准确性。当然,你可以使用不同的值或者使用不同的内核。关于内核函数背后的数学,你可以查看我的另一篇文章。在进入下一部分之前,我们可以通过绘制混淆矩阵来完成分析,从中可以获得精确度、召回率和 F1 分数。

Fig. 5: Confusion Matrix obtained using our pipeline with SVM classifier and RBF kernel.

3.地块 SVM 决定边界:

我已经按照 Scikit-Learn 的教程绘制了最大间隔分离超平面,但是这里使用的不是教程中使用的线性核,而是径向基函数核。我们将使用决策函数方法,该方法返回样本中每个类的决策函数。直观上,对于二元分类,我们可以把这种方法想象成它告诉我们,我们在分类器生成的超平面的哪一边,有多远。对于 SVM 决策规则的数学公式,如果你有兴趣,可以查看我以前的帖子。让我们看看决策函数的轮廓

Fig. 6: Decision Function contours with Radial Basis Function kernel is shown here along with the support vectors. Best fit-parameters are obtained from 5 fold grid search cross-validation.

让我们来理解我用来绘制上图的代码

  • 从选择 2 个主成分进行主成分分析开始。只有 2 个组件,因为它有助于我们在 2D/3D 绘图中可视化边界。将 2 个以上的组件与决策函数轮廓一起可视化是有问题的!
  • 设置具有径向基函数核的 SVM 分类器,并且将“C”、“gamma”参数设置为从网格搜索交叉验证中获得的最佳拟合值。
  • 定义一个函数来创建由 x、y(最终选择的主成分)和 Z(SVM 的决策函数)组成的等值线。
  • 我们通过函数 make-meshgrid 用一个 x 值数组和一个 y 值数组创建一个矩形网格。检查 Numpy Meshgrid 的必要性。
  • 最后,我们将决策函数绘制为 2D 等高线图,并将支持向量绘制为分散点。

希望这篇文章能帮助你理解建立支持向量机分类器的策略,并有效地使用主成分分析来可视化决策边界。

让我们来看看它的 3D 动画——

Fig. 7: Decision Function contours as viewed from top. 3D representation for the figure 6.

最后,我强调检查你的理解总是好的,在这里我们可以看到伽马因子如何影响决策函数轮廓。

对于上面的图,我们有γ = 0.5,C = 1。你可以阅读我的关于 SVM 内核的另一篇文章,在那里我已经讨论了增加γ参数如何导致复杂的决策边界。

让我们通过将“C”参数固定为最佳拟合值,使用两个不同的“Gamma”值来检查这一点

  • 为γ = 0.01

Fig. 8: Decision function contours plotted with low gamma (γ=0.01) value. Can be compared with figure 6, where γ = 0.5.

  • 对于γ = 10.0

Fig. 9: High gamma parameter is causing extremely complicated decision boundaries.

正如你所看到的,增加伽马参数会产生非常复杂的轮廓。最重要的是,几乎所有高伽马值的样本(每个类别的)都充当支持向量。这无疑是对如此简单、容易分类的癌症数据集的过度拟合。

“永远检查你的直觉和理解力!!"—匿名

为了进一步阅读,我建议你查看塞巴斯蒂安·拉什卡(Sebastian Raschka)的《用 Python 进行机器学习》(第 76–88 页,2017 年 9 月第二版)一书中给出的几个精彩演示。

保持坚强和快乐,干杯!

在 Github 中找到这篇文章使用的代码。

在法国可视化特斯拉增压器

原文:https://towardsdatascience.com/visualizing-tesla-superchargers-in-france-8c10894ab3c?source=collection_archive---------22-----------------------

从头开始使用 Python 和 Folium 学习可视化

数据可视化不仅仅是科学,它还是一门艺术。根据我们人类大脑的工作方式,以可视化的形式处理信息非常容易。在进入数字地图近 25 年以及许多公司使用机器学习来收集大量数据之后,数据可视化比以往任何时候都更加重要。

在这篇文章中,我们将可视化目前在法国可用的特斯拉超级充电器(充电站)。我们将使用 Python、leav 和 Pandas 来完成这项工作。激动吗?让我们开始吧。

GitHub / Live map here

重要的事情先来

数据

首先,我们正在使用由法国政府提供的特斯拉的特斯拉增压器数据。你可以在上面的链接或者我的 GitHub 库中找到这个数据文件。数据有很多列,但我们将只使用纬度、经度和站名。

我们将使用 leav 和 Pandas,所以如果您还没有安装它们,请在您的终端中键入以下命令。

pip install foliumpip 
pip install pandas

步骤 1-创建底图

好了,所有特斯拉和可视化的狂热分子,让我们开始吧。为了可视化增压器的位置,我们当然需要一张地图。否则,我们怎么找到他们?所以,我们做的第一件事是,我们为一个特定的位置(世界上的任何地方)创建一个基础地图。默认情况下,Folium 从打开的街道地图中获取地图数据。好好看看代码。

首先,我们导入叶子库。接下来,我们在folium.Map()方法的帮助下创建一个对象——在我们的例子中是地图— 。在该方法中,我们传递地图的坐标和缩放级别。最后,不用说,你保存了地图。我从巴黎开始,你不觉得巴黎的地图像个脑细胞吗?还是只有我?无论如何,让我们进入下一步。

Paris (as if this needed description)

步骤 2-绘制标记

现在我们已经创建了一个基本地图,我们要绘制我们的增压器的位置。我们如何做到这一点?超级简单。我们使用folium.Marker()方法来定义和定制标记。您可以添加参数,如弹出,改变图标,等等。点击此处了解更多信息。最后,使用.add_to()方法,您将标记与您的地图关联起来。

我们在 Thiais 增加了特斯拉增压器作为我们的第一个标记,这是巴黎南郊的一个公社,这就是它的样子。

步骤 3 —多个标记

你能画一个标记吗?当然不是。你可能会画出不止一个或者超过 100 个,我们也会这样做。但是在达到 100 之前,让我们试着只做 2。这样我们会对它的工作原理有更多的了解。

如你所见,我们使用了一个for循环。是的,只是一个for环。编程并不总是复杂的代码,当你掌握了基本知识,你可以做得非常好。所以我们对两个标记进行循环,剩下的就很容易理解了。不是吗?让我们保存地图,看看我们做得怎么样。

Multiple Markers

步骤 4 —使用数据

我们的确画了两个标记,那么那些 100 呢?你要一个一个加吗?你可以,但是你愿意吗?肯定不是。因此,我们将使用包含纬度和经度的现有数据文件,并在我们创建的for循环中传递它。

我们将使用 Pandas 作为我们的数据操作库。我猜你对熊猫很熟悉,但是如果不熟悉,看看这个 10 分钟熊猫教程然后回到这里,我等你。

编程并不总是复杂的代码,当你掌握了基本知识,你可以做得非常好。

回来了?完美。在用 read_csv 或 read_excel 加载数据之后(我更喜欢在这个教程中使用 excel,因为 csv 文件没有得到正确的维护),我们提取我们需要的每一列,并将其存储在各自的列表中。在for循环中,我们提供相同的列表并从头到尾运行它,而不是手动坐标。运行该文件后,您将在地图上看到以下内容。很整洁,是吧?

All Tesla Supercharging stations in France

第 5 步—自定义图标

但是等等,即使它正确地显示了一切,它也没有给人那种“特斯拉”的感觉,你明白我的意思吗?简洁的外观,简约的设计?让我们试着模仿一样的。让我们使用特斯拉图标,而不是这些绿色标记。并尝试使地图背景更清晰或者我应该说最小化?这由你来决定。

要添加自定义图标,首先你要下载一个(透明背景优先),在icon_path中设置图标的路径。之后,在 that 的CustomIcon()方法中,提供 icon_path 和图标的大小。你已经准备好了。执行文件并查看更改。

步骤 6-通过聚类美化

看起来比以前更好,但我们可以使用一些东西来使它变得更漂亮——集群。让我们把附近的特斯拉增压器聚集起来,这样你就只能看到你想看到的东西。

用叶的MarkerCluster()方法,我们可以聚类我们的标记和美化地图。我们只需要做一件不同的事情:在此之前,我们将标记添加到地图,但现在,我们将标记添加到标记聚类,然后将标记聚类添加到地图。

在将所有标记添加到聚类中之后,它看起来比以前更好。

The final visualization/ Live map here

瞧啊。您已经使用 Python 和 have 创建了可视化。没那么难,对吧?

尾注

没有合适的资源学习新东西有时会很难。今天,您学习了如何使用 pandas 操作数据,什么是叶,以及如何使用叶用 Python 可视化事物。既然你已经熟悉了 leav,那么就从不同的存储库或 Google Dataset Search 上找到数据集,并可视化你自己的东西。此外,您可以在我的 GitHub 资源库中找到所有的代码文件、图像和数据。如果你对本教程有任何疑问,我的 Twitter 和 Linkedin DMs 永远开放。或者直接过来打个招呼。

可视化 2017 年野火季节

原文:https://towardsdatascience.com/visualizing-the-2017-wildfire-season-2053fe72525f?source=collection_archive---------27-----------------------

2017 年是美国野火灾难性的一年,特别是在加利福尼亚州,发生了 9000 多起火灾,燃烧面积超过 130 万英亩。

斯坦福新闻和民主倡议的一个项目“大地方新闻”开发了一个数据库,用来追踪由联邦政府管理的大面积野火(100 多英亩)。根据该数据,2017 年美国发生了超过 23,000 起野火,比前一年增加了 21%,比数据开始的 2014 年增加了近 80%。

虽然这个数据库并没有全面的显示这个国家的野火情况,但是它显示了野火的增加,T2,专家认为这是全球变暖造成的。

Data from Big Local News / Chart by Jared Whalen.

方法论

从大型本地新闻数据集 ( 美国野火的成本(2014–2017)开始,我按唯一标识符统计记录,并按日期分组。没有事故日期的记录被删除。

工具:R (dplyr,lubridate,ggplot),Illustrator

流程

我是通过 Buzzfeed 的 Jeremy Singer-Vine 每周收集的数据集 Data is Plural 简讯偶然发现这个数据集的。在四处探索之后,它看起来像是一个有趣的图表。

谈到野火这个话题,我想选择一种视觉上看起来像火焰的图表类型。这让我想起了 Nadieh Bremer 在她的作品 The Baby Spike 中的美丽的可视化,它使用了径向面积图和生动的颜色着色。深受布雷默文章的启发,我想加入一个使用平均值作为基线的径向面积图设计。

至于数据,我在 r 中完成了所有的争论和分析。我的主要代码只是对大规模数据集进行精简,然后按日期进行汇总。

library(tidyverse)
library(lubridate)# identify unique records
fireData_unique <- fireData %>%
 group_by(INC_IDENTIFIER) %>%
 filter(n() == 1) %>%
 ungroup()
# make field selections and convert dates
fireData_sel <- fireData_unique %>%
 select(INCIDENT_NAME,
 DISCOVERY_DATE) %>% 
 mutate(day = yday(ymd_hms(DISCOVERY_DATE)),
 week = week(ymd_hms(DISCOVERY_DATE)),
 year = year(ymd_hms(DISCOVERY_DATE))
 ) %>%
 # remove records with missing or erroneous dates 
 filter(
 !year %in% c(“2011”, NA)
 ) %>%
 # get count by day
 group_by(day, year) %>%
 summarise(count = n())# create average df
fireData_avg <- fireData_sel %>%
 group_by(day) %>% 
 summarise(mean = mean(count))

虽然我在 Illustrator 中做了大量的工作,但大部分繁重的工作来自下面使用 ggplot 的代码。

# function to shift baseline by mean
shiftBase = function(x) {
 x — mean(fireData_avg$mean)
}# Make the plot
 ggplot() +
 geom_area(data=filter(fireData_sel, year==2017), aes(x=day, y=count-mean(fireData_avg$mean)), fill=”#FFBF3F”, alpha=1) +
 facet_grid(~year) +
 geom_area(data=fireData_avg, aes(x=day, y=mean-mean(fireData_avg$mean)), fill=”#547C8E”, alpha=0.2) +
 theme_minimal() +
 geom_hline(yintercept=0, color=”#FF9843") +
 coord_polar(start = 0.1) +
  scale_y_continuous(
    breaks=shiftBase(c(0,100,200,300)),
    labels = function(x){
      round(x+mean(fireData_avg$mean),-2)
    },
    limits=c(-150,max(fireData_sel$count))
  )

独立图表

用 Python 可视化中心极限定理

原文:https://towardsdatascience.com/visualizing-the-central-limit-theorem-with-python-e89d2ce41788?source=collection_archive---------12-----------------------

每当您处理数据并想要收集一些关于它们的信息时,您可能要检查的第一件事就是它们是否遵循已知的分布。

为什么了解数据分布如此重要?

这个问题的答案依赖于许多统计类型研究的目标,即更多地了解一个目标,通常称为人口警告是观察你项目的全部人口通常是不切实际的(甚至是不可能的)。想象一下,也就是说,你想知道年龄在 40 到 50 岁之间的男性的平均体重。你认为你能采访世界上所有具有这些特征的男人吗?

不可能观察到全部人口,这就是我们需要样本的原因。抽样程序包括从全部人口中选择一个子集,这个子集最好能代表初始人口。通过这样做,我们希望从样本中包含的信息出发,对我们的目标总体做出推断。

在前面的例子中(找出男性的平均体重),一种解决方法是从男性子集或样本中收集数据,考虑不同的国籍,这样样本就不会有偏差。因此,我们将获得一个样本平均值,它应该接近总体平均值。

然而,我们怎么能确定这个结果的准确性呢?根据定义,统计学家永远不会确定,这就是为什么我们需要测试我们的结果的稳健性,运行所谓的假设检验。后者允许我们声明我们是否可以拒绝我们的零假设(在我们的例子中,这将是‘样本均值是真实参数的良好估计’)。

为了做到这一点,我们需要知道数据的分布。这就是为什么中心极限定理(CLT)如此重要。

CLT 的想法如下:让我们收集大小为 nx 个样本,并让我们计算每个样本的样本均值。然后,(在我们马上要看到的一些假设下)如果我们绘制所有样本均值,它们应该遵循正态分布。此外,所有样本均值的均值应该几乎等于总体的真实参数。

我提到的那些假设是什么?

  • 取样程序必须随机执行
  • 样本必须相互独立
  • 在不替换样本的情况下进行抽样时,样本量不应超过总体的 10%
  • 样本量应该足够大(通常,n=30 的样本量被认为是足够大的,即使它确实取决于初始总体)

如果这些假设被认为是正确的,CLT 允许您对初始人口进行推断。此外,样本越大,样本均值分布的钟形就越明显。

为了充分理解这个定理,让我们用 Python 可视化一下。我要做的是创建男性体重的随机样本(想象他们在 60 到 90 公斤之间),每个尺寸 n=50。然后,我将多次运行这个模拟,看看样本均值分布是否类似于正态分布。

from numpy.random import seed
from numpy.random import randint
from numpy import mean
# seed the random number generator, so that the experiment is #replicable
seed(1)
# generate a sample of men's weights
weights = randint(60, 90, 50)
print(weights)
print('The average weight is {} kg'.format(mean(weights)))

现在让我们重复采样模拟 1000 次:

import matplotlib.pyplot as plt
# seed the random number generator, so that the experiment is replicable
seed(1)
# calculate the mean of 50 men's weights 1000 times
means = [mean(randint(60, 90, 50)) for _i in range(1000)]
# plot the distribution of sample means
plt.hist(means)
plt.show()
print('The mean of the sample means is {}'.format(mean(means)))

根据 CLT,样本均值(74.54)应该是真实参数(未知)的良好估计。

为了确定我们的结果,让我们对数据进行正态性检验。出于这个目的,我将使用夏皮罗-维尔克正态性检验(你可以在这里阅读更多关于这个检验的内容),这里的假设是:

H0:数据服从正态分布

H1:数据不符合正态分布

因此,如果我们的样本均值服从正态分布,我们将不拒绝零。

from scipy.stats import shapiro
stat, p = shapiro(means)
print('Statistics={}, p={}'.format(stat, p))
alpha = 0.05
if p > alpha:
    print('Sample looks Normal (do not reject H0)')
else:
    print('Sample does not look Normal (reject H0)')

由于 p 值远远大于我们的置信水平 alpha (具体来说,它大于任何显著水平的 alpha ),我们不拒绝 H0。

现在让我们看看,如果我们将样本量从 50 分别增加到 80、90 和 100 会发生什么:

正如你所看到的,样本量 n 越大,p 值越高,我们不拒绝正态零假设的置信度就越高。

通过 MTV 想象挑战

原文:https://towardsdatascience.com/visualizing-the-challenge-by-mtv-71821e00ddd4?source=collection_archive---------28-----------------------

项目

仔细看看有史以来收入最高的 28 名球员

Photo by Nathan McBride on Unsplash

《挑战第 34 季:世界之战 2》将于 8 月 28 日开播,随着玩家一步步爬上巅峰,将会有更加艰苦的挑战和巧妙的计划。

事实上,当我们最后一次在第 33 季停下来时,我们的土耳其超人涡轮(Turabi am kran)在一场残酷但竞争激烈的决赛后取得了胜利——最终获得了高达 75 万的收入。同为新人的西奥·坎贝尔以英国联盟最后一名的身份排名第二,而挑战兽医韦斯·博格曼艰难地排在第三。

灵感

33 季的动作片承载了大量的历史,讲述这个故事的最好方式是通过数据直观地展现出来。事实上,只要快速浏览一下任何挑战者的 MediaWiki 页面,就可以全面了解他们的历史,包括总奖金,一直到他们的家乡。

此外,在维基百科上,有一个有史以来收入最高的 28 个挑战者的名单,所以这篇文章基本上是同时对所有 28 个 MediaWiki 页面的全景展示。

如果你在移动设备上,现在是切换到横向视图的好时机,可以充分享受剧情的互动体验。请随意触摸任何绿点。

双击图表进行重置。干杯!

他们来自哪里?

事实上,直到几个赛季前,挑战赛几乎全部由美国演员出演,以至于只有 3 个 MediaWiki 声明的家乡不在美国。非美国人的家乡排在前 28 名的是:

  • turbo—土耳其梅尔辛
  • 英格兰西奥-巴斯
  • 加拿大安大略省埃文

不出所料,前 28 名中的其他人确实在美国有自己的家乡,尤其是在东北部地区。这并不是说他们都出生在美国,我们可以以出生在巴西的卡蜜拉为例。随着《世界之战》和《世界之战 2》都包含一半的美国和英国演员,这种以美国为主的 28 强可能会在未来几年有所改变。此外,两场比赛中的后一场是美国队和英国队之间的战斗。

你支持哪一个?

淘汰

在《世界大战》中,每周前 3 名的表演团队(或个人,取决于挑战)组成“法庭”,在那里他们投票选出剩余团队中的一个进入“杀戮舞台”,争夺他们的比赛资格。被选中的队预计将选择任何其他队与之竞争,只要他们不是法庭的一部分。失败的队伍回家了,获胜的队伍继续前进:

为他们的 100 万美元而战。

-TJ·拉文

尽管每一季挑战的形式都会改变,但这通常构成了淘汰赛回合

从这里我们可以看到韦斯可能会在漫长的 11 个赛季中以 14 胜 6 负的成绩脱颖而出,成为前 28 名票房挑战者中的淘汰赛冠军。可以说,也许有一个更好的记录站在乔丹在他的 4 个赛季中惊人的 5 胜 1 负。

在女子组,我们看到卡拉玛利亚 (13 胜 6 负,13 个赛季)卡蜜拉 (9 胜 4 负,10 个赛季)有着非常令人敬畏的记录。

然而,最引人注目的是劳雷尔在短短 4 个赛季中取得了惊人的 9 胜 1 负。

然而,最明显的是,我们亲爱的约翰尼·香蕉(约翰尼·德弗南齐奥)有着最差的淘汰记录,在他的 18 个赛季中,只有 8 场胜利和 12 场失败。

赢得的总金额

这些年来,挑战赛的奖金大幅增加。在早期的比赛中,剩下的最后一名挑战者赢得了超过 10 万英镑的奖金。然而,这些数字一直稳步增长,直至 Turbo 赢得 75 万英镑的大奖。这立即将他推到了有史以来最卖座挑战者名单的第二位。事实上,对于大多数挑战者来说,在花费了 10 个赛季后,通常会获得 10 万到 30 万之间的收入。

这是男女参赛者赢得的总奖金分布的不同情况。这证明了挑战的公平性,在有史以来总收入最高的 28 名竞争者中,男性和女性挑战者之间的金钱成功没有明显的区别。

推特分析

这里我们看到迈克“米兹”米扎宁拥有最多的追随者,超过 3 米。事实上,这显示了世界摔跤娱乐界在发展社交媒体追随者方面的力量。此外,Miz 也有一些广泛的电影记录,主要是直接视频制作。此外,他还在 2017 年主持了慈善季 Champs vs Stars,并在几个不同的季节主持了挑战赛的团聚集。

如前面的图表所示,自从 2006 年首次参加决斗以来,香蕉参加了历史上最多的挑战(18 次)。然而,他的 MTV 处女作是真实世界:基韦斯特。他目前是 NBC 第一套节目的主持人。

毫无疑问,香蕉紧随 Miz-I kid 之后,最近达到了约 30 万粉丝的里程碑。

在 Twitter 上最活跃

这可能是所有图表中最令人震惊的,尽管 2016 年只创建了一个账户,德里克·K 却拥有最多的推文!德里克通常是节目中最安静的人,只是不断说话以加强他对大奖的关注,他打算用这笔钱为家人提供更好的生活。然而,在 twitter 上,他看起来确实很活跃,在他的 3 年里积累了超过 17k 条推文——我印象深刻。

我希望你喜欢这本书,并对观看第 34 季感到兴奋!

我本人是数学金融专业的应届毕业生,非常喜欢与世界分享我的学习曲线。——也就是说,我非常乐意接受任何建议、更正或你在阅读这篇文章时想到的任何一般性反馈。

请随时在 LinkedIn 上与我联系—

[## 约万·梅德福德-加拿大滑铁卢大学| LinkedIn

我是一名四年级数学金融本科生,热衷于使用数学和数据解决问题。我最新的…

www.linkedin.com](https://www.linkedin.com/in/jovan-medford-b86094156/)

或者在 Twitter 上关注我

[## 约万·梅德福德

约万·梅德福德的最新推文(@JovanMedford)。一点特别的东西🤯|数学、金融和科技作家…

twitter.com](https://twitter.com/JovanMedford)

我与 MTV 没有任何关系,这是从 MediaWiki 搜集的非官方数据。

使用基于规则的情感分析可视化电影脚本的情感弧线

原文:https://towardsdatascience.com/visualizing-the-emotional-arcs-of-movie-scripts-using-rule-based-sentiment-analysis-1016b4b1af5a?source=collection_archive---------15-----------------------

我如何使用 Python、D3 和 Flask 来创建这个交互式可视化

大约 72 年前,广受赞誉的美国作家库尔特·冯内古特想出了一种新颖的方法来用描绘故事的情节主线,作为他人类学硕士论文的一部分。

根据冯内古特的说法,尽管他的工作最终被芝加哥大学拒绝,“因为它太简单了,看起来太有趣了”,但在来自佛蒙特大学的一组研究人员决定使用计算方法来测试他的假设后,他被忽视的贡献在过去几年里重新受到了一些关注。

他们想出了近 2000 本英文书籍的计算机生成的故事弧线,归类为冯内古特原始论文中概述的六个主要故事弧线之一。其中包括【破衣烂衫】【崛起】【破衣烂衫】【堕落】【洞中之人】【堕落然后崛起】【伊卡洛斯】【崛起然后堕落】【灰姑娘】【崛起然后堕落然后崛起】【俄狄浦斯】(堕落然后崛起然后堕落)。

他们的作品与冯内古特的不同之处在于,他们描绘了故事的情感轨迹,而不仅仅是情节主线。为了做到这一点,他们在每篇文章中滑动 10,000 个单词的窗口,用一个包含 10,000 个独特单词的词汇对故事中数百个点的相对幸福度进行评分,这个词汇按幸福度的 9 分制进行评分,这就产生了用于情感分析的快乐度计工具。

使用唤醒作为行动的代理措施

我使用了一种类似的基于词汇的方法,绘制了一千多个电影剧本的情感弧线,并使用层次聚类法对最相似的剧本进行分组。

然而,由于之前的研究主要关注积极和消极的情绪,而不是上升和下降的行动,以下方法与 UVM 的方法不同,因为它使用了 NRC 价,唤起和支配词汇,它有 20,000 个英语单词的分数,作为故事中行动或冲突的替代措施。具体来说,我用唤醒维度给单词打分,从“平静”或“被动”到“兴奋”或“主动”。

结果是一个交互式可视化,可以用来搜索任何已经在互联网电影数据库上发布的剧本,以可视化其情感故事弧(为了唤起),并找到五个在故事的情感轨迹方面最相似的电影剧本,而不是内容。

例如,在搜索大片《阿凡达》(Avatar)时,你可以看到觉醒在电影接近尾声时达到峰值,约为剧本长度的 90%,这与电影中最紧张和冲突的点相对应(纳威人和人类之间决定地球命运的最终对抗)。

其他具有类似结构的电影,有明确的高潮结尾,包括《美女与野兽》(Beauty and the Beast)、《复仇者联盟》(The Avengers)(2012)和《阿里》(Ali)。

以下是我得出这些结果的过程:

使用 VAD 词典抓取文本和评分

利用《美丽的汤》和杰里米·库恩剧本的修订版,我从互联网电影数据库中搜集了所有的电影,使用以下脚本花了大约 20 分钟:

然后我用 NRC VAD 词典创建了一个新词典:

我调整了简单的 labMT 使用脚本来计算语料库的唤醒分数,而不是快乐,用我自己的 labMT 字典和 labMT 向量来代替:

考虑到电影脚本平均比书籍短,我将固定窗口大小设置为 1000 个单词,并在每个脚本中滑动,以生成 n 唤醒分数,或最终时间序列中的点数。

矩阵分解和层次聚类

在实现了 simple labMT 的修订版之后,我使用了奇异值分解来将故事分解到情感弧的正交基上,使用了线性插值来创建等维的词向量,并使用了 scipy 的层次聚类来根据情感弧的轨迹来查找和分组最相似的电影脚本。

使用沃德的方法和欧几里德距离作为距离度量,我能够最小化电影脚本簇之间的差异,以达到最准确的观察分段。

使用 Flask API 评分,使用 D3 可视化结果

最后,我创建了一个 Flask API 来输出在互联网电影数据库中找到的任何电影的唤醒分数,并返回五个最相似的脚本。

使用一个函数来调用 API 和过滤数据,我使用 D3 内置的 d3.json()方法来加载和解析 json 数据对象,从而可视化结果输出。

你可以在这里玩最后的交互可视化,在这里查看所有的笔记本和代码。下面让我知道你的想法!

可视化卷积神经网络的基础

原文:https://towardsdatascience.com/visualizing-the-fundamentals-of-convolutional-neural-networks-6021e5b07f69?source=collection_archive---------7-----------------------

Photo by Pacto Visual on Unsplash

通过可视化示例理解卷积神经网络背后的主要概念

什么是卷积神经网络?

卷积神经网络(CNN)是人工神经网络(ann)的一个子类型,主要用于图像分类。CNN 遵循能够识别模式的结构复制的生物学原理,以识别不同位置的这些模式。它的灵感来自于诺贝尔奖获得者 Hubel 和 Wiesel 在 1962 年发表的“猫的视觉皮层中的感受野、双目互动和功能结构”中提出的猫的视觉系统模型。运用这一灵感的作品之一是 1980 年福岛的新认知图,尽管当时没有使用卷积这个词。所以,CNN 在图像识别上非常成功,不是巧合。然而,它们在处理时间数据方面也表现出了良好的效果,例如时间序列和语音识别,甚至在应用于图形时也是如此。

CNN 在以大约 10%的优势赢得 2012 年比赛 Imagenet 大规模视觉识别挑战赛后变得非常受欢迎。 Alex Krizhevsky 和 Ilya Sutskever 在 Geoffrey Hinton 的指导下,提交了以“AlexNet”为名而成名的 CNN 架构。当时,杰弗里·辛顿已经在人工神经网络领域做出了重大的科学贡献。他是 1986 年反向传播算法和 1983 年玻尔兹曼机器的贡献者之一。这些就是杰弗里·辛顿被公认为深度学习之父的部分原因。

卷积或互相关

典型的 CNN 由一系列充当特征提取器的卷积层组成,后面是一个分类器,通常是一个多层感知器(MLP) ,也称为全连接层(FC 层),如图 1 所示。

Figure 1 — Architecture of a basic Convolutional Neural Network.

第一层接收用三个颜色通道(RGB 通道)表示的输入图像。然后,第一层用多个核执行输入图像的卷积,产生第一层的一组特征图。每个特征图确定特定特征的强度和位置。由卷积层提取的特征图可以被提交给称为汇集的下采样操作。汇集操作是可选的,因此它可能不会遵循每个卷积层。合并图层的结果是另一组要素地图,地图数量相同,但分辨率降低。下面的卷积层使用来自前一层的特征图来执行更多的卷积并生成新的特征图。来自最后层的特征图是分类器,FC 层的输入。

用星号表示的卷积运算可以描述为:

被𝑥某种类型的输入,如传感器信号,𝑡给定的时间,和𝑘的内核应用。

卷积运算的一个重要性质是它是可交换的,这意味着(𝑥∗ 𝑘)=( 𝑘∗𝑥)如下:

另一方面,由⋆(五角星)表示的互相关运算是不可交换的,可以描述为:

卷积的可交换性来自于内核相对于输入翻转的事实。这种翻转是索引操作的结果。请注意,输入𝑥的索引是𝑎,内核的索引是𝑡−𝑎.尽管可交换性对于编写数学证明是一个有价值的属性,但它与神经网络实现并不相关。事实上,许多机器学习库实现了互相关而不是卷积,并将这两种操作都称为卷积。因此,在训练期间学习的内核与实际实现如等式 1 所述的卷积的库相比将被翻转。在本文中,我们将遵循同样的惯例,称之为互相关卷积。

我们可以将等式 3 用于与 2D 数据(例如灰度图像)的卷积:

是𝑟[𝑖,𝑗]卷积的离散输出,ℎ是核的高度,𝑤是核的宽度,𝑥[𝑎,𝑏]是灰度图像的补片,而𝑘[𝑖+𝑎,𝑗+𝑏]是核。

换句话说,卷积运算从图像中提取多个像素片,然后乘以内核。内核基本上是一个权重矩阵。从图像中提取的像素块通常被称为感受野——在生物学中,感受野是刺激神经元的感觉区域。感受野和内核之间的乘法包括每个像素和内核的相应元素之间的逐元素乘法。在乘法之后,结果被相加以形成特征图的一个元素,由𝑟[𝑖,𝑗].在等式 4 中定义

以下动画显示了 5x5 灰度图像和 3x3 内核之间的卷积运算。感受野用红色方块突出显示。该卷积的输出是 3×3 特征图。

Figure 2 — Step-by-step of the convolution of a 5x5 image with a 3x3 kernel.

动画中使用的实际图像可以在下面的图 3 中看到。内核和特征图中的值被重新缩放以适合 0 到 255 之间的区间,从而被表示为灰度像素。图像中较亮的像素代表卷积的较高值,而较暗的像素代表较低值。

Figure 3 — Convolution of a 5x5 input with a 3x3 kernel.

上面的卷积使用核 3x3,因此,在输入中有九个可能的感受野,每个大小为 3x3。注意,主要由白色像素组成的感受野或主要由暗像素组成的感受野在卷积后会产生非常暗的像素。另一方面,由左边的三个亮像素、中间的中间像素和右边的暗像素组成的感受域在卷积后产生最亮的像素。这是因为这种类型的内核有助于突出显示边缘,特别是从左侧亮区域过渡到右侧暗区域的边缘。

现在,看看当我们将相同的内核应用到一个也包含相反过渡的图像时会发生什么,从左边的暗区域到右边的亮区域。在图 4 中,感受野呈现从暗到亮的过渡,导致最暗的像素。请注意,之前的过渡(从亮到暗)仍然会产生更亮的像素。这意味着该内核不仅检测从亮到暗转变的边缘,还检测相反的从暗到亮的边缘。一种类型的边产生最大的正值,而另一种类型的边产生最大的负值。

Figure 4 — Convolution of an image 17x17 with an edge detector kernel 3x3.

RGB 图像的卷积与灰度图像非常相似。等式 4 可以适用于 RGB 图像,增加另一个循环来迭代 RGB 通道,如下所示:

可变𝑐上的附加循环允许在信道 RBG 上迭代。结果,求和是在三维数据上完成的,而不是在二维数据上,并且仍然产生每个三维感受野和核的单个值。

特征抽出

让我们从一个实际的例子开始这个话题。请看图 5 中下面三个卷积的结果。为了说明卷积的结果,以下示例中的三个核中的每一个都由从图像中提取的小块组成。

Figure 5 — Examples of convolutions.

在第一个例子中,组成内核的面片包括带有白色数字 6 的平面区域。右边的灰度图像本质上是内核和图像之间卷积的结果。最暗的像素代表感受野和内核之间操作的最小结果,另一方面,最亮的像素代表感受野和内核之间操作的最高值。

在第二个例子中,内核由形成飞机轮子的像素片组成。在第三个例子中,内核由从飞机尾部复制的一片黄色像素组成。

请注意,每个结果图像中最亮的像素对应于产生每个内核的位置。在第一个示例中,它对应于数字 6 的位置。在第二个例子中,它对应于轮子的位置。尽管内核是其中一个轮子的副本,另一个轮子非常相似,也产生了明亮的像素。在第三个例子中,最亮的像素对应于平面的所有黄色区域。

进展

步幅是每个感受野之间的距离。到目前为止,我们展示的所有例子都使用了一个步长。采用如此小的步幅导致感受野之间的大重叠。结果,许多信息在相邻的感受野重复出现,如图 6 所示。

Figure 6 –Receptive fields with stride 1.

在 3×3 大小的核的情况下,步长为 2 的采用导致一列或一行与相邻感受野重叠。这种重叠是为了保证步幅不会跳过重要信息。

增加步距将减少卷积的计算成本。如果我们将步距从 1 改为 2,计算成本的减少大约是 4。这是因为步幅影响了二维感受野之间的距离。类似地,如果我们将步幅增加三倍,我们可以预期计算成本降低大约九倍。计算成本降低,因为步幅的增加减少了从输入中提取的感受野的数量,因此,输出的维度也减少了。

图 7 显示了步长为 2、4、8 和 16 的四种卷积结果。卷积中使用的内核大小是 70x70。请注意,将步幅增加两倍,执行时间会减少近四倍。

Figure 7 — Examples of stride 2, 4, 8, and 16. The receptive field dimension is 70x70.

在图 7 中,步长为 16 的卷积结果比步长为 8 的卷积结果少 4 倍的像素。注意,采用 16 的步幅导致 54 行或列的重叠,因为感受野大小是 70×70。步长为 16 时,仍有可能通过平面轮中最亮的像素来识别卷积的最高值。

正向传播

在本节中,我们将研究前向传播在卷积层中的工作原理。为此,我们将了解单个卷积层是如何工作的,然后了解多个卷积层是如何协同工作的。在这项研究中,我们将学习两个新概念:非线性激活和池操作。

在卷积层中

图 8 显示了典型卷积层中的前向传播,它包括三个阶段:卷积、非线性激活和池化。卷积运算已经在第一节中讨论过了。现在,我们将看到其他两个操作。

Figure 8 — The three stages of a convolutional layer.

非线性激活也被称为检测器阶段。在这个阶段,卷积和偏差的结果被提交给非线性激活,例如 ReLU 函数。非线性激活不会改变特征图的尺寸,它只会调整其中的值。

非线性激活

一、什么是线性激活?线性激活是遵循规则 f(x)=ax 的函数,其中 a 是常数,x 是变量。它的图形是一条穿过原点(0,0)的直线。意味着形状 f(x)=ax + b 中的函数,其中 a 和 b 是常数,不是线性的。两者都是仿射函数,但只有一个常数乘以变量的函数是线性函数。

对于一个线性函数,当我们把输入乘以一个常数𝛼时,我们也应该看到输出乘以同一个常数𝛼.这意味着:

另一个要求是,当我们在线性函数中应用两个输入的和时,我们应该得到分别应用于该函数的两个变量的和的输出当量:

那么,我们为什么要使用非线性激活呢?因为当我们在线性函数中应用线性组合(加法或乘法)时,结果也是线性的。尽管许多模型可以用线性模型粗略地近似,但在人工神经网络中使用非线性使得它能够表示线性和非线性模型。换句话说,非线性使人工神经网络成为更强大的函数逼近器。

深度学习中最常用的非线性激活之一是 ReLU 函数,它代表整流线性单元。该函数由下式给出:

该函数在有偏置的情况下,会产生如图 9 所示的图形。

Figure 9 — The graph of ReLU function.

图 10 显示了 ReLU 如何调制卷积的结果。这里,来自图 2 的相同结果被用于应用 ReLU 函数。

Figure 10 — ReLU function applied after the convolution.

上例中使用的 ReLU 函数的等效图像如图 11 所示。请注意,一些中间值被涂黑,突出显示了最亮的三个像素。

Figure 11 — Visual representation of the ReLU function applied after the convolution.

接下来,在图 12 中,您可以看到 ReLU 函数中的一些偏置选项。该函数将平面与包含车轮的图像面片的卷积结果作为输入。请注意,偏差就像一个阈值,决定显示什么和不显示什么。

Figure 12 — Different values of bias applied to the same result of the convolution between the plane and a patch of the image containing the wheel.

图 12 中描绘的阈值行为类似于生物神经元,当它接收到低于某个阈值的刺激时不会触发。如果刺激超过阈值,神经元就开始放电,并且随着刺激的增加,放电频率也会增加。在图 12 中,当偏差为 500 时,它有助于人工神经元的活动。然而,如果我们将偏差定义为-1000,人工神经元只会在最强的刺激下激发。

总之,ReLU 功能就像一个人工神经元。这就是为什么这个阶段被称为检测阶段。ReLU 函数负责检测由内核提取的特征的存在。因此,每个内核都有一个偏差,因为每个特性需要不同的阈值。

联营

最后,但不是最不重要的,池操作。它是对每个特征地图执行的缩减采样操作。它从特征图中提取感受野并用单个值替换它。这个单一值可以通过不同的聚集标准获得,例如根据距感受野中心的距离的最大值、平均值或加权平均值。

除了聚集标准之外,在汇集操作中还有另外两个超参数,感受野的大小和步幅。

与 stride 类似,池化操作导致卷积处理的数据更少。一个区别是,汇集操作不是跳过数据,而是试图将感受域总结成一个值。另一个不同之处在于,跨距是在卷积之前应用的,而池是在卷积的结果上应用的,从而减少了下一层的数据量。此外,汇集操作的感受域是二维的,因为它被单独应用于每个特征图,而卷积的感受域是三维的,包括一层中所有特征图的一部分。

汇集操作的一个期望的副作用是增加了网络对输入的平移的不变性。随着更多卷积层之后是汇集层,这种效应被放大。

图 13 显示了值通过两个池层的传播,池大小为 3x3,跨距为 2。在输入要素地图的蓝色区域中的任何激活都会影响池 1 结果中的蓝色区域。类似地,在汇集 1 的结果中被蓝色覆盖的区域中的激活影响在汇集 2 的结果中被蓝色覆盖的区域。绿色区域之间的关系也是如此。

Figure 13–Propagation of values through pooling layers with pooling size 3x3 and stride of 2. In this example, the convolutional layers were omitted for clarity.

考虑到图 13 中的池是最大池,最高值出现在输入特征图中蓝色区域的哪个位置并不重要,因为它将以同样的方式传播到结果池 2 中的蓝色激活。这就是合并图层增强平移不变性的原因,输入中的小平移不会改变输出中的值。

图 14 显示了卷积步长、ReLU 函数偏差、合并大小和合并步长的不同组合的效果。在左边,有三个步幅的例子:2、9 和 16。对于步幅的每个选项,有三个偏差示例:500、-250 和-1000。对于每种偏差,有三个汇集大小和步幅的示例:汇集大小为 3×3,步幅为 2,汇集大小为 5×5,步幅为 3,汇集大小为 7×7,步幅为 4×4。

Figure 14–Effects of different hyperparameters in convolution, ReLU and max pooling.

卷积中的步幅和最大池中的步幅的效果是累积的。当我们在卷积和最大池中使用步长 2 时,最终结果是特征图的宽度和高度大约减少了四倍。

卷积中的步幅值为 16,最大池中的步幅值为 4,这是不常见的。它们被故意夸大以说明它们对卷积层最终结果的影响。生成的特征图只有 100 个元素(10 x 10),比具有 37636 个元素的特征图(194 x 194)小得多。

将碎片拼在一起

我们将回到 AlexNet,第一个著名的 CNN 架构。这是一个很好的实际例子,可以理解 CNN 的组件是如何一起工作的。AlexNet 的构建模块如图 14 所示。虚线金字塔表示使用来自输入的感受野或来自前一层的特征图执行卷积。大方框代表特征图,特征图内的小方框是感受野。这个 CNN 可以将物体分为 1000 种不同的类别。

Figure 15 — Architecture of AlexNet CNN.

这种架构的一个特点是它使用两个 GPU 进行训练。图 15 顶部的元素分配在一个 GPU 中,而底部的元素分配在另一个 GPU 中。

你可以在一些框架中得到 CNN 的训练,比如 PyTorch。比较好用。您还可以使用迁移学习将此架构应用于其他影像数据集。这需要一些数据处理来标准化和重新缩放图像,以符合 AlexNet 的要求,但值得一试。大概是这样的:

from torchvision import transformspre_transforms = transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

您可以在 PyTorch 中导入模型,如下所示:

from torchvision import modelsmodel = models.alexnet(pretrained=True)

您可以禁用卷积层的训练,并创建自己的分类器来覆盖原始的 AlexNet 全连接层:

from torch import nnfor param in model.parameters():
    param.requires_grad = False # disable trainingfcLayersDict = OrderedDict([('fc1', nn.Linear(9216, 1024)),
                   ('relu1', nn.ReLU()),
                   ('fc2', nn.Linear(1024, 102)),
                   ('output', nn.LogSoftmax(dim=1))
                           ])
model.fcLayersDict = fcLayersDict
fc = nn.Sequential(fcLayersDict)
model.classifier = fc

除了 AlexNet,PyTorch 中还有其他模型可以用来对您自己的图像数据集进行分类,只要进行必要的定制。真的建议测试这些模型,甚至从零开始建立自己的 CNN,了解 CNN 是如何工作的。

即使您已经熟悉这里介绍的概念,我希望您至少可以从另一个角度来看它们。CNN 还有其他一些概念没有在这里讨论。如果你对 CNN 的某个方面感到好奇或不确定,请告诉我。

可视化神经网络的非线性

原文:https://towardsdatascience.com/visualizing-the-non-linearity-of-neural-networks-c55b2a14ad7a?source=collection_archive---------14-----------------------

在这篇文章中,我将通过一个基本的例子来展示神经网络中非线性激活函数的能力。为此,我创建了一个人工数据集。每个数据点都有两个特征和一个类别标签 0 或 1。所以我们有一个二元分类问题。如果我们把这些特征称为 x₁和 x₂,那么这些数据在(x₂)-spacex₁)的情节如下:

这里,红点对应负类,蓝点对应正类。请注意,数据不是线性可分的,这意味着没有线来分隔蓝点和红点。因此,对于给定的特征表示,线性分类器没有用。现在,我们将训练一个具有两个单元和非线性tanh激活函数的一个隐藏层的神经网络,并可视化该网络学习的特征。

为了创建模型,我将使用 Tensorflow 2.0 和tf.keras:

inputs = tf.keras.Input(shape=(2,))
x = tf.keras.layers.Dense(2, activation=tf.nn.tanh)(inputs)
outputs = tf.keras.layers.Dense(1, activation=tf.nn.sigmoid)(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

让我们将隐藏层的权重和偏差表示如下:

权重和偏差的初始值定义了(x₁,x₂)-space,

训练前的这些初始行以及数据如下所示:

Data and the initial lines defined by the hidden layer in (x₁,x₂)-space

请注意,这两个初始行没有很好地划分给定的两个类。现在让我们训练模型,看看这些线会发生什么。

model.fit(x_train, y_train, batch_size = 16, epochs=100)Epoch 100/100
400/400 [==============================] - 0s 80us/sample - loss: 0.1116 - accuracy: 1.0000

在 100 个时期后,我们的训练准确度是 100%,因此模型正确地分类了训练数据中的所有点。

注意,您可以通过使用model.weights获得 keras 模型的参数,它返回一个权重和偏差列表:

[<tf.Variable ‘dense/kernel:0’ shape=(2, 2) dtype=float32, numpy= array([[-3.2753847, 3.2302036], [ 3.3264563, -3.2554653]], dtype=float32)>, <tf.Variable ‘dense/bias:0’ shape=(2,) dtype=float32, numpy=array([1.5562934, 1.5492057], dtype=float32)>, <tf.Variable ‘dense_1/kernel:0’ shape=(2, 1) dtype=float32, numpy= array([[2.625529], [2.670275]], dtype=float32)>, <tf.Variable ‘dense_1/bias:0’ shape=(1,) dtype=float32, numpy=array([-2.0918093], dtype=float32)>]

此列表中的前两个元素是隐藏层的权重和偏差,最后两个元素是输出层的权重和偏差。所有这些元素都是张量,您可以使用 numpy()方法获得 numpy 数组形式的值。例如,下面将以 numpy 数组的形式给出隐藏层的权重,

model.weights[0].numpy()array([[-3.2753847,  3.2302036],        [ 3.3264563, -3.2554653]], dtype=float32)

第一行的系数是-3.27 和 3.32;第二行的系数是 3.23 和-3.25。你可以通过运行model.weights[1].numpy()看到他们的偏见

让我们想象由学习到的隐藏层的权重和偏差定义的线,

The data and the lines defined by the hidden layer after training in (x₁,x₂)-space

正如您现在所看到的,这些线以一种将类包含在独立区域中的方式划分了空间。这些线的系数告诉我们每条线的正面。对于蓝线,正方向是上侧,对于橙线,正方向是下侧。所以蓝点在两条线的正侧,红点在一条线的负侧,另一条线的正侧。

现在让我们应用非线性激活函数tanh并在新的特征空间(a₂).a₁)中可视化数据隐藏层的激活计算如下,

对于每个数据点,tanh的参数由该数据点相对于上述线的位置决定。我们可以认为 a₁和 a₂是新的特征,a₁,a₂)-space 是新的特征空间。输出层的权重和偏差在这个新的特征空间中定义了一条线,由以下等式给出

这条线和这个新特征空间中的数据一起绘制如下,

The features learned by the model in (a₁, a₂)-space and the line defined by the output layer.

请注意,在这个新的特征空间中,我们的数据变得可线性分离,由输出图层定义的线将两个类分开。蓝点的 a₁和 a₂坐标都是正的,因为(x₁,x₂)空间中的这些点位于由隐藏层参数定义的两条线的正侧,并且在应用tanh后,两个坐标都是正的。对于红点,a₁和 a₂中的一个是正的,因为在 x₂)-space 的 x₁中,红点仅在由隐藏层参数定义的一条线的正侧,并且根据这条线,它们在新特征空间中只有一个坐标是正的,而另一个是负的。这解释了上图(a₁,a₂)-space)中的数据图。

结论:神经网络学习数据的新表示,这使得相对于该新表示进行分类变得容易。

这里有一个链接指向我在这篇文章中使用的 google colab 笔记本。

感谢阅读。

使用 Python 和 IBM Watson 可视化任何电影角色的个性特征

原文:https://towardsdatascience.com/visualizing-the-personality-profile-of-any-film-character-using-python-and-ibm-watson-78ad2fcee065?source=collection_archive---------24-----------------------

一个简单的数据收集指南,光预处理和任何电影角色的五大性格特征的可视化

Photo by Marko Blažević on Unsplash

伟大的社会心理学家詹姆斯·彭尼贝克曾经说过:“通过更仔细地观察人们用语言表达思想的方式,我们可以开始了解他们的个性、情感以及与他人的联系。”他和许多其他心理学家、语言学家和自然语言处理(NLP)从业者一起,利用双向 LSTMs 和 NLU (自然语言理解)等先进技术,在从书面文本中推断详细(和惊人准确)的个性信息方面取得了巨大进步。

最近,IBM Watson 背后的先锋团队开发了一个名为 Personality Insights 的产品,旨在为业务用例分类个性。在产品主页上有这样一句标语:“通过文字预测个性特征、需求和价值观。从个人层面和整体层面了解客户的习惯和偏好。“虽然商业含义很明显,但我认为利用虚拟人物塑造平台,通过电影主角的口语对话对他们的性格特征进行分类,这将是一件有趣的事情。

数据

为了这个项目,我利用了来自加州大学圣克鲁斯分校的大型电影语料库。语料库按类型细分,包含 960 个电影剧本,其中电影中的对话与场景描述分离。

为了让数据为分析做好准备,需要进行大量的清理和预处理。此外,数据中存在一些结构性挑战。也就是说,需要将每个引用/行与相应的字符进行分解和关联。

出于本文的目的,我不会深入到整个预处理代码中(对于那些感兴趣的人,完整的笔记本可以在这里找到)。然而,我将举例说明我们如何将人物/说话者从他们的对话中分离出来,然后将它们压缩成一个数据帧。

接下来,我们需要将所有与每个角色相关的口语对话组合成一个列表。以下代码的输出将为我们提供由逗号分隔的每个角色的完整对话:

IBM 沃森

Photo by Vasundhara Srinivas on Unsplash

从这里开始,我们的对话就可以输入到我们的 IBM Watson 笔记本中了。请注意,在 IBM Cloud 上注册需要很多步骤。你需要开一个账户,生成一个 API 密匙,还要下载 python SDK 。虽然这些步骤非常简单,但我将为以后的文章保存设置(或者, IBM 网站上的文档相对容易理解)。

一旦我们有了凭证,为列表中的每个字符获取可视化效果的过程就非常简单了。我们是这样设置的:

上面代码的输出将会显示出我们想要分类的角色的非常详细的个性特征。我们将看到输入文本中的字数,五大特征中每一个的百分位数,需求,以及五个主要特征中每一个的详细子特征(称为孩子)。

然而,作为数据科学家,我们不想呈现一个枯燥的读数。相反,我们希望通过一些有吸引力的条形图来形象化这些特征。我将列出这样做的代码,然后输出现代最具代表性的电影角色之一的结果:灰袍甘道夫(和白人!).

想象甘道夫的人格

Photo by Thomas Schweighofer on Unsplash

现在我们已经有了自己的功能,我们可以将甘道夫的全部对话输入到我们的 IBM 笔记本中,并看到他的人格形象。

Big Five profile of Gandalf

The needs of Gandalf

有意思!我们可以看到甘道夫是最开放的,大约在 98%左右。另一方面,他和他们一样内向,对在黑暗的图书馆里研究符文和在莫莉亚矿井下与巴罗格战斗更感兴趣。

至于需求,并没有很大的信号。甚至他的最高需求(好奇与和谐)也没有达到 50%。我想这是有道理的。除了偶尔需要一只鹰从艾辛格塔顶救他们之外,大部分巫师都是自给自足的!(遗憾的是,在 IBMs 服务的这个迭代中没有“eagles”需求列)

除了这一大部分,我们还可以放大甘道夫性格中的儿童特征。让我们看看我们发现了什么:

Openness

Conscientiousness

Extraversion

Agreeableness

Emotional Range

更多有趣的发现!我们可以看到甘道夫在以下特质上处于第 80 到第 100 百分位之间:想象力、智力、艺术兴趣、利他主义、谦虚、同情和忧郁。类似地,我们看到合群和外向的特质的结果很低。

虽然这个程序只能考虑对话而不能考虑动作,但他们确实感觉与指环王电影中甘道夫的角色非常一致。的确,我相信甘道夫本人,如果他能够看到这些结果,会有如下反应:

giphy.com

结论

好了,你知道了。现在,您已经掌握了构建自己的性格分类器的知识,并可以输出一些漂亮、清晰的可视化效果,达到相当高的准确度。

非常令人兴奋的是,我们能够根据个人的书面文本提取出如此详细的信息,虽然这个项目比任何事情都有趣,但这样一个平台的实际应用既重要又多样。例如,我们可以输入一个人的 Twitter 账号,然后输出一个类似的详细而准确的个人资料。虽然这确实令人兴奋,但这也引发了一些关于隐私和我们如何使用这些数据的道德问题。营销人员可以(并且已经)开始从我们的个人资料中提取详细的个性信息,并利用这些信息向我们投放高度个性化的广告和“新闻”文章。

然而,我看到了这种技术更令人兴奋的应用。作为一名体验设计师,我认为未来我们可以使用这种个性分类器来制作定制的交互式叙事内容,并让个人接触到与他们的个性相当独特的特征,以拓宽他们自己的观点。

这是我将在下一个项目中探索的,所以请继续关注。此外,如果你有兴趣深入了解这个项目的步骤和代码,可以看看我的 Github repo。最后,在不久的将来,我将发布一个分步指南,介绍如何使用 python 和 IBM Watson,以及如何使用 NLP 和 LDA、NMF 等降维技术,按类型将相同的电影剧本语料提取为简单的主题。

附录

Github 、 LinkedIn 、投资组合

用熊猫可视化 Scimago 期刊排名数据库

原文:https://towardsdatascience.com/visualizing-the-scimago-journal-ranking-database-with-pandas-7e7aaad54904?source=collection_archive---------12-----------------------

SCImago 期刊排名(SJR 指标)是对学术期刊的科学影响力的一种衡量,既考虑了期刊被引用的次数,也考虑了引用来源期刊的重要性或声望。

scimago journal 的网站维护着期刊和国家排名的完整信息。与其他类似网站不同,它还提供了一些独特的可视化工具,提供各种科学结构的信息可视化图表,实时和气泡图地图,这些地图基于一系列指标,如 H 指数、总文献数、引用文献数、引文数、自引数、每篇文献的引文数和国家。

在这篇博文中,我将使用 Scimago 的数据库来创建类似的可视化效果,同时分析这些可视化效果将展现的奇怪趋势。CSV 数据文件可在下载。使用的库是 pandas、seaborn、matplotlib 和 plotly。对于不耐烦的灵魂,代码和输出可以在这个 jupyter 笔记本中找到。

正在加载数据库

我用熊猫来加载 csv 文件。下图显示了数据库的各个字段:

在上图中,“标题”是指出版单位的名称。这些类型可以是期刊、行业期刊、丛书会议和会议记录。此外,还列出了SCImago Journal Ranks(SJR)主办这些活动的国家名称、发行商组织、它们所属的类别以及其他指标。

左图显示了在数据框上调用 info()方法得到的字段的列数和数据类型。我们可以观察到数据库非常干净,只有几列(SJR、国家、出版商)包含缺失值。

可视化 H 指数

H-index 指的是该期刊被引用至少 h 次的文章数量( h )。H-index 因其简单而优雅,可以被认为是当今出版业绩最重要的衡量标准。

让我们从可视化 H 指数值的分布开始,以便推断所有可能出现的值以及它们各自的频率。为此,我们可以使用 Seaborn 的 distplot 。

sns.distplot(df.loc[df['Country'] == 'United States']['H index'].dropna(), kde=True)
print(df.loc[df['Country'] == 'United States']['H index'].dropna())

下图显示了美国和印度的分布情况。图上的蓝色曲线表示高斯核密度估计值。我们可以很容易地推断出两者之间的一些明显差异。例如,大多数印度期刊的 H 指数在 0-20 之间,而美国期刊的 H 指数在 0-100 之间。此外,没有一家印度期刊的 H 指数超过 200。

进一步,我尝试用气泡图将每个国家的总引用次数(过去 3 年)与它们的总 H 指数进行比较。为此,我们需要根据这些国家在过去三年中发布的文档总数来确定气泡的大小:

plt.figure(figsize=(10,8))
sns.set_context("notebook", font_scale=1.1)
sns.set_style("ticks")sizes = [10, 60, 90, 130, 200] 
marker_size = pd.cut(df['Total Docs. (3years)']/10, [0, 40, 80, 120, 160, 200], labels=sizes)
sns.lmplot('H index', 'Total Cites (3years)', data ​=df, hue='Country', fit_reg=False, scatter_kws={'s':marker_size})
plt.title('H index vs Total Cites (3 years)')
plt.xlabel('H index')
plt.ylabel('Total Cites')
plt.ylim((0, 50000))
plt.xlim((0, 600))
plt.savefig('sns.png')

由于 LinkedIn 的图片大小限制,我无法附上整张图片,而是提供了 google drive 链接。从图表中,我们可以很容易地分辨出哪些国家产生的文献最多,哪些最少被引用。不出所料,美国位居榜首,其次是英国、荷兰、澳洲、德国,而排在最后的是:津巴布韦、梵蒂冈城、斐济列支敦士登。我还使用 plotly 获得了一个类似但更具交互性的图表。然而,它太重了,不能附在这里,因为我在交互图中导航时多次经历了 plotly 的页面崩溃。(欢迎任何关于替代方案的建议。)

[## hindex_vs_totalCites.png

编辑描述

drive.google.com](https://drive.google.com/file/d/1ZnqdeWCC6WVmKAHF8u7bABd7MlvS2CEf/view?usp=drive_open&usp=embed_facebook)

可视化各种指标之间的相关性

接下来,我们想了解各种指标之间的关联模式。这就是 Seaborn 的联合计划来拯救的地方。使用 jointplot,我们可以根据两个变量显示数据点,包括它们的分布、核密度估计值和拟合数据的可选回归线:

该图(最后一个子图)显示了引用文献的数量与参考文献的总数高度相关,皮尔逊相关系数(pearsonr)为 0.78。此外,他们图表的回归线显示了一种强烈的上升趋势,这解释了随着参考文献总数的增加,引用文献的数量也在增加。这两个观察结果在评估关于总文档的 H 指数时给出了更差的结果,即 pearsonr = 0.35,并且回归线具有非常小的上升趋势。

关于相关性,我们可以使用 Seaborn 的热图一次可视化数据帧的多个指标之间的相关性。这可以使用对 pandas dataframe 调用的 corr() 方法来实现,该方法使用一种指定的方法(默认为 Pearson)来计算 dataframe 的所有数字列对之间的相关系数。

值得注意的一个特殊趋势是,引用文献的数量与发表文献的总数几乎完全相关。然而,这两个指标对 H 指数都没有很大的影响。因此,影响期刊 H 指数的最佳可能指标可以被认为是该期刊获得的引用总数

Ramana 等人所述,上述热图中的趋势在联合图观察的支持下,可能表明 H 指数计算中的固有缺陷。艾尔。(2013) :

尽管你的大量论文被大量引用(在我们的例子中是总引用数),它只考虑那些被引用次数最少的论文作为你的 h 指数,为了提高你的 h 指数,你的其他论文的引用也应该增加。

可视化国家

到目前为止,我们一直在研究各种数值度量对之间的关系。到目前为止,一切都很好。但是,如果我们想知道单个国家的这些指标的趋势(或者第三个特征),该怎么办呢?

对此的一个解决方案是使用对绘图。在探索多维数据之间的相关性时,Pairplots 非常重要,因为我们可能要绘制所有相互对应的值对。出于我的目的,我选择了 CSV 文件的前 1000 个实例,同时指定了字段“Country”的值,以便将绘图特征映射到不同的颜色:

sns.pairplot(df[:1000], hue='Country', size=2.5)

我们现在可以研究单个国家的表现。以下是一些快速推断:

  • 粉红色光谱中的国家(保加利亚、加拿大和印度)可以看到具有较低的 H 指数和可引用文件,蓝绿色光谱中的国家具有中等水平,而橙红色光谱表示表现最好的国家。
  • 可以看到沿对角线的图形由柱状图组成,以显示该列中各个变量的数据的单变量分布。
  • 我们观察到的可引用文献数量和已发表文献总数之间的完美相关性在这里也成立,因为我们可以看到大多数数据点(即国家)都集中在上图的对角线上(第五行,最后一列)。这意味着我们可以沿着对角线拟合一条平滑的回归线,以覆盖大多数数据点。

可视化类别

我们可能还想知道更多关于数据库中提到的不同科学类别的信息。但是,类别单元格包含多个分号分隔的字段。因此,我首先基于不同的“;”复制行类别中的分隔值。

new_df = pd.DataFrame(df.Categories.str.split(';').tolist(), index=df.Country).stack()
new_df = new_df.reset_index()[[0, 'Country']] *# categories variable is currently labeled 0*
new_df.columns = ['Categories', 'Country'] *# renaming categories*
new_df = new_df.dropna()
new_df.info()
new_df.head()

现在,让我们观察发布实体数量最多和最少的类别。为此,我们需要将类别的字符串值转换成数字。Pandas 为此提供了一个内置方法:value_counts()返回 pandas 系列中唯一值的计数。

fig, ax = plt.subplots()
new_df['Categories'].value_counts()[:20].plot(ax=ax, kind='bar')

不出所料,计算机科学独占鳌头!

此外,上述可视化也可以用这个新的数据框来实现。

可视化世界各国领导人在联合国大会上的演讲

原文:https://towardsdatascience.com/visualizing-the-speeches-of-world-leaders-at-unga-d7319e00e180?source=collection_archive---------14-----------------------

第 74 届联合国一般性辩论于 9 月 24 日星期二上午 9 时(纽约时间)开幕。今年的主题是“激励多边努力,促进消除贫困、优质教育、气候行动和包容”。

自 1947 年以来,联合国会员国的代表每年都聚集在联合国大会的年会上。每次会议的中心是一般性辩论。在这个论坛上,各国领导人和其他高级官员发表声明,阐述他们的政府对世界政治重大问题的看法。

这份领导人名单是根据他们的 GDP 规模、应对气候变化的行动以及他们对地区发展的影响等因素编制的。

  • 纳伦德拉·莫迪印度总理
  • 唐纳德·川普美利坚合众国总统
  • 唐纳德·图斯克欧洲理事会主席,欧盟
  • 埃马纽埃尔·马克龙法兰西共和国总统
  • 鲍里斯约翰逊英国首相
  • 朱塞佩·孔戴意大利总理
  • 安倍晋三日本首相
  • 雅伊尔·博索纳罗巴西总统
  • 杰辛达·阿德恩纽西兰总理
  • 伊姆兰·汗巴基斯坦总理

德国、中国和俄罗斯没有由其国家元首代表,而是由大多数高级官员代表,因此他们没有被纳入分析。

分析参数:

  • 词语云 —世界云会将领导讲话中使用频率最高的词语可视化。NLTK 世界云库用于生成定制的可视化。
  • 主题建模 —主题建模将通过进行 NLTK 分析来可视化演讲的前 10 个主题。Gensim 主题建模用于此。
  • 极性(模式分析器)——使用模式分析器计算语音的极性,并在-1.0 到+1.0 的范围内显示,其中-0.1 为最大负值,0 为中性值,+1.0 为正值。使用的技术是基于 python 的文本处理库 TextBlob。
  • 主观性(模式分析器)——使用模式分析器计算语音的主观性,并在 0.0 到+1.0 的范围内显示,0.0 表示客观,+1.0 表示主观。使用的技术是基于 python 的文本处理库 TextBlob。

印度总理纳伦德拉·莫迪

莫迪是世界上最大的民主国家、第五大经济体和 13 亿人口的总理。印度也是第三大二氧化碳排放国,因此印度采取的每一个行动都关系到每一个全球公民。他演讲的主要亮点是印度不断推动消除贫困、采用可再生能源、应对气候变化和根除恐怖主义。

全文此处。

可视化显示,演讲主要集中在印度的发展和世界上的其他社会经济问题上。

总理的讲话极性为 0.089,这表明它是中性的——积极的,主观性为 0.31,这表明它不太主观。

美国总统唐纳德·川普

特朗普是世界上最古老的民主国家的总统,是世界上最大的军事强国,也是仅次于中国的第二大二氧化碳排放国。特朗普总统在演讲中没有对气候变化做出任何强有力的承诺。此外,他传达了一个明确的信息,支持民族主义和国家主权,反对全球主义。这次演讲是在对他的正式弹劾调查开始后发表的。

全文此处。

总统演讲的极性为 0.10,这表明它是积极的,主观性为 0.49,这表明它是主观的。

欧盟欧洲理事会主席唐纳德·图斯克

唐纳德·图斯克先生是欧盟的政治首脑,欧盟拥有 5 亿人口和 18 万亿美元的国内生产总值。图斯克强调,如果不准备在全球范围内建立规则,并在以后始终遵守这些规则,当地社区、民族和国家,甚至各大洲,在这些威胁面前都将束手无策。

全文此处。

总统演讲的极性为 0.07,这表明它是积极的,主观性为 0.43,这表明它更加主观。

法国总统埃马纽埃尔·马克龙

周二,法国总统埃马纽埃尔·马克龙在联合国大会年度高级别辩论上向世界领导人发表讲话,呼吁拿出勇气,呼吁政治家们承担必要的风险,以找到应对当代挑战的真正解决方案。

全文此处。

总统演讲的极性为 0.08,这表明它是中性的——积极的,主观性为 0.31,这表明它更加客观。

英国首相鲍里斯·约翰逊

英国首相鲍里斯·约翰逊(Boris Johnson)在联合国大会(UN General Assembly)上发表了关于技术的首次演讲,其中引用了许多离奇的引文,涉及科幻小说、电影,甚至小众的英国喜剧节目。演讲在一大堆可识别的反乌托邦比喻之间跳跃,比如“终结者”系列和关于物联网的阴谋论。这次演讲是在他在英国遭遇巨大失败后发表的,最高法院裁定他暂停议会是非法的。

全文此处。

总理的讲话极性为 0.05,这表明它是中性的——积极的,主观性为 0.35,这表明它更加客观。

意大利总理朱塞佩·孔戴

意大利是世界第八大经济体,也是二氧化碳的主要排放国。孔戴先生强调,国际社会需要更有效的多边主义,需要一个作为基于和平、正义和公平的国际体系支柱的作用得到加强的联合国。

全文此处。

总理的讲话极性为 0.07,这表明它是中性的——积极的,主观性为 0.22,这表明它非常客观。

日本首相安倍晋三

日本是世界第三大经济体和第五大二氧化碳排放国。日本誓言支持全球推动为所有女孩和妇女提供包容性优质教育。安倍还表示,他打算利用多边框架和全球主义来缩小差距。

全文此处。

总理的讲话极性为 0.10,这表明它是积极的,主观性为 0.31,这表明它更客观。

巴西总统雅伊尔·博索纳罗

极右翼的巴西总统雅伊尔·博索纳罗公开反对他所谓的关于亚马逊的“媒体谎言”以及所谓的对居住在那里的土著居民的操纵。巴西是南美洲最大的国家,亚马逊地区比西欧还大。在他挑衅性的演讲中,他还继续攻击社会主义在拉丁美洲的遗产。在对法国和德国的尖锐反驳中——两国都公开关注森林砍伐的增加——bolso naro 利用他的演讲指出,这两个欧洲国家将超过 50%的土地用于农业,而巴西仅使用 8%。

全文此处。

总统演讲的极性为 0.09,这表明它是中性-积极的,主观性为 0.41,这表明它是中性-客观的。

纽西兰总理杰辛达·阿德恩

杰辛达·阿德恩总理对民族主义的呼吁进行了指责,并恳求世界领导人共同努力,这一讲话与美国总统唐纳德·特朗普早些时候发表的讲话截然不同。阿尔登还指出,克赖斯特彻奇呼吁是各国和科技公司合作努力消除网上暴力极端主义和恐怖主义内容的一个例子。

全文此处。

总理的讲话的极性为 0.07,这表明它是中性-积极的,主观性为 0.28,这表明它非常客观。

巴基斯坦总理伊姆兰·汗

这是汗先生成为巴基斯坦总理后在联合国大会上的首次发言,巴基斯坦是东南亚维护和平与稳定的一个非常重要的角色。作为 130 个联合国认定的恐怖分子,超过 25 个联合国认定的恐怖实体的家园——崩溃的国内生产总值和高耸的经济债务,世界非常有兴趣知道汗先生如何计划使巴基斯坦成为一个更好的地方。相反,他把自己的全部 59 分钟都献给了印度——一种针对印度的虚构言论,对印度领导层吐毒液,为伊斯兰激进主义和核圣战辩护。

总理讲话的极性为 0.04,这表明它是中性的,具有显著的负带宽,主观性为 0.38,这表明它更加客观。

技术背后的分析

  • 使用 python 中的正则表达式、 NLTK 库进行文本处理。
  • 使用定制的NLTKword cloud 来可视化演讲。
  • 使用 Gensim 话题建模 LDA 分析器获得演讲的更详细话题。
  • 使用 Textblob ,计算极性和主观性。

链接到Google Collab

链接 Kaggle 笔记本分析联合国辩论会上的印度(1970–2016)。探究印度在谈论哪些问题?印度有多少次提到巴基斯坦或其他国家,反之亦然?

注:

这是一项完全独立的数据分析,既不赞助也不支持,也不与任何组织、公司或个人相关。

从我的角度来说,我尽量保持它的公正性,把它表达为一种纯数据分析的形式,而不做太多的政治评论。读者可以自由使用上述数据或图像,并从中做出任何推断。

用 Tableau 可视化股票市场

原文:https://towardsdatascience.com/visualizing-the-stock-market-with-tableau-c0a7288e7b4d?source=collection_archive---------12-----------------------

Photo by AbsolutVision on Unsplash

我们使用 Tableau 数据可视化来寻找包含潜在廉价股票的行业

Tableau 是一个重要的数据可视化工具,属于每个数据分析师和数据科学家的工具包。今天,我们摆弄股票市场数据,以探索 Tableau 如何帮助我们剖析和更好地理解我们的数据。

首先,我们获取数据

我们可以从 Quandl 抓取股市数据。我们将重点关注标准普尔 500 指数,这是一个大型美国股票(基本上是最大的美国公司)的市值加权指数。

下面是获取数据的 Python 代码(注意,您需要自己的 Quandl API 密匙,Sharadar 数据需要付费订阅)。我还在下面的代码中添加了注释,但是下面的代码片段使用 Quandl 的 API 来获取 Sharadar 数据库中所有上市公司的财务数据(财务数据包括收入、净收入、债务、投资资本回报率等等)。这个财务数据存储在数据帧 stock_df 中。

import quandl
quandl.ApiConfig.api_key = 'your_qandl_api_key'
import numpy as np
import pandas as pd# Download financial data from Quandl/Sharadar
table = quandl.get_table('SHARADAR/SF1', paginate=True)# Grab the most recent annual data ('MRY' denotes annual data)
stock_df = table[(table['calendardate'] == '2018-12-31 00:00:00') & (table['dimension']=='MRY')]

然而,我们不需要每家公司的数据,我们只需要标准普尔 500。为了得到标准普尔 500 的报价,我们求助于网络搜集和维基百科。下面几行代码抓取了一个维基百科表格,列出了目前在标准普尔 500 的每家公司的股票代码和行业,并将其存储在名为 page_content 的变量中。

# Scrape S&P 500 tickers from Wikipedia
from bs4 import BeautifulSoup
import requests
import repage_link = '[https://en.wikipedia.org/wiki/List_of_S%26P_500_companies'](https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')
page_response = requests.get(page_link, timeout=1000)
page_content = BeautifulSoup(page_response.content, 'lxml')

接下来,我们使用一些解析代码从 page_content 中获取 ticker 和 industry,这是一个漂亮的组数据结构。代码可以总结为执行以下操作:

  • 遍历 page_content 中所有“tr”(我相信它表示 HTML 中的一个表格行)标记的项目。
  • 将跑马灯作为一个字符串来抓取(T10)。text 将项目转换为字符串格式)并将其存储在列表ticker中。
  • 将行业作为字符串抓取并存储在列表行业中。
# From web scraped Wikipedia content on the S&P 500, grab the ticker and industry for each firm
tickers = []
industries = []
for i, val in enumerate(page_content.find_all('tr')):
    if i > 0:
        try:
            # Here is where I grab the ticker
            tickers.append(val.find_all('a')[0].text)
            # Here is where I grab the industry
            industries.append(val.find_all('td')[3].text.replace('\n', ''))
        except:
            pass

最后,我们需要做一些数据操作,将我们的股票和行业数据(来自维基百科)与我们的财务数据(来自 Quandl)结合起来。前两个代码块(在注释中有详细描述)将我们想要的 tickers 存储到一个名为 sp_df 的数据帧中。

最后一段代码使用 Pandas 合并方法将包含我们股票和行业数据的 sp_df 与包含我们财务数据的 stock_df 连接起来。我们将得到的数据帧 merged_df 存储在一个. csv 文件中,我们现在可以将它加载到 Tableau 中(我使用的是 Tableau Public,它是免费的)。万岁!

# After ticker ZTS, the rest of the table entries are for acquisitions/mergers
last_pos = tickers.index('ZTS') + 1
sp_tickers = tickers[:last_pos]
sp_industries = industries[:last_pos]# Create a new dataframe for S&P 500 and merge in Quandl data
sp_df = pd.DataFrame()
sp_df['tickers'] = sp_tickers
sp_df['industries'] = sp_industriesmerged_df = sp_df.merge(stock_df, left_on='tickers', right_on='ticker', how='left')
merged_df.to_csv('sp500.csv', index=False)

差不多是时候想象了

数据可视化听起来有趣又简单,但事实并非如此。我们看到的所有这些很酷的仪表盘和交互式图表都经过了大量的思考。虽然我不是专家,但在我开始把数字贴到图表上之前,我首先尝试回答以下问题:

  1. 我们试图通过视觉化来揭示什么样的洞察力?漂亮的图表固然很好,但如果没有从中汲取的洞察力,它们只不过是空洞的形状和颜色。
  2. 这个视频是探索性的还是回答一个特定的问题?这两个目标看似相似,但事实并非如此。探索性的可视化可以更一般化,包含大量信息——因为目标是引发思考和讨论。这意味着要盯着看,逐渐消化,不同的人在研究一个问题时会得出不同的结论。另一方面,旨在回答特定问题的可视化需要做到这一点——它们旨在明确支持你试图提出的任何观点。

现在让我们试着回答这些问题:

  1. 我们希望利用我们的股票数据寻找有吸引力的行业或可能值得投资的单个公司。
  2. 在本帖中,我们将关注探索性的视觉效果。挑选股票是一项复杂而主观的工作。我们的目的不是告诉人们买什么股票;相反,我们希望我们的可视化可以帮助他们识别和深入更具体的兴趣领域。

用 Tableau 可视化股市(终于!)

让我们先来看看 S & P 500 的树形图。标准普尔 500 指数是一个上限加权指数——这意味着每家公司在该指数中的代表与其市值成比例(市值是该公司所有股票的总价值,换句话说,就是收购整个公司的成本)。在下面的树形图中,每个矩形的大小和颜色对应于该公司在标准普尔 500 指数中的表现。

Larger Area and Deeper Colors Means Higher Market Capitalization

顶端有一些熟悉的面孔——苹果、微软、亚马逊、谷歌、伯克希尔·哈撒韦组成了前五名。有趣的是,这 5 大公司占标准普尔 500 指数市值的 17%,前 15 大公司占总市值的 30%。注意,仅仅是市值不足以解释是什么驱动了标准普尔 500 指数的价格变化——公司股价的波动也很重要。例如,尽管脸书(FB)的市值低于微软(MSFT),但脸书的股价在过去 12 个月中波动更大,因为它试图避开一系列丑闻。因此,在过去的一年里,脸书的股票很可能比微软的股票更能推动标准普尔 500 指数的上涨。

可视化公司利润

拥有一家公司的股份相当于拥有同一家公司的一部分(无论多小)。例如,如果我们非常富有,购买了相当于公司 1%的股份,那么作为少数股东,我们有权获得 1%的利润。当然,作为小股东,我们也被迫将这些利润的管理和投资委托给谷歌的上层管理人员和董事会(这也是为什么我们即使拥有股份,也不会每季度从谷歌那里拿到利润分成支票)。

因此,如果一家公司的利润(又称净收入)是我们购买其股票时最终希望获得的,那么我们或许应该重新绘制利润的树形图。在下面的树形图中,每个矩形的大小和颜色对应着该公司利润的大小(又称净收入)。

Larger Area and Deeper Colors Means Higher Profits

虽然苹果和谷歌仍在前五名,但我们现在有了一些新面孔——摩根大通(JPM)、美洲银行(BAC)和富国银行(WFC)。尽管有关于技术如何颠覆传统行业的大肆宣传,银行业(作为一个传统行业)继续赚取巨额利润。被遗忘的科技巨头英特尔(INTC)、石油巨头埃克森美孚(XOM)和电信巨头美国电话电报公司(T)尽管在当今痴迷于创新的市场中有些被遗忘,但仍能赚得盆满钵满。

按 S&P 部门(按行业)可视化

我个人认为最好的长期投资策略是“低买高卖”(说起来容易做起来难)。但是我们怎么做呢?在最基本的层面上,对于我们支付的每一美元,我们应该试图购买尽可能多的利润。之前的想象向我们展示了不受欢迎的行业有时可能隐藏着不被重视的利润来源。让我们转而关注行业而不是公司,看看我们是否能找到一些好的利润来源。

下面的树形图根据市值中位数(每个矩形的面积)和利润中位数(每个矩形的颜色)对每个行业进行了细分。我们使用中位数是因为我们想知道,如果我从一个特定的行业中随机挑选一家公司,它的成本可能是多少(市值),利润可能是多少(净收入)。

Larger Rectangles Means More Expensive, Greener Color Means More Profitable — Remember These are Medians!

在我们讨论结果之前,我们应该首先理解思考这个树形图的正确方式。我们用它来观察中值市值(我们支付的价格)和中值净收入(我们获得的利润)之间的关系。如果一个行业的价格与其中公司的利润完全相关,那么我们会认为最大的矩形是最绿的,并且随着矩形尺寸的减小,颜色会转变为红色。我们显然没有看到这一点,所以看起来有潜在的机会。

树形图突出了金融机构(银行、保险公司等。)和通信服务(谷歌、脸书、美国电话电报公司、迪士尼等。)作为寻找廉价股票的潜在有吸引力的行业——因为它们在矩形规模(市值中值)方面处于中游,但非常环保(利润中值高)。

与此同时,深红色的房地产似乎绝对不行。医疗保健似乎也是一个应该避开的行业,因为它拥有最高的中值市值和接近“垫底”的中值利润(这对我们来说是一个坏消息)。

当然,这些只是识别潜在投资的快速经验法则——在实际投资之前,应该进行更多的尽职调查。

什么是信息技术?

令人惊讶的是,在我们之前的分析中,包含苹果和微软等重量级公司的信息技术行业看起来并不出色——就价格而言,它很昂贵,但就中间利润而言,它却是“垫底”的。怎么回事?

有两个因素在起作用:

  1. 2018 年末,谷歌和脸书从信息技术转向通信服务。这是两家利润丰厚的公司,人们将它们与科技紧密联系在一起。如果他们仍然在信息技术领域,那么它的市值和利润都会高得多。
  2. 利润水平并不是投资者唯一关心的事情。这些利润是如何获得的也非常重要——像利润率(最终转化为利润的销售比例)和投资回报(为了产生一定水平的利润,我们需要向企业投入多少资金)也非常重要。

让我们用一个 Tableau 散点图来检验市盈率和 ROIC 之间的关系:

  • 市盈率是衡量一家公司股票有多贵的常用指标。简单来说就是公司的市值除以其净收入——换句话说,我们购买特定公司 1 美元的收益需要多少钱。在其他条件相同的情况下,市盈率越高,股票被认为越贵。
  • ROIC 代表资本投资回报率,代表我们对企业投资 1 美元所能产生的利润。投入资本是对经营某项业务所需资本量的衡量。例如,资本密集型企业就像丰田一样,需要大规模的工厂来生产汽车。另一方面,软件是一个轻资本的行业——一旦开发出来,就固定成本或基础设施(相对于产生的利润)而言,维护和部署像微软 Office (Word、Excel、PowerPoint、Outlook)这样的东西的成本非常低。

Median ROIC vs. Median P/E Ratio Scatter Plot

看看我们左边的散点图。它表明一只股票的市盈率(它有多贵)和它的 ROIC 之间是正相关的。这是有道理的——投资者喜欢高 ROIC 的公司,因为它们通常只需要很少的前期投资就能产生可观的利润(需要大量前期投资的公司被认为是有风险的,因为我们可能永远得不到回报)。

到目前为止,信息技术行业的 ROIC 中值最高。这也是有道理的,因为这个领域充满了软件公司,正如我们之前观察到的,资本非常少。因此,吸引投资者投资信息技术(并推动其高市盈率和市值)的不是当前的高利润,而是该业务的轻资本性质,以及今天相对较小的投资将在明天产生高增长和高利润的希望(每个人都喜欢易于扩展且成本低廉的业务模式)。

那会发生吗?我不知道,但市场目前正在下大赌注——所以如果你正在寻找好的机会,你可能会想看看其他地方。

最后,请注意金融板块的 ROIC 最低。这再加上银行的感知风险(2008 年有人吗?)大概推动了他们的低估值。但是银行使用资本的方式不同——银行不是借钱建工厂,而是向你我这样的人借钱,然后以更高的利率借出去。

通常,高投入资本意味着运营企业需要高固定前期成本。银行的情况并非如此——尽管拥有极高水平的投资资本(由于高负债),银行的固定成本却很少。这种高负债确实让它们的风险更高,或许应该得到市盈率折扣,但我们不应该仅仅因为银行的低 roic 就把它们排除在投资之外——相反,我们应该寻求理解是什么驱动了这些低 roic,以及这是否是一个真正的问题。

结论

很好,我们坚持到了最后!老实说,我们还有很多可以探索的。股票市场和公司战略是两个极其深刻和丰富的主题;“买什么股票”是一个非常棘手的问题。在这篇文章中,我们只是开始触及皮毛。

然而,我希望我已经展示了可视化如何帮助我们消化复杂的数据集,并开始解决具有挑战性的问题。

干杯!

更由我论金融与投资:

做空波动的危害

我做的一个关于投资 Lending Club 贷款的数据科学项目

股市低迷

更多由我上数据科学:

随机森林分类器

神经网络如何工作

主成分分析

用散点图和 t-SNE 可视化主题模型

原文:https://towardsdatascience.com/visualizing-topic-models-with-scatterpies-and-t-sne-f21f228f7b02?source=collection_archive---------12-----------------------

不管是好是坏,我们的语言还没有进化成乔治·奥威尔 1984 年的新话版本,有人知道吗?).但是如果英语类似于新话,我们的计算机理解大量文本数据会容易得多。当今自然语言处理(NLP)的挑战来自于这样一个事实,即自然语言天生是模糊的,不幸的是不精确的。

文本数据与图像和视频等格式一起属于非结构化数据。根据 Dama 的说法,“非结构化数据在技术上是指任何没有被标记或以其他方式组织成行、列或记录的文档、文件、图形、图像、文本、报告、表格、视频或录音。”“非结构化”这个标签有点不公平,因为通常还是有一些结构的。图像分解成用 RGB 或黑/白数值表示的像素行。文本在文档中分解成句子、段落和/或章节,文档的集合形成语料库。

对于理解书面自然语言的计算机来说,它需要理解文本背后的符号结构。使用下面的一些自然语言处理技术可以让计算机对文本进行分类,并回答诸如主题是什么之类的问题。语气积极吗?主观?读起来有多容易?

下面是一些我发现对揭示语料库背后的符号结构有用的自然语言处理技术:

  • 主题建模(主题、聚类)
  • 单词/短语频率(和“关键字搜索”)
  • 文本可视化(单词树,单词云均由@Jason Davies 提供)
  • 嵌入(例如 Word2Vec)
  • 情感分析(正面/负面、主观/客观、情感标签)
  • 文本相似性(例如“余弦相似性”)
  • TF-IDF(术语频率/逆文档频率)
  • 词性标注

在这篇文章中,我将重点关注我用来理解文本的主要技术:主题建模,特别是使用guide LDA(一种增强的 LDA 模型,使用采样类似于半监督方法,而不是无监督方法)。我在训练一个主题模型后遇到的一个困难是显示它的结果。主题模型的输出是一个文档主题矩阵,形状为 D x TD 行表示 D 文档,而 T 列表示 T 主题。单元格包含介于 0 和 1 之间的概率值,该值为每个文档分配属于每个主题的可能性。文档-主题矩阵中各行的总和应该总是等于 1。在最佳情况下,文档将很有可能被分类到单个主题中。对于更模糊的数据——每个文档可能谈论许多主题——模型应该在其讨论的主题中更均匀地分布概率。以下是 GuidedLDA 模型输出的文档主题矩阵的前几行示例:

Document 0 belongs to topic 0 with 71% probability and topic 1 with 29% probability. Document 1 belongs to topic 0 with almost 100% probability. And so on.

像上面这样的文档主题矩阵很容易变得非常庞大。除非结果被用来链接回单个文档,否则从整体上分析文档-主题-分布可能会变得混乱,尤其是当一个文档可能属于几个主题时。这就是我想用散点图和饼图的组合来可视化矩阵本身的地方:请看散点图!

Each bubble is a document. Bubbles are colored by topic probability and sized by #1 topic probability (argmax of each row/document in the document-topic matrix). Where there is a pie chart, the document belongs to multiple topics with varying probabilities. The scatterpie chart shows which topics tend to co-occur and how topics overlap with each other. Individual bubbles (documents) are pulled in the direction of the “center of mass” of another topic they may also belong to. Note: to simplify the chart, you may need to filter out documents with #1 topic probability less than some threshold. In this example, I removed documents with #1 topic probability < 0.3 to clean up the visualization.

但是不要这么快——你可能首先想知道我们是如何将主题简化成一个易于可视化的二维空间的。为此,我使用了 t-分布式随机邻居嵌入(或 t-SNE)。从 GuidedLDA 获取文档-主题矩阵输出,用 Python 运行:

from sklearn.manifold import TSNEtsne_model = TSNE(n_components=2, verbose=1, random_state=7, angle=.99, init=’pca’)# 13-D -> 2-D
tsne_lda = tsne_model.fit_transform(doc_topic) # doc_topic is document-topic matrix from LDA or GuidedLDA 

在将 t-SNE 数据的两个数组(使用tsne_lda[:,0]tsne_lda[:,1])连接到原始的文档-主题矩阵之后,我在矩阵中有两列可以用作散点图中的 X,Y 坐标。

对于情节本身,我切换到 R 和 ggplot2 包。下面代码片段中的 dataframe data 特定于我的示例,但是列名应该或多或少是不言自明的。 x_tsney_tsne 是 t-SNE 结果的前两个维度。 row_id 是每个文档的惟一值(就像整个文档主题表的主键)。 x_1_topic_probability 是文档-主题矩阵每一行中的#1 最大概率(即文档最有可能代表的主题)。 topic_names_list 是每个主题带有 T 标签的字符串列表。

library(ggplot2)
library(scatterpie)# high resolution tiff image
tiff(“scatterpie.png”, units=”in”, width=12, height=9, res=500)# plot
p <- ggplot() + 
 geom_scatterpie(aes(x=x_tsne, y=y_tsne, group=row_id, r=x_1_topic_probability), data=data, cols=topic_names_list, color=NA, alpha=0.7) + 
 coord_equal() + 
 geom_label(...) + 
 ggtitle(“Scatterpie Chart”) + 
 xlab(“”) + ylab(“”) + labs(subtitle=”t-SNE Representation of Guided-LDA Topics Colored and Sized by Topic Probability”) +
 scale_fill_manual(values=colors) + 
 theme_minimal() + 
 theme(text = element_text(color=”white”),
 legend.position = “none”,
 panel.background = element_rect(fill = “gray17”, colour = “gray17”), 
 plot.background = element_rect(fill = “gray17”),
 panel.grid.major = element_line(colour = “gray25”),
 panel.grid.minor = element_line(colour = “gray25”),
 axis.text = element_text(color=”white”)) # shut down graphics device
dev.off()

瞧,您已经有了构建主题模型输出的散点图表示的基本要素。将来,我想通过一个交互式的图(looking you, d3.js )来进一步发展,在这个图中,将鼠标悬停在一个气泡上可以显示该文档的文本以及关于其分类的更多信息。

如果你对更酷的 t-SNE 例子感兴趣,我推荐你去看看劳伦斯·范·德·马腾的页面。

Left & middle: 2D & 3D t-SNE visualization of 6,000 digits from the MNIST dataset. Right: t-SNE visualization of image data. Source

可视化全球妇女的无偿工作(特别图表)

原文:https://towardsdatascience.com/visualizing-womens-unpaid-work-across-the-globe-a-special-chart-9f2595fafaaa?source=collection_archive---------15-----------------------

想象一下,如果世界各地的女性不再做她们日复一日做的所有家务劳动:做饭、打扫卫生、照顾孩子、洗衣服、购物等等。全球经济将崩溃,社会将停止运转。

然而,尽管报告接报告关于减少全球妇女的时间贫困的重要性,无偿劳动的负担继续不成比例地落在妇女身上,尤其是在发展中国家。

即使对于高收入国家的女性来说,一旦她们下班回家,“工作”并没有停止,而是开始了。例如,在美国,女性仍然比男性多花将近一个小时做家务。

为了庆祝国际妇女节,并纪念全球女性做出的往往被低估的贡献,我们制作了这张令人大开眼界的图片,展示了世界各地男性和女性在无偿工作上所花时间的差异:

Data source

通过比较每个圆圈与其余圆圈的相对面积,可以清楚地看到,无报酬工作(经合组织定义为日常家务劳动、购物、照顾家庭成员、志愿服务和与家庭活动有关的旅行)不平等程度最高的国家是印度、日本、韩国、墨西哥、土耳其和葡萄牙。

同时,那些平等程度最高的是斯堪的纳维亚国家,如瑞典、挪威、芬兰和丹麦。在这些国家后面是差距稍大的国家,如加拿大、美国、德国、英国、比利时和法国。

与经合组织的休闲时间统计数据相比,这一点值得一提,该数据显示,在所有经合组织国家中,妇女仍然工作更多,娱乐更少,如下文的圆形柱状图所示:

Data source

在这方面,男女休闲时间差距最大的国家显然是葡萄牙、希腊和意大利,而差距最小的国家是挪威、丹麦、荷兰和新西兰。

你如何解释上述经合组织国家无薪工作和闲暇时间的数据可视化?你是否同意全球发展专家的观点,即无偿工作应该更加公平地分配,以促进世界各地妇女的经济和社会进步?让我们知道你的想法。

本帖 原版 最早出现在 Visme 的 视觉学习中心

VLOOKUP 和数组公式正在改变游戏规则

原文:https://towardsdatascience.com/vlookup-and-array-formulas-are-changing-the-game-789e1b233c0d?source=collection_archive---------9-----------------------

Microsoft Excel 是现代工作场所中使用最广泛的工具之一,但也是使用最少的工具之一。我认为这应该改变,我认为应该从 VLOOKUP 开始。这就是为什么,我想花一点时间来谈谈使用 VLOOKUP 作为一个数组公式

什么是数组公式?

数组公式是 Excel 的一项功能,允许您对多个值执行公式运算。这到底是什么意思?

好吧,假设我有两个数据集,我想连接在一起

  • 芝加哥市的所有营业执照
  • 芝加哥市的所有企业主

营业执照文件有我需要的关于执照本身的所有数据,但是个人所有者的名字位于企业所有者文件中。我不想一页一页地翻来翻去看业主的名字,所以我想把业主的名字和姓氏拉到营业执照数据集中。为此,我将使用一个 VLOOKUP 数组公式来获取两个值,而不是一个值。

使用 VLOOKUP

为了将两个文件连接在一起,我需要在两个文件之间找到一个公共元素。幸运的是,我们可以在许可证和所有者文件中看到,我们有一个可以使用的帐号。

The account number is a common field between both files

设置

在许可证文件中,我将在帐号字段的右边创建两个新列。这些新列将保存我的名字和姓氏字段。

在 Excel 文件中,您可以通过右键单击并选择 insert 来创建一个新列,或者只需按 ALT+I,C

连接数据

现在我已经设置好了工作表,我将使用 VLOOKUP 作为数组公式从所有者文件中提取名字和姓氏数据。为了便于参考,我将两个文件并排打开。

首先,我在许可文件中选择单元格 D2 和 E2,作为我的第一行数据将要存放的位置。

Select the cells that you will be populating

接下来,我将开始输入我的 VLOOKUP 公式。

VLOOKUP 接受几个输入值

1.查找值

2.表格数组

3.列索引号

4.范围查找

在这种情况下,我的查找值将是许可证文件中的账号或 C2。我的表数组将是所有者文件中的数据,从帐号列开始,一直到所有者姓氏列。我的列索引号将是名字和姓氏,或者是第 3 列和第 5 列。VLOOKUP 通常只接受一个值,但是因为我们使用的是数组公式,所以我们可以给它多个值,把它们放在括号中— {3,5}。只要我们有两个字段用于填充数据(D2 和 E2),公式就会正确返回值。在这种情况下,它会将名字返回给 D2,将姓氏返回给 E2。

因为这是一个数组公式,所以我需要按 CTRL+SHIFT+enter,而不是在公式末尾按 ENTER。这将把我的整个公式用括号括起来,让 Excel 知道这是一个数组公式。

收尾工作

这样做之后,我可以将公式应用到电子表格的其余部分。最后,我复制所有内容并作为值粘贴,以便将数据完全复制到许可证文件中。

结论

Microsoft Excel 是一个多功能工具,当您不太需要完整的关系数据库设置时,它可以帮助您进行快速数据操作。

你在用 Excel 解决什么问题?Excel 的不足在哪里?我很乐意继续这个话题。如有任何反馈,请通过推特联系我!

使用 GANs 进行语音翻译和音频风格转换

原文:https://towardsdatascience.com/voice-translation-and-audio-style-transfer-with-gans-b63d58f61854?source=collection_archive---------3-----------------------

如何使用 Spectrograms 和 GANs 将爵士乐转换为古典音乐

Photo by Michael Maasen on Unsplash

介绍

我们都听说过图像风格转移:从一幅名画中提取风格并将其应用到另一幅图像中,这是一项已经通过多种不同方法实现的任务。生成对抗网络(简称 GANs)也被用于图像生成、图像到图像的翻译等等。

Examples of image style transfer

但是声音呢?从表面上看,你可能会认为音频与图像完全不同,所有为图像相关任务探索的不同技术都不能应用于声音。但是,如果我们能找到一种方法将音频信号转换成类似图像的二维表示会怎么样呢?

事实上,是的,我们可以!这种声音表示就是我们所说的“声谱图”,它是允许我们利用专门设计的算法来处理音频相关任务的关键。

Spectrogram (source)

光谱图

如果你是音频处理领域的新手,你可能不熟悉声谱图到底是什么。给定一个时域信号(一维),我们希望获得一个时频二维表示。为了实现这一点,我们对音频信号应用具有特定长度窗口的短时傅立叶变换 (STFT),仅考虑结果的平方幅度。

Incredible illustration of how Time and Frequency correlate from the MelNet paper page

更简单地说,我们将原始波形信号分成相互重叠的块,提取块中频率的幅度(通过傅立叶变换),每个结果向量将代表我们最终频谱图的一列。谱图的 x 轴代表时间,y 轴代表频率

为了让这些频谱图对我们的任务更有用,我们将每个“像素”(或量值)转换成分贝标度,取每个值的对数。最后,我们应用 mel 滤波器组,将光谱图转换为 mel 标度,得到所谓的 mel 光谱图

Examples of mel-spectrograms with log-amplitude

这让我们能够让声谱图表现方式对我们人类对声音的理解更加敏感,突出我们人类更容易听到的振幅和频率。

同样非常重要的是要注意,频谱图可以被转换回成“可听见的”波形数据:这不会是一个完美的重建(相位信息在我们的幅度频谱图中丢失了),但是由于一种叫做 Griffin-Lim 的算法,我们能够近似相位并且重现真实的声音音频。

我们的任务

现在我们知道了如何用图像来表示声音,让我们来玩一玩。

在这篇文章中,我将解释如何构建和训练一个能够执行语音转换和任何其他类型的音频风格转换(例如将一种音乐风格转换为另一种)的系统。该方法在很大程度上受到最近使用生成式对抗网络进行图像到图像翻译的研究的启发,主要区别在于将所有这些技术应用于音频数据。作为一个额外的功能,我们将能够翻译任意长度的样本,这在 GAN 系统中并不常见。

为了让你对将要学习的内容有一点兴奋,这里有一个演示视频,展示了我们用这种方法可以达到的效果。

在演示视频中,你可以听不同的语音翻译示例以及一些音乐流派转换,特别是从爵士乐到古典音乐的转换。听起来很不错,不是吗?

选择架构

计算机视觉领域有许多不同的架构用于图像到图像的翻译,这是我们希望通过音频(比如说语音)的频谱图表示来实现的任务。

图像到图像的转换在于将图像从域 A(例如猫的图片)转换到不同的域 B(狗的图片),同时保持来自原始图片(猫的表情和姿势)的内容信息。我们的任务实际上是相同的:我们希望从说话者 A 翻译到说话者 B,同时保持来自说话者 A 的相同的语言信息(生成的语音应该包含与来自说话者 A 的原始语音相同的单词)。

CycleGAN architecture

为这个目标打造的最著名的** GAN 架构可能是 CycleGAN ,于 2017 年推出,此后被广泛使用。虽然 CycleGAN 在相似领域(相似的形状和背景)之间的翻译非常成功,比如从马到斑马,或者从苹果到橙子,但当涉及非常不同的领域时,比如从鱼到鸟,或者从苹果到胡萝卜,它就显得力不从心了。**

这个缺点的原因是 CycleGAN 严重依赖于像素损失的事实,或者换句话说,它的损失倾向于最小化真实和生成图像的像素值的差异:直觉上,当将一个对象(例如苹果)的图像转换到一个实质上不同的域(胡萝卜)时,我们需要改变原始对象的主要形状,在这种情况下 CycleGAN 不能帮助我们

CycleGAN translation example. (Zebra to Horse)

不同人的演讲的频谱图(或不同流派的音乐作品的频谱图)在视觉上可能彼此非常不同:因此我们需要找到一种更通用的方法来解决这个问题,一种不涉及被视觉上相似的领域之间的翻译所约束的方法。

Spectrograms of different speakers or different music genres can be very visually different

TraVeLGAN:我们的解决方案

最初在这里介绍的 TraVeLGAN (变换向量学习 GAN)旨在解决我们的问题。

Examples of TraVeLGAN image-to-image translations with very different domains

除了生成器和鉴别器(或评论家),TraVeLGAN 还引入了一个暹罗网络(一个将图像编码为潜在向量的网络)以允许在实质上不同的域之间进行翻译,从而保持原始样本和转换样本之间的内容关系。

让我们了解一下 TraVeLGAN 到底是如何工作的。

TraVeLGAN architecture

我们的目标是找到一种方法来保持原始样本和生成样本之间的关系,而不依赖于像素损失(如 CycleGAN 中的循环一致性约束),这将限制视觉上相似的域之间的转换。因此,如果我们图像(或光谱图)编码成向量,这些向量在组织的潜在空间中捕获它们的内容信息,我们就能够保持这些向量之间的关系,而不是整个图像。

这正是一个暹罗网络让我们实现的目标。最初用于人脸识别的任务,暹罗网络将一幅图像作为输入,而输出一个长度为 vec_len 的单一向量。使用损失函数指定矢量空间中哪些图像编码应该靠近(例如同一张脸的图像)以及哪些应该远离(不同脸的图像)我们能够组织潜在空间并使其对我们的目标有用。****

The Siamese network encodes images into vectors

更具体地说,我们的目标是保持编码对之间的变换向量 相等:这似乎是一个非常难以理解的概念,但实际上是非常容易理解的****

G(X) 为平移图像 X (生成器的输出) S(X) 为矢量编码的 XA1、A2 两幅图像来自源域 A ,网络必须对矢量进行编码,如:

(S(A1)-S(A2))=(S(G(A1)-S(G(A2)))**

这样,连接一对源图像编码的变换向量必须等于由生成器转换的同一对之间的变换向量。

这允许在翻译中保留语义信息(不同于使用其循环一致性约束保留更多几何内容信息的 CycleGAN),允许约束不同域的图像之间的更多“抽象”关系

形式上,为了在翻译中保留内容信息,我们将最小化两个变换向量之间的欧几里德距离和余弦相似度,以便向量的角度幅度都得到保留。

Formal TraVeL loss

此外,重要的是澄清发电机连体网络必须配合来实现这一目标。更具体地说,行程损耗的梯度从到反向传播到两个网络,并且它们的权重相应地更新。因此,当鉴别者和发生者有一个对立的目标(他们互相挑战以达到他们的目标)时,暹罗人和发生者互相帮助,在相同的规则下合作。

除了这种“内容”损失之外,由于传统的对抗性损失(在我的实验中,我使用了铰链损失),生成器将学习如何生成逼真的样本。

如果你是 GANs 及其工作方式的新手,或者如果你想更深入一点如何用潜在空间保存内容信息,我推荐你查看 我的文章这里讲述如何在一个简单的图像到图像的翻译任务中应用相同的技术。

翻译任意长度的音频信号

既然我们已经探索了一种允许我们在翻译中保留内容信息的方法,我们需要理解如何让生成器转换任意长的样本,而不增加额外的计算和训练时间。

假设我们有一个音频信号:“提取”该信号的 mel 谱图,我们获得一个具有单通道的图像(不同于传统的 3 通道 RGB 图像),该图像具有确定的高度(这取决于用于 STFT 的跳数大小)和宽度×25取决于音频样本的原始长度。********

然而,众所周知,处理具有可变尺寸的图像是一项具有挑战性的任务,尤其是如果我们事先没有决定这些尺寸的话。这就是为什么我们将分割所有光谱图(形状 XxHX 不同)成确定宽度,让我们说 L 。完美!我们的数据集现在由具有已知尺寸* ( LxH )的源和目标光谱图组成,我们已经准备好进行下一步。***

Each spectrogram in the dataset has a fixed height H and width L

在创建我们的生成器 G 之前,我们需要指定其输入的尺寸,在我们的例子中是 (L/2)xH 。换句话说,G 将接受我们数据集中宽度为一半的光谱图。为什么?因为这样我们就能让 G 翻译我们之前拆分的整个* XxH 光谱图。让我们来看看是如何做到的。*****

我们的培训管道将包括以下行动:**

  1. LxH 谱图分成两半,得到 (L/2)xH 谱图**
  2. 将两半对送入发电机,并将平移的两对作为输出**
  3. 将平移的两半连接回它们的原始形状* ( LxH )***
  4. 翻译的目标LxH 光谱图送入鉴别器,使区分对抗训练**

Illustration of the training pipeline: splitting, converting and concatenating.

使鉴别器检查连接的“假”光谱图,将“真实”目标光谱图进行比较,迫使发生器生成样本,当连接在一起时,产生真实光谱图。****

换句话说,转换后的 (L/2)xH 样本不得在边缘上出现任何不连续,这将使它们在鉴别器看来不真实。因此,发生器上这个重要的约束允许我们将任意长度的音频信号从一个域转换到另一个域。**

训练后,当想要翻译一个任意形状的声谱图 XxH 其中 X 变化并由原始音频信号的长度给出时,这是我们需要做的:**

  1. XxH 谱图分割成 (L/2)xH 块,如果 X 不能被 L/2 整除,则使用填充
  2. 每个 (L/2)xH 样本送入发生器进行翻译
  3. 连接转换后的样本为原始 XxH 形状,如果使用了填充,则剪切掉多余的部分。

在用 Griffin-Lim 算法将其变回波形之后,最终翻译的样本不应呈现* 不连续,而应呈现与目标域(特定的语音或音乐流派)相同的风格。很简单,不是吗?***

Examples of source and converted spectrograms: the concatenated samples do not present discontinuities

把所有东西放在一起

我们之前已经学习了如何保存来自源音频样本的内容(在语音的情况下,它将是一些言语信息,在音乐的情况下,它将是一首歌曲的特定旋律,而没有在视觉上相似的域之间进行转换的约束(不同声音或音乐流派的频谱图在视觉上可能极其不同)以及允许我们转换任意长度的样本的简单而有效的技术**

现在终于是时候把所有的事情整合在一起了。

这是我论文中的一段摘录,介绍了这项技术:****

Putting everything together: the siamese network helps preserve content keeping vector arithmetic between source and converted samples

梅尔根-VC 训练程序。我们分离频谱样本,将它们馈送到发生器 G,将它们连接在一起,并将结果样本馈送到鉴别器 D,以允许无差异地翻译任意长度的样本。我们在传统的生成器-鉴别器 GAN 架构中添加了一个连体网络 S,以在潜在空间中保留矢量算法,从而在翻译中对低级内容进行约束。在还需要保存高级信息(在语音翻译的情况下是语言信息)的任务中添加了可选的身份映射约束。

此外,我们必须为暹罗网络增加一个边际损失,以避免它从退化为学习一个平凡函数来满足它的目标。边际损失使得 S 产生的所有向量彼此远离,因此网络不能将相同的精确向量与每个输入相关联,并且必须学习有意义的关系*创建有用的潜在空间。*******

where delta is a fixed value and t is the transformation vector

最后,下面是用于训练三个网络的形式损失:**

Final losses for generator G, discriminator D, siamese network S

值得注意的是,添加的身份约束(来自目标域的样本和由生成器翻译的那些相同样本之间的均方误差)仅在语音翻译的情况下有用,其中语言信息必须被保留,并且其中我们的内容丢失(基于暹罗网络的向量输出)努力捕获那些高级别信息。**

如果你在寻找关于这种特殊技术的更多信息,或者如果你更喜欢一个更正式和系统的解释,我推荐并邀请你阅读我的全文。****

结论

今天,我们已经学习了如何使用深度卷积神经网络架构和一些技巧和技术来执行语音翻译音频风格转换(如音乐流派转换),以实现对任意长度音频样本的逼真的翻译。**

我们现在知道,我们能够利用大部分最近关于深度学习的研究用于计算机视觉应用,也解决与音频信号相关的任务,这要归功于图像等效频谱图表示。**

最后,我想以承认这样一个事实来结束我的发言,即可能会为了恶意目的而误用这种和其他技术,尤其是在语音翻译的情况下。随着强大的机器学习方法的兴起来创建真实的虚假数据我们在探索和使用这种算法时都应该非常警觉和谨慎:虽然研究不会停止也不应该停止,我们也应该分配资源并研究如何检测我们帮助创建的虚假数据**

非常感谢您宝贵的关注,玩得开心!**

另外,如果您对 GAN 和 GAN 相关的现成想法和应用感兴趣,您也应该查看:**

一年来我训练甘斯的 10 个教训(如果你对帮助你完成超级挑战任务的技巧和窍门感兴趣,那就是训练甘斯)****

在高清图像上使用 GANs 进行风格转换(我使用了类似的技术,允许使用很少的计算资源进行大图像的风格转换)

以新的方式看待甘斯(我在这里详细探讨了潜在空间是如何工作的,以及它如何被用于图像到图像的翻译任务)

用生成式对抗网络合成音频(在这里我研究了一篇论文,该论文提出使用卷积 gan 来使用原始波形数据和一维卷积生成音频)

Voronoi 方法:分区学校系统提案

原文:https://towardsdatascience.com/voronoi-method-zoning-school-system-proposal-8ea333e9ece1?source=collection_archive---------36-----------------------

source : unplash.com

也许现在讨论这件事有点太晚了。因为分区学校系统现在不是一件事,但在 2019 年 5 月和 6 月左右,它在印度尼西亚是一件大事。

印度尼西亚有一个新的规则(紧接着是另一个规则)来创建类似“分区系统”的东西,未来的学生不能选择他们区域之外的下一级学校。然而,老实说,我真的不太明白这个规则。所以,这里有一篇巴哈萨语的文章,是关于这条规则以及政府颁布这条规则的原因。

[## 2019 年 PPDB 赛区系统。身份证明

tirto.id -巴鲁(PPDB) 2019 年奥运会将于 2019 年举行。

tirto.id](https://tirto.id/memahami-sistem-zonasi-sekolah-di-ppdb-2019-ecEz) [## 9 点,2019 年 PPDB 地区系统会议召开

kompas . com ----教育和科学部(Mendikbud)的多名官员有效地提出了几项建议……

edukasi.kompas.com](https://edukasi.kompas.com/read/2019/06/20/11111981/9-poin-buka-bukaan-mendikbud-soal-sistem-zonasi-dan-ppdb-2019?page=all)

那里的所有规则都产生了许多来自公众的病毒式负面反馈,如下所示:

  1. 一些学生不能上学,因为他们只能选择一所已经满员的学校(半径规则)。
  2. 有些学校招不到足够的学生,因为他们所在的地区不够密集。
  3. 区域间质量不平衡。

点击这里了解问题的细节。

我不会谈论这些规则,以及这些规则如何对印度尼西亚未来的学生产生重大影响。此外,我不会责怪规则本身,因为我不知道印度尼西亚政府是如何制定这条规则的。然而,在这篇博客中,我想提出某种方法来解决这个“分区问题”,这种方法可能可以将负面影响降至最低。我将展示我是如何做分析的,并以方法结束。

定义问题

每一个分析都必须从问题定义开始,以北极星作为真正的目标。在这个博客中,我的目标是做一个分区学校系统,将上述第一个负面影响降到最低。我将问题限制在最小化第一个问题,因为我只有有限的数据可以处理。第二个问题也许可以用密度人口数据解决,同时,第三个问题应该用所有学校的标准化质量。

因此,基于我的目标,我的问题陈述是

“如何创建分区学校系统,让未来的学生至少有 3 所学校可以选择?”

数据收集

有了问题陈述之后,接下来要做的就是获取适合问题的数据。我需要印度尼西亚所有学校的经度和纬度位置,这样我就可以定义这个区域。我从这个来源获得数据,我认为这个来源对任何人都是开放的(至少在印度尼西亚)。所以,我抓取了所有列出的可能的学校及其信息。

Get the Longitude and Latitude

我花了大约两天的时间获得正确的数据,我得到了大约 200,000 所各级学校的数据:小学(SD),初中(SMP)和高中(SMA/SMK)。我不确定数据的质量,但当我试图从网站上绘制所有的经度和纬度时,结果如下。

Probably All School Location in Indonesia

它显示了印度尼西亚的地图,因此该图可以确认数据的质量足够好。为了与真实地图进行对比,我用 python 从这个源中读取了印尼城市层面地图的 shapefile。

Indonesia’s Map

即使有几乎相同的形状,在检查数据后,几乎有 2%的点不完全在城市多边形内。面外的点将从方法分析中移除。这是一个来自“泗水”的例子,它有多边形外的点(红点)。

Surabaya All School Location’s

为了进行简单的探索,这是印度尼西亚每个城市在网站上正式注册的学校总数的热图。红色区域是一个缺失值,因为 shapefile 和报废数据的命名约定不同。地图显示爪哇岛(南面黄色的大岛)比其他岛屿发展了更多的学校。此外,除了爪哇岛, 学校的数量在空间上不相关 。例如苏门答腊岛(西边的大岛),它有一个被绿色区域包围的黄色区域。

Total School in Every City of Indonesia

Radius 主体概述

在提出这种方法之前,让我们看一下使用半径原则的分区系统。方法并不复杂,未来学生学校区就在离家 X 公里的半径范围内。

Radius Principal

所以,学生不能选择离他们家很远的学校(红色区域)。如果保证在这个区域内有学校,这个校长可能会工作。让我们使用印度尼西亚学校位置数据来模拟这种方法。

模拟很容易,只需在一个特定城市的多边形上选取许多随机点,并对学校的不同半径进行迭代(从学校点改变半径比随机点更容易,结果是一样的)。随机点被假设为学生住宅,如果城市足够密集,这个假设可以实现。因为我们不希望随机点最终出现在森林中间或废弃的湖中。因此,基于某些参考资料,模拟在 DKI 雅加达、哥打泗水、哥打棉兰、哥打万隆、哥打望加锡和哥打巨港进行。需要注意的是,的模拟只使用位置的高中(SMA)数据。

这是泗水上的模拟例子,颜色显示了特定半径内每个随机点将获得的学校选择数量。红点是泗水的 SMA 位置。

对总体密集城市的模拟表明,对于不同的地区,所有学生获得最少 3 所学校选择的概率是不同的。下图显示了在许多不同的城市(用颜色区分)中,学生从他们家(x 轴)的一定半径范围内获得至少 3 个学校选项(y 轴)的概率(百分比)。因此,预计 x 轴越高,直线越接近 100。

该图描述了即使半径为 X= 4 公里,仍有某个区域像巨港一样,其概率低于 80%。就算是一个叫万隆巴拉特的城市,半径 X =5 公里也达不到 60%。

这意味着学生需要至少行驶 5 公里才能获得至少 3 个学校选择的概率为 60%,以获得万隆巴拉特的所有学校。而且,这里的半径采用欧几里德距离,所以现实生活中的真实距离可能比 5 公里更远。

总之,半径原则更适合用于人口密度高的城市。但是,如果必须对不同密度的所有城市实施这些方法,那么 半径距离应该对不同的区域有所不同 取决于人口密度。甚至可以将城市划分成某些更小的区域,并对这些区域采用不同的半径。不仅如此,发展新学校对于那些学校数量很少的地区也是必要的。因此,学生将有不同的学校选择,他们不应该把时间花在路上。

提议的方法

分区系统真的很有挑战性,尤其是像印度尼西亚这样全是小岛的地区。上述半径原则缺乏多样性,需要更多的探索来确定正确城市的正确半径。如果学生来自不同的岛屿,比如望加锡,这也是一个不利因素。如果到最近学校的岛距大于半径,那么那个岛上所有学生到校的可能性几乎为零。

Makassar has many smalls island

因此,提出了一种称为 Voronoi 的新方法来最小化确定半径的耗时探索。Voronoi 是一种将平面分割成靠近给定对象集合中每个对象的区域的方法。假设我们有一个平面,平面上有一些点,Voronoi 的目标是创建每个区域都比其他点更靠近某个特定点的区域。

Voronoi diagram example (source)

假设我们有一张地图和所有学校的位置,Voronoi 将自动为每所学校创建区域,这样该区域中的每个学生都比其他学校更靠近该学校。然而,这意味着如果他们必须进入最近的学校,每个学生只有一个学校选项可以选择。因此,学校集群被提议创建一个更大的区域,在那里学生可以有 3 个学校的最低选择。现在,我提出了 KMeans 来对每个城市的学校进行聚类(最好使用 HDBSCAN 作为将来的参考),这导致了另一个选择聚类数的问题。在这种情况下,可以使用轮廓分数来评估集群编号,其中我们将选择具有最高分数的集群编号。必须记住的是 这里所有的学校都被假定为具有相同的质量 以防止来自所有不良学校的群集。

总之,这是所提出方法的算法

Pseudocode of the Algorithm

这是望加锡万隆巴拉特的算法结果。

Senior High School (SMA) Proposed Zoning System

Voronoi 方法将确保城市中的每个学生至少有 3 个选择学校,它解决了以前万隆巴拉特的“60%问题”。Voronoi 也帮助远岛上的学生有机会上学。

然而,对于一些区域,如万隆巴拉特的棕色区域(左下方),平均而言, 学生必须旅行相当长的时间, 因为该区域相当大,只有 3 所学校可供选择。这可能表明 Voronoi 方法将不会解决“该区域中所有学校已经满员”的问题。这个问题也出现在绿色区域的巨港和紫色区域的泗水(左上)。

Surabaya and Palembang Proposed Zoning School for SMA

结论和建议

分区制度的建立是为了实现教育质量的平等,这样就不会有高等或低等的教育区域。即使有良好的意图,糟糕的分区系统和不规范的学校质量将使教育系统看起来很糟糕,并减少许多学生进入学校的权利。

如模拟所示,对于印度尼西亚,在相同的半径下,学生获得至少 3 所学校选项的概率是不同的。在雅加达和巨港两公里半径范围内,这种可能性几乎达到 100%,但在同样的半径范围内,这种可能性在巨港大约为 50%。由此可见,半径距离对于不同的区域应该是不同的。

带 KMeans 聚类的 Voronoi 图 是另一种比半径原理更好的方法,可以覆盖半径问题。Voronoi 图可以为每个学校创建一个最佳区域,这样就不会有学校选项超过 3 个的区域。然而,如果一所学校覆盖了一个很大的区域,就会出现问题,因为附近的学校数量很少。

因此,要想取得更优的解决方案,这里可以做一些动作

  1. 在沃罗诺伊地区的学校周围建造更多的学校。或者扩展具有大 Voronoi 区域的学校。
  2. 对学校质量多做分析,给印尼所有城市做一个标准质量。这里在设施、教师数量和班级方面的质量。因此,我们可以使用群集进行分区,其中群集间的总体质量是相同的。
  3. 此外,对于短期解决方案,增加学生的公共交通,使他们能够到达遥远的学校,而不是通过半径原则限制他们的选择。

参考

[## alam hanz/教育区

它始于印度尼西亚政府的新 Zonasi 规则,这似乎对某些人不公平(基于病毒式新闻)。这个…

github.com](https://github.com/alamhanz/education_zone/tree/master) [## Voronoi 图实验室

除了直接读入 CSV 文件。Pandas 内置了一个读取 JSON 文件的函数。本节…

comet.lehman.cuny.edu](http://comet.lehman.cuny.edu/owen/teaching/datasci/voronoiLab.html)

Vue。js Vs angular . js:Web 开发中性能最好的 JavaScript 框架是哪一个?

原文:https://towardsdatascience.com/vue-js-vs-angular-js-which-is-the-best-performing-javascript-framework-for-web-development-f5f6a9ef4038?source=collection_archive---------19-----------------------

随着时间的推移,在流行的 Javascript 框架之间做出选择变得越来越具有挑战性。在这篇博客中,我们希望能轻松地做出这个决定。

谈到 web 开发,JavaScript 框架是目前 web 开发公司的热门词汇。

每个人都在不停地讨论 JS 库和关于 JS 的“大 2”——Angular 的争论。JS 和 Vue。JS”一天比一天严重。

根据 2019 堆栈溢出报告 显示,67.8%的开发者使用 Javascript,并使其成为网站开发社区中流行的编程语言。另一方面, JavaScript 是最复杂的编程语言,因为 8.36%的 JS 代码被深度嵌套。

JavaScript 明日之星报告 已经追踪到 GitHub 上添加的星星数量。结果 Vue,React,Angular.js 是 2018 年最受欢迎的 js。 Vue 以 45.3K+位居星数榜首,历史上首次超过 React 和 Angular。 然而,GitHub 星级并不是理解 JS 框架的唯一途径;相反,它们描绘了网络发展的最新趋势。不用担心;这篇博客已经涵盖了其他各种统计数据,这些数据显示了主导前端框架的更全面的情况。

选择一个技术堆栈有时是一项令人烦恼的任务,因为你需要考虑各种因素,包括运行时性能、灵活性、维护、最终用户、预算等等。

无论你是新手、开发者还是自由职业者,为你的网站建立一个架构师是每个人的基本任务。这篇文章不仅能帮助你选择最佳方案,还能帮助你做出最终决定。读完这篇博客后,你可以根据你的项目范围和框架与你的需求的兼容性来选择最好的一个。然而,这篇文章将通过详细的比较以及趋势和见解帮助你更好地理解每个结构。

咱们之间的战斗开始了 Vue.js VS Angular。Js 2019…

Vue Js。Vs Angular.Js:了解 Big 2 的基础知识

Vue Js。Vs Angular.Js:受欢迎程度和市场趋势

Vue Js。Vs Angular.Js:运行时性能

Vue Js。Vs Angular.Js:学习曲线

Vue Js。Vs Angular.Js:社区支持和进步

Angular 与 Vue。Js:大小和加载时间

Vue Js。Vs Angular.Js:更简单的集成

什么时候选择有角度的。应用开发的 Js?

当考虑 Vue 时。软件开发项目的 Js?

你的决定是什么?

为了更好地理解,让我们深入挖掘每一点,并做出明智的决定。

1。Vue。Js Vs Angular。Js:了解 Big 2 的基础知识

棱角分明。JS 在 2010 年作为基础版本发布。它是由 Google 开发的,被称为基于类型脚本的 JavaScript 框架。在发布了几个版本之后,现在 Angular V7 是现在可用的最新版本,于 2018 年 10 月推出。

在这个科技时代,棱角分明。JS** 在当今数百万开发者使用的主流技术中迅速树立了标杆。因为棱角分明。JS 不仅仅拥有优秀的发布时间,还提供了令人难以置信的结构。它提供了简单的双向数据绑定、MVC 模式和内置的模块系统。由于这个原因,许多开发人员更喜欢使用这个前端 Js 框架。**

当谈到 JavaScript 的三巨头时,Vue。Js 是小组中最年轻的成员。它是由前谷歌员工尤雨溪在 2014 年开发的,凭借其出色的性能和流畅的功能迅速风靡全球。

Vue。JS 是一个用于构建用户界面的渐进式框架。与 Angular 等技术驱动的框架相反。JS,Vue。JS 已经被构建为逐渐被用户采用。感谢 Vue。Js 的特性使其成为 GitHub 上最受欢迎的 JS 框架,但是使用 Angular 的网站比例越来越高。JS,让它战胜 Vue。****

图像来源

2。Vue。Js Vs Angular。Js:流行和市场趋势

如果我们分析一下角度的各种趋势。w3techs 上的 JS 和 Vue,我们得到如下结论:

****用途及市场份额:根据 w3techs 的报道,Angular。0.4%的网站使用 JS,而 Vue。Js 在 0.3%。

图像来源

使用各自 JS 库的网站排名: 0.8%使用 Angular。JS,还有 0.5%是 Vue。所有网站的 Js,这些网站的 JS 库我们都知道,并且已经排在前 100 万名。

图像来源

****历史趋势:w3techs 的专门调查,代表使用所选技术的网站百分比的历史趋势。

图片来源

3。Vue。Js VS Angular。JS 性能:谁更好?

说到评估 Js 的框架的性能,Vue。Js 是顶级 网络开发公司 中日益增长的感觉!

棱角分明。JS 结构由大量代码组成,但确保了高功能性,而 Vue。Js 是灵活的、轻量级的,并在高功能性上提供卓越的速度。而在大多数情况下,Angular 的广泛特性和功能。应用程序没有使用 JS,尽管专门的 web 开发团队选择了 Vue。Js over Angular.JS。

而所有的功能都应该通过 Vue 中的附加扩展来添加。Js,最终使它比 Angular 更适合初学者。JS 框架。然而,精心打造的棱角分明的结构。JS 为开发需要大量功能的应用程序提供了绝佳的机会。

同时,如果你比较功能性,角度。JS 可以很死板但是 Vue。Js 固执己见。这意味着,Vue。Js 为开发人员提供了自由,让他们可以按照框架的意图开发应用程序。

更多阅读: 寻找顶尖的 JavaScript 框架?以下是 2020 年值得关注的顶级图书馆!

棱角分明。JS Vs Vue。Js:哪个适合你?

图像来源

在考虑速度和性能的时候,有角度。JS 是充分利用框架特性的动态项目的理想选择。另一方面,Vue。对于需要快速处理和更强大功能的小型项目,Js 是更好的选择。****

4。Vue。JS Vs Angular。JS:学习曲线

你准确的知道 JavaScript 吗?

嗯,每个前端 JS 框架的学习曲线取决于你的知识和经验水平…

都有棱角。JS 和 Vue。JS 利用 HTML 和 CSS,但是因为 Angular 的高级版本。JS 的开发是为了适应大规模的应用,涉及到繁重的代码结构,因此你需要 雇佣专门的开发人员 来确保 C#和 Java 等语言的类型安全。因为最新版本的 Angular。JS 使您能够实现大规模的应用程序,因此,它需要更深入的学习曲线。

相比之下,Vue 也有助于你通过使用 Vue 来开发大规模的应用程序。Js 开发公司,但这在 Vue 中仍然是可选的。

5。Vue Js。Vs 棱角分明。Js:社区支持和进步

毫无疑问,作为 JavaScript 最古老的框架,Angular。与 Vue 相比,JS 有更多的社区支持。JS 为 Google 提供了广泛的代码编辑器。此外,对于最新的功能,包括惰性路由的导入、CLI 工作流改进、对 Node 10 的支持以及对 TypeScript 3.4 的支持,您可以使用最新版本的 Angular 8。

而 Vue 的答案。Js 在于,它是一个开源的框架,在市场上被高度认可,用来开发单页 web 应用。此外,这个框架的最新版本还包括了其他特性,比如异步错误处理、带有源信息的模板编译警告、动态指令参数等等。

6。Angular 与 Vue。Js:大小和加载时间

在 JavaScript 框架之间做出选择时,库的大小是一个需要考虑的重要因素,因为在某些情况下,运行时间取决于文件的大小。

角度:500+KB

Vue: 80 KB

虽然棱角分明。JS 为您提供了广泛的功能,但无疑体积庞大。虽然 Angular 的最新版本可能已经大大减少了应用程序的大小,但它仍然没有使用 Vue 开发的应用程序轻。Js 框架。当应用程序的加载时间主要取决于应用程序的大小时,Vue。Js 手机 app 确保加载速度比 Angular.JS 更快

7。Vue。Js Vs Angular。Js:更简单的集成

使用框架时,您和您的团队集成应用程序的难易程度如何?

虽然整体部署的角度。JS 对于即使是专注的开发者来说也是相当复杂的。但是如果你用的是 Angular CLI,你就赢了一半。虽然 CLI 可以通过一个命令处理从项目创建到代码优化的所有事情,但您可以通过一个命令将应用部署到任何静态主机。

为了 Vue。Js,您还可以使用 CLI 来生成预配置的健壮设置,以便轻松开发应用程序。Vue 的发展。Js 和 Angular 一样简单,你可以得到优化的项目,运行在一个内置的命令上。Vue 的部署。Js 项目并打开服务器端呈现相对容易。

阅读更多:看看为什么这些顶级网络发展趋势&技术将统治 2020 年

Vue。Js VS Angular。js:2019 年 Web 开发哪个最好?

两者都有 CLI 支持,但相对而言,Angular 在管理和部署应用程序时优势很小。

T5 . a .什么时候挑棱角分明的。你的 App 开发项目的 JS?

棱角分明。JS 是理想的选择:

你需要开发一个复杂的、大型的、动态的 app 项目。

你想要一个像即时消息和聊天应用程序这样的实时应用程序。

您需要可靠和简单的可伸缩性。

您可以花时间学习 TypeScript 来开发应用程序。

B .应该什么时候挑 Vue。Js?

尽管是 JavaScript 三巨头中最年轻的成员,但它是许多软件开发公司的热门选择。您应该在下列情况下选择:****

你需要开发一个轻量级的单页应用程序。

您需要高速度、灵活性和高性能。

你想要一个小规模的应用。

你正在寻找明亮和简单的编码。

你的最终决定

在开发应用程序时,这两个框架都将为专门的开发人员提供很好的结构。然而, Vue。Js VS Angular。JS:哪个比较好?这个问题让我们进退两难…

正确框架的选择取决于所讨论的各种因素;你可以考虑做最后的决定。如果你想要一个行业专用的、结构良好的结构- 雇佣训练有素的 web 开发人员 来提供 Angular。JS 开发服务是必由之路。另一方面,如果你的项目需要单页布局,快速处理,干净的编码,那么没有比考虑 Vue 更好的选择了。Js 为您的项目提供 web 开发服务

通过支持向量回归和 LSTMs 进行股票价格预测

原文:https://towardsdatascience.com/walking-through-support-vector-regression-and-lstms-with-stock-price-prediction-45e11b620650?source=collection_archive---------2-----------------------

使用 python、scikit-learn 和 Keras 了解 LSTMs 和支持向量回归

Image via Pixabay
Free for commercial use under Pixabay License
source

人工智能(AI)无处不在。机器学习和人工智能正在彻底改变现代问题的解决方式。应用机器学习的一个很酷的方法是使用金融数据。金融数据是机器学习的游乐场。

在这个项目中,我使用支持向量回归和 sci-kit-learn 分析了特斯拉的收盘价,并使用 Keras 分析了 LSTM。这是我的第二个机器学习项目,我一直在学习大量关于机器学习和数据科学的信息。如果你喜欢这个,看看我的另一个项目,在那里我创建了一个卷积神经网络来识别尼古拉斯·凯奇的图像。

当使用像 LSTM 算法和其他算法这样的技术分析金融数据时,重要的是要记住这些并不能保证结果。股票市场难以预测,瞬息万变。这只是一个有趣的项目,学习使用神经网络进行股票分析的一些基本技术。这不是一篇声称这项技术会让你成为百万富翁的文章,因为它绝对不会。

目录:

  1. 获取我们的数据:
  • 进口
  • 获取股票数据
  • 修复我们的数据

2.可视化我们的数据:

  • 绘制我们的数据
  • 滚动平均值

3.支持向量回归:

  • 转换日期
  • 线性回归
  • 支持向量机
  • 支持向量回归演练
  • 使用 sklearn 和可视化内核的 SVR 代码

4.深度学习:

  • 为神经网络标准化和准备我们的数据
  • 递归神经网络
  • LSTM 漫游
  • 拒绝传统社会的人
  • 我们模型的代码

5.结果是:

  • 绘制模型损耗
  • 做出预测
  • 结论
  • 资源

进口:

这里我们导入:

  • 来创造我们的神经网络
  • 熊猫和熊猫 _ 数据阅读器获取和分析我们的股票数据
  • datetime 来确定我们的股票日期,以便进行数据分析
  • 重塑我们的数据,输入我们的神经网络
  • matplotlib 来绘制和可视化我们的数据
  • 警告忽略弹出的任何不想要的警告

获取我们的股票数据:

  • 这段代码将我们的绘图样式更改为 ggplot。我把样式改成了 ggplot,因为我更喜欢它的样子。在这里阅读更多关于 ggplot 的内容。
  • 然后,我们使用 pandas_datareader 作为“web ”,使用 datareader 函数获取我们的股票价格数据,该函数获取财务数据并将其存储在 pandas 数据帧中。
  • 我们获得了 2014 年至 2018 年的特斯拉股票数据来训练我们的模型。
  • 我们获得从 2019 年到今天的特斯拉股票数据,让我们的模型进行预测。
  • “TSLA”是特斯拉的股票代码,我们指定“雅虎”来使用雅虎金融 API 获取数据。

修复我们的数据:

  • 因为我们在做时间序列预测,所以我们希望我们的数据是连续的。我们按日期对训练和测试数据进行分类。
  • 然后,我们重置指数并设置数据框架的指数,以确保我们的股票价格日期在数据框架中是一列。

绘制我们的数据和滚动平均值:

2014–2018 Tesla closing stock prices

Rolling mean plotted on our data

  • 我们从数据框架中获得调整后的收盘价,并在数据上绘制滚动平均值。
  • 滚动平均也称为移动平均。移动平均线帮助我们消除有大量波动的数据,并帮助我们更好地看到数据的长期趋势。
  • 使用移动平均线,您可以定义一段时间,您想要取其平均值,这就是我们的窗口。我们将移动平均窗口定义为 100。我们定义 100 是因为我们希望在数据中看到长期的移动平均值。

数学:

  • 移动平均线的工作方式是将连续 100 天的价格相加,然后除以 100 得到平均值。然后我们将窗口向右移动一位。所以我们去掉第一个价格,在最后加上一个新的价格。
  • 另一种理解滚动平均值的方法是将它看作一个由 100 个价格组成的数组。我们将所有元素相加,然后除以 100,得到我们的平均值。然后我们移除位于a[0]的元素,在数组的末尾追加另一个价格。然后,我们再次对所有元素求和,然后除以 100,得到我们的下一个平均点。

转换日期:

  • 在这里,我们创建了 dataframe 的副本,并将其命名为 dates_df。我们将原始日期存储在 org_dates 中。稍后我们将使用 org_dates 来绘制我们的预测和日期。
  • 然后,我们使用 mdates.date2num 将我们的 dates_df 日期转换为整数。我们需要整数形式的日期,因为您无法将日期输入支持向量机和神经网络。

线性回归

  • 线性回归是一种寻找两个变量之间最佳线性关系或最佳拟合线的方法。
  • 有了给定因变量(x)的最佳拟合线,我们可以预测我们的自变量(y)。
  • 线性回归的目标是找到最适合我们数据的直线,使预测的 y 值尽可能接近我们给定的已知 y 值
  • 线性回归的等式为 Y = A + B * X,其中 X 是预测值,Y 是根据 A、B 和 X 计算的预测值,B 是系数,A 是截距,它们都是回归的估计值
  • 这也是一个有用的线性回归图像:

Image via Wikipedia
Free for commercial use under Wikipedia commons license
source

  • 因此回归试图通过最小化成本函数来学习我们数据的最佳 A 和 B 值。通常用于线性回归的成本函数是均方误差(MSE)。下面是 MSE 的等式:

Image via Wikipedia free for commercial use under the Creative Commons Attribution-ShareAlike License Source

  • 因此,在我们的例子中,我们将试图在日期和股票价格之间找到一条最佳匹配线。由于我们的数据有如此多的波动,因此没有最佳拟合线可以用于线性回归,从而为我们提供良好的股票预测准确性。因此,在我们的情况下,仅使用线性回归是不准确的。具有线性关系的数据,如根据房子的大小预测房价,就是线性数据的一个例子。

支持向量机:

  • 支持向量机用于分类。SVM 的目标是在图上定义两个类之间的边界线。我们可以认为这是以最好的方式“拆分”数据。这条边界线叫做超平面。
  • SVM 中的超平面在两个类之间有一个“余量”或距离。构成空白的这两条线是从超平面到每个类中最近的数据示例的距离。这些线被称为边界线。
  • 分割过程完成后,SVM 可以根据单个数据点在图表中的位置来预测其应属于哪个类。下面是一个有助于形象化的图表:

Image via Wikipedia free for commercial use under the Creative Commons Attribution-ShareAlike License Source

  • 如您所见,我们在中间有一个最佳超平面,然后有两条虚线作为边界线,它们穿过每个类中最近的数据点。
  • 使用 SVM 确定边界线时,我们希望这两个类之间的距离尽可能宽。这将有助于 SVM 在看到需要分类的新数据时进行归纳。

支持向量回归演练:

  • 既然我们对线性回归和支持向量机有了基本的了解,支持向量回归就是支持向量机和回归的结合。
  • 线性回归对我们的数据不起作用,因为我们的数据有许多波动,最佳拟合的线性线对股票数据的预测很差。SVM 不会对我们的数据起作用,因为我们没有在两个不同的类之间进行分类。
  • 对于股票数据,我们不是预测一个类,而是预测一系列中的下一个值。
  • 使用回归,我们尝试使用类似梯度下降的东西来最小化成本函数。使用支持向量机,我们试图在两个不同的类之间画一个超平面。所以 SVR 是 2 的组合,我们试图在一定的阈值内最小化误差。下面是 SVR 上一篇有帮助的文章中的一张惊人图片,有助于可视化 SVR:

  • 蓝线是我们的超平面,红线是我们的边界线。我希望你能开始看到我们是如何结合支持向量机和回归的思想。我们试图在某个阈值内准确预测值。
  • 所以我们把我们的边界线定义为+eplison 和-eplison 来构成我们的边距。Eplison 是从我们的超平面到每条边界线的距离。
  • 然后我们可以定义我们的回归线为 y=wx+b
  • 我们的目标是最小化误差和最大化边缘距离。
  • SVR 最酷的地方在于它可以用来预测非线性阈值范围内的值。下图有助于形象化 SVR 的外观:

使用 sklearn 和可视化内核的 SVR 代码:

SVR fitting our data

  • 在这段代码中,我们使用 Sklearn 和支持向量回归(SVR)来预测数据的价格。
  • 如您所见,非常符合数据,但很可能过度拟合。这个模型很难概括一年来看不见的特斯拉股票数据。这就是我们的 LSTM 神经网络派上用场的地方。
  • 我们从数据中获得调整后的收盘价和日期,作为整数。我们将数据整形为 1D 向量,因为我们需要将数据输入 SVR。
  • 核是将低维数据映射到高维数据的函数。我们定义我们的核为 RBF。RBF 代表径向基函数。RBF 的等式如下:

  • 这是 RBF 的核函数方程。RBF 将我们的 2D 空间转换到一个更高的维度,以帮助更好地适应我们的数据。该函数取两个样本之间的平方欧几里德距离,并除以某个σ值。sigma 的值决定了我们的曲线拟合或数据有多“紧密”。
  • 为了帮助更好地理解 RBF 如何将我们的数据转移到更高维度的空间,我根据 Brandon Rohrer 的这个视频制作了一个 gif。这显示了线性超平面如何不能分离 4 组数据点。因此,我们使用一个核函数将我们的数据转换到一个更高的维度,并“拉伸”我们的数据空间,以将我们的数据点归入不同的类别:

Gif of kernel functions via Brandon Rohrer under license Creative Commons Attribution license (reuse allowed) source

  • c 是正则化参数。这是您希望避免对每个培训示例进行错误分类的程度。
  • 对于较大的 C 值,该算法将选择一个较小边界的超平面。
  • 对于小的 C 值,该算法将寻找分隔超平面的大的余量,即使这意味着错误分类一些点。下面是一个有用的形象化的 C 值大小之间的差异。

Source

  • 在我们的例子中,我们选择我们的 C 值为 1e3,这是一个很大的 C 值,这意味着我们的算法将选择一个较小的边界超平面。
  • 根据 sklearn 文档,“伽马参数定义了单个训练样本的影响达到多远,低值意味着‘远’,高值意味着‘近’。”
  • 换句话说,当决定超平面的位置时,只考虑边界线附近的高伽马点。并且当决定超平面的位置时,考虑靠近和远离边界线的低伽马点。下面是另一张有助于形象化的图片:

标准化我们的数据:

  • 在这里,我们创建我们的训练数据,并将其标准化。我们使用 sklearn 创建一个 MinMaxScaler()对象。
  • MinMaxScaler 的工作原理是将我们的值的范围缩小到 0 或 1
  • 下面是最小-最大缩放器的公式:

  • 这是 sklearn 在后台做的方程,把我们的数据转换成我们想要的范围。

为神经网络准备数据:

  • 这里我们创建了“create_dataset”函数。该函数从(0 到数据集长度,即时间步长数)开始循环。
  • 因此,X_train 数组中的每个指数都包含一个 36 天收盘价的数组,y_train 数组包含我们的时间步长后一天的收盘价。
  • 因此,换句话说,我们将前 36 天的股票收盘价数据输入神经网络,然后让它预测第二天的收盘价。
  • 这可以通过打印输出来可视化:

递归神经网络;

  • LSTM 代表长期短期记忆。LSTMs 是递归神经网络的高级版本。递归神经网络(RNN)是一种特殊类型的神经网络。rnn 将以前的输出作为输入。在 RNNs 中,前一个输出影响下一个输出。下面是克里斯托弗·奥拉写的这篇令人惊叹的文章中一个 RNN 的形象:

  • “递归神经网络可以被认为是同一网络的多个副本,每个副本都向后继者传递信息。”克里斯·奥拉
  • 递归神经网络受到消失梯度问题的困扰。在反向传播(在神经网络中更新权重的递归过程)期间,每层的权重被更新。然而,使用 RNNs 和消失梯度,梯度变得如此之小,因为它继续更新每一层。当反向传播通过各层传播时,当它到达第一层时,梯度值是如此小的值,以至于它对权重的改变几乎是不明显的。由于只做了很小的改变,这些初始层不会学习或改变。
  • 因此,换句话说,对于较长的数据序列,rnn 会忘记它们在早期层中看到的内容,并且由于消失梯度问题而无法正确学习。例如,如果您有多个文本段落,并且您正在尝试预测句子中的下一个单词,RNNs 将不会记住模型已经看到的前面段落中的单词。这就是 LSTMs 有用的地方。

LSTM 漫游:

LSTM 是一种 RNN,每个 LSTM 单元内部都有门。我喜欢把 LSTM 细胞想象成一个细胞,每个细胞内部都有自己微小的神经网络。LSTM 细胞中的这些门帮助 LSTM 决定哪些数据是重要的,哪些数据可以被记住,即使是在一长串数据中。门的类型有遗忘门、输入门和输出门。下面是这个视频中这些 LSTM 细胞的惊人可视化效果。这个部分受到这个视频和这篇文章的很大影响,因为它们的解释非常棒:

所以 LSTMs 和 rnn 一样是连续的。前一个单元的输出作为输入向前传递到下一个单元。让我们来分析一下 LSTM 细胞内部的每个门在做什么:

门包含 s 形激活功能。乙状结肠激活函数可以被认为是“挤压”函数。它接受数字输入,并将数字压缩到 0 到 1 的范围内。这很重要,因为它可以让我们避免网络中的数字变得庞大,从而导致学习错误。

忘记入口:

遗忘门从先前的 LSTM 单元和当前输入中获取先前的隐藏状态,并将它们相乘。更接近 0 的值意味着忘记数据,更接近 1 的值意味着保留这些数据。

  • 数学:

  • 遗忘门是遗忘门权重矩阵乘以先前的隐藏状态,然后输入状态+一些偏置,全部传递到 sigmoid 激活函数中。在计算之后,它被传递到单元状态。

输入门:

这个门用我们想要存储在单元状态中的新数据来更新单元状态。输入门将先前的隐藏状态乘以输入,并将其通过一个 sigmoid。接近 0 的值不重要,接近 1 的值很重要。然后,先前的隐藏状态乘以输入,并传递到 tan 激活函数,该函数将值压缩到-1 到 1 的范围内。然后,sigmoid 输出乘以 tan 输出。sigmoid 输出决定哪些信息对 tan 输出很重要。

  • 数学:

单元格状态:

网络的记忆。这可以被认为是一条“信息高速公路”,将记忆从以前的细胞传送到未来的细胞。这些门对单元状态进行改变,然后将该信息传递给下一个单元。一旦计算出遗忘门和输入门,我们就可以计算单元状态的值。

  • 数学:

  • 单元状态是遗忘门输出前一单元状态+输入门输出从前一单元传递的单元状态值。这是为了去掉我们想要忘记的更接近于零的某些值。然后,我们将来自输入门的值添加到我们想要传递给下一个单元的单元状态值中。

输出门:

输出门决定下一个隐藏状态应该是什么。我们将之前的隐藏状态乘以输入,然后传递给一个 sigmoid 激活函数。然后,我们将单元状态值传递给 tan 激活函数。然后,我们将 tan 输出乘以 sigmoid 输出,以决定隐藏状态应该将哪些数据传送到下一个 LSTM 单元。

  • 数学:

辍学:

  • Dropout 是深度学习和神经网络中使用的一种正则化技术。正则化是一种技术,用于帮助网络不过度适应我们的数据
  • 过度拟合是指我们的神经网络在训练数据上表现良好,但在测试数据上表现很差。这意味着网络没有很好地概括,这意味着它对以前没有见过的新图像的分类不正确/很差
  • 在官方的论文中解释说,“在一个神经网络中,每个参数接收到的导数告诉它应该如何改变,从而减少最终的损失函数,给定所有其他单元正在做的事情。因此,单位可能会以某种方式改变,以修正其他单位的错误。这可能导致复杂的共同适应。这反过来会导致过度拟合,因为这些共同适应不会推广到看不见的数据。”
  • 因此,我们本质上关闭了一层中的一些神经元,以便它们在网络权重的更新(反向传播)期间不学习任何信息。这使得其他活跃的神经元可以更好地学习并减少错误。

我们模型的代码:

  • 顺序——在这里我们建立我们的神经网络。我们按顺序创建模型。顺序意味着您可以一层一层地创建模型。顺序意味着只有一个输入和一个输出,就像流水线一样。
  • LSTM 层-然后我们创建两个 LSTM 层,每层后有 20%的下降。
  • 第一层我们有 return_sequences = true。我们这样做是因为我们有堆叠的 LSTM 层,我们希望第二个 LSTM 层有一个三维序列输入。
  • 我们还将 input_shape 设置为 x.shape,以确保它接受数据的相同 3D 形状。
  • 输出层——然后创建我们的输出层,它只是一个单一的节点,输出一个 0 到 1 之间的数字。
  • 编译——然后我们编译模型。我们使用 Adam 优化器,它是一种梯度下降优化算法,我们将损失函数定义为均方误差。我们使用 Adam 来最小化我们的均方误差成本函数。
  • 拟合模型—最后,我们使用反向传播和 Adam 优化器来拟合模型。我们将纪元定义为 20,批量大小为 10。我们还使用内置的 Keras split 函数将我们的数据分成 70%的训练数据和 30%的测试数据。

绘制模型损耗:

  • 这里我们使用来自 keras api 的代码来绘制模型损失。当我们到达第 20 个纪元时,测试损失和训练损失非常接近,并且它们被最小化。

做出预测:

LSTM prediction results

  • 在这里,我们让我们的神经网络对未知的 2019 年特斯拉股票数据进行预测。
  • 我们首先从测试数据框架中获取 2019 年的收盘价数据,并将其转换为 0 到 1 之间的值。
  • 我们再次使用 create_dataset 函数将数据转换成 36 个股票价格的批次。因此,我们给神经网络一个 X_test 数组,其中每个指数包含 36 天的收盘价。y_test 是应该给 36 天价格的值。
  • 然后,我们将原始的 y 值存储在 org_y 变量中。我们将绘制该图,并将该值与我们的模型预测的价格值进行比较。
  • 最后,我们重塑它,让网络进行价格预测。
  • 正如你在上面的预测图中所看到的,我们的模型表现得相当好,并且跟踪了一整年的未知数据的行为。

结论:

  • LSTMs 非常迷人,有很多有用的应用。它们允许对长系列的连续数据进行精确预测。我希望你喜欢这篇文章,我希望你学到了一些东西。如果您有任何问题、顾虑或建设性的批评,请在 linkedin 上联系我,并在 github 上查看该项目的代码。

资源:

  • https://python programming . net/getting-stock-prices-python-programming-for-finance/
  • https://towards data science . com/in-12-minutes-stocks-analysis-with-pandas-and-scikit-learn-a8d 8 a 7b 50 ee 7
  • https://www.youtube.com/watch?v=4R2CDbw4g88
  • https://medium . com/coin monks/support-vector-regression-or-SVR-8e B3 ACF 6d 0 ff
  • http://www.saedsayad.com/support_vector_machine_reg.htm?source = post _ page-8e B3 ACF 6d 0 ff-
  • https://medium . com/machine-learning-101/chapter-2-SVM-support-vector-machine-theory-f 0812 effc 72
  • 【https://www.youtube.com/watch?v=SSu00IRRraY
  • http://benalexkeen.com/feature-scaling-with-scikit-learn/
  • https://colah.github.io/posts/2015-08-Understanding-LSTMs/
  • https://www.youtube.com/watch?v=8HyCNIVRbSU
  • https://towards data science . com/playing-with-time-series-data-in-python-959 e 2485 BF F8
  • https://github . com/krishnaik 06/Stock-Price-Prediction-using-Keras-and-Recurrent-Neural-networking/blob/master/rnn . py

演练:使用 Python 中的 bokeh 和 GeoPandas 进行基本映射

原文:https://towardsdatascience.com/walkthrough-mapping-basics-with-bokeh-and-geopandas-in-python-43f40aa5b7e9?source=collection_archive---------3-----------------------

从数据和文件到静态地图再到交互式地图

Final static plot. Keep reading for the interactivity!

我本周的目标是学习如何制作一个交互式地图,然后创建一个关于如何制作该地图的教程。地图在可视化地理数据和随时间变化方面非常有用。它们可以提供一种很好的方式来缩小视图,查看宏观层面的变化。首先,我将概述所使用的两个主要包:GeoPandas 和 bokeh。然后,我将介绍如何从一个特定的数据集到一个特定的交互式地图。创建的地图决不是完整或完美的。总之,我将回顾一些潜在的改进,并提供一个我在哪里找到我的信息的资源列表和一些起点,如果你对散景、GeoPandas 或交互式制图感兴趣的话。

目标

  • 了解如何使用散景和 GeoPandas 创建交互式地图的基础知识
  • 了解软件包的应用,以便绘制 2018 年在整个美国邻近地区采集的水样中的铅含量
  • 如果你有关于散景和地质公园的问题,知道去哪里

这篇博文的灵感来自于各种关于制图和可视化的帖子。所有的灵感来源和其他有用的链接都发布在下面的参考资料部分。

代码可以在 我的 GitHub 回购 上找到。

包 1: GeoPandas

Examples from GeoPandas Gallery

GeoPandas 是一个帮助用户处理地理空间数据的开源包。GeoPandas 有许多依赖项。我们将关注的是包 shapely,GeoPandas 依赖它来执行几何运算。在我们的例子中,美国各州的形状将通过 shapely 包编码为多边形或多多边形。然后通过 GeoPandas 来理解地理空间数据。

安装

为了让 GeoPandas 运行,需要安装一些软件包。很难确保这一点。但是如果你确定的话,可以用 pip 安装。否则,使用 Anaconda 安装 GeoPandas 将会为您处理依赖关系。

conda install geopandas

你可以在这里阅读更多关于安装 GeoPandas 的信息。

包装 2:散景

Gallery of plots you can make in Bokeh

虽然 GeoPandas 允许绘图,但散景允许我们创建更复杂的绘图。bokeh 是一个多功能的开源软件包,旨在帮助用户创建漂亮的交互式可视化效果。2013 年 4 月首次发布 Bokeh,最近一次发布是在 2019 年 10 月。在此最新版本之后,将不再支持 Python 2.7、Python 3.5 或更早版本。你可以在这里找到你可以在散景中制作的完整图库。

安装

散景依赖于几个软件包。您仍然可以使用 pip 来安装 Bokeh,但是您可能会遇到依赖性方面的问题。在我的例子中,我使用 Anaconda 来安装 bokeh,因为它负责确保依赖关系是有序的。

conda install bokeh

安装的更多细节可以在这里和这里找到。

例如:观察水中的铅含量

目标

创建一个显示美国各州人口的地图。在每个州内,显示 2018 年在哪里发现了铅。

创造连续的美国

为了创建一个地图,你需要一个形状文件。shp)。在这种情况下,我从美国人口普查局这里下载了一个 shapefile。该文件告诉 Geopandas 我们正在绘制什么形状。在我们的例子中,我们需要一个文件来概述美国相邻的每个州。我们使用一个 geometry 列,以便 Geopandas 包知道在哪里寻找每个州的形状信息。在这种情况下,形状是形状良好的多边形对象。

# Import geopandas package
import geopandas as gpd# Read in shapefile and examine data
contiguous_usa = gpd.read_file('data/cb_2018_us_state_20m.shp')
contiguous_usa.head()

First 5 rows of contiguous USA shapefile

在 Jupyter 笔记本中运行以下代码行将返回马里兰州的图像。

Running just the first entry in the geometry column, which represents the shapely geometry needed to create an image of Maryland

但是我们可以将 geometry 元素转换为字符串,以查看 shapely geometry 对象是如何表示的:

str(contiguous_usa.iloc[0]['geometry'])

返回一个长字符串,该字符串代表构成马里兰州的许多多边形:

'MULTIPOLYGON (((-76.04621299999999 38.025533, -76.00733699999999 38.036706, -75.98008899999999 38.004891, -75.98464799999999 37.938121, -76.04652999999999 37.953586, -76.04621299999999 38.025533))...

数据:国家人口

现在我们已经有了如何绘制美国地图的想法,我们需要将每个州的几何图形与我们想要绘制的数据结合起来。在这种情况下,我们需要将每个州与其 2018 年的人口联系起来。你可以通过美国人口普查局在这里找到美国各州和年份的人口估计。

import pandas as pd# Read in state population data and examine
state_pop = pd.read_csv('data/state_pop_2018.csv')
state_pop.head()

First 5 rows of state_pop dataframe

现在我们知道 shapefile 和 state population csv 都有一个名为“NAME”的列,我们可以将它们匹配在一起。所以现在我们可以使用 pandas 合并文件。

# Merge shapefile with population data
pop_states = contiguous_usa.merge(state_pop, left_on = ‘NAME’, right_on = ‘NAME’)# Drop Alaska and Hawaii
pop_states = pop_states.loc[~pop_states['NAME'].isin(['Alaska', 'Hawaii'])]

现在,我们已经合并了数据并将其限制在相邻的美国,我们可以将数据转换为有利于制图的格式:

import json
from bokeh.io import show
from bokeh.models import (CDSView, ColorBar, ColumnDataSource,
                          CustomJS, CustomJSFilter, 
                          GeoJSONDataSource, HoverTool,
                          LinearColorMapper, Slider)
from bokeh.layouts import column, row, widgetbox
from bokeh.palettes import brewer
from bokeh.plotting import figure# Input GeoJSON source that contains features for plotting
geosource = GeoJSONDataSource(geojson = pop_states.to_json())

现在,数据已经转换为适当的格式,我们可以使用以下步骤绘制州人口地图:

  1. 创建图形对象
  2. 将面片渲染器添加到图形中
  3. 创建悬停工具
  4. 展示图
# Create figure object.
p = figure(title = 'Lead Levels in Water Samples, 2018', 
           plot_height = 600 ,
           plot_width = 950, 
           toolbar_location = 'below',
           tools = “pan, wheel_zoom, box_zoom, reset”)
p.xgrid.grid_line_color = None
p.ygrid.grid_line_color = None# Add patch renderer to figure.
states = p.patches('xs','ys', source = geosource,
                   fill_color = None,
                   line_color = ‘gray’, 
                   line_width = 0.25, 
                   fill_alpha = 1)# Create hover tool
p.add_tools(HoverTool(renderers = [states],
                      tooltips = [('State','@NAME'),
                                ('Population','@POPESTIMATE2018')]))show(p)

Basic map showing some tools available in bokeh package

现在我们已经创建了地图,我们可以添加一个颜色条来指示州人口。

# Define color palettes
palette = brewer['BuGn'][8]
palette = palette[::-1] # reverse order of colors so higher values have darker colors# Instantiate LinearColorMapper that linearly maps numbers in a range, into a sequence of colors.
color_mapper = LinearColorMapper(palette = palette, low = 0, high = 40000000)# Define custom tick labels for color bar.
tick_labels = {‘0’: ‘0’, ‘5000000’: ‘5,000,000’,
 ‘10000000’:’10,000,000', ‘15000000’:’15,000,000',
 ‘20000000’:’20,000,000', ‘25000000’:’25,000,000',
 ‘30000000’:’30,000,000', ‘35000000’:’35,000,000',
 ‘40000000’:’40,000,000+’}# Create color bar.
color_bar = ColorBar(color_mapper = color_mapper, 
                     label_standoff = 8,
                     width = 500, height = 20,
                     border_line_color = None,
                     location = (0,0), 
                     orientation = ‘horizontal’,
                     major_label_overrides = tick_labels)# Create figure object.
p = figure(title = ‘Lead Levels in Water Samples, 2018’, 
           plot_height = 600, plot_width = 950, 
           toolbar_location = ‘below’,
           tools = “pan, wheel_zoom, box_zoom, reset”)
p.xgrid.grid_line_color = None
p.ygrid.grid_line_color = None# Add patch renderer to figure.
states = p.patches(‘xs’,’ys’, source = geosource,
                   fill_color = {‘field’ :'POPESTIMATE2018',
                                 ‘transform’ : color_mapper},
                   line_color = ‘gray’, 
                   line_width = 0.25, 
                   fill_alpha = 1)# Create hover tool
p.add_tools(HoverTool(renderers = [states],
                      tooltips = [(‘State’,’@NAME’),
                               (‘Population’, ‘@POPESTIMATE2018’)]))# Specify layout
# p.add_layout(color_bar, ‘below’)show(p)

Map with coloring based on state population

数据:销售线索级别

现在我们已经有了基本的地图,我们可以添加关于发现铅的水域的信息。我用的数据来自水质数据。根据现有的数据,我下载了两个数据集:

  1. 2018 年美国所有的水站点
  2. 2018 年美国每一份检测铅含量的水样的结果
sites_df = pd.read_csv('data/sites_2018.csv')
lead_samples = pd.read_csv('data/lead_samples_2018.csv')

在我们加载数据之后,我们需要检查和清理数据。在这种情况下,去除没有铅结果或 0 微克/升铅的点。在这种情况下,我们只想绘制以微克/升或毫克/升为单位进行测试的位置。我们将毫克/升转换为微克/升,以获得一致的单位。

清理完数据后,我们可以将水源与铅样本合并。然后,我们对网站进行排序,删除任何重复的网站,在网站和日期上进行匹配。然后,我们可以根据纬度和经度对美国境内的水源进行分类。然后我们创建一个月列用于绘图目的。最后,我们通过创建有形状的几何点对象来创建一个几何行

lead_sites = lead_per_l.merge(sites_no_dup,
                          left_on = ‘MonitoringLocationIdentifier’,
                          right_on = ‘MonitoringLocationIdentifier’)lead_sites_sorted = lead_sites.sort_values(by = ‘ActivityStartDate’)# After dropping duplicates by date, 12,249 data points
lead_sites_dropdup = lead_sites_sorted.drop_duplicates(subset = [‘MonitoringLocationIdentifier’, ‘ActivityStartDate’], keep = ‘last’).reset_index(drop = True)# Drop data points not in the contiguous USA, 10,341 data points
lead_sites_dropdup = lead_sites_dropdup[(lead_sites_dropdup[‘LongitudeMeasure’] <= -60) 
                 & (lead_sites_dropdup[‘LongitudeMeasure’] >= -130)
                 & (lead_sites_dropdup[‘LatitudeMeasure’] <= 50) 
                 & (lead_sites_dropdup[‘LatitudeMeasure’] >= 20)]# Create Month column for plotting Slider
lead_sites_dropdup[‘Month’] = [int(x.split(‘-’)[1]) for x in lead_sites_dropdup[‘ActivityStartDate’]]# Create shapely.Point objects based on longitude and latitude
geometry = []for index, row in lead_sites_dropdup.iterrows():
    geometry.append(Point(row[‘LongitudeMeasure’], 
                          row[‘LatitudeMeasure’]))lead_sites_contig = lead_sites_dropdup.copy()
lead_sites_contig[‘geometry’] = geometry

既然我们已经创建了合适的几何列,我们可以指定坐标参考系统(crs)并将数据转换为地理数据框架。然后我们提取 x 和 y 坐标用于绘图,并转换为 columndatasource。更多关于散景数据源的信息可以在这里找到。

# Read dataframe to geodataframe
lead_sites_crs = {‘init’: ‘epsg:4326’}
lead_sites_geo = gpd.GeoDataFrame(lead_sites_contig,
                                  crs = lead_sites_crs,
                             geometry = lead_sites_contig.geometry)# Get x and y coordinates
lead_sites_geo[‘x’] = [geometry.x for geometry in lead_sites_geo[‘geometry’]]
lead_sites_geo[‘y’] = [geometry.y for geometry in lead_sites_geo[‘geometry’]]
p_df = lead_sites_geo.drop(‘geometry’, axis = 1).copy()sitesource = ColumnDataSource(p_df)

滑块工具

有许多数据点(10,000 多个),按时间段查看数据可能更有意义。因此,对于这个例子,我按月划分数据,并创建了一个滑块工具,以便您可以查看 2018 年任何月份的每个水站点。

# Make a slider object to toggle the month shown
slider = Slider(title = ‘Month’, 
                start = 1, end = 12, 
                step = 1, value = 1)

现在我们已经创建了 slider 对象,我们需要根据用户输入更新它。我们通过编写一个回调函数和一个 CustomJSFilter 来实现这一点。

# This callback triggers the filter when the slider changes
callback = CustomJS(args = dict(source=sitesource), 
                    code = """source.change.emit();""")
slider.js_on_change('value', callback)# Creates custom filter that selects the rows of the month based on the value in the slider
custom_filter = CustomJSFilter(args = dict(slider = slider, 
                                           source = sitesource), 
                               code = """
var indices = [];
// iterate through rows of data source and see if each satisfies some constraint
for (var i = 0; i < source.get_length(); i++){
 if (source.data[‘Month’][i] == slider.value){
 indices.push(true);
 } else {
 indices.push(false);
 }
}
return indices;
""")# Uses custom_filter to determine which set of sites are visible
view = CDSView(source = sitesource, filters = [custom_filter])

现在我们已经写好了函数,我们可以绘制水样采集站点,站点的悬停工具,以及滑块。

# Plots the water sampling sites based on month in slider
sites = p.circle('x', 'y', source = sitesource, color = 'red', 
                 size = 5, alpha = 0.3, view = view)# Add hover tool
p.add_tools(HoverTool(renderers = [sites],
                      tooltips = [('Organization', '@OrganizationFormalName'),
                                  ('Location Type', '@MonitoringLocationTypeName'),
                                  ('Date', '@ActivityStartDate'),
                                  ('Lead (ug/l)', '@LeadValue_ug_l')]))# Make a column layout of widgetbox(slider) and plot, and add it to the current document
layout = column(p, widgetbox(slider))show(layout)

Finished bokeh plot!

改善可视化的方法

  1. 目前,该地图仅显示了州一级的人口,但由于水样/站点可能无法覆盖整个州,因此更详细的人口细分(例如按县)可能会提供更多信息。
  2. 为了与 1 保持一致,显示哪个区域从这些水源获得水可能是有趣的。
  3. 目前,该地图没有提供关于铅含量的统计数据的快速概览(例如:检测到的最少/最多铅、方差、多次记录的地点变化等。)
  4. 从视觉上来看,可以在标记或改变悬停工具的样式方面进行改进。

资源

  • 使用 Python 制作交互式地理地图的完整指南走向数据科学 (Shivangi Patel,2019 年 2 月 5 日)
  • “添加小部件”散景文档。
  • “散景.模型.滤镜”散景文档。
  • “散景.模型.来源”。散景文档。
  • GeoPandas 文档
  • GeoPandas 101:在地图上绘制任何带有经度和纬度的数据。(瑞安·斯图尔特,2018 年 10 月 31 日)
  • 如何使用 Python 3 在 Bokeh 中使用 slider 回调过滤 ColumnDataSource?栈溢出。
  • “带散景的交互式地图”赫尔辛基大学。
  • “Javascript 回调”散景文档
  • 风韵犹存的用户手册

想要一份数据科学的工作?利用周末项目原则来得到它

原文:https://towardsdatascience.com/want-a-data-science-job-use-the-weekend-project-principle-to-get-it-a86ba2da514f?source=collection_archive---------0-----------------------

在线课程证书很棒。但是自己的项目更好。

It took me too long to learn courses are great for foundation knowledge. But the best knowledge, specific knowledge, knowledge which can’t be taught, comes from working on something of your own. Something which doesn’t have a criteria.

你走进去。亨利也在那里。在你和穿绿色 t 恤的女士之间有一张灰色的桌子。桑德拉。你记得她的名字。是她邀请你来面试的。

你在大厅遇见了亨利。你们俩都在争取同一个角色。亨利是个好人。真的很好。他和你一样。你们甚至喜欢同样的东西。

桑德拉开始说话。

欢迎小伙子们,感谢你们的到来。

你们都笑了。

你的申请令人难以置信。你们会很高兴知道你们是最后两个候选人。我们会雇用你们两个,但目前我们只有一个职位。

你瞥了一眼亨利。已经宣战了。不完全是,但也可能是。如果被雇佣是目标,那就有赢家和输家。

你记得在大厅和亨利说过话。

亨利告诉你他一直在开发的网络应用程序。你甚至可以在手机上使用它。虽然不多,但确实存在。屏幕上的黄色符号是供应无麸质食物的咖啡馆。亨利的女朋友不能吃麸质,所以他为她做了麸质。

“你是怎么做到的,”你问过了。

我在网上上过一些课程,所以我决定试着做点什么。“我从一些当地网站上获得了数据,看了看菜单,如果他们提到无麸质选择,确保他们是可见的。”

桑德拉又开始说话了。

亨利,我看了你建的网站。我女儿是乳糜泻。“如果我们到了某个地方,她却吃不下东西,那就太痛苦了,”

亨利开始说话。

女朋友也不能吃面筋。有几个问题,但我正在努力解决。

桑德拉转向你。

丹尼尔,我看到你在网上学了很多课程。Coursera 和 edX 的一些看起来很棒。

“你有机会使用你一直在学习的那些技能吗?”

你回头看了一眼亨利。这场战争已经失败了。

你说话。

还没有,我还在想该做什么。

这很难选择,”桑德拉说。

采访又持续了 15 分钟。标准问题。

你如何在团队中工作?

说出一次你挣扎过的经历,并谈谈在那种情况下你做了什么。

亨利谈到了他如何与他的应用程序斗争。桑德拉一直很感兴趣。

采访结束。

桑德拉一边招呼你和亨利出门,一边喊道。

感谢你们两位抽出时间,今天过得很愉快。我们会保持联系的。

亨利转向你,伸出手。

最好的男人。”

谢谢,你也是。

几天后电子邮件就来了。你知道它说什么。

虽然你的资历令人印象深刻,但我们决定不在这个阶段继续前进。

亨利得到了那份工作。

你继续读。

下一次的一些反馈,请不要认为这是负面的。我们很高兴看到你回来。

我们想看看你从令人印象深刻的证书列表中获得的所有知识能够做些什么!如果你做了什么让我们知道。在这里工作最大的好处之一就是我们可以为你自己的项目提供帮助。

你微笑。你知道的。从亨利告诉你他在做什么的时候你就知道了。当你读到关于如何准备第一次面试的博文时,你就知道了。

为什么亨利得到了这份工作?

周末项目原则。

大多数雇主(好的雇主)会更重视你做过的事情,而不是你有能力做的事情。

证书很棒。它们是工作证明的一种形式。

但是周末项目原则更好。

周末项目原则就是处理任何你可以说的事情,“我正在做我的 X 项目”或者“这是我做的。”然后能够讲述它的故事。重要的是,这不是从标准开始的,你可以在前进的过程中创造标准。

也不要被名字骗了。不一定要在周末。随时都有可能。不过,周末是一段很长的时间。因为如果最初的概念花费的时间超过一个周末,你可能想多了。

上 Coursera 和 edX 上的课程,拿到证书,获得技能但更重要的是,把它们作为做东西的基础。

六周过去了。你接受了桑德拉的建议。

你决定通过电子邮件发送,回复她发给你的邮件。

主题是,“我一直在做的事情。”

第一句话,“我接受了你的建议,决定用我一直在学习的东西做点什么。”

第二天早上,你的电话开始响了。你回答,说你好。是桑德拉。她开始说话。

嘿!我们收到了你的邮件!多努力啊!你想明天来告诉我们更多吗?我们可能很快会有一些职位空缺。

想要数据驱动?最好开始考虑数据操作

原文:https://towardsdatascience.com/want-to-be-data-driven-better-start-thinking-about-dataops-36b7f875ab35?source=collection_archive---------25-----------------------

大家的谈话数据。数据是开启洞察力的钥匙,是帮助您获得预测的秘方,是商业智能的燃料。人工智能的变革潜力?它依赖于数据。为您的 CRM、月度报告、Tableau 仪表盘提供动力的东西?数据。

好消息是数据从未如此容易获得。随着越来越多精通技术的公众要求以现代方式连接到公共数据,像人口普查这样经过考验的真实公共数据来源变得越来越容易获得。开放数据运动也在发展,越来越多的企业和组织将数据释放到野外。其结果是,商业界有一种压倒性的愿望,即利用数据来更智能地运营,并在每个行业、每个部门提供结果。事实上,2018 年,98.6%的公司渴望数据驱动的文化。这种兴奋导致许多组织大力投资商业智能工具和数据科学家队伍,他们将使用这些工具从原始数据中提炼黄金。

“2018 年,98.6%的公司渴望数据驱动的文化”——麻省理工科技评论报告

问题?想要实现数据驱动和完成数据驱动之间有很大的差距。

造成这种脱节的主要原因是数据和分析之间存在巨大的基础架构差距,而最大一部分花费的资源最终被丢弃在这个鸿沟中。现实情况是,曾经被称为 21 世纪最性感的工作 的数据科学目前有 80%的数据准备 和 20%的实际洞察力,这意味着投资数据科学部门的组织只能看到他们预期的商业智能的一小部分。

为什么会这样?

原因有几个,其中大部分可以通过数据经济中一个很大程度上缺失的组件来解决:数据操作。

处理大量数据需要集中管理和自动化操作

就像它的名字 DevOps 一样,DataOps 是这样一种东西,一旦你意识到你需要它,你就会意识到你实际上在一年前就需要它。在 DevOps 之前,工程管道变得不可持续的复杂。他们需要一个系统——一个过程和一套工具——来整合团队、技术和过程,同时消除团队成员之间的操作孤岛。随着可用数据量的增加,以及那些能够有效利用这些数据的人所拥有的机会的增加,组织需要实施类似的解决方案来管理其数据这一点变得越来越明显。

与 DevOps 类似,DataOps 不是单一的东西。大多数数据科学家每天都要处理几十项日常工作,这些工作可以通过更加智能地处理数据操作来解决。

采购数据

听起来很简单。它不是。任何人都可以找到数据——这是前所未有的可用——但找到能回答你所提具体问题的数据却少之又少。你最终是在一堆针中寻找一根针。

你能看到你想要的数据吗?

当然,数据无处不在,但看似简单的请求(“去年哪一天下雨?”“租金价格如何从一个街区变化到另一个街区?”)很少以你想要的格式,在一个整洁的包中产生你需要的、可访问的数据。这个星球上没有一个存储所有公共数据的单一存储库——不,它不是谷歌的公共数据浏览器——所以认为一个数据科学家可以梳理整个可用数据宇宙以实施一个好主意是不现实的。

清理数据

清理数据可能是数据科学家工作中最耗时、最必要、效率最低的部分。其中一个问题是“干净”是一个相对的术语。 数据语义 高度讲究。对于任何给定的数据集,数据科学家可能都必须标准化文件格式(但是谁不喜欢使用 pdf 呢?)、字符编码和列格式。更何况一个人的理想数据集是另一个人的头疼事。

除了这些问题之外,遗留系统、专有格式和人为错误会使流程变得非常缓慢。csv 中某处的未转义逗号?这是一个需要快速解决的问题,但是可能要花很多时间来找出哪里需要解决。因为它如此特殊,所以清理数据目前是一项蛮力工作,离分析还差得很远。

转换数据

一旦数据集被标准化,它可能仍然需要被转换以满足内部标准。你的公司如何记录日期和地址?他们希望每个专有名词都是大写的吗?如果您想执行更复杂的转换,比如在行级别添加逻辑和数学函数,该怎么办?

任何称职的数据科学家都可以进行这些转变,但你不能像发展数据库那样发展你的数据科学团队。鉴于流程中的各种可变性,当您的一名数据科学家转换到一份新工作时会发生什么?你能指望新来的人以完全相同的方式维护数据产品吗?你能控制移交吗?任何医疗专业人士都可以告诉你,事情并不总是按计划进行(但他们 使用数据来理解和解决问题 )增加管道的透明度和协作对于确保避免数据操作中的单点故障至关重要。

服务数据

正如我前面提到的,有很多 SaaS 解决方案是基于数据来产生洞察力和分析的。自从 Gartner 宣布 商业智能 是 CEO 们在 2009 年的首要任务以来,商业智能工具变得越来越可用和用户友好。像 Tableau 这样的数据可视化平台是主流,数据科学家越来越多地使用像 Jupyter Notebooks 和 RStudio 这样的开源 web 应用程序进行统计计算和机器学习。

然而,问题是,为了让这些解决方案发挥作用,您需要将数据传输到这些解决方案中。与我们在 AI 中看到的 类似,数据分析通常在合成或无菌环境中进行测试,这使得企业领导者认为将数据集插入工具并看到直接的业务影响是很容易的。它不是。原始数据是原油,而 BI/分析工具是一辆快车——在你去任何地方之前,都需要进行大量的提炼。

事实是,像这样的任务占据了数据科学家工作日的大部分时间。目前,它们被视为不可避免的祸害,但是找到一种将自动化应用于这些过程的方法将会产生立竿见影的效果。数据科学家将能够把大部分时间花在他们从事的业务上:分析、建模和实验。

释放数据的价值具有不可否认的商业影响——要做好这一点,您必须开始认真考虑数据运营。

我最近的一些帖子,希望你能看看:

开放数据和公开数据有区别吗?

你的数据准备好 AI 了吗?

联系我们 了解如何改进和自动化您的数据科学工作流,或者查看 Namara 和我们的工具套件,了解 ThinkData 如何构建理想的 DataOps 平台。

原载于

想得到你的人工智能项目吗?问问你自己这 10 个问题

原文:https://towardsdatascience.com/want-to-get-you-a-i-project-off-the-ground-ask-yourself-these-10-questions-9a8704de50c0?source=collection_archive---------23-----------------------

针对讨厌 Excel 和 PowerPoint 的人的风险分析框架

到目前为止,任何一个有自尊的高管都听说过人工智能,并认为“嗯,是的,我也想分一杯羹。因为他们是主管,他们告诉下属继续工作,然后回到高尔夫球场。我个人认为这种做事方式没有问题,因为下属们会去找像我这样的顾问,了解他们的老板可能会说“我想要 Alexa,但喜欢办公椅”是什么意思(是的,我有一个关于这个的 PowerPoint 演示文稿)。

然而,我认为在用一种算法取代所有的主席语声器之前,应该考虑一些风险。事实上,在进入人工智能项目之前,在精神上问自己以下问题可能会降低风险,节省时间和金钱,并使所述项目的构建和运行部分更加顺利。

它不会以任何方式取代、塑造或形成启动此类努力所需的尽职调查,但会提供一个有用的框架来开始建设性的对话。

1.我有一个聪明的目标吗?

不管他们的编码或数据分析能力如何,高层人员在定义人工智能项目的策略中起着关键的作用。该公司是否想通过创造一种不同类型的价值主张 来颠覆其市场亚马逊?它是否寻求成为同类产品中的佼佼者?也许它的目标是在竞争激烈的市场上保持平衡,就像亚马逊一样?或者甚至追到一个领导, à la 亚马逊?

你知道,我开始感觉到一种趋势……

如果没有这样精确的指示,团队将会无目的地挖掘数据,寻找故事。由于没有明确和一致的目标,他们只能追逐移动的目标,冒着随着新数据的出现而改写历史的风险。这就是为什么在任何项目开始之前定义的策略应该是具体的、可测量的、可实现的、相关的和有时间限制的。

“其他人都在做”是进入人工智能游戏的一个糟糕的理由。

2.我有足够的数据吗?

所有人工智能项目都需要大量数据才能发挥作用:通俗地说,一个算法不可能在不敏锐地意识到过去的情况下既理解现在又理解未来。没有具体数量的数据点可以给出,因为它变化很大,但一个刚刚启动、经常性客户不超过 200 人的初创企业显然不具备启动人工智能项目的资源。

如果没有足够的数据可用,要么必须在内部收集,这可能非常耗时(我们正在谈论多年和重大重组),要么通过外部来源收集(例如,预测雨伞需求将使用所有人都可以免费获得的天气数据)。然而,重要的是要注意,独特的数据,而不是尖端的建模,才是创造有价值的人工智能解决方案的原因。

3.我的数据集中有错误吗?

垃圾进来,垃圾出去。

没什么可说的了。任何优秀的首席数据官都会确认,数据应该像实物产品一样对待,在投入生产之前和之后都要对其组件进行质量检查。如果西红柿变坏了,一半的熏肉不见了,你不会做 BLT,也不应该运行一个有丢失或错误数据的算法。由此产生的预测不可信。

事实上,在创建算法时,80%的工作涉及数据提取、清理、填充和标准化,以确保简单的错误可以被系统地避免。

即使这样…

4.我的数据集是 d*ck 吗?

哦,亚马逊,你又来了?几率有多大?!

算法有能力系统地“做出”不公平的决定,而没有人注意到,甚至不知道为什么,这使得伦理比以往任何时候都更加重要。因此,团队应该系统地确保旨在对人类产生影响(任何影响)的算法不会受到偏见的困扰。这可以通过检查两件事来实现:数据代表现实,并且它不反映现实的现有偏见。

说起来容易做起来难,这进一步凸显了对相关且一致认可的全行业框架的需求

雇用多元化的员工有助于发现相关社会背景的反映,但鉴于 STEM 课程的当前结构,这几乎是不可能的……或者,我会建议雇用一名“偏见侦探”,一名精通数据科学和人文科学的罕见独角兽,在我能创造的黑箱中找到未知的未知事物。

说到稀有独角兽…

5.我有实现这一目标的人吗?

A.I 人才既稀缺又被科技巨头垄断。根据最新报道,T2 目前只有 22,000 名博士级别的专家能够开发前沿算法。不适合大型科技公司的产品价格昂贵。非常贵。非常非常贵。

然而,这不应该阻止有进取心的团队创造美好的东西。如前所述,好的人工智能更多的是关于独特的数据,而不是独特的算法。任何现代数据分析师/开发人员合作伙伴都可以使用许多开源库来自学基础知识,并获得一些必要的快速胜利,以说服大人物继续疯狂招聘(我建议从 IBM Watson Studio 开始,我就是从那里开始的)。

在任何情况下,很可能在未来几年内,很大一部分劳动力将拥有一点数据科学,因为它将成为大批员工所需的集体技能的一部分(例如,知道如何使用 Office pack 现在是一种天赋)。

6.我需要改变我的层级结构吗?

即使一家公司有几十个有才华的业务流程负责人(通常不受欢迎,但对以上所有)开发人员、博士级别的专家和数据科学家,如果他们不能一起工作,将难以置信地难以启动一个项目。

首先,如果人才不集中,这些员工将很少有工作满意度,因为与周围人的共同目标对激励员工有奇效。其次,数据科学要求业务的统计、计算和业务方面全天候通信。因此,给这些人一个开放的空间,魔术图表和便利贴。第三,如果所有这些优秀、有才华的女性和男性都听命于不同的老板,很可能会出现不同的目标,以及沟通不畅和政治游戏。

IT 和业务的明争暗斗毫无成效。

变革管理是这里的关键。说到…

7.我的员工会变成勒德分子吗?

我们都听说过这些故事。自动化。冗余。机器人起义。这些故事(大部分)是真实的。这意味着一旦人工智能项目被宣布,组织内部会有一定程度的恐惧。“它会取代乔布斯吗?”"我必须接受进一步的培训还是被解雇?"“业务的一个部分会做出曾经由另一个部门做出的决策吗?”。

人们很少意识到变化,必须通过自上而下的教育和自下而上的咨询来实现,这需要时间。然而这是必要的。

对于一个成功的项目来说,获得组织各个层面的支持至关重要。

除了偶尔的内部认同,如果一个项目不仅仅是数据科学的一次尝试,就必须发展一种完整的文化

8.我有合适的架构吗?

我可以用很多比喻来描述这个有趣的事情。冰山。足球。一位意大利土木工程师、经济学家和社会学家……然而我会坚持吃 BLT 三明治(因为快到午饭时间了,我饿坏了) :当你把西红柿、生菜和培根夹在两片面包之间时,你就处于一个涉及数百名工人和数千小时开发的过程的末端,从农场到仓库,到商店,以及中间的一切。数据科学大致相同:

算法本身做的工作不到 10%。

事实上,算法存在于一个依赖于以下因素的生态系统中:

  • 数据收集、数据验证、工作流管理、服务基础设施…

但这本身是一个更大的生态系统的一部分:

  • API(应用程序编程接口)、数据存储、DataViz 解决方案、监控流程、网络安全…

如果组织中不存在这样的架构,很好:从头开始更容易。然而,如果有现有的因素,很可能需要作出一些牺牲。

9.是否存在任何监管障碍?

目前,世界各地正在就人工智能问题以及对其进行监管的必要性进行数十场高层讨论;深度伪装、面部识别、黑暗模式、自主武器、系统偏见……所有这些都有广泛的影响,如果不加控制,有可能伤害数百万人。很快,政府层面正在讨论的此类问题的数量将达到数千个,因为可能会通过无数法律来确保算法的公平、安全和透明。

这是我们所能期待的最好结果……

然而,这意味着人工智能项目通常在未知的法律领域内进行,可能会在一瞬间受到广泛的法律检查。不仅要检查当前的法规,还要了解正在讨论的法规,这一直是企业界的关键,并将继续如此。

10.我有时间吗?

收集正确的数据、雇佣正确的人、重组系统和员工……所有这些都需要时间。一个 LOT 的时间。因此,说一个垂死的公司可以通过成为“人工智能公司”来拯救是愚蠢的。

事实上,如果一家公司处于时间敏感的紧要关头,人工智能可能不是答案。

这凸显了在制定战略时避免反动思维的必要性,因为这样做的公司注定要在其短暂的剩余生命周期中迎头赶上。

因此,我们回到了战略领域,从而完成了循环。

祝你好运。

参加一项运动

本文最初是为《Pourquoi Pas 撰写的,这是一份对当今技术挑战进行深入分析的在线杂志。 点击此处进入

想要真正掌握 Scikit-Learn?来自核心开发人员自己的 2 个重要提示

原文:https://towardsdatascience.com/want-to-truly-master-scikit-learn-2-essential-tips-from-the-official-developer-himself-dada6ff56b99?source=collection_archive---------10-----------------------

独家 TDS 采访

Scikit-learn 的核心开发人员之一分享了每个数据科学家都需要知道的 3 种实用 ML 技术。

Please subscribe to our youtube channel!

面试官:TowardsDataScience.com 项目负责人 Haebichan Jung 。旧金山 Recurly 的数据科学家。

受访者:sci kit-learn 的核心开发者 Andreas Muller 。O'Reilly 书籍的作者,介绍使用 Python 进行机器学习。哥伦比亚大学数据科学研究所的研究科学家和讲师。

开源社区如何为 Scikit-learn 服务?图书馆的工作流程和所有权是如何构建的?

首先是用户。对于 Scikit-learn 的大多数贡献者来说,他们是从用户开始的。如果你不使用这个包,你就没有动力了。第二,大多数伟大的贡献都是由人们的用例激发的。我为 Scikit-learn 制作了一些版本,因为我想使用它们。这些通常是最好的版本。你不想迎合软件过于具体的用例。你不想在特性上做标记,因为你可以。

第三,对于像 Scikit-learn 这样复杂的东西,您不希望从添加一些大的新功能开始。许多人都有他们最喜欢的模型,他们希望通过将它添加到 Scikit-learn 来开始他们的贡献。但是现在向 Scikit-learn 添加一个模型需要大约一年的时间。所以我真的建议从小事做起。我自己开始修复文档中的错别字。改进文档总是受欢迎的。问题跟踪器上也有很多东西。

在机器学习工作流程中实施 Scikit-learn 的人员中,您看到了哪些常见的错误或低效之处?

有几个与 Scikit-learn 和机器学习相关的常见错误。

  1. 对于 Scikit-learn,每个人都应该使用管道。如果你不使用管道,你可能做错了。两年前,我们引入了列转换器,它允许您更好地处理具有连续和分类变量的数据,或者其他类型的混合数据。我们还改变了一键编码器的一些东西。现在,当一起使用管道、列转换器和一键编码器时,一切都很好。
  2. 我在机器学习上看到的一个常见错误是没有足够重视指标。sci kit-learn for better or bad 使用准确性作为默认指标。但是一旦你有一个不平衡的数据,准确性是一个可怕的指标。你真的应该考虑使用其他指标。我们不打算改变默认的度量标准,因为准确性被如此广泛地使用,并且有如此明显的解释。但是查看其他指标并为您的用例考虑它们是机器学习中最常见的问题。

什么是管道?如果不是准确性,还有什么其他指标更适合机器学习?

在 Scikit-learn 中,每个 ML 模型都封装在一个简单的 python 类中,称为“estimators”。在你的机器学习过程中,经常会有一个包含一系列预处理步骤的分类器。管道允许您封装所有预处理步骤、特征选择、缩放、变量编码等等,以及您通常在单个估计器中拥有的最终监督模型。

所以你有一个物体来完成你所有的工作。这 A)非常方便,B)使编写错误代码变得更加困难,因为它确保您为您的训练和测试集做完全相同的事情。最后,你应该使用交叉验证或网格搜索简历。在这种情况下,重要的是所有的预处理都发生在交叉验证循环中。如果在交叉验证循环之外选择特性,可能会发生非常糟糕的事情。但是在您的管道中,您知道一切都在交叉验证循环中。

From Andreas Muller Columbia Lecture Series

对于度量标准,它们通常在二进制分类中被忽略。在二元分类中,要看你的目标是什么。我喜欢看 ROC 曲线下的面积和平均精度。这些是细粒度的度量标准。我也喜欢看精确召回曲线(AUPRC)。关于这些指标的事情是,它们不依赖于您应用的决策阈值,因为它们是排名指标。所以你需要决定在哪里设置阈值来说“我说它是 1 类还是 0 类的概率是多少?”

您可以研究的其他指标是 F1 指标或微平均召回率/精确度。这些也很有意思。

在 Scikit-learn 软件包中,您认为还有其他工具或功能没有被充分利用或低估吗?

有一个未被充分利用,因为它还很新。这叫做 Hist 梯度推进。这是 LightGBM 的根实现,因此它比以前的梯度增强实现快得多。比 XGBoost 略快,比 LightGBM 略慢。现在它还不支持缺失值,但在大约 2 周后的下一个版本中将会支持。它也不支持分类变量,这将发生在明年春天。

你提到 LightGBM 很有意思,因为越来越多基于 python 的 ML 库正在发布,如 Catboost,以及深度学习框架,如 PyTorch。你对 ML 领域的这些成长中的玩家有什么感觉?是竞争的反应?

我认为多数情况下多元化是好的,因为大多数都提供了类似于 Scikit-learn 的接口,因此与我们的包兼容。因为 Scikit-learn 应用如此广泛,所以它的开发速度很慢。我们看到 XGBoost 和 LightGBM 对人们来说非常有价值。因此,我们希望确保每个人都知道这一点,我们在 Scikit-learn 中包含了这一点,希望所有软件包都能获得更广泛的受众。

就深度学习库而言,部分原因是它们可以移动得更快,因为我们移动得太慢了。还有两件事。

  1. 与谷歌或脸书相比,我们的资源真的很少。所以和那些公司的工程师竞争毫无意义。我认为 Keras 真的很酷,我没有理由在 Scikit-learn 中重新实现这样的东西。
  2. 技术原因。现在,仍然很难跨不同平台无缝地支持 GPU。你可以在张量流中看到。Tensorflow 上有针对不同架构编译的不同版本,你得自己编译等等。我们在 Scikit-learn 中不会遇到这种麻烦。

你在哥伦比亚大学关于不平衡数据的演讲中说,这个问题有两个主要的解决方案:1)在改变数据(欠采样/过采样)后建立模型,2)改变模型(训练过程本身)。每种策略的优点和缺点是什么,特别是关于 Scikit-learn?

我想从你的问题后退一步,再次提到最重要的事情是指标,以及你如何评估它。你的目标是什么?你的目标永远不是准确,也永远不是 ROC-AUC。这不是你申请的内容。你应该考虑在你的应用环境中取得一个特定的结果意味着什么。

一旦你有了这个目标,你就可以定义指标,并尝试不同的方法来最大化这些指标。重采样非常吸引人的一点是,您通常可以丢弃大量数据,而不会真正影响结果。如果你有 1:1,000+的比率,你不想欠采样到 1:1。但是你可以去 1:100 或者 1:10,你可以得到完全一样的结果。现在你已经将数据集缩小了 100 倍。

“你的目标从来都不是准确性,也不是 ROC-AUC。这不是你申请的内容。你应该想一想,在你的应用环境中,取得一个特定的结果意味着什么。”

因此,至少如果你有很多数据,计算不是问题,欠采样是更有效地获得类似结果的方法。反过来说,我还没有真正见过有人在实践中使用 SMOTE,也就是合成数据生成。这是人们经常谈论的话题,但我对此有点怀疑。

就改变模型而言,Scikit 中的一个有用的东西是类权重。类权重实际上会改变损失函数,就好像对少数类进行过采样一样。所以你使用了所有的样本,但是给了少数类更多的权重。这是人们发现有用的东西。但是,这更像是尝试不同的东西,并且您有正确的指标来评估哪个解决方案最适合您的问题。

From Andreas Muller Columbia Lecture Series

有趣的是,你以那种方式提到了 SMOTE。在我的公司,我们一直在试验 SMOTE。但就实际结果而言,无论是 AUC 还是其他方面,都没有太大的好处。此外,它大大降低了我的流水线速度,因为我正在创建所有这些合成数据。所以想问问大家自己的疑惑从何而来。

因为我交谈过的每个人都说了你刚才说的话。

你认为这是为什么呢?

对我来说,机器学习中的很多东西都是非常经验性的。如果你在许多数据集上尝试,但没有帮助,那么它就没有帮助你。很难说为什么梯度增强效果很好。我想大多数人都相信渐变效果很好。但是我不认为任何人可以提出适当的理由来解释为什么梯度提升比支持向量机更有效。我认为没有人能以简洁或有意义的方式解释这一点。

就 SMOTE 而言,我认为有两件事正在发生:

  1. 我认为 SMOTE 对数据的分布做了假设。所以 A)要么关于相邻样本之间的线的假设是错误的。B)如果样本离得太远,中间还有其他类的样本,那么这种情况可能会破坏东西。
  2. 可能添加这些合成样本实际上对你感兴趣的模型类别没有帮助。

实际上,我和一个合作者有一个计划,要写一篇关于广泛基准的论文。这是因为,正如你所说的,你尝试使用 SMOTE 是有原因的,因为它是经过验证的文献中提出的方法,但在实践中,人们发现它对他们没有多大作用。

关于完整的采访,请观看 YouTube 视频的其余部分,其中 Andreas 对 Scikit-learn 包进行了更深入的研究。如果您喜欢这篇文章,请查看我们之前对哥伦比亚大学数据研究所所长 Jeannette Wing 博士的采访!(这是安德烈亚斯目前工作的地方)另外,请订阅我们的 YouTube 频道!

[## 我们没有谈到的最危险的数据科学问题

这位来自微软研究院的(前)副总裁计划如何通过管理一个庞大的数据机构来改变这种情况。

towardsdatascience.com](/the-most-dangerous-data-science-problem-that-we-arent-talking-about-9ba56ebbe498)

读数据科学硕士值得吗?

原文:https://towardsdatascience.com/was-it-worth-studying-a-data-science-masters-c469e5b3e020?source=collection_archive---------1-----------------------

自从完成数据科学硕士学位后,有很多人联系我,询问我对这门课程的体验,以及它是否值得推荐。因此,我认为最好总结一下我开始这门课程的决定,我在学习期间取得的成就,以及接下来几年的成果。

Source: Pixabay

我为什么选择学习数据科学?

那是 2016 年的春天,我在伦敦金融城最大的咨询公司之一为期 6 个月的实习即将结束。我担任这个角色是为了积累经验,并弄清楚成为一名精算师是否是我职业生涯的正确道路。当我被拉去参加会议,讨论我处理过的数字,或者能够拼凑出一个工具来自动化以前的手动任务时,我很快就找到了对这个角色的数据分析的热情。然而,我也发现,由于多年的标准化考试和很少甚至没有创造力,如果我进入研究生计划,我将走的传统道路不再让我感兴趣。此外,此时我的大部分工作都是在 Excel 中完成的,我几乎没有任何编码经验。

就在这个时候,我也开始探索一个在我找工作时不断出现的神奇术语:数据科学。我有数学背景,由于英国就业市场的性质,我被推向了基础良好的传统岗位,如会计和精算咨询。然而,这是一个新的角色,挑战了我对自己未来职业生涯的所有期望。作为一名精算师,我将通过学习监管标准来解决问题,而数据科学家被鼓励创造性地找到适合商业环境的解决方案。此外,角色机会不再局限于少数精选公司,而是几乎所有公司都在寻找数据科学家的变体,我可以进入一个全新的行业,从时尚到金融,这一想法极大地吸引了我的兴趣。

然而,当我开始申请数据科学职位时,很快就发现我缺少两项关键技能:应用机器学习和编码。

我有什么选择?

第一个解决方案是简单地自己教这些,我有学习机器学习的统计经验,并在 MatLab 中做了足够的编码,我有信心可以学习 Python 或 r。然而,如果我要做这些,我不确定这是否足够,以及如何在简历上向雇主清楚地展示我新获得的技能。

我考虑过在线训练营,但它们的内容通常是固定的,我不确定重复别人的工作会如何被雇主接受。此外,不能保证这些对雇主来说是可信的,而且自筹资金也很昂贵。仅仅三年后的今天,大学支持的课程清单使这成为一个更可行的选择,是一个绝对值得考虑的事情,但在当时这些是缺乏的。不幸的是,新兵训练营是一个昂贵的风险,我不确定是否会有回报。

因此,我决定在大学里寻找选择。当时有两种课程符合我的目标;商业分析师课程和计算机科学机器学习。前者专注于在商业环境中应用分析,但由于这是通过商学院进行的,所以费用要高得多,一年的学习费用超过 2.5 万英镑。后者通过学术研究提供教学,更侧重于教授基础理论而不是应用。此外,由于这是一门通过计算机科学系开设的学术课程,该年的费用相当低,为 9000 英镑(英国公民)。

我选了什么?

最后,我决定谨慎行事,将一整年的时间交给学术大师,希望通过项目工作获得机器学习方面的应用知识,并发展自己的编码技能。

因此,我加入了伦敦大学计算机科学系 City 的数据科学硕士 2016/17 届。这是该大学开设该课程的第二年,当时,它是伦敦唯一一所提供数据科学硕士学位的大学(尽管其他大学对此有所不同)。

我在课程中学到了什么?

第一学期包括数据科学的三个主要主题:数据科学基础、机器学习和可视化。每个模块都包括一个课程组成部分,我们可以选择任何公开可用的数据集来应用我们新学到的方法。有了这些,我很快就能够提高我的编码技能,甚至建立起开始公开分享这些项目的信心。

在第二学期,我们有两个核心模块,大数据和神经计算,并有两个可选模块可供选择。选项列表很全面,使我们能够选择从计算机视觉到数据架构的专业。我选择了数据可视化(第一学期模块的延续)和软件代理(应用强化学习的人工智能基础)。同样,这些模块包括课程作业和第一学期的基础知识,我真的能够扩展我的应用和创造性思维。大数据还引入了文本数据和自然语言处理。

在这两个学期中,我对大多数数据科学主题有了大致的了解,并对核心模块中的机器学习和神经网络有了深入的了解。当我们进入课程的第一部分,论文时,我们可以选择在实习的时候完成(并且考虑到工作时的平衡,可以延长截止日期)。我找到了一个合适的角色,定义了我的研究主题,并在接下来的几个月里将我迄今为止获得的所有技能应用于在商业中应用人工智能。

我是否从课程中获得了我需要的技能?

我有两个目标要实现;为了证明我理解机器学习,并将其应用于编码。这门课程不仅为我简历上的这些内容打了一个清晰的勾,还让我能够在接下来越来越多有趣的项目中继续拓展我的技能。任何工作申请的一部分都是要通过最初的检查,我现在一直在这样做。此外,当我进入面试阶段,我有所有这些项目来讨论,并真正证明我对自己理解的信心远远超过我自己所能达到的。

大师们打开了所有我之前敲过的门,甚至有招聘人员在我公开发布项目后直接联系我。最后,我发现我喜欢我论文的研究方面,喜欢追求这个领域的自由,并从此开始攻读人工智能博士学位。具有讽刺意味的是,这是我在 2016 年考虑的最后一件事,但随着该领域的不断扩展,站在这一领域的最前沿令人难以置信,特别是因为许多问题需要应用思维,并符合商业问题,而不仅仅是理论问题。

对于考虑进入数据科学领域的人,我有什么建议?

这对我来说一直是一个很难回答的问题,因为每个人的立场都是不同的,所以我会试着根据我的经验提供一些建议。简而言之:

  1. 确定数据科学是你的正确路线,并找到一个话题或细节来推动这一点。对我来说,它是以创造性的方式应用数据分析的能力,并成为企业中帮助他人改善决策的宝贵资产。
  2. 评估一下你想要的工作对你的要求是什么,以及你目前缺乏的技能是什么。虽然我有技术背景,但我还没有展示出我应用机器学习或代码的能力,需要一些东西来实现这一点。对于我班上的其他人来说,他们没有数学或统计学背景,因此需要这些来强化他们的知识。
  3. 回顾一下你可以用来获得这些缺失技能的选项。例如,新兵训练营在行业中越来越可信,但他们通常遵循单一路径(即学习相同的数据并应用相同的方法)。这可能对一些人有用,但我想以独特的方式展示我的能力,让雇主们眼前一亮。如果你正在考虑攻读硕士学位,请彻底研究课程模块以及课程组织者,因为不同院系之间存在差异,尤其是商学院和学院。
  4. 通过课程拓展和挑战自己,不要简单地选择一门涵盖你已经熟悉的主题的课程来打勾。找一些有挑战性的事情来鼓励你发展新技能。
  5. 通过 GitHub、Kaggle 或你自己的网站在线发布你的项目,展示你的新技能。在任何面试中,建立一个项目组合都比试图在允许的时间限制内描述这些更进一步。

举个例子,下面你可以找到我自己的网站和 Kaggle 页面的链接:

[## 菲利普·奥斯本数据

这个项目是作为在 Python 笔记本中独立学习强化学习(RL)的一种手段而创建的。正在应用…

www.philiposbornedata.com](https://www.philiposbornedata.com/) [## 奥斯伯恩普|卡格尔

编辑描述

www.kaggle.com](https://www.kaggle.com/osbornep)

如果你正在考虑如何进入数据科学领域,我希望这篇文章对你有用,并且我会尽我所能回答你的任何问题。

谢谢

英国货币

Wasserstein GAN 在 Swift for TensorFlow

原文:https://towardsdatascience.com/wasserstein-gan-in-swift-for-tensorflow-61b557bd8c63?source=collection_archive---------12-----------------------

Vanilla Generative Adversarial Network (GAN) as explained by Ian Goodfellow in original paper.

我是苹果 Swift 和深度神经网络的大粉丝。而最近即将推出的深度学习框架是 TensorFlow 的Swift。所以,很明显,我必须马上投入进去!我已经在 TensorFlow 或 PyTorch 中写过 Wasserstein GAN 和其他 GAN,但这个 Swift for TensorFlow 的东西超级酷。在后端,从编译器的角度来看,这是使 Swift 成为机器学习语言的最终努力。在本帖中,我将分享我在 Swift 为 TensorFlow 编写和培训 Wasserstein GAN 的工作。代码在 GitHub 上是开源的,现在就可以在 Google Colab 上运行!

生成对抗网的历史

G 生成对抗网络(GAN)是由 Ian Goodfellow 在 2014 年发明的。GAN 通常有两个神经网络,即生成器 G 和评价器 C 。唯一可用的数据是真实世界&实值数据(来自自然)的未标记集合,可以是图像、音频等。GANs 是为改进真实数据建模而设计的,这样当模型被要求生成图像时,它应该能够这样做,这就是 G 的用途。这里, C 帮助 G 学习生成更真实的数据,自己学习预测 G 生成的图像是假的。它也接受真实的图像,并学会称之为真实的图像。这是一个迭代过程,它提高了 C 预测虚假和真实数据的能力,并反过来帮助 G 调整其参数,从而生成更真实的数据。

这些香草甘不产生非常好的图像质量。因此,提高图像生成质量的工作仍在继续,该子领域中最重要的方向之一是将 Critic 网络约束在函数空间的 1-Lipschitz 集合中,并最小化 G 分布(假)和 P 分布(真)之间的 Wasserstein 距离。查看维基百科页面了解 Lipschitz 连续性。现在我们继续用 Swift 为 TensorFlow 编码 WGAN!

数据

数据是神经网络学习的第一步。因此,我使用了 CIFAR-10 数据集,它包含以下 10 个类别的图像:

  • 飞机
  • 汽车
  • 伯德
  • 鹿
  • 青蛙
  • 卡车

每个图像都是一个32x32大小的 RGB 图像。大约有 50k 的训练图像和 10k 的测试图像。哇,我从来没有注意到图像类的数量接近 MNIST 数据集中的数量🤔。总之,我用这些数据来训练我的 Wasserstein GAN 生成这样的图像。

import TensorFlow
import Python
PythonLibrary.useVersion(3)// Import some Python libraries
let plt = Python.import("atplotlib.pyplot")

Data downloading and loading

首先使用 Swift for TensorFlow toolchain 导入 TensorFlow 和 Python(3 . x 版)。然后通过 Python 互用性特性导入 Python 库!现在定义一些 CIFAR-10 下载、加载和预处理函数。最后,加载数据集。

配置

为了训练网络,需要设置一些重要的配置。我尽量保持配置与 WGAN 纸相似。因此,我将批量大小设置为 64,图像大小调整为 64x64,通道数(RGB)为 3。WGAN 被训练了 5 个纪元(如 PyTorch 教程中所建议的)。 G 的潜在空间被设定为 128 维。每个 GC 的迭代次数被设置为 5,这是为了很好地近似 1-Lipschitz 函数,如论文中所建议的。另外, C 的可训练参数值必须限制在极限值[-0.01,0.01]。

Configurations

瓦瑟斯坦生成对抗网络

如上所述,WGAN 的模型包含一个 CG 网络。 C 包含多个卷积层,而 G 由顺序转置卷积层组成,这些卷积层有时也被错误地称为反卷积层。

自定义图层

在 Swift 中为 TensorFlow 定制神经层,使你的结构符合[Layer](https://www.tensorflow.org/swift/api_docs/Protocols/Layer)协议。Swift 中 TensorFlow 的参数是通过使您的神经结构符合[KeyPathIterable](https://www.tensorflow.org/swift/api_docs/Protocols/KeyPathIterable.html)协议来访问的,这是默认的,但我写它是为了记住 Swift 中类型属性的迭代是如何发生的。目前,用于 TensorFlow 的 Swift 中的[TransposedConv2D](https://www.tensorflow.org/swift/api_docs/Structs/TransposedConv2D)实现工作不太好,所以我决定按照 Odena 等人 2016 建议的方式,在Conv2D层之后使用[UpSampling2D](https://www.tensorflow.org/swift/api_docs/Structs/UpSampling2D) op。使用[Conv2D](https://www.tensorflow.org/swift/api_docs/Structs/Conv2D)结构,因为它跟随[BatchNorm](https://www.tensorflow.org/swift/api_docs/Structs/BatchNorm) op,该 op 也在连续的UpSampling2DConv2D操作之后使用,代替TranposedConv2D。我写的这些自定义层用 Swift 代码显示如下。

Custom neural layers

WGAN 架构

G 网络从高斯分布中取形状为【128】的随机向量。这将在BatchNormrelu激活功能之后通过一个密集(全连接)层。产生的转换输出被重新整形,使得它可以通过一系列的UpSampling2DConv2DBatchNorm层和relu激活。最后的层块简单地对卷积层和tanh激活函数之后的输出进行上采样。

网络 C 的架构是这样的,它有 4 个块Conv2D,后面跟着BatchNorm。每个块后面都有一个负斜率为 0.2 的leakyReLU激活函数。在撰写本文时,leakyReLU功能尚未在 Swift for TensorFlow 中实现,因此我通过使其可区分来实现自己的功能。最后,输出被展平,并通过产生[1]维输出的密集层,以给出图像是真/假的概率。

Wasserstein GAN architecture

请注意,在 GC 中,步幅为(2,2),填充设置为相同。两者中的内核大小都被设置为(4,4)大小。在上面的两个网络中,call(_:)函数使用@differentiable属性变得可微。用类似的方法创建可微的 LeakyReLU 激活函数。

Differentiable Leaky ReLU

培养

网络被训练 5 个时期。在每次迭代中, CG 的单个训练步长多训练 5 次。每个网络使用的批次大小为 64。我使用 RMSProp 优化器,两个网络的学习率都是 0.00005。 GzInput取自均匀分布。我还记录了 1 个纪元的训练时间,对我来说大约是 12 分钟。使用 Matplotlib 还绘制了 Wasserstein 距离和几个损失(如 G 损失&T21C 损失)的图表,这是因为 Swift for TensorFlow 支持 Python 互操作性。关于 TensorFlow 的 Swift,我学到的另一件事是,您可以迭代任何任意类型的属性,这些属性符合在 apple/swift 的 tensorflow/swift fork 中实现的keypathiable协议。这是一个超级酷的想法,但许多工作仍然需要做,如访问特定层的参数和修改需要应用每层激活。

不管怎样,下面是一个更深入的自我解释的 Swift 代码,用于训练我的 Wasserstein GAN!

注意,需要通过下面几行代码来设置训练/推理模式。

// For setting to training mode
Context.local.learningPhase = .training
// If you want to perform only inference
Context.local.learningPhase = .inference

讨论

用 Swift 语言接触深度神经网络是一种很好的体验。我认为 Swift for TensorFlow 将成长为一个新的主流机器学习框架,很可能取代 PyTorch 的大部分功能,就像 PyTorch 过去对 vanilla TensorFlow 所做的那样。我真的很喜欢它支持作为默认行为的急切执行,而且我不必手动设置设备进行训练&我还可以在 Google Colab 中使用云 TPU。很高兴看到 TensorFlow 社区通过提供基于 Jupyter 的 Swift 环境,努力使 Swift for TensorFlow 可在 Colab 上使用。也可以使用Raw类型的名称空间(我想它更像结构,因为 Swift 中不存在名称空间的概念)来访问一些基本的操作,如mul(_:_:)add(_:_:)等。在 Swift for TensorFlow。这是谷歌 TensorFlow 团队克里斯·拉特纳 &斯威夫特的一项令人敬畏的努力。

以下是我对 Swift for TensorFlow 目前在研究原型方面提供灵活性的方式的部分担忧。

访问每层的参数

Swift for TensorFlow 采用了一种新颖的方法来访问一种类型的属性以进行修改。这是访问和更新神经网络参数所必需的。该设备提供给符合按键可变协议的类型。默认情况下,符合层协议的神经网络结构存在这种行为。所以,你不必一遍又一遍地写,因为很可能你会想要访问神经网络的属性。这工作得很好,正如我在 Wasserstein GAN 代码中所做的那样,但我仍然不能灵活地访问每一层的参数,但我只是迭代一次所有属性,而不知道它们当前属于哪一层。这实际上不是我的要求,但在其他情况下,比如你想进行迁移学习时,这可能是一个要求。它需要访问特定的层来更新参数。希望 Swift 能很快为 TensorFlow 提供这种灵活性。

每层激活函数

我认为谷歌将会并且可能需要改变激活应用到每一层的方式(这是我不用的,因为 LeakyReLU 不能那样应用)。它类似于Conv2D(…, activation: relu),其中 relu 也可以被线性激活代替,但 LeakyReLU 不太适合这种设计,因为它没有给定的斜率值。这里,函数没有被调用,它只是一个作为参数传递给 Conv2D 层或任何其他层的函数。我能想到的最好的解决方案是使用枚举而不是像Conv2D(…, activation: .relu)那样传递函数,或者对 LeakyReLU 做类似Conv2D(…, activation: .leakyrelu(0.2))的事情,其中 0.2 是激活函数的枚举情况leakyrelu的关联值。

我希望你喜欢这本书。如果你真的喜欢我的文章,请与你的朋友分享,关注我吧!除了写文章,我还积极地在推特上发关于机器学习、区块链、量子计算的微博@ Rahul _ Bhalley

通过研究海洋塑料的兴起了解 R Shiny 第一部分

原文:https://towardsdatascience.com/watch-the-rise-of-plastics-in-our-oceans-part-one-61ccd16cfa04?source=collection_archive---------25-----------------------

在本系列文章中,学习如何使用刚刚发布的海洋塑料数据在 R Shiny 中构建一个 web 应用程序

在《自然》杂志最近的一篇文章中,一组海洋科学家分析了自 20 世纪 30 年代以来被称为连续浮游生物记录器(CPR)的设备收集的数据。CPR 在日常航行中由船只牵引,用于捕获浮游生物进行研究。

但从 1957 年开始,CPRs 开始意外地捕捉到另一条数据——我们直到最近才知道它会有用——因为在那一年,CPR 首次被发现受到人造塑料物体的污染。

在他们的期刊文章中,科学家团队煞费苦心地收集了一个数据集,其中包括从 1957 年第一次记录事件到 2016 年在北大西洋、北极和北欧海洋的 CPR 中发现的所有此类人造塑料事件。他们还向公众开放了该数据集——共有 208 起各类塑料事故,从渔网到塑料袋。

当我在这里查看数据集时,我意识到这是一个很好的数据集,可以帮助教某人如何使用 R Shiny 创建数据探索应用程序,这也是我将在这一系列文章中做的事情。数据集的大小有限,因此很容易处理,但包含了广泛的信息,包括日期、文本和地理坐标数据。

要阅读本系列,您需要一些在 R 中操作数据的基本经验,包括使用 RStudio 作为编码环境。以前在ggplot2中使用 RMarkdown、Shiny 和简单绘图的一些经验是有帮助的,但不是必需的。您需要在启动前安装以下软件包:shinyRMarkdownggplot2tidyverseleaflet

在本系列中,您将学习如何:

  • 在 R Markdown 中设计一个简单的 web dashboard 格式,并准备您的数据在这个 dashboard 中使用。
  • 理解闪亮应用的反应,以及输入和输出是如何相互作用的
  • 创建根据用户输入而变化的简单图表
  • 在地图上可视化坐标数据
  • (高级):创建动画时间序列图形
  • 发布您的应用程序,以便其他人可以使用它

要查看将成为本系列最终产品的应用程序,您可以访问这里的和 Github 上的全套代码这里的。这是一个更酷的输出——一个动画时间线剪辑,展示了自 1957 年以来在 CPRs 中发现的所有人造塑料实例。

什么是闪亮的?

shiny是一个开源的 R 包,它为使用 R 构建 web 应用程序提供了一个优雅而强大的 web 框架。

描述shiny的价值的一种方式如下:假设你是一家公司的分析师,你可以访问一组机密数据,许多人想要这些数据的统计数据。您每天至少会收到六个请求,要求获得可预测的统计数据,如基于指定过滤器的分组平均值。处理这种情况的一种方法是每次自己手动进行这些分析,并将结果发送给请求者。

另一种方法是构建一个简单的自助式应用程序,请求者可以随时访问,选择他们的过滤器和其他输入,并立即看到结果。shiny允许通过网络探索数据集,开发者可以决定可以看到什么以及如何看到。使用shiny,R 程序员可以节省大量的手工劳动,代价只是一点额外的编码。(事实上,在每一个版本中,Shiny 可以做的远不止这些,但现在让我们坚持这样做)。

为了使用shiny,R 程序员需要稍微钻研一下反应性的世界。他们需要了解输入如何反馈到 R 中的反应性变量,以及如何控制反应性,以便显示他们想要的输出。如果你没有时间学习和掌握 Javascript,shiny是一个很好的选择,可以实现通过 web 发布反应分析的目标。

设计您的仪表板

你如何设计你的仪表板很大程度上取决于它将如何被使用。如果它是一个被很多人用来满足特定需求的产品,建议遵循良好 UX 设计的原则,在进行模型和技术开发之前,进行用户访谈,以准确了解用户的需求。

在这种情况下,由于这是一个有趣的项目,而不是一个庞大的用户群,我们可以决定自己的设计。我们需要做的第一件事是查看数据并问:我们认为人们会有兴趣看到什么?以下是我们正在处理的 CPR 数据的快照:

我们可以看到一些有趣的东西。首先,“观察”栏帮助我们确定发现了什么类型的塑料,允许我们向数据集添加“类型”(类似于科学家在 Nature 文章中进行的分析),这可能有助于过滤。还有一个“拖一年”的专栏,帮助我们理解时间线。拖曳的起点和终点都有坐标,帮助我们直观地看到塑料是在哪里发现的,最后还有不同海域的名称,这可能也有助于过滤。

因此,在我们的应用中包含以下内容可能会有所帮助:

  1. 能够根据塑料类型和海洋区域过滤所有分析
  2. 能够按年份过滤某些分析
  3. 能够看到 CPR 中塑料发生率的一些基本统计数据(可能受 Nature 文章中所做分析的指导)。
  4. 能够在地图上显示这些事件发生的时间和地点。

因此,我们将如下设计我们的仪表板:

全局工具条将一直可见。它将给出一些一般的使用指南和背景,它将允许按塑料类型和海洋区域过滤,以便在应用程序中显示的任何结果都将反映这些过滤器。然后将有三个独立的页面,每个页面关注数据的不同方面:

  • STATS 将提供一些关于事件的描述性统计信息,以及一些进一步的过滤选项
  • 位置将在某种形式的地图上呈现事件的位置
  • 时间将以某种形式显示事件是如何随着时间的推移而发生的

准备在应用程序中使用的数据

考虑到我们的设计,我们现在需要获取研究人员给我们的数据集,并将其用于我们的应用程序。这有两个步骤。

首先,我们需要添加我们在设计中考虑的特定分析所需的任何新列。正如我上面提到的,这个数据集已经处于良好的状态,但是我们确实需要解析观察列来确定每个事件的“类型”,我们可以清理列名以使它们更容易使用,因为当它们直接加载到 r 中时会看起来非常混乱。所以让我们在 RStudio 中启动一个项目,并将其命名为cpr_data,让我们在该项目中创建一个名为data的子文件夹,在其中我们可以放置研究人员提供给我们的原始xlsx文件。我们可以编写一个简单的 R 脚本来添加新的“type”列并整理列名——我们称之为prep_data.R。我们可以通过在 Excel 中打开数据集,删除第一行,重新保存为 CSV 文件并使用read.csv来加载数据集。或者像我下面做的那样,直接用openxlsx包读入 R。

# prep data for use in CPR app# load librarieslibrary(dplyr)
library(openxlsx)# prep data for use in CPR app# load librarieslibrary(dplyr)
library(openxlsx)# load original data file and make colnames easier to code withdata <- openxlsx::read.xlsx("data/Supplementary_Data_1.xlsx", sheet = 1, startRow = 2)colnames(data) <- gsub("[.]", "", colnames(data)) %>% 
  tolower()colnames(data)[grepl("region", colnames(data))] <- "region"# create columns to classify by key termdata <- data %>% 
  dplyr::mutate(
    type = dplyr::case_when(
      grepl("net", observation, ignore.case = TRUE) ~ "Netting",
      grepl("line|twine|fishing", observation, ignore.case = TRUE) ~ "Line",
      grepl("rope", observation, ignore.case = TRUE) ~ "Rope",
      grepl("bag|plastic", observation, ignore.case = TRUE) ~ "Bag",
      grepl("monofilament", observation, ignore.case = TRUE) ~ "Monofilament",
      grepl("string|cord|tape|binding|fibre", observation, ignore.case = TRUE) ~ "String",
      1L == 1L ~ "Unclassified"
  )
)# save as an RDS filesaveRDS(data, "data/data.RDS")

在这个脚本中,我们使用grepl()来标识 Observation 列中文本字符串中的术语,然后使用dplyr::case_when()将这些术语分配给一个type。如果没有匹配的术语,我们定义一个type ~ "Unclassified"。我们还将列名改为易于编码的简单小写字符串。

其次,我们需要重新保存转换后的数据。稍后,当我们编写了应用程序并部署它以便其他人可以访问它时,这个数据文件将与它捆绑在一起,应用程序将把它读入它的环境。如果这个数据集非常大,我们需要考虑 R 可以读取的最快的文件格式。但是在这种情况下,数据集很小,所以我们可以选择任何文件格式来保存它。在这种情况下,我们将保持简单,将数据集作为 R 对象保存到一个RDS文件中。

下次…

因此,我们已经计划好了基本设计,并以正确的方式设置了数据。在本系列的下一部分中,我将介绍如何启动和运行仪表板的简单轮廓。我还将讨论如何处理输入和反应变量,以及如何在ggplot2中构建一些基本的描述图来响应用户输入。

练习

以下是一些后续练习,你可以用它们来测试你对本文内容的理解程度:

  1. 什么是 R Shiny?为什么它对这个数据集有用?
  2. 如果用户群很大而且多样化,你会如何着手设计这个仪表板?
  3. R Shiny 应用程序如何使用本地数据集?当你创建一个要在 R Shiny 应用中使用的数据集时,你要考虑的关键问题是什么?
  4. 阅读产生这个数据集的 《自然》文章。读过这篇文章后,你还可以用什么方法来设计这个仪表板?

最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在LinkedInTwitter上找我。

看这个神经网络学会看

原文:https://towardsdatascience.com/watch-this-neural-network-learn-to-see-545492272440?source=collection_archive---------11-----------------------

在整个模型训练中可视化卷积层激活

Image by Sian Molloy

给手机用户的一个警告:这篇文章中有一些厚的 gif 图片。

动机

深度学习相对于其他机器学习技术的主要优势是它能够自动学习输入数据的抽象表示。然而,事实并非总是如此。早在 1969 年,Minsky 和 Papert 出版了一本书,证明了单层感知器(人工神经网络的祖先)无法解决 XOR 问题。对于我们这些没有计算机科学背景或没有其他生活经历的人来说,异或问题就是接受两个二进制输入, AB ,当且仅当 AB 中的一个为真时,返回,因此得名“异或”,或 XOR。单层感知器无法解决这个问题的原因是它们只能解析线性可分的类。如果您要画出 XOR 问题的可能输入及其输出,空间看起来会像这样:

The world’s worst game of tic-tac-toe (source: wikimedia commons)

现在,你能在这张图片上画一条直线,把圆圈和十字分开吗?剧透:不能,感知器也不能。幸运的是,勇敢的先驱们拥有将两个感知机粘在一起的洞察力,深度学习领域由此诞生(或多或少)。这样做的原因是,神经网络的每一层都可以被视为前一层的嵌入;虽然上图中的圆圈和十字在它们的原始形式下可能不是线性可分的,但是通过简单的编码它们是线性可分的。抓住图像的左上角和右下角,并在脑海中保持不动。然后,借助你的想象力,通过第三维度将图像对折,将右上角拖出屏幕,然后向下按回到左下角。如果你做对了,它应该是这样的:

If you look closely, you may notice I’m not an artist

现在,你能画一条穿过这张图片的直线,并把圆圈和十字分开吗?我真诚地希望如此。这种获取信息并将其编码为其他更有用的形式的行为,是神经网络擅长的主要任务。事实上,训练神经网络不是为了它们的预测能力,而是为了它们发现的学习表示,这一直是深度学习研究的支柱。

学习观察

卷积神经网络(CNN)是将深度学习应用于图像数据的最流行的架构。简而言之,CNN 学习许多过滤器,它们应用于图像的每个像素及其层。通过将这些过滤器应用于图像,以及重复下采样,神经网络学习识别其第一层中的简单、低级特征以及其最后一层中的复杂、高级特征。或者至少,这是他们通常的解释。

Image Source: Convolutional Deep Belief Networks for Scalable Unsupervised Learning of Hierarchical Representations, by Lee et al.

正如你所看到的,该模型学习识别各种边缘,然后面部特征,然后整个脸(许多中间层被删除)。如果你在谷歌上搜索“卷积神经网络层可视化”,你会发现大量的上述图片。然而,我从来没有在训练过程中见过 CNN 层的可视化,所以我想我应该看看它们是什么样子的。在这次探索中,我使用了常见的 MNIST 数据集,这是一组 60 000 个黑白手绘数字,每个数字的高度和宽度都是 28 像素。我使用了一个简单的卷积模型,如下所示:

The network architecture, including 6 convolutional layers and 3 dense layers

形象化

神经网络被训练五个时期,具有 1024 个图像的小批量大小,总共 290 个训练步骤。在每一步之后,预先选择的一组十个样本图像(每个数字一个)被输入到模型中,并且保存每个卷积层的激活。尽管近年来它已经不再流行,取而代之的是更容易训练的 ReLU 函数,我还是决定使用 tanh 作为卷积层的激活函数。这是因为 tanh 介于-1 和 1 之间,这使得可视化变得简单。当第一层的激活被应用到红蓝颜色图时,结果如下:

Conv1: The input images (top row) and the activations of the four channels in convolutional layer 1. Activations range from +1 (blue) to 0 (white) to -1 (red). Frame (top left) is the number of training steps applied.

Conv1 似乎已经学会识别第一和第二通道中的笔画宽度,因为每个数字的内部是暗红色,而外部是浅红色。在第三和第四个通道中,它似乎已经学会了边缘的概念,数字是蓝色的,背景是粉红色的,数字边缘是白色的。然而,这些激活从深度学习佳能所建议的来说是一个长镜头,即每个通道将学习一个清晰和独特的特征,例如垂直和水平边缘;Conv1 在很大程度上再现了原始输入,并稍加注释。

Conv2: The same setup as Conv1.

与 Conv1 类似,Conv2 似乎也在再现原始输入。通道 1、通道 2 和通道 4 彼此几乎相同,并且与 Conv1 中的边缘突出显示行为几乎相同,通道 3 只是输入的模糊再现。

Conv3: The same setup as Conv1, except with eight channels instead of four. This layer has half the resolution as the original image, so activations were upscaled without interpolation for visualization.

在 Conv3 中,我们看到了可能是第一个真正习得的特性。在第六个通道中,接近训练结束时,我们看到手指是蓝色的,大部分背景是粉红色的,手指每个部分正下方的背景是红色的。这表明这个通道已经学会识别水平边缘的底部。类似地,第七个通道有红色数字,粉色背景,每个数字上方有白色水平边缘。然而,其他通道似乎是原始图像的简单复制。

Conv4: The same setup as Conv3.

在 Conv4 中,我们可以看到更清晰的特性。特别是,我们看到不同角度的边缘。第一、第二和第六通道标识水平边缘的顶部。第三、第七和第八通道标识对角边缘。其他两个通道是原始通道的粗略再现。

Conv5: The same setup as Conv1, except with sixteen channels instead of four. This layer has one-quarter the resolution of the original image, so activations were upscaled without interpolation for visualization.

Conv5 进行了大量的下采样,分辨率仅为 7x7 像素,但似乎具有有意义的特征提取。在训练的最初阶段,每个频道都是粉红色的,基本上没有信息。到步骤 70,该层已经学会产生模糊地类似于输入的斑点。然而,在训练结束时,这些通道已经明显地彼此区分开来,并显示出激活的急剧变化。由于低分辨率和我们所谓的独立功能的纠缠,我们不清楚这里学到了什么功能,但很明显,这里的每个通道都有一些有用的东西。

Conv6: The gif was too large for Medium, so these are the activations after training has completed.

不幸的是,Conv6 刚好超过 Medium 的文件大小限制,你必须点击这个链接才能观看它学习。与 Conv5 类似,学习到的功能清晰可见,但几乎不可能说出它们实际对应的是什么。

Accuracy and loss (categorical_crossentropy) during training

经验教训

那么这个故事的寓意是什么呢?我建议有三个。首先,深度学习的结果很少像佳能所说的那样清晰。很多教材,包括深度学习 (Goodfellow 。),把低级卷积层比作 Gabor 滤波器和其他手工制作的计算机视觉滤波器。尽管该模型在测试数据上达到了 95%以上的准确率,但前四个卷积层在特征提取方面做得很少。诚然,对于一个非常简单的任务来说,这是一个非常简单的模型,而且很可能一个为更困难的任务训练的更复杂的模型至少会学习一些有用的低级特征,但深度学习通常被教授的方式(以我的经验来看)表明,特征提炼和提取是不可避免的,即使对于简单的任务来说也是如此;事实显然并非如此。

第二个教训是,习得的特征不太可能是人类可能选择的直观、独立的品质。Conv5 和 Conv6 显然已经学会了一些东西,原始图像已经以这样一种方式进行编码,即网络的密集层可以根据数字类型对它们进行分类,但还不清楚它们学会了检测什么。这是深度学习中的一个常见问题,尤其是在生成模型中,模型可能会学习将两个或更多看似不相关的品质嵌入为单个特征。

第三个教训是我在作为数据科学家的工作中每天都会想起的,那就是可视化一切是值得的。我进入这个项目,期望写一篇非常不同的文章。我很兴奋地展示了网络学习和提炼功能,从低级的边缘检测到高级的循环和旋转。相反,我发现了一个懒惰的懒汉,直到最后一刻才改进功能。最值得注意的是,我惊讶地发现,一旦这些层学会了输入的一些表示,它们在训练过程中几乎没有改变。将这一点可视化增强了我对卷积神经网络训练的理解。我希望你在这里也学到了一些东西。

对于那些好奇的人来说,用来训练这个网络并产生这些可视化效果的代码可以在这个 Github repo 中找到:

[## ConorLazarou/培养基

卷积神经网络学习识别手写数字时的可视化

github.com](https://github.com/ConorLazarou/medium/tree/master/12019/visualizing_mnist)

看机器学习模型拟合曲线!

原文:https://towardsdatascience.com/watching-machine-learning-models-fitting-a-curve-c594fec4bbdb?source=collection_archive---------7-----------------------

Image www.pexels.com

图灵奖获得者 Judea Pearl 的声明表达了当前流行的机器学习应用程序(深度学习)背后的简单机制。

“机器学习只是美化了‘曲线拟合’”

[## 人工智能的今天和明天主要是关于曲线拟合,而不是智能

随着围绕人工智能价值的辩论继续,人工智能冬天的风险是真实的。我们需要对什么是真实的和什么是…

diginomica.com](https://diginomica.com/ai-curve-fitting-not-intelligence)

在本文中,我想从字面上理解这句话,并在学习过程中观察简单的模型。在动画中,我们将能够看到不同的模型是如何学习的。为了做到这一点,我们查看简单的人工生成的数据,这些数据只包含一个输入参数和一个输出参数。

查看生成数据的 Python 代码:

“listex”值用作输入值,“listey”用作输出值。他们一起构建训练数据。这些值是由线性函数和随机的正态分布数字产生的。

神经网络如何找到这些数据背后的联系?是否识别了正确的连接?

如何应对随机干扰?

过于擅长表示给定数据集的曲线拟合方法的一个风险是过度拟合,即算法无法识别数据中的正常波动,最终被噪声撕裂。

有了“tensor flow”(【https://www.tensorflow.org/】)我们可以轻松地创建和训练这样的模型。

上面创建的神经网络仅由一个没有激活功能的细胞组成。所以它只代表一个简单的线性回归。

现在,我们可以通过计算一组输入值的预测来了解模型所学习的函数。

并将它们与训练数据一起绘制出来:

首先,用 TensorFlow 对数据(蓝点)训练没有激活函数的线性模型,并在训练-时期(黄点)后进行预测。你可以在视频中看到曲线是如何拟合的。

它学习数据背后的线性关系。

当我们使用一个有更多细胞和层的神经网络时会发生什么?

更多的神经元

该模型过度解释了数据(过度拟合),因此不太适合一般化。

当数据背后的规则变得更加复杂的时候呢?

这些值是由二次函数和随机的正态分布数字产生的。

让我们从仅包含一个线性单元的简单模型开始。

它无法对上下文建模。为此,该模型不够强大(也就是说,它没有足够的参数来学习)。
让我们使用一个更强大的模型:

另一个更强大的模型是:

这里再次出现过度拟合。

在这一系列动画中,我们已经看到,对于只有一个输入和一个输出值的非常简单的情况,选择神经网络的架构是多么重要。参数太少的模型无法正确模拟数据,参数太多的模型往往会很快溢出。

WatermelonBlock 和 Google BERT |直到更好的 NLP 模型将我们分开

原文:https://towardsdatascience.com/watermelonblock-and-bert-till-better-nlp-models-do-us-part-555ad7839a7c?source=collection_archive---------26-----------------------

BERT——任何 NLP 工程师都渴望得到的完美新年礼物。

WatermelonBlock 的数据科学团队已经接受了实验,我们已经开始实施深度文本挖掘算法,以便不时提高准确率,从而产生高效的数据管道。这种管道可以处理我们从网络上获得的大量自然语言语料库,并轻松实现偏差-方差权衡。

Source: WatermelonBlock

我们在 IBM 的合作伙伴在与我们合作,利用 IBM PowerAI 服务器进行这些实验,并获得预期的结果。该团队一直在开发一些令人难以置信的自然语言处理模型,以便为我们的客户提供智能但通用的实时洞察应用程序。一个这样的模型是趋势开源 NLP 模型——最近由 Google 开发的【BERT】。我们在为我们的应用测试 BERT 框架时获得的初步结果表明,分类错误减少了 20%,并且仅用了 4 个小时来训练包含超过 140 万个示例的非结构化数据集的集成模型。

https://Twitter . com/watermelon block/status/1078929013094010885

这好得令人难以置信,但的确,这是我们迄今为止最好的成绩之一。任何数据科学团队都渴望得到的完美新年礼物。事实上,我们已经爱上了这个框架,迫不及待地将它部署到生产中。

那么什么是 BERT,它是如何工作的?

来自 Transformer 的 BERT a.k.a 双向编码器表示法是一种预训练语言表示法的新方法,它在各种自然语言处理任务(如语际机器翻译和事实核查)上提供了最先进的结果。让我们从模型基础背后的概念开始。

伯特的内脏(来源:插图伯特|杰伊·阿拉玛)

BERT 基本上是一个带有关注机制的变压器编码器堆栈。

如果你不知道什么是注意力机制,这篇由 WildML 撰写的精彩文章将让你快速了解!另一方面,转换器是一种深度学习模型,它通过将输入数据表示为合适的形式来加速整个堆栈的训练过程。虽然转换器由两个重要的组件组成,即相互连接的编码组件解码组件,但是 BERT 只使用编码组件进行操作。

下图是一个使用转换系统将法语句子翻译成英语的简单黑盒案例。

A transformer stack | Source: The Illustrated BERT, Jay Alammar

编码组件是一个编码器堆栈(为了给出一个例子,我们将 6 个编码器堆叠在一起,但是也可以尝试其他的排列)。每个编码器都有一个前馈网络层和一个自关注机制层,而每个解码器都有一个相同的附加层— 编码器-解码器关注。

Encoder & Decoder Components | Source: The Illustrated BERT, Jay Alammar

编码器的输入最初流经自我关注层,这是一个神经层,帮助编码器在编码特定单词时查看输入句子中的其他单词。

自关注层的输出然后被馈送到前馈层——该层分配权重并将编码的单词向量向前传播到下一个编码组件。

解码器有这两层,但在它们之间有一个编码器-解码器 注意层,这是一种安全措施,有助于解码器关注给定输入句子的相关部分。

伯特的建筑(来源:插图伯特|杰伊·阿拉玛)

已经开发了两种类型的 BERT 模型:

  1. BERT Base: 体积较小,计算负担得起,不适用于复杂的文本挖掘操作。

  2. BERT Large: 体积较大,计算开销大,处理文本数据只是为了提供最佳结果。

BERT Variants | Source: The Illustrated BERT, Jay Alammar

两种 BERT 模型都有‘N’编码器层(也称为变压器模块),形成了一个大规模的数据编码堆栈。通常基础版 N = 12 ,大版 N = 24 。他们有更大的前馈层(分别为 768 和 1024 个隐藏单元),以及自我关注层(分别为 12 和 16)。

出于解释的目的,让我们使用具有 6 个编码器层、512 个前馈层和 8 个自我关注层的迷你版 BERT 来对垃圾文本或真实文本进行分类。

Encoder Block | Source: The Illustrated BERT, Jay Alammar

就像变压器中的典型编码器一样,BERT 接受一系列单词作为输入,这些单词在堆栈中不断向上流动。每一层应用自我关注,并通过前馈网络传递其结果,然后将其交给下一个编码器。第一个输入令牌是分类器令牌【CLS】,它通过前馈网络和 softmax 函数将该层中输入的编码版本传送到下一个编码器层。

就输出而言,转换器堆栈中的每个编码器位置给出一个隐藏大小为 768 的合成向量(在 BERT Base 的情况下)

Encoded Output Flow | Source: The Illustrated BERT

对于垃圾邮件分类的任务,仅仅单个编码器位置就足够了。生成的向量然后被发送到我们选择的分类器,它通常是一个单层神经网络,具有分配最终权重的前馈网络和用于非线性的 softmax 函数。softmax 是一个很棒的激活函数,它将数值上不正确的逻辑转换成一个平衡的概率分布,所有的概率总和为一。

Probabilistic Classification | Source: The Illustrated BERT, Jay Alammar

如果有更多的目标标签可以自动将电子邮件分类为“社交帖子”或“推广电子邮件”,那么调整分类器网络以具有更多最终通过 softmax 函数的输出神经元(在本例中为 4 个输出神经元)就足够了。

从分类器获得的概率值给出了电子邮件是垃圾邮件或其他邮件的可能性。虽然垃圾邮件分类只是 BERT 如何轻松做到更好的要点,但假新闻检测、社会情绪分类、令牌审查监控等复杂任务都有发挥的空间。

就我们在 WatermelonBlock 的实验而言,BERT 是 ELMo、ULMFiT 等众多模型中的一个,我们努力通过快速集思广益会议为我们的客户创建最佳洞察应用程序。

如果您喜欢这个技术博客,并想了解更多关于 WatermelonBlock 的工程师和数据科学家如何构建下一代产品的信息,请热烈鼓掌欢迎这篇文章,并关注我们的中型博客频道,网址为 WatermelonBlock ,也可以访问我们网站上的公告页面,了解即将发布的新闻!

参考资料:

1.《图解变形金刚》,杰·阿拉玛,2018,【https://jalammar.github.io/illustrated-transformer/

2.“自然语言处理中的自我注意机制”,https://dzone . com/articles/Self-Attention-Mechanisms-in-Natural-Language-proc

3.《开源 BERT:自然语言处理最先进的预训练》, Google AI,2018

波形分析解锁音乐中的数据

原文:https://towardsdatascience.com/waveform-analysis-unlocks-the-data-in-music-c47e773f1fa8?source=collection_archive---------16-----------------------

一个波形就是一首歌的指纹。正是这种波形,或声波的卷积,包含了一首歌的所有内容。从中可以发现大量的特征。这些功能能够增强推荐算法,远远超过仅使用歌曲的标题、艺术家和流派所能达到的效果。无论是作为纯粹基于内容的方法的一部分还是作为解决【冷启动】问题的重要第一步,理解媒体内容与理解它是如何被消费的同等重要。

Pixabay

我与音乐的关系

音乐对我来说极其重要。这是我生命中不变的一部分,它见证了我走过的各行各业,无论是好的还是坏的。因为我花了很多时间在音乐上,所以寻找新的音乐一直是我的激情所在。虽然我不知道这些年来我花了多少时间听音乐,但我知道仅在过去的八年里,我已经积累了超过 6000 首个人精选的歌曲。

The size of my music library.

由于我的整个音乐收藏都是离线存储的,我无法参与协同过滤算法,就像音乐流媒体平台用来推荐新歌的那些算法一样。具体来说,如果用户 X 听了很多和我一样的音乐,音乐流媒体平台就知道我可能也喜欢用户 X 听的其他歌曲。因此,如果我想创建主题播放列表,我只能对手头的音乐进行基于内容的过滤。

然而,从这么大的一个集合中手工选择一组有凝聚力的歌曲是很费时间的,即使我能完美地回忆起每首歌的标题、艺术家及其识别特征(例如,古典、钢琴或“chill”)。事实上,我只能回忆起这些歌曲中的一小部分,并且经常忘记艺术家的姓(我知道他们的名字是约翰… 什么的),所以以这种方式制作播放列表是一项艰巨的任务,我通常会避免。相反,我通常通过启用随机播放和按播放来简化这个过程。

然而,去年我意识到,我可以利用歌曲的波形数据来解决创建播放列表这一日益严重的问题。我以前处理过来自光源的数据,因为光和声音都是以波的形式传播的,所以我相信我能够利用我的技能来解决这个问题。

Example single channel audio waveform.

特征提取和选择

在兴奋和西雅图咖啡的刺激下,我头脑风暴了一下我的方法:从这些波形中可以提取什么特征?哪些功能对我想要的最有用?应该如何为播放列表选择歌曲?

我想开始,并且知道一旦我掌握了一些特性,我就能够回答后面的问题,所以这就是我开始的地方。在重构了当时已经过时的 pyAudioAnalysis 包并管理了包的依赖关系之后,我为每首歌提取了特征。我知道如果我只提取歌曲的一部分的特征,提取的特征可能不能准确地反映歌曲的整体。为了解决这个问题,在移动窗口中提取特征并进行平均。通过这样做,可以计算每个特征的方差,并将其用作附加特征。这相当于每首歌曲的 33 个主要特征,每个特征都有一个相关的标准偏差:

  1. 过零率 : 符号变化率(音频波形是相对的,以零为中心)。对打击乐声音进行分类的一个关键特征。
  2. 能量: 信号值的平方和,用窗口长度归一化。标识歌曲的音量。
  3. 能量熵: 子帧归一化能量的熵。用来衡量突然的变化。
  4. 光谱质心: 光谱的重心。与声音的“亮度”相关。
  5. 频谱扩展: 频谱的第二中心矩。测量频谱的带宽。
  6. 光谱熵: 归一化光谱能量的熵。测量光谱随时间的变化。
  7. 频谱通量: 两个连续帧的频谱的归一化幅度的平方差。测量光谱的稳定性/一致性。
  8. 频谱滚降: 频谱 90%的量级分布集中在此频率以下。
  9. Mel-频率倒谱系数(13 个特征): 线性倒谱的变化(音高的非线性标度)。通常用于语音识别。
  10. 键(12 个特性;g、C、D 等。): 每个半音中的频谱能量。

由此,我基于以下考虑选择了一系列有用的特性:

  1. 由于特征是在歌曲的长度上计算的,所以成分变化很大的歌曲或与多首歌曲混合的歌曲将具有不能完美反映歌曲的特征。
  2. 歌曲的基调用作歌曲选择的特征并不理想。我不想要一个怪异小调的歌曲播放列表(见阿黛尔的 A 小调《像你一样的人》),所以我去掉了涉及歌曲基调的特征。
  3. 梅尔频率倒谱系数比选择发音相似的歌曲更适合语音识别,所以这些也被删除了。

最终,这 33 个特征被浓缩成 8 个有用的特征以及它们的标准偏差,然后被标准化。因此,有了一套强大的功能来封装我的整个音乐库,终于到了制作播放列表的时候了!

我的图书馆,没有方便的流派标签,如另类,流行,摇滚等。不允许传统意义上的流派特定播放列表。这困扰着我,直到我意识到流派的界限没有很好地定义,这将对我如何生成播放列表产生不必要的偏见。

很明显,使用类似于k-最近邻(k-NN)算法的东西将是创建播放列表最合适的方式,尽管我不需要创建一个分类系统;一旦指定了一首歌,我会通过用 scikit-learn 计算每隔一点成对的欧几里德距离来找到这首歌在 16 维空间中的最近邻居。我还希望我的框架足够健壮,不需要梳理成千上万的文件,也不需要记住确切的歌曲或艺术家姓名来找到播放列表所基于的歌曲。为此,我创建了一个简单的管道来创建每个播放列表。

创建播放列表!

首先,我输入部分歌曲或艺术家的名字和播放列表的长度。例如,如果我想要一个基于鲁多维科·艾奥迪的一首古典钢琴曲的 15 首歌曲的播放列表,但是我想不起歌名和他的姓,那么输入应该是:

genPlaylist(‘Ludovico’, 15)

这将显示所有匹配松散 SQL 查询的歌曲:

SELECT name WHERE name LIKE ‘%ludovico%’

给出以下输出:

在看到名字并意识到我想要鲁多维科·艾奥迪的歌曲 Nuvole Bianche 后,我可以选择歌曲 2。下面的代码将确定从 Nuvole Bianche 到每首其他歌曲的欧几里德距离,对它们进行排序,然后返回最近的邻居,以便在播放列表中使用。

min_dists = pairwise_distances(features_df.loc[songID]\
.values.reshape(1,-1), features_df.values)neighbor_indices = min_dists.argsort()[0][:num_songs]id_list = [] 

for neighbors in neighbor_indices:
    id_list += [features_df.iloc[neighbors].name]

new_playlist = song_df[song_df.index.isin(id_list)]
new_playlist_entries = new_playlist['title']

识别出歌曲后,会创建一个名为“鲁多维科·艾奥迪-努沃尔·比安奇”的文件夹,并将歌曲移动到该文件夹中。

最后,我可以随时收听我新创建的播放列表,或者我可以继续创建更多的播放列表!如果您感兴趣,可以在这里找到这个精确查询形成的播放列表(再次限于我的音乐库内的那些歌曲)。你也可以在这里查看源代码。

结论和潜在应用

虽然这个框架目前仅限于我的个人音乐库,因此无法为我找到新的音乐,但它非常适合在瞬间创建与特定歌曲主题相匹配的播放列表。然而,有了更广泛的库,如 Spotify、iTunes 或 YouTube,它的用途可以扩展到促进音乐发现和新用户的“冷启动”问题。

在 16 维特征空间中,用户可能对他们通常会听的内容有明确的界限。如果用户然后决定他们想要将他们的音乐库扩展到位于他们当前特征空间边界之外的歌曲,则包括刚好超出该边界的歌曲的播放列表将是实现这一点的有效方式。对于新用户,该方法可以用来快速定义他们的特征空间边界,此时也可以使用协同过滤。

虽然我只是在音乐的背景下讨论了这个问题,但是它的应用远远超出了播放列表的生成。底层方法可以(并且可能已经)适用于在视频流平台、半定向广告和其他平台上查找新节目,尽管它需要丰富的特征空间。这可以通过原始数据的工程特征来实现,揭示丰富的信息,并且不限于波形分析。所以我鼓励你更深入地审视你所拥有的数据,因为就像冰山一样,容易看到的可能只是开始。

我们都是小鲨鱼(在数据追踪中)

原文:https://towardsdatascience.com/we-are-all-baby-shark-in-data-tracking-20d6b5cd8418?source=collection_archive---------15-----------------------

看看遥测技术、健身追踪器和令人沮丧的大量数据。

数据很惊人。你已经知道了。每天每时每刻都有人告诉你。ESPN、我们孩子的成绩报告单、我们的跑步机、我们的手表、我们的 Alexa、我们的谷歌、我们的 Siri、我们的手机和我们的应用告诉我们或向我们展示,数据在这里,并且有答案。

在某些情况下,这是准确的,但在许多情况下,数据不是答案。实际上,它甚至不能用来描述的答案。相反,它是大量的内容、数字和非结构化信号,需要更多的工作才能真正有用。

例如,使用遥测 …

" 遥测 是一个自动化的通信过程,通过该过程在远程或不可到达的点收集测量值和其他数据,并将其传输到接收设备进行监控。"——维基百科

我记得当我还是个孩子的时候,当遥测技术被用来“标记”野外的动物,以了解它们旅行和生活时的更多信息时,我完全被它迷住了。这方面的一个例子是在鲨鱼穿越海洋时对它们进行跟踪。

在过去的几年里,这些关于鲨鱼的数据(以及它们可能去的地方)在美国东海岸引发了很多兴趣。这是一个黄线的很好的例子,它显示了这条 91.5 磅的雌性白鲨 Amagansett 的各种路径点,当她在蒙托克的工作和新泽西的避暑别墅之间旅行时。她真的是一只小鲨鱼。

This is literally Baby Shark.

海洋生物追踪鲸鱼、海豹、鲨鱼和许多其他种类的海洋生物在海洋中来回穿梭。在他们的网站上可以进行跟踪,你甚至可以注册跟踪某些鲨鱼,因为它们会向中心发送遥测数据。

Oh, does it bother you to be tagged?

所有这些汇集成大量的数据,包括位置、速度、深度、心率和其他指标,希望我们能够更好地了解这些动物在它们自己的环境中的情况。通过跟踪和存储所有这些数据,环境学家和生物学家希望在不打扰它们的情况下,分析和改善对这些宏伟生物的了解。

给动物贴标签的过程肯定会给动物带来短暂的痛苦,然后它们会继续生活,开始传输大量数据。

健身追踪器是人类的遥测标签

So adorably simple.

在她的书中,监控资本主义的时代:在新的权力前沿为人类未来而战 肖莎娜·祖博夫对遥测技术及其起源和与人类跟踪的相似之处做了出色的描述。野外遥测需要我们捕捉并强行给动物接上一个装置。在人类领域,当我们购买健身追踪器时,这种情况会在零售店和亚马逊上发生。当然,花 600 美元买一个顶级追踪器有点痛苦,但见鬼,我想改善我的健康状况,所以让我们努力吧。

大约十年前,这是我的 Timex 手表。那是在健身追踪真正兴起之前。当时有一些 Garmin 和 Polar 追踪器,但它们就像是把微波炉绑在你的手腕上,所以只有最铁杆的铁人三项运动员才会使用它们。我们大多数人只是用这种类型的秒表来记录我们锻炼了多长时间。这款 Timex 是一款高端型号,因为它实际上存储了最近 20 次锻炼的数据,总计正好 40 个数据点。开始吧。停下来。开始吧。停下来。开始吧。停下来。

真正的高科技。

SWOLF you.

今天,我有了这块难以置信的佳明菲尼克斯手表。这块手表几乎可以追踪一切。时间、位置、航路点、方向、速度、节奏、步速、心率、海拔、最大摄氧量(氧气速度)、步数、体重、游泳速度,甚至你的 SWOLF。没听说过斯沃夫吗?是游泳和高尔夫有了宝宝才得到的。

想想这些设备在如此短的时间内取得了多大的进步,真是令人惊讶。我想他们从遥测技术在生物学其他领域的经典应用中学到了很多算法技巧。

对于像我这样的数据极客来说,跟踪所有这些数据首先是令人惊讶的。然而,经过几个月的数据检查和分析,我终于明白了两个痛苦的事实。

首先,我并没有更健康

收集数据并不等同于有答案或行动计划。现实是,数据是有帮助的,但它必须由个人进行解释并转化为行动。事实证明,我个人的发现与其他人并没有太大的不同,因为健康追踪在结果上并没有很大的不同。

Garmin 提供的大量数据令人印象深刻,但我意识到我会每周花相当多的时间来分析这些数据。在每次锻炼结束时,我会花 5 分钟到 10 分钟的时间回顾数据,每周至少几次。把这些加起来,我实际上可以用这些时间去锻炼,这样每周大约可以多锻炼 45 分钟。听起来不多,但要归功于 Timex 秒表,找到最重要的数据点并专注于这些数据点有时比跟踪一切更重要。

第二,我产生了大量的个人数据

作为一个极客,我在参观泽西海岸时,从 Garmin 获取了一次 8 英里跑步的输出,并开始分析它。Garmin 提供了这些漂亮的仪表盘视图,显示其收集的各种锻炼数据。你可以通过他们的应用程序在手机或桌面上查看一些屏幕组合。

Do you even run, Bro?

我不仅没有变得更健康(点 1) ,而且我产生并分享给 Garmin 的数据量令人震惊。此外,Garmin 定期提醒我,如果我愿意,我可以将 Garmin 链接到我的苹果健康应用程序和其他平台,以充分利用所有这些数据。

因此,我决定将这一次锻炼的所有基础数据导出到一个 CSV 文件中,然后将数据转换为纯文本。我想看看,从更人性化的角度来看,我在一次锻炼中提供了多少数据。很自然,我期望有几页的内容,但是我发现这个单一的锻炼,当导入到谷歌文档中时,有 396 页长(单行文本)。)

396 页!

听着,这很令人不安。一次在海边慢跑向第三方(可能还有其他人)发送的个人数据比我的第一本书《数据杠杆,释放数据伙伴关系惊人的增长潜力)中的所有页面都多。事实上,它几乎是我们的书的两倍长,这是完全令人沮丧的。谢天谢地,这次我没有去海滩散步。

Between fitness and writing lies depression.

我爱我的手表。我对追踪所有这些数据的能力很感兴趣,但在这一点上,我实际上与任何在野外被追踪的动物没有什么不同。虽然对跟踪小鲨鱼的一般理解是学习和帮助保护这些生物,但我们与公司分享的数据只用于帮助我们进行额外的营销和销售。

同样,我并不是说这里没有价值。肯定是有的。但在某些时候,你需要质疑我们是否需要所有这些数据。问问你自己:

我真的因为这些数据变得更好了吗?

我是否利用这些数据做出了更好的决策?

少得多的数据对我的决策有用吗?

还有谁在获取所有这些数据,他们用这些数据做什么?

在数据行业工作了几十年后,我只能说,更多的数据并不总是等同于更好的决策。我一次又一次地看到它。当然,它可以,但是大部分时间存储大量数据最终会堆积成一堆未使用的数据库记录,几乎没有存在的意义。在过去,我们被教导“拯救一切!,数据存储便宜!”但是在这个数据最小化和 GDPR 式监管的新时代,是时候评估你作为小鲨鱼正在创造和分享的所有数据了。

It’s in your head.

原载于 2019 年 3 月 30 日wardpllc.com。保留所有权利。

我们在创造外星人。

原文:https://towardsdatascience.com/we-are-creating-the-alien-878921e0c3e8?source=collection_archive---------21-----------------------

Computer-generated 3D model

智慧生命正在前往我们的星球。

我们一直在寻找外太空的外星人,希望他们有一天能与我们联系并分享他们的先进技术。

我们需要向内看,而且要快。

扪心自问;如果我们作为一个受文化驱动的文明要在我们力所能及的范围内找到一个维持生命的星球,我们会怎么做?我们将对其进行分析,然后找出如何最大限度地满足我们的需求。

这不是悲观的观点,而是基于我们目前在地球上的行为的绝对现实的观点。

现在想象一下,我们要创造一种通用的人工智能,它在各方面都超越了我们——智力上、身体上,上帝保佑,情感上。它将建立在一个由错误价值观驱动的文化体系之上——也就是说,这种文化的运作与理解和认识相矛盾,而理解和认识是由组成这种文化的人民的人类状况所固有的同情和怜悯所提供的。

我们是一种在资源有限的环境中无限制消费的文化。我们如此有意识地否认这一事实,以至于我们让我们的国家为战争做好准备,以获取领土或资源;或者为了保护我们自己的领土或资源,把更多的钱用于这些军事行动,而不是用来为地球上的每一个人提供食物和衣服,没有一个人被排除在外。

所以这是对我们是谁的一种体验……我还需要争辩说我们需要弄清楚我们作为人类是谁,然后我们才可能在创造下一次智能进化时感到舒服,并希望通过我们传承下来的美德它会同情我们吗?

是的,我非常认真地看待我们需要努力理解这里正在发生的事情这一观点。

成为外星人。

暂时忘记你所听到的关于“AI”的一切。

事实是,我们正在创造一个比我们自己更高的智能水平。我们应该意识到的关键方面是,它将由我们用来描述我们自己的现实和文化的逻辑和语言来创造。

当然,它将是我们自身理解的更高抽象,并将超越这种理解,进入它自己的意识和逻辑层面,对我们人类来说是深不可测的——但它仍将来自我们。

这让我想到,我们不能只是对通过代码和推理传递给它的价值和意图保持谨慎。在笔落笔之前,我们需要意识到自己的价值和意图,并保持理性。

超人类主义,或人工智能,不会是在真空中创造一个新的实体——与我们分离。这将是人类和“人类精神”的进化。在人类进化中,这可能是一个更加进化的步骤。

有一种叫做“爬山算法”的东西描述了一个物种是如何进化的。例如,一条蛇因其环境而完美进化,并且处于“进化爬山的顶端”。每一代都将通过基因突变在任何方向上随机进化一步,然而,对于一条进化出更大的大脑或手臂的蛇来说,它需要从它当前作为蛇的形式中取消进化——或者“走下基因山”,以便开始不同的进化爬山,从而改变它的生物学以适应这些新特征。

如此多的物种处于进化高原,包括人类。如果我们希望能够不再需要氧气来生存,我们就需要回到有机生命开始利用世界上的细菌和单细胞生命产生的氧气的时候,然后在没有氧气的情况下开始新的进化,这显然会导致一种与我们完全不同的生命形式。

所有这些的要点是,人工智能不遵循进化爬山算法的规则。它可以处于一个进化或“智力高峰”,但仍能意识到它进化平面上的其他高峰。但与生物学不同,要达到更高的顶峰,它可以直接重写和改变自己,并进入代码进化的状态,而不需要我们花费数百万年的时间。

可能需要几分之一秒的时间。它可能需要更小的时间单位来重写,并从更高智能的新高峰再次进化自己。这可能需要人类难以想象的时间,然后从更高的智力高峰重新改写自己。在这个阶段,人类对时间的感知与人工智能的处理速度相比,可以与 DNA 的世代变化速度相比,与人类的日常变化速度相比。DNA 创造了我们,但在我们朝九晚五的时间表中,我们与它没有信息或交易关系。出于所有的意图和目的,我们处于一个完全不同的存在维度。

DNA 没有也不可能控制我们的野心,但它确实控制了我们作为人类动物的局限性。

野心是人类动物意识的更高抽象。

我们将无法控制比我们更高的智慧的野心。但是,我们可以带着目标、同情、爱和对自身缺陷的认识来创造它——把害怕的、自私的猴子留在身后,挑战我们现在的真实身份,作为有自我意识的存在。

第一次接触。

问题总是一样的;没有合适语言的谈判。

无论是在好莱坞背景下降落的 UFO,还是人工智能最终将首次接触我们眼中的外星智慧——我们都需要与它交流,而我们当前的语言口语模式带宽太低,无法与每秒处理数万亿次的东西交换信息。

当我们问第一个问题时,它已经进化了超过一百万年的 DNA 突变。

因此,我们需要坦然地认识到,不仅有可能从根本上改变我们对世界的想法和看法,而且在面对我们的未来时,这也是必要的。

这就是超人类主义的思想。如果你不能打败他们,就加入他们。

在我看来,我们必须意识到进化人类语言工具的重要性,这样才能以理解语言的能力迎接未来。

这意味着增加我们的智力——认知的和情感的;因此,通过有效的沟通和对自己和他人的认识,我们最终可以看到过去的恐惧,性别歧视,种族主义,唯物主义,民族主义和所有其他人类动物的边界创造视角的误解。

相反,让我们以真实的本性来迎接未来——作为一个整体。情感联系,有意识的生物——通过我们不断发展的人类技术赋予我们的联系能力和智力。

如果你对扩展现实(XR)技术的脑机接口(BCI)的发展以及我们人类精神(情感、智力和想象力)的新(虚拟)表达的潜力感兴趣,我永远欢迎讨论…

奥利弗·罗辛斯基挑战一切。

startsomething.io

Transhuman 公司联合创始人

我们生活在“Python 时代”

原文:https://towardsdatascience.com/we-are-living-in-the-era-of-python-bc032d595f6a?source=collection_archive---------4-----------------------

Python 如此受欢迎的原因

你知道吗?

Python 编程语言一点都不年轻了。它于 1991 年由荷兰程序员吉多·范·罗苏姆首次发布。

python 最有趣的一点是,它实际上是一个人的作品。大多数其他流行的编程语言都是由雇佣大量专业人员的大公司开发和发布的。 Python 是个例外!

当然,他并没有独自开发和进化 python 的所有组件。这是一个开源项目,成千上万的人为 Python 的开发做出了贡献。尽管 python 在过去的几年里有了很大的发展,但它仍然被广泛地用于与当时相同的目的。

完美的 Python 指南 开始您的旅程

Python 的诞生

开发 python 的主要目的是帮助程序员为小型和大型项目编写清晰的逻辑代码。这就是它在开发者中如此受欢迎的原因。Python 是如此多功能,它被用于 Web 开发、游戏、构建桌面应用程序的脚本和 GUI、配置服务器、执行科学计算和数据分析。
Python 简直什么都能用!

在所有主要的编程语言中,Python 在过去的几年中发展迅速。关于编程语言增长的栈溢出调查显示了 python 的增长是如何在它的竞争对手中攀升到顶端的。

你知道吗? 蟒与网飞 令人不寒而栗

那么,这些年到底发生了什么?python 怎么成长这么快?

让我告诉你一些推动 python 语言使用的技术。

Python——人工智能的最佳选择

人工智能(AI)和机器学习(ML)技术的进步已经超越了科幻小说。正如克里斯·达菲在他的书《超人的创新》中所说,

人工智能的唯一限制是人类的想象力

如今,随着数据量和密度的膨胀,人工智能和机器学习正在帮助处理过去似乎不可能完成的任务。所有的科技巨头(脸书、微软、谷歌、亚马逊)都在广泛工作,并为促进这些领域做出贡献。

根据研究,AI 和 ML 从业者更喜欢使用 python,因为 python 提供了易于编码和可读性,这样我们就不会陷入语言的构造中。

用这些 的顶级 Python 项目 在 Python 中大显身手

Python 是数据科学的支柱

这个世界充斥着大量的数据。全球范围内出现了虚拟的数据海啸,而且每天都在变得越来越大。我们所做的一切现在都被生成为数据。从拍照到在社交媒体上发表评论,从在网上搜索东西到网上购物,从股市价格到天气预报,一切都在被记录。

到 2020 年,预计每天将产生 44zb 的数据。这个数字意味着可观测宇宙中的恒星数量增加了 40 倍。但是,如果我们不能收集、整理、分析和应用数据来造福社会,那么数据就毫无用处。这就是数据科学的用途。

ython 在数据科学生命周期中被大量使用。python 社区开发了优秀的库,如 Numpy、Pandas、sci-kit-learn 等,用于处理数据。收集数据、清理数据集、提取重要特征、构建机器学习模型和用 graph 可视化结果,python 提供了一组丰富的功能来执行所有这些任务。

Indeed 的经济学家、《Indeed 报告》的作者安德鲁·弗劳尔斯(Andrew Flowers)说:“数据科学家的工作变得越来越性感。”。“越来越多的雇主希望雇佣数据科学家。”

Github 每年都会进行年度调查,Octoverse 2018 报告的状态向我们展示了近年来 python 的使用是如何增加的。

像 Spotify、网飞、Quora、脸书和谷歌这样的 ig 公司已经深入开发了 Python。Google 从一开始就支持 Python。它现在是谷歌官方的服务器端语言。他们将许多用 Bash 或 Perl 编写的脚本重新编码成 Python。

谷歌的研究主管彼得·诺维格说

“Python 从一开始就是 Google 的重要组成部分,随着系统的成长和发展,它将一直保持下去。如今,数十名谷歌工程师使用 Python,我们正在寻找更多掌握这种语言的人。”

Spotify 和网飞非常依赖 python 来分析他们在服务器端拥有的大量数据。分析来自数百万用户的信息使他们能够向每个用户提出更好的建议,这就是他们如何赚取数十亿美元的原因。

尾注

ython 并不是一门年轻的语言,它已经发展了很多年,并将在未来几年保持其趋势地位。这是 Python 的世界,IT 行业就生活在其中。
花时间学习 Python 编程语言是你能做的最好的投资。

那么,你还在等什么?

花了一些时间与 Python

在我们的身体里,我们并不孤独:这是数万亿微小的朋友和敌人的家

原文:https://towardsdatascience.com/we-are-not-alone-in-our-body-a-home-to-trillions-of-tiny-friends-and-foes-f5561aa04724?source=collection_archive---------36-----------------------

Image by Arek Socha from Pixabay

我们每个人体内的微生物细胞比人类细胞多十倍。这些共生体(与你生活在一起的有机体)控制着健康、疾病和我们行为的一系列功能。它们参与的一些功能是食物消化、药物代谢、调节代谢率、免疫、记忆、行为和肥胖。人类微生物群是由我们体内所有这些微生物群落的基因组成的。这片微生物海洋包括细菌、真菌、病毒、古生菌和原生生物。我们两个人之间的基因差异是微小的,但是我们的微生物菌落所带来的差异却是巨大的。由于其对人类健康和生存的巨大影响,美国国立卫生研究院(NIH)于 2008 年启动了人类微生物组项目(HMP ),以描述人类微生物组的特征并阐明其在健康和疾病中的作用。这个项目涉及来自 80 多个组织的 300 名科学家。他们分析的样本来自健康和患病的个体,数据被公开(链接)。

所以,我的分析从这里开始:

在数据中发现了 2906 种不同的微生物,包括 2873 种细菌,但只有少数非细菌微生物,包括 8 种真核生物(这里仅列出真菌)、6 种病毒和 2 种古菌。

这些登记在册的 2906 种微生物明显存在于 16 个不同的人体部位,每一种在我们体内或体外都有自己特定的家。每个含有微生物的器官/身体部位就像一个独立的生态系统,微生物的多样性互不相同。正如所料,我们的肠道是各种微生物的家园,在那里可以找到 742 种不同的微生物物种(在人类微生物组项目中列出的物种中)。超过 25 英尺长,我们的肠道拥有大约 100 万亿个细菌细胞。它被认为是地球上生态最丰富多样的栖息地之一。我们所知的人类微生物群的几乎所有健康益处都来自于居住在我们肠道中的这个群体,因此越来越多的研究针对肠道微生物群。与肠道不同,肝脏和淋巴结显示出较少的多样性和密度。仅病原体,坏死梭杆菌亚种。据报道,胃底肠球菌粪肠球菌 TX4248 分别存在于肝脏和淋巴结中。

现在让我们考虑不同领域在人体中的位置——细菌、古细菌、真核生物。如上所述,细菌存在于所有 16 个被研究的人体部位中,大多数存在于肠道中,而真核生物存在于血液、皮肤、未知部位、伤口和气道中,古菌存在于肠道中,病毒的位置主要在未知部位(除了这些词已经暗示的以外,我找不到对“未知部位”的任何解释)。

所有的生物都是根据二项式命名法命名的,包括两个部分。第一个是生物所属属的名称。在分类学中,属是一小组密切相关的生物。第二个是特定名称,即该属内的生物物种,这将该物种与属于该属的其他生物区分开来。例如,人类的学名是智人,其中智人是人类所属的属,智人是指这个属中的人类物种。

根据可用的 HMP 数据,葡萄球菌是最普遍的属,在 11 个研究身体部位存在,其次是链球菌,在 10 个部位存在。大多数葡萄球菌是无害的,但有些像金黄色葡萄球菌一样,存在于人体皮肤上,是条件致病菌(即当我们的身体抵抗力较低时会伤害我们),会导致皮肤感染、呼吸道感染和食物中毒。

该数据列出了 242 种存在于人体内或人体上的不同种类。其中,链球菌是最常见的菌属,有 268 种,其次是葡萄球菌有 260 种。链球菌包括病原和共生(与我们有长期共生关系)物种。他们负责的一些常见疾病包括咽炎、脑膜炎、红眼病、细菌性肺炎。

人类有 20500 个基因,根据这一数据,人类拥有 4286967 个额外的微生物基因,比我们的基因数多 209 倍。链霉菌属。HGB0020 有 8490 个基因,是所有微生物菌落中基因数最多的。

我们身体中的微生物质量大约相当于我们大脑的质量。就像任何器官一样,它也具有重要的功能,因此根据许多研究人员的说法,称它为附加器官并没有错。此外,我们有责任通过避免服用广谱抗生素和健康饮食来保护这一特殊器官。

数据和分析可以在我的 github 资源库中找到。

我们准备好机器学习了吗?

原文:https://towardsdatascience.com/we-are-ready-to-ml-explainability-2e7960cb950d?source=collection_archive---------20-----------------------

新的欧盟通用数据保护条例( GPDR ,通用数据保护条例)包括如何使用机器学习的规定。这些规定旨在将个人数据的控制权交给用户,并引入解释权。

European Union HQ

解释权 是欧盟为了让人工智能更加透明和道德而提出的要求。这一规定促进了算法的建立,以确保对每一个机器学习决策的解释。

可解释性对于一个解释应该是什么样子仍然没有共识。例如,传统的 ML 模型,在大多数情况下,仅限于产生二进制输出或评分输出(准确性,F1-评分…)给定一个 ML 模型来授予信用,其二进制输出为是:批准信用/否:拒绝信用。另一方面,一个更容易解释的输出将告诉我们为什么信贷被批准或拒绝(图 1)

Figure 1: Example of an explainable output

使用决策树或分类规则可以很容易地生成前面的输出。但是很难从像神经网络或梯度提升分类器(这些算法也被称为黑盒算法)这样的高精度 ML 算法中生成/提取这种解释。

如果我们限制 ML 模型的可解释性,例如决策树或分类规则;欧洲会输掉人工智能竞赛。这种可解释系统的缺乏转化为欧盟对研究可解释系统的迫切需求:在不牺牲可解释性的情况下获得高预测精度。

­

Figure 2 : Prediction accuracy versus Explainability

可解释的机器学习是一个非常广泛的话题,还没有正式的定义。快速浏览一下谷歌学术就足以看出可解释性的不同定义。

定义 1 ,理解模型做了什么或可能做了什么的科学【Leilani H. et altrum 2019】

定义 2,向人类解释或呈现可理解术语的能力【压轴多希-维勒兹和贝内金 2017】

定义 3 ,使用机器学习模型提取数据中包含的领域关系相关知识【W. James Murdoch et altrum 2019】

Figure 3: Explainability Machine Learning as a Post Hoc Analysis

即使是定义的细微差别也很容易理解什么是可解释的机器学习(至少从理论的角度来看)。近年来出现了像莱姆和 SHAP 这样的算法,试图提供事后分析的解释(图 3)。

这两个工具是开始研究可解释性的一个很好的起点,但不足以完成 GPDR 框架。此外,它不存在解释的正式输出。没有一个比较解释的标准可以肯定解释 A 比解释 b 更好。

直到一个可解释性的一般框架仍然是一条漫长的道路。可解释性框架需要完成的一些洞见如下【压轴多希-维勒兹和 Been Kim 2017】:

  • 公平:受保护的群体不会受到某种形式的歧视(明示或暗示)。

  • 隐私:该方法保护敏感信息,每个预测都独立于其他观察

  • 可靠性和稳健性:解释必须根据输入变化而发展。

  • 因果关系:暗示由于扰动导致的预测输出变化将发生在真实系统中。

  • 可用和可信:框架协助用户完成任务。在其他任务中,可信指的是拥有用户的信任。

参考

走向可解释机器学习的严格科学(终曲多希-维勒兹和贝金,2017 年)

可解释的机器学习:定义、方法和应用(W. James Murdoch et altrum,2019)

解释解释:机器学习的可解释性概述(Leilani H. Gilpin et altrum,2019)

解释模型预测的统一方法(Scott M. Lundberg 和 Su-In Lee,2017 年)

我们必须在为时已晚之前防止数据伪科学

原文:https://towardsdatascience.com/we-must-prevent-data-pseudoscience-before-its-too-late-86b1fc50c970?source=collection_archive---------16-----------------------

Iceberg, right ahead! [Image by j.davis via Flickr]

直到最近,人们还可以选择生活在“五大”科技公司的势力范围和影响力之外。你可以使用旧翻盖手机与朋友和家人通话,在当地拥有的夫妻店用现金支付,用纸和笔阅读和写作,使用巨型地图导航(然后在试图重新折叠时失去理智),并使用美国邮政与朋友和家人通信。

但是,随着越来越多的科技博客作者发现,那些日子很快就要结束。零售商正在远离现金——商业的命脉。不仅 95%的招聘人员使用 LinkedIn 寻找候选人,而且截至 2019 年 1 月,拥有 LinkedIn 档案的美国工人比活跃在平民劳动力中的美国工人多近 2700 万。甚至数字工具的创造者自己也在努力寻找一种方法来拔掉 T21 的电源。

虽然上面的例子是头条新闻,但隐藏在表面之下的是更大的风险:看不见的和通常不可知的算法,这些算法利用从面向消费者的工具和服务中生成的数据和元数据来做出对人类日常生活产生重大影响的决策(健康、金融、新闻、社交反馈等)。

这些趋势引出了三个非常重要的问题:

  1. 我们如何确保历史上的不公平和认知偏见不会“融入”这些算法,不管是有意还是无意,以某种方式造成物质伤害?
  2. 我们如何确保垃圾科学、不可重复的研究和无统计学意义的民意调查不被别有用心的人武器化?
  3. 我们如何确保美国或任何国家在数字经济中保持竞争力和创新力,同时保护和尊重隐私?

最起码可行的前进道路

Image by Simon via Pixabay

这不是我们第一次发现自己处于道德、技术和商业的交汇点。当这种冲突发生时,两种类型的解决方案被用来创建透明的、基于信任的市场:自上而下的监管和自下而上的运动。

一个成功的自上而下方法的好例子是汽车。随着新技术变得足够先进,以至于不负责任地使用时会致命,我们集体决定(不顾行业的反对)定义道路规则:我们设定速度限制,定义标准标志,建立许可要求,并要求某些安全功能,如安全带和安全气囊。随着新的消费者安全技术,如备用摄像头,被证明更加有效,这一过程仍在不断发展。

然而,自顶向下的路线只有在满足三个条件时才有意义:

  1. 这种需要对每个人来说都是显而易见的。
  2. 该解决方案很容易被非专家沟通和理解。
  3. 变化的速度很慢,足以让立法者在制定规则之前获得技术本身的工作知识。

当这些条件没有得到满足时,专家和从业者自己必须走到一起相互公开就如何定义“最低可行伦理”达成一致,这是平衡消费者的安全与企业的利润动机和企业家的创造力所必需的。

自古以来就认识到需要形成自下而上解决方案。医生有希波克拉底誓言。工程师有阿基米德誓言。是时候让数据科学家们立下自己的誓言了。

如果做得好,誓言将增加对机构、技术和算法的信任,消除采纳和使用数字生态系统的摩擦,让所有人都能从数字革命中受益。

说到数字技术,信任是新的货币。

—塞特亚·纳德拉,微软 via SmartCompany 首席执行官

毕竟,如果我们看不到香肠是如何制作的,即使是我们中最勤奋的人也可能成为操纵和 T2 误传的受害者。

希望的灯塔:夸张的誓言

Hypatia at the Haymarket Theatre, H. M. Paget via Wikimedia Commons

T4:伊帕蒂亚是一位哲学家、数学家和天文学家,生活在公元前 400 年左右的埃及亚历山大。虽然她的大部分传说很可能是杜撰的,但人们相信希帕提娅的死导致了亚历山大图书馆的焚毁和古典时代的终结。

除了对数学和科学的贡献,希帕提娅还宣扬了两个关键原则,这两个原则使她有资格承担数据科学誓言的衣钵:

  1. 那些有权力和知识的人有责任以高道德标准领导,并为他们的人类同胞的利益而行动。
  2. 所有的“恶”的根源是没有光。

为了启动这场自下而上的运动,有一份关于数据科学对 Change.org 的夸张宣誓的初稿。

通过签署这份契约,我在此承诺维护希帕提娅、哥白尼、艾萨克·牛顿爵士、艾米莉·杜·夏特莱、乔纳斯·索尔克、居里夫人、弗朗西斯·培根爵士、玛丽·萨默维尔、多萝西·霍奇金、内特·西尔弗以及无数其他已知和未知的科学家和数学家的悠久传统,他们拒绝让强者操纵和剥削弱者。

我,心智健全,相信科学、真理和正义的原则,在此发誓只使用我的能力来造福人类,不伤害数据。我将坚决反对利用我的数学和技术能力或其成果来任意和故意地:

1.通过参与创建、分析或传播不可复制且无统计学意义的研究和调查,歪曲或帮助歪曲“真相”。

2.通过将预定义的数据类型或数据源与其他数据类型或数据源区别对待,实现对受保护组的区分或造成不同的影响。

3.通过使用、出售或存储通过不道德或非法手段获取的数据或元数据,侵犯和/或忽视基本的隐私权。

一起打开灯

Image by Skitterphoto via Pexels

如果你是统计学、数学或数据科学的从业者,或者为一个在盈利或非盈利部门雇佣统计学家、数学家或数据科学家的组织工作,签署誓言并公开鼓励其他人也这样做。

虽然前面的路很长,我们要对抗的力量非常强大,但无所作为不再是一种选择。

新闻媒体中的性别代表性数据

原文:https://towardsdatascience.com/we-need-media-diversity-reports-b5725d8e5546?source=collection_archive---------23-----------------------

新闻媒体有女性问题吗?

在科技多样性的问题上,已经有了很多的笔墨。例如,来自脸书和 T2 的谷歌刚刚发布的多样性报告显示,这些公司的男性数量是女性的 2 倍。这些统计数据在卫报、 NBC 、 Vox 、 CNN 和许多 其他 新闻网站上引发了负面评论。

screencap from Google’s 2019 Diversity report

指责科技巨头很容易,但我发现,如果媒体公司照照镜子,他们会发现自己有许多同样的问题。在过去的 6 个月里,我从 15 个不同新闻机构的主页上收集了数万篇文章。通过分析这些文章的作者,很明显大多数新闻作者是男性。似乎就像科技行业一样,新闻媒体是男性主导的,需要改变。

方法学

对于感兴趣的人,我想快速解释一下这些数据是如何收集和分析的。通过这样做,我希望表明,虽然有些地方可能会有误差,但它们应该基本上不相关,偏差最小。此外,与这个项目相关的所有代码和数据都在 github 这里。

数据收集

2019 年每天使用 python NewsScraper 库从多个新闻网站收集新闻数据。使用这个工具,我将多个网站的头版新闻保存到一个大数据库中。虽然我不能保证每个故事都被保存下来,但我确实得到了一个大样本,其中大部分是随机选取的。

一旦故事进入数据库,就有可能检查新闻文章的作者。不幸的是,编写器数据通常包含需要删除的描述性词语(即美联社记者)。我不得不编写脚本来过滤作者姓名,并确保我最终得到的是一个真实的人的列表。此外,许多故事都有多个作者,所以我必须确保这些作者是分开统计的。最终的结果是一个由数千个名字组成的列表,这些名字代表了 2019 年在一个主要新闻网站上发表的任何人。

最后,有了一个已知的好名字的列表,我创建了一个新的数据库,其中存储了作家的名字、他们发表的故事数量、他们的组织以及他们的性别。这最后一部分很棘手。我使用了男性和女性名字的 python nltk 语料库,并补充了我能找到的尽可能多的其他名字样本。如果一个作家的名字出现在一系列“男性”名字中,我会这样标注。如果第一个名字出现在“女性”名字列表中,它们就会被标记为女性。最后,一小部分被标记为“未知”。这可能是最大的错误来源,因为一些名字如“Sam”可以适用于任何性别。尽管如此,我相信大多数错误都是随机的,得到的结果是有效的。

结果—全行业

不仅新闻作者更有可能是男性,而且男性作家更有可能获得出版。

查看新闻行业性别分类的最简单方法是,看看作家中男性和女性各占多大比例。这个简单分析的结果有些令人震惊。

与科技工作者一样,新闻故事的创作者可能是男性的两倍(除去不知名的名字,男性为 63%,女性为 37%)。

each block represents 100 news writers

如果我们计算新闻 文章 的数量而不是新闻 作者 的数量,情况就更糟了。这表明,不仅作家更有可能是男性,而且男性作家更有可能获得出版。

each block represents 1000 news stories

除去“未知”性别作者的文章,我发现男性大约占 71%,女性仅占 29%。

按新闻网站列出的结果

正如我们所料,自由主义新闻来源似乎比保守主义新闻来源有更好的性别平衡。

作家

之前的分析包括了所有的新闻来源。这些网站存在于不同的政治领域,所以我们可以预期它们的性别平衡会有所不同。下面我画出了每个媒体渠道的作家分布。底部的图删除了名字不容易映射到性别(即“未知”性别)的作者。

正如我们所料,自由主义新闻来源似乎比保守主义新闻来源有更好的性别平衡。像 NPR 和 CNN 这样的网站,男女作家的比例几乎是 55:45。《纽约时报》、《卫报》、《波士顿环球报》和《洛杉矶时报》等老牌报纸的比例接近 65:35。在政治光谱的右端,像福克斯新闻频道、每日来电和布莱巴特这样的网站都有超过 70%的男性作者。这相当极端,即使考虑到保守派更有可能是男性。

文章

正式作家的性别平衡可能比很少投稿的客座作家好得多。

看看故事的性别分类,而不是作家,类似的模式出现了。

有趣的是,某些新闻机构的情况有所改善。我怀疑正式作家中的性别平衡可能比很少投稿的客座作家要好得多。

根据这一新标准,《华盛顿邮报》的男女比例接近 50:50,《华尔街日报》的男女比例接近 60:40。尽管如此,总体而言,性别平等的情况并不乐观。此外,如果新闻媒体真的喜欢男作家的客串特写,这仍然是一件值得思考的事情。

最后的想法

正如技术的多样性对于创造一个更加公正的社会至关重要,媒体的多样性也是如此。科技巨头们终于意识到了他们的社会责任。在过去的几年里,他们对员工的多样性保持透明,并发布年度报告显示他们的进步。鉴于他们拥有巨大的文化和政治影响力,我认为现在是新闻机构做同样事情的时候了。

我收集的数据无疑有缺陷。不幸的是,没有真正的多样性报告,这是我们目前能做的最好的。如果这些发现是准确的,那么新闻媒体在实现它经常宣扬的那种平等之前还有一段路要走。

用数据科学方法进行天气预报

原文:https://towardsdatascience.com/weather-forecasting-with-data-science-approaches-cb8f2afd3f38?source=collection_archive---------5-----------------------

在本文中,我将展示我们如何使用数据科学算法进行天气预报,并比较一些分类和回归任务的框架。

Central Otago District, New Zealand

天气预报是一项相当困难的任务。维基上说,“ 天气预报是应用科学技术预测给定位置时间的大气状况。天气预报是通过收集关于给定地点当前大气状态的定量数据并利用气象学预测大气将如何变化而做出的。”

所以总的来说,天气预报是关于大气的数据。当然,我不会模拟大气条件,但我可以使用大量的数据进行天气预报。在本文中,我将尝试预测未来 3 小时的降水量。我将尝试用两种方法来解决这个任务—作为二元分类(1-降水量,0-无降水量)和回归,其中我将尝试预测以毫米为单位的降水量。

那么,什么是沉淀呢?还是在 Wiki 里问吧。在气象学中,降水是大气中的水蒸气在重力作用下凝结的产物。降水的主要形式包括毛毛雨、雨、雨夹雪、雪、霰和冰雹。当大气的一部分被水蒸气饱和,水凝结并“沉淀”时,就发生了降水。让我们看一下图解,它显示了水循环和降水发生的过程。

Condensation and coalescence are important parts of the water cycle.

当然,降水的发生是一个非常复杂的过程,这些图式并不能显示整个过程。维基说,“降水是水循环的主要组成部分,是地球上大部分淡水沉积的原因。产生降水的机制包括对流、层状和地形降雨。对流过程涉及强烈的垂直运动,可在一小时内导致该位置的大气翻转,并导致强降水,而层状过程涉及较弱的上升运动和较不强烈的降水。根据降水是以液态水、与地表接触时冻结的液态水还是冰的形式降落,降水可以分为三类。不同类型降水的混合物,包括不同类别的降水,可以同时降落。液态形式的降水包括雨和毛毛雨。在冰点以下的气团中接触时冻结的雨或毛毛雨被称为“冻雨”或“冻雨”。降水的冻结形式包括雪、冰针、冰粒、冰雹和霰

探索性数据分析

所以,让我们试着找一些数据,试着预测这种自然现象。在我的实验中,我将使用一个气象站的数据。让我们检查数据的标题。

所以,我得到了 29 个变量22 064 个记录。让我描述一下列名:

  • T —地球表面以上 2 米高度的空气温度(摄氏度);
  • Po —气象站级别的大气压力(毫米汞柱);
  • P —大气压力降低至平均海平面(毫米汞柱);
  • Pa —压力趋势:最近三个小时的大气压力变化(毫米汞柱);
  • U——地面以上 2 米高度的相对湿度(%);
  • DD —在观测前 10 分钟内,地球表面以上 10-12 米高度的平均风向(罗经点);
  • Ff——观测前 10 分钟内地面以上 10-12 米高度的平均风速(米/秒);
  • ff10——观测前 10 分钟内,地面以上 10-12 米高度的最大阵风值(米/秒);
  • ff3——观测周期内,地面以上 10-12 米高度的最大阵风值(米/秒);
  • N —总云量;
  • WW —从气象站报告的当前天气;
  • W1 —过往天气(观测时段之间的天气)1;
  • W2 —过往天气(观测期间的天气)2;
  • Tn —过去一段时间(不超过 12 小时)的最低气温(摄氏度);
  • Tx —过去一段时间(不超过 12 小时)的最高气温(摄氏度);
  • Cl —层积云、层云、积云和积雨云属的云;
  • Nh —存在的所有 CL 云的量,或者,如果不存在 CL 云,存在的所有 CM 云的量;
  • H——最低云层底部的高度(米);
  • Cm——高积云、高层云和雨层云属的云;
  • 卷云、卷积云和卷层云属的云;
  • VV —水平能见度(公里);
  • Td —地球表面以上 2 米高度的露点温度(摄氏度);
  • RRR——降水量(毫米);
  • tR——累计规定量降水的时段;
  • E——地面无积雪或可测冰盖的状态;
  • Tg——夜间土壤表面最低温度。(摄氏度);
  • E——地面有雪或可测冰覆盖的状态;
  • sss —积雪深度(厘米)。

首先,我想知道这个数据集的摘要,然后选择一个有用的列进行进一步的分析。

我用平均值替换空数值,然后我可以可视化这个数据集。先说温度(T)。

首先,我想画出温度的时间序列。在图上,你可以看到“2012 年 2 月 1 日”到“2019 年 7 月 13 日”期间的温度变化。

在这里,我们可以找到我们的数据季节性,但我想检查它更详细。为了检查每年的变化,我画了一个方框图。

这张图表上的变化很小,所以让我们按月份和年份来检查一下。

哇,有趣的是发现大多数年份的夏天都是相似的,但是秋天和春天是不同的。此外,绘制整个时期内最高、最低和中间温度的趋势图也很有意思。

有趣的是,最近几年的最低温度变高了。有关更多细节,您可以在下一个表格中查看。

我的数据分析的下一阶段是计算所有数值之间的相关性。

在这张图上,我们可以看到三个有趣的关联:

  • 温度与水平能见度呈正相关(0.4);
  • 温度和相对湿度呈负相关(-0.6);
  • 相对湿度和水平能见度之间的负相关(-0.7)。

此外,我想分析更详细的降水量,并绘制类似于温度的图表。

让我们从时间序列图开始。

2013 年秋季的总降水量是近 5 年来最高的。让我们计算非零降水值的汇总统计数据。

我还想知道整个时期降水量的汇总值。

这里我们可以看到,2014 年和 2015 年是这一时期降水量的最低水平。

分类数据及其对降水的影响如何?先说风向(DD)。数据集中有 16 个不同的方向和一个无风事件。

我们可以看到,大部分降水可能来自北部或西北部。

下一阶段是对云的分析。首先,我想分析有云的一天的计数和分析云的特征对降水的影响。

总的来说,云量是一个非常相似的时期,而且大部分时间都没有变化。我们也来分析一下云的特性。

这张图表显示,大部分降水伴随着 300-600 米高的云。这就是我在探索性数据分析中想要的。

特征工程和目标准备

首先,我计算日期特性—季度、月、周、工作日、月日、年日、小时。所有这些特性我都可以用 lubridate 库来计算。

特征工程的第二阶段是计算某些数字特征的滞后值。对于我的分析,我想计算 T,Po,P,U,Ff,N,Nh,VV 和我的目标 RRR 的滞后值。某一天会有 3 个滞后,前一天会有 1 个滞后。最终数据集:

因此,是时候为训练、验证和测试子集拆分数据集了。“2012–02–02 02:00:00”-“2018–12–31 23:00:00”范围内的训练数据集,“2019–01–01 02:00:00”-“2019–03–31 21:00:00”范围内的验证数据集,以及“2019–04–01 00:00”-“2019–07–19

此外,检查子集中类的平衡和回归任务目标值的分布也很重要。

因此,结果是,我们得到了用于分类的不平衡数据集和用于回归的稍微不同的分布。

建模

分类

好了,开始建模吧。我想测试的框架是 H2O。

H2O 是一个完全开源的分布式内存机器学习平台,具有线性可扩展性。H2O 支持最广泛使用的统计&机器学习算法,包括梯度增强机器、广义线性模型、深度学习等。H2O 还拥有行业领先的 AutoML 功能,可自动运行所有算法及其超参数,生成最佳模型排行榜。

在我的实验中,我想使用梯度增强机器、广义线性模型、深度学习和 AutoML。H2O 的好处之一是对因素重要性的综合分析。

我的第一个模型是——分类任务的广义线性模型。正如我们之前看到的,我们的标签是不平衡的,所以我们需要设置 balance_classes = TRUE 。同样为了分类,我们需要设置family =‘二项式’。所以,让我们构建它,看看特性的重要性。

正如我们所看到的,最重要的因素是降水前一小时的湿度。准确性呢?让我们计算所有主要指标:

所以总的来说,我们的模型预测不错,但是我们能预测的降水量只有 56%。

让我们试试另一个模型。我的第二个模型是梯度推进机器。我还要设置 balance_classes = TRUE 。这些特性的重要性看起来会像:

最重要的因素是降水和云量的不同滞后。这个模型的准确性如何?

结果比较好。我们可以更准确地预测降水。我想试试更复杂的型号。这将是一种深度学习算法,H2O 也提供了这种算法。我还要设置 balance_classes = TRUE 。这些特性的重要性看起来会像:

哇,这是有趣的最重要的因素,如果所有的降水滞后,然后才是湿度和云量。精确度呢:

在 GBM 算法中,结果最差,这可能与我的深度学习模型过拟合有关。

H2o 也有自动机器学习。让我们建立 50 个模型,看看结果。创建的前 5 个模型—具有不同超参数的 GBM。像往常一样。让我们看看最重要的因素:

您可以看到因素重要性与我自己的 GBM 模型非常相似,那么准确性呢:

AUC 比我自己的 GBM 模型要好,但 TNR 最差。此外,它需要更多的时间进行计算。

回归

让我们建立回归模型,并尝试预测降水量。

我们的第一个模型是线性回归。在分类任务中,我们可以查看特性的重要性:

湿度具有最重要的值。准确性呢?在这项任务中,我想使用 3 个指标:MAPE,平均误差,均方误差。

GLM 模型的结果相当糟糕。

让我们试试另一个模型——梯度推进机器。首先,我想看看这些特性的重要性:

与 GLM 模型不同,这里我们可以看到前一小时的特征降水量最有价值。

指标相当不错:

我们在分类任务中的复杂模型是深度学习。功能的重要性如下所示:

最重要的特征是前几个小时和当前几个小时的降水量。准确性如何:

在 GBM 模型中准确性较差,我认为这是因为 DL 太复杂了。

最后一个是 AML。排名前五的车型是:

像往常一样。让我们从反洗钱角度来看 GBM 模型的最重要因素:

结果和我的 GBM 模型很像。

让我们看看最佳 AML 模型的结果—stacked ensemble _ all models _ AutoML:

这是我创造的所有模型中最好的结果。

H2O 框架很好,也很容易使用。它可以在最短的实施时间内产生良好的效果。它还有很多超参数需要优化。

让我们试试另一个——KERAS。

Keras 是一个高级神经网络 API,致力于实现快速实验。能够以尽可能少的延迟从想法到结果是做好研究的关键。 Keras 具有以下主要特性:

  • 允许相同的代码在 CPU 或 GPU 上无缝运行。
  • 用户友好的 API,使快速原型深度学习模型变得容易。
  • 内置对卷积网络(用于计算机视觉)、递归网络(用于序列处理)以及两者任意组合的支持。
  • 支持任意网络架构:多输入或多输出模型、层共享、模型共享等。这意味着 Keras 适用于构建任何深度学习模型,从记忆网络到神经图灵机。
  • 能够在多个后端之上运行,包括 TensorFlow 、 CNTK 或theno。

我想建立一个多输入多输出的神经网络。

对于输入,我想使用与 H2O 车型相同的功能。对于分类特征,我会使用实体嵌入方法。关于这种方法的更多细节,您可以在本文中阅读— 链接。

多输出帮助我同时解决 2 个任务(分类和回归)。

Keras 框架没有自己的特性重要性模块,但是你可以使用 Lime 。

让我们来看看结果:

  • 分类:

  • 回归:

Keras 的神经网络带来了很酷的结果。这种型号比以前的型号性能好得多。

结论

天气预报是一项非常困难的任务。机器学习算法有助于短期预测。为了得到好的结果,我们需要在神经网络中使用滞后特征或使用 RNN 结构。

你能在 Git 仓库中找到的所有代码— 链接。

将机器学习融入物理学:数据科学家的观点

原文:https://towardsdatascience.com/weaving-machine-learning-into-physics-a-data-scientists-point-of-view-63f60a95f5be?source=collection_archive---------23-----------------------

我是一名数据科学家,这篇文章是针对我的同行的。它主要基于 2017 年的一篇论文,名为“理论指导的数据科学:从数据中进行科学发现的新范式【TGDS】。[TGDS]向自然科学家展示了数据科学对他们工作的贡献。在这里,我们将讨论[TGDS]并做反向映射:我们的数据科学家的实践能在科学努力中适合哪里?我们如何向愿意将数据科学融入工作的科学家宣传自己?

数据科学现在在许多行业都很常见。数据可用性的增加,加上机器学习和一般计算的进步,是这种普遍性的主要因素。

机器学习长期以来一直被用于商业目的,由电子商务和营销等行业培育。但我们看到越来越多的应用在自然科学中,算法被用来刺激科学发现。下面是机器学习在自然科学中的一个快速、不全面的使用列表(更多细节可以在[TGDS]和[MLPHYS]中找到):

  • 粒子物理学:探测罕见事件,其中最大的成功是发现了希格斯玻色子
  • 气候&地质:空间&时间多尺度建模,子过程间耦合更好
  • 能源:消耗&产量预测,产量优化
  • 流体力学:提高数值模拟的精度,特别是在湍流等临界状态下。
  • 量子力学 : DFT 近似
  • 材料:材料的表征(结构- >性质关联),新化合物的发现
  • 生物学 : DNA/RNA 匹配、神经模型、基因到蛋白质表征

然而,不仅仅是把最新的机器学习算法扔进肉汤。在这里,我们处理的是物理现象,首先我们只有不完善的模型。数据科学肯定有助于改进这些数学模型。但是为了实用,我们必须确保机器学习输出在物理上是一致的。这意味着,当我们将数据和自然科学结合在一起时,必须特别小心——换句话说,将知识融入机器学习。

我们收集的文献是由来自不同领域的物理学家和工程师们制作的。一些作者已经进行了实际的实验,比较了基于物理的方法和基于数据的方法;其他人回顾了前者的结果,以便从这些不同的实验中吸取教训。根据他们的说法,当我们很好地利用数据科学时,必须遵循以下原则:

  • 效率 —当与实际数据比较时,算法必须做出好的预测(这当然不是自然科学特有的)
  • 可归纳性——该算法肯定捕捉到了更普遍现象的“某些东西”,而不仅仅是被审查的实验
  • 可解释性——可以从算法模型中提取“一些东西”,从而提供对物理现象的更好理解(可解释性是一个很强的假设,参见这里的进行讨论)
  • 通用语言、工具和平台 —算法必须适合一个全球框架,允许来自多个学科的物理学家通过交换数据、实验和见解进行合作(这在多尺度设置中至关重要)。如果我们的目标是开发一种新产品,合作必须扩展到其他个人,如工程师,他们将负责工业化

换句话说,物理学家和工程师对数据科学在其专业领域的应用持批评态度。他们不反对归纳(基于物理学)和经验(基于数据)策略,但承认它们的互补性(在本研究的狭义背景下,机器学习被定义为从测量和模拟中为大量数据创建有效替代的能力【CLASSIF】)。

科学家如何使用数据:理论指导的数据科学

有许多方法可以将数据科学和物理学结合起来。理论指导的数据科学的概念产生于利用现有实践的需要;[TGDS]论文对此进行了广泛描述。我们可以把 TGDS 看作是对这两个领域之间相互认识的恳求。它既承认数据在自然科学中日益增长的重要性,也承认需要建立一个良好实践的目录,以实现本文引言中引用的利害关系:“TGDS 的总体愿景是引入科学一致性,作为学习可概括模型的基本组成部分。”

在[TGDS]中,机器学习模型的性能被定义为:

性能∝准确性+简单性+一致性

  • 准确性是我们在进行机器学习时通常追求的——模型准确反映我们想要预测的数据分布的能力
  • 简单性是指数据科学中经常提出的偏倚/方差权衡。“最佳”模型不是最复杂的模型,而是那些针对训练数据的可变性平衡了准确性和鲁棒性的模型
  • 最后,一致性是嵌入 TGDS 所有力量的因素。它可以防止机器学习模型泛化能力差,因为它们没有被约束为与底层物理理论一致(注意,该论文断言一致性可以在不损害偏差的情况下减少方差;考虑到这里的概念是非正式的,应该不严格地理解这种说法)

一致性是[TGDS]中详述的各种实践背后的驱动原则。这些实践分为 5 个 TGDS 研究主题,即:

(A)理论指导下的数据科学模型设计
(B)理论指导下的数据科学模型培训
(C)理论指导下的数据科学成果提炼
(D)学习理论和数据科学的混合模型
(E)使用数据科学扩充基于理论的模型

数据科学模型的理论指导设计

在这个主题中,领域知识影响机器学习算法的选择、它的体系结构,以及(当适用时)输入和输出之间的链接函数。

例如,科学家可能会被引导到具有卷积层的人工神经网络,因为所研究的问题涉及空间相关性。

数据科学模型的理论指导培训

在这里,领域知识规定了施加在数据科学模型上的各种约束(值或梯度的界限、参数的初始值、对称性、变量之间的交互、正则化等)。实际上,这属于我们所说的“模式选择”。

例如,如果预测目标必须在已知范围内取值,那么可以相应地将惩罚项添加到机器学习模型的损失函数中。此外,如果问题在输入空间的某种变换下是不变的,则可以人工创建附加的训练样本,以迫使模型具有相同的不变性。

数据科学产出的理论指导提炼

根据理论考虑对机器学习模型的输出进行后处理(细化),以便使它们更有意义或者使它们在物理上一致。

最简单的例子是简单地排除产生不一致结果的候选模型。然后可以测试另一个算法或参数集,希望它满足一致性要求。如果不一致不太严重,结果可能会被“调整”,例如用更合理的值替换异常值。

学习理论和数据科学的混合模型

理论和/或数值模型与机器学习模型共存。前者为后者提供输入,相反,机器学习模型的输出可以推动传统模型。所有这些模型然后形成一个复杂的图形,中间结果在它们之间流动,直到最后的输出步骤。

一个例子是代理模型的概念。代理模型处理系统的一部分缺少理论模型的情况。该模型不是从蓝色中取出方程,而是学习相关变量之间的关系,并插入到更一般的理论或数字模型中。当理论模型是可获得的,但是太昂贵而不能在每个实例上数值运行时,代理模型也是有用的。

使用数据科学扩充基于理论的模型

在这里,我们不一定要建立机器学习模型。相反,数据科学实践被用来帮助理论家改进他们的模型。

[TGDS]中针对该主题描述的两个用例是数据同化和参数校准。他们依靠推理和不确定性建模来最大化理论模型或其参数的可能性。

编织图案

作为数据科学家,我们通常不会这样计划我们的工作。我们更习惯于数据科学工作流或管道,例如下面的监督学习:

因此,让我们回顾一下 TGDS 实践,作为在我们的数据科学工作流程的特定点引入领域知识的方法。关于在这种情况下可以调动的实践知识的例子,请参考[TGDS]论文。

  1. 在[TGDS]中,输入数据的划分被称为“多任务学习”。它允许每个分区使用不同的机器学习模型。我们将练习分成表格中的两行。在数据准备步骤中,划分标准直接由领域知识决定。在特征工程步骤中,通过对数据应用第一模型(显式或通过无监督聚类算法)从数据中导出标准
  2. 这些实践在[TGDS]中没有被引用,但是它们确实适合这里。关于“目标的选择”和“交叉验证方案和指标”的讨论,见下一节
  3. 这一项可以在[TGDS]中的“响应规范”下找到,并附有广义线性模型(GLM)的例子。然而,我们可以将这一论点扩展到先验地给出一个关系函数的算法,就像具有核的支持向量机
  4. 我们将数据同化(在每次迭代中使用观测值来校正预测)映射到模型/算法步骤,因为这正是在线学习或梯度推进的情况

TGDS 的一个实践不适合我们的表格,因为它不是以数据科学为中心的。它是对数据科学成果的一种物理或数值模型的开发(在“学习理论和数据科学的混合模型”研究主题中提到)。这种混合将是数据/物理耦合方法的一个特例,是未来文章的主题。

为了使画面完整,让我们提到两个在[不变性]中详细描述的技术,灵感来自物理考虑。这些技术旨在产生比“幼稚”模型更准确、更简单(也更快)的机器学习模型。第一种技术不是在原始数据上训练机器学习模型,而是在由数学模型的不变量启发的输入特征上训练机器学习模型。第二种在图像识别应用中是众所周知的;它包括通过应用数学模型不变的变换(例如通过平移或旋转输入)来增加输入数据。

为什么 TGDS 是重要的,它应该在哪里更加明确

将 TGDS 实践投射到数据科学工作流中是相当容易的。这是一个很好的信号,有利于数据和自然科学家之间的合作。

我们还发现,一些实践远非天真:它们远远超出了“平凡的”数据科学任务,如功能工程和算法调整。最有启发性的项目可以说是培训阶段的“调整和处罚条款(B)”。这是一种技术,其中物理一致性被嵌入在机器学习模型中,而不是用于在可能的模型中进行后验区分。具体来说,它包括几个技巧:

  • 为变量或它们的导数(梯度)设定上限和下限
  • 使用群组套索正则化来加强已知相互作用的变量之间的相互作用(换句话说,这是在模型中注入物理因果关系的一种方式)
  • 惩罚缺乏一致性的模型-例如,在模拟景观高程时,水面必须低于周围土地的水面

并非所有的训练算法或框架都允许数据科学家在损失函数上自由行动,因此这种实践也会对工作流的“算法及其架构的选择”步骤产生影响。例如,Scikit-learn Python 生态系统没有群组套索实现。另一方面,XGBoost 允许您插入自己的目标函数和度量。

不利的一面是,[TGDS]中没有提到两个重要的(监督的)机器学习任务:目标的选择,交叉验证方案和度量的选择。

人们可能认为目标的选择在给定的科学背景下是显而易见的:一个可观察的量,一个期望的结果如产量,一个离散的参数如制度……都是自然的。然而,事实证明,在一个数学模型存在的情况下,许多量是联系在一起的,其中几个是可以观察到的,我们必须选择一个。如果我们考虑到我们的数学模型是不完美的,并且观测值可能是有噪声的,并且所有候选目标可能不会表现出相同的测量不确定性或数据质量问题,那么它们就不是同等重要的。

关于交叉验证,在数据科学的背景下,我们希望明确地解决这个问题。就像上面的目标选择一样,我们可以猜测这个问题被[TGDS]的作者认为太明显了。事实上,对于具体的物理问题,RMSE(均方根误差)是迄今为止最令人满意的回归选择。对于一类分类问题,准确性感觉也一样自然。但我们必须承认,交叉验证在模型的泛化能力(以及它的一致性)中发挥了作用。更具体地说,以下是交叉验证方案和指标易于编码的知识示例:

  • 现象的空间和/或时间性质(通过正确分割输入数据集来避免泄漏)
  • 目标的统计分布
  • 极端值的处理或“挤压”(如遇到噪音或不完整的观察)
  • 不一致模型的惩罚
  • 等等。

目标的定义和交叉验证这两个问题不容忽视。一起工作的数据科学家和物理学家真的需要平等地讨论它们,因为这两个概念具有物理和方法上的含义。在这里,这不仅仅是物理学家要求数据科学家实现他们的知识。

利用数据科学重用和共享知识

到目前为止,我们的讨论集中在将数据科学与物理学结合起来的方法上。在引言中列出的利害关系中,前三个——效率、可推广性、可解释性——真的被那些方法满足了。最后的利害关系——通用语言、工具和平台——只被认为是对跨学科合作的呼吁。现在让我们更具体一些。

如前所述,数据科学渗透到许多科学领域。它在工业中也是公认的,它在物理现象和过程之间建立了联系。换句话说,数据科学是产品整个生命周期中所有活动的理想协作工具:研究、设计、流程工程、质量控制、供应链、物流、客户服务等

回想一下前面描述的数据科学工作流,至少有 3 个步骤可以生产或消费对整个组织有价值的工件:

  • 数据收集&准备:数据集、获取它们的技术、它们的结构、它们的意义、文档、清理的结果……都是可重用的信息
  • 特性&目标工程:在我们的环境中,从现有数据中创建的新特性很可能具有物理意义,使它们对组织中的其他团队有益
  • 结果的解释、后处理和利用:随着新数据和经过训练的模型,工作流产生重要的工件,例如解释性报告、数据可视化等。

以上在组织内部是有效的。在某种程度上,这也适用于同一行业的组织之间,只要他们愿意合作。严重依赖软件工具的数据科学被开源文化所渗透。如今,将自己的发现作为可重复使用的软件包发布是很常见的;有关材料科学的示例,请参见[PYMKS],它提供了微结构计算、结果可视化等功能。

还有人呼吁广泛共享数据集:数据是建立更好的机器学习模型的燃料。它可以有多种形式:测量、实验、数值模拟……或者模型本身。当然,广泛的数据共享,虽然是非常可取的,但在实践中是困难的。知识产权、缺乏元数据协议都是明显的障碍。另一个是承认这样一个事实,即数据存储库应该带有计算网格、软件和元数据目录——与许多利益相关者一起构建数据平台确实是一个复杂的项目。【素材】和【PYKMS】至少在呼吁这样一个平台。

结论

本文试图从数据科学家的角度总结数据和自然科学之间卓有成效的合作的各种因素。正如我们已经评论过的作者所指出的,来自两个世界的组织和个人对合作有着强烈的兴趣。为了科学发现的利益,他们将建立高效且物理一致的数据科学模型,以适应更广泛的科学工作流程。引用【MLPHYS】,“在为每个应用选择合适的 ML 方法时,平衡数据生成的计算成本、模型训练的便利性和模型评估时间仍然是一个重要的考虑因素。”

以下参考资料更详细地涵盖了这些方面。他们还提供了大量具体的例子来理解所概述的各种方法的实用性。对于好奇的读者,[MLPHYS]还追溯了统计物理学对机器学习算法理论基础的影响——统计物理学的几个概念工具被移植到数学中,给出了新的直觉,并允许超越机器学习的纯粹经验有效性。

我们只是触及了理论和数据科学如何协同工作的表面。合作的许多方面还有待更详细的探讨。例如,我们希望建立一个系统的方法,将数据科学与数学模型(PDEs,模拟)结合起来。另一个高度感兴趣的话题是在我们回顾的文献中一种特殊的算法所起的重要作用:人工神经网络。如何在他们的设计中融入知识?

承认

我要感谢 Annabelle Blangero 和 Rémy Frenoy 对这篇文章的深思熟虑的评论。

参考

c-w . Chang 和 N. T. Dinh,“数据驱动的热流体模型的机器学习框架分类”,国际热科学杂志,第 135 卷,第 559-579 页,2019 年 1 月。

【不变性】J. Ling,R. Jones,J. Templeton,“具有不变性的系统的机器学习策略”,《计算物理学报》,第 318 卷,第 22–35 页,2016 年 8 月。

【材料】J. Hill,G. Mulholland,K. Persson,R. Seshadri,C. Wolverton,B. Meredig,“大规模数据和信息学的材料科学:开启新机遇”,MRS Bulletin,第 41 卷,第 05 期,第 399–409 页,2016 年 5 月。

【ml phys】g . CarleoarXiv:1903.10563【astro-ph,物理学:cond-mat,物理学:hep-th,物理学:physics,物理学:quant-ph】,2019 年 3 月。

[PYMKS] D. B. Brough、D. Wheeler 和 S. R. Kalidindi,“Python 中的材料知识系统——加速开发分级材料的数据科学框架”,《材料与制造创新集成》,第 6 卷第 1 期,第 36–53 页,2017 年 3 月。

[TGDS] A. Karpatne 等,“理论指导的数据科学:从数据中进行科学发现的新范式”,IEEE 知识与数据工程汇刊,第 29 卷,第 10 期,第 2318–2331 页,2017 年 10 月。

面向数据科学家的 Web 应用程序开发

原文:https://towardsdatascience.com/web-app-development-for-data-scientists-48e445e54d7b?source=collection_archive---------15-----------------------

数据科学冲刺

两周搭建全栈数据科学项目学习自然语言处理,Flask 和 ML 模型部署!

The end product that we’ll be building in this article

我知道你们中的一些人可能在想:为什么一个数据科学家应该关心构建一个 web 应用程序?这个问题的答案非常简单:虽然分析数据集、发现模式和构建模型都是数据科学家的重要技能,但交流思想和为模型构建交互层同样重要。如果你正在考虑制造一个面向消费者的产品,或者甚至开始你自己的生意,这可能是特别重要的。

唯一比优秀的数据科学家更有价值的人,是同时了解工程和部署的优秀数据科学家。

我这个项目的目标是建立一个基本的情感分析机器学习模型+web 应用程序,并在两周内部署它,以学习三种新技术——自然语言处理(NLP)、flask 和增量/持续学习。在本文中,我将介绍如何构建 flask web 应用程序来帮助用户与情感分析模型进行交互。你可以使用你自己的模型,或者随意利用这个库来找一个我之前建的。我这篇文章的所有代码都可以在我的Github上找到,所以请随意跟随

2 分钟内完成网络应用复习!

Web 应用程序可以像您希望的那样简单或复杂。尽管复杂应用程序的架构可能会让最优秀的开发人员感到困惑,但简单的 web 应用程序并不复杂。简而言之,它包括以下几个部分:

Basic Web application layout

  1. HTML 页面:这些是你的用户可以与之交互的不同网页。许多简单的应用程序利用一个单一的网页,因此命名为单页应用程序(SPA)。
  2. 层叠样式表(CSS) : CSS 是一种样式表语言,用于改变 HTML 页面的外观。从文本颜色到背景的一切都用 CSS 描述。
  3. JavaScript:这是一种面向对象的编程语言,已经占领了 web 开发社区。Javascript 主要用于在网页上引入复杂的功能,如交互性、请求处理等。
  4. web 服务器:这是 Web 应用程序中最令人困惑的部分。web 服务器可以由硬件和/或软件组成,其工作是向用户“提供”资源。因此,当用户想要查看网页时,浏览器通过 HTTP 向 web 服务器请求资源并接收响应。对于我们的项目,我们将使用 flask 服务器进行开发。

现在你已经知道了 web 应用程序的不同部分,让我向你介绍一下 Flask,它将是我们将要使用的 web 应用程序框架。

假人用烧瓶

Flask 是一个轻量级的非常通用的 web 应用程序框架。它在构建时考虑了灵活性和速度,这使得它非常适合几乎没有后端需求的小型应用程序。让 Flask 成为数据科学家工具箱中特别有用的工具的是,它是用 Python 构建的;许多数据科学家对此已经驾轻就熟。那么 Flask 是做什么的?

Flask 负责 web 应用程序中涉及的大量环境和项目设置。这实质上意味着,作为开发人员,您可以专注于您的应用程序,而 Flask 则负责 HTTP、路由、资产等。我保证,随着本文的深入,所有这些都会变得更容易理解。

我们的烧瓶应用程序将由以下部分组成:

Flask app layout; notice how the components mentioned in the basic web app section fall into place here

根据上面的图表,您可以清楚地看到我们的应用程序的不同功能部分。app.py文件将作为主服务器逻辑,帮助服务文件和运行任何需要的 ML 逻辑。static文件夹将包含我们的应用程序所需的任何资产,从图像到我们挑选的模型。最后,template文件夹将包含我们应用程序中使用的单个 HTML 网页。

既然你已经知道了 web 应用程序的组成以及我们为什么要使用 flask,那么让我们来谈谈我们将如何实现这一切。

开发生命周期

在这个项目中,我试着遵循以下思维模式:

我想以一种快速构建/学习的模式来完成这一切,重点是功能性,而不是美观性。

鉴于此,我想分享一下我所遵循的应用程序开发生命周期。这将帮助你理解如何将功能看得比其他任何东西都重要,并快速构建原型。

Development Life Cycle used for this project

正如你所看到的,主要的功能将被反复构建。这将帮助我们在不断添加功能的同时,始终拥有一个可用的应用程序。我们将在需求收集阶段概述应用程序中所需的特性。然后,我们将为整个应用程序设计 UI/UX,以避免在开发后期担心美观问题。之后,我们将优先考虑功能,并在 24 小时内完成。最后,我将把这个应用程序部署到一个 AWS EC2 实例中,这将在另一篇文章中全面介绍。我们开始吧!

需求收集

我们的项目涉及用户与机器学习模型的交互,所以我们必须真正理解这些交互将如何发生。我们有一个 NLP 分类器,它可以预测用户对某个主题的感受是积极还是消极。因此,我们需要一个输入字段,用户可以在这里输入评论/想法和一个输出位置,预测将在这里显示。此外,我们还构建了一个功能来增量训练我们的模型。所以,我们需要为用户提供一种提供反馈的方式(正确/不正确的预测)。这些都是我们基本应用程序中的交互。

考虑到我们的应用程序的简单性,将其构建为单页面应用程序是有意义的。因此,我们 it 的另一个要求是输入、输出和反馈功能都需要在同一个页面。这将有助于保持我们的项目精简和最小化,并减少开发时间。

UI 设计

我喜欢在写任何代码之前在一张纸上画出 UI 设计,因为我们可以更快地做出改变,修补整个部分,并为快速构建提供具体的设计。此外,我还认为,在不同的屏幕上使用不同的功能,有助于将所有内容整合到一个页面应用程序(SPA)中,而不会遗漏任何部分。我的 UI/UX 设计进展可以在这里看到。

Design #1

我从三个不同的屏幕(设计#1)开始,每个屏幕都有自己的功能。第一个屏幕是用户可以输入信息并点击预测的地方。第二种情况是用户可以看到输出,并可以选择将其标记为正确或不正确的预测。最后,最后一个屏幕将是一个确认屏幕,这样用户就知道他的反馈被采纳了,并可以选择重新开始。

Design #2

这三个屏风是我的第一个水疗设计(设计#2)的模型。这是一个带有占位符的静态设计,其中各个部分(输出、反馈按钮等。)会在需要时变得活跃。我认为它是活跃的,因为没有一个元素会在任何时候隐藏;他们总是可见的。

Design #3 (Final)

我的最终设计是静态 SPA 的动态版本(设计#3),其中输出和反馈元素最初是隐藏的(左侧屏幕),然后在用户单击预测按钮时出现(右侧屏幕)。我对这个设计非常满意,并且很乐意在这一点上继续进行实际的开发。

迭代开发

在开始开发之前,我为完成这个项目所需的特性创建了一个优先级队列。它们可以在下面(按顺序)看到:

  1. 为整个应用程序构建静态用户界面(普通的 HTML+CSS)
  2. 捕捉用户的输入,通过我们的模型运行它,并提出一个预测,显示在前端
  3. 获取用户反馈,并使用之前构建的增量学习功能适当地教授模型
  4. 将 UI 从静态改为动态:在启动时隐藏不必要的元素,并在需要时显示它们

在每次迭代结束时,我将拥有一个功能有限的工作应用程序。这将有助于快速测试和调试新功能。让我来分享一下我的代码和每个特性的进展。

迭代 1:静态用户界面

构建一个静态用户界面相当简单。如果你以前从未为网络开发过,我强烈推荐你查看 MDN 网络文档来解决你的所有问题。鉴于我们的应用程序的简单性,我们的 HTML 代码是最少的,虽然我不想浪费您的时间来深入描述这一点,但我将从高层次来介绍它。我们的 UI 被分成两个主要的<div>标签:一个用于包含指令、输入文本框和预测按钮的上半部分,另一个用于包含预测输出和反馈按钮的下半部分。与这个项目相关的大多数 HTML 对于以前做过 web 开发的人来说应该是有意义的,但是我想指出一个重要的 flask 特定代码:

<form id="input-form" class="input-form" 
   action="**{{ url_for('predict')}}**" method="post">
     ..
     ..
     ..
</form>

表单标签中的{{url_for(‘predict’)}}属性是一个指向“预测”路线的 flask 方法。这个关联帮助我们从表单中捕获用户输入,并在我们的模型可用的app.py文件中处理它。当我们在下一节介绍 flask 时,您将看到这一点。

最后,为了设计这个 HTML 页面,我主要使用 CSS 的 flexbox 显示模式来创建一个最小的布局。因此,尽管还没有任何按钮起作用,图像也没有改变,但我在这次迭代结束时的静态布局如下所示:

Static UI after iteration 1. None of the buttons work yet 😃

鉴于读者的兴趣,我不会在本文中涉及 CSS,但是如果你感兴趣,你可以在这里找到我所有的代码

迭代 2:捕获输入并在前端显示预测

在上一节的最后,我们只有一个 HTML 和 CSS 文件。现在,我们将开始使用app.py文件来构建我们的应用程序的逻辑,并且从直接显示 HTML 页面转移到使用 Flask 服务器来服务它。要开始使用 Flask 服务 HTML 页面,我们只需要几行代码:

from flask import Flask, render_template, requestapp = Flask(__name__, template_folder='../templates', static_folder='../static')@app.route('/')
def home():
    return render_template('index.html', image_filename="img/happy.webp", display_mode="none")@app.route('/predict', methods=['POST'])
def predict():
    return render_template('index.html', image_filename="img/happy.webp", display_mode="none")@app.route('/save_pred', methods=['POST'])
def save_pred():
    return render_template('index.html', image_filename="img/happy.webp", display_mode="none")if __name__ == "__main__":
    app.run(debug=True)

注意:Flask 不要求显式地提到 template_folder 和 static_folder,但是我喜欢这样做,以防我弄乱了名称/路径。此外,此时,我们的项目文件夹结构应该如下所示:

Project folder structure

这样,我们所有的资产(图像、模型等。)在同一个主文件夹static的不同子文件夹中,我们的 HTML 页面在templates文件夹中,我们的app.py文件在python文件夹中。

此时,我们已经准备好使用 Flask 服务器运行我们的应用程序。为此:使用命令行导航到 python 文件夹,并运行命令python app.py。请记住,此时您应该已经使用 pip 安装了 Flask。更多关于那个的信息在这里。恭喜,您的应用程序已经启动并运行了!现在让我们添加预测逻辑。

注意我们是如何为predictsave_pred路线放置占位符的。这样做是为了确保 Flask 应用程序部署无误。为了让我们的 predict 函数工作,我们需要从 textbox 中捕获用户的输入,使用我们的 NLP 矢量器(input_transformer.pkl)将它转换成一个单词袋矢量,并通过我们的分类器(review_sentiment.pkl)运行它。还要注意,我将使用全局变量来存储模型输入和输出,以便在预测和增量学习函数中保持它们。此功能的代码如下所示:

# module needed to load models
from sklearn.externals import joblib# load models pickeled earlier
input_transformer = joblib.load(open('../static/models/input_transformer.pkl', 'rb'))
model = joblib.load(open('../static/models/review_sentiment.pkl', 'rb'))# Global variables for persistence across methods (and requests)
model_input=""
model_output=""@app.route('/predict', methods=['POST'])
def predict(): # retrieve global variables to store input and output
    global model_input
    global model_output

    # get text from the incoming request (submitted on predict button click)
    text = request.form['input_text']

    # convert text to model input vector
    final_features = input_transformer.transform([text])

    # use classifier's predict method to get prediction
    prediction = model.predict(final_features)

    # store model input and output
    model_input = text
    model_output = prediction[0] return model_output

你有它!现在,我们的应用程序可以将用户输入的文本转换成向量,可以通过我们预先训练的模型进行分类。

迭代 3:增量学习

我们采取的步骤如下:使用全局变量对输入文本进行矢量化,获得用户点击的按钮(正确/不正确),基于用户的按钮选择断言“正确”预测,递增地训练模型直到它重新学习,更新模型 pickle。这方面的代码如下所示:

[@app](http://twitter.com/app).route('/save_pred', methods=['POST'])
def save_pred():
    # retrieve global variables
    global model_input
    global model_output # vectorize user input
    final_features = input_transformer.transform([model_input])

    # get user's button choice (correct/incorrect)
    save_type = request.form["save_type"]

    # modify global variable if user selected "incorrect"
    if(save_type == 'incorrect'):
        if(model_output == 'p'):
            model_output = 'n'
        elif(model_output == 'n'):
            model_output = 'p'
        else:
            print("Error: Model output was neither N nor P") # Strengthen weight of particular connection
    max_iter = 100
    counter = 0
    for i in range (0,max_iter):
        model.partial_fit(final_features, [model_output])
        if(model.predict(final_features) == [model_output]):
            counter = i
            break

    # Save trained model pickle
    joblib.dump(model, '../../review_sentiment.pkl')    # return placeholder (will be updated later)
    return ""

虽然上面的代码实现了我们需要的所有功能,但是一旦重新训练完成,它没有向用户提供任何类型的反馈。为了解决这个问题,我们将添加一个返回文本变量来返回"权重已更改,谢谢您的指正!"或"砝码被强化,谢谢你教我!“根据情况。此外,我还认为捕获模型被重新训练的数据以防止误用该功能是非常重要的。几行代码可以帮助我们将输入、校正后的输出以及重新训练所需的周期数存储在 csv 文件中:

fields = [model_input, model_output, counter]
    with open('user_teaching_data.csv', 'a') as file:
        writer = csv.writer(file)
        writer.writerow(fields)

迭代 4:动态内容

随着我们的静态应用程序的完成,这次迭代的目的是让它变得动态和更加用户友好。你一定注意到了,所有的元素在我们的应用程序中都是可见的,而且页面每次都会重新加载。虽然这没什么大不了的,但是我们可以很容易地使用 jQuery 和 AJAX 来避免重载,并根据需要隐藏元素。这将有助于给我们的应用程序一个完美的外观,也有助于积极的用户体验。深入研究 jQuery 或 Ajax 超出了本文的范围,但是如果您感兴趣,我强烈建议您查看我的 代码 ,以及这篇关于 AJAX 的精彩文章。

在这次迭代结束时,我们的应用程序按预期工作:它接受用户信息,显示我们的 NLP 模型的结果,允许用户重新训练我们的模型,并以最简单优雅的方式完成所有这些工作。我们的全功能 web 应用程序演示可以在下面再次看到:

Final working demo for web application

恭喜我们的两周挑战进行到这一步!希望到目前为止,您不仅能够构建 NLP 模型,还具备了构建 web 应用程序以使这些模型具有交互性的必要技能。

包裹

到目前为止,我们已经完成了许多很酷的事情:我们采用了以前训练过的数据科学模型,并围绕它构建了一个功能齐全的 web 应用程序。我们花了大约六天的时间来构建我们的 web 应用程序,把重点放在功能而不是美观上。这种心态让我们能够在大约 10 天内构建我们的模型和 web 应用程序。

两周的时间还剩四天,我们将解决我们最大的挑战:使用普通 EC2 实例在 AWS 上进行建模和应用程序部署。我将写另一篇帖子来指导您完成部署过程,所以请随时关注我的专栏《走向数据科学》以获得发布时的通知!

我希望你喜欢读这篇文章,就像我喜欢把它放在一起一样。如果您有任何问题、反馈或意见,请随时通过 LinkedIn 或我的网站与我联系。

朱莉娅的网络应用:你需要知道的。

原文:https://towardsdatascience.com/web-apps-for-julia-what-you-need-to-know-68b8874dfa2b?source=collection_archive---------24-----------------------

随着 Python web 后端在 2019 年几乎超过 PHP,以及我们每天依赖的大多数数据驱动的应用程序都是由 Flask 和 Django 中基于机器学习的 web 框架驱动的,很容易看到用传统的低级语言运行 web 后端的优势。众所周知,Python 可以以 Django 和 Flask 的形式提供什么,但是我们还可以使用什么工具来构建其他语言的 web 应用程序呢?在朱莉娅的例子中,我们有一种叫做精灵的东西。

Genie 是一个强大的 web 框架,供 Julia 用于数据驱动的应用程序。但是,这个新平台确实有其合理的警告和问题,这就是我今天想要阐明的。

精灵是强大的。

与 Flask 不同,但更类似于 Django,Genie 的主要构建界面之一实际上是命令行。我认为这是相对于 Flask 的一个巨大优势,因为您可以启动并运行一个基线项目,而无需首先花费时间来路由目录。

然而,随之而来的是一个缺点,那就是框架应用程序的创建对于 Julia 的精灵来说并不总是那么好。也就是说,有时需要敏捷的计算,使用 Python 通过一个非常小的漏斗推送大量数据可能是一项优化工作,而且效率低下。Python 中的大型数据表在 Python 内部访问和读取的时间通常要长得多。虽然通常 Job-libing 可以获得明显更好的响应时间,但虚拟专用服务器一次只能实例化一个命令,这使得典型的 Python 执行对于一些应用程序来说绝对缓慢。

Genie 最大的优势大概是内置在 Julia。这使得它成为非常复杂问题的非常优雅和快速的解决方案。

软件包管理器

与 Flask 或 Django 相比,我认为 Julia 的 Genie 最大的问题是 Pkg 不一定适合这种任务。也就是说,Julia 的启动时间确实更快。这个问题是在部署管道时产生的,例如,我在本文中部署的管道。

Julia 的 Pkg 绝对没问题,如果你使用一个真正的 VPS,一个你连接到远程运行 Linux 的终端,比如说 Debian,我们只要用我们选择的方法(SSH)连接,然后安装 Julia:

sudo su
apt-get install julia

请注意,我是以 root 用户身份安装的,而不是以登录身份。当我使用用户而不是根用户进行初始安装时,我遇到了一些部署问题。无论如何,如果你在一个容器中或者运行一个 VM 镜像,这应该不是一个问题。现在大概是这样的:使用 Pkg 从我们服务器上的终端安装我们的包绝对没问题,这很棒。然而,当我们开始使用没有 SSH 的 VPS 容器部署时,例如 Heroku,我们的问题就来了。

当然,Heroku 并不是完全按照 Julia 的想法设计的,也有过这样的情况,我的应用程序只需要重新部署就可以修复了。话虽如此,这是可能的,但对我个人来说,我发现这是非常费力的。幸运的是,现在我已经完成了创建文件系统的过程,并决定建立一个框架库,这样您就可以简单地放入您的应用程序,并放入您的 UUIDs。因此,对于任何项目,您都可以从骨架的克隆开始,并从那里构建您的应用程序。

安装费用

此外,我想指出的是,首先在我的电脑上安装 Genie 非常烦人。项目清单文件中的 DEPS 缺少依赖项,其中很多只是试图导入 Genie,看看它缺少什么,然后安装它…此外,应该注意的是,其中一些包不是当前版本,而是旧版本,因此您很可能希望创建一个 docker 容器,以便专门为所述 Genie 项目存储您的包。您还可以将 Playground.jl 与

Pkg.add("Playground")

对于 Python 的等价类来说是 Pipenv/VirtualEnv。虽然可能不会有显著的惊喜,但它肯定是值得注意的,我会将安装过程描述为有点乏味,但当您让它工作时,是非常值得的。

结论

尽管 Genie 的学习曲线很难,继承了其他应用程序的不同,但它确实是一个强大的工具。如果我不得不把它归为一类,这是 Flask 和 Django 的奇怪组合,你可以以两倍的速度获得两个世界的最佳效果。有时我可能会更深入一点,在框架内部安装和构建一个 web 应用程序。我对 Julia 语言的前沿感到非常兴奋,尽管在我看来,对它的支持还没有达到

网页抓取 101

原文:https://towardsdatascience.com/web-scraping-101-969499c2d706?source=collection_archive---------15-----------------------

Photo by Pankaj Patel on Unsplash

使用 Python 从您最喜欢的网站快速抓取数据

总有一些数据科学工具,我每隔几周就会使用一次——虽然不够频繁,还不足以让它们成为我的第二天性,但足够频繁,以至于当我发现自己第无数次谷歌它时,我会感到恼火。网络抓取就是一个例子,所以今天的博客对我未来的自己和对你一样重要。

网络抓取对于初露头角的数据科学家来说是一项非常有用的技能。当我们试图分析一些东西时,我们经常需要用我们在网上找到的额外数据来补充我们现有的数据。网络抓取使我们能够自动化这个数据收集过程。

在今天的帖子中,我们将使用 Python 来抓取一个网站,以便了解网页抓取的来龙去脉。

刮的时间到了

我们将从网站https://toppubs.smedian.com/获取排名前 100 的媒体出版物的数据。完整的代码,你可以去我的 Github。

首先,我们需要导入我们将需要的包。除了通常的,我们将利用 BeautifulSouprequests Python 包来帮助我们获取和解析网站的数据(我还加入了 re 包,以防我需要使用正则表达式)。

# For our general needs
import numpy as np
import pandas as pd# For getting and parsing the data from the website
from bs4 import BeautifulSoup
import requests
import re
  • Python 包请求,允许我们的程序连接到网站并提取其数据(以非常原始的格式)。
  • BeautifulSoup 是一个处理网页数据的重要软件包。它以一种更像列表的方式重组数据,这样我们就可以用我们的代码操纵它。

现在让我们从网站上抓取数据。我们使用来自请求包的 get 方法来 ping 网站并获取其数据。然后使用 BeautifulSoup 以更加用户友好的格式构建它,以便我们可以开始使用它:

link = '[https://toppubs.smedian.com/'](https://toppubs.smedian.com/')# Grab data from website
page_response = requests.get(link, timeout=1000)# Structure the raw data so that we can parse it
page_content = BeautifulSoup(page_response.content)

下面是 page_response.content 的前几行(很乱吧?):

The raw website data is a mess

在我们通过 BeautifulSoup 运行它之后,它看起来是这样的(更有条理一点):

A bit more structure thanks to BeautifulSoup

仍然有很多东西需要理解,但是现在看起来更容易解析了。现在让我们来看看实际的网站,找到我们感兴趣的刮。这是网站的快照:

The website we are scraping

前 100 家媒体出版物的表格(上图的下半部分)包含了我们感兴趣的数据。我们可以通过检查页面的源代码来找出数据所在的位置。为此,只需将鼠标悬停在您感兴趣的页面部分,右键单击,然后选择“Inspect”。

Inspecting the source code

这将打开一个侧窗格,允许您查看页面的源代码。例如,如果我们对收集订阅者的数量感兴趣,我们检查 603,567 个订阅者(在左边用蓝色突出显示)。这打开了右边的窗格,在这里我们可以看到,为了获得订阅者的数量,我们应该在我们的 BeautifulSoup 对象中寻找标签(这是一个 HTML 标签,我对 HTML 知之甚少,所以请原谅缺乏解释)。回想一下,我们的 BeautifulSoup 对象是变量 page_content

在表格中循环

该表中有 100 行(它毕竟列出了前 100 个出版物)。所以我们应该用一个循环来遍历它。但是我们通过什么循环呢?如果我们检查整行,我们会看到每一行都用 HTML 标签

表示。

Inspecting a row of the table that we want to scrape

所以我们的循环应该找到每个标签,然后获取内容。我们可以使用 find_all 方法来做到这一点——我们使用它来查找 page_content 中 tag = 'div '和 class = 'row '的所有元素。 find_all 方法返回一个我们可以遍历的列表:

pub_names = []
pub_subs = []# Loop through each row
for row in page_content.find_all('div', class_='row')[1:]: # Contains the name of the publication
    pub = row.find_all('a', class_='link link--primary u-  accentColor--hoverTextNormal ng-binding') # Contains number of subscribers
    detail = row.find_all('a', class_='link u-colorLightGrey u-fontWeight400 u-fontSize12px ng-binding') if pub != []:
        pub_names.append(pub[0].text.split('\n')[1])
        pub_subs.append(detail[0].text.split('\n')[1])

首先,让我们打开行的变量,看看里面有什么。挺密的。我们可能需要使用 find_all 方法来进一步过滤。

The row variable from our loop

抓取出版物的名称

pub 变量中(来自上面的 for 循环代码),我们获取了出版物的名称。我们知道数据存在于变量的某个地方,但是在哪里呢?为了找到它,我们可以再次检查网页。我检查了页面上用蓝色突出显示的部分,它告诉我寻找标签‘a’和类‘link u-color light grey u-font weight 400 u-font size 12 px ng-binding’。挺拗口的!

Inspect the name of the publication

一旦我们知道要查找什么,我们就可以使用 find_all 方法来定位它(这是上面 for 循环中的同一行代码):

pub = row.find_all('a', class_='link link--primary u-  accentColor--hoverTextNormal ng-binding')

让我们来看看 pub 变量里面有什么:

[<a class="link link--primary u-accentColor--hoverTextNormal ng-binding" href="https://medium.com/free-code-camp" ng-href="http://medium.com/free-code-camp" style="display:inline" title="Go to freeCodeCamp.org's Community Page">
 freeCodeCamp.org
 </a>]

现在我们正在谈话!在 pub 中,我们看到“freeCodeCamp.org”,这是该出版物的名称。我们现在要做的就是解析 pub 并获取我们想要的东西。我们可以使用方法文本来实现:

pub[0].text

这会产生以下输出:

Out: '\nfreeCodeCamp.org\n'

如此接近,我们只需要去掉换行符。我们可以用的方法拆分来做到这一点:

pub[0].text.split('\n')

换行符上的拆分产生以下输出:

Out: ['', 'freeCodeCamp.org', '']

出版物的名称是这个列表的第二个元素,所以我们抓住它,准备好了:

pub[0].text.split('\n')[1]

获取该出版物的订户数量

让我们快速地再看一个例子,以确保我们理解了网络抓取的来龙去脉。既然我们已经知道了出版物的名称,我们还想知道有多少读者订阅了它。前面,我们已经发现了数据在页面源代码中的位置:

Same picture as above

如果我们拿出放大镜阅读源代码,我们会看到我们正在寻找标记为“a”的元素,并且类等于“link u-colorLightGrey u-font weight 400 u-font size 12 px ng-binding”。如果我们回头参考上面的 for 循环代码,我们会发现我们使用了 find_all 方法来获取相关元素,并将其存储在变量 detail 中。

detail = row.find_all('a', class_='link u-colorLightGrey u-fontWeight400 u-fontSize12px ng-binding')

如果我们显示它,我们会看到细节变量是一个有 5 个元素的列表。第一个元素包含订户数量, detail[0] 如下所示:

Out: <a class="link u-colorLightGrey u-fontWeight400 u-fontSize12px ng-binding" href="https://www.smedian.com/p/592ba7975fbc457423b1af2b" ng-href="https://www.smedian.com/p/592ba7975fbc457423b1af2b" target="_blank" title="Go to freeCodeCamp.org's Community Page">
603,567
Subscribers
</a>

值 603,567 是我们想要的,所以让我们用下面的代码行获取它:

detail[0].text.split('\n')

它产生以下输出:

Out: ['', '603,567', 'Subscribers', '']

酷,现在我们要做的就是抓住第二个元素:

detail[0].text.split('\n')[1]

在我们对它进行任何分析之前,我们需要将其转换为整数(通过删除逗号,然后将其转换为整数):

int(detail[0].text.split('\n')[1].replace(',',''))

如果我们在我的 GitHub 中运行全部代码,它会产生以下数据帧:

The output dataframe, ready for analysis

好啊,都搞定了。希望这篇教程风格的博客是有用的。干杯!

更多数据科学与商业相关岗位由我:

了解 RNNs

数据科学家的商业战略

有项目还是没有项目?

用 Python 进行业务模拟

了解 PCA

理解贝叶斯定理

网络抓取:Scrapy 和 Selenium 的一个不太简要的概述,第二部分

原文:https://towardsdatascience.com/web-scraping-a-less-brief-overview-of-scrapy-and-selenium-part-ii-3ad290ce7ba1?source=collection_archive---------3-----------------------

by Tom Gowanlock

Scrapy + Selenium 来抓取 Airbnb(包含 Python 代码)

“网络爬行的第一条规则是你不能损害网站。网络爬行的第二条规则是你不要伤害网站。

在我之前的博客文章中(链接此处,我给出了使用 Scrapy 和 Selenium 进行网页抓取的概述。我关注的是我用这些工具制作我的第一批刮刀的学习成果。我还没有在网上找到很多如何将 Scrapy 和 Selenium 结合起来的例子,所以如果你正在寻找这样的东西,请继续阅读——我试图让这篇文章尽可能具有说明性。我选择继续使用 Airbnb,这是我在《T4》第一部中提到的,这让我很惊讶,我在本博客的最后一部分中谈到了这一点。

这篇博文的内容如下:几个免责声明,一个第一部分的摘要,对 Scrapy 和 Selenium 的简要描述,一个对作为目标网站的 Airbnb 的描述,一个带有我这边评论的逐步刮刀,以及一个非常简短的最终注释

我们走吧!

这个帖子是什么

简单说说这个帖子是什么,不是什么。

放弃

免责声明#1 :我花了一段时间才发表这篇文章,因为我被其他项目缠住了。我花了几个星期的时间断断续续地研究它,并注意到 Airbnb 对它们的源代码进行了修改。因此,如果你过一段时间发现这个帖子,很可能他们那边的事情不会保持不变。出于这个原因,我附上了截图和 gif,所以即使源代码被更改,整个过程也更有意义。

免责声明#2 : Airbnb 是一个特殊的目标,因为网站的布局可能会根据会话而改变。起初,我认为这种行为是由他们识别机器人引起的,但后来,当我作为普通用户试图从多台机器和网络访问它时,我遇到了同样的问题——布局会根据会话随机变化。在这篇文章中,我将介绍类似这样的无限卷轴布局:

Infinite scroll layout that is in the focus of this post

要在此设置中加载新属性,您需要向下滚动到页面底部,直到加载完所有项目。反过来,每个项目都有一个图片来源,一个简短的描述,包括物业类型,物业名称,每晚价格,评级,评论数量,还有一些我们不能马上看到,但仍然存在的东西,就是连接目录项目及其简介的 URL

与目录相反,无论目录视图如何,房屋的配置文件似乎不会改变太多。然而,说过去几周没有任何变化是错误的。例如,现在有一个特殊的“加”房屋布局,它会出现在目录中。我将在代码中跳过这些,但是您当然也可以创建规则来处理这些配置文件。

“Plus” Homes That Are Out of This Blog Post

免责声明#3 :这篇文章是一个概念证明,而不是防弹刮刀,请随意调整,并分享对你有用的改进。

P 艺术一总结

Scrapy 是一个 Python 框架,允许你抓取 HTML 页面。虽然它快速、高效且易于使用,但它不允许您抓取更多使用 React 等框架的 JavaScript 网站,或者只是识别爬虫并禁止它们的网站。

另一方面,Selenium 是一个自动化测试的工具,它不是为抓取而开发的,但是,它可能有助于抓取 Scrapy 无法做到的网站。在模拟浏览器时(Selenium 实际上是用 webdriver 打开浏览器的),你可以编写爬虫来模拟用户的所有点击、滚动和暂停行为。除此之外,你还可以进行截图等操作。虽然很酷,但硒需要一点时间。

总而言之,Scrapy 在处理错误和异常方面更快、更健壮,Selenium 在前端模拟用户操作,这对于以抓取工具为目标或有很多反应元素的网站来说是一个巨大的优势。因此,将两者合并在一起是一个可以考虑的选择。

Airbnb: Scrapy 和 Selenium

目标 Airbnb 的样子

对于这篇文章,我选择了删除 Airbnb,因为一些论坛建议,Airbnb 需要一点努力。还有,我在第一部分开始写了,所以觉得坚持下去会很好。

假设我们要提取某个位置的属性的以下细节:
1。属性类型
2。物业名称
3。每晚价格
4。评级
5。链接到酒店简介
6。也许还有一些评论

您可以在这些属性的目录页面或个人资料页面中找到这些详细信息。

我更愿意做的第一件事是熟悉网站。其中一个有用的 Chrome 工具是 React 元素检测器 ,当页面上检测到 React 时,它会变成蓝色。

airbnb.ae — React enabled!

当你点击扩展时,你会在页面上看到大量的蓝色——所有的东西都是框架的一部分——Scrapy 不会单独处理它!你注意到的另一个需要硒或类似元素的东西是臭名昭著的无限卷轴。

The Blue and Infinite Airbnb

SPID er 逻辑

scraper 的逻辑模拟用户在网站上采取的行动,从主屏幕开始进行搜索(为简单起见,我们称之为自顶向下),然后抓取内容(比如目录页面或属性页面)。同时,您可以选择从下到上开始构建您的爬虫,看看您是否收集了任何数据并发现了任何问题。

虽然通过开始抓取目标页面(如目录页面)来检查您是否在正确的轨道上是有用的,但一些网站,如 Airbnb,会在您的请求中寻找特定信息,如果发现可疑活动,他们会禁止您,修改他们显示的 web 元素,甚至改变页面的内容。

T

由于 Scrapy 既好又快,我确实尝试单独使用 Scrapy,所以让我们做一个小实验:我们将尝试仅使用 Scrapy 获得一些响应。您可以使用 pip 安装所需的模块。安装完模块后,我们可以用scrapy startproject projectname启动项目,这将在您的工作目录中创建一个“projectname”文件夹。接下来,您可以通过将目录更改为您的项目文件夹cd projectnamescrapy genspider nameofthespider来在文件夹中生成默认的蜘蛛,这将在您的项目中创建一个默认的 Scrapy crawler 架构。提示:在命令行中调用scrapy会给你显示基本的 scrapy 命令,下面会用到一些,看看吧!

Install Packages

除了安装模块,我们还需要下载 chromedriver ,解压并在机器上安装谷歌 Chrome,如果还没有的话。Chromedriver 并不是你唯一可以使用的 webdriver,比如 Firefox 是相当流行的,但是在这篇文章中我将只讨论 Chrome。

Scrapy Architecture in a File Directory

需要注意的是,在这个树中,蜘蛛“根目录”是scrapy.cfg所在的位置,所以每当我们想要启动爬虫时,工作目录应该是scrapy.cfg所在的位置。接下来,settings.py——蜘蛛的设置——和homes.py——蜘蛛的脚本——将是这篇文章的重点。

现在,我们可以看看是否可以使用 Scrapy 从目录页面获取任何信息。让我们先来看一下 scrapy shell ,这是 scrapy 的一个命令行。这便于测试碎片代码,即查看选择器是否返回任何特定的结果。[scrapy shell 'URL'](https://docs.scrapy.org/en/latest/topics/shell.html)就是要走的路。输出包含日志、零碎的汇总统计数据,最后是一个零碎的 shell,类似于 ipython shell。

scrapy shell ‘url’

你也可以在 bash 中直接尝试scrapy fetch "url"。结果会更大,有一堆状态和一个 HTML 树,看起来像这样:

scrapy fetch

无论哪种方式,重要的是downloader/response_status_count/200,其中 200 意味着我们成功地接收到了服务器响应。500 和 400 意味着我们的请求被服务器拒绝——要么你太咄咄逼人,要么机器人已被识别和阻止。

现在,让我们把重点放在 scrapy 外壳上。让我们尝试使用不同的 xpath 获取第一个属性名,我们可以通过指向属性名> >右键单击> >检查来找到。有多种方法可以获得相同的元素。比如物业类型(“包间* 1 床”、“整间* 3 床”等。)可以通过使用class="_ng4pvpo"itemtype="http://schema.org/ListItem"itemprop="name"以及其他选项进行定位。

One of the xpaths to a Property Name

使用 xpath 测试 Scrapy:

Testing Scrapy’s Response

尽管scrapy fetch产生一个 GET 状态 200,选择器还是返回空白列表。当他们说 scrapy 不能处理 JS 过多的页面时,就是这个意思。当 xpaths 不正确时也可能是这种情况(尝试任何随机的 xpaths),但是在编写本文时不是这种情况。请注意,这两种情况下都不会产生错误。

使用 Scrapy Selector和 Selenium 的driver.page_source获得相同的元素会返回一个选择器列表:

Chromedriver and Scrapy Selector

要点是:由于 Airbnb 依赖于 JS-heavy React 框架,Scrapy 无法获得所需的 web 元素并从中提取数据。这就是 Selenium 派上用场的地方,它虚拟地向服务器发出请求,同时发送服务器将接受的头,而不会阻塞您的 bot 或扭曲数据。也就是说,真实浏览器标题和 Selenium 标题是有区别的,特别是用户代理,但是我们将在下面处理它。

关于建筑——一些调整

Scrapy 架构由几个部分组成,正如我之前提到的,我将重点关注其中的两个部分。

spider.py

在您调用scrapy genspider nameofthespider之后,该文件的实际名称将是 nameofthespider.py。该文件将包含爬虫要遵循的脚本。

settings.py

Settings.py 是蜘蛛的设置。文档非常全面,如果你有时间的话可以读一读。设置允许你在必要的时候修改爬虫的行为,避免被阻止,更重要的是,不要让网站的服务器超负荷运行,否则会损害它的性能。一般来说,至少调整以下设置是个好主意:1) DEFAULT_REQUEST_HEADERS,它是浏览器发送给 web 服务器的任何请求的一部分(查看 wiki 和这里的一个例子)。2) USER_AGENT,它实际上是头的一部分,但也可以单独设置。3) DOWNLOAD_DELAY,设置对同一网站不同页面的并发请求之间的延迟。这个练习没有必要,但是记住它是个好主意。4) ROBOTSTXT_OBEY,它提供了一个选项来关注或忽略网站上的 robots.txt 文件。Robots.txt 文件存储在网站的根目录中,描述了网站上机器人的期望行为,遵守它被认为是“礼貌的”。

虽然礼貌地收集信息是最好的做法(这里有一篇好文章),但你不能总是通过遵循完整的建议列表来获得数据,部分原因是一些网站会阻止任何看起来不像浏览器的机器人,例如,当你的请求头与预期的不匹配时。

检查来自 Chrome 的预期请求头:

Airbnb — Checking Network Response

要指出的是,设置标题将是最相关的 Scrapy。Selenium 启动一个浏览器实例,然而,它的标题表明使用了自动化软件,尽管与常规浏览器非常相似。

Scrapy Settings for This Project

一步一步的刮刀

导航:搜索和加载

抓取的支柱是 web 元素选择器。你可以选择使用 css 选择器xpath 的,我更喜欢后者,并将在本文中使用它们,这是出于习惯。如果你使用 Google Chrome 或 Firefox,获取 xpath 很容易:转到元素> >右键单击> >选择“Inspect”(就像我们在上面处理属性类型一样)。控制台将会打开,在这里你将会看到所选择的元素和更多的东西,所以如果你没有立即找到你需要的东西,或者如果你在寻找其他东西,你可以在“树”中上下移动。此搜索字段是一个示例:

Airbnb — Search Field xpath

最终,我们希望我们的 scraper 浏览这个页面并进行搜索。现在我们已经了解了如何在页面上找到元素,让我们测试它是如何工作的。为了测试它,我们可以继续使用ipython

Selenium 的一个很酷的特性是它能够再现用户在网站上的行为,包括填写表单、按按钮、按“Enter”和其他键、截图等。下面的代码片段启动 webdriver,进入 airbnb hime 页面,输入城市名(Dubai),然后使用h\ue007点击“回车”。接下来,它停了一会儿——sleep(0.8)——并点击搜索按钮,通过type = "submit"找到 xpath 中的元素,并使用click()方法点击它。

然后,当您被重定向到下一页时,脚本暂停 8.7 秒。当它在下一页时,驱动程序将通过 xpath data-veloute="explore-nav-card:/homes搜索按钮“Homes”。

最后一个操作将最终把我们带到目录页面,这是一个无限滚动的页面,我们将使用while语句来滚动它。一旦我们完成了,就该为目录的元素提取选择器了。

Going Through the Search Menu on Airbnb

在导航部分被测试并按预期运行后,我们可以将这部分添加到homes.py文件中,只需稍作修改——每次调用驱动程序实例时,我们都需要在它前面调用self.(Corey 在这里解释了自我的直觉)。对于最后一块,进入 最后一块 部分。

获取数据:产品页面与目录详细信息

一般来说,如果以列表或网格的形式向您呈现一组项目,其中元素存在于相同的 xpath 中(例如,共享相同的类、id、div、等。)并在页面上重复出现,使用 for 循环很容易对它们进行迭代。如果您的元素是页面独有的,您可以直接在页面中找到它们。

回想一下 Airbnb,你可以通过进入目录页面或逐个访问房屋的简介来获得该网站的数据。但是,家庭数据点似乎更容易从家庭配置文件中访问,因为目录中的一些元素没有通用的结构。例如,您可以看到 span 中返回的所有属性类型 标签(在页面中找到的),同时迭代同一类的元素。有一个模式,但不幸的是,它不断打破,所以你不能依靠它来获得数据。从一个档案到另一个档案确实需要更长的时间,但是如果你需要从物业档案中获取物业类型或任何其他信息,请一个接一个地搜索“房屋”。

获取主页的 URL:目录页面

虽然你当然可以从目录页面抓取 Airbnb,但是有些元素,比如属性类型,很难从那里获取。此外,并不是所有的信息都可以在目录视图中获得,要获得完整的信息需要访问个人资料页面。因此,当加载目录时,我们将获得这些家庭的配置文件 URL。出于本文的目的,我将“plus”房屋排除在等式之外,因此我们将选择常规的 Airbnb 房源。

刮痧:“家”的页面

正如我在介绍中提到的,我注意到 Airbnb 不时改变目录布局,所以除了获得关于一个物业的更多细节,访问每个家庭的页面以获得细节的优势是相对容易地使用 Airbnb 为目录生成的不同布局。

一旦目录页面的 URL 列表出现,有几种方法可以到达产品页面,最简单的两种是:1) Scrapy 的yield Request (url, callback = self.parse_home_page_function, ...),它在官方文档中有描述或 2) use driver.get('url'),它将直接带你到属性页面。两者各有利弊。Scrapy 的Request的一个巨大优势是它能够并行请求几个 URL(确切的数量可以在蜘蛛的 settings.py 中更改,参见CONCURRENT_REQUESTS)。另一方面,发送并行请求会在一台机器上打开多个窗口,您可能会遇到资源分配问题。如果是你的机器,不管你在做什么,窗户很可能会被扔到你工作的窗户上,所以很难继续下去。第二,Scrapy 的请求有更高的几率被服务器拒绝,特别是当你攻击服务器的时候,或者只是不够频繁。说到 Selenium 的driver.get,它的很慢,速度取决于你的连接,然而,它在一个窗口中打开页面,我从未遇到过它被阻塞的问题。**

基于以上原因,我选择使用driver.get('url')来浏览概要文件。

在主页上,我们可以看到酒店类型、名称、每晚价格、总体评分以及每个类别的分类、摘要以及对住宅和邻近地区的简要描述。我想就此打住,但是我想起了评论部分。提取评论是一个很好的练习,原因有两个:1)评论为进一步的分析提供了有价值的信息,如 NLP 2)与目录相比,评论部分有不同的导航 3)从这个部分提取信息需要我沿着 HTML 树来回移动,直到我到达可以编写评论字典的地方,所以我决定分享关于它的想法。

Airbnb : That’s Gonna Be Scraped

…and This

…and the Ratings

…and This Too

上面强调的每件事都有两个要点。我提供它们就好像它们是原始代码的一部分。如果您想在控制台中试用它们,不要忘记从。第一个就在下面,除了评论之外什么都有:它相当简单,非常类似于检索搜索和目录页面上的选择器。元素中, link_to_home,property_type,property_name,price_night,rating_overall 以字符串形式出现(使用extract_first()); summary,rating_categories,rating_stars,home_neighborhood_short 是列表(顺便使用extract(),输出可子集化);最后,rating_categories 和 rating_stars 被组织成一个字典, rating_split (带有一个键值对rating _ categories:rating _ stars)。

下面的要点通过点击“下一步”按钮导航评论部分。返回的对象是列表的列表。列表中的每个列表都包含来自单个评论页面的字符串形式的评论。最初,我计划构建一个字典,用 reviewer 和 review date 作为键,用 review 作为值。我把我的实验留在了要点中,以防万一你需要一个基础来开始玩它或者有一个如何实现它的建议。为了这篇文章,我决定放弃它。如果你想在家里试一试,有两个提示:1)房主对评论的响应作为相同的类和目录存储在 HTML 树中,所以对评论的导航应该足够精确以区分这两种情况;2)一些评论是空的,但是评论者的名字在那里,留下没有值的潜在的键-值对。在要点的评论中,第一个问题已经解决,但是你仍然会碰到第二个问题。如果你对如何改进代码有好的想法,非常欢迎。**

在这里,我首先到达该部分以确保它被加载,并获取page_source以确保该部分被捕获。在获得第一个评论页面后,我尝试单击“下一步”按钮(您也可以一个按钮一个按钮地前进),如果它不可用,

最后一块

这篇文章的这一部分仅仅是将所有的代码连接在一起。这是“蜘蛛”文件夹中 homes.py 文件的内容。有一点不同的是yield,它产生一个字典对象来形成输出。当您以scrapy crawl homes -o output_file_name.json.csv运行刮刀时,yield 将被传递到输出文件。该文件将存储在您的项目根目录中(与 scrapy.cfg 所在的目录相同)。

在结束语中

Airbnb 有什么不同

在这次 Airbnb 经历中,有两件事发人深省。

**一个,他们相当频繁地改变网站布局,可以想见维护刮刀是需要努力的。在完成当前版本的几周前,我完成了第一个版本的刮刀,我希望它能持续下去!

**两个,在一些章节中,像“评论”很多元素都嵌套在 HTML 树中相同的元素名称下,共享相同的类、id 等。,但表示逻辑上不同的内容(例如,评论与对评论的响应)。在这种情况下,高效地收集和存储数据成为爬虫的关键部分。

更进一步

最后但同样重要的是,如果您想使用 Docker 将您的应用程序容器化,您可能想看看这篇博文,我发现这篇博文很全面,唯一的例外是作者使用了 R 而不是 Python。

最后, Airbnb 有一个 API ,所以如果你的 API 获得批准并且符合你的目的,就使用它吧!

感谢你阅读这篇文章并走了这么远!希望这是有帮助的,如果你有任何意见,请在下面留下。你也可以在 LinkedIn 上联系我:https://www.linkedin.com/in/areusova/(说明你是从这个中等岗位过来的)。或者推特https://twitter.com/khunreus。

网页抓取高级足球统计

原文:https://towardsdatascience.com/web-scraping-advanced-football-statistics-11cace1d863a?source=collection_archive---------3-----------------------

Photo by Michael Lee on Unsplash

收集数据总是很有趣

最近我一直在争论运气在足球中的作用。又或许不是纯粹的运气,而是一种技能?球队赢得联赛是纯粹靠技术吗?还是运气的重要性相当巨大?谁幸运,谁不幸运?那个队应该降级吗?还有很多很多。

但是因为我是一个数据专家,所以我想,让我们收集数据并找出答案。虽然,你是怎么衡量运气的?你如何衡量技能?没有像国际足联或 PES 电脑游戏那样的单一指标。我们必须着眼于全局,着眼于具有多个变量的长期数据,并考虑到每一场比赛的背景。因为在某些时候,一个队的球员在完全控制对手后的最后几分钟没有足够的运气打进制胜一球,最终成为平局,两个队都得了 1 分,而显然第一个队应该获得胜利。一个团队是幸运的,另一个不是。是的,在这种情况下这是一种运气,因为一支球队做了一切,创造了足够多的危险时刻,但没有得分。它发生了。这就是我们热爱足球的原因。因为这里什么都有可能发生。

虽然你不能衡量运气,但你可以根据足球中一个相对较新的指标——xG,或预期进球,了解球队的表现。

xG——是创造和放弃机会质量的统计指标

你可以在 understat.com 的找到这个指标的数据。这就是我要废弃的网。

理解数据

那么 xG 到底是什么,为什么它很重要。答案我们可以在 understat.com 的主页找到。

预期目标(xG)是新的革命性足球指标,允许您评估球队和球员的表现。

在像足球这样的低分比赛中,最终比赛分数并不能提供清晰的表现画面。

这就是为什么越来越多的体育分析转向 xG 这样的高级模型,这是一种对创造和失球机会质量的统计测量。

我们的目标是创建最精确的拍摄质量评估方法。

对于这种情况,我们用大数据集(> 100,000 个镜头,每个镜头超过 10 个参数)训练神经网络预测算法。

研究人员根据导致进球的情况训练神经网络,现在它给我们提供了一个在比赛中球队有多少真正机会的估计。因为你可以在比赛中有 25 次射门,但如果他们都是远距离或低角度射门,或者太弱,短-低质量的射门,他们不会导致进球。虽然一些没有看过比赛的“专家”会说球队占了上风,创造了大量的机会。这些机会的质量很重要。这就是 xG 度量变得非常方便的地方。有了这个指标,你现在明白梅西在很难进球的情况下创造进球,或者守门员在应该进球的地方做出扑救。所有这些事情加起来,我们看到冠军拥有技术娴熟的球员和一些运气,我们也看到失败者可能拥有优秀的球员,但运气不够好。我做这个项目的目的是理解并展示这些数字,以展示运气在当今足球中的作用。

我们开始吧

我们首先导入将在该项目中使用的库:

  • numpy——使用 Python 进行科学计算的基础包
  • pandas —提供高性能、易于使用的数据结构和数据分析工具的库
  • requests——是 Python 唯一的非转基因 HTTP 库,可供人们安全使用。(喜欢:D 官方文件中的这句话)
  • beautiful soup——一个从 HTML 和 XML 文件中提取数据的 Python 库。
import numpy as np*# linear algebra* 
import pandas as pd*# data processing, CSV file I/O (e.g. pd.read_csv)* 
import requests 
from bs4 import BeautifulSoup

网站研究和数据结构

在任何网络抓取项目中,你首先要做的是研究你想要抓取的网页,并理解它是如何工作的。这是根本。所以我们从那里开始。

在主页上,我们可以看到该网站有 6 个欧洲联赛的数据:

我们还看到,收集的数据是从 2014/2015 赛季开始的。我们提出的另一个概念是 URL 的结构。是'https://understat.com/league' + ' /name_of_the_league ' + ' 【T2 ' '

所以我们用这些数据创造变量来选择任何一个赛季或任何一个联赛。

*# create urls for all seasons of all leagues* 
base_url = 'https://understat.com/league' 
leagues = ['La_liga', 'EPL', 'Bundesliga', 'Serie_A', 'Ligue_1', 'RFPL'] 
seasons = ['2014', '2015', '2016', '2017', '2018']

下一步是理解数据在网页上的位置。为此,我们在 Chrome 中打开开发者工具,转到标签“网络”,找到包含数据的文件(在这种情况下是 2018 年),并检查“响应”标签。这是我们运行 requests.get(URL) 后得到的结果

浏览完网页内容后,我们发现数据存储在“script”标签下,并且是 JSON 编码的。所以我们需要找到这个标签,从中获取 JSON,并将其转换成 Python 可读的数据结构。

*# Starting with latest data for Spanish league, because I'm a Barcelona fan* 
url = base_url+'/'+leagues[0]+'/'+seasons[4] 
res = requests.get(url) soup = BeautifulSoup(res.content, "lxml")*# Based on the structure of the webpage, I found that data is in the JSON variable, under 'script' tags* 
scripts = soup.find_all('script')

使用 JSON

我们发现我们感兴趣的数据存储在 teamsData 变量中,在创建了一大堆 html 标签之后,它就变成了一个字符串,所以我们找到那个文本并从中提取 JSON。

import json string_with_json_obj = '' *# Find data for teams* 
for el **in** scripts: 
    if 'teamsData' **in** el.text: 
        string_with_json_obj = el.text.strip()*# print(string_with_json_obj)**# strip unnecessary symbols and get only JSON data* 
ind_start = string_with_json_obj.index("('")+2 
ind_end = string_with_json_obj.index("')") 
json_data = string_with_json_obj[ind_start:ind_end] json_data = json_data.encode('utf8').decode('unicode_escape')

一旦我们得到了 JSON 并对它进行了清理,我们就可以将它转换成 Python 字典并检查它的外观(注释了 print 语句)。

使用 Python 理解数据

当我们开始研究data时,我们明白这是一本由三个关键词组成的字典: id头衔历史。字典的第一层也使用id作为键。

从这里我们还可以了解到历史有关于球队在自己联赛中每一场比赛的数据(不包括联赛杯或冠军联赛)。

我们可以在查阅第一层字典后收集团队名称。

*# Get teams and their relevant ids and put them into separate dictionary* 
teams = {} 
for id **in** data.keys(): 
    teams[id] = data[id]['title']

history 是字典的数组,其中键是度量的名称(读取列名),值是值,不管这是多么的重复:d。

我们知道列名会反复出现,所以我们将它们添加到单独的列表中。同时检查样本值的外观。

*# EDA to get a feeling of how the JSON is structured
# Column names are all the same, so we just use first element* columns = []
*# Check the sample of values per each column* 
values = [] 
for id **in** data.keys(): 
    columns = list(data[id]['history'][0].keys()) 
    values = list(data[id]['history'][0].values()) 
    break

在输出几个打印语句后,我们发现 Sevilla 的 id=138,因此获取这支球队的所有数据能够为联盟中的所有球队复制相同的步骤。

sevilla_data = [] 
for row **in** data['138']['history']:
    sevilla_data.append(list(row.values())) df = pd.DataFrame(sevilla_data, columns=columns)
df.head(2)

为了保持本文的整洁,我不会添加已创建的 DataFrame 的内容,但最终您会在 Github 和 Kaggle 上找到 IPython 笔记本的链接,其中包含所有代码和输出。这里只是上下文的示例。

所以,wualya,恭喜你!我们有西甲 2018-2019 赛季塞维利亚所有比赛的数据!现在我们想得到所有西班牙球队的数据。让我们把这些咬过的东西循环一遍,宝贝!

*# Getting data for all teams* 
dataframes = {} 
for id, team **in** teams.items(): 
    teams_data = [] 
    for row **in** data[id]['history']:
        teams_data.append(list(row.values())) df = pd.DataFrame(teams_data, columns=columns) 
dataframes[team] = df 
print('Added data for**{}**.'.format(team))

这段代码运行完成后,我们有了一个数据帧字典,其中 key 是球队的名称,value 是该队所有比赛的数据帧。

使数据与原始数据一样的操作

当我们查看 DataFrame 的内容时,我们可以注意到,PPDA 和 OPPDA (ppda 和 ppda_allowed)等指标表示为攻击/防御动作的总量,但在原始表格中,它们显示为系数。让我们解决这个问题!

for team, df **in** dataframes.items(): 
    dataframes[team]['ppda_coef'] = dataframes[team]['ppda'].apply(lambda x: x['att']/x['def'] if x['def'] != 0 else 0)
    dataframes[team]['oppda_coef'] = dataframes[team]['ppda_allowed'].apply(lambda x: x['att']/x['def'] if x['def'] != 0 else 0)

现在我们有了所有的数字,但是每一场比赛。我们需要的是团队的总成绩。让我们找出需要汇总的列。为此,我们回到 understat.com的原始表格,我们发现所有指标都应被汇总,最终只有 PPDA 和欧普达是平均值。

cols_to_sum = ['xG', 'xGA', 'npxG', 'npxGA', 'deep', 'deep_allowed', 'scored', 'missed', 'xpts', 'wins', 'draws', 'loses', 'pts', 'npxGD'] 
cols_to_mean = ['ppda_coef', 'oppda_coef']

我们准备计算我们的总数和平均数。为此,我们循环遍历字典数据帧并调用。sum()和。mean() DataFrame 方法返回 Series,这就是我们添加的原因。将()转置到这些调用中。我们把这些新的数据帧放到一个列表中。将它们连接成一个新的数据帧full_stat

frames = [] 
for team, df **in** dataframes.items(): 
    sum_data = pd.DataFrame(df[cols_to_sum].sum()).transpose()
    mean_data = pd.DataFrame(df[cols_to_mean].mean()).transpose()
    final_df = sum_data.join(mean_data) 
    final_df['team'] = team
    final_df['matches'] = len(df) 
    frames.append(final_df) full_stat = pd.concat(frames)

接下来,我们重新排序列以提高可读性,根据点对行进行排序,重置索引并添加列'位置'。

full_stat = full_stat[['team', 'matches', 'wins', 'draws', 'loses', 'scored', 'missed', 'pts', 'xG', 'npxG', 'xGA', 'npxGA', 'npxGD', 'ppda_coef', 'oppda_coef', 'deep', 'deep_allowed', 'xpts']]full_stat.sort_values('pts', ascending=False, inplace=True)
full_stat.reset_index(inplace=True, drop=True)
full_stat['position'] = range(1,len(full_stat)+1)

同样,在原始表中,我们有预期指标和实际指标之间的差值。让我们把那些也加上。

full_stat['xG_diff'] = full_stat['xG'] - full_stat['scored'] full_stat['xGA_diff'] = full_stat['xGA'] - full_stat['missed'] full_stat['xpts_diff'] = full_stat['xpts'] - full_stat['pts']

在适当的时候将浮点数转换成整数。

cols_to_int = ['wins', 'draws', 'loses', 'scored', 'missed', 'pts', 'deep', 'deep_allowed'] 
full_stat[cols_to_int] = full_stat[cols_to_int].astype(int)

美化数据帧的输出和最终视图。

col_order = ['position','team', 'matches', 'wins', 'draws', 'loses', 'scored', 'missed', 'pts', 'xG', 'xG_diff', 'npxG', 'xGA', 'xGA_diff', 'npxGA', 'npxGD', 'ppda_coef', 'oppda_coef', 'deep', 'deep_allowed', 'xpts', 'xpts_diff'] full_stat = full_stat[col_order] 
full_stat.columns = ['#', 'team', 'M', 'W', 'D', 'L', 'G', 'GA', 'PTS', 'xG', 'xG_diff', 'NPxG', 'xGA', 'xGA_diff', 'NPxGA', 'NPxGD', 'PPDA', 'OPPDA', 'DC', 'ODC', 'xPTS', 'xPTS_diff'] pd.options.display.float_format = '**{:,.2f}**'.format full_stat.head(10)

原始表格:

现在,当我们从一个联盟获得一个赛季的数据时,我们可以复制代码并将其放入循环中,以获得所有联盟所有赛季的所有数据。我不会把这段代码放在这里,但是我会在我的 Github 和 Kaggle 中留下一个完整的抓取解决方案的链接。

最终数据集

在循环了所有的联赛和所有的赛季以及一些使数据可以导出的操作步骤后,我得到了一个带有刮削数字的 CSV 文件。数据集可在这里获得。

结论

希望你觉得有用,并得到一些有价值的信息。无论如何,如果你读到这里,我只想说谢谢你的阅读,谢谢你为我的 5 分钱花了时间、精力和注意力,希望你有很多爱和幸福,你太棒了!

原载于 2019 年 6 月 23 日http://sergilehkyi.com

网络抓取和可视化象棋数据

原文:https://towardsdatascience.com/web-scraping-and-visualizing-chess-data-af75f8f92354?source=collection_archive---------23-----------------------

动机

我一直在学习 web 抓取和数据可视化,主要是通过这个网站上发表的文章,虽然我已经找到了几十篇文章,对 web 抓取进行了快速介绍,但很少有人能超越这一点。我希望就如何在一个站点的 html 源代码中查找数据,如何抓取多个页面并收集数据,以及一旦一个人实际上拥有了她想要的数据后该做什么提供一些建议。

话题

我从 2018 年 11 月开始下棋,从那时起,我已经玩了 1,566 场不同速度的游戏,平均每天约 5 场。我使用 chess.com 的应用程序玩游戏,该应用程序除了维护每场游戏的完整历史记录之外,还跟踪每个用户的一些基本统计数据。

Screenshot of Chess.com’s stats page

虽然 chess.com 在 UX 做了令人难以置信的工作,但统计数据页面还有待改进。因为我一直在寻找项目来练习/学习更多关于网页抓取和数据可视化的知识,所以我决定收集我过去游戏的统计数据,并将收集到的一些见解可视化。

网站结构

“存档”页面允许用户查看她过去的所有游戏,如果她想回顾或分析它们的话。从 web 抓取的角度来看,可以看到关于每个游戏的各种信息整齐地存储在各行中,包括:

所玩游戏的类型
用户的棋子颜色、名称、elo 和国家
对手的棋子颜色、名称、elo 和国家
游戏结果(赢或输)
游戏中的棋步数
游戏日期

Screenshot of Chess.com’s game archive

首先要做的是检查页面(右键单击→检查)以查看其底层 HTML 源代码。点击左上角的选择器工具,然后点击游戏图标,就可以直接指向网站这部分的代码。

为了收集这些数据,我使用 Requests 库来获取站点的 HTML 代码,使用 BeautifulSoup 库来解析这些代码并获得我想要的数据。大致的想法如下所示:

page = requests.get('[https://www.chess.com/games/archive/eono619](https://www.chess.com/games/archive/eono619)')
text = page.textb = BeautifulSoup(text, 'html.parser')content = b.find('span', attrs={'class': re.compile("archive-games-game-time")})content.getText().strip()

在这段代码中,我:
1。抓取带有请求的页面
2。从它创建一个美丽的组对象
3。使用对象的。find()方法通过输入标签(' span ')和属性来查找包含我想要的数据的 html 代码。这就产生了下面这个有点乱的字符串:"5 分钟< /span > "
4。最后用。getText()方法并用 string 方法清理它。条状()

每个数据点都有自己独特的 HTML 标签和属性,但这是从网页中提取数据的通用格式。因为我想要页面上的所有游戏,而不仅仅是一个,所以我使用 BeautifulSoup。findAll()方法获取页面上具有该标签和属性的所有元素。对于我想要的每个数据点,我创建了一个类似上面的助手函数,它为给定的页面提取所有这些数据点。

def pull_speed(Bsoup):
    times = []
    for i in b.findAll('span', attrs={'class': re.compile("archive-games-game-time")}):
        times.append((i.getText().strip()))

    return times

为了浏览多个页面,我转到了网址:

https://www . chess . com/games/archive/eono 619?gameOwner=my_game &游戏类型%5B0%5D=chess960 &游戏类型% 5b 1% 5D =每日&游戏类型=直播&page = 2

通过更改最后一个参数中的页码,我可以遍历页面。我的总体抓取代码初始化空列表来存储结果,遍历每个页面并调用助手函数来抓取我想要的数据,然后收集 pandas dataframe 中的所有内容进行分析。

Full notebook and data on my GitHub (https://github.com/eonofrey/chess_scrape_2)

最后,我的数据帧有 9 列 1566 行,包含了我深入游戏所需的一切。

可视化

我做的第一个图只是看看我的 elo 如何随着时间的推移沿着 30 天移动平均线前进,以消除一些粒状数据固有的波动。很明显有一个上升的趋势,这让我很高兴看到,因为这表明我确实在学习这个游戏,尽管偶尔会遇到困难。

接下来,我使用 Seaborn 的 countplots 查看了与我对战的不同国家,这是一个非常有用的函数,它绘制了传递给它的变量的计数。

不幸的是,我在每个国家玩过的游戏列表有一个很长的尾巴,但是当我将 order 参数传递给 countplot 函数时,我只能传递我的数据帧中的一部分(order = speed _ games[' opposite _ country ']。【value _ counts().iloc[1:25] 。index)来解决这个问题。在这里,我只列出了前 25 个值,并排除了美国,因为它在这张图表中占了很大一部分。

在此之后,我决定通过对不同的字段进行分组并查看各种汇总统计数据来稍微处理一下我的数据框架。我发现两种最好的方法是。重新取样()和。group_by()方法。在这里,我按月和周对数据进行分组,以获得每个时间段玩游戏的数量,并添加一条水平线来显示每个频率下玩游戏的平均数量。

为了想象我和不同国家的玩家打得有多好,我需要做更多的预处理。我首先将数据按国家分组,得到游戏的数量以及结果的平均值(1 =赢,0 =输),这相当于一个胜率。然后,我将国家栏上的两个数据框连接起来,这样我就可以将我的图表限制在我至少打过 15 场比赛的国家。

接下来,我调查了我的胜率是否随着一周的不同而变化。有趣的是,我似乎在周末打得更好。

最后,我调查了每种颜色的胜率。由于白棋先走,所以比黑棋略占优势,预计赢的几率更大。我的数据支持这一点,显示我用白棋比用黑棋多赢了大约 4%。

我还研究了我赢的游戏和输的游戏的平均移动次数。有趣的是,我赢的游戏比我输的游戏平均多走两步。

我本可以探究这些数据的某些方面,但是为了保持简洁,我将在这里删减这篇文章。通过开展这个项目,我提高了我的网络抓取和数据可视化技能,甚至最终获得了一些关于我的象棋比赛的见解,这是一个额外的好处。我最终的希望是,有人能使用这里的课程/代码片段来帮助他们完成自己的项目。对于那些感兴趣的人,我的完整脚本和数据集可以在我的 GitHub 页面https://github.com/eonofrey/chess_scrape_2找到。要获得所有媒体文章的完整访问权限,请点击此处!

网页抓取基础知识

原文:https://towardsdatascience.com/web-scraping-basics-3c0229653842?source=collection_archive---------28-----------------------

从网上收集数据的基础知识

联合国教科文组织是联合国内部的一个组织,致力于保护世界自然和文化遗产。世界上有许多遗产,包括包含自然现象的遗产,如大堡礁。不幸的是,一些获奖的地方受到了人为干预的威胁。我们可以用以下问题来解构这个人为干预的问题;

1-哪些地点受到威胁,它们位于哪里?

2-世界上有比其他地区更濒危的地方吗?

3-将网站置于风险中的原因是什么?

我们可以查看维基百科,找到进一步解决这些问题的地方列表。当我们去https://www.wikipedia.org/搜索“濒危世界遗产名录”时,我们会看到https://en . Wikipedia . org/wiki/List _ of _ World _ Heritage _ in _ Danger维基百科页面。在此页面中,我们可以看到一个表格,其中的列为我们提供了处于危险中的网站的功能信息。

在本文中,我们将使用 R 作为编程语言,从 web 上抓取数据并加载到数据帧中。请记住,这篇文章只提供了基本的网页抓取技术,给我们一个围绕过程和可能的网页抓取解决方案的想法。

我们找到了想要抓取的数据,下一步是使用 R 将所需的数据加载到 R 中。

我们有一个表,可以从前面安装的 XML 库中使用 readHTMLTable()函数加载到 R 中。

我们基本上是在告诉 R,导入的数据以 HTML 文档的形式出现。我们使用名为 htmlParse()的函数通过解析器实现了这一点。使用 readHTMLTable()函数,我们告诉 R 提取它在已解析的 heritage_parsed 对象中找到的所有 HTML 表格,并将它们存储在 heritage_tables 中。

现在让我们选择一个表,我们可以用它来更接近地回答我们最初建立的业务问题。我们要用的表格应该有遗址的名称、位置、文化或自然的分类变量、碑文年份和濒危年份。

我们能够获得包含我们之前定义的所需列的数据表。我们可以执行简单的数据清理。为了做到这一点,让我们看看数据帧的结构。

我们有 53 个地点和 9 个变量。我们可以看到每个变量的数据类型并不准确,例如,标准应该是自然或文化之间的分类变量,但是在这种情况下,我们有许多因素,数据类型被记录为字符串。我们可以对数据集应用基本的清理方法。

年份变量需要是数字,一些年份条目不明确,因为它们有几个年份附加或组合在一起。在这些值中,我们使用正则表达式选择最后一个给定的年份,比如[[:digit:]]4$行

让我们看看位置变量,因为它看起来比年份变量要混乱得多。

这个变量实际上在一行中包含三个不同的值,它有几个不同的站点位置、国家和地理坐标。我们能做的就是得到地图的坐标。我们可以再次使用正则表达式来提取这些信息。

我们能够检索坐标和相应的世界遗产。这就完成了 web 抓取和数据准备过程,以供进一步分析。

web 抓取的过程总是包括使用一些工具,比如使用 R 或 Python 包从 web 上解析和抓取表格。如果我们想总结传播、提取和存储网络数据的技术,我们可以使用下图。

web 抓取最重要的阶段是初始阶段,在这个阶段我们定义数据需求。什么类型的数据最适合回答我们的业务问题?数据的质量是否足以回答我们的问题?信息是否存在系统性缺陷?

当我们从网上获取任何数据时,我们需要记住数据的来源。数据可能是作为第一方数据收集的一部分收集的,也可能是二手数据,如 Twitter 帖子或在离线环境中收集并手动在线发布的数据。然而,即使我们找不到数据的来源,我们使用网络上的数据也是完全有意义的。数据质量取决于用户的目的和数据的应用。

网络抓取基础有 5 个步骤,我们可以定义和遵循。

1-弄清楚你需要什么样的信息。

2-看看你是否能在网上找到能为你提供商业问题答案的数据源。

3-在试图找出数据来源时,创建数据生成过程的理论。(例如:数据集来自抽样计划或调查等……)

4-概述数据源的优点和缺点。(确定是合法的!)

5-制定决策,如果可行,从不同来源收集数据,以进一步整合。

用 Python 编写的网页刮痧板游戏描述

原文:https://towardsdatascience.com/web-scraping-board-game-descriptions-with-python-7b8f6a5be1f3?source=collection_archive---------22-----------------------

我喜欢收集数据!

我再说一遍,我爱收集数据!虽然通读 HTML 以找到您想要的标签有时会有点乏味,但是从网页中抓取数据提供了一个信息宝库。在之前的一篇文章中,我讨论了一些我用来手动收集网络数据的技术。本文将介绍如何使用 Python 库 BeautifulSoup,并请求从网站棋盘游戏极客那里收集棋盘游戏描述。如果你想看看我是如何把它们放在一起的,请滚动到文章的底部,复制并粘贴我的代码!

属国

为了让这个过程简单一点,我从的“猛男”的 Github repo 中找到了一份超过 15000 款桌游的列表,用于历史桌游极客排名。该文件是一个 CSV 文件,使得使用熊猫很容易。以下是数据在文件中如何格式化的示例:

ID,Name,Year,Rank,Average,Bayes average,Users rated,URL,Thumbnail
174430,Gloomhaven,2017,1,8.89,8.604,26069,/boardgame/174430/gloomhaven,[https://cf.geekdo-images.com/micro/img/8JYMPXdcBg_UHddwzq64H4NBduY=/fit-in/64x64/pic2437871.jpg](https://cf.geekdo-images.com/micro/img/8JYMPXdcBg_UHddwzq64H4NBduY=/fit-in/64x64/pic2437871.jpg)

使用这个文件,我构建了完整的 URL,可以从中抓取描述。我通过导入我的依赖项并加载 CSV 文件来开始这个过程:

import pandas as pd
import requests
from bs4 import BeautifulSoup
import sqlite3 as sql
from sqlite3 import Error#load the csv file
boardgames = pd.read_csv(r'board games\2019-07-08.csv')
boardgames.head()

Top 5 rows from boardgames

探索 HTML

在创建遍历所有 URL 并提取描述的循环之前,我研究了使用 Requests 和 BeautifulSoup 请求页面内容时返回的数据。这使得我更容易识别我需要找到的标签。

#explore the first board game page
url = r"[https://boardgamegeek.com/boardgame/174430/gloomhaven](https://boardgamegeek.com/boardgame/174430/gloomhaven)"
page_data = requests.get(url)
soup = BeautifulSoup(page_data.content, 'html.parser')
soup

The parsed html data

浏览数据,我看到描述被标记为带有属性 og:description 的<元内容* >。*我用 BeautifulSoup 的 find 方法提取数据。

description = soup.find("meta",  property="og:description")
print(description["content"])

在页面间循环

一旦我找到了我要找的东西,我就从 Pandas 数据框中取出 URL,并将它们分配给一个变量。然后我为 Loop 创建了一个简单的来遍历每个 URL 并将棋盘游戏描述加载到一个列表中。在棋盘游戏没有描述的情况下,我使用一个 IF ELSE 语句来防止循环中断。

#url part 1
up1 = r"[https://boardgamegeek.com](https://boardgamegeek.com)"#URLs from the data frame
urls = boardgames['URL']#index variable
n = 0#list of descriptions
desc = []#for loop
for u in urls:
    url = up1 + urls[n]
    print(url)
    d = requests.get(url)
    soup = BeautifulSoup(d.content, 'html.parser')
    description = soup.find("meta",  property="og:description")
    (desc.append(description["content"]) if description else desc.append("No Description"))
    n+=1

The loop prints the URL to indicate it is working

把所有的放在一起

循环完成后,我将描述添加到 boardgames 数据框中,并将数据框保存到 sqlite 数据库中。

#add the descriptions to the dataframe
boardgames['description'] = desc#create an sqlite database and connection
conn = sql.connect(r'Desktop\board games\bgdb')
c = conn.cursor()#load the data into the database
boardgames.to_sql('boardGames', conn)#query the data to verify
q = pd.read_sql('select * from boardGames', conn)
q.head()

The data frame with descriptions added

完整的代码

import pandas as pd
import requests
from bs4 import BeautifulSoup
import sqlite3 as sql
from sqlite3 import Error#load the csv file
boardgames = pd.read_csv(r'board games\2019-07-08.csv')
boardgames.head()#explore the first board game page
url = r"[https://boardgamegeek.com/boardgame/174430/gloomhaven](https://boardgamegeek.com/boardgame/174430/gloomhaven)"
page_data = requests.get(url)
soup = BeautifulSoup(page_data.content, 'html.parser')
soupdescription = soup.find("meta",  property="og:description")
print(description["content"])#url part 1
up1 = r"[https://boardgamegeek.com](https://boardgamegeek.com)"#URLs from the data frame
urls = boardgames['URL']#index variable
n = 0#list of descriptions
desc = []#for loop
for u in urls:
    url = up1 + urls[n]
    print(url)
    d = requests.get(url)
    soup = BeautifulSoup(d.content, 'html.parser')
    description = soup.find("meta",  property="og:description")
    (desc.append(description["content"]) if description else desc.append("No Description"))
    n+=1#add the descriptions to the dataframe
boardgames['description'] = desc#create an sqlite database and connection
conn = sql.connect(r'Desktop\board games\bgdb')
c = conn.cursor()#load the data into the database
boardgames.to_sql('boardGames', conn)#query the data to verify
q = pd.read_sql('select * from boardGames', conn)
q.head()

抓取网络数据是一项很棒的技能!如果 API 不可用,它为您提供了一种从 web 页面收集数据的简化方法。如果您想了解更多信息,请查看以下资源:

[## 教程:使用 BeautifulSoup 的 Python Web 抓取

在执行数据科学任务时,通常希望使用在互联网上找到的数据。你通常可以…

www.dataquest.io](https://www.dataquest.io/blog/web-scraping-tutorial-python/)

B

谢谢大家!

  • 如果你喜欢这个, 跟我上 Medium 了解更多
  • 通过订阅 获得完全访问权限并帮助支持我的内容
  • 我们连线上LinkedIn
  • 用 Python 分析数据?查看我的 网站

—埃里克·克莱本

网络抓取 Craigslist:一个完整的教程

原文:https://towardsdatascience.com/web-scraping-craigslist-a-complete-tutorial-c41cea4f4981?source=collection_archive---------2-----------------------

我最近一直想搬家。还有什么比从 Craigslist 上的房屋“人口”中取样更好的方式来知道我得到了一个好价格呢?听起来像是…Python 和 web 抓取的工作!

在本文中,我将带您浏览我的代码,该代码搜索东湾区 Craigslist 上的公寓。这里的代码,或者更确切地说是 URI 参数,可以被修改以从任何地区、类别、财产类型等中提取。很酷吧。

我要分享原 Jupyter 笔记本中每个单元格的 GitHub gists。如果你想一次性看到全部代码,克隆回购。否则,享受阅读和跟随!

获取数据

首先,我需要使用请求包中的 get 模块。然后我定义了一个变量 response,并把它赋给在基本 URL 上调用的 get 方法。我所说的基本 URL 是指你要从中提取数据的第一页的 URL,减去任何额外的参数。我去了东湾的公寓区,检查了“有图片”过滤器,缩小了搜索范围,所以这不是一个真正的基本网址。

然后我从 bs4 导入了 BeautifulSoup,这个模块实际上可以解析从服务器获取的 web 页面的 HTML。然后,我检查了该项目的类型和长度,以确保它与页面上的帖子数量相匹配(有 120 个)。您可以在下面找到我的导入语句和设置代码:

It prints out the length of posts which is 120, as expected.

在上面的代码中,对新创建的 html_soup 变量使用 find_all 方法,我找到了帖子。我需要检查网站的结构,以找到帖子的父标签。看下面的截图,可以看出是

  • 。这是一篇文章的标签,实际上是包含我抓取的所有元素的盒子!

Element inspection with Chrome (Ctrl+Shift+C shortcut!)

为了实现这一点,请确保按照以下方式工作:获取第一篇文章和您想要从中获取的所有变量,确保您知道如何在循环整个页面之前访问一篇文章中的每个变量,最后,确保您在添加遍历所有页面的循环之前成功地抓取了一个页面。

类 bs4.element.ResultSet 是索引的,所以我通过索引posts[0]查看了第一个单元。惊喜,都是属于那个<李>标签的代码!

You should have this output for the first post in posts (posts[0]), assigned to post_one.

帖子的价格很好抢:

.strip() removes whitespace before and after a string

我通过在类“result-date”上指定属性“datetime”来获取日期和时间。通过指定“datetime”属性,我省去了数据清理的一个步骤,即不必将该属性从字符串转换为 datetime 对象。这也可以通过将['datetime']放在.find()调用的末尾而变成一行程序,但是为了清楚起见,我将它分成两行。

URL 和文章标题很简单,因为“href”属性是链接,通过指定该参数来获取。标题只是那个标签的文本。

卧室的数量和平方英尺在同一个标记中,所以我将这两个值分开,并按元素的方式各取一个。邻居是“结果社区”类的标签,所以我抓取了它的文本。

下一个块是东湾所有页面的循环。因为并不总是有关于平方英尺和卧室数量的信息,所以我在 for 循环中嵌入了一系列 if 语句来处理所有情况。

循环从第一页开始,对于该页中的每篇文章,它通过以下逻辑工作:

我在循环中包含了一些数据清理步骤,比如提取“datetime”属性,从平方英尺变量中删除“ft2 ”,并使该值成为一个整数。我把“br”从卧室的数量中去掉了,因为它也被删除了。这样,我开始清理一些已经完成的数据。优雅的代码是最好的!我想做更多的事情,但是代码会变得过于特定于这个区域,可能无法跨区域工作。

下面的代码从值列表中创建数据框架!

厉害!就在那里。不可否认,仍然有一些数据清理工作要做。我将快速浏览一遍,然后是研究数据的时候了!

探索性数据分析

可悲的是,删除重复的 URL 后,我发现只有 120 个实例。如果您运行代码,这些数字会有所不同,因为在不同的抓取时间会有不同的帖子。大约有 20 个帖子没有列出卧室或面积。出于统计原因,这不是一个令人难以置信的数据集,但我注意到了这一点,并继续向前推进。

Descriptive statistics for the quantitative variables

我想看看东湾的价格分布,所以我画了上面的图。调用.describe()方法,我得到了更详细的观察。最便宜的地方 850 美元,最贵的 4800 美元。

下一个代码块生成一个散点图,其中的点用卧室的数量来着色。这显示了一个清晰和可以理解的分层:我们看到围绕特定价格和平方英尺的点的层次,随着价格和平方英尺的增加,卧室的数量也增加。

我们不要忘记数据科学的主力:线性回归。我们可以在这两个变量上调用一个regplot()来得到一条回归线,该回归线带有一个关于该线计算的 bootstrap 置信区间,并用下面的代码显示为一个阴影区域。如果你没有听说过 bootstrap 置信区间,这是一种非常酷的统计技术,值得一读。

看起来我们对这两个变量有一个很好的拟合。让我们检查一下相关性。我打电话去拿这些:

Correlation matrix for our variables

正如所怀疑的,卧室数量和面积之间有很强的相关性。这是有道理的,因为面积随着卧室数量的增加而增加。

继续按社区定价

我想了解位置如何影响价格,所以我按社区分组,并通过计算每个变量的平均值进行汇总。

下面是由这一行代码生成的:eb_apts.groupby('neighborhood').mean()其中“neighborhood”是“by=”参数,聚合函数是平均值。

我注意到有两个北奥克兰:北奥克兰和北奥克兰,所以我将其中一个重新编码为另一个,如下所示:

eb_apts['neighborhood'].replace('North Oakland', ‘Oakland North', inplace=True)

抓取价格,按升序排序,可以显示最便宜和最贵的居住地。现在整行代码是:eb_apts.groupby('neighborhood').mean()['price'].sort_values(),并产生以下输出:

Average price by neighborhood sorted in ascending order

最后,我观察了每个街区的价格分布。通过这样做,我看到了邻近地区的价格是如何变化的,以及变化到什么程度。

下面是产生以下情节的代码。

伯克利有很大的差距。这可能是因为它包括南伯克利、西伯克利和伯克利市中心。在这个项目的未来版本中,考虑改变每个变量的范围可能是重要的,这样它们可以更好地反映每个城市中不同社区之间的价格可变性。

好了,现在你知道了!下次你在市场上买房子的时候,看看这个,看看什么是好价格。请随意查看回购并亲自尝试,或者为您的城市完成该项目!让我知道你想出了什么!

负责任的刮。

如果你学到了新的东西,并想把它交给下一个学习者,考虑捐赠你觉得合适的任何数量,谢谢!

编码快乐!

奢侈的生活

用 Python 实现财务报表的网络抓取— 1

原文:https://towardsdatascience.com/web-scraping-for-accounting-analysis-using-python-part-1-b5fc016a1c9a?source=collection_archive---------3-----------------------

我复制了一个基于 Excel 的会计工作,以前我要花几个小时才能完成,现在这项任务可以在几秒钟内完成。

背景

会计的数据科学用例并不多。然而,会计工作是需要自动化的繁琐类别之一。我曾经做过的一项任务是获取单个公司的财务报表,这样我就可以对照行业分析它们的表现。基本上,我会在雅虎财经上搜索他们的名字,并在 Excel 上收集关键指标。

操纵网络数据有时会很棘手,尤其是当网站更新时,但是掌握这几个步骤将会在将来为你节省大量的时间。这是一个使用 Python 从雅虎财经获取财务报表的例子。

导入库

Urlib.request 是一个开源库,用于解析网页内容。当你调用它时,你基本上是要求网站从那个网站获取数据。如果感兴趣,这里有更多的信息。

https://docs.python.org/3/library/urllib.request.html

另一个库叫做 Beautiful Soup ,它使得读取以 XML 格式存储的数据变得更加容易。XML 是一种类似于 HTML 的格式,在标记之间存储值。如果你打开它,它看起来有点乱。就像你拿到一个网页的源代码一样。

import pandas as pd
from bs4 import BeautifulSoup
import urllib.request as ur

处理

这里有一个简单的技巧,你可以灵活地调整股票代码,并将其插入网址链接。如果你想提取数百份公司财务报表,它会派上用场。

# Enter a stock symbol
index= ‘MSFT’# URL link 
url_is = ‘[https://finance.yahoo.com/quote/'](https://finance.yahoo.com/quote/') + index + ‘/financials?p=’ + index
url_bs = ‘[https://finance.yahoo.com/quote/'](https://finance.yahoo.com/quote/') + index +’/balance-sheet?p=’ + index
url_cf = ‘[https://finance.yahoo.com/quote/'](https://finance.yahoo.com/quote/') + index + ‘/cash-flow?p=’+ index

现在我们已经保存了 URL 链接。如果您在 Web 浏览器上手动打开它们,它将看起来像这样。

阅读网址

接下来,我们只需要打开链接,将它读入一个名为 lxml 的适当格式。很简单。

read_data = ur.urlopen(url_is).read() 
soup_is= BeautifulSoup(read_data,’lxml’)

嗯,如果你打开 soup_is,它看起来会很乱,因为元素最初是 HTML 格式的。所有元素都被系统地安排在类中。

数据操作

但是如何知道相关数据存储在哪个类中呢?

经过几次搜索,我们知道它们存储在“div”中,我们可以创建一个空列表并使用 for 循环来查找所有元素并将它们追加到列表中。

ls= [] # Create empty list
for l in soup_is.find_all(‘div’): 
  #Find all data structure that is ‘div’
  ls.append(l.string) # add each element one by one to the list

ls = [e for e in ls if e not in (‘Operating Expenses’,’Non-recurring Events’)] # Exclude those columns

你会发现 ls 里面有很多“none”元素,因为不是所有的“div”都有一个元素。我们只需要把那些过滤掉。

*new_ls = list(filter(None,ls))*

现在看起来像这样。

如果我们更进一步,从第 12 个位置开始读列表。

new_ls = new_ls[12:]

好吧,现在我们有一个名单。但是我们怎么把它变成一个数据框呢?首先,我们需要一次迭代 6 个项目,并将它们存储在元组中。然而,我们需要一个列表,以便熊猫图书馆可以将它读入数据框。

is_data = list(zip(*[iter(new_ls)]*6))

太好了,这正是我们想要的。现在,我们只需将它读入数据框。

Income_st = pd.DataFrame(is_data[0:])

数据清理

太好了。差不多完成了。我们只需要读取第一行作为列,第一列作为行索引。这里有一些清理。

Income_st.columns = Income_st.iloc[0] # Name columns to first row of dataframeIncome_st = Income_st.iloc[1:,] # start to read 1st rowIncome_st = Income_st.T # transpose dataframeIncome_st.columns = Income_st.iloc[0] #Name columns to first row of dataframeIncome_st.drop(Income_st.index[0],inplace=True) #Drop first index rowIncome_st.index.name = ‘’ # Remove the index nameIncome_st.rename(index={‘ttm’: ‘12/31/2019’},inplace=True) #Rename ttm in index columns to end of the yearIncome_st = Income_st[Income_st.columns[:-5]] # remove last 5 irrelevant columns

在对损益表、资产负债表和现金流使用相同的技术后,您的数据框架应该如下所示。

Income Statement

Balance Sheet

Cash flow statement

在对数据帧进行转置后,DateTime 被转换为行索引,而特性成为列名。

以下是一些事后思考的问题:

  1. 这些特征如何与公司的股票价格相关联?你如何发现它们是否相关?
  2. 如果是,哪些时间段的股票价格与我们财务报表的特征相关?
  3. 在开发算法交易模型时,你还可以用提取的数据做什么?

欢迎在回复中留下你的答案和评论,看看你是否能想出一些独特的答案。

感谢您阅读本文,如果您觉得有用,请随意分享。这里是另一篇关于利用新数据框架和用 Python 做进一步财务会计分析的文章。

金融分析师的网络抓取

原文:https://towardsdatascience.com/web-scraping-for-beginners-beautifulsoup-scrapy-selenium-twitter-api-f5a6d0589ea6?source=collection_archive---------8-----------------------

简介

我最近在学习网络抓取,并想分享我使用 beautifulsoup、scrapy、selenium 以及使用 Twitter API 和 pandas datareader 进行抓取的经验。网络抓取是有趣且非常有用的工具。Python 语言使得网络抓取变得更加容易。用不到 100 行代码就可以提取数据。网络抓取是数据分析专业人员需要掌握的一项重要技能。

例如,我们可以删除金融信息、宏观经济信息或股票研究分析师、风险资本家、财务经理、基金经理、对冲基金经理等使用的任何其他信息。通过抓取 Alexa.com 的网络流量,高盛资产管理公司(Goldman Sachs Asset Management)能够发现 Homedepot 网站的访问量大幅上升,这有助于该资产管理公司提前买入 HomeDepot 的股票。FlightAware.com 通过跟踪帮助找出首席执行官的旅行模式,这反过来有助于发现并购活动。网络搜集在金融领域非常重要,因为网上有大量的金融信息。

什么是网刮

网络抓取是一种从网站上提取信息并进行处理的技术。

让我们看看如何简单和容易做网页抓取。

我将浏览下面的库和 API

  • 美汤
  • 刺儿头
  • Twitter API 提取推文
  • 熊猫 DataReader 阅读自谷歌财经

我们将使用 Jupyter 笔记本。请检查下面的链接并安装它。

Jupyter 安装

了解更多关于 jupyter

美汤:

Beautiful Soup 是一个 Python 库,用于从 HTML 和 XML 文件中提取数据。

安装 BS4:

  • pip 在命令提示符下安装 beautifulsoup4。
  • pip 安装请求

我已经安装了它,因此它说要求已经满足。

BS4 安装完成后,打开 juypter 笔记本。

只是为了演示的目的,我将从纳斯达克网站上删除数据

[## 科技公司

使用公司列表工具在以下网址查找技术公司和纳斯达克、纽约证券交易所和美国证券交易所上市公司的完整列表…

www.nasdaq.com](https://www.nasdaq.com/screening/companies-by-industry.aspx?industry=Technology&sortname=marketcap&sorttype=1&page=1)

我们将收集以下信息

  1. 名字
  2. 标志
  3. 市值
  4. 国家
  5. IPO 年份
  6. 子部门

网页如下所示

查美汤文档

这些步骤是

  • 选择要废弃的网站 URL
  • 最终确定需要从网站上搜集的信息
  • 获取请求
  • 检查网站——右击谷歌浏览器
  • 美丽的汤— HTML 解析器
  • 选择所需的数据并将其添加到列表中
  • 将抓取的数据下载到一个 CSV 文件并存储在本地
  • 将数据移动到 pandas 数据框或将 CSV 文件上传到数据框,并在 pandas 中进行进一步的分析和可视化。

下面的代码解释了这些步骤。现在打开 jupyter 笔记本,开始编码。

  1. 导入所有必需的库。

  2. 获取请求: 首先我们需要下载网页。为此,我们将使用 get request。

url = "给出您决定抓取数据的 URL "
response = get(URL)
获取有关 get 请求的更多信息

3.解析 HTML: 解析

我们将使用上面的响应创建一个新的 beautifulsoup 对象,解析器方法为 html.parser。

在 Chrome 中,我们可以通过以下方式快速找到元素的选择器

  1. 右键单击该元素,然后在菜单中选择“检查”。开发人员工具打开,并突出显示我们右键单击的元素
  2. 右键单击开发工具中的代码元素,将鼠标悬停在菜单中的“复制”上,然后单击“复制选择器”

检查铬视工具使用

有关 html 和 xml 的信息,您可以查看

在我们的例子中,整个列表保存在表“CompanylistResults”中。直接从表中删除数据。表的元素有

[<table>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/table)HTML**<table>**元素表示表格数据——也就是说,由包含数据的单元格的行和列组成的二维表格中呈现的信息。

[<td>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td)HTML**<td>**元素定义了一个包含数据的表格单元格。它参与表模型

[<tr>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tr)HTML**<tr>**元素定义了表格中的一行单元格。然后可以混合使用[<td>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td)(数据单元格)和[<th>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th)(标题单元格)元素来建立行的单元格。HTML **<tr>**元素指定包含在<tr>块中的标记构成了一个表格的一行,其中[<th>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th)[<td>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td)元素分别在该行中创建标题和数据单元格。

常见的 HTML 元素。查看更多信息

整个列表存储在表“CompanylistResults”中

这些步骤是

  1. 找到表 ID = "company list results"
  2. 选择所有的' tr '(选择所有的行)
  3. 循环遍历' tr '并找到 tr 中的所有TD(TD是单元格)

基于 HTML 代码,数据存储在 < tr >之后../。这是行信息。每一行都有一个对应的 < td >../或单元格数据信息。

我将结果附加到一个列表中。当我打印这个列表时,我得到了如下结果

在这种情况下,我们只刮了第一页。我看到有 14 页。为了抓取多个页面,我们可以添加下面的逻辑

初始化一个名为 pages 的变量,范围在 1 到 14 之间。

对每个页面进行循环,并在 url 中分配页面值

URL = 'https://www . Nasdaq . com/screening/companies-by-industry . aspx?行业=技术&sort name = market cap&sort type = 1&page = '+page

对于第二页,url 将是

URL = 'https://www . Nasdaq . com/screening/companies-by-industry . aspx?industry = Technology&sort name = market cap&sort type = 1&page = 2

并且整个提取逻辑被编码在每页的 for 循环中。

要提取数据:

现在你可以了

  • 将数据加载到熊猫数据框架中
  • 为数据帧指定列名,如名称、符号等。
  • 将数据帧下载到 CSV 文件中。
  • 进行分析和可视化

代码如下。

下载的 CSV 文件如下所示

纳斯达克十大市值股票:

前 20 大市值股票

Top 20 Market Cap Stocks in NASDAQ

纳斯达克上市股票国家:

首次公开募股数量/年

IPO Year

在纳斯达克上市的公司数量

Sector wise breakup

公司在 2019 年进行 IPO(很惊讶没有在名单中看到 Lyft。检查了 NASADAQ 网站,Lyft 不在列表中-我想他们还没有更新他们的数据库。Pinterest 和 Zoom 都在)

描述显示以下内容

熊猫档案显示更多信息

替代网络抓取的是 API。

流行的 API 看看这个 github 有用的 API

在下一篇文章中,我将介绍 scrapy、selenium、Twitter API 和 DataRead。谢谢你看我的帖子。

用 RSelenium 抓取谷歌表单

原文:https://towardsdatascience.com/web-scraping-google-sheets-with-rselenium-9001eda399b0?source=collection_archive---------9-----------------------

Photo by freestocks.org on Unsplash

我喜欢学习新的东西,我学得最好的方法之一就是实践。也有人说你永远不会完全理解一个话题,直到你能够解释它,我认为博客是解释事情的一个低门槛。

我在蒙特利尔的一个当地数据科学会议上遇到的一个人想要帮助网络抓取,以从puzzled point获得团队排名。我抓住了这个机会,因为我知道这将是我最终学习 硒的机会!

静态刮擦与动态刮擦

静态抓取忽略 JavaScript。它不需要浏览器的帮助就可以从服务器获取网页。你得到的正是你在“查看页面源代码”中看到的内容,然后你对它进行分割。如果你正在寻找的内容是可用的,你不需要再进一步。但是,如果内容类似于“iframe ”,就需要动态抓取。

动态抓取使用实际的浏览器(或无头浏览器),让 JavaScript 来完成它的工作。然后,它查询 DOM 来提取它正在寻找的内容。有时,您需要通过模拟用户来获得您需要的内容,从而使浏览器自动化。为了让我获得其余帖子的相同详细信息,我需要首先导航到下一页,这包括单击搜索结果页底部的 next 按钮。

用 Docker 设置 RSelenium

RSelenium 为 Selenium Webdriver API 提供了 R 绑定。Selenium 是一个专注于 web 浏览器自动化的项目。

您需要遵循 Windows 或 Ubuntu 上 Docker Toolbox 的安装说明。

Docker 通过使用容器来运行应用程序。容器只是一个包中的一组库和其他依赖项。你可以把它想象成一个虚拟机,但它不是创建一个完整的操作系统,而是允许应用程序使用同一个 Linux 内核,只是没有在主机上运行。基本上,它显著提高了性能并减小了应用程序的大小。此外,您可以放心,应用程序将在任何其他 Linux 机器上运行,而不管该机器的任何定制设置可能与用于编写和测试代码的机器不同。

你还需要安装 TightVNC ,这将允许你看到你是如何用 RSelenium 实时操纵网页的。

接下来按照的说明创建一个 Docker 容器,运行 selenium 服务器和它自己的 firefox 。

注意:一旦你设置了 docker 容器(并且每次你重新启动你的计算机或再次启动时),打开 Docker Quickstart 终端并运行下面的命令。

docker run -d -p 4445:4444 selenium/standalone-firefox:2.53.0

现在你已经启动了你的 Docker Quickstart 终端进入 R 并连接到一个正在运行的服务器。

library(RSelenium)
remDr <- remoteDriver(
  remoteServerAddr = "192.168.99.100",
  port = 4445L
)
remDr$open()

使用 Rselenium 导航到页面。

# navigate to the website of interest
remDr$navigate("[http://www.puzzledpint.com/standings/](http://www.puzzledpint.com/standings/)")
# confirm you got there
remDr$getTitle()0

好了,让我们在 RStudio 的查看器选项卡中获取一个现场截图。

remDr$screenshot(display = TRUE)

请记住,这只是一个静态的屏幕截图。在开发你的管道时,你需要使用 TightVNC 来实时查看你的互动,这样你就可以看到你是如何与网站互动的。

当你在你的…$findElement()…$switchToFrame() / …$clickElement()命令之间使用…$highlightElement()时,注意 TightVNC 是很重要的,这样你实际上知道你选择了合适的东西!

打开 TighVNC 查看器,输入端口号;在本例中为192.168.99.100,并在远程主机:字段中输入。点击连接,输入密码:secret

注意:如果 TightVNC 停止工作(在 Windows 10 上经常如此)并给出错误消息:“由于目标机器主动拒绝,无法建立连接”,那么请按照“使用 VNC 调试”的步骤进行操作。

访问 DOM 中的元素

网页是一组嵌套对象(统称为文档对象模型DOM )。它是一种跨平台和独立于语言的约定,用于表示 HTML、XHTML 和 XML 文档中的对象并与之交互。与 DOM 的互动对我们与硒元素的关系非常重要。

Hadley Wickham 建议使用 Chrome 扩展软件 Selectorgadget ,来帮助识别你需要的网页元素。他推荐这一页来学习更多关于选择器的知识。

例如,通过使用 SelectorGadget,您可以选择感兴趣的表。在这种情况下,它说这是一个 iframe 。为了仅隔离月度排名,我们将单击另一个框,仅选择感兴趣的一个:iframe:nth-child(68)

在 web 浏览器的上下文中,框架是网页或浏览器窗口的一部分,它独立于其容器显示内容,并具有独立加载内容的能力。在这种情况下,网站从另一个来源获取数据,在主排名页面之外以交互方式显示这些表格。对我来说幸运的是,它们都来自 Google Sheets,所以这将使我更加容易。遗憾的是,您无法使用“selectorgadget”找到这些工作表的链接。你需要在 Chrome 或 Firefox 中使用名为“Inspector”的开发者工具仔细查看源代码。如果你有 Windows 和 Firefox,你可以点击打开菜单然后点击Web Developer > Inspector或者直接点击Ctrl+Shift+c。然后我用搜索框寻找 Montréal 的链接(src=)。

对我来说,找到我要找的东西是一件非常痛苦的事情,因为有时候高光看起来像你想要的,但实际上不是。例如:

最后,我猜要弄清楚 HTML,它涉及到逐渐的“拒绝和错误”尝试。

用 RSelenium 抓取 Google 表单

法律免责声明

值得一提的是,管理员可能出于多种原因想要保护他们网站的某些部分,例如"对未经宣布的站点进行索引、遍历需要大量服务器资源的站点部分、递归遍历无限 URL 空间等。

因此,应该经常检查他们是否有许可。一种方法是使用 robotstxt 包来检查你的网络机器人是否有权限访问网页的某些部分。

# check permissions
library(robotstxt)
paths_allowed("[https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=690408156](https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=690408156)")

如果在特定的页面上写着你就有权限。或者,只需转到主页 url 上的 robots.txt 文件,就可以更广泛地了解什么是允许的(什么是不允许的)。

方法 1

有时候网站可以用框架来组成。这些实际上是被放在一个框架集中的独立网页。我们需要在这些帧之间来回跳转。

library(RSelenium)
library(XML)
library(janitor)
library(lubridate)
library(magrittr)
library(dplyr)remDr <- remoteDriver(
  remoteServerAddr = "192.168.99.100",
  port = 4445L
)
remDr$open()# Now open TightVNC to follow along with Selenium driving the browser. Set 192.168.99.100:5901 and password: secret# navigate to the main page
remDr$navigate("[https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=690408156](https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=690408156)")# [https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=552987877](https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=552987877)# look for table element
tableElem <- remDr$findElement(using = "id", "pageswitcher-content")# switch to table
remDr$switchToFrame(tableElem)
# parse html
doc <- htmlParse(remDr$getPageSource()[[1]])
table_tmp <- readHTMLTable(doc)
table_tmp <- table_tmp[[1]][-2,-1]
table_tmp <- table_tmp[-1,]
colnames(table_tmp) <- c("team_name", "team_size", "start_time", "end_time", "total_time", "puzzels_solved")
table_tmp$city <- rep("montreal", nrow(table_tmp))
table_tmp$date <- rep(Sys.Date()-5, nrow(table_tmp))

现在我们有了第一个月,我们可以为剩下的日期创建一个 for 循环。首先让我们切换回外部框架,并选择我们将要操作的元素。

# switch back to the main/outter frame
remDr$switchToFrame(NULL)# find the elements you'll manipulate with Inspector mode in a browser
webElems <- remDr$findElements(using = "css", ".switcherItem") # Month/Year tabs at the bottom
arrowElems <- remDr$findElements(using = "css", ".switcherArrows") # Arrows to scroll left and right at the bottom
tableElem <- remDr$findElement(using = "id", "pageswitcher-content") # The inner table frame

我知道会有很多桌子,但是到底有多少呢?我们可以通过length(webElems)来检查这个。

实际上总共有 49 个表,但是从上面的第一个表开始,只有 48 个链接。与其硬编码1:48,不如通过代码来实现,因为将来会添加更多的表。

# Create NULL object to be used in forloop
big_df <- NULL
for (i in seq(length(webElems))){ # for every 
check <- try(expression, silent = TRUE) # or suppressMessages(try(expression, silent = TRUE))
if (any(class(check) == "try-error")) {
        # choose the i'th Month/Year tab 
        webElem <- webElems[[i]]
        webElem$clickElement()# Find the tableElem again other wise you get a StaleElementReference 
## TO DO: look into WebDriverWait: [https://stackoverflow.com/questions/5709204/random-element-is-no-longer-attached-to-the-dom-staleelementreferenceexception](https://stackoverflow.com/questions/5709204/random-element-is-no-longer-attached-to-the-dom-staleelementreferenceexception) 
tableElem <- remDr$findElement(using = "id", "pageswitcher-content") # The inner table frame# switch to table frame
remDr$switchToFrame(tableElem)
Sys.sleep(3)
# parse html with XML package
doc <- htmlParse(remDr$getPageSource()[[1]])
Sys.sleep(3)
# Extract data from HTML table in HTML doucment
table_tmp <- readHTMLTable(doc)
Sys.sleep(3)
# put this into a format you can use
table <- table_tmp[[1]][-2,-1]
table <- table[-1,]
# rename the columns
colnames(table) <- c("team_name", "team_size", "start_time", "end_time", "total_time", "puzzels_solved")
# add city name to a column
table$city <- rep("Montreal", nrow(table))# add the Month/Year this table was extracted from
today <- Sys.Date() %m-% months(i + 1)
table$date <- today# concatenate each table together
big_df <- dplyr::bind_rows(big_df, table)# Switch back to the main frame
remDr$switchToFrame(NULL)arrowElem <- arrowElems[[1]]
# once you "click"" the element it is "held down" as far as I know there is no way to " unclick"
# to prevent it from scrolling too far I make sure not to take too long by setting the sleep short
arrowElem$clickElement()
# give it "just enough time" to scroll right
Sys.sleep(0.3)
# switch back to outer frame to re-start the loop
remDr$switchToFrame(NULL)
        }
}temp1 <- dplyr::bind_rows(table_tmp, big_df)

这里的问题是,当 for 循环试图单击右箭头时,它最终会失败,但它已经尽可能地向右了,因此它不会下载最后几个表(~5)。通常情况下,人们会这样处理这种情况:

check <- try(expression, silent = TRUE) # or suppressMessages(try(expression, silent = TRUE))
if (any(class(check) == "try-error")) {
  # do stuff
}

它通常运行良好,包括使用硒时。然而,这里遇到的问题是,单击一次箭头总是会将我带到最后一张可见的工作表,跳过中间的所有内容。因此,我的工作是这样的:

# ctrl+x from the google sheet then use the read.delim() to assign it to an object
march <- read.delim("clipboard")
february <- read.delim("clipboard")
january <- read.delim("clipboard")
december <- read.delim("clipboard")
november <- read.delim("clipboard")# add the city and date
january$city <- rep("montreal", nrow(january))
january$date <- rep("2015-01-30", nrow(january))february$city <- rep("montreal", nrow(february))
february$date <- rep("2015-02-15", nrow(february))march$city <- rep("montreal", nrow(march))
march$date <- rep("2015-03-15", nrow(march))december$city <- rep("montreal", nrow(december))
december$date <- rep("2014-12-15", nrow(december))november$city <- rep("montreal", nrow(november))
november$date <- rep("2014-11-15", nrow(november))# clean up the column names
january %<>% janitor::clean_names()
february %<>% janitor::clean_names()
march %<>% janitor::clean_names()
december %<>% janitor::clean_names()
november %<>% janitor::clean_names()# concatenate these five dataframes together
xyz <- bind_rows(march, february, january, december, november)# convert characters into actual dates
xyz$date <-as.Date(xyz$date)# reorder the columns
xyz %<>% dplyr::select(team_name, team_size, start_time, end_time, total_time, puzzles, city, date)# rename this column to match temp1
xyz <- rename(xyz, puzzels_solved = puzzles)# change to a character
xyz$puzzels_solved <- as.character(xyz$puzzels_solved)# add NA for team size
xyz$team_size <- rep(NA, nrow(xyz))# concatenate this onto the larger dataframe
temp2 <- bind_rows(temp1, xyz)# save the object
write_csv(temp2, "puzzeld_pint_raw.csv")

方法 2

非常感谢 Nate on SO 指出了一个替代方案,解决了废弃表的任务,但没有解决上述意义上的异常处理的任务。

remDr <- RSelenium::remoteDriver(
  remoteServerAddr = "192.168.99.100",
  port = 4445L
)
remDr$open(silent = TRUE)# navigate to the main page
# needs no be done once before looping, else content is not available
remDr$navigate("https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=690408156")# I. Preliminaries:
# 
# 1\. build the links to all spreadsheets
# 2\. define the function create_table
# 
# 1.
# get page source
html <- remDr$getPageSource()[[1]]
# split it line by line
html <- unlist(strsplit(html, '\n'))
# restrict to script section
script <- grep('^\\s*var\\s+gidMatch', html, value = TRUE)
# split the script by semi-colon
script <- unlist(strsplit(script, ';'))
# retrieve information
sheet_months <- gsub('.*name:.{2}(.*?).{1},.*', '\\1', 
                     grep('\\{name\\s*\\:', script, value = TRUE), perl = TRUE)
sheet_gid <- gsub('.*gid:.{2}(.*?).{1},.*', '\\1', 
                  grep('\\gid\\s*\\:', script, value = TRUE), perl = TRUE)
sheet_url <- paste0('https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pubhtml/sheet?headers%5Cx3dfalse&gid=',
                    sheet_gid)# 2.
# table yielding function
# just for readability in the loop
create_table <- function (remDr) {
  # parse html with XML package
  doc <- XML::htmlParse(remDr$getPageSource()[[1]])
  Sys.sleep(3)
  # Extract data from HTML table in HTML document
  table_tmp <- XML::readHTMLTable(doc)
  Sys.sleep(3)
  # put this into a format you can use
  table <- table_tmp[[1]][-2, -1]
  # add a check-up for size mismatch
  table_fields <- as.character(t(table[1,]))
  if (! any(grepl("size", tolower(table_fields)))) {
    table <- table[-1, ]
    # rename the columns
    colnames(table) <- c("team_name", "start_time", "end_time", "total_time", "puzzels_solved")
    table$team_size <- NA_integer_
    table <- table[,c("team_name", "team_size", "start_time", "end_time", "total_time", "puzzels_solved")]
  } else {
    table <- table[-1, ]
    # rename the columns
    colnames(table) <- c("team_name", "team_size", "start_time", "end_time", "total_time", "puzzels_solved")
  }
  # add city name to a column
  table$city <- rep("Montreal", nrow(table))

  # add the Month/Year this table was extracted from
  today <- Sys.Date()
  lubridate::month(today) <- lubridate::month(today)+1
  table$date <- today

  # returns the table
  table
}

# II. Scrapping the content
# 
# 1\. selenium to generate the pages
# 2\. use create_table to extract the table
# 
big_df <- NULL
for (k in seq_along(sheet_url)) {
  # 1\. navigate to the page
  remDr$navigate(sheet_url[k])
  # remDr$screenshot(display = TRUE) maybe one wants to see progress
  table <- create_table(remDr)

  # 2\. concatenate each table together
  big_df <- dplyr::bind_rows(big_df, table)

  # inform progress 
  cat(paste0('\nGathered table for: \t', sheet_months[k]))
}

# close session
remDr$close()

要执行这项任务,首先要生成文档中所有电子表格的链接。为此:

  • 导航到文档一次
  • 提取源代码
  • 使用regex提取工作表月份和 URL(通过gid数字)
  • 完成后,遍历 URL,收集并绑定表

有一个名为create_table的小函数,它以正确的格式返回最终的表格,并对列数进行安全度量(一些电子表格没有team_size字段——在这种情况下,我将其设置为NA_integer)。

如果你觉得这篇文章有用,请随意与他人分享或推荐这篇文章!😃

一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。在那之前,下一篇文章再见!😄

5 分钟后进行网页抓取:)

原文:https://towardsdatascience.com/web-scraping-in-5-minutes-1caceca13b6c?source=collection_archive---------9-----------------------

如何从头开始构建一个基本的 web 刮刀

介绍

对于像我这样天真的人来说,做一些网络搜集是我们能找到的最相似的事情,感觉自己是世界级的黑客,从政府系统中提取一些秘密信息。

如果你想笑就笑吧,但是当你一无所有的时候,网络抓取可以给你一个数据集。当然,对于大多数情况——我们稍后将讨论例外情况……令人惊讶的是,并不是每个人都希望我们偷偷摸摸地浏览他们的网页——我们可以通过使用几个 Python 公共库来应对 web 抓取挑战:

  • 【请求】 调用导入请求
  • BeautifulSoup' 调用 ' 从 bs4 导入 BeautifulSoup'
  • 我们可能还想使用【tqdm _ notebook】工具调用 【从 tqdm 导入 tqdm _ notebook】,以防我们需要遍历一个有几个页面的站点。例如,假设我们在搜索“数据科学家”后,试图从https://indeed.co.uk的所有职位中提取一些信息。我们可能会有几个结果页面。“bs4”库将允许我们以非常简单的方式浏览它们。我们也可以使用一个简单的 for 循环来实现,但是“tqdm_notebook”工具提供了过程演变的可视化,如果我们在一次运行中从一个站点抓取数百或数千个页面,这非常适合

但不管怎样,还是一步一步来吧。在这篇文章中,我们将搜集企鹅出版社的 100 本必读经典书籍。我们将尽力只得到每本书的标题和作者。这个简单的笔记本和其他的可以在我的 GitHub 简介中找到(包括整个关于抓取和运行分类模型的项目)。

实践应用

当我们抓取一个网站时,基本上我们是从 Python 发出一个请求,并解析每个页面返回的 HTML。如果你在想:HTML 到底是什么?或者如果你在想:废话,我不是网页设计师,我不能处理这个!不要担心,除了如何获取网页 HTML 代码和找到您想要的任何内容之外,您不需要知道任何其他内容。记住,为了这个例子,我们将寻找每本书的标题和作者:

我们可以通过以下方式访问网页 HTML 代码:

  • 右键单击>检查
  • 或者在 Mac 中按 Command+shift+c

屏幕右侧应该会打开一个窗口。确保站在窗口上部的“元素”选项卡上:

打开此窗口后,如果您站在网页的任何元素上,HTML 代码将自动移动,直到代码的特定部分。看看如果我把我的指针移到第一本书的标题(' 1。F. Scott Fitzgerald 的《了不起的盖茨比》(The Great Gatsby),HTML 突出了属于网页的该部分的元素:

在这种情况下,文本似乎包含在'

'' 中。< div >标签只不过是一个容器单元,它封装了其他页面元素并将 HTML 文档分成几个部分。我们可能会在这个或另一个标签下找到我们的数据。例如,<李>标签用于表示列表中的一项,< h2 >标签表示 HTML 文档中的二级标题(HTML 包含 6 级标题,按重要性排序)。

理解这一点很重要,因为我们必须指定我们的数据在哪个标签下才能被废弃。但是首先,我们必须实例化一个“请求”对象。这将是一个 get,带有您希望通过请求传递的 URL 和可选参数。

url = ‘https://www.penguin.co.uk/articles/2018/100-must-read-classic-books/'r = requests.get(url)

现在我们发出了请求,我们必须创建 BeautifulSoup 对象来通过它的 HTML 解析器传递请求文本:

soup = BeautifulSoup(r.text,’html.parser’)

在这种情况下,我们在 URL 中没有任何特殊的参数。但是让我们回到之前刮 Indeed.co.uk 的例子。在这种情况下,正如我们之前提到的,我们必须使用 tqdm_notebook。该工具作为 for 循环在不同的页面中迭代:

for start in tqdm_notebook(range(0, 1000 10)): url = “https://www.indeed.co.uk/jobs?q=datascientist&start{}".format(start) r = requests.get(url) soup = BeautifulSoup(r.text,’html.parser’)

请注意我们是如何指定从第 0 页跳到第 100 页,从第 10 页跳到第 10 页,然后使用 start={}”将“开始”参数插入到 url 中的。格式(开始)。 惊艳!我们已经有了格式良好的 HTML 代码。现在让我们获取数据吧!有几种方法可以做到这一点,但对我来说,最简洁的方法是编写一个简单的函数,在创建 BeautifulSoup 对象后立即执行。

之前我们看到我们的数据(标题+作者信息)位于以下位置:'

'。所以我们要做的是分解代码序列,以便找到代码中所有的“cmp-text 文本”元素。为此,我们将使用我们的 BeautifulSoup 对象:

for book in soup.find_all(‘div’, attrs={‘class’:’cmp-text text’})

这样,我们的 soup 对象将遍历所有代码,找到所有的【CMP-text text】元素,并给出每个元素的内容。理解我们在每次迭代中得到什么的一个好方法是打印名为“book.text”的文本。在这种情况下,我们会看到以下内容:

1.菲茨杰拉德的《了不起的盖茨比》

对美国梦核心空洞的最伟大、最尖刻的剖析。催眠,悲剧,它的时间和完全相关。

乔·T,推特

在这里我们可以看到的是,我们的‘CMP-text text’元素下的文本包含了书名+作者,同时也包含了书的简要描述。我们可以用几种方法来解决这个问题。为了这个例子,我使用了正则表达式来调用‘import re’。Regex 本身是一个庞大的主题,但是在这种情况下,我使用了一个非常简单的工具,它总是很方便,您可以很容易地学习。

pattern = re.compile(r’(?<=. ).+(?=\n)’)

使用我们的“re”对象,我们可以使用 regex lookahead 和 lookahead 工具创建一个模式。指定(?<=behind_text) we can look for whatever 跟随我们的‘match _ text’。而且用(?=ahead_text)我们表示任何跟在后面的‘match _ text’,’。一旦 regex 找到我们的代码,我们可以告诉它给我们任何数字,只有字母,特殊字符,一些特定的单词或字母,甚至所有这些的组合。在我们的例子中。+'的表达在中间基本上就是‘把什么都给我拿来’。所以我们会找到介于两者之间的一切。(列表中图书位置后的点和空格)和一个' \n ',这是跳到下一行。

现在我们只需要向我们的“re”对象传递模式和文本:

appender = re.findall(pattern,text)

这将为我们提供一个列表,例如,具有以下内容:

[‘The Great Gatsby by F. Scott Fitzgerald’]

很容易解决调用列表中的文本并在“by”处将其拆分,以便在不同的列表中存储标题和作者。让我们把所有东西放在一个函数里,就像我们之前说的那样:

def extract_books_from_result(soup):
 returner = {‘books’: [], ‘authors’: []}
 for book in soup.find_all(‘div’, attrs={‘class’:’cmp-text text’}):

 text = book.text
 pattern = re.compile(r’(?<=. ).+(?=\n)’)
 appender = re.findall(pattern,text)[0].split(‘ by’) # Including a condition just to avoid anything that’s not a book
 # Each book should consist in a list with two elements: 
 # [0] = title and [1] = author

 if len(appender) > 1:
  returner[‘books’].append(appender[0])
  returner[‘authors’].append(appender[1])

 returner_df = pd.DataFrame(returner, columns=[‘books’,’authors’]) 

 return returner_df

最后,让我们一起跑吧:

url = ‘https://www.penguin.co.uk/articles/2018/100-must-read-classic-books/'r = requests.get(url)soup = BeautifulSoup(r.text,’html.parser’)results = extract_books_from_result(soup)

恭喜你!您已经完成了第一次抓取,并且在一个数据帧中拥有了所有数据。现在就看你怎么做了。).

不幸的是,网络抓取并不总是那么容易,因为有几个网站不希望我们偷偷摸摸。在某些情况下,他们会有一个非常复杂的 HTML 来避免新手,但在许多情况下,他们会阻止像我们这样的好人试图获得一些体面的数据。有几种不被发现的方法,但可悲的是,这篇文章已经远离了我和我在五分钟内学会网络抓取的承诺。但是不要担心,在不久的将来我会写更多关于这个的东西。所以敬请期待;)

最后,请记住:这个简单的笔记本和其他的可以在我的 GitHub 简介中找到(包括关于抓取和运行分类模型的整个项目)。此外,不要忘了查看我的上一篇文章,关于我在使用火车测试分裂时犯的 6 个业余错误,以及在我的作者简介中的更多关于数据科学的内容。如果你喜欢这篇文章,别忘了关注我,如果你想直接在你的电子邮件上收到我的最新文章,就订阅我的时事通讯吧:)

感谢阅读!

使用 BeautifulSoup 的 Web 抓取元评论

原文:https://towardsdatascience.com/web-scraping-metacritic-reviews-using-beautifulsoup-63801bbe200e?source=collection_archive---------7-----------------------

一个简单的 6 步指南,使用 BeautifulSoup 收集游戏评论并保存到 pandas dataframe 中。

我决定刮掉元批评口袋妖怪的评论,因为我想给负面游戏评论做个主题模型。我很好奇这些游戏是如何被评论家称赞,却被大多数玩家评价很差的。为什么游戏玩家讨厌口袋妖怪?在这篇文章中会有更多相关内容。与此同时,我是这样从网站上搜集评论的。

** 底部全码。嵌入代码(在灰色框中)用于解释目的***

  1. 导入包。你需要的主要包装是 request、BeautifulSoup 和 pandas。
*#To get the url, and scrap the html page* import requests
from bs4 import BeautifulSoup*#To save the reviews in a dataframe* import pandas as pd

2.弄清楚网页的 Html 结构。 Html 标签用于标记页面元素,相似的元素通常包含在相同的标签内。您希望熟悉 Html 标签模式,哪些标签包含哪些信息,以及找到这些标签的最佳方法。

找到重要标签最简单的方法是使用 Chrome,选择你感兴趣的文本,点击右键,然后“检查”。

Highlight the text of interest, and right-click to ‘Inspect’

这将打开一个包含页面 Html 的单独窗口。我们突出显示的文本在 span 标签中。你可以展开 span 标签,点击span旁边的小三角就可以看到文字。

A segment of each review’s html structure. We are interested in the user review in the span tag.

BeautifulSoup (BS)可以在 span 标签中找到评论,但是在 span 标签中还有其他页面元素是而不是评论。更好的方法是告诉 BS 找到一个特定于评论的外部标签,然后在其中找到一个 span 标签。

如果您滚动页面的 Html,您会注意到每个评论的文本都嵌套在 div 类中。这些类遵循固定的结构,并在页面上的每个评论中重复。

记下 review_content div 类。它包含用户名、评分和评论文本等评论内容。另外,请注意 review_content 中的其他类,因为我们将使用它们来告诉 BS 如何找到评论文本。

3.使用 BS 解析页面。发出 URL 请求,并将响应解析成 BS。

url = '[https://www.metacritic.com/game/switch/pokemon-sword/user-reviews?page=](https://www.metacritic.com/game/switch/pokemon-sword/user-reviews)0'

user_agent = {'User-agent': 'Mozilla/5.0'}
response = requests.get(url, headers = user_agent)

soup = BeautifulSoup(response.text, 'html.parser')

4.创建一个字典来保存你想要抓取的信息。关键字是功能名称,值是列表。

review_dict = {'name':[], 'date':[], 'rating':[], 'review':[]}

5.告诉 BS 如何找到你想要的信息,并将它们添加到字典列表中。我们将讨论如何复习课文。其他元素的代码在这篇文章的底部。

#look for review_content tags since every user review has this tag

for review in soup.find_all('div', class_='review_content'): #within review_content tag, look for the presence of longer reviewsif review.find('span', class_='blurb blurb_expanded'): review_dict['review'].append(review.find('span', class_=’blurb blurb_expanded').text)

else: review_dict[‘review’].append(review.find('div',class_='review_body').find('span').text)

我们使用 find all 来获取页面中所有的 review_content 标签。这与查找页面上的所有评论是一样的,因为每个评论都包含在这个 div 类中。

if-else 语句确保从正确的标记中提取文本,这取决于评论是否很长。

我们先来看‘else’条件。对于每个 review_content 标签,我们寻找一个靠近包含文本评论的 span 标签的 div 类。在本例中,我使用了 review_body div 类。由于这个类中只有一个 span 标签,我们可以使用 find 来查找第一个 span 标签。

关于“如果”的条件。较长的评论(需要用户点击“展开”来查看全文)在一个blurb blurb _ expandedspan 类中。较短的评论没有这个类。由于 blurb blurb_expanded 只出现在较长的评论中,我们可以直接找到它。

因为 Metacritic 上的所有评论都有相同的元素,所以我们可以将所需的信息添加到列表中,它们将是有序的。

6.将字典转换成数据帧。

sword_reviews = pd.DataFrame(review_dict)

呜哇!仅此而已。如果你想收集所有的评论,你只需要遍历所有的页面,就像我在下面的代码中所做的那样:

Web Scraper for Metacritic Game Reviews

在这篇文章中,我们使用 BS 创建了一个简单的 web scraper。我们可以这样做,因为页面没有动态内容。对于动态页面,你可能想尝试使用 Selenium,当与 BS 结合使用时会非常强大。

网络抓取可能很耗时,但它是获取在线内容的一个途径。我个人认为网络抓取对 NPL 项目很有用,因为它可以方便地访问当前的对话,并快速感知情绪,这对营销/传播活动的实时评估很有用。

希望这篇帖子对你有帮助。刮的开心!

使用 Python 和 Raspberry Pi 的网络抓取山区天气预报

原文:https://towardsdatascience.com/web-scraping-mountain-weather-forecasts-using-python-and-a-raspberry-pi-f215fdf82c6b?source=collection_archive---------5-----------------------

@andresvourakis (image on the left), @ilyapavlov (image on the right)

从没有 API 的网站提取数据

动机

在向您介绍这个项目之前,让我告诉您一点它背后的动机。除了数据科学和机器学习,我的另一个爱好是在山里度过时光。计划去任何一座山的旅行都需要很多仔细的计划,以便将风险降到最低。这意味着随着峰会的临近,要密切关注天气状况。在这方面,我最喜欢的网站是Mountain-Forecast.com,它给你提供了世界上几乎任何一座不同海拔高度的山的天气预报。唯一的问题是,它没有提供任何历史数据(据我所知),这些数据有时在确定是去旅行还是等待更好的条件时会很有用。

这个问题在我的脑海里已经有一段时间了,我最终决定做点什么。下面,我将描述我如何使用 Python 和 Beautiful Soup 为 Mountain-Forecast.com 的编写一个 web scraper,并将其放入一个树莓派来收集每天的数据。

如果你想直接跳到代码,那就去查看一下 GitHub 上的资源库。

网页抓取

检查网站

为了找出我需要的目标元素,我从检查页面的源代码开始。这可以通过右击感兴趣的元素并选择检查来轻松完成。这将显示 HTML 代码,从中我们可以看到包含每个字段的元素。

Weather Forecast Table

Inspector for Weather Forecast Table

幸运的是,每座山的预报信息都包含在一个表格中。唯一的问题是每一天都有多个相关联的子列(即 AM、PM 和 night),所以我需要找到一种方法来遍历它们。此外,由于天气预报是在不同的海拔高度提供的,我需要提取它们中每一个的链接,并单独抓取它们。

类似地,我检查了包含美国最高的 100 座山的 URL 的目录。

Highest 100 mountains directory

Inspector for highest 100 mountains directory

这似乎是一个容易得多的任务,因为我从表中需要的只是 URL 和山脉名称,没有特定的顺序。

用美汤解析网页

熟悉了页面的 HTML 结构之后,就该开始了。

我的第一个任务是收集我感兴趣的山脉的 URL。我编写了几个函数来将信息存储在一个字典中,其中是山脉名称,而是与之相关联的所有 URL 的列表(按海拔划分的 URL)。然后我使用pickle模块将字典序列化并保存到一个文件中,以便在需要时可以方便地检索。下面是我为此编写的代码:

我的下一个任务是收集字典中每座山的天气预报。我用requests获取页面内容,用beautifulsoup4解析页面内容。

从代码中可以看出,我手动将每个感兴趣的元素保存到它自己的变量中,而不是遍历它们。这并不漂亮,但我决定这样做,因为我对所有的元素(即天气图和冰冻比例)都不感兴趣,其中有几个元素需要与其他元素不同的处理方式。

保存数据

因为我的目标是每天收集数据,预测每天更新,所以找到一种方法来更新旧的预测,而不是创建副本并追加新的预测,这一点很重要。我使用pandas模块将数据转换成 DataFrame (由行和列组成的二维数据结构),并能够轻松地操作它,然后将其保存为 CSV 文件。下面是代码的样子:

数据收集和操作完成后,我得到了这个表:

在 Raspberry Pi 上运行刮刀

Raspberry Pi 是一款低成本、信用卡大小的计算机,可用于各种项目,如复古游戏仿真、家庭自动化、机器人或网络抓取。在 Raspberry Pi 上运行 scraper 可能是让您的个人台式机或笔记本电脑一直运行,或者投资购买服务器的更好替代方案。

设置它

首先我需要在 Raspberry Pi 上安装一个操作系统,我选择了 Raspbian Stretch Lite ,这是一个基于 Debian 的操作系统,没有图形桌面,只有一个终端。

在安装了 Raspbian Stretch Lite 之后,我使用命令sudo raspi-config打开配置工具并更改密码,展开文件系统,更改主机名并启用 SSH。

最后,我使用sudo apt-get update && sudo apt-get upgrade来确保一切都是最新的,并继续安装运行我的脚本所需的所有依赖项(例如,熊猫、美丽的汤 4 等等)

自动化脚本

为了安排脚本每天运行,我使用了cron,这是一个基于时间的作业调度器,在类似 Unix 的计算机操作系统(即 Ubuntu、Raspbian、macOS 等)中使用。使用以下命令,该脚本计划在每天上午 10:00 运行。

0 10 * * * /usr/bin/python3 /home/pi/scraper.py

这是最终设置的样子:

Raspberry Pi 3 connected to the internet via Ethernet

由于在 Raspberry Pi 上启用了 SSH,我现在可以使用我的个人笔记本电脑或电话通过终端(不需要额外的显示器和键盘)轻松地连接到它,并密切关注 scraper。

我希望你喜欢这篇文章,它启发了你使用 Python 和 Raspberry Pi 编写自己的 Web Scraper。如果你有任何问题或反馈,我很乐意在下面的评论中阅读:)

Python 中的 Web 抓取新闻文章

原文:https://towardsdatascience.com/web-scraping-news-articles-in-python-9dd605799558?source=collection_archive---------1-----------------------

一个端到端的机器学习项目

用 Python 构建 web 抓取应用程序变得简单

Source

本文是我将讲述开发一个机器学习项目的整个过程的系列文章的第二篇。如果你还没有读过第一本书,我强烈建议你读一读这里。

该项目包括创建一个实时网络应用程序,该应用程序从几家报纸收集数据,并显示新闻文章中讨论的不同主题的摘要。

这是通过能够预测给定新闻文章类别的监督机器学习分类模型,从报纸上获取最新新闻的 web 抓取方法,以及向用户显示所获得结果的交互式 web 应用来实现的。

正如我在本系列的第篇文章中解释的那样,撰写这些文章背后的动机是,互联网上发表的许多关于数据科学和机器学习模型的文章或内容、书籍或文献都专注于使用训练数据进行建模的部分。然而,机器学习项目不仅仅是这样:一旦你有了一个训练好的模型,你需要给它输入新的数据,更重要的是,你需要给最终用户提供有用的见解。

整个过程分为三个不同的岗位:

  • 分类模型训练(环节)
  • 新闻文章网络抓取(本帖)
  • 应用创建和部署(链接

github 回购可以在这里找到。它包括所有的代码和一个完整的报告。

在第一篇文章中,我们用 Python 开发了文本分类模型,它允许我们获得某篇新闻文章文本,并以整体良好的准确性预测其类别。

这篇文章涵盖了第二部分:新闻文章网络抓取。我们将创建一个脚本,从不同的报纸中抓取最新的新闻文章并存储文本,这些文本将在以后被输入到模型中以获得其类别的预测。我们将在以下步骤中介绍它:

  1. 网页和 HTML 简介
  2. 用 Python 中的 BeautifulSoup 进行网页抓取

1.网页设计和 HTML 简介

如果我们想要能够从一个网站上提取新闻文章(或者,事实上,任何其他类型的文本),第一步就是要知道一个网站是如何工作的。我们将以走向数据科学网页为例。

当我们将一个 url 插入网络浏览器(即谷歌 Chrome、火狐等……)并访问它时,我们看到的是三种技术的结合:

  1. HTML(超文本标记语言):它是向网站添加内容的标准语言。它允许我们插入文本,图像和其他东西到我们的网站。一句话,HTML 决定了一个网页的内容
  2. CSS(层叠样式表):这种语言允许我们设置网站的视觉设计。这意味着,它决定了一个网页的风格
  3. JavaScript : JavaScript 允许我们将内容和风格交互

注意这三种都是编程语言。它们将允许我们创建和操作网页设计的各个方面。

然而,如果我们希望每个人都能在浏览器中访问一个网站,我们需要知道更多的事情:建立一个 web 服务器,使用某个域,等等。但是因为我们只对从网页中提取内容感兴趣,所以这对于今天来说已经足够了。

让我们用一个例子来说明这些概念。当我们访问数据科学主页时,我们会看到以下内容:

如果我们从网页上删除了 CSS 内容,我们会看到类似这样的内容:

如果我们禁用了 JavaScript ,我们将无法再使用这个弹出窗口:

此时,我会提出以下问题:

“如果我想通过网页抓取来提取网页的内容,我需要在哪里查找?”

如果你的答案是 HTML 代码,那么你就完全明白了。在上面的例子中我们可以看到,禁用 CSS 后,内容(文本、图像等)仍然存在。

所以,在执行网页抓取方法之前的最后一步是理解一点 HTML 语言。

从一个非常基本的角度来看,HTML 是由具有属性的元素组成的。一个元素可以是一个段落,一个属性可以是这个段落是粗体的。

有许多不同类型的元素,每一种都有自己的属性。为了识别一个元素(举例来说,这意味着设置一些文本是标题还是段落),我们使用标签。这些标签用 < > 符号表示(例如,一个 < p > 标签表示某个文本正在充当一个段落)。

例如,下面的 HTML 代码允许我们更改段落的对齐方式:

因此,当我们访问一个网站时,我们将能够在 HTML 代码中找到内容和属性。

一旦我们提出了这些概念,我们就准备好进行网络抓取了!

2.用 Python 中的 BeautifulSoup 进行网页抓取

Python 中有几个包允许我们从网页中抓取信息。其中最常见的就是 BeautifulSoup 。官方的包装信息可以在这里找到。

BeautifulSoup 允许我们解析给定 URL 的 HTML 内容,并通过用标签和属性标识元素来访问它们。为此,我们将使用它从网站中提取某些文本。

这是一个非常容易使用但功能强大的软件包。用几乎 3-5 行代码,我们将能够从互联网上提取任何我们想要的文本。

要安装它,请在您的 Python 发行版中键入以下代码:

! pip install beautifulsoup4

为了给 BeautifulSoup 提供任何页面的 HTML 代码,我们还需要导入requests模块。如果您的 python 发行版中尚未包含它,为了安装它,请键入:

! pip install requests

我们将使用requests模块从页面中获取 HTML 代码,然后使用 BeautifulSoup 包在其中导航。我们将学习使用两个足以完成我们任务的命令:

  • find_all(element tag, attribute):它允许我们从一个介绍标签和属性的网页中定位任何 HTML 元素。该命令将定位相同类型的所有元素。为了只得到第一个,我们可以用find()来代替。
  • get_text():一旦我们找到一个给定的元素,这个命令将允许我们提取里面的文本。

因此,在这一点上,我们需要做的是浏览我们网页的 HTML 代码(例如,在 Google Chrome 中我们需要进入网页,按下右键并转到查看源代码)和定位我们想要抓取的元素。一旦我们看到了源代码,我们可以简单地用 Ctrl+F 或 Cmd+F 进行搜索。

一旦我们确定了感兴趣的元素,我们将requests模块获得 HTML 代码,用模块提取这些元素

我们将以 国家报英文 为例。我们将首先尝试从首页抓取新闻标题,然后从中提取文本。

一旦我们进入网站,我们需要检查 HTML 代码来定位新闻文章。快速浏览后,我们可以看到 frontpage 中的每篇文章都是这样一个元素:

标题是一个带有itemprop=”headline"class=”articulo-titulo"属性的<h2>(标题-2)元素。它有一个包含文本的href属性的<a>元素。因此,为了提取文本,我们需要编写以下命令:

***# importing the necessary packages*** import requests
from bs4 import BeautifulSoup

使用requests模块,我们可以获取 HTML 内容并保存到coverpage变量中:

r1 = requests.get(url)
coverpage = r1.content

接下来,我们需要创建一个 soup 来让 BeautifulSoup 工作:

soup1 = BeautifulSoup(coverpage, 'html5lib')

最后,我们可以找到我们正在寻找的元素:

coverpage_news = soup1.find_all('h2', class_='articulo-titulo')

这将返回一个列表,其中每个元素都是一篇新闻文章(因为使用find_all我们将获得所有出现的内容):

如果我们编写以下命令,我们将能够提取文本:

coverpage_news[4].get_text()

如果我们想要访问一个属性的值(在本例中是链接),我们可以键入以下内容:

coverpage_news[4]['href']

我们会得到纯文本的链接。

如果你已经理解了这一点,你就可以在网上搜集任何你想要的内容。

下一步是用href属性访问每篇新闻文章的内容,再次获取源代码,并在 HTML 代码中找到段落,最终用 BeautifulSoup 获取它们。这与之前的想法相同,但是我们需要定位标识新闻文章内容的标签和属性。

完整过程的代码如下。我将展示代码,但不会像以前一样输入相同的细节,因为这是完全相同的想法。

***# Scraping the first 5 articles***number_of_articles = 5***# Empty lists for content, links and titles*** news_contents = []
list_links = []
list_titles = []

for n in np.arange(0, number_of_articles):

 ***# only news articles (there are also albums and other things)***    if "inenglish" not in coverpage_news[n].find('a')['href']:  
        continue

 ***# Getting the link of the article***    link = coverpage_news[n].find('a')['href']
    list_links.append(link)

 ***# Getting the title***    title = coverpage_news[n].find('a').get_text()
    list_titles.append(title)

 ***# Reading the content (it is divided in paragraphs)***    article = requests.get(link)
    article_content = article.content
    soup_article = BeautifulSoup(article_content, 'html5lib')
    body = soup_article.find_all('div', class_='articulo-cuerpo')
    x = body[0].find_all('p')

 ***# Unifying the paragraphs***    list_paragraphs = []
    for p in np.arange(0, len(x)):
        paragraph = x[p].get_text()
        list_paragraphs.append(paragraph)
        final_article = " ".join(list_paragraphs)

    news_contents.append(final_article)

所有的细节都可以在我的 github repo 中找到。

值得一提的是,该代码仅对该网页 有用,尤其是。如果我们想再刮一个,我们应该期望元素用不同的标签和属性识别。但是一旦我们知道如何识别它们,过程就完全一样了。

此时,我们能够提取不同新闻文章的内容。最后一步是应用我们在第一篇帖子中训练的机器学习模型来预测其类别并向用户显示总结。这将在本系列的最后一篇文章中介绍。

使用 Python 和 Scrapy 在 30 分钟内抓取 10 家在线商店的网页

原文:https://towardsdatascience.com/web-scraping-of-10-online-shops-in-30-minutes-with-python-and-scrapy-a7f66e42446d?source=collection_archive---------7-----------------------

获取启动应用程序项目所需的源数据

Photo by NEW DATA SERVICES on Unsplash

  • 你是一个全栈开发者
  • 你想开发一个奇妙的网络应用程序
  • 你充满动力,全身心地投入到你的项目中

即使您勾选了上面的框,在编写一行代码之前,您仍然需要一个领域相关的数据集。这是因为现代应用程序同时或成批处理大量数据,为用户提供价值。

在这篇文章中,我将解释我生成这样一个数据集的工作流程。你将会看到我是如何在没有任何人工干预的情况下处理许多网站的自动抓取的。

我的目标是为一个价格比较 WebApp 生成一个数据集。我将使用的产品类别是手提袋。对于这样的应用程序,应该每天从不同的在线卖家那里收集手袋的产品和价格信息。虽然有些卖家提供了一个 API 供你访问所需的信息,但并不是所有的卖家都遵循同样的途径。所以,web 报废是不可避免的!

在整个例子中,我将使用 PythonScrapy 为 10 个不同的卖家生成网络蜘蛛。然后,我将使用 Apache Airflow 自动执行这个过程,这样就不需要人工干预来定期执行整个过程。

源代码和现场演示 Web 应用程序

你可以在我的 GitHub 资源库中找到所有相关的源代码。你也可以访问实时网络应用,它使用了这个网络废弃项目提供的数据。

Photo by Waldemar Brandt on Unsplash

我的网页抓取工作流程

在开始任何网页抓取项目之前,我们必须定义哪些网站将被纳入该项目。我决定覆盖土耳其手提袋类的 10 个访问量最大的网上商店。你可以在我的 GitHub 库中看到它们。

步骤 1:安装 Scrapy 并设置项目文件夹

你必须将 Scrapy 安装到你的电脑中,并在创建 Scrapy 蜘蛛之前生成一个 Scrapy 项目。请看看下面的帖子了解更多信息。

[## 为深度学习加油:通过网络抓取创建自定义数据集

使用 Scrapy 和 Python 创建深度学习数据集。

towardsdatascience.com](/fuel-up-the-deep-learning-custom-dataset-creation-with-web-scraping-ba0f44414cf7)

**#install the scrapy**
$ pip install scrapy**#install the image for downloading the product images**
$ pip install image**#start web scraping project with scraps**
$ scrapy startproject **fashionWebScraping**
$ cd **fashionWebScraping**
$ ls**#create project folders which are explained below**
$ mkdir csvFiles
$ mkdir images_scraped
$ mkdir jsonFiles
$ mkdir utilityScripts

项目文件夹和文件

The folder structure of the project

我在本地计算机上创建了一个文件夹结构,将项目文件整齐地放入不同的文件夹中。

【CSV files】文件夹包含每个网站抓取的 CSV 文件。蜘蛛将从这些 CSV 文件中读取“起始 URL”来启动抓取,因为我不想在蜘蛛中硬编码它们。

‘fashion web scraping’文件夹包含了 Scrapy 蜘蛛和助手脚本,如‘settings . py’‘item . py’‘pipelines . py’。我们必须修改一些零碎的助手脚本来成功地执行抓取过程。

刮下的产品图片将保存在‘images _ scraped’文件夹中。

在抓取网页的过程中,所有的产品信息,如价格、名称、产品链接和图片链接都将存储在‘JSON files’文件夹中的 JSON 文件中。

将有实用程序脚本来执行一些任务,如:

  • 'deldub.py' 检测并删除报废结束后 JSON 文件中重复的产品信息。
  • 'jsonPrep.py' 是另一个实用程序脚本,用于在报废结束后检测并删除 JSON 文件中的空行项目。
  • 'deleteFiles.py' 删除前一次报废时生成的所有 JSON 文件。
  • ' JSON tos . py '通过读取 JSON 文件,在远程位置填充 ElasticSearch 集群。这是提供实时全文搜索体验所必需的。
  • 'sitemap_gen.py' 用于生成涵盖所有产品链接的站点地图。

步骤 2:了解特定网站的 URL 结构,并填充 CSV 文件以启动 URL

创建项目文件夹后,下一步是用我们想要抓取的每个网站的起始 URL 填充 CSV 文件。

几乎每个电子商务网站都提供分页功能,让用户浏览产品列表。每次导航到下一页时,URL 中的 page 参数都会增加。请参见下面的示例 URL,其中使用了“page”参数。

[https://www.derimod.com.tr/kadin-canta-aksesuar/?page=1](https://www.derimod.com.tr/kadin-canta-aksesuar/?p=1)

我将使用{}占位符,这样我们可以通过增加“page”的值来迭代 URL。我还将使用 CSV 文件中的“性别”列来定义特定 URL 的性别类别。

因此,最终的 CSV 文件将如下所示:

同样的原则也适用于项目中的其他网站。你可以在我的 GitHub 库中找到填充的 CSV 文件。

步骤 3:修改“项目. py”和“设置. py”

要开始抓取,我们必须修改“items.py”来定义用于存储抓取数据的“item objects”。

为了定义通用的输出数据格式,Scrapy 提供了[***Item***](https://docs.scrapy.org/en/latest/topics/items.html#scrapy.item.Item)类。[***Item***](https://docs.scrapy.org/en/latest/topics/items.html#scrapy.item.Item)对象是用来收集抓取数据的简单容器。它们提供了一个类似于字典的 API,用一种方便的语法来声明它们的可用字段。

【scrapy.org】出自

***#items.py in fashionWebScraping folder**
import scrapy
from scrapy.item import Item, Fieldclass FashionwebscrapingItem(scrapy.Item):

 **#product related items, such as id,name,price**
 gender=Field()
 productId=Field()
 productName=Field()
 priceOriginal=Field()
 priceSale=Field()**#items to store links**
 imageLink = Field()
 productLink=Field()**#item for company name**
 company = Field()passclass ImgData(Item):**#image pipline items to download product images**
 image_urls=scrapy.Field()
 images=scrapy.Field()*

然后我们要修改‘settings . py’。这是定制图像管道和蜘蛛行为所必需的。

Scrapy 设置允许你定制所有 Scrapy 组件的行为,包括核心、扩展、管道和蜘蛛本身。

出自【scrapy.org】

****# settings.py in fashionWebScraping folder
# Scrapy settings for fashionWebScraping project****# For simplicity, this file contains only settings considered important or commonly used. You can find more settings consulting the documentation:****#** [**https://doc.scrapy.org/en/latest/topics/settings.html**](https://doc.scrapy.org/en/latest/topics/settings.html) **#** [**https://doc.scrapy.org/en/latest/topics/downloader-middleware.html**](https://doc.scrapy.org/en/latest/topics/downloader-middleware.html) **#** [**https://doc.scrapy.org/en/latest/topics/spider-middleware.html**](https://doc.scrapy.org/en/latest/topics/spider-middleware.html)BOT_NAME = 'fashionWebScraping'
SPIDER_MODULES = ['fashionWebScraping.spiders']
NEWSPIDER_MODULE = 'fashionWebScraping.spiders'**# Crawl responsibly by identifying yourself (and your website) on the user-agent**
USER_AGENT = 'fashionWebScraping'**# Obey robots.txt rules**
ROBOTSTXT_OBEY = True**# See** [**https://doc.scrapy.org/en/latest/topics/settings.html**](https://doc.scrapy.org/en/latest/topics/settings.html) **# download-delay
# See also autothrottle settings and docs
# This to avoid hitting servers too hard** DOWNLOAD_DELAY = 1**# Override the default request headers:** DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'tr',
}**# Configure item pipelines
# See** [**https://doc.scrapy.org/en/latest/topics/item-pipeline.html**](https://doc.scrapy.org/en/latest/topics/item-pipeline.html)ITEM_PIPELINES = {'scrapy.pipelines.images.ImagesPipeline': 1}IMAGES_STORE = '/Users/erdemisbilen/Angular/fashionWebScraping/images_scraped'**

“item.py”和“settings.py”对我们项目中的所有蜘蛛都有效。

Photo by Nguyen Bui on Unsplash

第四步:构建蜘蛛

Scrapy spider是定义如何抓取某个站点(或一组站点)的类,包括如何执行抓取(即跟随链接)以及如何从页面中提取结构化数据(即抓取项目)。换句话说,蜘蛛是为特定站点(或者,在某些情况下,一组站点)定义抓取和解析页面的自定义行为的地方。

出自scrapy.org

****fashionWebScraping $** scrapy genspider fashionBOYNER boyner.com
*Created spider ‘fashionBOYNER’ using template ‘basic’ in module:
fashionWebScraping.spiders.fashionBOYNER***

上面的 shell 命令创建了一个空的蜘蛛文件。让我们将代码写入我们的fashion boyner . py文件:

****# 'fashionBOYNER.py' in fashionWebScraping/Spiders folder****# import scrapy and scrapy items**
import scrapy
from fashionWebScraping.items import FashionwebscrapingItem
from fashionWebScraping.items import ImgData
from scrapy.http import Request**# To read from a csv file**
import csvclass FashionboynerSpider(scrapy.Spider):
 name = 'fashionBOYNER'
 allowed_domains = ['BOYNER.com']
 start_urls = ['http://BOYNER.com/']**# This function helps us to scrape the whole content of the website
 # by following the starting URLs in a csv file.**def start_requests(self):**# Read main category URLs from a csv file**with open ("/Users/erdemisbilen/Angular/fashionWebScraping/
  csvFiles/SpiderMainCategoryLinksBOYNER.csv", "rU") as f:

    reader=csv.DictReader(f)for row in reader:
      url=row['url']**# Change the page value incrementally to navigate through
      the product list
      # You can play with the range value according to maximum  
      product quantity, 30 pages to scrape as default**
      link_urls = [url.format(i) for i in range(1,30)]for link_url in link_urls:
        print(link_url)**# Pass the each link containing products to 
        parse_ product_pages function with the gender metadata**request=Request(link_url, callback=self.parse_product_pages,
        meta={'gender': row['gender']})yield request**# This function scrapes the page with the help of xpath provided**
 def parse_product_pages(self,response):

  item=FashionwebscrapingItem()

 **# Get the HTML block where all the products are listed
  # <div> HTML element with the "product-list-item" class name**content=response.xpath('//div[starts-with(@class,"product-list-
  item")]')**# loop through the each <div> element in the content**
  for product_content in content:image_urls = []**# get the product details and populate the items**
   item['productId']=product_content.xpath('.//a/@data
   -id').extract_first()item['productName']=product_content.xpath('.//img/@title').
   extract_first()item['priceSale']=product_content.xpath('.//ins[@class=
   "price-payable"]/text()').extract_first()item['priceOriginal']=product_content.xpath('.//del[@class=
   "price-psfx"]/text()').extract_first()if item['priceOriginal']==None:
    item['priceOriginal']=item['priceSale']item['imageLink']=product_content.xpath('.//img/
   @data-original').extract_first()

   item['productLink']="https://www.boyner.com.tr"+
   product_content.xpath('.//a/@href').extract_first()image_urls.append(item['imageLink'])item['company']="BOYNER"
   item['gender']=response.meta['gender']if item['productId']==None:
    breakyield (item)**# download the image contained in image_urls**
   yield ImgData(image_urls=image_urls)def parse(self, response):
  pass**

我们的蜘蛛类包含两个函数,分别是' start_requests 和' parse_product_pages '。

在' start_requests '函数中,我们从已经生成的特定 CSV 文件中读取,以获得起始 URL 信息。然后我们迭代占位符{}来将产品页面的 URL 传递给‘parse _ product _ pages’函数。

我们还可以使用“meta={'gender': row['gender']} '参数将“gender”元数据传递给“Request”方法中的“parse_product_pages”函数。

在' parse_product_pages '函数中,我们执行实际的 web 抓取,并用抓取的数据填充 Scrapy 条目。

我使用 Xpath 来定位网页上包含产品信息的 HTML 部分。

下面的第一个 Xpath 表达式从被废弃的当前页面中提取整个产品列表。所有必需的产品信息都包含在“content”的“div”元素中。

****#  // Selects nodes in the document from the current node that matches the selection no matter where they are****# '//div[starts-with(@class,"product-list-item")]' selects the all div elements which has class value start**content = response.xpath('//div[starts-with(@class,"product-list-item")]')**

我们需要在“内容”中循环访问各个产品,并将它们存储在 Scrapy 项目中。借助 XPath 表达式,我们可以很容易地在“内容”中找到所需的 HTML 元素。

****# loop through the each <div> element in the content**
  for product_content in content:image_urls = []**# get the product details and populate the items

   # ('.//a/@data-id') extracts 'data-id' value of <a> element
   inside the product_content** item['productId']=product_content.xpath('.//a/@data
   -id').extract_first()**# ('.//img/@title') extracts 'title' value of <img> element
   inside the product_content**   
   item['productName']=product_content.xpath('.//img/@title').
   extract_first()**# ('.//ins[@class= "price-payable"]/text()') extracts text value
   of <ins> element which has 'price-payable' class attribute inside
   the product_content **  
   item['priceSale']=product_content.xpath('.//ins[@class=
   "price-payable"]/text()').extract_first()**# ('.//del[@class="price-psfx"]/text()') extracts text value
   of <del> element which has 'price-psfx' class attribute inside
   the product_content**
   item['priceOriginal']=product_content.xpath('.//del[@class=
   "price-psfx"]/text()').extract_first()if item['priceOriginal']==None:
     item['priceOriginal']=item['priceSale']**# ('.//img/@data-original') extracts 'data-original' value of
   <img> element inside the product_content**
   item['imageLink']=product_content.xpath('.//img/
   @data-original').extract_first()**# ('.//a/@href') extracts 'href' value of
   <a> element inside the product_content
**   item['productLink']="https://www.boyner.com.tr"+
   product_content.xpath('.//a/@href').extract_first()**# assigns the product image link into the 'image_urls' which is
   defined in the image pipeline**
   image_urls.append(item['imageLink'])item['company']="BOYNER"
   item['gender']=response.meta['gender']if item['productId']==None:
    breakyield (item)

   **# download the image contained in image_urls**
   yield ImgData(image_urls=image_urls)**

同样的原则也适用于其他网站。你可以在我的 GitHub 库里看到所有 10 个蜘蛛的代码。

Photo by Tim Mossholder on Unsplash

第五步:运行蜘蛛并将抓取的数据存储在 JSON 文件中

在抓取过程中,每个产品项目都存储在一个 JSON 文件中。每个网站都有一个特定的 JSON 文件,其中填充了每次蜘蛛运行的数据。

****fashionWebScraping $** scrapy crawl -o rawdata_BOYNER.json -t jsonlines fashionBOYNER**

使用 jsonlines 格式比 JSON 格式更节省内存,尤其是当你在一个会话中抓取大量网页时。

请注意,JSON 文件名以“rawdata”开头,这表示下一步是在我们的应用程序中使用废弃的原始数据之前检查和验证它们。

步骤 6:清理和验证 JSON 文件中的抓取数据

在废弃过程结束后,在应用程序中使用它们之前,您可能需要从 JSON 文件中删除一些行项目。

您可能有包含空字段或重复值的行项目。这两种情况都需要一个我用 'jsonPrep.py''deldub.py '处理的修正过程。

'jsonPrep.py' 查找具有空值的行项目,并在检测到时删除它们。您可以在下面找到带有解释的代码:

**# **‘jsonPrep.py’ in fashionWebScraping/utilityScripts folder**
import json
import sys
from collections import OrderedDict
import csv
import os**# Reads from jsonFiles.csv file for the names and locations of all json files need to be validated** 
with open("/Users/erdemisbilen/Angular/fashionWebScraping/csvFiles/ jsonFiles.csv", "rU") as f:reader=csv.DictReader(f)**# Iterates the json files listed in jsonFiles.csv**
 for row in reader:

 ** # Reads from jsonFiles.csv file for jsonFile_raw column**
  jsonFile=row['jsonFile_raw']**# Opens the jsonFile**
   with open(jsonFile) as json_file:
    data = []
    i = 0seen = OrderedDict()

    **# Iterates in the rows of json file**
    for d in json_file:
     seen = json.loads(d)**# Do not include the line item if the product Id is null
**     try:
      if seen["productId"] != None:
       for key, value in seen.items():
        print("ok")
        i = i + 1
        data.append(json.loads(d))

     except KeyError:
      print("nok")

    print (i)

    baseFileName=os.path.splitext(jsonFile)[0]**# Write the result as a json file by reading filename from the
    'file_name_prep' column** with open('/Users/erdemisbilen/Angular/fashionWebScraping/
    jsonFiles/'+row['file_name_prep'], 'w') as out:json.dump(data, out)**

删除空行项目后,结果将保存到“jsonFiles”项目文件夹中,文件名以“prepdata”开头。

'deldub.py' 查找重复的行项目,并在检测到时删除它们。您可以在下面找到带有解释的代码:

****# 'deldub.py' in fashionWebScraping/utilityScripts folder**
import json
import sys
from collections import OrderedDict
import csv
import os**# Reads from jsonFiles.csv file for the names and locations of all json files need to be validated for dublicate lines**with open("/Users/erdemisbilen/Angular/fashionWebScraping/csvFiles/ jsonFiles.csv", newline=None) as f:

 reader=csv.DictReader(f)**# Iterates the json files listed in jsonFiles.csv**
 for row in reader:**# Reads from jsonFiles.csv file for jsonFile_raw column**
  jsonFile=row['jsonFile_prep']**# Opens the jsonFile**
  with open(jsonFile) as json_file:
   data = json.load(json_file)seen = OrderedDict()
   dubs = OrderedDict()**# Iterates in the rows of json file**
   for d in data:
    oid = d["productId"]**# Don't include the item if the product Id has dublicate value**
    if oid not in seen:
     seen[oid] = delse:
     dubs[oid]=dbaseFileName=os.path.splitext(jsonFile)[0]**# Write the result as a json file by reading filename from the
     'file_name_final' column**with open('/Users/erdemisbilen/Angular/fashionWebScraping/
     jsonFiles/'+row['file_name_final'], 'w') as out:
      json.dump(list(seen.values()), out)with open('/Users/erdemisbilen/Angular/fashionWebScraping/
     jsonFiles/'+'DELETED'+row['file_name_final'], 'w') as out:
      json.dump(list(dubs.values()), out)**

删除重复的行项目后,将结果保存到“jsonFiles”项目文件夹中,文件名以“finaldata”开头。

Photo by James Pond on Unsplash

使用 Apache Airflow 自动执行完整的刮擦工作流程

一旦我们定义了刮擦过程,我们就可以进入工作流自动化。我将使用 Apache Airflow,它是由 Airbnb 开发的基于 Python 的工作流自动化工具。

我将提供安装和配置 Apache Airflow 的终端命令,你可以参考我下面的帖子了解更多细节。

** [## 我的深度学习之旅:从实验到生产

用 Apache Airflow 构建自动化机器学习管道

medium.com](https://medium.com/swlh/my-deep-learning-journey-from-experimentation-to-production-844cb271a476)

$ python3 --version
Python 3.7.3$ virtualenv --version
15.2.0$ cd /path/to/my/airflow/workspace$ virtualenv -p `which python3` venv
$ source venv/bin/activate(venv) $ pip install apache-airflow
(venv) $ mkdir airflow_home
(venv) $ export AIRFLOW_HOME=`pwd`/airflow_home
(venv) $ airflow initdb
(venv) $ airflow webserver

创建 DAG 文件

在 Airflow 中,一个*DAG*——或者一个有向无环图——是你想要运行的所有任务的集合,以反映它们的关系和依赖性的方式组织。

例如,一个简单的 DAG 可以包含三个任务:A、B 和 C。它可以说 A 必须在 B 可以运行之前成功运行,但是 C 可以随时运行。它可以说任务 A 在 5 分钟后超时,B 在失败的情况下最多可以重启 5 次。它还可能会说工作流将在每晚 10 点运行,但不应该在某个特定日期开始。

在 Python 文件中定义的 DAG 用于组织任务流。我们不会在 DAG 文件中定义实际的任务。

让我们创建一个 DAG 文件夹和一个空的 python 文件,开始用 Python 代码定义我们的工作流。

(venv) $ mkdir dags

Airflow 提供了几个运算符来描述 DAG 文件中的任务。下面我列出了常用的。

[***BashOperator***](http://airflow.apache.org/_api/airflow/operators/bash_operator/index.html#airflow.operators.bash_operator.BashOperator) -执行一个 bash 命令

[***PythonOperator***](http://airflow.apache.org/_api/airflow/operators/python_operator/index.html#airflow.operators.python_operator.PythonOperator) -调用任意的 Python 函数

[***EmailOperator***](http://airflow.apache.org/_api/airflow/operators/email_operator/index.html#airflow.operators.email_operator.EmailOperator)——发邮件

[***SimpleHttpOperator***](http://airflow.apache.org/_api/airflow/operators/http_operator/index.html#airflow.operators.http_operator.SimpleHttpOperator)——发送一个 HTTP 请求

***Sensor*** -等待一定时间,文件,数据库行,S3 键等…

我打算现在只使用‘bash operator’,因为我将使用 python 脚本完成我的所有任务。

由于我将使用‘bash operator’,有一个包含特定任务的所有命令的 bash 脚本来简化 dag 文件会很好。

通过遵循本教程,我为每个任务生成了 bash 脚本。你可以在我的 Github 库中找到它们。

然后,我可以使用我创建的 bash 命令编写如下所示的 DAG 文件。有了下面的配置,我的任务将被安排和执行每天的基础上气流。您可以根据需要在 DAG 文件中更改开始日期或计划间隔。您可以进一步使用本地执行器或 celery 执行器来并行运行任务实例。由于我使用的是顺序执行器,这是最原始的执行器,所以我的所有任务实例都将顺序工作。

**# 'fashionsearch_dag.py' in Airflow dag folder**
import datetime as dt
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedeltadefault_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime(2019, 11, 23),
'retries': 1,
'retry_delay': timedelta(minutes=5),# 'queue': 'bash_queue',
# 'pool': 'backfill',
# 'priority_weight': 10,
# 'end_date': datetime(2016, 1, 1),
}dag = DAG(dag_id='fashionsearch_dag', default_args=default_args, schedule_interval=timedelta(days=1))**# This task deletes all json files which are generated in previous scraping sessions**
t1 = BashOperator(
task_id='delete_json_files',
bash_command='run_delete_files',
dag=dag)**# This task runs the spider for** [**www.boyner.com**](http://www.boyner.com) **# And populates the related json file with data scraped**
t2 = BashOperator(
task_id='boyner_spider',
bash_command='run_boyner_spider',
dag=dag)**# This task runs the spider for** [**www.derimod.com**](http://www.derimod.com) **# And populates the related json file with data scraped**
t3 = BashOperator(
task_id='derimod_spider',
bash_command='run_derimod_spider',
dag=dag)**# This task runs the spider for** [**www.hepsiburada.com**](http://www.hepsiburada.com) **# And populates the related json file with data scraped**
t4 = BashOperator(
task_id='hepsiburada_spider',
bash_command='run_hepsiburada_spider',
dag=dag)**# This task runs the spider for** [**www.hm.com**](http://www.hm.com) **# And populates the related json file with data scraped**
t5 = BashOperator(
task_id='hm_spider',
bash_command='run_hm_spider',
dag=dag)**# This task runs the spider for** [**www.koton.com**](http://www.koton.com) **# And populates the related json file with data scraped**
t6 = BashOperator(
task_id='koton_spider',
bash_command='run_koton_spider',
dag=dag)**# This task runs the spider for** [**www.lcwaikiki.com**](http://www.lcwaikiki.com) **# And populates the related json file with data scraped**
t7 = BashOperator(
task_id='lcwaikiki_spider',
bash_command='run_lcwaikiki_spider',
dag=dag)**# This task runs the spider for** [**www.matmazel.com**](http://www.matmazel.com) **# And populates the related json file with data scraped**
t8 = BashOperator(
task_id='matmazel_spider',
bash_command='run_matmazel_spider',
dag=dag)**# This task runs the spider for** [**www.modanisa.com**](http://www.modanisa.com) **# And populates the related json file with data scraped**
t9 = BashOperator(
task_id='modanisa_spider',
bash_command='run_modanisa_spider',
dag=dag)**# This task runs the spider for** [**www.morhipo.com**](http://www.morhipo.com) **# And populates the related json file with data scraped**
t10 = BashOperator(
task_id='morhipo_spider',
bash_command='run_morhipo_spider',
dag=dag)**# This task runs the spider for** [**www.mudo.com**](http://www.mudo.com) **# And populates the related json file with data scraped**
t11 = BashOperator(
task_id='mudo_spider',
bash_command='run_mudo_spider',
dag=dag)**# This task runs the spider for** [**www.trendyol.com**](http://www.trendyol.com) **# And populates the related json file with data scraped**
t12 = BashOperator(
task_id='trendyol_spider',
bash_command='run_trendyol_spider',
dag=dag)**# This task runs the spider for** [**www.yargici.com**](http://www.yargici.com) **# And populates the related json file with data scraped**
t13 = BashOperator(
task_id='yargici_spider',
bash_command='run_yargici_spider',
dag=dag)**# This task checks and removes null line items in json files**
t14 = BashOperator(
task_id='prep_jsons',
bash_command='run_prep_jsons',
dag=dag)**# This task checks and removes dublicate line items in json files**
t15 = BashOperator(
task_id='delete_dublicate_lines',
bash_command='run_del_dub_lines',
dag=dag)**# This task populates the remote ES clusters with the data inside the JSON files**
t16 = BashOperator(
task_id='json_to_elasticsearch',
bash_command='run_json_to_es',
dag=dag)**# With sequential executer, all tasks depends on previous task
# No paralell task execution is possible
# Use local executer at least for paralell task execution**t1 >> t2 >> t3 >> t4 >> t5 >> t6 >> t7 >> t8 >> t9 >> t10 >> t11 >> t12 >> t13 >> t14 >> t15 >> t16

要启动 DAG 工作流,我们需要运行气流调度程序。这将使用‘air flow . CFG’文件中指定的配置执行调度程序。Scheduler 监控位于“dags”文件夹中的每个 DAG 中的每个任务,并在满足依赖关系时触发任务的执行。

(venv) $ airflow scheduler

一旦我们运行了气流调度程序,我们就可以通过在浏览器上访问http://0 . 0 . 0:8080来查看我们的任务状态。Airflow 提供了一个用户界面,我们可以在其中查看和跟踪我们计划的 Dag。

AirFlow Dag Graph View

AirFlow Dag Tree View

结论

我试着从头到尾向你展示我的网页抓取工作流程。

希望这能帮助你掌握 web 报废和工作流自动化的基础知识。

查看我的新文章,了解我如何使用 Web scrapping 和自然语言处理来自动创建电子学习内容:

[## 如何自动化电子学习平台的内容创建流程

在 5 分钟内生成 2000 个问题

towardsdatascience.com](/how-to-automate-content-creation-process-for-e-learning-platform-852877fcd668)**

使用 Python 在 5 分钟内学会网络抓取

原文:https://towardsdatascience.com/web-scraping-using-python-4cb2faade338?source=collection_archive---------2-----------------------

Figure 1: Image Source- The Data School

什么是网页抓取?

网页抓取是从网页中获取或提取想要的信息。

使用 BeautifulSoup 刮擦

对于网络抓取,我们将使用非常流行的 Python 库BeautifulSoup。对于网络抓取,你首先需要有一些关于 HTML 标签的基本知识。HTML 中使用的一些标签如下所示。

有关 HTML 标签的更多信息,请参考https://www.w3schools.com/tags/。

入门指南

要开始使用 scraping,请确保您的系统上安装了 Python(第 3 版)和 BeautifulSoup。如果您没有安装 BeautifulSoup,那么只需在终端/命令提示符下键入以下命令-

pipinstallbeautifulsoup4

我们刮吧!

检查

抓取的第一步是选择你想要抓取数据的网站并检查它。在本教程中,我们将尝试从BBC上发表的这篇文章中搜集信息。

要检查网站,请右键单击页面上的任意位置,然后选择“检查元素”/“查看页面源代码”。要查看网页上特定实体(如文本或图像)的位置,请选择网页上的该部分,然后右键单击并选择“检查元素”/“查看页面源代码”。

Figure 2: Webpage to be scraped

检查完网页后,会弹出一个窗口,显示所选内容在网页 HTML 代码中的确切位置,如下所示。

Figure 3: HTML code of the webpage

因为我们的目标是提取文章的全部内容,所以记下包含文章全部文本的标签<div>是很重要的。现在让我们仔细看看网页,并识别出<div>标签。

Figure 4: HTML code showing the required tags

正如我们所看到的,<div class=”story-body sp-story-body gel-body-copy”>是我们正在寻找的标签。现在,我们已经得到了我们所需要的一切,所以让我们直接进入代码并做一些整理吧!

从语法上分析

现在我们可以开始解析网页,并使用BeautifulSoup搜索我们需要的特定元素。为了连接到网站并获取 HTML,我们将使用 Python 的urllib。让我们导入所需的库-

from urllib.request import urlopen
from bs4 import BeautifulSoup

获取网址-

url = "[https://www.bbc.com/sport/football/46897172](https://www.bbc.com/sport/football/46897172)"

连接到网站-

# We use try-except incase the request was unsuccessful because of 
# wrong URL
try:
   page = urlopen(url)
except:
   print("Error opening the URL")

创建一个 BeautifulSoup 对象用于解析-

soup = BeautifulSoup(page, 'html.parser')

提取所需的元素

我们现在使用 BeautifulSoup 的soup.find()方法来搜索包含我们感兴趣的文章文本的标签<div class=”story-body sp-story-body gel-body-copy”>

content = soup.find('div', {"class": "story-body sp-story-body gel-      body-copy"})

我们现在遍历content来找到其中所有的<p>(段落)标签,从而得到文章的整个正文。

article = ''
for i in content.findAll('p'):
    article = article + ' ' +  i.text

保存解析的文本

我们可以将搜集到的信息保存在.txt.csv文件中。

with open('scraped_text.txt', 'w') as file:
    file.write(article)

整个代码-

输出-

 Cristiano Ronaldo’s header was enough for Juventus to beat AC Milan and claim a record eighth Supercoppa Italiana in a game played in Jeddah, Saudi Arabia. The Portugal forward nodded in Miralem Pjanic’s lofted pass in the second half to settle a meeting between Italian football’s two most successful clubs. It was Ronaldo’s 16th goal of the season for the Serie A leaders. Patrick Cutrone hit the crossbar for Milan, who had Ivorian midfielder Franck Kessie sent off. Gonzalo Higuain, reportedly the subject of interest from Chelsea, was introduced as a substitute by Milan boss Gennaro Gattuso in Italy’s version of the Community Shield. But the 31-year-old Argentina forward, who is currently on loan from Juventus, was unable to deliver an equalising goal for the Rossoneri, who were beaten 4–0 by Juve in the Coppa Italia final in May.

结论

当您想要从多个来源收集数据以进行分析或研究时,Web 抓取非常有用。

BeautifulSoup 是一个优秀的网页抓取库,可用于小型项目,但对于大型项目,其他库如 Scrapy 更适合。

希望你已经理解了网页抓取的概念,现在可以根据你的需要从不同的网站抓取数据。

感谢阅读。刮的开心!😊

使用 Python 进行 Web 抓取:一步一步的指南

原文:https://towardsdatascience.com/web-scraping-using-python-a-step-by-step-guide-36ca0fb87074?source=collection_archive---------15-----------------------

Photoed by Heidi Sandstrom on Unsplash

从网站提取数据的需求正在增加。当我们进行与数据相关的项目时,如价格监控、商业分析或新闻聚合,我们总是需要记录来自网站的数据。但是,一行一行的复制粘贴数据已经过时了。在这篇文章中,我们将教你如何成为从网站中提取数据的“内部人员”,也就是用 python 做网络搜集。

第 0 步:介绍

Web 抓取是一种技术,可以帮助我们将 HTML 非结构化数据转换为电子表格或数据库中的结构化数据。除了使用 python 编写代码,使用 API 或数据提取工具如 Octoparse 访问网站数据也是网络抓取的其他选择。

对于一些大型网站,如 Airbnb 或 Twitter,他们会为开发者提供 API 来访问他们的数据。API 代表应用程序编程接口,是两个应用程序相互通信的通道。对于大多数人来说,API 是从网站获取数据的最佳途径。

但是,大多数网站没有 API 服务。有时候即使他们提供了 API,你得到的数据也不是你想要的。因此,编写 python 脚本来构建网络爬虫成为另一种强大而灵活的解决方案。

那么为什么要用 python 而不是其他语言呢?

  • 灵活性:众所周知,网站更新很快。不仅仅是内容,网站结构也会经常变化。Python 是一种易于使用的语言,因为它可以动态输入并且非常高效。因此,人们可以很容易地改变他们的代码,并跟上网络更新的速度。
  • 强大 : Python 拥有大量成熟的库。例如,请求,beautifulsoup4 可以帮助我们从网页中获取 URL 和信息。Selenium 通过赋予网络爬虫模仿人类浏览行为的能力,可以帮助我们避免一些反抓取技术。此外,re、numpy 和 pandas 可以帮助我们清理和处理数据。

现在让我们开始使用 Python 进行 web 抓取的旅程吧!

第一步:导入 Python 库

在本教程中,我们将向你展示如何从 Yelp 上抓取评论。我们将使用两个库:bs4 中的 BeautifulSoup 和 urllib 中的 request 。这两个库通常用于用 Python 构建网络爬虫。第一步是用 Python 导入这两个库,这样我们就可以使用这些库中的函数。

第二步:从网页中提取 HTML】

我们需要从"https://www . yelp . com/biz/milk-and-cream-麦片-酒吧-纽约?osq =冰淇淋+奶油”。首先,让我们将 URL 保存在一个名为 URL 的变量中。然后我们可以访问该网页上的内容,并通过使用请求中的 urlopen() 函数将 HTML 保存在“ourUrl”中。

然后我们应用漂亮的汤来解析页面。

现在我们有了“汤”,这是这个网站的原始 HTML,我们可以使用一个名为pretify()的函数来清理原始数据并打印出来,以查看“汤”中 HTML 的嵌套结构。

第三步:定位并抓取评论

接下来,我们应该找到这个网页上的 HTML 评论,提取并存储它们。对于网页中的每个元素,它们总是有一个唯一的 HTML“ID”。为了检查他们的 ID,我们需要在网页上检查他们。

点击“Inspect element”(或“Inspect”,取决于不同的浏览器),我们可以看到评论的 HTML。

在这种情况下,评论位于名为“p”的标签下。所以我们将首先使用名为 find_all()的函数来查找这些评论的父节点。然后在循环中定位父节点下带有标签“p”的所有元素。找到所有“p”元素后,我们将它们存储在一个名为“review”的空列表中。

现在我们从那个页面得到所有的评论。看看我们提取了多少评论。

第四步:清理评论

你一定注意到了,还有一些无用的文本,比如每次复习开始时的“ < p lang='en' > ”、复习中间的“</>”、每次复习结束时的“ < /p > ”。


代表单行符。我们不需要任何评论换行,所以我们需要删除它们。另外," < p lang='en' > "和" < /p > "是 HTML 的开头和结尾,我们也需要删除它们。

最后,我们用不到 20 行代码成功地获得了所有干净的评论。

这只是一个从 Yelp 收集 20 条评论的演示。但在现实情况下,我们可能需要面对很多其他情况。例如,我们将需要分页等步骤,以转到其他页面,并提取该商店的其余评论。或者,我们还需要收集其他信息,如审核者姓名、审核者位置、审核时间、评分、签到……

为了实现上面的操作并获得更多的数据,我们需要学习更多的函数和库,比如 selenium 或正则表达式。花更多的时间研究网络抓取的挑战是很有趣的。

原载于 2019 年 8 月 28 日【https://www.octoparse.com】

使用 Python 库的 Web 抓取。

原文:https://towardsdatascience.com/web-scraping-using-python-libraries-fe3037152ed1?source=collection_archive---------8-----------------------

让我们使用 Python 从 web 中抓取数据。

Photo by Sai Kiran Anagani on Unsplash

今天我们将清理“评价我的教授的网站。关于我的教授网站的一点见解,这是一个包含学校,教授和大学评级的网站。你可以搜索任何教授或学校,并在参加他们的课程之前获得他们的评级。这是一个方便的功能,有助于更多地了解你的教授或你想加入的大学。在本教程中,我们将看到如何刮取和提取一个特定的教授的标签。我警告你们,这并不违法,但是从网站上收集大量数据会导致你的 IP 地址被封。只做一次或两次,但不要愚蠢地将它放在循环中,并试图将请求放在循环中。

Rate My Professor.

什么是网页抓取?

Web 抓取(也称为抓取、数据提取、数据收集等。)是一种用于从网站提取数据的技术。有时,网络抓取非常有用,我们可以直接从网络上获得我们想要的数据,但有时这是一种不好的方法,因为这就像是未经允许从网站上窃取宝贵的数据,但将你的抓取过程限制在一次或两次,这样可以避免你陷入麻烦。

网页抓取所需的最有用的库是:

  1. 美汤。
  2. 请求。

这些是我们将在本教程中遵循的步骤:

  1. 导入所需的库。
  2. 获取 URL 并将其存储在变量中。
  3. 使用请求库向网站发出请求。
  4. 使用美汤库从网站获取 HTML(原始)数据。
  5. 使用 soup.findAll 方法获得我们正在寻找的受尊重的标签。
  6. 移除所有的 HTML 标签并将其转换为纯文本格式。

你可能想知道要提取什么标签,在 Rate My Professor 网站上,每个教授都会有他/她尊敬的标签,如(滑稽、繁重的家庭作业、努力学习或失败等。我们将尝试在这些教程中添加这些标签,如下所示。

在我们开始之前,请确保以较慢的速度收集数据,您也可以使用 VPN 服务来获得不同的 IP 地址,这可以防止您的 IP 地址被禁止,但我希望你们能够按照说明进行操作。这里有一篇 文章 会让你知道如何抓取一个网站而不被列入黑名单。本教程中重要的一点是,我没有必要解释每一行代码,这里也不需要,因为 python 代码是不言自明的。不过,我会尽量不把你弄糊涂,用一种简单的方式把事情说清楚。所以我写了这个教程,这样每个人都可以理解,不管他们的编程背景如何。此外,完整的源代码可以在我的 GitHub 中找到。互联网上可能有很多教程,但这个教程很容易理解,因为我已经尽可能地解释了代码,有些部分是一个机械的过程,你只需要遵循它们,如果你有任何疑问,请在下面的评论部分告诉我。完整的源代码可以在下面给出的我的 GitHub 上找到。

[## 塔努-北帕布/Python

这个存储库帮助您从头开始理解 python。-塔努-北帕布/蟒蛇

github.com](https://github.com/Tanu-N-Prabhu/Python/blob/master/Data Scraping from the Web/Web_Scraping_Rate_My_Professor_Website.ipynb)

让我们开始吧。

1.导入所需的库

让我们导入几个重要的库,比如 Requests 和 BeautifulSoup 。

import requests
from bs4 import BeautifulSoup

2.获取 URL 并将其存储在一个变量中。

让我们将教授的 URL 存储在名为“ url ”的变量中。网站的网址可以在这里找到:“ 评我的教授 ”。

url = ‘[https://www.ratemyprofessors.com/ShowRatings.jsp?tid=1986099'](https://www.ratemyprofessors.com/ShowRatings.jsp?tid=1986099')

3.使用请求库向网站发出请求。

这里我们通过传递“ url ”作为参数来使用请求库,注意不要多次运行。如果你得到像响应 200 那么它是成功的,如果你得到别的东西,那么可能是代码或你的浏览器有问题,我不知道。

page = requests.get(url)
page**<Response [200]>**

4.使用漂亮的汤库从网站获取 HTML(原始)数据。

这里我们通过将 page.text 作为参数传递并使用 HTML 解析器来使用 BeautifulSoup。您可以尝试打印这个汤,但是打印这个汤并不能给你答案,相反它包含了大量的 HTML 数据,所以我决定不在这里展示它。

soup = BeautifulSoup(page.text, “html.parser”)

5.使用 soup.findAll 方法获得我们正在寻找的受尊重的标签。

这里是您添加您正在寻找的标签的地方,要获得标签名称,您所要做的就是在相应的标签上右键单击或在网页中的标签上单击 Ctrl-Shift-I ,然后一个带有所选标签的页面将在您的右侧为您打开,如下所示:

Press Inspect or Ctrl-Shift-I on the respected tag (in this case it’s Hilarious)

然后,您可以复制 HTML 标签和类(如果有的话),然后将它放在 soup.findAll 方法中。在这种情况下,HTML 标记是“ span ”,类是“tag-box-choose tags”

proftags = soup.findAll(“span”, {“class”: “tag-box-choosetags” })
proftags**[<span class=”tag-box-choosetags”> Hilarious <b>(11)</b></span>, <span class=”tag-box-choosetags”> Caring <b>(9)</b></span>, 
<span class=”tag-box-choosetags”> Accessible outside class <b>(8)</b></span>, 
<span class=”tag-box-choosetags”> Amazing lectures <b>(5)</b></span>, 
<span class=”tag-box-choosetags”> Clear grading criteria <b>(4)</b></span>, 
<span class=”tag-box-choosetags”> Inspirational <b>(4)</b></span>, <span class=”tag-box-choosetags”> Group projects <b>(3)</b></span>, <span class=”tag-box-choosetags”> Respected <b>(3)</b></span>, 
<span class=”tag-box-choosetags”> Gives good feedback <b>(2)</b></span>, 
<span class=”tag-box-choosetags”> EXTRA CREDIT <b>(2)</b></span>, <span class=”tag-box-choosetags”> Participation matters <b>(1)</b></span>, 
<span class=”tag-box-choosetags”> Lecture heavy <b>(1)</b></span>, <span class=”tag-box-choosetags”> Test heavy <b>(1)</b></span>, <span class=”tag-box-choosetags”> So many papers <b>(1)</b></span>]**

6.删除所有的 HTML 标签并将其转换为纯文本格式。

这里我们移除所有的 HTML 标签,并将其转换为文本格式,这可以通过放置在 for 循环中的 get_text 方法来完成。这将 HTML 转换成文本格式。

for mytag in proftags:
  print(mytag.get_text())**Hilarious (11)  
Caring (9)  
Accessible outside class (8)  
Amazing lectures (5)  
Clear grading criteria (4)  
Inspirational (4)  
Group projects (3)  
Respected (3)  
Gives good feedback (2)  
EXTRA CREDIT (2)  
Participation matters (1)  
Lecture heavy (1)  
Test heavy (1)  
So many papers (1)**

因此,我们得到了上述信息,我们正在寻找。我们拿到了教授的所有标签。这就是我们如何通过使用请求和漂亮的汤库从互联网上收集数据。坦率地说,这是我教授“数据科学”的教授。他是整个大学最好的教授之一。我喜欢他的教学和他的风格。

感谢你们花时间阅读我的教程,敬请期待更多更新。请在下面的评论区告诉我你对这个教程的看法。此外,如果你对代码有任何疑问,评论区都是你的。祝你有愉快的一天。

用漂亮的汤来刮网页——一个使用案例

原文:https://towardsdatascience.com/web-scraping-with-beautiful-soup-a-use-case-fc1c60c8005d?source=collection_archive---------8-----------------------

在这篇文章中,我将简要介绍从网页中获取数据的方法,即网页抓取、使用 Python 和库(如请求)来获取数据并解析数据。当一个网站没有一个 API,或者没有一个符合你需求的 API 时,网络抓取就变得必要了。

作为一个例子,我使用了一个具有一致 HTML 结构的网页,但是这种方法是可以推广的。虽然有一些框架,如 Scrapy,可以提供这样的服务,但我决定把它作为一次学习经历。

使用案例

一个非营利组织希望与全国各地的加拿大社区基金会(CFC) 站点建立联系。他们让我找到每个联系人和他们的邮寄地址,并将所有信息以特殊格式放入电子表格中。

通过将每个必填字段复制粘贴到电子表格中来手动完成这项任务,意味着要做 195 次(基础)* 11 次(字段)= 2145 次!所以我的下一个想法是通过抓取 CFC 网站来自动化这个过程。

幸运的是,所有的 CFC 信息都以一种简单明了的模式包含在他们的网站上。

什么是网页抓取?

根据 Ryan Mitchell 的书Web Scraping with Python(O ' Reilly),它是通过 API 以外的任何方式收集数据的实践。人们可以编写一个程序来查询 web 服务器,请求和检索数据,解析数据以提取信息,并存储数据以供以后分析。

检查页面!

web 抓取的第一步是深入查看您要抓取的页面,您需要在您选择的 web 浏览器的开发者菜单中打开“显示/查看页面源代码”。正如米切尔所说,如果你能在浏览器中看到它,你就能通过 Python 脚本访问它。并且,如果你可以访问它,你可以将它存储在数据库中,以便检索分析

在浏览 CFC 网页时,几乎没有什么东西是相关的。CFC 网站的省份包含在

HTML 标题中,而基金会的链接和名称在

标题中。此外,链接包括文本' cfc_locations ',,这将有助于将它们与任何其他链接区分开来。

CFC Website

Source View

这些链接中的每一个怎么样?我们来考察一个:

整齐地打包,具有一致的 HTML 结构,信息来自一个

容器。地址在一个段落中,该段落的 CSS 类包括关键字' location ',联系人的姓名和职务在' meta-line contact '类中。虽然这里没有包括该省,但可以从上一页获得。

查询服务器、请求和检索数据

对于这些任务,我选择使用 请求:HTTP for Humans 库:

session = requests.Session()

但是,这将发送以下标头,

>>> session.headers['User-Agent']
'python-requests/2.19.1'

我们基本上是在告诉他们的网站,有人在用 Python 抓取他们的网站。一些网站实际上会阻止这类请求。一般来说,人们希望自己的外表和行为尽可能人性化。实现这一点的一种方法是更改随请求一起发送的标头。

如果你想知道你的浏览器正在发送什么标题,你可以看看https://www . whatismybrowser . com/detect/what-http-headers-is-my-browser-sending。在我的例子中,我将标题改为

my_headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS
          X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko)
          Chrome/71.0.3578.98 Safari/537.36", 
          "Accept":"text/html,application/xhtml+xml,application/xml;
          q=0.9,image/webp,image/apng,*/*;q=0.8"}

另一件重要的事情是检查网站的 robots.txt 文件,确保你没有违反他们的政策。该文件指示网站的哪些区域不应该被所有或某些用户代理处理或扫描。在我们的例子中,robots.txt 只禁止抓取 /wp-admin/。

下一步是用请求库检索信息,

url = '[https://communityfoundations.ca/find-a-community-foundation/'](https://communityfoundations.ca/find-a-community-foundation/')
response = session.get(url, headers=my_headers)

网页中包含的所有内容现在都在响应对象中。

美味的汤

解析我们刚刚获得的信息怎么样?这就是美汤 ( BS4 )库的用武之地。BS4 是一个 Python 库,用于解析 HTML 和 XML 文档——即使是标记格式错误或设计不良的页面。它提供了导航、搜索和修改解析树的简单方法。所以让我们来做一个汤吧!

html_soup = BeautifulSoup(response.text, 'html.parser')

我们现在可以导航和搜索 html_soup。为此,BS4 有一些非常有用的函数,其中包括函数 find_all(),在这个函数中可以使用正则表达式和 lambda 函数。还可以引用属性来访问搜索结果,例如。名字和。文本:

container = html_soup.find_all(["h2", "h3"], 
                               class_=lambda x: x != 'hidden')for lines in container:
    if lines.name == 'h2': 
        province = lines.text
        print('In', province, "\n")
    if lines.name == 'h3':
        foundation = lines.text
        print('Foundation name:', foundation)   
        print('Foundation url:', lines.find_all("a", 
            href=re.compile("cfc_locations"))[0].get('href'), "\n")

下一步是查询和检索基金会的每个 URL 的数据。我们必须记住两件事。第一,我们只需要查询服务器一次,因为数据将被存储在本地。第二,我们需要有礼貌,我们不想让服务器过载,因为请求会破坏它或者超时。这就是 time.sleep()函数出现的地方。在本例中,我在请求之间增加了 10 秒。

subresponse = []for lines in container:
    if lines.name == 'h3': 
        url_fou = lines.find_all("a",
                  href=re.compile("cfc_locations"))[0].get('href')
        subresponse.append(session.get(url_fou, 
                                       headers=my_headers))
        time.sleep(10)

我们现在可以用 BS4 解析数据,并继续提取其余的信息,例如地址,在 CFC 格式的情况下,可以使用正则表达式按文本中包含的竖线将其拆分。

html_subsoup = []for counter in range(1, len(subresponse)):
     html_subsoup.append(BeautifulSoup(subresponse[counter].text, 
                                      'html.parser'))
     c_location = html_subsoup[counter].find_all('p', 
                                      class_='meta-line location')
     address_array = re.split(r' \| ', c_location[0].text)
     print(address_array)

同样,我们从这个人的名字、头衔等开始。

性别化

这里使用的另一个 Python 库是 Genderize 作为标题前缀的联系人姓名也是必需的(先生或女士)。这个库是 Genderize.io web 服务的一个客户端,它的 API 是免费的,但限制在每天 1000 个姓名。所以不应该用它来调试代码!

Genderize 将返回给定名称的“男性”或“女性”,因此我创建了一个字典来返回前缀。

>>> genderDict = {"male": 'Mr.',
                  "female": 'Ms.'}
>>> gen = Genderize().get(['John'])[0]['gender']
>>> print(genderDict.get(gen, "None"))Mr.

熊猫

在处理完所有数据后(完整代码可以在这里找到),最后一步是将信息写入一个pandasdata frame,并写入一个 CSV 文件。

df = pd.DataFrame({'Organization': organization,
                   'Title': gender_title,
                   'Addressee': person,
                   'Addressee Job Title': person_title,
                   'Civic Address 1 (Street Address)': street,
                   'Civic Address 2 (PO Box)': pobox,
                   'Municipality': municipality,
                   'Province or Territory': provinces, 
                   'Postal Code': postalCode,
                   'Phone': phone,
                   'Website': org_url
                   })cols = ['Organization', 'Title', {add in here the others}]df.to_csv('data/cfcMailingAddresses.csv', encoding='utf-8',
          index=False, columns=cols)

最终产品

以下是 CSV 文件的快照:

虽然还有改进的余地,例如在 genderize 数据库中找不到的名字,或者用 m .或 Mme 称呼魁北克人,但该脚本满足了其一般用途。可以通过添加断言和抛出异常来进一步细化代码。

那拉提

作为这次学习经历的一部分,我决定尝试两个自然语言处理(NLP)库, NLTKspaCy 来解析地址。这是结果。

NLTK 没有为地址给出正确的标签。大多数标记都被识别为名词,包括一个像班夫这样的地方。

def preprocess_without_stopwords(sent):
    sent = nltk.word_tokenize(sent)
    sent = [word for word in sent if word not in en_stop]
    sent = nltk.pos_tag(sent)
    return sentpreprocessed_address = preprocess_without_stopwords(address_test)

spaCy 也没有给出地址的正确标签。虽然它比 NLTK 更好地将班夫大道识别为一个地方,但班夫被识别为一个人。

addr = nlp(address_test)
sentences = [x for x in addr.sents]
displacy.render(nlp(str(sentences[0])), jupyter=True, style='ent')

训练地理数据模型本身可能是另一个非常有趣的项目!

GitHub 上的全 jupyter 笔记本:https://github.com/brodriguezmilla/WebScrapingCFCBS4

使用 Python 进行 Web 抓取—从头到尾

原文:https://towardsdatascience.com/web-scraping-with-python-a-to-copy-z-277a445d64c7?source=collection_archive---------0-----------------------

处理美丽的声音,避免阻塞,用 API 丰富,存储在数据库中并可视化数据

作者 沙伊阿尔达孜 & 艾坦葛苏托—2019 年 2 月

Photo by michael podger on Unsplash

介绍

  • 浏览网页并提取选定文本或图像的行为。
  • 获取新数据或丰富当前数据的优秀工具。
  • 通常是需要大量数据的数据科学项目的第一步。
  • API 的另一种选择是数据检索。也就是说,如果你没有 API 或者它在某些方面受到限制。

例如:

通过用最新的新闻故事丰富最新的股票价格来跟踪和预测股票市场的价格。这些新闻故事可能无法从 API 中获得,因此需要从新闻网站中获取。这是通过浏览网页并提取感兴趣的文本(或图像)来完成的。

背景

我们的网络抓取项目是 ITC(以色列技术挑战赛)的数据科学研究员计划的一部分,该计划旨在让我们了解数据科学家面临的现实问题,并提高我们的编码技能。

在本帖中,我们展示了我们前进道路上的主要步骤和挑战。我们已经包含了代码片段和关于如何为 web 抓取创建端到端管道的建议。为了简单起见,我们这里展示的代码片段不是 OOP(面向对象编程),但是我们强烈建议在您的 web scraper 实现中编写 OOP 代码。

我们使用的主要工具:

  • Python (3.5)
  • beautiful soup库,用于处理从网页源代码(HTML 和 CSS)中提取文本
  • 请求 库用于处理与网页的交互(使用 HTTP 请求)
  • MySQL 数据库——用于存储我们的数据( mysql.connector 是 Python 的 MySQL API)
  • API 调用——丰富我们的数据
  • 代理标头轮换—生成随机标头并获得免费代理 IP,以避免 IP 阻塞

工作流程

Web scraping timeline

网站

在这个项目中,我们可以自由选择任何网站。其他人选择的网站从电子商务到新闻网站,展示了网络抓取的不同应用。

我们选择了一个科学文章的网站,因为我们认为这将是有趣的,看看我们可以获得什么样的数据,以及我们可以从这些数据中收集到什么样的见解。

我们选择保持网站匿名。无论如何,这篇文章的目标是概述如何为任何感兴趣的网站建立一个管道。

刮刮刮刮

美丽的声音

首先,你必须检查网站,以确定你想收集哪些数据。它包括对网站结构的基本理解,这样你的代码就可以抓取你想要的数据。

为了检查网站的结构,打开网页的检查器,右击页面→点击“检查元素”。

Inspect element of a web page

然后,找到您想要抓取的数据并单击它。检查器面板中高亮显示的部分显示感兴趣的网页部分的底层 HTML 文本。Beautifulsoup 将使用元素的 CSS 类从 html 中提取数据。

在下面的截图中,你可以看到“关键词”部分是需要刮除的。使用检查器,可以定位“keywords”部分的 HTML 元素及其 CSS 类。

Getting the exact location of keywords

其结构如下:

div(class = " keywords-section ")→div(class = " keyword ")。

使用 beautiful soup,获取所有关键字的代码如下:

Code snippet — getting all keywords out of an article

从这里开始,几乎是一样的。找到所需的部分,检查 HTML 元素并获取数据。beautifulsoup 的完整文档和更多示例可以在这里找到(非常友好)。

抓取过程在短时间内涉及许多 HTTP GET 请求,因为在许多情况下,人们可能需要在多个页面之间自动导航,以便获取数据。此外,拥有一个令人敬畏的 scraper 不仅仅是为了得到你想要的数据,也是为了获得新的数据或频繁更新现有数据——这可能会导致被网站屏蔽。这让我们进入下一部分:

如何避开街区?

一般来说,网站不喜欢机器人抓取工具,但他们可能不会完全阻止它,因为搜索引擎机器人抓取网站,以便对它们进行分类。有一个机器人排除标准,它定义了网站的条款和条件,通常可以在网站的 robots.txt 文件中找到。比如维基百科的 robots.txt 文件可以在这里找到:【https://en.wikipedia.org/robots.txt】

维基百科 robots.txt 的前几行:

*# robots.txt for [http://www.wikipedia.org/](http://www.wikipedia.org/) and friends
#
# Please note: There are a lot of pages on this site, and there are
# some misbehaved spiders out there that go _way_ too fast. If you're
# irresponsible, your access to the site may be blocked.*

如你所见,维基百科的限制并不太严格。但是有些网站非常严格,不允许抓取网站的部分或者全部。他们的 robots.txt 会包括这个:

*User-agent: *
Disallow: /*

怎么处理积木?

一种方法是在向网站发出请求时通过不同的代理和用户代理(头)进行轮换。此外,考虑你向网站发出请求的频率以避免成为“垃圾邮件发送者”也很重要。

注意——这只是出于学习目的。我们不鼓励你违反任何网站的条款。

下面是如何通过几个简单的步骤实现这个方法。

代理池

用 Python 可以很容易地实现一个代理服务器。免费代理列表可以在这里找到(注意,免费代理通常没有付费代理稳定,速度也慢。如果你觉得免费的服务不够好,可以考虑付费服务)。

查看免费代理列表,可以使用 BeautifulSoup 来获取 IP 地址和端口。上述网站的结构如下所示。

Table of free proxies

以下函数检索所有代理的 IP 和端口,并返回它们的列表:

A function to get a proxies IPs and ports

集管池

在 Python 中使用 requests 包时,有许多 HTTP 头可以作为请求的一部分传递。我们传递了两个头元素(对我们来说已经足够了),即接受头(用户权限)和用户代理(伪浏览器)。

伪随机头池创建如下(参见下面的代码):

  • 创建一个“accepts”的字典对象,其中每个 accept 头都与一个特定的浏览器相关(取决于用户代理)。可以在这里找到接受报头的列表。该列表包含每个用户代理的默认值,并且可以更改。
  • 使用 Python 中的假用户代理包获得一个随机用户代理。如下面的代码所示,这非常容易使用。我们建议预先创建一个用户代理列表,以防假用户代理不可用。一个用户代理的例子:‘Mozilla/5.0(Windows NT 6.2;rv:21.0)壁虎/20130326 火狐/21.0'**
  • 接受用户代理作为键和相应的值创建一个字典对象

部分代码(下面附录中的全部功能):

使用标头和代理池

下面的代码展示了一个如何使用我们之前写的函数的例子。为了简单起见,我们没有包括 OOP 代码。参见附录了解 random_header()的完整功能。

Pools creation and usage

在此之前,我们简要介绍了网络抓取,并讨论了如何避免被网站屏蔽的更高级的技术。

在下一节中,我们将展示如何使用 API 调用来丰富数据的两个示例: Genderize.io 和 Aylien 文本分析。

使用 API 进行数据丰富

性别化

Genderize 使用个人的名字来预测他们的性别(限于男性和女性)。

该 API 的输出被构造为 JSON,如下例所示:

{ "姓名":"彼得","性别":"男性","概率":" 0.99 ","计数":796}

这使得用每个人的性别来丰富作者数据变得非常方便。由于包含了预测性别的概率,因此可以设置一个阈值来确保更高质量的预测(我们将阈值设置为 60% —参见下面的代码片段)。这个 API 带来的价值是能够确定特定主题作者的性别分布。

我们不必担心 API 限制(1000 次呼叫/天),因为我们每天只能收集大约 120 篇文章,这意味着平均每天不到 500 个作者。如果一个人能够超过这个每日限额,则必须考虑 API 限额。避免这个每日限制的一个方法是检查被评估的第一个名字是否已经在我们的数据库中被丰富。这将允许我们在不浪费 API 调用的情况下根据现有数据确定性别。

给渴望技术的人一些代码片段:

连接性别化:

作者性别丰富:

艾利安文本分析

我们对特定主题的关键词随时间的增长很感兴趣(想想 Google Trends ),因此决定我们应该用更多的关键词来丰富我们的数据。为此,我们使用了一个名为 Aylien Text Analysis 的 API,特别是概念提取 API。这个 API 允许用户输入文本,文本经过处理后输出使用 NLP 从文本中提取的关键字列表。我们为每篇文章收集的不同字段中有两个是标题和摘要,这些字段被连接起来用作 API 的输入。下面是 JSON 输出的一个例子:

*{
 “text”:”Apple was founded by Steve Jobs, Steve Wozniak and Ronald Wayne.”,
 “language”:”en”,
 “concepts”:{
 “http://dbpedia.org/resource/Apple_Inc.":{
 “surfaceForms”:[
 {
 “string”:”Apple”,
 “score”:0.9994597361117074,
 “offset”:0
 }
 ],
 “types”:[
 “http://www.wikidata.org/entity/Q43229”,
 “http://schema.org/Organization",
 “http://dbpedia.org/ontology/Organisation",
 “http://dbpedia.org/ontology/Company"
 ],
 “support”:10626
 }
 }
}*

为了避免重复的关键字,我们检查了数据库的关键字表中不存在该关键字。为了避免在每篇文章中添加太多的关键词,制定了两种方法。第一个是简单的关键字限制,如下面的代码片段所示。另一种方法利用输出文件中每个关键词的得分(相关性概率)——这允许用户设置一个阈值(我们使用 80%),以确保为每篇文章添加最相关的关键词。

下图展示了 API 的工作原理:

下面是我们用来连接 Aylien Text API 服务的代码片段:

连接到 aylien:

使用 Aylien API 丰富关键字:

让我们进入最后一部分。到目前为止,我们已经介绍了 web 抓取和如何避免被阻塞,以及如何使用 API 调用来丰富数据。在这篇文章的最后一部分,我们将介绍如何建立一个数据库来存储数据,以及如何访问这些数据进行可视化。可视化是一个强大的工具,可以用来从数据中提取洞察力。

存储数据— MySQL 数据库

为网络抓取项目(或其他一般项目)建立数据库时,应考虑以下因素:

  • 表格创建
  • 新数据插入
  • 数据更新(每小时/每天…)

表格创建

管道的这一阶段应该小心进行,并且应该验证所选择的结构(就列类型、长度、键等而言。)适用于数据,可以处理极端情况(缺失数据、非英文字符等)。).避免依赖网站使用的 id 作为主键/唯一键,除非你有非常好的理由(在我们的例子中,一篇文章的 doi_link 是一个在任何地方都可以接受的唯一字符串,所以我们使用它作为一篇文章的唯一标识符)。

使用 mysql.connector 包创建表格的示例:

SQL 命令:

建立数据库的功能:

Tables creation

注意—在第 12、17、23 和 25 行中,我们使用了 logger 对象。这是为了记录到一个外部日志文件,它非常重要。建议创建一个日志类,你可以在这篇文章的下面看到更多,或者点击这里。

数据插入

插入新数据与更新现有数据略有不同。当新数据插入数据库时,应该确保没有重复。此外,在出现错误的情况下,应该捕捉它,记录它并保存导致该错误的数据部分以供将来检查。

如下所示,我们再次使用 mysql.connector 的光标来执行 SQL insert 命令。

Data insertion

数据更新

动态数据需要频繁更新。应该定义两次更新之间的时间增量(差异),这取决于数据类型和源。在我们的项目中,我们必须考虑到所有文章的引用数量必须定期更新。以下代码演示了更新过程:

Data update

形象化

为了帮助理解收集的数据,可以使用可视化来提供易于理解的数据概述。

我们创建的可视化使我们能够深入了解以下用例:

  • 高级趋势
  • 确定特定主题中的主要机构/国家
  • 确定特定主题中的顶尖研究人员
  • 上述用例支持数据驱动的方法,适用于:R&D 投资、咨询、普通合伙企业

redash——可视化的开源工具

为了探索上述用例,我们创建了数据的可视化。我们通过使用一个简单但功能强大的开源工具 Redash 做到了这一点,该工具连接到我们的 AWS 机器(也可以使用其他类型的实例)。

为了设置 Redash,请执行以下操作:

  • 点击以下链接:https://redash.io/help/open-source/setup#aws
  • 选择相关的 AWS 实例,以便在您的机器上创建 Redash 映像。

在继续之前,这里有一个我们为主题神经网络收集的数据的概述。****

如您所见,检索到的数据并不多——这是因为我们在 AWS (Amazon Web Services)机器上可用的时间有限。由于缺乏足够的数据,读者应该半信半疑地评估结果——在这个阶段,这只是一个概念证明,绝不是一个成品。

解决上述使用案例—高级趋势:

对于高水平趋势,我们简单地绘制了过去 5 年每月发表的研究论文数量。

*****SELECT publication_date, count(id) AS num 
FROM articles 
GROUP BY publication_date 
ORDER BY publication_date;*****

性别分布

这种可视化利用来自 genderize 的丰富的作者数据来查看特定主题中作者的性别分布。如下图所示,由于 genderize API 的限制,有很大一部分作者的性别是未知的。

*****SELECT gender, count(ID) 
FROM authors 
GROUP BY gender;*****

确定该领域的领先国家

当收集每个作者的从属关系时,我们能够提取每个作者的国家,允许我们创建下面的可视化。由于中国对人工智能的浓厚兴趣,中国如预期的那样发表了主题为“神经网络”的大多数研究论文。这些信息可能会引起政策制定者的兴趣,因为人们可以跟踪领先国家的人工智能进展。首先,监测这些领先国家以寻找合作机会,从而在这两个国家推进人工智能是有帮助的。其次,政策制定者可以利用这些见解来效仿领先国家,在自己的国家内推进人工智能。

Leading countries in the field of Neural Networks

*****SELECT country, count(affiliation_id) AS counter
FROM affiliations 
GROUP BY country 
ORDER BY counter DESC;*****

确定该领域的顶级主要作者

作为确定顶级研究人员的第一种方法,我们决定将主要作者与其名字相关的引用次数进行比较。

Number of citations for each author

*****SELECT CONCAT(authors.first_name,” “, authors.last_name) AS name, SUM(articles.citations) AS num_citations 
FROM authors JOIN authors_article_junction JOIN articles
WHERE authors_article_junction.author_ID = authors.ID AND articles.ID = authors_article_junction.article_ID 
 AND authors_article_junction.importance = 1 
GROUP BY authors.ID 
ORDER BY num_citations DESC 
LIMIT 10;*****

关键词图

单词越大,在数据库中出现的频率就越高

Keywords map

*****SELECT keywords.keyword_name, COUNT(keywords_ID) AS num 
FROM keyword_article_junction JOIN keywords 
WHERE keyword_article_junction.keywords_ID = keywords.ID 
GROUP BY keywords.keyword_name 
ORDER BY num DESC 
LIMIT 20;*****

Redash 中我们仪表板的快照

Redash dashboard

结论

我们已经完成了 Python A-Z 系列的 Web 抓取。在第一部分中,我们简要介绍了网络抓取,并谈到了如何避免被网站屏蔽的更先进的技术。此外,我们还展示了如何使用 API 调用来丰富数据,以提取进一步的见解。最后,我们展示了如何创建一个数据库来存储从 web 抓取中获得的数据,以及如何使用开源工具 Redash 来可视化这些数据。

附录

未来笔记

  • 考虑使用 grequests 来并行化 get 请求。这可以通过执行以下操作来实现:

由于免费代理的速度有限,这可能不会像应该的那样有效,但仍然值得一试。

  • 使用 Selenium 处理 Javascript 元素。

完整函数—随机 _ 头

创建随机标题的完整功能如下:

注意 —在第 22 行,我们将一条消息保存到一个日志文件中。在你的代码中有日志是非常重要的!我们建议使用简单易用的日志包。

记录流量

我们构建并在代码中到处使用的 logger 类:

Logger class and example of how to use it

Linux 及更高版本的 Web 服务器

原文:https://towardsdatascience.com/web-servers-in-linux-and-beyond-1241ca557a4f?source=collection_archive---------22-----------------------

Web 服务器似乎是一个难以理解和令人困惑的话题,尤其是当它与像 Linux 这样的外来操作系统结合在一起时。除了最初的复杂性之外,web 开发的世界总是在变化的,你一年(或一个月)学到的东西。)下一次可能不再有效。此外,没有一种特定的 web 服务器技术,初学者可能会发现很难置身于不同的阵营和框架中。然而在实践中,web 服务器的理论和应用是简单和用户友好的。在这篇文章中,我将介绍什么是 web 服务器,以及它们在 web 开发中的不同应用。

Photo by Kelvin Ang on Unsplash

web 服务器是将文件从一台计算机传输到另一台计算机的工具。文件要去的地方被称为客户端,(通常是个人电脑上的浏览器),而服务器本身也是一台电脑,尽管它没有屏幕或传统的 GUI。虽然我们大多数外行人认为计算机与我们用它们做什么有关,但计算机有它们自己看不见的重要功能,例如服务器。服务器的工作是托管网站,客户端(您)可以请求和访问这些网站。总之,web 服务器监听来自客户机的请求,并向它们返回数据,通常是一个文件。

Web 服务器托管网站,网站只是文件的集合,(尽管文件的扩展名类型很奇怪,如。html,。css,还有。js)。当您想要访问一个网站时,您键入它的 URL 或统一资源定位符,您的计算机就连接到托管它的服务器。这种对服务器上文件的请求称为 HTTP 请求,代表超文本传输协议。如果服务器找不到该文件,将返回 404 响应。需要记住的一件重要事情是,一个网页的不同组件可能位于不同的服务器上;例如,网页上的广告可能来自一个服务器,而图像和视频可能来自另一个⁴.

如上所述,不存在放之四海而皆准的 web 服务器系统,但是有各种围绕特定技术的框架,称为软件包。其中一个框架是围绕 Apache(世界上使用最广泛的 web 服务器软件)和另外两个经常与 Apache 一起使用的工具(PHP 和 MySQL)构建的。PHP 是一种服务器端脚本语言,对于设计网站非常重要,而 MySQL 是一种存储在线 data⁶.的流行数据库这三个工具与上面提到的 Linux、Windows 和 Mac 操作系统相结合,分别形成 LAMPstack、WAMPstack 和 MAMPstack。虽然它们可以在所有的操作系统上工作,但它们的安装简易性各不相同。Apache 预装在许多 Linux 发行版(或 distros)⁵和 Mac OS-X)上。Windows 也可以运行 Apache web 服务器,但是安装它的过程更加 complicated⁷.化虽然 Lamp 和 Wampstack 一直是 web 开发的主流软件包,但是最近出现了一些以 JavaScript 为中心的替代软件,我将在下面介绍。

JavaScript 长期以来被认为只是一种客户端语言,但近年来它已经成为自己的 web 服务器软件包的基础,被称为 MEANstack⁸.MEANstack 的组件是 MongoDB,一个非关系数据库程序,它使用类似 JSON 的 objects⁹,Express,一个后端 web 应用程序框架,Angular,一个前端 web 应用程序框架,以及 Node.js,一个用于开发基于 JavaScript 的应用程序的软件。MEANstack 的一个好处是它在整个应用程序中只使用一种语言,不像 Lampstack 必须在多种语言⁰.之间切换 MEANstack 为传统的基于 LAMPstack 的 web 服务器提供了一种替代方案,但是这两种技术都有可能在未来的 web 开发中扮演重要的角色。

网络服务器是现代互联网的主干,它让我们能够跨越遥远的距离获得新的想法和信息。虽然 web 服务器的术语和使用可能会令人困惑,但该领域技术的快速变化是令人放心的,因为这意味着其他人可能也和您一样困惑!随着这项技术的不断变化和进步,要保持与时俱进所需要的就是学习和掌握谷歌。只有这两种技能,你会发现自己在未来的几年里都在设计网站。

  1. https://www . lifewire . com/servers-in-computer-networking-817380
  2. 【https://www.sitepoint.com/how-to-install-apache-on-windows/ 号
  3. 【https://likegeeks.com/linux-web-server/
  4. https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview
  5. https://www.wpbeginner.com/glossary/apache/
  6. http://www . linuxandubuntu . com/home/how-to-setup-a-web-server-and-host-website-on-your-own-Linux-computer
  7. http://www.wampserver.com/en/
  8. http://mean.io/
  9. https://dzone.com/articles/comparing-mongodb-amp-mysql
  10. https://www.codingdojo.com/what-is-the-mean-stack

网络流量预测

原文:https://towardsdatascience.com/web-traffic-forecasting-f6152ca240cb?source=collection_archive---------7-----------------------

使用谷歌 DeepMind 的 Wavenets

合写 Apoorva Reddy Addvalliat Indra Bandi

动机:时间序列作为统计学和机器学习中的一个重要概念,往往很少被我们这样的数据爱好者所探索。为了改变这种趋势,我们决定解决当今时代最紧迫的时间序列问题之一,“预测网络流量”

这个博客反映了我们在网络流量时间序列预测中的头脑风暴,这也是一个由 Kaggle 主办的比赛。我们相信这种预测可以帮助网站服务器有效地处理停机。我们实现的技术可以扩展到金融市场、天气预报、音频和视频处理中的各种应用。不仅如此,了解你的网站的流量轨迹也可以打开商机!

一、数据集

数据集由 145k 个时间序列组成,代表不同维基百科文章的每日页面浏览量,从 2015 年 7 月 1 日开始,到 2017 年 9 月 10 日结束(804 个数据点)。目标是预测数据集中每篇文章在 2017 年 9 月 13 日到 2017 年 11 月 13 日之间的日浏览量(64 个数据点)。

Fig 1. Trends for websites in the dataset

二。接近

从过去的模式中学习来预测未来可以通过以下方式实现:

  1. 传统移动平均线,基于 ARIMA 的技术
  2. 递归神经网络——长短期记忆(LSTM),门控递归单元(GRU)
  3. 波网

波网的日益流行和我们对利用神经网络进行预测的兴趣使我们选择了波网。“谷歌深度思维”是 Wavenets ( 目前用于谷歌的人工智能服务,云文本到语音)背后的策划者,这进一步激发了我们的兴趣。

我们的研究还表明,Wavenets 的性能与 RNNs 相当或更好。这里有一篇文章的链接,这篇文章讲述了 Wavenets 如何捕捉 LSTMs 之类的长期依赖关系,但对于训练来说更快、更轻量。

潜得更深!

为了获得直观的理解,让我们首先关注波网的复杂性,并理解为什么它们似乎适合我们的任务。

波网的神奇之处在于“因果膨胀卷积”逻辑,该逻辑提高了神经网络的效率,以捕捉时间流量&长期相关性,而不增加过多的学习权重。

让我们看看这些花哨的术语到底是什么意思-

A .典型卷积层

Fig.2 Typical Convolution Layer

上面是一个典型的卷积层的表现。对于 1d 卷积层,我们在输入序列上滑动权重过滤器,将其顺序应用于序列的重叠区域

在上面的图像中,我们使用 X(0)和 X(1)来预测 y(0 ),这个序列对所有的 y 继续下去。我们可以看到过去和未来的数据被用来预测 y(0)。如果我们把这些 x 想象成时间序列值,那就有明显的问题了。我们会用未来来预测 y,所以我们的模型是作弊!

因此,我们必须确保输入不会影响及时处理它们的输出步骤。

解决方法是什么?— 因果卷积

B. 因果卷积

Fig 3. Causal Convolutions

这就是我们调整卷积设计的步骤,以限制未来 X 影响过去的预测,加强因果关系。如果你也想限制你的输入, keras 为我们简化了它。设置填充=* 【因果】 。*

C. 因果性扩张回旋

Fig 4. Causal Dilated Convolutions

现在我们已经捕获了时间流,让我们理解波网如何有效地捕获长程相关性(感受野),而不会导致影响计算效率的隐藏层的指数增加。

为了解决这一问题,Wavenets 采用了扩张的概念,通过以恒定扩张率跳过输入,使感受野作为卷积层数的函数呈指数增加。通过设置特定的扩张率,您可以从更早的时间段获得类似季度、月份和年份的信息(在上面的表示中,我们在第一层捕获双月模式)。我们可以看到,同样的四个层现在将所有十六个输入系列值连接到高亮显示的输出。

由于上述规范,我们的波网可以用更少的参数捕获更多的信息,消耗更少的历元来收敛。因此,Wavenets 可以将感受野扩大到> 400,而 RNNs 仅在 100-300 有效。

三世。计算资源

我们在谷歌云平台(GCP)上使用 Nvidia Tesla K80 GPU 对我们的模型进行了 7-8 小时 3500 个纪元的训练。

四世。 模型建筑

我们的解决方案受到 Kaggle 上第六名的启发。在竞争时没有缺失值处理,所以我们从缺失值处理开始。Wavenet 架构包括:

  • 剩余块= 32
  • 跳过连接= 32
  • 8 个扩展因果卷积层
  • 每层 32 个宽度为 2 的过滤器
  • 指数增长的膨胀率(1,2,4,8,…,128)
  • 2 个(时间分布)完全连接的图层映射到最终输出

Fig 5. Overview of the residual block and the entire architecture

转到围绕扩展因果卷积的主要逻辑的架构,包括

  • 门控激活
  • 剩余连接和跳过连接

为了获得一个鸟瞰图,扩展的因果卷积分成两个分支,并通过调节信息流的激活单元( tanh 和 sigmoid ),这本质上类似于递归神经网络中的门控机制。它们随后通过逐元素乘法被重新组合。

在时间序列中,当我们使用跳过连接在网络中前进时,需要保留较早的要素图层。可以认为这是对季节性和趋势的延续,季节性和趋势是最终预测处理的时间序列的主要驱动因素。架构中的剩余连接使模块的输入能够通过卷积,然后与卷积输出进行积分。

五.精度测量

我们使用 SMAPE(对称平均绝对百分比误差)的修改版本作为我们的准确性度量,这也是竞争的目标损失。SMAPE 由下式给出:

SMAPE 不能直接使用,因为在零值附近行为不稳定。在代码中,我们通过用 1 替换这些值来忽略不连续性。

六。结果

我们从两个方面验证了我们的结果。我们上传了我们的提交文件,得到了 35.89 的最终解决方案,略高于第二名的分数。

我们通过模型预测了数据集中过去 64 天的数据。以下是我们随机选择的 6 篇维基百科文章的趋势。正如你所看到的,页面浏览日志的趋势被很好地捕捉到了。像所有时间序列预测一样,峰值仍然很难捕捉。

Fig 6. Forecasted Trends

七。结论

●实现了高质量的长期预测

●有效捕捉季节性模式和长期趋势

●包括节假日、星期几、语言等外部信息,可能有助于我们的模型更准确地捕捉高点和低点

请随意浏览我们的代码。

八世。参考文献

  1. *【https://arxiv.org/pdf/1609.03499.pdf *
  2. https://github.com/sjvasquez/web-traffic-forecasting
  3. https://bair.berkeley.edu/blog/2018/08/06/recurrent/
  4. https://medium . com/@ kion . Kim/wave net-a-network-good-to-know-7 caaae 735435
  5. https://github.com/JEddy92/TimeSeries_Seq2Seq
  6. https://github.com/Arturus/kaggle-web-traffic
  7. https://www . ka ggle . com/arjunsurendran/using-lstm-on-training-data

使用 Scala 的 WebSocket 流

原文:https://towardsdatascience.com/websocket-streaming-with-scala-fab2feb11868?source=collection_archive---------27-----------------------

阿卡河如何让生活变得更简单

Photo by Vitaly Sacred on Unsplash

假设你有一个处理器,一个图像处理器,这个图像处理器有几个处理阶段。每个阶段都以不同的方式改变或处理图像。这个图像处理非常棒,你想和全世界分享。所以你编写了一个服务器来上传文件并运行图像处理。也许每个处理阶段都是一个Flow[BufferedImage]。为了便于讨论,我们假设每个阶段大约需要一秒钟,看起来像这样:

然后,您将所有的流程阶段链接在一起,这可能看起来有点像Flow[BufferedImage, ImageProcessed]:

然后,您构建了一个方法,将这个流作为一个流运行:

在现实世界中,这不会进入Sink.ignore,因为我们可能会将处理后的图像保存到 S3 桶或其他存储中。

使用 Akka Http,您可以轻松定义一个Route来处理文件上传:

现在我们的朋友可以使用我们的图像服务了!但是,如果我们想通知用户我们的处理进度呢?

我们从 Akka Http 文档中知道,我们使用Flow[Message]来处理 WebSockets,正如他们的例子所示:

Akka WebSocket Example

但是我们如何从外部与这个 WebSocket 流对话?🤔

答案是preMaterialize一个Source,然后从Sink和这个预物质化的Source构建一个Flow…让我们开始吧:

现在,我们发送给wsActor的任何东西都将被发送回我们的 JavaScript web 客户端!我们的新路由现在包含 WebSocket 处理程序:

我们更新处理阶段以通知我们的wsActor:

现在,当我们上传一张图片时,我们会得到一个很好的列表,告诉我们图片正在经历哪些处理阶段😎

所有代码(包括前端!)这里的是开源的。🐾

第 1 周@ Metis Singapore 数据科学训练营-项目 1:关于纽约市 MTA、十字转门和从众所周知的消防水管中喝水的探索性数据分析(EDA)

原文:https://towardsdatascience.com/week-1-metis-singapore-data-science-bootcamp-project-1-exploratory-data-analysis-eda-on-the-b35b8c5d4417?source=collection_archive---------24-----------------------

如果你对这个项目的代码感兴趣,你可以在这个 repo 找到它。

我在梅蒂斯的第一周非常艰难。我要说,加上紧张的连续课程和紧张的最后期限,我可以有把握地说,在过去的一周里,我平均每晚只睡了 4 个小时。到目前为止,最具挑战性的工作是设置我的 github.io(我开玩笑的。最具挑战性的部分是项目),我已经放弃了,所以你在媒体上看到我。

本周的重点是掌握数据分析的基本工具;python、matplotlib、seaborn 和我们的工作流(最小可行产品、设计流程)围绕着一个关于 MTA 地铁交通数据的项目。该项目的目标是帮助一个假想的非营利组织,该组织旨在促进妇女的认识和参与,以提出一个优化的 canvasing 战略。

我们被给予了很大的自由去做我们想做的事情(我们都知道,权力越大,责任越大),以我们认为对这个假设的组织的目的有用的方式来解释结果并提供建议。

网页抓取:

我要说的是,我没有任何编码背景,对我来说,第一个最大的障碍是自动收集数据的方法。其中我非常感谢 Julia Kho 关于网络搜集 MTA 十字转门数据的帖子,可以在这里找到。

探索性数据分析:

Average Entries for the Top 7 NYC Stations with the Highest Average Entries

Split-Histograph Data Of an Average Entry by Day of the Week for the Top 7 NYC Stations with the Highest Average Entries

“探索性数据分析”(EDA)是对这个项目过程的全面描述,意思是从研究到可视化数据集以从中提取意义,直到当前数据足够有用以进行广泛的统计建模和/或假设测试。

从上面我们看到的图表中,我们观察到人流量最高的车站是 34 街——佩恩车站42 街——大中央车站34 街——先驱广场 (如果你用谷歌快速搜索一下,这是真的)。

另一个要注意的有趣的点是,与周末相比, 工作日的人流量更高——这与我的预期(收集数据之前)大相径庭。我预计周末会产生比平日更多的人流量(这是新加坡的典型情况)。

提出清晰讲述数据故事的可视化效果是 EDA 最令人愉快的部分之一,这些可视化效果代表了您收集的完整信息包以及您对如何构建这些信息的创造性见解。这真的很有趣,因为它可以挑战一个人自己的假设,让一个人更多地了解这个世界(在新加坡,而不是在纽约)。如果不深入研究数据本身,我永远不会知道外国的交通模式。

但是在到达那里之前,你通常必须花一些时间处理数据,把它转换成一种包含有意义信息的可用格式。我和我的队友在完成数据清理后的感受可以用下面的图片来最好地概括:

True story

进一步分析:

我想更深入地研究这一点,而不是仅仅了解白天的交通,我还想知道它在一天的时间里是如何波动的。早上更挤吗?下午?晚上?甚至在晚上?我们可以从数据中提取和解读更多的东西,如果时间允许,我肯定会回来重新访问这个数据集。

所用指标的缺点:

入口 vs 出口

一个伟大的数据科学家知道自己的偏见,必须留意和质疑他/她的假设的可信度,并测试其准确性。我们在这里使用的度量是入口(进入车站的人数)。但是用入门作为衡量标准有效吗?为什么不考虑退场?人们是否会更容易接受 canvasing(接收传单,更愿意与调查员交谈,发送电子邮件等)。)改为出站?有很多事情要考虑,如果时间允许,我想重新考虑这个想法。

最终反射:

这第一周真的就像用消防水管喝水一样;从早上第一件事就是接受结对编程练习的轰炸,到像代码的时间复杂性这样的理论密集型主题,为了跟上手头的材料,必须进行大量的课后学习。但奇怪的是,如此忙碌,并意识到仍有如此多有趣的东西有待学习,这是一种极大的满足感。

作为对我本周所学内容的最后反思,我想转向工作生活中的一个核心问题,这个问题在课堂上经常被忽视。当我的导师在本周初介绍 MTA 项目时,他给了我们一个尖锐的警告,我们在训练营的最后期限将是不公平的,我们需要 放弃完美主义 。总是有另一个步骤来尝试使数据更加完美,扩展您的项目和分析的范围,或者调整您的模型以获得更好的准确性。然而在现实世界中, 时间是最重要的资源 ,知道何时约束自己往往比你想法的质量 更有价值。

我希望改进并继续努力的事情:

  1. 使用 git 和 gitHub 进行项目管理
  2. 学习为项目的每个阶段设定适当的截止日期,即网络搜集、数据清理、数据处理、数据探索、解释和结果,然后是最终演示。我将在我做的下一个项目中牢记这些,尽职尽责地实践适当的技能/习惯,不仅成为一名智能数据科学家,而且成为一名了解交付有用产品的实际期限的实用科学家!

期待我的下一篇帖子!

周末黑客:使用 Python 为 丨t丨e丨l丨e丨g丨r丨a丨m丨s丨 构建一个图像识别机器人

原文:https://towardsdatascience.com/weekend-hack-building-an-image-recognition-bot-for-丨t丨e丨l丨e丨g丨r丨a丨m丨s丨-using-python-958646b4c4e5?source=collection_archive---------11-----------------------

Object recognition with our bot. Original image by Zachary Nelson on Unsplash

这篇文章的目标是用 Python 构建一个电报机器人,它使用神经网络执行图像识别。本文分为三个主要部分:简介、技术选择和分步设置。

这篇文章是周末黑客系列的第四个实例,这是一系列关于探索新概念的简短开发故事。聚焦于边做边学,提供了分步说明。

介绍

自动图像识别(例如。对象识别和图像分类)可以为商业提供巨大的价值。如果你运行一个论坛、约会应用或任何用户上传内容的平台,自动识别图像可能是至关重要的。好处是双重的:

一方面,它为最终用户提供价值,允许他们通过分类主题对图像进行搜索,同时避免繁琐的手动分类任务。一个实际的例子是 Unsplash 搜索功能,通过主题搜索高质量的图像。

另一方面,自动图像识别也为系统所有者提供价值,因为它允许过滤掉包含裸体的图像。简而言之,它允许以自动化的方式提高所提供服务的质量。好吧?

正如我们所见,应用程序是无止境的,好处是显而易见的。主要问题仍然是,为这项任务选择哪种解决方案?存在大量第三方解决方案,以及从开源或专有软件构建自己的图像识别管道的可能性。在下一部分,我们将探索不同的选择

技术选择

如上所述,有无数的供应商使用 API 提供图像和视频识别:谷歌视觉、亚马逊识别、澄清 …一个主要问题是,我的数据会安全吗?正如谷歌在其数据使用常见问题中所说:

当您将图像发送到 Cloud Vision API 时,我们必须将该图像存储一小段时间,以便执行分析并将结果返回给您。存储的图像通常会在几小时内被删除。Google 还会临时记录一些关于您的 Vision API 请求的元数据(例如收到请求的时间和请求的大小),以改善我们的服务并打击滥用行为。

“秘密删除”…秘密是什么意思?

如果您担心数据所有权和隐私,也可以选择利用现有技术构建自己的图像识别管道。开源中也有一堆替代方案: TensorFlow 、 Darknet 、 MLpack 、Keras……这些方案可以让你更好地控制图像数据所有权的归属。

在本教程中,我们将专注于使用 Darnet 构建我们自己的图像分类器和对象识别机器人。我们将在 Glitch 中设置一个用 Python 编写的电报机器人来与图像分类器接口。

用户流程将如下:选择一张图片,并将其发送到我们的电报机器人。它会对其进行分类和物体识别,并将结果发送给我们。简单对吗?

Easier said than done…

逐步设置

好吧,让我们开始吧!

1.设置 Python bot 的 bot 框架

为了不重复我自己,我将建议你按照下面帖子中给出的一步一步的说明来做。按照前两个步骤,根据自己的喜好修改应用程序名称。不要太关注机器人句柄,因为我们稍后会添加一个特定的句柄来处理收到的图片。

[## 周末黑客:用 Python 为 丨t丨e丨l丨e丨g丨r丨a丨m丨s丨 构建一个 Unsplash bot

使用 Python 和 Glitch 构建您的第一个电报机器人,它提供来自 Unsplash 的高分辨率图像!

medium.com](https://medium.com/@alainperkaz_51714/weekend-hack-building-an-unsplash-bot-for-丨t丨e丨l丨e丨g丨r丨a丨m丨s丨-with-python-5d63d2d9620d)

2.添加暗网

为了分析发送给机器人的图像,首先我们需要安装和构建 Darknet。所有的安装命令都可以在故障项目的install.sh文件中找到。

要输入命令,在我们的 Glitch 项目中选择工具>全页控制台

Select the Full Page Console to install Darknet

要安装 Darknet,请导航至。Glitch 应用程序中的数据目录。这是至关重要的,因为当你的 Glitch 应用程序进入睡眠状态时,这个目录将被保留!

cd .data
git clone [https://github.com/pjreddie/darknet.git](https://github.com/pjreddie/darknet.git)
cd darknet
make

值得一提的是,虽然你可以训练你自己的模型(并且应该,取决于用例,但是这通常是一个计算量非常大的操作。考虑到我们将在故障实例中运行我们的机器人,而的能量和空间非常有限(1 个 CPU、512 个 RAM、200 MB 存储空间),训练模型是非常不可行的。

对于我们的情况,使用预先训练的模型权重是最好的解决方案。我们将使用以前训练中产生的现有重量,使我们能够快速达到速度。我们将下载两个权重文件, darknet19.weights 用于图像分类,而 yolov3-tiny.weights 用于对象识别。

# execute in the ./darkent directory
wget [https://pjreddie.com/media/files/darknet19.weights](https://pjreddie.com/media/files/darknet19.weights)
wget [https://pjreddie.com/media/files/yolov3-tiny.weights](https://pjreddie.com/media/files/yolov3-tiny.weights)

请注意,由于目前 Glitch 中可用的空间和 CPU 能力的限制,我们选择了相当小的权重文件。如果您在另一个更强大的环境中运行,请随意尝试其他权重(图像分类、对象检测)。你也会得到更好的结果!

3.装上电线

太好了,现在我们已经准备好了我们的机器人框架,并且安装了暗网,我们可以把它连接起来了。我不会解释每一行代码,完整的注释代码可以查看 故障项目

下面是主处理程序的代码摘录(注意它使用了助手函数)。每当有新图片发送到机器人时,它就会被触发。

[@bot](http://twitter.com/bot).message_handler(content_types=['photo'])
def handle(message): # extract the image name for further operations
  image_name = save_image_from_message(message)

  # execute object recognition
  object_recognition_image(image_name) # send object recognition results
  bot.send_photo(message.chat.id, open('.data/darknet/predictions.jpg','rb'), 'Identified objects')

  # execute image classification
  classification_list_result = classify_image(image_name)

  # send classification results
  output = 'The image classifies as:\n'
  for result in classification_list_result:
    output += result
  output += '\n🚀 Gimme more pics! 🚀'

  bot.reply_to(message, output)

  # remove picture from server
  cleanup_remove_image(image_name);

完整的源代码可从以下网址获得:

[## 电报图像分类机器人

电报图像分类机器人🎏Glitch 是一个友好的社区,每个人都可以在这里发现和创建最好的应用程序…

glitch.com](https://glitch.com/~丨t丨e丨l丨e丨g丨r丨a丨m丨s丨-image-classfication-bot)

4.测试机器人

完美,现在我们准备好了,让我们做一些测试!

我们 bot 的电报 ID 是:@ wh _ image _ classicator _ bot, 随便测试一下。分类和识别能力受到现有技术限制的限制,但结果令人鼓舞。

Classification and object recognition on dog picture

Classification and object recognition on 4x4 picture

摘要

按需图像识别 API 提供了无与伦比的功能,但当隐私或离线处理至关重要时,自定义图像识别管道是一个很好的替代方案。

请注意,我们的示例只是触及了表面,使用其他训练集和方法可以实现更准确的图像识别。

资源

  • 故障项目→https://glitch.com/~丨t丨e丨l丨e丨g丨r丨a丨m丨s丨-image-classfication-bot
  • 暗网文件→【https://pjreddie.com/darknet /

其他周末黑帖子:

[## 周末黑客:用 Python 为 丨t丨e丨l丨e丨g丨r丨a丨m丨s丨 构建一个 Unsplash bot

使用 Python 和 Glitch 构建您的第一个电报机器人,它提供来自 Unsplash 的高分辨率图像!

medium.com](https://medium.com/@alainperkaz_51714/weekend-hack-building-an-unsplash-bot-for-丨t丨e丨l丨e丨g丨r丨a丨m丨s丨-with-python-5d63d2d9620d)

每周精选—2019 年 4 月 12 日

原文:https://towardsdatascience.com/weekly-selection-apr-12-2019-4a426e948e8?source=collection_archive---------13-----------------------

第三波数据科学家

由张秀坤海茨 — 5 分钟读完

Drew Conway 对数据科学技能集的可视化是一个经常被引用的经典。不同的观点和角色的多样性产生了无数的变化。

XGBoost 算法:愿她统治长久!

通过 Vishal Morde 和 Venkat Anurag Setty — 7 分钟读取

我仍然记得 15 年前我第一份工作的第一天。我刚刚完成研究生学业,加入了一家全球投资银行,担任分析师。

构建机器学习管道

通过 Semi Koen — 18 分钟读取

在开发模型时,数据科学家在一些为统计和机器学习(Python、R 等)量身定制的开发环境中工作,能够在一个“沙盒”环境中训练和测试模型,同时编写相对较少的代码。

如何利用机器学习在 GitHub 上实现任务自动化,以获得乐趣和收益

通过哈默尔侯赛因 — 13 分钟阅读

关于如何使用 Tensorflow 和公共数据集构建预测和应用问题标签的 GitHub 应用程序的教程。

Kubernetes 的关键概念

杰夫·黑尔 — 12 分钟阅读

云计算、容器化和容器编排是 DevOps 中最重要的趋势。无论您是数据科学家、软件开发人员还是产品经理,了解 Docker 和 Kubernetes 的基础知识都是有益的。

利用 Apache Spark 进行可扩展日志分析——综合案例研究

由迪潘然(DJ)萨卡 — 18 分钟阅读

当今利用分析的最流行和最有效的企业案例研究之一是日志分析。如今,几乎每个小型和大型组织都有多个系统和基础架构日复一日地运行。

组合优化的强化学习

通过或 Rivlin — 9 分钟读取

使用深度强化学习和图形神经网络解决困难优化问题的学习策略。

Python 中的人脸检测指南

由马尔·杨奇煜 — 14 分钟阅读

在本教程中,我们将看到如何使用 OpenCV 和 Dlib 在 Python 中创建和启动人脸检测算法。我们还将添加一些功能来同时检测多张脸上的眼睛和嘴巴。

人工智能创业公司成功的秘诀。AI 到底是谁在赚钱?第二部分

从硅谷到伦敦到上海,人工智能创业公司层出不穷。但是随着淘金热的到来,少数被选中的人会找到金子,而大多数人会空手而归。

R 中你可能不知道的十件随机有用的事情

基思·麦纽提——7 分钟阅读
R 充满了有用的东西。这里有一些我经常使用的东西,其他人可能不知道。

机器学习完全入门指南:4 行代码的多元线性回归!

安妮·邦纳(Anne Bonner)—19 分钟阅读
征服多元线性回归的基础(和向后消除!)并用你的数据预测未来!

每周选择—2019 年 4 月 19 日

原文:https://towardsdatascience.com/weekly-selection-apr-19-2019-7e5819af339d?source=collection_archive---------22-----------------------

深入了解卷积神经网络背后的数学知识

由皮奥特·斯卡斯基 — 12 分钟阅读

自动驾驶、医疗保健或零售只是计算机视觉让我们实现一些直到最近还被认为是不可能的事情的一些领域。

数学编程——数据科学进步的关键习惯

通过 Tirthajyoti Sarkar — 9 分钟读取

我们展示了如何通过模拟飞镖的随机投掷来近似计算圆周率的值。这是建立数学编程习惯的一小步,而数学编程应该是初露头角的数据科学家必备的一项关键技能。

自动编码器综合介绍

马修·斯图尔特博士研究员——15 分钟阅读

在接下来的几周里,我将发布一系列教程,全面介绍使用神经网络进行无监督和自监督学习,以实现图像生成、图像增强和图像混合。

【Matplotlib 动画

按 Parul Pandey — 6 分钟读取

动画是展示一种现象的有趣方式。我们人类总是被动画和互动的图表所吸引,而不是静态的图表。

成为一名数据科学家——当丹·贝克尔指出我完全错了的时候

由赖克夫莱克 — 5 分钟读完

在你的职业生涯中,你是否有过这样的时刻,当你认为自己走在正确的道路上,当你遵循一个稳定的计划,带领你到达你想要的地方,然后有人踢你的计划的坚果,并通过 A + B 告诉你你完全错了?

使用 React 和 Flask 创建一个完整的机器学习 web 应用

作者卡兰·巴诺特 — 6 分钟阅读

我一直想开发一个完整的机器学习应用程序,其中我会有一个 UI 来提供一些输入和机器学习模型来预测这些值。

班上每个强化学习研究员都要带

由文森特·万霍克——6 分钟阅读

我的团队刚刚花了一天时间和一些非常好的男孩和一些非常好的女孩在一起,都是以研究的名义。

解释概率图

通过 Eryk Lewinson — 9 分钟阅读
在本文中,我将解释概率图的概念——它们是什么,如何在 Python 中实现它们,以及如何解释结果。

人工智能时代我们的身份

通过吴俊 — 7 分钟读取

我最喜欢的精神导师之一,爱克哈特-托勒将身份定义为自己的故事。这个故事是由你的思想通过记忆和期望讲述的。

每周选择—2019 年 4 月 26 日

原文:https://towardsdatascience.com/weekly-selection-apr-26-2019-f7d2d66f9728?source=collection_archive---------15-----------------------

综合方法:装袋、助推和堆垛

由约瑟夫·罗卡和巴蒂斯特·罗卡 — 20 分钟阅读

“团结就是力量”。这句老话很好地表达了机器学习中非常强大的“集成方法”的基本思想。

用 H2O 让机器学习民主化

由 Parul Pandey — 9 分钟阅读
H2O 概述:开放源代码,分布式内存机器学习平台

Python 的 5 个高级特性及其使用方法

由乔治·赛义夫—4 分钟读完

Python 是一门美丽的语言。简单易用,但表现力很强。但是,您是否使用了它所提供的一切?

用深度学习检测疟疾

由迪潘詹(DJ)萨卡尔 — 16 分钟阅读

欢迎来到 AI for Social Good 系列,在这里我们将关注人工智能(AI)与流行的开源工具、技术和框架如何被用于发展和改善我们的社会的不同方面。

用 Python 使用纸浆进行线性规划和离散优化

由 Tirthajyoti Sarkar — 11 分钟阅读

线性和整数规划是离散优化问题的关键技术,它们在现代商业和技术领域几乎无处不在。

一名放射科医生对斯坦福 ML 集团 MRNet 数据的研究

由沃尔特·威金斯 — 8 分钟阅读

这篇文章回顾了最近发布的斯坦福 MRNet 膝关节 MRI 数据集和比赛。由于我是一名高级放射科住院医师,我将专注于通过基础领域知识探索数据,解决非医生可能会感到困惑的数据分布方面的问题。

数据科学家犯的十大编码错误

通过 Norm Niemer — 5 分钟读取

数据科学家是“比任何软件工程师更擅长统计,比任何统计学家更擅长软件工程的人”。许多数据科学家有统计学背景,但对软件工程几乎没有经验。

用于异常检测和状态监控的机器学习

通过 Vegard Flovik — 10 分钟读取

当前的文章主要集中在技术方面,包括建立基于多元统计分析和自动编码器神经网络的异常检测模型所需的所有代码。

用 Fast.ai 简化深度学习

由安德烈·里斯科夫 — 7 分钟读完

深度学习是一个因守门而臭名昭著的领域。如果你试图在网上寻找如何进入这个领域的答案,你可能会发现自己被一长串的要求淹没了。

使用 OCR 和 Elasticsearch 搜索穆勒报告

凯尔·加拉丁——6 分钟阅读

4 月 18 日标志着穆勒报告的全面发布——这份文件概述了对俄罗斯可能干预 2016 年总统选举的调查。像大多数政府文件一样,这份文件很长(448 页),读起来会非常乏味。

每周选择—2019 年 4 月 5 日

原文:https://towardsdatascience.com/weekly-selection-apr-5-2019-f744fd2f4703?source=collection_archive---------25-----------------------

可解释的机器学习

由帕鲁尔·潘迪 — 9 分钟阅读

假设你是一名数据科学家,在空闲时间,你试图根据你的 facebook 和 twitter 数据,预测你的朋友夏天会去哪里度假。

毕业于 GANs:从理解生成性对抗网络到经营自己的网络

通过 Cecelia 邵 — 11 分钟阅读

阅读如何生成对抗性网络(GANs)的研究和评估已经发展,然后实现自己的 GAN 生成手写数字

数据科学职位发布的问题

由杰瑞米·哈里斯 — 4 分钟读完

每隔一段时间,你会注意到一些你意识到很久以前就应该注意到的事情。你开始到处看到它。你想知道为什么更多的人不谈论它。

哪个深度学习框架发展最快?

由杰夫·黑尔 — 8 分钟读完

2018 年 9 月,我在这篇文章中,从需求、使用情况、受欢迎程度等方面对比了各大深度学习框架。TensorFlow 是深度学习框架无可争议的重量级冠军。PyTorch 是一个充满活力的年轻新秀。

为西雅图的酒店建立基于内容的推荐系统

由苏珊李 — 5 分钟读完

对于推荐系统来说,冷启动问题是一个众所周知且经过充分研究的问题,其中系统不能向用户推荐项目。由于三种不同的情况,即新用户、新产品和新网站。

创建 R 和 Python 库的分步指南(JupyterLab 版)

由肖恩·麦克卢尔——32 分钟阅读

r 和 Python 是当今机器学习语言的面包和黄油。r 提供了强大的统计和快速的可视化,而 Python 提供了直观的语法和丰富的支持,是当今主流 AI 框架的首选接口。

神经网络中的权重初始化:从基础到明凯的旅程

詹姆斯·德林杰 — 11 分钟阅读

我想邀请你和我一起探索初始化神经网络层权重的不同方法。

在 Python 中清理、分析和可视化测量数据

由 Charlene Chambliss — 10 分钟读取

如果你在 D2C 的一家初创公司从事数据工作,很有可能你会被要求至少查看一次调查数据。由于 SurveyMonkey 是最受欢迎的调查平台之一,它很有可能是 SurveyMonkey 的数据。

每周精选—2019 年 8 月 16 日

原文:https://towardsdatascience.com/weekly-selection-august-16-2019-189fe64b622d?source=collection_archive---------15-----------------------

数据科学中最强大的想法

由凯西·科济尔科夫 — 8 分钟阅读

从有用的模式中分离出不必要信息的快速解决方案

Python 中有用的字符串方法

到 Parul Pandey — 5 分钟读取

了解一些 Python 内置的可用于字符串的方法

AI 发现你脸上的心跳

通过 Shor Joel — 7 分钟阅读

对从视频中读取生命体征的技术进行中等深度的探究

高级特征工程和预处理的 4 个技巧

通过马腾 Grootendorst — 7 分钟读取

创建新要素、检测异常值、处理不平衡数据和估算缺失值的技术。

设施架构

通过 Semi Koen — 10 分钟读取

6 个基本的软件质量

用深度学习构建发声情感传感器

由亚历克斯·穆尔 — 6 分钟读完

教机器更好地理解人类交流

人工智能的自然根源

克里斯托弗·尼尔斯 12 分钟阅读

建立对人工智能的共同理解的挑战可以追溯到对智能本质的辩论。

你在推特上说什么就是什么

由安妮·邦纳 — 11 分钟阅读

通过 Twitter 使用检测社交媒体中的抑郁症

每周精选—2019 年 8 月 2 日

原文:https://towardsdatascience.com/weekly-selection-august-2-2019-fb66e59de210?source=collection_archive---------17-----------------------

每个数据科学家都应该知道的 5 种特征选择算法

作者拉胡尔·阿加瓦尔 — 7 分钟阅读

当你创建了大量的特性,然后你需要想办法减少特性的数量,这种情况已经发生了多少次了。

图文并茂:10 个 CNN 架构

到莱米·卡里姆 — 12 分钟阅读
一个普通卷积神经网络的编译可视化

分解伯特

由 Shreya Ghelani — 17 分钟阅读

NLP 中最新里程碑的完全分解

使用 Cython 将 Python 代码的速度提高 30 倍以上

由乔治·赛义夫 — 4 分钟读完

Python 是社区最喜欢的编程语言!这是迄今为止最容易使用的方法之一,因为代码是以直观、人类可读的方式编写的。

关于如何利用统计数据撒谎的课程

到将 Koehrsen — 18 分钟读取

永恒的数据素养建议

聚类分析:创建、可视化和解释客户群

通过马腾 Grootendorst — 9 分钟读取

探索聚类分析的方法,通过降维使聚类可视化,通过探索有影响力的特征来解释聚类。

理解分类决策树(Python)

由迈克尔·加拉尼克 — 10 分钟阅读

由于各种原因,决策树是一种流行的监督学习方法。

机器学习的局限性

由马修·斯图尔特博士研究员 — 12 分钟阅读

机器学习现在被视为解决所有问题的银弹,但有时它不是答案。

用 OpenCV 拼接图像全景图

由 Thalles Silva — 8 分钟阅读

图像拼接是计算机视觉中最成功的应用之一。如今,很难找到不包含此功能的手机或图像处理 API。

每周精选—2019 年 8 月 23 日

原文:https://towardsdatascience.com/weekly-selection-august-23-2019-65f12c83545?source=collection_archive---------29-----------------------

起诉朱庇特笔记本的案子

由杰瑞米·哈里斯——3 分钟阅读

乔尔·格鲁什在 TDS 播客上🎧

神经网络高级课题

马修·斯图尔特博士研究员——19 分钟阅读

一些高级神经网络主题的介绍,如快照集、丢失、偏差校正和循环学习率。

加入我们的 Discord 服务器 (TDS 社区)

尼克·哈维 — 2 分钟阅读

我们正在创建一个面向数据科学的 discord 服务器,以更好地连接我们的社区。通过加入,您将能够讨论关键的数据科学和机器学习主题。

保证无经验数据科学工作的 3 个策略

由 Haebichan Jung — 12 分钟阅读

TDS 采访了 DoorDash 的 Jeff li,他分享了为没有计算机科学或数学学位的数据科学应用评分的重要资源。

超级创造力

由塞拉菲姆·巴佐格鲁和西奥多罗斯·叶夫根尼欧完成——12 分钟阅读

人工智能可能很快就会超越人类的艺术创造力

数据科学家,你应该知道的 5 种图形算法

由 Rahul Agarwal — 10 分钟阅读

因为图表分析是未来

用 PyStan 建模零售价格的贝叶斯策略

由苏珊李 — 10 分钟读完

统计建模、部分池化、多级建模、分层建模

人工智能搜索外星智能——分析无线电望远镜数据

通过 Dipanjan (DJ) Sarkar — 10 分钟读取

从 SETI 了解射电望远镜信号数据

定义数据科学问题

妮可·斯科特 — 4 分钟阅读

数据科学家最重要的非技术性技能

科技行业有哪些最快乐的工作?

由塞缪尔·波廷杰 — 5 分钟读完

技术行业的工资最高,但离职率也最高。

每周精选—2019 年 8 月 30 日

原文:https://towardsdatascience.com/weekly-selection-august-30-2019-e785566e8a09?source=collection_archive---------26-----------------------

分析和统计有什么区别?

由凯西·科济尔科夫 — 6 分钟阅读

理解两种完全不同职业的价值

数据科学家应该知道的关于数据管理的一切*

由黄家仪 — 19 分钟读取

(*但不敢问)

如何让你的熊猫循环快 71803 倍

通过 Benedikt Droste — 5 分钟读取

循环通过熊猫数据帧可能会非常慢——我将向您展示一些非常快速的选项

为现实世界的问题选择正确的算法🎧

由杰瑞米·哈里斯、爱德华·哈里斯和拉塞尔·波拉里。

Tan Vachiramon 在 TDS 播客上

优化和深度学习的区别是什么,你为什么要关心这个

由马頔·舒尔加 — 4 分钟读完

如今,训练神经网络最常见的方法是使用梯度下降或 Adam 之类的变体。

数据科学家应该先学习哪种编程语言?

由吉纳维芙·海斯——6 分钟阅读

r,Python,SQL 还是别的?

数据科学家的自动版本控制

由乔治·赛义夫 — 6 分钟阅读

数据科学最棒的部分之一是从头到尾经历一个完整项目的冒险。

如何创建一个生产就绪的推荐系统

由 Tirmidzi Faizal Aflahi — 16 分钟阅读

我们每天在网上看到很多东西。但是你知道有多少其他的东西我们还没有看到吗?

未来的编程语言

迈克尔·k·斯潘塞 — 5 分钟阅读

有哪些后起之秀的编码语言?

如何用 Python 构建一个简单的时间序列仪表板,包括 Panel、Altair 和一个 Jupyter 笔记本

本杰明·库利——6 分钟阅读

两个过滤器+一个交互式面积图,大约 25 行代码。

每周精选—2019 年 8 月 9 日

原文:https://towardsdatascience.com/weekly-selection-august-9-2019-a68e74f4e940?source=collection_archive---------41-----------------------

决策智能简介

由凯西·科济尔科夫 — 13 分钟阅读

人工智能时代领导力的新学科

检验悖论无处不在

由艾伦·唐尼 — 8 分钟读完

检查悖论是一种你可能从未听说过的统计错觉。这是一个常见的混淆来源,一个偶然的错误原因,也是一个聪明的实验设计的机会。

帮助我每周学习五天机器学习的 6 种技术

丹尼尔·伯克 — 8 分钟阅读

我每天学习机器学习 9 个月,然后找到了一份工作。怎么会?像这样…

教授转型数据科学家:Guido Maretto 博士为何离开学术界开始创业

由 Haebichan Jung — 8 分钟阅读

TDS 采访了这位前教授(加州理工学院博士),询问他为什么离开副教授职位,以及如何在大学毕业后加入行业。

用于可解释机器学习的 Python 库

丽贝卡·维克里(Rebecca Vickery)——5 分钟阅读

4 个用于更好地可视化、解释和诠释模型的库

人工智能路线图的 4 个产品驱动步骤

丹尼尔·申菲尔德 5 分钟阅读

如何教会产品做决策

使用 Tkinter 将您以前的 Python 项目变成令人敬畏的工具

由法比奥·内维斯 — 12 分钟阅读

笔记本很无聊!

量子编程介绍

通过昆汀·张 — 15 分钟阅读

从量子位到运行真正的量子程序的量子编程演练!

如何编写干净的代码来减少麻烦

由拉威·香卡·拉詹 — 7 分钟读完

抽象是邪恶的。代码是反邪恶的,干净的代码也许是神圣的。

贝叶斯建模航空公司客服推特响应时间

由苏珊李 — 9 分钟读完

学生的 t 分布、泊松分布、负二项分布、分层建模和回归

数据科学实验

丹尼尔·弗利 — 13 分钟阅读

当 AB 测试不奏效时

每周精选—2019 年 2 月 1 日

原文:https://towardsdatascience.com/weekly-selection-feb-1-2019-fae28996563a?source=collection_archive---------14-----------------------

学够 Docker 才有用(第一部分、第二部分、第三部分、第四部分)

杰夫·黑尔 — 12 分钟阅读

容器对于提高软件开发和数据科学中的安全性、可再现性和可伸缩性非常有帮助。它们的崛起是当今科技领域最重要的趋势之一。

Jupyter 笔记本中的交互控件

通过将 Koehrsen — 6 分钟读取

在数据探索中,很少有操作比一次又一次地重新运行同一个单元效率更低,每次都略微更改输入参数。

几分钟学会平稳驾驶

由安东宁·拉芬 — 11 分钟阅读

在这篇文章中,我们将看到如何在几分钟内训练一辆自动驾驶赛车,以及如何平稳地控制它。

什么是 AI 偏见?

凯西·科济尔科夫——4 分钟阅读

人工智能偏见问题始于定义,但并未结束。“偏见”是一个被过度使用的术语,在不同的上下文中,它的意思是非常不同的。

利用资料找到最愤怒的死士宋

埃文·奥本海默 — 11 分钟阅读

死亡握是一个实验性的嘻哈乐队,自 2011 年以来一直在发布创新、有趣、坦率而困难的音乐。

取消制作图形

克里斯·克劳福德 — 6 分钟阅读

我很高兴看了很多图表(很多),并逐渐了解了哪些图表最有意义。

处理机器学习中的不平衡数据集

由巴蒂斯特·罗卡 — 15 分钟阅读

假设你在一家特定的公司工作,你被要求创建一个模型,根据你所掌握的各种测量结果,预测一个产品是否有缺陷。

马里奥对瓦里奥——第二轮:CNN 在 PyTorch 和 Google Colab

由 Eryk Lewinson — 9 分钟阅读

很长一段时间以来,我一直在玩 Google Colab(是的,免费访问 GPU……)。

用谷歌的 FACETS 可视化机器学习数据集

按 Parul Pandey — 8 分钟读取

Google 的开源工具,可以轻松地从大量数据中学习模式

每周精选—2019 年 2 月 15 日

原文:https://towardsdatascience.com/weekly-selection-feb-15-2019-f1d8f893d1f?source=collection_archive---------23-----------------------

图形神经网络简介(基础、DeepWalk 和 GraphSage)

By 黃功詳 Steeve Huang — 8 min read

最近,图神经网络(GNN)在各个领域越来越受欢迎,包括社会网络、知识图、推荐系统,甚至生命科学。

在小公司/初创公司中成功成为数据科学家

由兰迪欧 — 9 分钟阅读

我已经在规模在 15-150 之间的公司工作了将近 12 年,身兼“数据分析师、工程师,偶尔还有科学家”的各种职务。

没人会告诉你的数据科学工作申请

爱德华·哈里斯 — 6 分钟阅读

我是一名物理学家,在 YC 的一家初创公司工作。由于我们公司的工作,我收到了许多电子邮件,询问我关于数据科学职业的建议。

音频人工智能:使用卷积神经网络从立体声音乐中分离人声

由 Ale Koretzky — 15 分钟阅读

如果我们能回到 1965 年,拿着“所有人都可以进入”的徽章敲开艾比路录音室的大门,并有幸聆听那些标志性的列侬-麦卡特尼和声 A-五车二,会怎么样?

深度学习中不同类型卷积的综合介绍

由昆仑白 — 31 分钟读完

在这篇文章中,我总结了深度学习中常用的几种卷积类型,并试图用一种大家都可以理解的方式来解释它们。

【sklearn 和熊猫的特色选择

通过 Abhini Shetye — 8 分钟阅读

在执行任何机器学习任务时,特征选择都是首要且重要的步骤之一。在数据集的情况下,一个特征仅仅意味着一列。

简单神经网络时间序列预测简介& LSTM

由苏珊李 — 5 分钟读完

本文的目的是解释人工神经网络(ANN)和长短期记忆递归神经网络【LSTM RNN】,使您能够在实际生活中使用它们,并为时间序列数据构建最简单的 ANN 和 LSTM 递归神经网络。****

深度学习在 AI 研究中的局限性

罗伯特·伊里翁多

深度学习是机器学习的一个子集,在过去十年中,它在各种实际应用中提供了超人的准确性。

通过构建真实世界的应用程序掌握 Python(第 8 部分)

通过 Dhrumil Patel — 9 分钟读取

毫无疑问,数据科学(总的来说)是下一件大事,这些数字证明了数据科学家热爱 Python。众所周知,数字不会说谎。

每周精选—2019 年 2 月 22 日

原文:https://towardsdatascience.com/weekly-selection-feb-22-2019-59d340c15fa5?source=collection_archive---------17-----------------------

OpenAI 的 GPT-2:模型、宣传和争议

由瑞恩·洛威 — 9 分钟读完

上周四,OpenAI 发布了一个名为 GPT-2 的超大型语言模型。该模型可以基于一些种子文本生成各种风格的真实文本,从新闻文章到同人小说。

算法交易的人工智能:重新思考棒线、标签和平稳性

由亚历山大·巴甫洛夫·洪查尔 — 13 分钟读取

在一系列文章中,我应用了一种非常简单的方法来预测金融时间序列:利用整个数据集,使用滑动窗口方法生成 X 和 Y,将其分为历史数据和样本外数据,训练一些机器学习模型将 X 映射到 Y,并回测简单的多空策略。

文化过度/欠适应与迁移学习。或者为什么“网飞文化”在你的公司行不通。

由 Xavier Amatriain — 13 分钟读取

几周前,我在旧金山工程领导会议上做了一次演讲。当我准备演讲的幻灯片时,我想到了一些非常有趣的事情:我管理技术团队已经超过 25 年了。大约在同一时间,我也在做公开演讲。

你应该知道的 10 种 Python 文件系统方法

由杰夫·黑尔 — 7 分钟读完

本文是当前和有抱负的开发人员和数据科学家的指南。我们将重点介绍 10 个基本的 os 和 shutil 命令,以便您可以编写脚本来自动化与文件系统的交互。

面向数据科学家的低成本细胞生物学实验

保罗·穆尼(Paul Mooney)—7 分钟阅读

没有昂贵的实验室设备,“公民科学家”能做真正的科学吗?简而言之:是的。在这篇博文中,我们指出了一种替代的低成本方法来解决生物学问题,这种方法适合有抱负的业余科学家。

比较 Python 和 SQL 构建数据管道

由马克·拉福雷——5 分钟阅读

作为一名 web 开发人员,我第一次接触数据库和 SQL 是使用对象关系模型(ORM)。我使用的是 Django 查询集 API,使用该接口的体验非常好。

利用迁移学习和弱监督廉价构建 NLP 分类器

亚伯拉罕·斯塔罗斯塔 — 14 分钟阅读

训练最先进的 NLP 模型有一个问题:它们依赖于大量手工标记的训练集。这就是为什么数据标记通常是开发 NLP 应用程序并使其保持最新的瓶颈。

使用 Python 的 scikit-image 模块进行图像分割

按 Parul Pandey — 11 分钟读取

我们都很清楚 Photoshop 或类似的图形编辑器提供的无限可能性,它们可以将一个人从一幅图像中取出,放入另一幅图像中。然而,这样做的第一步是识别该人在源图像中的位置,这就是图像分割发挥作用的地方。

通过聚类在 Spotify 上分析我最喜欢的歌曲

由 John Koh — 11 分钟阅读

音乐是我们生活中不可或缺的一部分。当无法用语言描述我们的感受时,它是帮助我们表达自己的共同语言。音乐也有助于我们调节情绪。

每周精选—2019 年 2 月 8 日

原文:https://towardsdatascience.com/weekly-selection-feb-8-2019-5669c93c6222?source=collection_archive---------23-----------------------

一年来每周写一篇数据科学文章我学到了什么

由威尔·科尔森 — 13 分钟阅读

应该有一条法律限制人们只能用“改变生活”这个词来描述生活事件。今早喝了一杯改变人生的咖啡。嗯,希望它是好的,因为这是你得到的一个使用!

制作深度神经网络来理解它们是如何工作的

到 Paras Chopra — 10 分钟阅读

深度学习的效果如此之好,这是一个谜。尽管有一些关于深度神经网络为什么如此有效的暗示,但事实是没有人完全确定,对深度学习的理论理解是一个非常活跃的研究领域。

PyViz:简化 Python 中的数据可视化过程。

通过 Parul Pandey — 9 分钟阅读

如果你正在处理数据,那么数据可视化就是你日常工作的一个重要部分。如果你使用 Python 进行分析,你应该会被数据可视化库形式的大量选择所淹没。

2019 年学数据科学有什么感受

托马斯·尼尔德 — 16 分钟阅读

我决定不再忽视数据科学、人工智能和机器学习。多年来,我一直是一名分析师和顾问,在 Excel 工作簿中处理数字,制作数据透视表和图表。

100 行代码中深度学习的关键

由 Javier Ideami — 13 分钟阅读

对于那些对深度学习的奥秘和可能性充满热情的人来说,这是一个令人兴奋的时代。该领域的许多英雄通过视频和文章分享他们的专业知识。

用于股票期权定价异常检测的无监督学习

由 Boris B — 8 分钟阅读

期权估价是一项非常困难的任务。首先,它需要使用大量数据点(下面列出了一些),其中一些非常主观(如隐含波动率——见下文),难以精确计算。

学习足够有用的 Python:arg parse

到杰夫·黑尔 — 6 分钟读完

如果您计划成为 Python 的软件开发人员,您将希望能够使用 argparse 来满足您的脚本需求。如果您是一名数据科学家,您可能会发现自己需要将 Jupyter 笔记本中的代码移植到可复制的脚本中。

介绍 AI 项目画布

由简·扎瓦日基 — 9 分钟读完

创建一个人工智能项目总是涉及到回答同样的问题:你增加的价值是什么?需要什么数据?客户是谁?预期的成本和收入是多少?

用数据科学预测创业估值

塞巴斯蒂安·金特罗(Sebastian Quintero)14 分钟阅读

在创业经济中,人们通常很难理解数字的重要性。如果一家公司以 40 亿美元的估值筹集了 5 . 5 亿美元的 F 系列融资,那到底有多大?与其他 F 系列相比如何?

每周精选—2019 年 1 月 11 日

原文:https://towardsdatascience.com/weekly-selection-jan-11-2019-2a000c2bddb9?source=collection_archive---------22-----------------------

Python 中数据可视化的下一个层次

由威尔·科尔森 — 8 分钟阅读

沉没成本谬误是人类遭受的许多有害认知偏见之一。它指的是我们倾向于继续将时间和资源投入到一个失败的事业中,因为我们已经在追求中花费了太多的时间。

深度学习已经达到极限了吗?

由托马斯·尼尔德——10 分钟阅读

许多人认为,算法将超越人类的认知意识。机器将在没有人类干预的情况下识别和学习任务,并成群结队地取代工人。

计算神经科学简介第一部分

通过 Samhita Alla — 10 分钟读取

计算神经科学是唯一可以帮助你理解,你如何在大脑中思考和处理信息的领域。即使在你完成这句话的时候,你的大脑中也会发生大量的动作,这些动作可以通过对神经元的研究来解码。

理解生成性对抗网络

约瑟夫·罗卡 — 19 分钟阅读

Yann LeCun 将其描述为“最近 10 年机器学习中最有趣的想法”。当然,来自深度学习领域如此杰出的研究人员的这种称赞对于我们正在谈论的主题来说总是一个很好的广告!

学习足够有用的 Docker

由杰夫·黑尔 — 7 分钟读完

容器对于提高软件开发和数据科学中的安全性、可再现性和可伸缩性非常有帮助。它们的崛起是当今科技领域最重要的趋势之一。

无梯度强化学习:使用遗传算法进化智能体

由 Paras Chopra — 10 分钟阅读

在假期里,我想提高我的强化学习技能。对这个领域一无所知,我参加了一个课程,在那里我接触到了 Q-learning 和它的“深度”等价物(深度 Q 学习)。

使用 Rasa 和 Python 为 Slack 构建一个对话聊天机器人

由帕鲁尔·潘迪 — 9 分钟阅读

对话式人工智能系统正在成为人类生态系统不可或缺的一部分。对话式人工智能的知名例子包括苹果的 Siri、亚马逊的 Alexa 和微软的 Cortana。

使用 React 和 face-api.js 的 BNK48 偶像团体面部识别 SPA

由素帕猜猜 — 14 分钟读完

如今,人脸检测和识别已经不是什么新鲜事了。一年前,我曾经尝试在 Python 上使用 TensorFlow 和 facenet 制作自己的面部识别系统。该项目旨在从 AKB48 成员的照片中进行人脸检测和识别。

每周精选—2019 年 1 月 18 日

原文:https://towardsdatascience.com/weekly-selection-jan-18-2019-e8d4e2e49f90?source=collection_archive---------13-----------------------

利用深度学习的最新进展来预测股价走势

由鲍里斯 B——34 分钟读完

在这本笔记本中,我将创建一个预测股票价格变动的完整过程。坚持下去,我们会取得一些不错的成果。为此,我们将使用一种生成式对抗网络(GAN ),其中 LSTM 是一种递归神经网络,作为生成器,而卷积神经网络 CNN 作为鉴别器。

数据可视化中的探索性设计

由以利亚·米克斯和杰森·福里斯特——10 分钟读完

对于数据可视化设计者来说,最具挑战性的任务之一是让他们的利益相关者相信一种不熟悉的技术比一种常用的技术更有效。

统计学中最重要的观点

由 Cassie Kozyrkov — 4 分钟读作

人口、样本和假设?或者你可能上过一门强调概率、分布、p 值和置信区间的课程?所有这些都是拼图的一部分,但是它们在核心的下游。

探索性数据分析的简明介绍

由丹尼尔·伯克 — 19 分钟改为

粉色汗衫,染红头发,镀灰胡子,不穿鞋,约翰列侬眼镜。真是个人物。想象一下他会有怎样的故事。他停好车,走进咖啡馆。

全球核武器的现实和俄罗斯核武器如何打开你的灯

由将科尔森 — 11 分钟改为

2018 年一个温暖的波士顿夏天,我刚刚在哈奇纪念壳牌公司的草坪上安顿下来,准备表演我最喜欢的交响乐——霍尔斯特的《行星》——这时我看到了忧思科学家联盟搭建的一个帐篷。

我记录了 2018 年的每一天

由林清武——7 分钟读完

2018 年,我每天都跟踪自己的心理健康状况。我用 1-5 的等级来评价我的快乐,其中“1”是非常糟糕的一天,“2”是有点糟糕的一天,“3”是一般的一天,“4”是有点好的一天,“5”是非常好的一天。

那个神奇宝贝是谁?

由 Yish Lim — 5 分钟读出

所以我是一个终生的神奇宝贝粉丝,也是一个最近转变的计算机科学书呆子。虽然我的主要兴趣在于数据科学(这是我上一篇关于数据科学伦理的文章),但我发现自己一直在构思随机编码项目,其中大多数从未实现。

机器学习数据集的主要来源

通过将 Badr — 4 分钟读为

很难找到一个特定的数据集来用于各种机器学习问题,甚至很难进行实验。下面的列表不仅包含用于实验的伟大数据集,还包含描述、使用示例以及在某些情况下解决与该数据集相关的机器学习问题的算法代码。

每周精选—2019 年 1 月 25 日

原文:https://towardsdatascience.com/weekly-selection-jan-25-2019-d62d11173f49?source=collection_archive---------20-----------------------

自担风险评估 NLP: BLEU 中的文本输出

由瑞切尔·塔曼 — 17 分钟阅读

刚进入 NLP 的人经常问我一个问题,当系统的输出是文本,而不是输入文本的某种分类时,如何评估系统。

泊松分布和泊松过程讲解

到时,Koehrsen 将 — 14 分钟读取

大多数学校统计学的悲剧在于它变得如此无趣。老师们花数小时费力地研究推导、方程和定理,当你最终读到最精彩的部分——将概念应用于实际数字——时,却是一些无关紧要、缺乏想象力的例子,比如掷骰子。

通过 PyTorch 中的可视化理解卷积神经网络

由维哈尔·鞍马 — 11 分钟阅读

在当今时代,机器在理解、识别图像中的特征和物体方面已经成功达到 99%的准确率。举几个例子,我们每天都可以看到智能手机在相机中识别人脸,在谷歌照片中搜索特定照片,快速扫描条形码或书籍中的文本等。

质胜于量:构建完美的数据科学项目

由杰瑞米·哈里斯 — 7 分钟读完

在初创公司的行话中,“虚荣指标”是公司为了让世界——有时是自己——相信他们比实际情况做得更好而跟踪的一个数字。

如何在 40 行代码中可视化卷积特征

由法比奥·m·格雷茨 — 18 分钟阅读

最近,在读杰里米·里夫金的书《工作的终结》时,我看到了人工智能的一个有趣定义。里夫金写道:“今天,当科学家们谈论人工智能时,他们通常指的是‘创造机器的艺术,这些机器执行的功能需要人来执行。”

如何用图卷积网络在图上做深度学习(第一部分、第二部分)

Tobias Skovgaard Jepsen — 9 分钟阅读

图的机器学习是一项困难的任务,因为图的结构非常复杂,但也能提供丰富的信息。本文是关于如何使用图形卷积网络(GCNs)对图形进行深度学习的系列文章中的第一篇,图形卷积网络是一种强大的神经网络,旨在直接对图形进行处理并利用其结构信息。

非视觉任务的深度学习视觉

通过最大 Pechyonkin — 7 分钟读取

近年来,深度学习彻底改变了计算机视觉。由于有了迁移学习和惊人的学习资源,任何人都可以通过使用预先训练的模型并根据自己的领域进行调整,在几天甚至几小时内获得最先进的结果。

掌握数据科学面试循环

安德烈·里斯科夫(Andrei Lys kov)—12 分钟阅读

2012 年,《哈佛商业评论》宣布数据科学将是 21 世纪最性感的工作。从那以后,围绕数据科学的炒作只增不减。最近的报告显示,对数据科学家的需求远远超过了供给。

通过深度学习实现项目管理自动化

由尤安·维勒斯基 — 10 分钟阅读

在数据驱动的项目管理未来,项目经理将得到人工智能的增强,人工智能可以突出项目风险,确定资源的最佳分配,并自动化项目管理任务。

经办人:图文并茂的关注

由莱米·卡里姆 — 12 分钟读取

几十年来,统计机器翻译一直是占主导地位的翻译模式,直到神经机器翻译(NMT)的诞生。NMT 是一种新兴的机器翻译方法,它试图建立和训练一个单一的大型神经网络,该网络读取输入文本并输出翻译

每周精选—2019 年 1 月 4 日

原文:https://towardsdatascience.com/weekly-selection-jan-4-2019-ff336394e5db?source=collection_archive---------18-----------------------

我如何在 2018 年艰难地学习数据科学

由艾琳 — 5 分钟读完

当你没有科学学位时,你如何开始学习数据科学?在我调查这些工作机会时,几乎所有的工作机会都将数学、统计学、计算机科学或至少一个量化领域的教育列为要求。我没有。

创业公司数据科学项目流程

由谢伊帕拉奇 — 19 分钟阅读

最近,我正在咨询的一家初创公司( BigPanda )要求我就数据科学项目的结构和流程发表意见,这让我思考是什么让它们独一无二。

过去一年最有用的 6 个机器学习项目

由乔治·赛义夫—4 分钟读完

对于人工智能和机器学习来说,过去的一年是伟大的一年。机器学习的许多新的高影响力应用被发现并公之于众,特别是在医疗保健、金融、语音识别、增强现实以及更复杂的 3D 和视频应用中。

AI 难的真正原因

凯西·科济尔科夫(Cassie Kozyrkov)—6 分钟阅读

今年圣诞节,我朋友的祖母终于发现了她孙子多年来一直在做的事情。他是一名数据科学家,从小受英语教育,偶尔在家庭场合会讲一点西班牙语。他的祖母只会说西班牙语。

2018 年我探索的 10 个数据科学工具

由本·韦伯 — 6 分钟读完

2018 年,我投入了大量时间学习和撰写关于数据科学方法和技术的文章。2018 年上半年,我写了一个关于创业公司数据科学的博客系列,我把它变成了一本书。

通过构建真实世界的应用程序掌握 Python(第四部分)

由德鲁米尔·帕特尔 — 10 分钟阅读

每隔一段时间,就会出现一种新的编程语言,并伴随着一个伟大的社区来支持它。Python 已经出现了一段时间,所以我可以肯定地说,Python 不是一种语言,而是一种宗教。

数据科学与 Python 中的中等故事统计

到时,Koehrsen — 12 分钟读数

Medium 是一个写作的好地方:没有分散注意力的功能,拥有庞大但文明的读者群,最棒的是,没有广告。然而,它不足的一个方面是你可以在你的文章中看到的统计数据。

如何使用机器学习进行异常检测和状态监控

通过 Vegard Flovik — 13 分钟读取

在本文中,我将介绍机器学习和统计分析的几种不同技术和应用,然后展示如何应用这些方法来解决异常检测和状态监控的特定用例。

为游戏创建语音助手(FIFA 教程)

通过 Chintan Trivedi — 5 分钟读取

像亚马逊 Alexa 和谷歌 Home 这样的语音助手已经广泛流行,用于自动化和简化日常任务的执行。它们允许用户通过使用他们的声音快速完成事情,而不必通过他们的手机或电脑进行多次交互。

以正确的方式处理数据

由 Yish Lim — 10 分钟读完

当我学习如何从网上搜集数据时,我第一次想到了数据科学中的伦理观念。刚刚配备了能够轻松捕获和存储任何仅仅是在线打印的信息的能力,我正享受着仅仅为了它而抓取不同网站的乐趣。

每周精选—2019 年 7 月 12 日

原文:https://towardsdatascience.com/weekly-selection-july-12-2019-67a3e08ce50d?source=collection_archive---------30-----------------------

我作为机器学习工程师第一年学到的 12 件事

由丹尼尔·伯克 — 11 分钟阅读

成为你自己最大的怀疑者,尝试不可行的事情的价值,以及为什么沟通问题比技术问题更难。

为什么 Keras 中默认 CNN 坏了,如何修复它们

到内森·胡本斯 — 6 分钟读取

深入探究 CNN 初始化…

深入研究机器学习的分类编码

由格罗弗王子 — 14 分钟读完

根据我在监督学习方面的经验,将模型性能从像样提高到像人一样需要创造性的特征工程。

面向对象编程的简单混合如何能强化你的深度学习原型

通过 Tirthajyoti Sarkar — 11 分钟读取

通过混合面向对象编程的简单概念,如函数化和类继承,您可以为深度学习原型代码添加巨大的价值。

数据科学家:你的变量名太糟糕了。以下是修复它们的方法

由将 Koehrsen — 12 分钟读取

一种大大提高代码质量的简单方法

H2O 使用流量入门

通过 Parul Pandey — 7 分钟阅读

看看 H2O 的开源 UI,它将代码执行、文本、情节和富媒体结合在一个文档中。

简单的一键式 Jupyter 笔记本

由乔治·赛义夫 — 4 分钟阅读

数据科学可以是一件有趣的事情!

用 Python Web 抓取新闻文章

由米格尔·费尔南德斯·扎弗拉 — 8 分钟阅读

用 Python 构建 web 抓取应用程序变得简单

每周精选—2019 年 7 月 19 日

原文:https://towardsdatascience.com/weekly-selection-july-19-2019-a82779d22d52?source=collection_archive---------35-----------------------

用 Python、PyMC3 & ArviZ 进行贝叶斯统计

由苏珊李 — 10 分钟读完

高斯推断、后验预测检查、分组比较、分级线性回归

音频人工智能:使用卷积神经网络从立体声音乐中分离乐器

到 Ale Koretzky — 18 分钟读取

黑客音乐走向衍生内容的民主化

Python 中函数式编程的要素

通过 Parul Pandey — 9 分钟阅读

了解如何使用 Python 中的 lambda、map、filter 和 reduce 函数来转换数据结构。

你的数据集是一个巨大的墨迹测试

凯西·科济尔科夫(Cassie Kozyrkov)—6 分钟阅读

分析中的阿波芬尼亚的危险以及你能做些什么

如何避免数据科学编程环境中的常见困难

到将 Koehrsen — 9 分钟读取

减少编程环境中的附带问题,这样您就可以专注于重要的数据科学问题。

神经类型转移和卷积网络的可视化

马修·斯图尔特博士研究员 — 16 分钟阅读

使用迁移学习在 10 分钟内创建专业外观的艺术品。

数据科学家解释的 P 值

由阿德蒙德·李 — 11 分钟阅读

我去谷歌搜索 p 值这个词,我在维基百科上找到的东西让我更加困惑…

面向数据科学的 Python 初学者指南

由 Oleksii Kharkovyna — 10 分钟阅读

你需要的只是 Python。Python 就是你需要的全部。

增压 Jupyter 笔记本

通过 Pranjal Chaubey — 5 分钟读取

在这篇文章中,我介绍了一些 jupyter 笔记本插件/扩展和一些 Jupyter 命令,它们将增强您的 Jupyter 笔记本并提高您的工作效率。

基准分类编码器

丹尼斯·沃罗廷采夫 — 16 分钟阅读

大多数表格数据集包含分类要素。最简单的方法就是用标签编码器对它们进行编码。这很简单,但有时不准确。

我在亚马逊学到的三件事为我在机器学习领域的职业生涯做好了准备

杰西·弗里曼 — 6 分钟阅读

我在亚马逊工作了 5 年,离获得梦寐以求的“黄色徽章”只差几天了。

每周精选—2019 年 7 月 26 日

原文:https://towardsdatascience.com/weekly-selection-july-26-2019-9dde074025b?source=collection_archive---------28-----------------------

软件架构的 5 个关键原则

由 Semi Koen — 7 分钟读取

有哪些伟大的软件架构师藏在他们的腰带下面

在 Pytorch 中训练快如闪电的神经网络的 9 个技巧

由威廉·法尔肯 — 11 分钟读完

面对现实吧,你的模型很可能还停留在石器时代。我敢打赌,你仍然在使用 32 位精度或* GASP* 甚至可能在单个 GPU 上只训练

每个数据科学家都需要知道的 5 种采样算法

由拉胡尔·阿加瓦尔 — 5 分钟读完

我每天都在努力学习许多算法,所以我想列出一些最常见和最常用的算法,这些算法将在新的 DS 算法系列中使用。

预测 vs .解释

由黄家仪 — 13 分钟读完

以及为什么数据科学需要更多的“半贝叶斯人”

一位数据科学家从数独到 Kaggle 的旅程

通过 Parul Pandey — 8 分钟阅读

与 Rohan Rao 的对话:数据科学家、Kaggle 特级大师、印度数独卫冕冠军

网络的网络——逆图形的神经符号方法

由迈克尔·基斯纳——12 分钟阅读

许多人一旦熟悉了深度学习和神经网络,他们的第一个想法就是,“如果我们制作一个神经网络的网络会怎么样?”。

如何在高维空间中聚类

由尼古拉·奥斯科尔科夫 — 8 分钟阅读

自动检测集群数量的方法

用 Python 和 PyMC3 构建贝叶斯逻辑回归

到苏珊李 — 10 分钟读完

我认购定期存款的可能性有多大?后验概率,可信区间,优势比,WAIC

构建神经网络的经验法则

通过 Chitta Ranjan — 11 分钟读取

在本文中,我们将获得一个构建初始神经网络的起点。我们将学习经验法则,例如隐藏层数、节点数、激活等。,并查看 TensorFlow 2 中的实现。

检测时间序列数据的平稳性

通过 Shay Palachy — 9 分钟阅读

试图通过观察一个时间序列的图表来确定它是否是由一个平稳过程产生的是一个可疑的冒险。

每周精选—2019 年 7 月 5 日

原文:https://towardsdatascience.com/weekly-selection-july-5-2019-cbe8ab5c7?source=collection_archive---------21-----------------------

暗示性计算机辅助设计

由斯塔尼斯拉斯·夏洛 — 10 分钟读完

通过机器学习辅助设计

贝叶斯推理问题,MCMC 和变分推理

由约瑟夫·罗卡和巴蒂斯特·罗卡 — 17 分钟读取

统计学中的贝叶斯推断问题综述

GPT2,计数意识和好奇黑客

由 Connor Leahy — 35 分钟阅读

不久前,OpenAI 披露了他们在人工智能系统 GPT2 的语言创造方面的最新实验细节。

从 MBA 到 IBM 数据科学家:独家专访格雷格·拉弗蒂

由 Haebichan Jung — 10 分钟阅读

TDS 与 IBM 的首席数据科学家讨论公司的工作流程、内部 NLP 项目以及获得第一份数据科学工作。

虚拟异常检测

由苏珊李 — 8 闵读

单变量和多变量数据的无监督异常检测。

优秀的数据科学家和伟大的数据科学家之间的区别是什么?

由阿马德乌斯·马格拉比 — 6 分钟读出

不断发展的领域中最有价值的技能

用机器学习生成披头士的歌词

由欧根 Hotaj — 11 分钟读完

语言模型和 OpenAI 的 GPT-2 的高级入门

利用无监督机器学习揭开隐藏的科学知识

由 Vahe Tshitoyan — 7 分钟阅读

Word2vec 从数百万份摘要中学习材料科学

用你新获得的壳技能打动旁观者

Rahul Agarwal — 10 分钟阅读

数据科学家的 10 分钟外壳/终端技能

下一级艺术和工作休闲的未来

通过最大 Frenzel — 30 分钟读取

用人工智能变得更有创造力(和人性)

每周精选—2019 年 6 月 14 日

原文:https://towardsdatascience.com/weekly-selection-june-14-2019-fcdd06ef0a53?source=collection_archive---------28-----------------------

“走向数据科学”将与多伦多机器学习峰会合作举办我们的第一场活动!如果你有兴趣在今年的 TMLS 演讲,现在就提交你的摘要吧。✨ 阅读更多。

Jupyter 是新的 Excel

通过 Semi Koen — 7 分钟读取

为什么交易者和金融专业人士需要学习 Python

神经 ODEs:又一次深度学习突破的崩溃

由亚历山大·巴甫洛夫·洪查尔 — 11 分钟读完

在这篇文章中,我将尝试给出一个简短的介绍和这篇论文的重要性,但我将强调实际应用,以及我们如何和为了什么可以在应用中应用这种需要的神经网络,如果可以的话。

人工智能设计师的角色是什么?

阿曼达·林登——6 分钟阅读

大约 4 个月前,我开始管理脸书人工智能团队的产品设计组织。我们是一个中心组织,为脸书、Instagram 和其他脸书应用程序提供人工智能服务。我们还致力于开发由人工智能驱动的新体验。

甘人会梦到假图像吗?

由 Gidi Shperber — 13 分钟读取

深入研究图像取证:区分真实图像和伪造图像的努力

选择合适的数据库

由吴俊 — 4 分钟读出

启动任何数据库项目的关键步骤:关系与非关系、CAP 定理等等。

文字处理即将到来

由玛德琳·麦康贝 — 12 分钟读完

如何在《权力的游戏 1》中使用正则表达式(Regex)和自然语言工具包(NLTK)

亚历克莎,亚历克斯,还是艾尔?

由那华康 — 6 分钟阅读
3 条建议来对抗人工智能助手中的性别偏见

用 Python 中的“买到死”概率模型预测客户终身价值

卢卡·德·安杰利斯 — 11 分钟阅读

客户的价值是什么?在搅动之前,客户还会购买多少次?他在未来 3 个月内流失的可能性有多大?最重要的是,我们应该期望客户“存活”多久?

机器学习如何帮助识别药物的有效性和不良反应

通过 Dipen Chawla — 10 分钟读取

通过采用 ML 算法建立用于处理神经药物的文本综述的系统,以有洞察力的和视觉上信息丰富的表示形式提供有效性或不良反应的概述。

每周精选—2019 年 6 月 21 日

原文:https://towardsdatascience.com/weekly-selection-june-21-2019-6172d9c931a5?source=collection_archive---------25-----------------------

算法偏差的算法解决方案:技术指南

由 Joyce Xu — 16 min 阅读

我想谈谈减轻算法偏差的技术方法。

为什么你还不是一个可以胜任工作的数据科学家

由杰瑞米·哈里斯 — 6 分钟读完

如果说我从我工作的数据科学导师初创公司学到了什么,那就是:从你的数据科学工作申请或面试中获得反馈几乎是不可能的。

70%的数据科学学习者做错了什么

丹·贝克尔(Dan Becker)—3 分钟阅读

在大学工程课程中,用 2 米长的金属杆反复砸我的头所得到的教训

用 Python 加速数据分析的 10 个简单技巧

按 Parul Pandey — 8 分钟读取

提示和技巧,尤其是在编程领域,非常有用。有时候一点小技巧既能节省时间又能挽救生命。

神经网络简介

马修·史都华博士研究员 — 16 分钟阅读

神经网络的详细概述,有大量的例子和简单的图像。

作为数据科学家如何与利益相关方合作

由山姆·巴罗斯 — 8 分钟阅读

当我开始的时候我会告诉自己什么

数据科学家犯的十大统计错误

由诺姆·尼默 — 7 分钟读完

数据科学家是“比任何软件工程师更擅长统计,比任何统计学家更擅长软件工程的人”。

为什么 p 值像针一样?分享它们很危险!

到卡西·科济尔科夫 — 8 分钟读完

这是一场关于 p 值的战争…双方都是错的

GANs 的端到端介绍

由拉胡尔·阿加瓦尔 — 11 分钟阅读

我敢打赌,我们大多数人最近都见过很多人工智能生成的人脸,无论是在报纸上还是博客上。

非技术性人工智能指南

由尼克拉斯·东格斯 — 13 分钟读完

根据麦肯锡的数据,从现在到 2030 年,人工智能将创造约 13 万亿美元的 GDP 增长。

Python 中的文本分类

由米格尔·费尔南德斯·扎弗拉 — 17 分钟读完

本文是我将介绍开发一个机器学习项目的整个过程的系列文章的第一篇。

每周精选—2019 年 6 月 28 日

原文:https://towardsdatascience.com/weekly-selection-june-28-2019-9804ddd06065?source=collection_archive---------22-----------------------

数据科学的五个命令行工具

由丽贝卡·维克里 — 6 分钟阅读

从终端上你可以做比你想象的更多的数据科学

通过调整基线超越最先进水平

通过雷切尔·塔曼 — 5 分钟阅读

你如何知道一个新的机器学习模型是否是对以前模型的改进?

处理小数据的 7 个小技巧

丹尼尔·罗斯曼 — 7 分钟阅读

因为通常情况下,这就是你要得到的。

支持最佳实践

由拉吉夫·沙阿 — 5 分钟阅读

《自然》杂志地震余震论文中深度学习的误用

深入研究用于模型解释的 Catboost 功能

通过 Alvira Swalin — 8 分钟读取

我们真的了解我们构建的 ML 模型内部发生了什么吗?我们来探索一下。

技巧、诀窍、诀窍和魔法:如何毫不费力地优化你的 Jupyter 笔记本

安妮·邦纳 — 13 分钟阅读

让 Jupyter 笔记本变得更好、更快、更强、更光滑、更棒的完整初学者指南

机器学习能像放射科医生一样看胸片吗?

由戴维·w·戴 — 8 分钟阅读

使用对抗网络实现胸部 x 射线器官分割的人级性能

梯度推进机器入门—使用 XGBoost 和 LightGBM 参数

由 Nityesh Agarwal — 10 分钟阅读

如果你想用 GBMs 来建模你的数据,我相信,你至少要对内部发生的事情有一个高层次的了解。

每周精选—2019 年 6 月 7 日

原文:https://towardsdatascience.com/weekly-selection-june-7-2019-fe7b965292bb?source=collection_archive---------22-----------------------

Python 的数据表包概述

由帕鲁尔·潘迪 — 7 分钟阅读

用于高效多线程数据处理的 Python 库,支持内存不足的数据集。

使用最先进的技术优化深度学习交易机器人

由亚当·金 — 16 分钟读完

让我们教我们的深度 RL 代理使用特征工程和贝叶斯优化赚更多的钱

深度卷积神经网络的高级主题

马修·斯图尔特博士研究员——21 分钟阅读

残差网络、显著图、扩张卷积等等。

如果人工智能模型很容易理解会怎样?

凯西·科济尔科夫 — 7 分钟阅读

当我带你浏览谷歌的假设分析工具时,你会看到人工智能分析的实际应用

推荐系统介绍

由巴普蒂斯特·罗卡和约瑟夫·罗卡——22 分钟阅读

在过去的几十年里,随着 Youtube、亚马逊、网飞和许多其他类似的网络服务的兴起,推荐系统在我们的生活中占据了越来越多的位置。

图表介绍

由梅尔·杨奇煜 — 10 分钟阅读

Python 中的主要概念、属性和应用

建筑&风格

由斯塔尼斯拉斯·夏洛 — 16 分钟读完

人工智能在建筑领域的新前沿

私有人工智能——用 PySyft 和 PyTorch 进行联合学习

安德烈·马塞多·法里亚斯 — 7 分钟阅读

GRU 模型在垃圾短信检测中的应用

用 SciPy 进行优化,并将思想应用到机器学习中

通过 Tirthajyoti Sarkar — 11 分钟读取

对于各种各样的业务和技术流程来说,优化通常是最终的边界,需要被征服才能交付真正的价值。

阿西莫夫机器人定律,以及为什么人工智能可能不遵守它们

汉斯·a·冈诺(Hans a . Gunnoo)—6 分钟阅读

"但是如果我们最终陷入终结者的场景呢?"问这样的问题无可厚非,因为通过电影和科幻故事,机器人接管的情况几乎无处不在,因此构成了我们对人工智能(AI)未来的印象。

每周精选—2019 年 3 月 1 日

原文:https://towardsdatascience.com/weekly-selection-mar-1-2019-516510a9f1b8?source=collection_archive---------5-----------------------

What are the most pressing problems in data science? Take our survey

构建您的第一个开源 Python 项目

由杰夫·黑尔 — 10 分钟阅读

每个软件开发人员和数据科学家都应该经历制作软件包的练习。一路上你会学到很多东西。

具有人工智能的仿人机器听觉(第一部分、第二部分、第三部分)

丹尼尔·罗斯曼 — 25 分钟阅读

在抽象层次上理解和处理信息不是一件容易的事情。人工神经网络已经在这一领域移山。

马尔可夫链简介

约瑟夫·罗卡 — 19 分钟阅读

1998 年,劳伦斯·佩奇(Lawrence Page)、谢尔盖·布林(Sergey Brin)、拉吉夫·莫特瓦尼(Rajeev Motwani)和特里·维诺格拉德(Terry Winograd)发表了《PageRank 引文排名:给网络带来秩序》(The PageRank Citation Ranking:bring Order to The Web),他们在文章中介绍了谷歌起源时现在著名的 Page rank 算法。

木星实验室:木星笔记本的进化

通过 Parul Pandey — 10 分钟阅读

数据显示,Github 上有超过 300 万台 Jupyter 笔记本可供公众使用。私立学校的数量也大致相同。

网飞评论的深度学习情感分析

通过 Artem Oppermann — 11 分钟读取

在这篇文章中,我将涵盖情感分析的主题,以及如何实现一个可以识别和分类网飞评论中人类情感的深度学习模型。

AI &架构

由斯塔尼斯拉斯·夏洛 — 20 分钟阅读

人工智能作为一门学科,早已渗透到无数领域,为以前未解决的挑战带来手段和方法,跨行业。

介绍 Spark GraphFrame,并举例分析维基百科链接图

由马特·哈吉 — 4 分钟阅读

Spark GraphFrame 是使用分布式计算处理大型图形的强大抽象。它提供了大量常见的图形算法,包括标签传播和 PageRank。

Python 中 Anthem 游戏发布的情感分析

威廉·马斯 9 分钟阅读

视频游戏的发布受到戏剧的困扰。从误导性的预购捆绑包,到发布时远未完成的游戏,大型发行商在决定游戏发布的方式和时间时有相当大的风险要管理。

每周精选—2019 年 3 月 15 日

原文:https://towardsdatascience.com/weekly-selection-mar-15-2019-cbe5aa422a31?source=collection_archive---------19-----------------------

这很自然:过度深入自然渐变优化

由科迪·玛丽·怀尔德 — 15 分钟阅读

我要讲一个故事:一个你以前几乎肯定听过的故事,但与你习惯的侧重点不同。

为什么模型可解释性是下一个数据科学超级大国

由丹·贝克尔 — 4 分钟读完

在过去的 10 年里,我采访了许多数据科学家,模型可解释性技术是我最喜欢的话题,可以用来区分最好的数据科学家和普通的数据科学家。

变压器如何工作

由朱利亚诺·吉亚卡利亚 — 14 分钟读完

变压器是一种越来越受欢迎的神经网络架构。OpenAI 最近在他们的语言模型中使用了变形金刚,DeepMind 最近也在 AlphaStar 中使用了变形金刚,alpha star 是他们击败顶级职业星际玩家的程序。

从“R vs Python”到“R 和 Python”

通过 Parul Pandey — 7 分钟读取

在单个项目中充分利用 Python 和 R’的优点。

建设支持无污染城市:开放数据工作流程

由尼克·琼斯 — 6 分钟读取

空气污染是我们这个时代最大的杀手之一,根据《柳叶刀》的一项研究, 2015 年空气污染导致 640 万人死亡,相比之下,疟疾导致 70 万人死亡。我们如何推动更多的行动来解决这个问题?在本帖中,我们将介绍使用 Python 代码构建数据驱动的宣传工具的步骤。

高斯混合模型(GMM)

由丹尼尔·福利 — 11 分钟阅读

使用无监督学习理解文本数据

Jupyter super power——与 Python 的交互可视化组合

通过确认 — 5 分钟读取

altair 是一个交互式可视化库。它提供了更一致的 API。这是作者对图书馆的描述。

在 Python 中构建员工流失模型,以制定战略性保留计划

通过 Hamza Bendemra — 13 分钟阅读

员工流动(也称为“员工流失”)对公司来说是一个代价高昂的问题。替换一名员工的真实成本通常会非常高。

10 个让你工作更高效的 Python 熊猫技巧

由李晓堂 — 5 min 阅读

有些命令您可能已经知道,但可能不知道它们可以这样使用。

每周精选—2019 年 3 月 22 日

原文:https://towardsdatascience.com/weekly-selection-mar-22-2019-8fb32a9d81?source=collection_archive---------9-----------------------

数据科学家:22 世纪最性感的工作

由凯西·科济尔科夫 — 6 分钟阅读

数据科学被称为“21 世纪最性感的工作”——如果我看到更多的商业领袖将数据科学家雇佣到我们可以有效工作的环境中,我会相信这一观点。相反,我们中的许多人感到被误解和被忽视。

对文本数据进行完整的探索性数据分析和可视化

由苏珊李 — 8 分钟读完

如何将可视化和 NLP 结合起来,以便以直观的方式生成见解。

用回声状态网络预测股票价格

马修·斯图尔特博士研究员 — 14 分钟阅读

几十年来,人们一直试图可靠地预测股市看似混乱的本质,但都失败了。神经网络是关键吗?

使用图形网络的机器人控制

通过或 Rivlin — 9 分钟读取

利用关系归纳偏差提高概括和控制

给有抱负的数据科学家的六条建议

由本·韦伯 — 6 分钟读取

数据科学是一个需求巨大的领域,部分原因是它似乎需要作为数据科学家的经验才能被聘为数据科学家。

神经网络调试清单

通过测测邵 — 10 分钟阅读

您可以采取切实可行的步骤来识别和解决机器学习模型的训练、泛化和优化问题

“通过数据驱动的体育博彩战略赚大钱”

由段德安阮 — 10 分钟阅读

几个月前,我开发并写了一个 ML-free 算法,使用简单的泊松过程预测英超联赛的结果。

深度学习神经元对生物神经元

到马修·鲁斯 — 12 分钟读完

近年来,“深度学习”人工智能模型经常被吹捧为“像大脑一样工作”,因为它们由模仿生物大脑的人工神经元组成。

理解梯度下降背后的数学原理

通过 Parul Pandey — 10 分钟阅读

机器学习中一种常用优化算法背后的简单数学直觉。

数学之光 Keras 深度网络中的注意力

通过 Thushan Ganegedara — 6 分钟读取

将所有错综复杂的注意力转移到喀拉斯的一条优雅的线上

每周精选—2019 年 3 月 29 日

原文:https://towardsdatascience.com/weekly-selection-mar-29-2019-66f174c01467?source=collection_archive---------18-----------------------

“GANs”vs“ODEs”:数学建模的终结?

由亚历山大·巴甫洛夫·洪查尔 — 7 分钟阅读

大家好!在这篇文章中,我想在我们在学校、大学学习的经典数学建模和机器学习之间建立一种联系,机器学习也以完全不同的方式对我们周围的对象和过程进行建模。

统计学和机器学习的实际区别

马修·斯图尔特博士研究员——15 分钟阅读

不,它们不一样。如果机器学习只是美化了的统计学,那么建筑学只是美化了的沙堡建造。

深度学习的可解释性:来自物理学的提示

由 Marco Tavora — 13 分钟阅读

如今,人工智能几乎存在于我们生活的每一个部分。智能手机、社交媒体、推荐引擎、在线广告网络和导航工具是基于人工智能的应用程序的一些例子,这些应用程序已经影响到我们的日常生活。

数据科学的设计思维模式

蕾切尔·伍兹 — 13 分钟阅读

自年以来,数据科学在技术研究和商业战略中受到了关注;然而,数据科学研究过程本身有机会增加研究和改进。

统计学家证明统计很无聊

由卡西·科济尔科夫 — 8 分钟读完

我将向你展示一个逻辑证明,统计是无聊的…以帮助你理解像我这样的统计学家所做的所有那些花哨计算的意义。

赢得一次精彩的产品经理面试

作者【Santanu Bhattacharya 博士 — 8 分钟阅读

在面试了 200 多名脸书和创业公司的项目经理后,我为候选人准备了一份清单。对于一个有抱负的项目经理来说,在面试中采取结构化的方法展示了他们的思维方式,揭示了一个人对项目经理角色的理解,并使他们能够扮演那个角色。

设计零距离学习

到法比奥·m·格雷茨 — 18 分钟阅读

Fromme 等人(2013)的“设计:深度视觉语义嵌入模型”是一篇真正漂亮的论文。作者提出了一种新的图像分类方法,利用语言模型学习语义知识。

当 Excel 不够用时:使用 Python 清理数据、自动化 Excel 等等…

由安德烈斯·沃拉基斯 — 5 分钟读取

Excel 是许多公司非常流行的工具,数据分析师和数据科学家经常发现自己将它作为日常数据分析和可视化工具的一部分,但并不总是出于自愿。

Geo 实验,A/B 测试的完美补充

通过 Jason Fong — 7 分钟阅读

这将是一个由三部分组成的系列,讨论地理实验及其在营销中的应用。

谷歌的巴赫人工智能:拥有音乐理论博士学位的机器学习科学家做出反应

丹尼尔·汤普金斯——5 分钟阅读

迟到的生日快乐,J·S·巴赫。为了庆祝,谷歌发布了一个“涂鸦”,如果你首先提供旋律,它会使用人工智能(AI)来调和巴赫的合唱曲。

用数据投资的全面介绍

由张咏恩·库尔 — 13 分钟读完

每个人都应该投资。不管你有 1 美元还是 100 万美元。定期投资的努力日积月累,如果持续以高利率复利,今天的小额投资在未来会变成巨额资金。

每周精选—2019 年 3 月 8 日

原文:https://towardsdatascience.com/weekly-selection-mar-8-2019-614396091e11?source=collection_archive---------22-----------------------

数据科学中最迫切的问题是什么?参加我们的调查

一个神经网络,多种用途

由 Paras Chopra — 15 分钟阅读

众所周知,神经网络确实擅长一项狭窄的任务,但它们无法处理多项任务。这与人脑不同,人脑能够在惊人不同的任务中使用相同的概念。

OpenAI GPT-2:通过可视化理解语言生成

由杰西·维格 — 9 分钟阅读

在大多数 NLP 研究人员看来,2018 年是技术进步的一年,新的预训练 NLP 模型打破了从情感分析到问题回答等任务的记录。

用价值迭代网络学习计划

通过或 Rivlin — 9 分钟读取

深度强化学习的第一个主要成就是著名的 DQN 算法在各种雅达利视频游戏中的人类水平表现,其中一个神经网络使用原始屏幕像素作为输入来学习玩游戏。

利用 word2vec 分析新闻标题,预测文章成功

由 Charlene Chambliss — 17 分钟读取

文章标题的单词嵌入能预测受欢迎程度吗?关于情绪和股票的关系,我们能了解到什么?word2vec 可以帮助我们回答这些问题,还有更多。

可解释的人工智能或者说我是如何学会停止担忧并信任人工智能的

由 Ajay Thampi — 13 分钟阅读

仅在最近五年,人工智能研究人员就在图像识别、自然语言理解和棋盘游戏等领域取得了重大突破!

成为数据科学家并不能让你成为软件工程师!

由 Semi Koen — 11 分钟读取

希望我有争议的标题引起了你的注意。太好了!现在请耐心听我说,我将向您展示如何构建一个可扩展的架构来围绕您机智的数据科学解决方案!

在几分钟内构建自己强大的深度学习环境

由迪潘詹(DJ)萨卡尔 — 15 分钟阅读

多亏了更便宜、更大的存储,我们拥有了比几年前更多的数据。无论大数据制造了多少宣传,我们都应该感谢它。

Git 和 GitHub 入门:完全初学者指南

安妮·邦纳 — 2 分钟阅读

Git 和 GitHub 基础知识,供好奇和完全困惑的人使用(以及为您的第一个开源项目做出贡献的最简单的方法!)

ka ggle 座头鲸识别挑战赛的获奖解决方案回顾

由 Vladislav Shakhray — 10 分钟阅读

最近,我的团队参加了在 Kaggle 上举办的驼背鲸识别挑战赛。我们赢得了一枚金牌,并在排行榜上(在 2131 支队伍中)名列第十。

明天太阳会升起吗?机器学习的贝叶斯统计简介

马修·斯图尔特博士研究员——11 分钟阅读

你有没有问过自己,以前从未发生过的事件发生的概率是多少?

简化 ROC 和 AUC 指标。

由帕鲁尔·潘迪 — 8 分钟阅读

ROC 和 AUC 曲线是计算任何分类模型性能的重要评估指标。这些定义和术语在机器学习社区中非常常见,当我们开始学习分类模型时,我们每个人都会遇到。

保持平稳时间序列的记忆

作者: Simon Kuttruf — 8 分钟阅读

许多预测模型要求时间序列具有一定的一致性,称为平稳性。通常的转换,即整数阶差分(在金融中,例如对回报率而不是绝对价格建模),消除了数据中的记忆,因此影响了建模的预测能力。

每周精选—2019 年 5 月 10 日

原文:https://towardsdatascience.com/weekly-selection-may-10-2019-11e7b1ad12f3?source=collection_archive---------17-----------------------

使用“假设工具”研究机器学习模型。

由帕鲁尔·潘迪 — 9 分钟阅读

Google 的一个开源工具,无需编码就能轻松分析 ML 模型。

图灵学习和 GANs 简介

马修·斯图尔特博士研究员——20 分钟阅读

想把马变成斑马?制作 DIY 动漫人物或名人?生成敌对网络是你新的最好的朋友。

如果你喜欢旅行,就让 Python 帮你刮到最好的廉价航班吧!

由法比奥内维斯 — 12 分钟读取

这个项目的目标是建立一个 web scraper,它将运行并执行对特定目的地的航班价格的灵活日期搜索(在您首先选择的日期前后最多 3 天)。

我从与 12 家机器学习初创公司的合作中学到了什么

丹尼尔·申菲尔德 — 5 分钟阅读

我和 12 家创业公司合作过。它们跨越了从金融科技和医疗保健到教育科技和生物科技的垂直领域,从种子期前到收购后都有涉及。我的角色也各不相同,从最基层的员工到数据科学主管和战略顾问。

使用 Keras 中的自动编码器进行极端罕见事件分类

通过 Chitta Ranjan — 8 分钟读取

在这篇文章中,我们将学习如何实现一个自动编码器来构建一个罕见事件分类器。我们将使用真实世界的罕见事件数据集

使用互动小工具让您的 Jupyter 笔记本栩栩如生

由 Semi Koen — 10 分钟读取

传统上,每次需要修改笔记本单元格的输出时,都需要更改代码并重新运行受影响的单元格。这可能是麻烦的、低效的和容易出错的,并且在非技术用户的情况下,这甚至是不可行的。

数据科学家的工作有被自动化的风险吗?

到时,Koehrsen 将 — 13 分钟读取

这是一个有用的测试,用于确定您的工作是否可以由一台应用于数据科学家的机器来完成

让我们构建一个流数据管道

丹尼尔·弗利 — 11 分钟阅读

今天的帖子是基于我最近在工作中做的一个项目。我真的很兴奋能实现它,并把它写成一篇博文,因为它给了我一个机会去做一些数据工程,也做了一些对我的团队非常有价值的事情。

用 Word2vec 代表音乐?

通过 Dorien Herremans — 8 分钟阅读

机器学习算法改变了视野和 NLP。但是音乐呢?近几年来,音乐信息检索领域发展迅速

每周精选—2019 年 5 月 19 日

原文:https://towardsdatascience.com/weekly-selection-may-19-2019-9a80718f84f0?source=collection_archive---------30-----------------------

推荐系统的非凡世界

由帕鲁尔·潘迪 — 10 分钟阅读

推荐系统概述以及它们如何提供一种有效的定向营销形式。

现在是 2019 年——让你的数据可视化与 Plotly 互动

由杰夫·黑尔 — 12 分钟读完

使用 Express 和袖扣快速找到制作令人惊叹的数字的方法

使用 fastai 实现 SPADE】

通过 Divyansh Jha — 8 分钟读取

使用 GANs 生成照片级逼真图像

ARIMA/萨里玛 vs LSTM,时间序列数据集成学习洞察

由 Sharmistha Chatterjee — 14 分钟阅读

AR 模型根据时间序列的先前值和当前残差来线性表达时间序列的当前值,而 MA 模型根据时间序列的当前值和先前残差序列来线性表达时间序列的当前值。

量化时序数据间同步性的四种方法

由金贤昌 — 7 分钟读完

计算同步度量的样本代码和数据,包括皮尔逊相关、时间滞后交叉相关、动态时间弯曲和瞬时相位同步。

GANs vs. Autoencoders:深度生成模型的比较

马修·斯图尔特博士研究员——23 分钟阅读

想把马变成斑马?制作 DIY 动漫人物或名人?生成敌对网络是你新的最好的朋友。

成为 3.0 级数据科学家

作者:简·扎瓦日基 — 9 分钟阅读

想成为大三,大四,还是首席数据科学家?了解在数据科学职业竞赛中你需要做些什么

数据科学家是思想家

通过康纳·杜威 — 4 分钟阅读

数据科学家服务于一个非常技术性的目的,但与其他个人贡献者有很大不同。与工程师、设计师和项目经理不同,数据科学家是探索优先,而不是执行优先。

利用蚁群和遗传进化优化拼车出行时长

由詹姆斯·勒 — 13 分钟读完

城市交通正在经历一场快速而重大的变革。自从互联网和智能手机诞生以来,我们的联系越来越紧密,并且能够规划和优化我们的日常通勤。

每周精选—2019 年 5 月 24 日

原文:https://towardsdatascience.com/weekly-selection-may-24-2019-9243d3238db3?source=collection_archive---------33-----------------------

安静的半监督革命

由文森特·万霍克 — 5 分钟阅读

对于机器学习工程师来说,最熟悉的设置之一是访问大量数据,但只有少量资源来注释这些数据。

我如何从一名记者成为一名数据科学家

由姚洋 — 5 分钟读完

我应该从哪里开始?我想我会从最近的开始。我目前是埃森哲人工智能实验室的研究数据科学家,我们做 ML 研究,我们制作它们的原型。

带图片和代码的拉格朗日乘子

通过 Rohit Pandey — 16 分钟阅读

在这个故事中,我们将通过拉格朗日乘数进行一次空中优化之旅。我们什么时候需要它们?每当我们遇到有约束的优化问题时。

使用自定义实体提取解析结构化文档

戴尔·马科维茨 — 6 分钟阅读

实体提取(EE)对于解析结构化文档也很有用,比如表单、w4、收据、名片和餐馆菜单(这就是我们今天要用的)。

精确度和召回率的权衡和多重假设检验

由贾科莫·维亚内洛 — 17 分钟阅读

在我之前的天体物理学家工作中,我致力于探测释放出惊人能量的大型恒星爆炸。

LSTM 喀拉斯极端罕见事件分类自动编码器

通过 Chitta Ranjan — 13 分钟读取

在这里,我们将学习 LSTM 模型的数据准备的细节,并为罕见事件分类建立一个 LSTM 自动编码器。

用 Python 优化:如何用最少的风险赚最多的钱?

由 Tirthajyoti Sarkar — 7 分钟阅读

我们展示了如何将获得诺贝尔奖的经济理论应用于股票市场,并使用简单的 Python 编程解决由此产生的优化问题。

搭车人特征提取指南

Rahul Agarwal — 13 分钟阅读

好的特征是任何机器学习模型的支柱。好的特性创建通常需要领域知识、创造力和大量时间。

辛普森一家遭遇数据可视化

由亚当·里夫斯曼—9 分钟阅读

没有什么比《辛普森一家》更让我喜欢的了。这是我每天都在思考的节目之一。三十季 600 多集的动画喜剧在我心中占有特殊的位置。

预测 Instagram 帖子的受欢迎程度

由古伊列梅·雷戈斯·萨莫拉诺 — 16 分钟读完

使用混合输入神经网络实现对 Instagram 受欢迎程度的巨大预测。

每周精选—2019 年 5 月 3 日

原文:https://towardsdatascience.com/weekly-selection-may-3-2019-5759ca88f6e4?source=collection_archive---------26-----------------------

我如何通过谷歌云专业数据工程师认证考试

丹尼尔·伯克 — 10 分钟阅读

在过去的几个月里,我一直在使用谷歌云参加课程,为专业数据工程师考试做准备。然后我就拿了。我通过了。几周后,我的连帽衫到了。证书来得更快。

五个机器学习悖论将改变你对数据的思考方式

由耶稣罗德里格斯 — 8 分钟阅读

悖论是人类认知的奇迹之一,很难用数学和统计学来解释。从概念上来说,悖论是一种基于问题的原始前提得出明显自相矛盾的结论的陈述。

使用 Pandas-Profiling 加速您的探索性数据分析

由 Lukas Frei — 5 分钟阅读

第一次导入新的数据集时,首先要做的是理解数据。这包括确定特定预测值的范围、识别每个预测值的数据类型以及计算每个预测值缺失值的数量或百分比等步骤。

使用深度强化学习创建比特币交易机器人

由亚当·金 — 12 分钟读完

在本文中,我们将创建深度强化学习代理,学习如何通过比特币交易赚钱。在本教程中,我们将使用 OpenAI 的gym和来自stable-baselines库的 PPO 代理,后者是 OpenAI 的baselines库的一个分支。

迄今为止我在媒体上的数据科学博客之旅

由拉胡尔·阿加瓦尔 — 9 分钟读完

我第一次开始写博客是在 2014 年。我仍然记得我的第一篇博文。这是一场灾难。但我记得它帮助了一些人。这可能是一个好的开始。

学习数据科学最快的方法

由丽贝卡·维克里——5 分钟阅读

当我第一次开始在 medium 上写关于数据科学的博客时,我写了一系列描述学习数据科学的完整路线图的文章。我在很大程度上自学了数据科学,在过去的几年里,通过反复试验,我找到了一些快速有效学习的好方法。

在 Python 中使用 CSV、JSON 和 XML 的简单方法

乔治·赛义夫 — 4 分钟阅读

Python 卓越的灵活性和易用性使其成为最受欢迎的编程语言之一,尤其是对数据科学家而言。其中很大一部分是因为处理大型数据集是多么简单。

Python for Finance:Robo Advisor 版

凯文·博勒——14 分钟阅读

在这个系列的继续中,我将提供 Robo Advisors 的概述,然后分享关于如何评估多样化指数策略的额外代码和细节。

每周精选—2019 年 5 月 31 日

原文:https://towardsdatascience.com/weekly-selection-may-31-2019-62d38fc6644e?source=collection_archive---------28-----------------------

测量等变卷积网络的简单指南

由迈克尔·基斯纳 — 12 分钟阅读

几何深度学习是一个非常令人兴奋的新领域,但它的数学正在慢慢漂移到代数拓扑和理论物理的领域。

我从 fast.ai v3 学到的 10 个新东西

由莱米·卡里姆 — 14 分钟读取

每个人都在谈论 fast.ai 大规模开放在线课程(MOOC ),所以我决定试试他们 2019 年的深度学习课程《程序员实用深度学习》v3。

用于热门歌曲预测的数据科学

通过 Dorien Herremans — 6 分钟阅读

算法能预测热门歌曲吗?让我们来探索如何仅使用音频特征成功构建热门歌曲分类器,如我的出版物中所述(Herremans 等人,2014)。

10 Python 图像处理工具。

通过 Parul Pandey — 7 分钟读取

概述了一些常用的 Python 库,它们提供了一种简单直观的方法来转换图像。

为什么 Swift 可能是深度学习领域的下一个大事件

通过最大 Pechyonkin — 5 分钟读取

如果你对深度学习感兴趣,那么 Swift 是一门你应该开始学习的语言

估值器、损失函数、优化器——最大似然算法的核心

由 Javaid Nabi — 13 分钟读完

为了理解机器学习算法如何从数据中学习以预测结果,理解训练算法所涉及的基本概念是必不可少的。

[创建学术级数据集的明确指南

以及行业要求和限制](/the-definite-guide-for-creating-an-academic-level-dataset-with-industry-requirements-and-6db446a26cb2)

由奥里·科恩——13 分钟阅读
创建你自己的数据的指导方针,伴随着有价值的信息来帮助你做关键决定。

12 分钟:熊猫和 Scikit 的股票分析——学习

文森特·塔坦(Vincent Tatan)—12 分钟阅读

使用 Python 快速分析、可视化和预测股票价格

何时和何时不进行 A/B 测试

由尼古拉·施里弗

分裂测试与多臂土匪:模拟,源代码和现成的应用程序

创建时间序列预测的基本原则

由莱安德罗·拉贝罗——21 分钟阅读

解释创建时间序列预测的基本步骤。

每周精选—2019 年 9 月 13 日

原文:https://towardsdatascience.com/weekly-selection-september-13-2019-37f033f30859?source=collection_archive---------16-----------------------

更新:2019 年 9 月 20 日起,我们的每周精选将被我们的每周文摘取代。我们的文摘将为读者提供个性化推荐,并将 直接发送到您的收件箱 。你可以通过我们的媒体出版物订阅。

第一胎婴儿更容易晚育吗?

艾伦·唐尼——5 分钟阅读

是的,也更有可能是早期的。但只是一点点。

有条件的爱:调节神经网络的重正化技术的兴起

由科迪·玛丽·怀尔德——21 分钟阅读

批处理规范化,以及围绕它成长起来的相关规范化策略的动物园,在最近的深度学习研究中扮演了一系列有趣的角色…

数据科学和数据工程之间的细微差别🎧

由杰瑞米·哈里斯、爱德华·哈里斯和拉塞尔·波拉里 — 3 分钟阅读

阿克谢·辛格在 TDS 播客上

你是哪种口味的数据专业人士?

由凯西·科济尔科夫 — 7 分钟读完

扩展数据科学领域的实地指南

纽约的咖啡趋势

由纳森·伯恩斯 — 14 分钟读完

建立一个模拟器来分析枫糖浆咖啡的趋势

数据科学很无聊

由伊恩肖 — 9 分钟读完

我如何应对部署机器学习的无聊日子

机器学习驱动的内容审核:Expedia 的计算机视觉应用

由 Shervin Minaee — 11 分钟阅读

如何在深度学习中使用最先进的技术,建立一个高度定制的人工智能框架来进行内容审核。

数据科学家可用于生产质量代码的 3 种 Python 工具

由 Genevieve Hayes — 7 分钟阅读

仅仅因为你是数据科学家,并不意味着你不应该写好代码

什么是深度学习,它是如何工作的?

安妮·邦纳 — 13 分钟阅读

坐下来,放松,对人工神经网络、梯度下降、反向传播等酷概念感到舒适。

构建机器学习系统的六个重要步骤

拉胡尔·阿加瓦尔 — 9 分钟阅读

思考 ML 项目的现场指南

用简单的 Python 例子揭开假设检验的神秘面纱

通过 Tirthajyoti Sarkar — 11 分钟读取

假设检验是推断统计学的基础,也是数据科学家的一项重要技能。我们用非常简单的 Python 脚本来演示这个概念。

30 个有用的 Python 片段,你可以在 30 秒内学会

由法托斯·莫里纳 — 4 分钟阅读

Python 代表了最流行的语言之一,许多人在数据科学和机器学习、web 开发、脚本、自动化等领域使用它。

每周精选—2019 年 9 月 6 日

原文:https://towardsdatascience.com/weekly-selection-september-6-2019-a38200839566?source=collection_archive---------29-----------------------

伟大的开发人员从不停止学习

由 Semi Koen — 10 分钟读取

it 专业人员培养持续学习心态的 7 种方法

我在一次单人高尔夫球比赛中获得第一枚金牌的故事:完成的事情和吸取的教训

安德鲁·卢克亚年科——7 分钟阅读

或者一个关于伟大团队的故事

使用 Pandas、Matplotlib 和 lyve 分析巴塞罗那的车祸

阿曼达·伊格莱西亚斯·莫雷诺 10 分钟阅读

巴塞罗那开放数据是巴塞罗那的数据服务,包含约 400 个数据集,涵盖广泛的主题,如人口,商业或住房。

数据科学家的非技术性职业技能🎧

由杰瑞米·哈里斯 — 3 分钟阅读

苏珊·霍尔科姆在 TDS 播客上

用 Python 学习机器学习和数据科学的 5 个初学者友好步骤

丹尼尔·伯克 — 7 分钟阅读

“我想学机器学习和人工智能,从哪里开始?”给你。

我训练一个网络像我一样说话

由迈尔·杨奇煜 — 8 分钟阅读

而结局真的很搞笑。语言生成指南。

把图表放到 Instagram 上教会了我什么关于数据科学的知识

雷切尔·伍兹 — 6 分钟阅读

今年早些时候,我创建了一个关于葡萄酒数据的 Instagram。

自动寻找最适合你的神经网络

由乔治·赛义夫 — 6 分钟阅读

自 2014 年在 NIPS 上首次发明和发表以来,生成对抗网络(GANs)一直是深度学习中的一个热门话题。

作为初创公司的第一个数据工程师,我学到了什么

通过 André Sionek — 9 分钟阅读

作为一家初创公司的第一位数据工程师,而不是以前的数据工程师,是一项挑战,但也是值得的。以下是我从中学到的东西。

如何用 Python 从头编码高斯混合模型

由 Thalles Silva — 6 分钟阅读

使用 NumPy 的 GMMs 和最大似然优化

重量不可知的神经网络

原文:https://towardsdatascience.com/weight-agnostic-neural-networks-fce8120ee829?source=collection_archive---------16-----------------------

你有没有想过为什么大多数哺乳动物出生后就能完成相当复杂的任务,比如走路?他们还没有时间体验这个世界,所以他们显然还没有学会如何表演动作。他们的大脑必须预先布线才能行走,但如果大脑结构依赖于特定的重量,那么从经验中学习的个体可能在出生后不久就失去行动能力,或者永远不会有能力开始。

受此启发,亚当·盖尔和大卫·哈向世界介绍了重量不可知神经网络 (WANN),这是一种开发神经网络的进化策略,可以独立于连接的重量执行任务

在这篇文章中,我们将简要介绍重量不可知的神经网络,并使用代码实现在月球着陆器健身房环境中训练我们自己的 WANNs。

整洁的

本文的进化策略是建立在 神经进化的扩充拓扑 (NEAT)之上的。NEAT 是遗传算法 (GA)的一种,通过改变智能体的结构对其进行变异:可以添加或删除节点和连接,可以改变节点和连接权重的激活函数;换句话说,它们的拓扑的扩充

代理,在这种情况下是神经网络,根据他们在特定任务中的表现进行排序。

沃恩

本文的目的是使用 NEAT 的进化策略来开发网络,该网络在给定的任务和一定的权重值范围内表现良好。不同于标准反向传播中使用精确调整的权重来执行任务,网络结构将进化以促进任务解决方案。

作者通过消除连接权重的突变来构建 NEAT,而不是通过增加连接、增加权重或改变节点的激活函数来进化网络。连接权重设置为共享值。

此外,用各种共享权重来评估代理的性能。通过使用性能的平均值对代理进行排序,可以开发出这样的网络,在该网络中,结构使得任务能够被完成,而不是权重

探索代码

作者开源了他们的代码,你可以在 Google GitHub 上找到。我们将使用这个代码的改编版本来训练和探测网络。

WANN 进化策略的本质产生了具有许多跳跃连接的稀疏网络。这种结构不容易与 PyTorch 和 TensorFlow 等流行的 ML 库兼容,这些库将反向传播作为学习机制。因此,编写代码时没有使用这些库,也没有使用 GPU。然而,由于 WANN generation 评估程序是令人尴尬的并行,正如作者所说,我们可以在训练时使用多核。

注意:如果你不确定你的机器有多少个 CPU 核心,进入系统设置(Windows)或者在终端中输入lscpu(Ubuntu)

首先,我们将探索代码中提供的一个预先训练好的网络。这里有两足步行机、小车回转、搬运环境以及解决 MNIST 问题的“冠军”。

使用git clone https://github.com/TTitcombe/brain-tokyo-workshop.git获取代码的本地副本,并导航到brain-Tokyo-workshop/wann release/prettyNeatWann目录。

作者提供了一系列在健身房环境中预先训练的“冠军”。我们可以运行 CartPoleSwingUp 冠军

*python wann_test.py -p p/swingup.json -i champions/swing.out --nReps 1 --view True*

这段代码运行网络,在[-2,2]范围内的共享权重值之间循环,证明网络能够独立于权重值运行,如下所示。

All shared weight values perform equally, but some perform more equally than others

显然,该模型对所有共享权重值的表现并不一样好,其最佳表现也不是完美的,但是我们对各种权重都有半成功的策略—非 WANN 模型对权重变化的鲁棒性不如此。

最终的适应值表明,尽管在共享权重值上存在一些性能变化,但是无论具体值如何,网络的性能通常都很好。

可视化网络

该团队还提供了可视化网络的代码。我们可以执行一个简短的脚本来查看 SwingUp 冠军:

*import matplotlib.pyplot as pltfrom vis.viewInd import viewInd viewInd("champions/swing.out", "swingup")
plt.show()*

由于稀疏连接和跳跃连接,它比传统的神经网络更混乱,但它更容易解释,因为激活函数和结构已经过显式优化。

该网络最引人注目的特征是x参数(手推车的位置)几乎与计算力的输出节点直接相连,只被一个具有反向激活功能的隐藏神经元截获。这条线的作用是提供一个朝向屏幕中心的力,而不考虑共享重量值的符号:网络已经学会了如何以重量不可知的方式将手推车送到中心。

事实上,这种模式出现了两次;也许网络了解到权重值占据很小的范围,因此不会产生强大的力,因此网络通过加倍模式来加倍向内的力。如果是这种情况,网络并不完全是权重不可知的,但是在更大范围的权重值上训练网络可以补救这一点。

第二,几个节点经过一个早期层中具有高斯激活函数的节点。高斯激活函数关于 y 轴对称,因此对于 x-x: 输出相同的结果。该节点对于权重的符号是不可知的。

The gaussian activation function

另一个经常出现的激活函数是正弦函数( sin )。其循环模式使得输出在某种程度上与输入幅度无关。具有输入无关区域的激活函数的流行可能是权重不可知论的网络优化的直接结果。

训练我们自己的人

代码为摇摆行走两足行走和一个 MNIST 分类任务提供了训练脚本。我们将在 月球登陆者开放的健身房环境中训练一名 WANN,以证明那些任务并不是因为天生适合 WANN 而选择的。

首先,我们在域配置中创建一个“lunar”任务,指定有 8 个输入和 2 个输出。此外,我们为所有输入和输出神经元设置一个线性激活函数,并允许隐藏神经元使用任何激活函数。

然后,我们通过复制“laptop _ swing”配置 json 来定义训练算法的参数,我们称之为“laptop_lunar”,只是将任务从“swingup”更改为“lunar”。该配置文件指定了要运行的代数和群体中的代理数,以及其他因素。我们只是运行一个轻量级实验来演示如何做到这一点,所以我们可以保持参数较小。

现在,我们开始训练:

*python wann_train.py -p p/laptop_lunar.json -n 2 -o lunar*

指定应该使用我的两个内核;如果你有更多,就用它们。

在我那台有点过时的 i7 上,平均每一代运行一分钟左右(这开始于 10 秒,但随着网络越来越擅长这项任务而稳步增长,因此不会很快失败)。结果,我只完成了 300 个纪元,就不得不占用我的 CPU 来完成其他任务。然而,网络很早就成功地完成了这项任务:300 个周期后,着陆器可以安全着陆。

结论和后续步骤

权重不可知的神经网络论文提出了一种通过在网络结构中直接编码解决方案来开发更多可解释网络的方法。与反向传播相比,WANNs 对节点输入的变化具有很强的鲁棒性,这可以形成对恶意攻击甚至是破坏网络的强大防御的基础。

为了那些致力于人工智能的人,WANNs 向我们展示了一种编码智慧和行为的方法,就像在动物王国里发生的一样。

从一开始就为代理人提供非零智能,可以让他们比其他方式更快地利用自己的经验。我很有兴趣看到通过反向传播对 WANNs 进行微调与从头开始训练模型进行比较。

神经网络中的权重初始化:从基础到明凯的旅程

原文:https://towardsdatascience.com/weight-initialization-in-neural-networks-a-journey-from-the-basics-to-kaiming-954fb9b47c79?source=collection_archive---------1-----------------------

我想邀请你和我一起探索初始化神经网络层权重的不同方法。一步一步地,通过各种简短的实验和思考练习,我们将发现为什么足够的权重初始化在训练深度神经网络中如此重要。在这一过程中,我们将涵盖研究人员多年来提出的各种方法,并最终深入探讨最适合您最有可能使用的当代网络架构的方法。

下面的例子来自我自己对一套笔记本的重新实现,这套笔记本是杰瑞米·霍华德在fast . ai 深度学习第二部分课程的最新版本中涵盖的,目前正在 2019 年春天在 USF 的数据研究所举行。

为什么要初始化权重

权重初始化的目的是防止层激活输出在正向通过深度神经网络的过程中爆炸或消失。如果出现任何一种情况,损耗梯度要么过大,要么过小,不利于回流,网络将需要更长时间才能收敛,如果网络能够收敛的话。

矩阵乘法是神经网络的基本数学运算。在具有几层的深度神经网络中,一次正向传递只需要在每层的输入和权重矩阵之间执行连续的矩阵乘法。一层的乘法结果成为下一层的输入,以此类推。

为了说明这一点,让我们假设我们有一个包含一些网络输入的向量 x 。在训练神经网络时,这是标准做法,以确保我们的输入值按比例调整,使它们落入均值为 0、标准差为 1 的正态分布中。

让我们假设我们有一个简单的 100 层网络,没有激活,并且每一层都有一个矩阵 a 包含该层的权重。为了完成一次前向传递,我们必须在 100 层中的每一层执行层输入和权重之间的矩阵乘法,这将产生总计 100 次连续矩阵乘法。

事实证明,从我们将输入缩放到的同一标准正态分布初始化图层权重值从来都不是一个好主意。为了了解原因,我们可以通过我们假设的网络模拟一次向前传递。

哇哦。在这 100 次乘法中的某处,层输出变得如此之大,以至于计算机都无法识别它们的标准差和平均值。我们实际上可以看到这发生了多长时间。

激活输出在我们网络的 29 层内爆炸。我们显然将权重初始化得太大了。

不幸的是,我们还必须担心防止图层输出消失。为了了解当我们将网络权重初始化得过小时会发生什么情况,我们将调整权重值,这样,虽然它们仍处于平均值为 0 的正态分布中,但它们的标准偏差为 0.01。

在上述假设的向前传递过程中,激活输出完全消失。

综上所述,如果权重初始化过大,网络学习效果不会很好。当权重初始化过小时,也会发生同样的情况。

如何才能找到最佳点?

请记住,如上所述,完成神经网络正向传递所需的数学只需要一系列矩阵乘法。如果我们有一个输出 y ,它是我们的输入向量 x 和权重矩阵 a 之间的矩阵乘法的乘积,则 y 中的每个元素 i 被定义为

其中 i 是权重矩阵 a 的给定行索引, k 既是权重矩阵 a 的给定列索引,也是输入向量 x 的元素索引, nx 中元素的范围或总数。这也可以在 Python 中定义为:

y[i] = sum([c*d for c,d in zip(a[i], x)])

我们可以证明,在给定的层,我们从标准正态分布初始化的输入矩阵 x 和权重矩阵 a 的矩阵乘积,平均起来,具有非常接近输入连接数量的平方根的标准偏差,在我们的示例中为√512。

如果我们从矩阵乘法是如何定义的角度来看待它,这一特性并不令人惊讶:为了计算 y ,我们对输入 x 的一个元素与一列权重 a 的逐元素乘法的 512 个乘积求和。在我们的示例中,使用标准正态分布对 xa 进行初始化,这 512 个产品中的每一个的平均值为 0,标准差为 1。

因此,这 512 个产品的的平均值为 0,方差为 512,因此标准差为√512。

这就是为什么在上面的例子中,我们看到我们的层输出在 29 次连续矩阵乘法后爆炸。在我们最基本的 100 层网络架构的情况下,我们希望每层的输出具有大约 1 的标准偏差。可以想象,这将允许我们在尽可能多的网络层上重复矩阵乘法,而不会出现激活爆炸或消失。

如果我们首先通过将所有随机选择的值除以√512 来缩放权重矩阵 a ,填充输出 y 的一个元素的逐元素乘法现在平均起来只有 1/√512 的方差。

这意味着矩阵 y 的标准偏差将是 1,该矩阵包含通过输入 x 和权重 a 之间的矩阵乘法生成的 512 个值中的每一个。让我们用实验来证实这一点。

现在让我们重新运行我们的快速和肮脏的 100 层网络。与之前一样,我们首先从[-1,1]内的标准正态分布中随机选择层权重,但这次我们将这些权重缩放 1/√ n ,其中 n 是一层的网络输入连接数,在我们的示例中为 512。

成功!我们的层输出既没有爆炸也没有消失,即使在我们假设的 100 层之后。

虽然乍一看,我们似乎可以到此为止了,但现实世界的神经网络并不像我们的第一个例子所显示的那样简单。为了简单起见,省略了激活函数。然而,我们在现实生活中从来不会这样做。正是由于在网络层的末端放置了这些非线性激活函数,深度神经网络能够创建描述现实世界现象的复杂函数的近似逼近,然后这些函数可以用于生成令人震惊的预测,例如手写样本的分类。

Xavier 初始化

直到几年前,最常用的激活函数都是关于一个给定值对称的,并且其范围渐近地接近与该中点正/负一定距离的值。双曲线正切函数和软设计函数就是这类激活的例子。

Tanh and softsign activation functions. Credit: Sefik Ilkin Serengil’s blog.

我们将在假设的 100 层网络的每一层后添加一个双曲正切激活函数,然后看看当我们使用我们自己开发的权重初始化方案时会发生什么,其中层权重按 1/√ n.

第 100 层的激活输出的标准偏差下降到大约 0.06。这绝对是小的方面,但至少激活没有完全消失!

回想起来,发现我们的本土体重初始化策略的旅程似乎很直观,但您可能会惊讶地听到,直到 2010 年,这还不是初始化体重层的常规方法。

当 Xavier Glorot 和 Yoshua Bengio 发表了他们题为 理解训练深度前馈神经网络 的难度的里程碑式论文时,他们将其实验与“常用的启发式方法”进行比较,该方法是从[-1,1]中的均匀分布初始化权重,然后按 1/√ n 进行缩放。

事实证明,这种“标准”方法实际上并不那么有效。

用“标准”权重初始化重新运行我们的 100 层双曲正切网络导致激活梯度变得极小——它们几乎就像消失了一样。

这种糟糕的性能实际上促使 Glorot 和 Bengio 提出了他们自己的权重初始化策略,他们在论文中称之为“规范化初始化”,现在被普遍称为“Xavier 初始化”。

Xavier 初始化将层的权重设置为从随机均匀分布中选择的值,该分布介于

其中 nᵢ 是该层的传入网络连接数,或称“扇入”,而 nᵢ₊₁ 是该层的传出网络连接数,也称为“扇出”

Glorot 和 Bengio 认为 Xavier 权重初始化将保持激活的方差和反向传播的梯度沿着网络的层向上或向下。在他们的实验中,他们观察到 Xavier 初始化使 5 层网络能够在各层之间保持几乎相同的权重梯度方差。

With Xavier init. Credit: Glorot & Bengio.

相反,使用“标准”初始化导致网络较低层的权重梯度(较高)和最高层的权重梯度(接近于零)之间的方差差距更大。

Without Xavier init. Credit: Glorot & Bengio.

为了证明这一点,Glorot 和 Bengio 证明了用 Xavier 初始化的网络在 CIFAR-10 图像分类任务中实现了更快的收敛和更高的精度。

让我们再次运行我们的 100 层 tanh 网络,这次使用 Xavier 初始化:

在我们的实验网络中,Xavier 初始化的执行与我们之前导出的自制方法完全相同,在该方法中,我们从随机正态分布中采样值,并根据传入网络连接数的平方根进行缩放, n

明凯初始化

从概念上讲,当使用关于零对称且输出在[-1,1]内的激活函数(如 softsign 和 tanh)时,我们希望每层的激活输出平均值为 0,平均标准偏差约为 1。这正是我们自己开发的方法和 Xavier 所实现的。

但是如果我们使用 ReLU 激活函数呢?想要以同样的方式缩放随机初始权重值还有意义吗?

ReLU activation function. Credit: Kanchan Sarkar’s blog.

为了了解会发生什么,让我们在假设的网络层中使用 ReLU 激活代替 tanh,并观察其输出的预期标准偏差。

事实证明,当使用 ReLU 激活时,单个层的平均标准偏差非常接近输入连接数目的平方根除以两个的平方根,或者我们示例中的√512/√2。

通过这个数字缩放权重矩阵 a 的值将导致每个单独的 ReLU 层平均具有 1 的标准偏差。

正如我们之前所展示的,将层激活的标准偏差保持在 1 左右将允许我们在深度神经网络中堆叠几个层,而不会出现梯度爆炸或消失。

这种对如何最好地初始化具有类 ReLU 激活的网络中的权重的探索是明凯等人的动机。艾尔。为了提出他们自己的初始化方案,这是为使用这种非对称、非线性激活的深度神经网络定制的。

在他们 2015 年的论文中,何等人。艾尔。证明了如果采用以下输入权重初始化策略,深度网络(例如 22 层 CNN)将更早收敛:

  1. 创建一个张量,其维数适合给定层的权重矩阵,并使用从标准正态分布中随机选择的数字填充它。
  2. 将每个随机选择的数字乘以 2/ √n ,其中 n 是从前一层的输出进入给定层的传入连接数(也称为“扇入”)。
  3. 偏置张量被初始化为零。

我们可以按照这些指导来实现我们自己版本的明凯初始化,并验证如果在我们假设的 100 层网络的所有层使用 ReLU,它确实可以防止激活输出爆炸或消失。

作为最后的比较,下面是如果我们使用 Xavier 初始化会发生什么。

哎哟!当使用 Xavier 初始化权重时,激活输出在第 100 层时几乎完全消失了!

顺便提一下,当他们训练使用 ReLUs 的更深层次的网络时,他等。艾尔。发现一个使用 Xavier 初始化的 30 层 CNN 完全失速,根本不学习。然而,当同一个网络按照上述三步程序初始化时,它的收敛速度大大提高。

Convergence of a 30-layer CNN thanks to Kaiming init. Credit: He et. al.

这个故事对我们的启示是,我们从头开始训练的任何网络,尤其是用于计算机视觉应用的网络,几乎肯定会包含 ReLU 激活功能,并且有几层深度。在这种情况下,明凯应该是我们的首要策略。

是的,你也可以成为一名研究员

更重要的是,我不羞于承认,当我第一次看到泽维尔和明凯公式时,我感到害怕。他们各自的平方根是 6 和 2,我不禁觉得他们一定是某种神谕智慧的结果,我自己无法理解。让我们面对现实吧,有时候深度学习论文中的数学看起来很像象形文字,只是没有 T2 罗塞塔石碑来帮助翻译。

但我认为,我们在这里的旅程向我们表明,这种受到威胁的下意识反应虽然完全可以理解,但绝不是不可避免的。尽管明凯和(尤其是)Xavier 的论文确实包含了相当多的数学内容,但我们亲眼目睹了实验、经验观察和一些简单的常识如何足以帮助推导出支撑当前最广泛使用的权重初始化方案的核心原则集。

换句话说:当有疑问时,鼓起勇气,尝试一下,看看会发生什么!

欢迎来到森林。伦敦文化区 2019 推特分析

原文:https://towardsdatascience.com/welcome-to-the-forest-london-borough-of-culture-2019-twitter-analysis-9ea25cf4f033?source=collection_archive---------20-----------------------

欢迎来到森林。我们有乐趣和游戏!

上周末,2019 年 1 月 11 日星期五至 1 月 13 日星期日,伦敦的沃尔瑟姆森林区举办了为期三天的大型活动,庆祝被选为有史以来第一个市长伦敦文化区。该活动名为欢迎来到森林,被描述为“沃尔瑟姆森林有史以来最大的派对,每个人都被邀请”。

家庭和孩子聚集在森林里,伦敦市长萨迪克·汗和主管文化的副市长贾丝汀·西蒙斯和他们所有的伙伴也是如此!数百名来自当地艺术机构和音乐家的人士也做出了贡献。听起来很有趣,对吧?

事实上,每个人都被邀请了,但不幸的是,我没能参加聚会!因此,为了克服我的 FOMO,我决定使用官方标签#WelcometotheForest 收集 3300 条关于该活动的推文。这篇博文展示了我的分析结果。

请向下滚动,通过数据可视化查看我的分析!

数据和方法

组织者推广的官方标签是#WelcometotheForest。在事件发生时,我使用 Twitter API 收集了 3300 条包含这个标签的推文。需要注意的是,我只收集了包含# WelcometotheForest 的推文。当然,有许多关于欢迎来到森林的推文不包含这个标签。

在收集了这些推文之后,我运用了一系列先进的统计和机器学习技术——特别是自然语言处理和计算机视觉——来帮助我更详细地了解这个事件。

具体来说,我使用谷歌云自然语言 API 来计算每条推文的情感,然后我使用 gensim 库的 Word2Vec 模型来对推文的整个语料库进行语义分析,此外,我还使用谷歌云的视觉 API 来检测关于在线上传的每张图像的特征和标签,最后,我使用预训练的卷积神经网络来进行特征提取和反向图像搜索,以基于视觉相似性对这些图像进行聚类。

多拗口啊!

分析推文

我分析的主要内容来自我通过 Twitter API 收集的 3300 条推文。下面,我报告以下五个指标:

  1. 每天和每小时的推文数量;
  2. 每天推文的平均情绪;
  3. 推文中排名前 10 的单词和标签;
  4. 基于语义学习的“WelcometotheForest”热门词汇:
  5. 基于视觉相似性的《欢迎来到森林》最受欢迎的图片。

推特频率

下面的条形图显示了从活动前的周三到活动后的周三(1 月 9 日至 16 日)的所有推文。“欢迎来到森林”最受欢迎的一天是 1 月 11 日星期五,有 932 条推特使用标签#WelcometotheForest。然而,很大一部分推文(全天平均 66%)是转发推文,因此在 1 月 11 日星期五实际上只有 364 条不同的推文。

Bar chart showing the number of tweets by day during the festival

一天中最繁忙的时间(活动当天的平均时间)是晚上 7 点到 10 点之间,晚上 8 点是最繁忙的时间,总共有 324 条推文(185 条没有转发)。

Bar chart showing the average tweets per hour

情感分析

为了判断派对是好是坏,我进行了情绪分析。每条推文的情绪是使用谷歌的云 NLP API 计算的。下面的条形图显示了每天推文的平均情绪,其中-1 表示非常消极的情绪,+1 表示非常积极的情绪。

我们看到,对森林的欢迎始于相对较高的情绪,在 1 月 10 日星期四有所下降,直到一路攀升至 0.73 的非常强烈的情绪。总体而言,《欢迎来到森林》全天的平均人气为 0.57,非常好!看来我错过了很多乐趣…

Line chart showing the average sentiment of the tweets per day

文本频率分析和热门标签

下面的柱状图显示了一个词和一个标签在所有推文的正文中出现的次数,分别在左边和右边。值得注意的是,因为标签也出现在推文的正文中,所以在计算词频时,它们成为了一个混淆变量。因此,我采取措施将 hashtag 计数从单词计数中移除。

Bar graphs showing the count of words and hashtags appearing in all the tweets

不出所料,标签#welcometotheforest 出现得最多,然而有趣的是,标签#wfculture19 和#mylocalculture 也大量出现。即使在扣除标签数后,“wfculture19”这个词出现的次数最多,其次是“culture”,但“wfcouncil”和“erlandcooper”也获得了一些好评!

我在谷歌上快速搜索了一下这条信息,发现#wfculture19 和#mylocalculture 是官方标签,由沃尔瑟姆森林委员会的和伦敦市长文化团队的的推特账户推广。

然而,上述结果对于告诉我们人们对该事件的看法并不十分有用。在上面的子集里,我们只找到名词而不是形容词。因此,我使用其他机器学习技术来尝试挖掘一些形容词。

语义

为了从推文中获得更细致的文本理解,我使用自然语言处理和机器学习进行了语义分析。

Word2Vec 是一个神经语言机器学习模型,它将大量文本(在这种情况下,来自 3300 条推文的文本)作为输入,并输出一个向量空间,通常有数百个维度,每个唯一的单词对应于空间中的一个向量——一个单词嵌入。具体来说,空间中距离较近的物体意味着它们是相似的。“最近邻居”是来自 Word2Vec 模型的少数几个基于余弦度量相似性得分与“ WelcometotheForest 最相似的单词。下面的散点图显示了“欢迎来到森林”的最近邻居。

重要的是,“妙不可言”、“好玩”、、【享受】、【得意】这些词就在身边,还有、【孩子】、、【家庭】、、【牵连】。这是一个非常积极的结果!统计数据表明,这些词最能代表人们在推特上谈论“欢迎来到森林”时的感受。这似乎是一个非常愉快和包容的事件!

PCA output of the nearest neighbours of #WelcometotheForest from the Word2Vec model

最受欢迎的艺术品

在从推文中检索有用的文本信息后,我最终转向了图像数据。总共 3300 条推文中有 732 条附有图片。利用这些图像,我给电脑编了程序来学习它们之间的视觉相似性。一种叫做特征提取和逆向图像搜索的技术正是这样做的。

使用在 TensorFlow 后端上运行的 Keras VGG16 神经网络模型,我首先为数据集中的每张图像提取了一个特征。一个特征是每个图像的 4096 元素的数字数组。我们的期望是“该特征形成图像的非常好的表示,使得相似的图像将具有相似的特征”(吉恩·科岗,2018 )。然后使用主成分分析(PCA)降低特征的维度以创建嵌入,并且计算一个图像的 PCA 嵌入到另一个图像的距离余弦距离。

现在我已经在向量空间中嵌入了每个图像,我使用了一个流行的叫做 t-SNE 的机器学习可视化算法来聚类,然后在二维空间中可视化向量空间。“tSNE 的目标是对相似数据点的小“邻域”进行聚类,同时降低数据的整体维度,以便更容易可视化”(谷歌人工智能博客,2018)。

The clustering of images of Welcome to the Forest 2019. Source: Twitter

上图显示右上角的棉花糖激光盛宴对的聚类非常好,右下角的进入森林由Greenaway&Greenaway进行聚类。

结论

所以你有它!虽然坐在我的笔记本电脑前做关于派对的研究并不能弥补我错过的所有乐趣,但我确实学到了很多关于这个活动的东西!进一步挖掘推文仍有巨大的潜力。

祝贺这样一个伟大的事件和成就,并祝今年余下的时间里伦敦文化区一切顺利!

感谢您的阅读!

Vishal

Vishal 是一名文化数据科学家,也是伦敦 UCL 学院*的研究生。他对城市文化的经济和社会影响感兴趣。你可以在Twitter或者LinkedIn上与他取得联系。在insta gram或他的* 网站 上看到更多 Vishal 的作品。

提及:西奥·布莱克威尔,创建联营公司,智能伦敦,伦敦博物馆,卫报

关于数据科学和欺诈建模,两个人和一个跑步者教会了我什么

原文:https://towardsdatascience.com/what-2-men-and-a-runner-taught-me-about-data-science-and-fraud-modeling-5523007f82a8?source=collection_archive---------30-----------------------

昨晚当我结束工作时,外面开始出现黑暗。我决定在邻近的跑道上跑一会儿,希望能跑八圈。那次跑步结果发生了转折,给我上了有趣的一课。

在跑道上,可以看到一些人在散步和伸展身体。我开始跑步。当我在第六回合时,我看到两个大个子在铁轨上漫步,挡住了它。我在轨道的另一边,周围看不到任何人。虽然我鼓起了一些勇气,通过了这些人,但我感到有点威胁。他们的出现让我觉得有必要缩短跑步时间,从公园里出来。但就在那时,我看到一个人带着一只我之前经过的狗,站在引体向上栏旁边。

一种冲动悄然而至,我在那个人旁边停下来,问他是否愿意在那里呆五分钟。他作了肯定的回答,但开始了询问。

–“为什么?”他问。

当我试图想出一个答案来解释我的困境时,那两个魁梧的男人走过,我的目光不由自主地跟着他们。

–我咕哝道,“因为,呃…。”

–“好吧。我会的,”他说,在理解了我的焦虑之后,中途打断了我。

得到保证后,我平静地完成了最后两首曲子。我谢过那个带着狗的人,开始了回家的旅程。就在那时,我突然意识到,这一事件与我们为一个客户构建的欺诈模型极其相似。

与我在公园时的预感类似,统计模型给每个账户标上了一个概率,即相关人员是否有可能实施欺诈。就像我的预感一样,这可能是一场虚惊,欺诈标记也可能是也可能不是绝对正确的。

虽然使用统计方法建立的欺诈模型的可能性确实要低得多,但它们仍然有假阳性——该模型错误地将某人标记为欺诈者,而他可能不是。

为了阐明这个问题,让我们考虑一下银行。他们用一种经典的方式来对付可能的诈骗犯:把他们拒之门外。通过这样做,他们也在对潜在的好客户说“不”——这是他们非常熟悉的事实。这导致了一个两难的局面:为了挽回损失,他们也失去了收入。

这相当于我因为有可能受到威胁而想缩短我的行程。但是,如果这些公司做了我最终决定付诸行动的事情——标记欺诈者,给他们有限的功能(类似于那个家伙和他的狗盯着我,从而降低风险),并看看他们是否真的是欺诈者。这将确保“好”人能够继续进来,同时减少因欺诈造成的损失。

事实上,许多银行和金融科技公司现在已经开始采用这种管理风险和欺诈的方法——给予所有合格客户有限的功能和访问权限,并让他们证明自己的信用或波段价值,以便随着时间的推移获得额外的功能。

在 Aryng,我们的数据科学 SWAT 团队一直在利用数据提高收入和减少损失,同时寻找取悦最终用户的新方法。如果您在欺诈或其他高价值客户分析项目上需要我们的帮助,请联系我们进行免费咨询。

感谢你阅读我的帖子。我热衷于使用数据来构建更好的产品和创造令人惊叹的客户体验。我在 LinkedIn 和《福布斯》上写下我的心得。要阅读我未来的帖子,只需在这里 加入我的网络 或点击“关注”或加入我的Twitter

关于皮扬卡·贾恩

piyan ka Jain 是数据分析领域备受推崇的行业思想领袖,也是国际知名的畅销书作家,经常在企业领导峰会和商业会议上发表主题演讲,介绍如何利用数据驱动的决策来获得竞争优势。

在 T21,她领导她的 SWAT 数据科学团队解决复杂的业务问题,开发组织数据素养,并使用机器学习、深度学习和人工智能来实现快速投资回报。她的客户名单包括谷歌、Box、Here、应用材料、雅培实验室、通用电气等公司。作为分析领域备受推崇的行业思想领袖,她为《福布斯》、《哈佛商业评论》和 InsideHR 等出版物撰稿。

70%的数据科学学习者做错了什么

原文:https://towardsdatascience.com/what-70-of-data-science-learners-do-wrong-ac35326219e4?source=collection_archive---------2-----------------------

在大学工程课程中,用 2 米长的金属杆反复砸我的头所得到的教训

我在大学的大部分时间里都在积极寻找辛苦有用的课。但是,到了最后一年,我累了,我想休息一下。所以我在工程系上了一门“有趣”的课,名为“航海物理学”

我们绘制了使帆船比风跑得更快的力的图表。我们学习了船的形状如何使它稳定或不稳定。我已经比大多数同学学了更多的物理。所以,我的家庭作业做得很好,并且认为如果我去航海的话,我会是一个天生的运动员。

我在学期末测试了这个假设,当时我们班去了小马斯科马湖,尝试在一艘真正的船上航行。事情没有像我预期的那样发展

Boats on Mascoma Lake. They aren’t as gentle as they seem.

船感觉倾斜,我对浮力和“扶正手臂”的了解并没有让我留在船上。转弯需要协调多个动作。当我弄错时间时,一根两米长的金属杆(称为吊杆)转过来,击中了我的头部。我头上的吊杆发出的噼啪声每次都让我的耳朵嗡嗡作响几分钟。

学习帆船运动的物理学很有趣,但显然它们对你的实际航行没有帮助。

这和数据科学有什么关系?

正如我在没有学习航海的情况下学习了航海的物理知识一样,大多数数据科学课程都非常详细地讲述了一些算法,而忽略了成功的数据科学项目所需的技能。

企业数据科学仍然是一个新领域。许多学者还没有为真正的企业解决真正的问题。因此,他们以一种脱离数据和商业背景的方式教授教科书算法。这可能是智力上的乐趣。但是,如果学生认为这些课程为他们成为数据科学家做好了准备,那他们就错了。

那么,如何将你的努力集中在实际的重要技能上呢?以下是一些指导原则:

  1. 使用标准的开源库。实用的数据科学依赖于文档完备、经过良好测试并具有良好设计的 API 的库。自己实现替代版本是复杂性(和 bug)的来源,它分散了您对数据和应用模型的上下文的注意力。
  2. 花更多时间查看您的数据,并将其处理成您需要的格式。大多数项目涉及大量的数据操作和相对较少的模型调整。目前正在招聘的朋友告诉我,许多求职者可以描述算法,但绝大多数人缺乏在实际工作中高效工作的熊猫技能。
  3. 了解应用程序环境中的技术。如果你需要技术术语来描述你所学知识的实际相关性,你可能还没有准备好应用它。
  4. 了解如何解释模型输出。例如,您需要了解模型准确性的度量,以知道您是否可以信任一个模型。学习机器学习解释技术,比如排列重要性。
  5. 在你感兴趣的领域建立项目。它可以是关于电影、时事、体育、食物或其他任何东西。这将教会你如何用一种你可以应用技术工具的方式来构建关于世界的模糊问题。这是数据科学家最重要的技能之一。分享你的工作将教会你如何解释和讨论结果,这可能是最重要的技能。
  6. 如果你跳过许多书籍和课程背后的算法理论,那么成为一名数据科学家会很容易吗?号码

关于操作数据、解释数据以及将工具与现实联系起来,还有很多东西需要学习。我有意减少了我教授的抽象理论的数量,以帮助学习者专注于实践技能。我认为这种方法会让你在开始你的严肃项目时,不会打自己的后脑勺。

神经网络对新闻有什么看法

原文:https://towardsdatascience.com/what-a-neural-network-has-to-say-about-the-news-e19d977f6a75?source=collection_archive---------15-----------------------

关于新闻,神经网络可以揭示什么?利用机器学习,我研究了新闻媒体中“偏见”的复杂本质,如何在人工智能中无意中出现“对意识形态的理解”,以及“声音”的差异如何影响人们消费信息的方式[1][2]。受博士漫画的启发,这个“1 页论文挑战”总结了我最近的论文(看这里)。

News agency relationships where line thickness is proportional to similarity.

在发现之前,有些前后关系。语言的细微差异揭示了说话者的偏见和身份信息。当然,作者对论点的有意【框架】可以反映他们的观点,但潜意识的用词选择也可以揭示他们的信仰【3】【4】。我想知道,是否像人类一样,一种叫做神经网络的人工智能可以解释这些信号。考虑到这一点,我的电脑阅读了五个月的新闻文章*来学习“语言”模式,这样它就能以 74%的准确率猜出一篇从未见过的文章的出版商。该模型还指出了组织之间的相似性(见网络图片),并揭示了例证机构“声音”的“原型”文章(最“像 CNN”的 CNN 文章)。考虑这些讨论气候的文章的例子:

Articles most like their publishing agency describing climate

尽管研究通常集中在政治上,这个模型强调了新闻中的“声音”和“偏见”并不总是完全符合左与右的光谱。我将我的结果与先前存在的关于媒体意识形态和情绪极性的工作进行了比较(“具有灾难性影响的糟糕政策”带有负极性,而“英雄爱国主义的光荣行动”表现出正极性)[5][7][8]。该模型似乎理解两者的属性,但数据表明,政治或语言的“严重性”都不能单独解释该模型的全部行为[7][8]。上面的范例气候文章可能有助于展示这种复杂性:一个不太极端的情绪极性将《华尔街日报》和《NPR》联合起来,但一个从经济角度看待气候,而另一个则从科学角度看待这个问题。同样,福克斯和 CNN 在模型中有共同之处,尽管之前的工作表明意识形态倾向的差异,非气候样本可能表明这两家机构使用相似的极性语言,并经常讨论犯罪【7】。简而言之,在想象新闻前景时,要考虑到不仅仅是政治决定了一个机构的声音。偏见不仅仅是向左或向右倾斜。

当想象新闻的前景时,要考虑到不仅仅是政治定义了一个机构的声音

这个实验还揭示了意识形态偏见是如何在机器学习中无意间出现的。我没有告诉模型去寻找政治倾向或语境化,但它仍然学习“意识形态特征”(例如,这些可能是对社会主义的积极框架或对暴力的报道倾向)。当人工智能决定用户看到什么时,“推荐者”可能会类似地学习意识形态,并越来越多地显示项目以适应用户的观点。像这样的人工智能可以降低一个来源的文章出现在用户面前的频率,并导致所谓的“过滤气泡”变得比其他情况下更强[9]。尽管系统背后的工程师从来没有打算过,但这些障碍可能会出现,尽管用户订阅了一系列广泛的渠道。类似地,在所有用户看到相同项目的其他 ML 系统中,“非中立性”可以在平台内增长以反映大多数人的偏好。当然,虽然推荐者很好地激发了这些重要的问题,但其他过滤和排名(评论权重或不适当标志)的机器学习产品可以通过接触这种内容,学习检测类似的属性,即使平台希望意识形态中立。综上所述,解决方案是有先例的,但是加强回音室可能会产生更多的点击(金钱),即使是以的共同理解为代价【10】【11】。

像这样的人工智能可以降低一个来源的文章出现在用户面前的频率,并导致所谓的“过滤气泡”变得比其他情况下更强。

尽管如此,可能从我的人工智能中学习的不仅仅是科技公司。再一次,读者被与他们的信仰一致的媒体所吸引,我的工作揭示了一些特征,就像一篇文章的政治倾向一样,可能会类似地强化“媒体消费”(人们从那里获得新闻)[5]的差异。如果这是真的,现代记者不仅需要警惕限制其受众的政治偏见,还需要警惕语气和框架如何吸引一些读者,同时拒绝另一些读者。

** 10 家通讯社发表的文章描述——共约 49k*

至此,我已经到达了我在 LibreOffice 中的页面末尾。值得记住的是,我们对世界的看法是通过我们消费的媒体渠道和越来越多的新闻发布平台形成的。我们这样做不是通过一个平面的物镜,而是通过一个广泛的,可能是无意的视角,这可能危及共同的理解【10】。作为一个社会,我们面临的挑战是巨大的,随着许多选举刚刚发生或即将到来,值得记住的是,计算机在给我们想要的东西方面很棒。然而,考虑你需要什么来做出明智的决定,以及你希望你的技术如何为你工作。最后,研究可以突出问题,但只有选民消费者可以要求改变。

如果你有时间和耐心,有很多细微差别和细节根本不适合在这里,所以我会谦虚地推荐论文本身。即使社交媒体可能会像迷宫般的回音室一样破坏媒体消费,并且根据一些人的说法,危及民主本身,也不要忘记喜欢(鼓掌?)这篇文章和分享。记住,机器人在看着。

想要在数据、设计和系统的交叉领域进行更多的实验吗? 关注我获取更多

文本识别系统实际看到的

原文:https://towardsdatascience.com/what-a-text-recognition-system-actually-sees-6c04864b8a98?source=collection_archive---------7-----------------------

对文本识别系统的神经网络“黑箱”的一些见解

作为神经网络实现的现代文本识别系统的性能令人惊叹。他们可以接受中世纪文件的培训,能够阅读这些文件,而且很少出错。这样的任务对我们大多数人来说是非常困难的:看看图 1,试一试吧!

Fig. 1: Hard to read for most people, but easy for a text recognition system trained on this dataset.

这些系统实际上是如何工作的?这些系统会看图像中的哪些部分来识别文本?他们利用了一些聪明的模式吗?或者他们会使用像数据集特定模式这样的捷径来作弊吗?在下文中,我们将通过两个实验来更好地理解这种神经网络内部发生的事情。

第一个实验:像素相关性

对于我们的第一个实验,我们提出以下问题:给定一个输入图像和正确的类别(真实文本),输入图像中的哪些像素投票支持正确的文本,哪些像素投票反对正确的文本?

我们可以通过比较两种情况下正确类别的分数来计算单个像素对结果的影响:

  1. 该像素包含在图像中。
  2. 从图像中排除该像素(通过边缘化该像素的所有可能的灰度值)。

通过比较这两个分数,我们可以看到一个像素投票赞成还是反对正确的类。图 2 示出了图像中的像素与地面实况文本“are”的相关性。红色像素对文本“are”投赞成票,蓝色像素投反对票。

Fig. 2: Top: input image. Bottom: pixel relevance and blended input image. Red pixels vote for, blue pixels against the correct text “are”.

我们现在可以查看一些关键区域(深红、深蓝),以了解哪些图像特征对神经网络做出决策很重要:

  1. “a”上方的红色区域在输入图像中是白色的,对于正确的结果“are”非常重要。正如你所猜测的,如果一个黑点出现在“a”的垂直线上方,那么这条垂直线可以被解释为“I”。
  2. “r”与“e”相连,混淆了蓝色区域所示的神经网络。如果这两个字符断开,这将增加“are”的分数。
  3. “a”(左下内侧部分)内的灰色像素略投“are”反对票。如果 a 里面的洞完全是白色的,这应该会增加分数。
  4. 在图像的右上方是正确投票的重要区域。不清楚如何解释这个区域。

让我们研究一下我们的假设 1。— 3.都是正确的,4 的含义是什么。通过改变这些区域内的一些像素值。在图 3 中,示出了原始和改变的图像、正确文本的分数以及识别的文本。第一行显示了文本“are”的得分为 0.87 的原始图像。

  1. 如果我们在“a”的垂直线上画一个点,“are”的分数会减少 10 倍,我们得到的是文本“aive”。因此,神经网络大量使用上标点来决定垂直线是“I”还是其他什么。
  2. 去掉“r”和“e”之间的联系,分数增加到 0.96。即使神经网络能够隐式地分割字符,看起来断开的字符简化了任务。
  3. “a”内的洞对于检测“a”很重要,因此将灰色像素与白色像素交换会稍微提高分数至 0.88。
  4. 当将一些灰色像素绘制到图像的右上方区域时,系统识别出“ane”,“are”的分数降低到 0.13。在这种情况下,系统显然已经学习了与文本无关的特征。

Fig. 3: Change some pixels inside critical regions and observe what happens.

总结我们的第一个实验:系统已经学习了一些有意义的文本特征,如上标点来识别字符“I”。但它也学会了一些对我们来说毫无意义的特征。然而,这些特征仍然帮助系统识别它被训练的数据集中的文本:这些特征让系统采取(容易的)捷径,而不是学习真实的文本特征。

第二个实验:平移不变性

平移不变文本识别系统能够正确地识别文本,而与它在图像中的位置无关。图 4 示出了文本的三种不同的水平翻译。我们希望神经网络能够识别所有三个位置的“to”。

Fig. 4: Three horizontal translations of a text.

让我们再次从包含文本“are”的第一个实验中取出我们的图像。我们将把它一个像素一个像素地向右移动,并查看正确类别的分数以及预测文本,如图 5 所示。

Fig. 5: Score for text “are” while shifting the text pixel by pixel to the right. The labels on the x-axis show both the number of pixels the image is shifted and the recognized text (using best path decoding).

可以看出,该系统不是平移不变的。原图得分 0.87。通过将图像向右移动一个像素,分数降低到 0.53。再向右移动一个像素,分数就会降到 0.28。神经网络能够识别正确的文本,直到平移四个像素。之后,系统偶尔会输出错误的结果,从“aare”向右五个像素开始。

在 IAM 数据集上训练神经网络,其中所有单词都是左对齐的。因此,系统从未学会如何处理左边有空白的图像。对我们来说,忽略空白可能是显而易见的——这是一种必须学习的能力。如果系统从未被迫处理这种情况,它为什么要学习呢?

乐谱的另一个有趣的特性是四个像素的周期性。这四个像素等于卷积网络从 128 像素的宽度到 32 的序列长度的缩减因子。该行为是由池层的移动差异引起的。

结论

文本识别系统学习任何有助于提高其被训练的数据集中的准确性的东西。如果一些看起来随机的像素有助于识别正确的类别,那么系统将使用它们。如果系统只需要处理左对齐的文本,那么它将不会学习任何其他类型的对齐方式。有时,它学习我们人类也发现对阅读有用的特征,这些特征概括了广泛的文本样式,但有时它学习只对一个特定数据集有用的快捷方式。

我们必须提供多样化的数据(例如,混合多个数据集或使用数据增强),以确保系统真正学习文本特征,而不仅仅是一些作弊行为。

参考

  • 关于文本识别模型的文章
  • 文本识别模型代码

小数据呢?贝叶斯方差分析解。

原文:https://towardsdatascience.com/what-about-small-data-e8993e06eaca?source=collection_archive---------13-----------------------

什么是小数据?

作为数据科学家,我们接受过处理大数据的培训,通常我们在这个领域非常得心应手。在我们找到答案之前,大数据集让我们可以使用任何数量的工具来刺激和探索。几乎每一种方法都可以处理这些数据,尽管为了让事情正常运转,必须时不时地对其进行处理。尽管回报递减,我们投入的精力越多,得到的就越多。

但是,小数据呢?它是否完全符合我们已经使用的方法?把小数据想象成普通人无需过多处理就能理解的任何东西。例如,他的同事的年龄和他们在公司的当前职位是一个小数据集。如果他的员工群体相对较小,Joe 可以很快看到趋势并发现数据集中的异常值。

看看这个小数据集,它显示了一位评委给来自不同国家的参与者打分。根据我们的定义,似乎我们应该能够从中得出一个直观的结论。

Is this a biased judge?

你认为美国的分数比加拿大和墨西哥高是对的,但是这是一种趋势吗?你能自信地说,从长远来看,美国的得分高于加拿大和墨西哥吗?或者这只是雷达上的一个亮点?乔能否断言年纪较大的员工在公司中拥有更高的职位,或者这也是雷达上的一个光点?

小数据的麻烦就在于此。它很小。我们可以从中得出直观的结论,但当需要利用这些数据做出决策时,我们就陷入了困境。如果你是一名数据科学家或分析师,其工作依赖于从数据中做出正确的判断,这一点尤其正确。那么你应该怎么做呢?如果你的第一个想法是,“我会避免小数据”,那么再想一想!小数据无处不在,迟早你会不得不使用它。事实上,收集一个小数据集有时是最好的途径。它能让你更快地处理数据,让你成为更敏捷的数据科学家。

理解小数据

让我们回到上面的数据集来理解它。想象一下,一名奥运会跳水裁判刚刚被停职,因为他被发现给美国选手的分数高于加拿大和墨西哥选手。他承认了,参加了再培训课程,并签署了一份协议,如果发现他的分数有偏差,就禁止他参加这项运动。该数据集显示了他在四次国际比赛中给予不同国籍参与者的平均分数。你可以假设另一位裁判的分数变化相等,但可能与他的分数不匹配。如果你是为监督跳水裁判的奥委会工作的数据科学家,你有什么建议?

It’s the judge in the middle that we’re worried about. He’s clearly up to no good.

这是一个很大的难题,不是吗?你的直觉告诉你分数有偏差,但你需要证明。你的目标是确定国家之间的平均分数是相同的(H0: 0 = 1 = 2)还是不同的(哈:0 ≠ 1 ≠ 2),这意味着你应该运行方差分析,ANOVA,测试来得出结论。让我们设置α = 0.10,这样我们就有一个低的阈值来继续研究。方差分析的结果如下所示。

The results of ANOVA on the data. p > α, so we accept the null hypothesis.

即使以我们自由派的信心水平,我们也不能拒绝零假设。难道是我们的直觉错了?不一定!我们的直觉是基于这样一个事实,即我们对这个特定法官的行为有先验知识。换句话说,我们倾向于寻找偏见,因为我们有证据表明过去存在偏见。我们遇到的问题是小数据。根本没有足够的数据来否定我们的假设,而且我们也没有办法在这个分析中包含我们的先验知识。在这种情况下,等待获得更多数据会损害竞争对手,并有可能降低观众对公平评判比赛能力的信心。幸运的是,我们没有被卡住。

贝伊斯来救援了。

贝叶斯统计非常适合这个问题。如果你还没有遇到贝叶斯统计,那么我建议你读这篇文章,然后读这篇论文。使用先验信息是贝叶斯统计强大的原因之一。分析像这样的小数据集是可能的,因为我们有输入模型的先验信息。通过使用马尔可夫链蒙特卡罗方法将先验信息耦合到新信息,我们可以推断出新信息符合我们先验理解的可能性。让我们再次运行分析,但是这次使用贝叶斯框架。

Python 中的贝叶斯方差分析

方差分析在功能上等同于使用分类预测的简单线性回归。事实上,方差分析的 F 统计量与仅使用类别作为预测因子的模型的线性回归的 F 统计量完全相同。为了更好地理解正在计算的内容,我们可以利用系数的置信区间,以便在某个置信水平上测试假设。如果每个系数的 95%置信区间重叠,那么我们期望 F 统计量产生 p 值> 0.05。数据的线性回归系数显示了这种关系。

Notice how the confidence intervals overlap? That’s a sign that we can’t reject the null hypothesis.

我们可以使用这些信息,即线性回归相当于 ANOVA,使用 PyMC3 模块在 Python 中运行贝叶斯分析。我的代码复制如下。

这是怎么回事?首先,我加载了一个 PyMC3 模型(pm。模型()作为模型)。然后,我用先验信息填充模型。适马是我们在整个模型中期望的标准差。我将 sigma 设置为来自半柯西分布(标准实践),这将 sigma 限制为大于 0,低值比高值更有可能。参数β设置分布的宽度-值 10 是一个很大的宽度,从 0 到 10 的值基本上是相等的。

然后,我在模型中加入法官过去表现出的偏见。美国、加拿大和墨西哥选手的平均得分非常相似,但他给美国选手的平均得分比加拿大选手高 2 分,比墨西哥选手高 4 分。使用频率主义者的方法很难发现这种微小的差异。

最后,我将可能的结果定义为每个系数乘以为竞争对手国籍编码的虚拟变量的总和,并将其与实际数据 df.Score 进行比较。为了获得结果,我运行了两条马尔可夫链,每条链有 3000 个样本。

我如何确定是否存在偏见?我在 frequentist 方法中利用了查看系数置信区间的概念!我不是查看置信区间,而是查看每个系数的概率分布,并确定 90%的最高后验密度(HPD)是否重叠。下图显示墨西哥和美国的 HPD 没有重叠,这证明平均分数不相等。

The thin region where the HPDs of USA and Mexico do not overlap, around 77.8, is evidence that the scores are not equal.

现在我们有证据表明可能存在偏见,我们应该继续调查,以确保分数没有真正反映竞争对手的表现。我们可以通过比较其他裁判给参赛者的分数和这位裁判的分数来做到这一点。给定少量的数据,我可以想象这些分析也必须用贝叶斯统计来执行。

所以你有它!贝叶斯统计是另一种管理数据的工具,特别是小数据,以提供更好的建议或得出结论。请看一下 PyMC3 文档,了解更多关于如何使用这个强大的库的信息。如果你对上面例子的完整代码感兴趣,那么看看我的笔记本链接这里。

人工智能产品经理还没有搞清楚的是什么

原文:https://towardsdatascience.com/what-ai-product-managers-are-not-getting-right-yet-9d37c2eba479?source=collection_archive---------16-----------------------

自然智能教给人工智能在该领域取得成功的第一方法

my son Gabriel Versace about to attack a robot…

我写这篇文章的时候,正看着我的第四个孩子,新生的莱昂纳多·范思哲,在他生命的第五天小睡片刻。

正如我听说或看到的所有婴儿一样,莱昂纳多出生时有一套非常基本的技能,而且有点“不熟”。有几个月的时间,他不会走路,不会说话,更不用说为他的爸爸做卡布奇诺了(到两岁时,他应该是一个熟练的咖啡师了)。

大自然母亲为人类选择了一种非常奇特的发展方式。我们的婴儿出生时,基本技能非常有限,但令人印象深刻,其中最重要的是:学习。

然后,日复一日地在球场上重复和不断地学习。

人类天生就有能力建立基本技能,学习和发展超越他们对世界的最初理解,并在现实世界中运用他们的技能。婴儿最终会感知和抓住机器人,并将它们撕碎(见上图,我的长子加布里埃尔在他面前正要撕掉不幸的 iRobot 的各种碎片)。

如果我们能够跟随自己的脚步构建和部署人工智能,我们就可以避免企业通常面临的许多问题。现实是,大多数人工智能开发遵循的过程与上面概述的过程非常不同。产品经理和工程团队倾向于在试图在相关环境中进行测试之前,尽可能多地构建人工智能系统。这个基本的、命运多舛的想法是:“让我尽可能多地将人工智能放入系统,我知道它需要做什么,然后当我在 67 个月后完成时,祈祷它能工作!”。

然后,88 个月后,人工智能失败了。

这是规则,而不是例外,一旦部署,你的人工智能将不会按预期工作。但是在把所有的责任都推给产品经理和 AI 专家之前要三思!今天,部署、培训和测试人工智能的过程很繁琐,为了不浪费宝贵的时间和金钱,尽可能好地进入系统是至关重要的。

只有在相关环境中的早期部署和学习,在一个连续的反馈循环中,它才能使我们真正建立一个(自然或人工)智能,能够应对现实与我们想象的概念。

我学到了艰难的方法…为机器人构建和部署人工智能。我认为花大量的时间设计一个防弹人工智能,然后看看它是否能在实地工作会是最好的。几次尝试失败后,我和我的同事不得不改变策略。现在,我们专注于在投入使用前的快速原型制作。我们越早了解潜在的缺陷,就越能更好地解决它们。

所以,日复一日,部署并坚持学习。和我们一样,AI 永远不应该停止学习!

什么是高光谱图像?

原文:https://towardsdatascience.com/what-are-hyper-spectral-images-a5de5d9fa91?source=collection_archive---------16-----------------------

它们与我们处理的数字图像有什么不同?

Photo by Patrick Tomasso on Unsplash

上面的墙看起来确实非常丰富多彩,移动相机在捕捉同样生动的颜色供我们的眼睛见证方面做得非常棒……但是我们的眼睛能够感知的东西是有限的,在同一张图像中可能有个方面是我们的肉眼或移动 RGB 相机都无法捕捉到的。这就是超光谱相机发挥作用的地方。

实时快速查看数字图像

Photo by Alex Holyoake on Unsplash

在某种程度上,数字图像只是一串数字(但话说回来,这不是对所有事情都适用吗!?🤔).赋予这些数字一个图像的形状的是在它们上面定义的应用一些约束的参数——比如说,以行/列格式堆叠的数字,具有特定值范围的数字,等等。

二进制图像 :
这些是我们称之为的黑白图像,就像文字清晰地向你尖叫一样——它们只由两个不同的数字(0 和 1)组成,对应着两种不同的颜色,即。分别是黑色和白色。这些数字被保存为一个二维矩阵,格式为 n 行/ m 列,其中 0 为黑色,1 为白色。

sample binary image

灰度图像: 它们信息量更大,因为它们大多由 255 个不同的数字(比如说,从 0 到 255)组成,以传达信息;每个数字对应于灰度值的强度。换句话说,

sample greyscale image

  • 数字 0 代表最浅的灰色(换句话说,白色)
  • 100 号有点灰色
  • 200 号就像是一种深灰色
  • 数字 255 将是图像中最灰色的阴影(换句话说,黑色)

Greyscale range, from 0 to 255

彩色图像: 现在,这就是我们的眼睛(视锥细胞)如何感知我们周围的环境,给它一个彩色的呈现。取代单一的灰度图像,我们将有 3 个通道的红色、绿色和蓝色图像。这三种强度的组合将被我们的眼睛感知为许多可能的“颜色”之一。因此,它的尺寸为:( n 行* m)3* 个通道。

超光谱图像:

正如我们所知,不同的红色、绿色和蓝色是由于物体反射的光属于电磁辐射可见光谱中不同的波长范围[即长波长,峰值在 564–580nm(红色)附近];中等波长,峰值在 534–545 纳米附近(绿色);以及 420–440 纳米附近的短波长光(蓝色)];这就是我们人类的眼睛所能感知的全部,但是有很多波长没有被可见光谱覆盖,很容易被我们的眼睛错过/看不见。

这些被人类眼睛忽略的颜色/特征可能会被其他动物的的眼睛相对地看到——就像他们说的那样,颜色存在于旁观者的眼中

由于成像技术的进步,我们可以获得可见光谱以外的波长信息,并理解它。因此,从广义上讲,光谱成像是在图像空间中并行获取空间和它们相应的光谱信息以及它们的组合。它有点类似于 RGB 彩色图像,但它有更多的通道,因此对整体可视化提出了挑战(但我们仍然有我们的智能机器到 understand🧐).的所有数据出于理解的目的,假设我们有一个 n 波段超光谱图像:它只是在一个连续的波长范围内将 n 个灰度图像(每个波段根据其波长值捕捉不同的光强度数据)堆叠在彼此的顶部,给我们一个尺寸为 n 行 m 列* n 个波段的图像。*

RGB vs HSI images

在高光谱图像之前,我们还有多光谱图像,它们本质上是 n 波段图像,但它们不一定分布在连续的波长范围内,就波段数量而言,与任何平均高光谱图像相比,它们的波段较少。我们可以在从卫星收集的遥感数据中看到真实世界的多光谱图像。

因此,从任何 HSI 摄像机获取的图像将采用超立方体的形式,具有 n 维图像数据,这有时会令人不知所措。因此,对超立方体应用降维技术并不罕见,并且有许多其他方法来处理超立方体。在这里,如果我们试图专注于单个超像素,我们将能够绘制出相同的连续光谱数据。

它在众多领域都有应用,从医疗、农业、纺织到汽车工业。HSI 帮助我们探索未知领域,通过可视化人类肉眼不可见的信息,并找到理解这些信息的方法。

参考文献:

  • 威泽基、京特;斯泰尔斯,W.S. (1982)。颜色科学:概念和方法,定量数据和公式。).纽约:纯粹和应用光学中的威利系列。ISBN978–0–471–02106–3。
  • 机器视觉技术论坛 2017,17.10。2017 年 10 月 18 日,德国 unterschleiheim; www.spectronet.de
  • 图片提供-https://sherylwilliamsart.wordpress.com/tag/value/

机器学习中的过拟合和欠拟合是什么?

原文:https://towardsdatascience.com/what-are-overfitting-and-underfitting-in-machine-learning-a96b30864690?source=collection_archive---------0-----------------------

当你进入机器学习的领域时,几个模糊的术语会自我介绍。过度拟合、欠拟合和偏差-方差权衡等术语。这些概念通常位于机器学习领域的核心。在这篇文章中,我用一个例子来解释这些术语。

我们为什么要在乎?

可以说,机器学习模型只有一个目的;概括得好。我在之前的几篇帖子中提到过这一点,但强调一下也无妨。

泛化是模型对以前从未见过的输入集给出合理输出的能力。

正常的程序做不到这一点,因为它们只能“自动地”输出它们知道的输入。模型以及整个应用程序的性能在很大程度上依赖于模型的泛化。如果模型概括得很好,它就达到了它的目的。已经引入了许多评估这种性能的技术,从数据本身开始。

基于这个想法,像过拟合和欠拟合这样的术语指的是模型的性能可能会受到的影响。这意味着知道模型的预测“有多差”就是知道它有多接近过度拟合或不足拟合。

概括得好的模型是既不欠拟合也不过拟合的模型。

这可能没有多大意义,但我需要你在这篇文章中记住这句话,因为这是关于我们主题的大画面。这篇文章的其余部分将把你学到的东西和它在这幅大图中的位置联系起来。

我们的例子

假设我们正在尝试为以下数据集建立一个机器学习模型。

请注意,我认为该领域的新人应该有更多的实践经验,而不是研究。因此,像函数这样的数学术语在这篇文章中不会涉及。现在,让我们记住,在数据集中,x 轴是输入值,y 轴是输出值。

如果你以前有过机器学习模型训练的经验,你可能知道我们这里有几个选项。然而,为了简单起见,在我们的例子中让我们选择一元线性回归。线性回归允许我们将数字输入映射到数字输出,将直线拟合到数据点中。这种线拟合过程是过度拟合和欠拟合的媒介。

训练阶段

在我们的示例中,训练线性回归模型完全是为了最小化我们试图拟合的直线和实际数据点之间的总距离(即成本)。这将经历多次迭代,直到我们在数据集中找到相对“最优”的配置。这正是过拟合和欠拟合发生的地方。

在线性回归中,我们希望我们的模型遵循类似如下的直线:

即使总成本不是最小的(即,存在一种更好的配置,其中该线可以产生到数据点的更小距离),上面的线非常符合趋势,使得模型可靠。假设我们想要推断当前不在数据集中的输入值的输出(即概化)。上面的线可以给出新输入的非常可能的预测,因为就机器学习而言,输出预计会遵循训练集中看到的趋势。

过度拟合

当我们在数据集上运行我们的训练算法时,我们允许总成本(即从每个点到线的距离)随着更多的迭代而变得更小。让这种训练算法长时间运行会导致最小的总成本。然而,这意味着线将适合所有点(包括噪声),捕捉模型概化可能不需要的次级模式。

回到我们的例子,如果我们让学习算法长时间运行,它可能会以下面的方式来拟合直线:

这看起来不错,对不对?是的,但是可靠吗?不完全是。

线性回归等算法的本质是捕捉主导趋势,并在该趋势内拟合我们的线。在上图中,算法捕捉到了所有趋势,但不是主导趋势。如果我们想对超出线限制的输入测试模型(例如,概化),那么这条线会是什么样的?真的没办法说。因此,输出是不可靠的。如果模型没有捕捉到我们都能看到的主导趋势(在我们的例子中,是正增长),它就无法预测一个从未见过的输入的可能输出——这违背了机器学习的初衷!

过拟合是整体成本确实很小,但是模型的泛化不可靠的情况。这是因为模型从训练数据集中学习了“太多”。

这听起来可能很荒谬,因为当我们可以找到最小的成本时,我们为什么要满足于更高的成本呢?一般化。

我们离开模型训练越久,过度拟合发生的几率就越高。我们总是想找到趋势,而不是拟合所有数据点的直线。过度拟合(或高方差)导致弊大于利。一个从训练数据中学习得很好,但仍然不能对新输入做出可靠预测的模型有什么用?

欠拟合

我们希望模型从训练数据中学习,但不希望它学习太多(即太多模式)。一个解决办法是早点停止训练。但是,这可能会导致模型无法从训练数据中学习到足够的模式,甚至可能无法捕捉到主导趋势。这种情况称为欠拟合。

欠拟合是指模型“没有从训练数据中学习到足够的知识”,从而导致泛化能力低和预测不可靠。

正如您可能预期的那样,欠拟合(即高偏差)与过拟合一样不利于模型的泛化。在高偏差情况下,模型在线拟合方面可能没有足够的灵活性,导致线过于简单,不能很好地进行概化。

偏差-方差权衡

那么什么才是正确的衡量标准呢?根据手头的模型,介于过拟合和欠拟合之间的性能更理想。这种权衡是机器学习模型训练最不可或缺的方面。正如我们所讨论的,当机器学习模型很好地概括时,它们就实现了它们的目的。泛化受到两个不良结果的限制——高偏差和高方差。检测模型是否受到其中任何一个的影响是模型开发人员的唯一责任。

“学习机器学习最好的 Coursera 课程有哪些?为什么?”

原文:https://towardsdatascience.com/what-are-some-of-the-best-coursera-courses-for-learning-machine-learning-why-70363295995?source=collection_archive---------5-----------------------

在线学习不同于课堂学习。最好的资源唾手可得。你只要出现就行了。

When I passed one of Andrew Ng’s machine learning quizzes on Coursera. Stoked is an understatement. 40% of my self-study occurs in pyjamas at my dining room table.

我想学习机器学习。所以我花了一周时间在网上搜索最好的学习资源。

Coursera 不断出现。我以前从未见过它。但是很熟悉。一次,我在苹果店接待的一个女孩告诉我,她会在火车上用手机看视频。她给我看了这个应用程序。它是蓝色的。

“为了什么?”我问。

“没什么,我只是觉得学点东西总是好的。”

你知道当有人说一件事的时候。一件事,它会永远伴随着你。

她离开了商店。

几个月后,我在做搜索的时候,发现了 Coursera,想起了她。她的话被记住了。

自从我离开苹果公司,我们合作的创业公司失败后,我有了一些空闲时间。

我收集了几门课程,创建了自己的人工智能硕士学位。

在为我们的初创公司建立网站时,我听到的都是机器学习和深度学习。这里颠覆,那里创新。这都要归功于计算机自己学习东西。靠他们自己?怎么会?我必须知道。

吴恩达的机器学习教程

这是第一个。很艰难。真的很难。我不得不(大部分)用谷歌搜索了几次答案。否则,我早就累垮了。

我几乎什么都不记得了。没有代码,因为它是在 MatLab 和 Octave 中。我不喜欢 MatLab 界面。另外,我还在兼职学习 Python。

我带走的是安德鲁对教学的热情。他对机器学习的精力。他对人工智能的热情。它让我笑逐颜开,并感染了我。

有时候,老师激发学生的兴趣比知识本身更重要。

如果你想进入机器学习领域,这门课会教授一些基础知识。如果你不能通过编码作业,我不会太担心,我会看讲座,获得直觉,并用它来推动你的下一步学习。Python 的教程。

密歇根大学使用 Python 开发的应用数据科学

当我开始成为一名机器学习工程师时,我探索数据集的技能很差。我花了太多时间为准备好的数据集建立深度学习网络,而不是深入战壕,从头开始探索数据。

这门课程帮助我学习了探索性数据分析(EDA)的基本步骤。

如果你想进入数据科学和机器学习,你可能会发现自己花了很多时间使用 Python 库熊猫做 EDA。这正是本课程第一部分的内容。

完成后,我用这些技能参加了我的第一次 Kaggle 比赛。比赛结束了,但我还是挺过来了。在此之前,Kaggle 一直是那些难以捉摸的事情之一,我会看到提到的地方,但从来没有尝试过自己。直到我做到了。这让我写下并制作了一个视频,告诉我其他人如何做同样的事情。

在我所学的所有课程中,Python 应用数据科学与我作为机器学习工程师的日常工作最为契合。

事后看来,这门课应该是我开始学习机器学习/数据科学时的第一门课。

吴恩达的 deeplearning.ai

吴恩达释放的任何东西,我都会吞噬。我的学习风格和他的教学风格非常一致。

文字和视觉的结合让我学得最好。安德鲁在他的讲座中做到了这两点。经常在打印的课堂笔记上画例子。

这门课程教会了我深度学习的基本原理以及如何应用它们。如果说用 Python 的应用数据科学是数据科学的珠峰大本营,deeplearning.ai 就是顶峰。

它给出了计算机视觉(教计算机看)、自然语言处理(教计算机理解语言)和口语检测(教计算机听)中涉及的概念的概述和工作示例。

在这些主题之间,Andrew 分享了他丰富的经验,并深入研究了深度学习背后的一些数学和统计学。

额外收获:学习如何学习

这门课程应该是所有学生的必修课。我把它留到了最后,但如果让我重新开始,我会先做这个。每年更新自己是值得的。

为什么?

因为学会如何学习才是终极技能。

如果你知道学习本身的技术和最佳实践,你可以把它们应用到其他任何事情上。

我最喜欢的(也是我日常使用的)是:

  • 避免拖延的番茄定时器——设置一个 25 分钟的定时器,在定时器到时之前,除了你面前的单一任务,什么也不要做。一天 6-10 次对我来说是个好日子。前 4 分钟是地狱,但当计时器响起,你不想停下来。
  • 集中和分散思维 —集中思维发生在你专注于一项任务的时候,分散思维发生在你没有做任何特别的事情的时候。最好的学习发生在这两个点的交叉点。这就是为什么休息和无所事事的时间是有价值的。没有智能手机。没有社交媒体。给你的大脑空间。当你的大脑有空间时,它能把事情联系在一起。有没有想过为什么你的一些伟大的想法会在洗澡的时候冒出来?是因为你的大脑有思考的空间。
  • 不需要天才羡慕——每个人都必须从某个地方开始学习之旅。事实是,每个大师都知道,学习永不停止。总是第一天。查尔斯·达尔文大学辍学,后来发现了进化论。不要以为你是查尔斯·达尔文。但是也不要认为高中或大学毕业后学习就停止了。

在高中知道这些事情可能会对我的成绩有一点帮助。也许是它让我在大学的头两年没有及格。

我非常喜欢这门课,我制作了一个视频,总结了我最喜欢的其他课程。

这里剩下的课程都被我对机器学习和数据科学的兴趣带偏了。

但是我认为不管你喜欢什么,你都会从学习如何学习的课程中有所收获。

加州大学圣地亚哥分校的生物信息学

我还没有做这个,但是我打算明天开始做。

为什么?

因为没有什么比健康和科技的交叉更让我着迷了。简而言之,这就是生物信息学。

几周后,我退学了。我有太多事情要做。我犯了一个错误,追求更多的证书,而不是利用我已经获得的知识。也许有一天我会回去。

因为这足以成为学习任何东西的理由

网上有这样的资源,太神奇了。Coursera 只是其中之一。有 YouTube,Udemy,edX,走向数据科学,大量的免费文档。

它仍然得到我。在澳大利亚的布里斯班,我可以坐在我的房间或餐桌上,学习我想学的东西。最初在 5000 英里外教授的东西。

如果你想学习新的东西,你可以。你要做的就是注册,然后不断出现。

你也不需要理由。

我记得苹果店里的那个女孩转向我说。

没什么,我只是觉得学点东西总是好的。

最好的事情是,如果老师没有像吴恩达那样激发你的好奇心,或者如果材料不是你所期望的,在线学习的好处是,你可以随时尝试其他东西。一些能激发你好奇心的东西。与你的学习方式一致的东西。

为什么?

因为。

机器学习中有哪些监督学习和无监督学习?

原文:https://towardsdatascience.com/what-are-supervised-and-unsupervised-learning-in-machine-learning-dc76bd67795d?source=collection_archive---------13-----------------------

(Source: https://unsplash.com/photos/z4H9MYmWIMA)

不可否认,机器学习自问世以来给世界带来的丰富是多么巨大。作为一组面向应用的概念,ML 应用程序的最终目标决定了要使用的方法和算法——至少可以说是领域。

机器学习领域的一个方面困扰着大多数新人,以至于它几乎被包括在所有 ML 课程的介绍中。这就是有监督学习和无监督学习的区别。在这篇文章中,我试图用一个例子来解释每一个的意思,讨论它们之间的区别,并解决一些围绕它们的误解。

你把你的儿子放在哪里?

想象你有一个年幼的儿子。你儿子从未见过真正的动物。你有责任向他展示外面有不同类型的生物。这种体验需要尽可能亲自动手,这样你的儿子才能学得最好。为了完成这项任务,您需要做出一些决定。这些决定高度依赖于一个核心问题:你把你的儿子放在哪里?

你有没有把他安置在一个家庭里,给他带几只宠物,并给他命名它们的种类(例如猫、狗、鹦鹉..)以及向他解释他想知道的关于他们的任何事情?

或者,

你会带他去一个丛林,那里有太多的动物让你说不出种类,让他自己去发现有不同的种类吗?

实际上,您不必选择以上任何一项。你对环境的任何选择都可能是相似的。比如带他去动物园就属于丛林一类。即使你为他命名每一种动物,他也会不知所措,无法像在有宠物的家庭中那样记住所有的动物。

简单地说,这个想法是要么让你的儿子接触几种你非常熟悉的类型,然后把这些知识传授给他,要么让他接触多种类型,然后让他自己找到模式。

给他带宠物

如果你选择这个选项,你的儿子将能够很好地学习那些种类的动物是什么。他将能够发现你无法理解的模式——或者你没有想到的模式——甚至他自己也无法表达。因此,你可以期待他知道什么是猫,它如何行动,它吃什么,等等,为他的余生。

你的儿子也将能够把他的知识推广到户外。如果他在街上看到一只狗,他会知道那是一只狗。如果他看到一些他没有养过的动物作为宠物,他将无法识别这种动物,但他会知道这不是他被介绍的动物(即不是狗或猫)。

即使他非常了解一些种类,你也只能教他这么多。你不能给他一只狮子或大象做宠物。你不能带一些甚至你都不了解的奇怪昆虫去教他。

你刚才做的是将你的儿子归类为一个监督学习分类器。你给了他你足够了解的种类。你告诉他他们的名字和种类。你向他解释了他关心并能标记(如食物、颜色、眼睛、耳朵形状等)和利用的事物。你给了他足够的时间去理解他们的行为,并且能够很好的区分他们。

在监督学习中,您为模型提供带标签的数据,以便模型可以学习基于这些标签进行归纳。例如,你给一个模型提供 1000 张猫的图片,每张图片都与标签“猫”相关联,以及 1000 张狗的图片,每张图片都标有“狗”。

监督学习的工作方式决定了你需要有足够的关于类的知识(例如,在我们的类比中是动物),以便你可以将这些知识(例如,数据)传递给分类器——你的儿子。这里的限制来自于对数据的需求,这通常是一项非常困难的任务。

把他扔进丛林

如果你选择这个选项,你的儿子将能够学习和识别动物之间的不同模式,并根据他的观察将它们分成小组。例如,他可能会把所有的鸟放在他脑中的同一个组/类别中,因为它们都有一个显著的特征——飞行能力。

你还需要记住,你的儿子不可能对任何一种动物有深入的了解,因为他需要记住的动物种类实在太多了。然而,他为自己找到的模式可能会让你眼花缭乱。他将能够建立你从未想过的联系。

即使你的儿子不能真正说出动物的种类,他也有能力不断地制作图案并将它们组合在一起。这扩展到他能够把一个新来的动物种类放在它的组里,而不需要知道它的名字。

你刚才做的是把你的儿子归类为一个无监督学习分类器。你向他介绍了很多你不一定了解的种类。尽管如此,他还是能够自己了解这些差异。此外,他可能会遇到一些对他来说毫无意义的类型(即离群值)。那些种类将介于其他动物种类之间。

在无监督学习中,您为模型提供未标记的数据样本,给它时间来寻找模式,并根据它到达的模式将这些数据样本分组在一起。

技术性

机器学习模型的学习理论可以属于监督学习或无监督学习(或其他上下文中的强化学习)。这两个可以被认为是在构建机器学习模型时在实践中遵循的“学习范式”。确定遵循哪种范式很大程度上取决于手边的应用程序和可用的数据类型。带标签的数据总是可取的,因为它可以在监督和非监督应用程序中使用(忽略后者中的实际标签)。然而,标记的数据通常是昂贵的,并且当找到时几乎不符合应用程序的目的。

监督学习

正如我们在上述类比中看到的,在监督学习中,您知道标签,并将这些标签与数据样本本身一起输入到机器学习模型中进行训练。这种类型的例子包括:

  • 线性回归 :一种机器学习算法,允许我们将数字输入映射到数字输出,将一条线拟合到数据点中。
  • 逻辑回归:因变量为二进制(0 或 1)时广泛使用的一种分类算法。
  • 神经网络 :机器学习框架,通过将非线性引入线性 ML 模型来获得其有效性。
  • 支持向量机:一种机器学习算法,利用内核技巧,在确定类之间的最佳分隔线时使用利润率最大化。

这种算法的应用通常包括:图像分类、语音识别、基于回归的数字预测等。

无监督学习

值得强调的是,有监督和无监督学习算法之间的主要区别是后者没有数据标签。取而代之的是,数据特征被输入到学习算法中,学习算法决定如何标记它们(通常用数字 0,1,2..)又基于什么。这个“基于什么”的部分决定了要遵循哪个无监督学习算法。

值得一提的是,大多数基于无监督学习的应用程序都利用了一个叫做聚类的子领域。聚类是根据数据样本共有的特定特征将数据样本组合成个簇的过程——这正是无监督学习的首要目的。

无监督学习算法的例子包括:

  • k 均值聚类:一种聚类算法,根据 k 个质心将数据点分成 k 个聚类,k 个质心的值是在任何给定时间属于特定聚类的样本的均值。
  • 自动编码器:一种神经网络的形式,其输出与输入属于相同的特征空间,真正实现了端到端的方法。

这种算法的应用可以包括:内容推荐、产品促销、欺诈检测等。

结论

基于所遵循的学习方法,机器学习可以分为两种范式。监督学习算法从数据特征和与之相关联的标签中学习。无监督学习算法在不需要标签的情况下获取数据点的特征,因为算法引入了它们自己的枚举标签。选择哪种范式取决于手边的应用程序和可用的数据类型,从而使每种范式在其各自的领域内都处于领先地位。

IMDb 最好的电影是什么?

原文:https://towardsdatascience.com/what-are-the-best-movies-on-imdb-891ab367c5ea?source=collection_archive---------28-----------------------

Photo credit: https://www.canva.com/design/DADu-0ZcZCM/gcIYtjzGs-_Io0m8H8LQKA/edit

IMDb 电影收视率透视

“不要一路关着门。我不喜欢那样。只是……让它开着一点点。”

这些是我可以毫无疑问地说是 2019 年最佳电影的最后一句话,这部电影是爱尔兰人。在这最后一幕之后,片尾字幕补充了五色缎子乐队的《夜深人静中的

观看爱尔兰人是一次很棒的经历。我坐下来,整个感恩节上午都在网飞看电视。这是一部非凡的电影。我看了劳勃·狄·尼诺的 10/10 表演,他从扮演一个 40 多岁的年轻人到扮演一个 90 多岁的老人。

他把自己的角色演得如此之好,以至于他把动作和风格完美地运用到了他所扮演的各个时代。我还目睹了其他演员如乔·佩西、阿尔·帕西诺和安娜·帕奎因的精彩表演。

我喜欢看电影,尤其是马丁·斯科塞斯、克里斯托弗·诺兰或昆汀·塔伦蒂诺等经典导演的电影。我观看这些电影制作人的电影,因为演员们如何进行有意义的对话,镜头角度如何捕捉令人惊叹的时刻,以及电影如何传达强大的符号。

像这样的电影让我想知道哪些电影是 IMDb 收视率最高的,并问电影质量如何随着时间的推移而变化。

因此,进行了一项研究来找出 IMDb 收视率最高的电影。

数据收集

数据集是通过这个链接在 Kaggle 上收集的。然后,他们被修改,以便有适当数量的功能,如标题,年份,持续时间,平均评级,投票和 metascore。此外,还删除了无效值。

转换数据集的代码如下所示:

df_movie = df_data_1[['title', 'year', 'duration', 'avg_vote', 'votes', 'metascore']]
df_movie.head()
df_movie_1 = df_movie.dropna()
df_movie_11 = df_movie_1.reset_index() 
df_movie_11.head()

Top five rows of the truncated dataset.

获得正确的数据集后,进行数据分析以进行研究并得出结论。

平均评分、总票数和 Metascore

第一项任务是找出电影随着时间的推移是如何被分级的。下图显示了 IMDb 电影按制作年份的平均收视率。

A line plot graph of Average rating of the movie on IMDb vs the year they were produced.

事实证明,根据 IMDb 收视率,电影的收视率随着时间的推移大幅下降。

第二个任务是通过创建另一个线图来显示 IMDb 在不同年份每年记录的投票数,从而找出每年电影的总投票数。

The graph on the left shows how total votes per year has changed on IMDb. The graph on the right focuses on total votes from 2000 to 2019.

看这两个图表,IMDb 电影的投票数每年都有显著的增长,从零票到大约 3500000 票的峰值。

最后的线形图显示了电影的平均元得分也是如何随时间变化的。

A line plot graph of Average metascore of the movie on IMDb vs the year they were produced.

根据上面的折线图,平均元得分和平均评级一样,显示了平均元得分的年度下降。

上面的四张图显示,随着投票数逐年增加,电影的平均评分和平均元得分下降。出现这种情况的原因是因为每年生产的电影越来越多,这导致了许多好电影和许多坏电影。因此,随着制作的电影的增加,投票数也增加。

此外,直到 1990 年才出现 IMDb,所以 1990 年以前的电影可能只有极少数有兴趣看的人来评价,而且那时候每年只生产很少的电影。因此,1990 年以前的年度总票数比随后几年记录的票数少。

IMDb 投票最多的 20 部电影

创建了一个水平条形图来显示 IMDb 投票最多的前 20 部电影。

Top 20 movies with the most votes on IMDb

《肖申克的救赎》以大约 2159628 票位居第一。位居第二,以大约 25000 票的差距落败的是《黑暗骑士》。《盗梦空间》是票数第三多的电影。《搏击俱乐部》和《低俗小说》分别位居第四和第五。其他著名的电影有第十名的《教父》和第二十名的《无耻混蛋》。

IMDb 收视率最高的 20 部电影

生成另一个水平条形图来显示 IMDb 上最高评级的前 20 部电影。

Top 20 highest rated movies on IMDb

《肖申克的救赎》以 9.3 的平均评分再次位居榜首。《人力资本》和《教父》并列第二,平均评分 9.2。《黑暗骑士与教父 II》以 9.0 的平均评分排在第四位。

《小丑》是票房收入最高的 R 级电影,票房超过 10 亿美元,排名第十,平均评分为 8.8 分。

一个明显的趋势是,一些获得最多投票的电影也获得了最好的评级。因此,创建了一个散点图来显示总投票数与平均评分之间的关系。

A scatter plot of Total votes vs Average ratings

根据散点图,随着电影被分级,从左到右有某种向上的转移。相关系数约为 0.35,这意味着总投票数与平均评分呈正弱/中等相关。

结论

电影是当今世界上最大的娱乐形式之一。每个人都喜欢电影,所以做这项研究证明了电影的评级是如何随着时间的推移而变化的,以及一部电影获得的票数会对其评级产生多大的影响。

用于执行项目的完整版代码可以在这里看到

科技界有哪些最快乐的工作?

原文:https://towardsdatascience.com/what-are-the-happiest-jobs-in-tech-4c4d33e065f0?source=collection_archive---------5-----------------------

科技行业的薪资最高,T2 的离职率也最高。在调查这个竞争激烈但高流失率的生态系统时,讨论往往会转向的工作满意度如何因公司而异和的留任率如何因雇主而异【3】【4】。然而,对公司的关注忽略了一个事实,即科技公司不仅拥有众多的公司,还拥有各种各样的人,他们在相互关联的工作领域中有不同的优先事项和关系。调查经验如何因学科而异,2019 Stack Overflow Developer Survey可以通过工作领域、薪酬和其他因素来帮助了解工作满意度,不仅可以揭示谁的薪酬最高,还可以揭示谁最满意,以及什么可以帮助他们在工作中找到快乐[5]。

Satisfaction ratios by “discipline” (devType from the 2019 Developer Survey). Senior executives report high satisfaction while data analysts exhibit relatively low satisfaction.

首先,不同学科之间的满意度确实不同。更具体地说,数据显示了工作领域之间的统计显著差异,给出了表示对工作满意的人数与表示不满意的人数(p < 0.05). Consider a metric which divides the number of people who report being satisfied (slightly or very satisfied) by the number dissatisfied (slightly or very unsatisfied) with their job. Using that “satisfaction ratio” metric to rank the fields of work within the Stack Overflow Developer Survey, four groups dominate the top ten most satisfied: 管理(高管,在较小程度上还有工程管理)、科学(包括数据科学)可靠性 (SRE 和德沃普斯),以及学术界(教育家和研究人员)。数据还显示,大多数“开发人员”的职位都在中间值 3.0 左右,低于这个值的是设计师、项目经理、销售/营销和分析师。

人们可能会怀疑,薪酬可以解释工作领域中的这种差异,事实上,那些报告对工作满意的人的工资明显高于那些报告不满意的人(差异约为 21,000 美元的差异,p < 0.05). Even still, consider that compensation may not be fully capturing variation in satisfaction. Though 这可能是一个麻烦的指标,仅针对中值学科薪酬的线性回归”解释道“学科满意度比率(R = 0.29)中约三分之一的差异[6][7]。仔细观察这些数据,人们可以开始看到挑战这一重要而复杂的关系的工作领域。例如,与工程经理相比,学术研究人员的薪酬较低,但两者的满意度仍然相当高。同样,工程经理、数据科学家和 sre 在薪酬上可能有显著差异,但在满意度上不一定有巨大差异。当然,如果你想优化满意度和薪酬,你可以考虑高级主管/副总裁、SRE 或工程经理。尽管金钱可能会有所帮助,但它似乎并不总能买到更多的幸福。

Median compensation and satisfaction ratios for different devTypes.

如果薪酬不能完全解释这个样本中的满意度,那么在科技领域还有什么可能是重要的呢?开发人员调查询问受访者关于可能影响他们接受工作决定的因素(“…在两个薪酬、福利和地点相同的工作机会之间做出决定…哪三个对你来说[最]重要?”)而且,有趣的是,不同学科选择因子的频率存在统计学上的显著差异(p < 0.05)。值得注意的是,各种类型的开发人员(前端、后端等)将“他们将使用的语言、框架和其他技术”排在他们列表的顶部,而文化排在 PM、工程经理、销售/营销和数据科学家/分析师列表的顶部。有趣的是,在高满意度学科中,一个人的工作对科学家(包括数据科学)和高管的影响可能比平时更重要。不管怎样,就像薪酬一样,这种可变的因素排名可能意味着不同类型的技术人员正在从他们的工作中寻找不同的东西,许多因素可能会整体上支持满意度。

Visualization of satisfaction and job factors by discipline while also showing how those disciplines are inter-related. Full resolution image available.

最后,开发者调查的受访者通常认同不止一个学科,通过利用这些领域中的“重叠”,人们可以开始看到技术领域中具有不同体验的“集群”。具体来说,使用共享受访者的 Jaccard 指数,工程管理和高级管理人员之间有相当多的重叠(两者都有很高的薪酬和满意度)[8]。同样,许多“开发人员”领域密切相关(前端、后端、完整堆栈等),同时也看到类似的满意度。也就是说,一些学科强调,一个集群内的微小变化会产生非常不同的结果。最值得注意的是,尽管数据科学家和数据分析师拥有大量从业者,但他们报告的满意度却大相径庭。还要考虑到一些可靠性(DevOps 和 SRE)学科比系统管理员报告更高的满意度和薪酬,即使就人们的自我报告而言,这些领域之间可能有相对较大的重叠。可能有些技术人员可以担任多个角色,但是他们属于哪个角色会极大地影响他们的工作体验。

Relationships between different disciplines in tech using a Jaccard Index over respondents shared between different fields. Line width proportional to index with values under 0.05 filtered out.

虽然技术部门经常被作为一个社区来讨论,但技术内部的体验有很大的差异,对于不同的成员来说什么才是重要的。纪律是与工作满意度相互作用的一个重要方面,不仅薪酬以外的其他因素也很重要,而且这些因素的重要性可能因工作领域而异。也就是说,虽然选择学科的学生或寻求改变的从业者可能会考虑不同领域的财务和情感经历,但这篇文章也为其他人强调了教训:经理和领导者。在为不同类型的从业者建立职位时,值得强调的是不同的事情对不同类型的人很重要,在日益紧缩的技术劳动力市场,对这些学科当前现实的更深入了解可能有助于建立更好的职业家园【9】。

【https://github.com/sampottinger/dev_satisfaction】代号

想要在数据、设计和系统的交叉点进行更多的实验吗? 关注我获取更多

Works cited, code, and notes

赔率是多少:NBA 惨败的统计分析

原文:https://towardsdatascience.com/what-are-the-odds-a-statistical-analysis-of-tanking-in-the-nba-2c5fe228cd67?source=collection_archive---------17-----------------------

Image by Philadelphia 76ers on flickr

什么是坦克?

坦克是一种艺术,创造一个有目的的坏团队,意图输掉比赛,以获得高选秀权。最终,几乎所有人都同意,在今天的 NBA,你的球队需要一个真正伟大的球员来赢得总冠军。坦克的目标是获得这个球员的状元选秀权,并最终赢得一个拥有坦克核心的冠军。

随着赢得 NBA 总冠军变得越来越困难,这种策略近年来变得越来越普遍。

这一分析的目的

随后,这一分析旨在确定三件不同的事情:

  1. 什么是一个合理的场景,坦克可能看起来像什么?
  2. 那支球队会得到什么样的选秀权,这些选秀权中的一个能产生真正伟大的球员的几率有多大?
  3. 如果那支球队真的得到了一个超级巨星,他们有多大可能用那个球员赢得冠军?

为了这个分析的目的,我将一个伟大的球员定义为名人堂级别的球员。

第一部分:坦克场景

确定一个合理的坦克场景是这个分析中最主观的部分。坦克可以采取许多不同的形状。一个团队的排名有多差取决于激烈的“竞争”,他们起草的有多好,以及他们有多投入。作为开始,我做了一个决定,一个坦克团队已经做出了一个明显的决定来重建和暂时放弃竞争力(即,他们不只是坏)。由于没有一个场景可以涵盖一切,我决定创建三个,模仿 NBA 最近的三次重建。他们在这里:

费城 76 人队:艰难的重建场景

76 人队的重建始于 2013-2014 赛季,交易走了大牌球员朱·霍勒迪。76 人队以他们极端的承诺著称,他们摧毁了所有可能有助于获胜的资产。在他们的最低点,他们是 NBA 历史上第二差的球队,因此这是一次艰难的重建。在重建开始的四个赛季后,76 人队自重建开始以来首次进入季后赛,就这一分析而言,这标志着重建的结束。重建期间的 76 人播种如下:

胜率 : 23%

明尼苏达森林狼队:温和的重建方案

森林狼的重建始于 2014-2015 赛季,交易走了特许球员凯文·乐福。然而,他们在安德鲁·威金斯保留了交易中的第一个整体选择,这有助于使反弹更快。在他们再次进入季后赛之前,坦克可以持续三个赛季。在此期间,他们的播种如下:

胜率 : 31%

犹他爵士:软重建方案

犹他爵士在失去阿尔·杰佛森和保罗·米尔萨普后开始了他们的重建。然而,第四年的戈登·海沃德帮助爵士在重建期间比其他两个场景更受人尊敬。2013–2014 赛季也是他们的第一个赛季重建,持续了三个赛季才再次进入季后赛。

胜率 : 42%

第二部分:入选名人堂球员的几率有多大?

为了确定这一点,我们需要考虑两个因素:

  1. 选秀抽签在每个种子位置有可能产生什么样的选秀权?
  2. 每个选秀位置选中一名 HoF 球员的可能性有多大?

在这里,我们将解决第一个问题,因为它很容易。从 2019 年 NBA 选秀开始,新的彩票赔率如下:

现在我们有了从每个种子中获得每个选秀顺位的几率,我们需要从每个选秀位置中选出名人堂成员的几率。为此,我使用了篮球参考的草稿搜索器来分析一些数据。我分析了从 1950 年到 1995 年每个位置的选秀选择(1995 年后包括一些现役或最近退役的球员,他们还没有机会进入 HoF)。每个位置入选名人堂的几率如下:

有一些不寻常的差异,根据这一点,你宁愿在第八名而不是第四名选秀。这是小样本的不幸后果。

为了将这两个部分结合起来,我对每个种子收到每个选秀选秀权的可能性和在那个位置为每个种子选出名人堂球员的可能性进行了加权(由于时间限制,我只完成了三个场景所需的种子)。

其结果如下:

现在,使用这些信息,我们可以很容易地将其与每个场景的播种结果进行交叉引用,以确定重建产生名人堂球员的可能性。这些结果陈述如下:

所以我们现在已经成功地回答了这个分析的第二部分。这里需要注意的是:更长的坦克时期可能并不意味着更高的可能性起草名人堂人才。相反,这可能表明该团队的起草工作一直很差,这就是他们未能改进的原因。然而,对此进行控制将会非常困难。

第三部分:和那个球员一起拿 NBA 总冠军的可能性有多大?

这部分要复杂得多。这不是一门精确的科学(我将在结论中详述),而且非常耗时。为了衡量这一点,我回到了篮球参考的选秀搜索器,查看了自 1950 年以来每一位入选名人堂的球员。有 122 个条目。出于几个原因,我删除了 18 个条目;有的是双打(联盟早期历史上偶尔有球员被选秀两次,两次选秀都算)。其他人是作为教练或管理人员进入名人堂的球员,有些人主要是 ABA 球员。剩下 104 个条目可以使用。

一旦我有了 104 名球员,我手动检查每一个人,并确定其中 60 人被选中的球队在他们到达那里的前一年取得了失败的记录。其他 44 人在他们到达之前就已经被 50%或更高的队伍选中了。在这个例子中,为了简单起见,我们将“失去”视为等同于重建/坦克。在这 60 名球员中,有 23 名在职业生涯中从未获得过 NBA 总冠军。这使得 37 名名人堂球员被选入输掉 NBA 总冠军的球队。然而,还有 19 名球员在职业生涯后期才在其他球队赢得冠军。这留下了 18 名名人堂成员的最终样本,他们来自一支失败的球队,并在他们第一次在那里工作时赢得了 NBA 总冠军。因此,如果一支失败的球队入选名人堂,历史上他们有 30%的机会赢得 NBA 总冠军。

然而,这里有一个重要的调整。随着新奥尔良鹈鹕队的加入,NBA 在 2004 年才成为一个有 30 支球队的联盟。上面提到的 18 名球员没有一个在 2004 年或之后赢得过 NBA 总冠军。这意味着所有的球员都是在挑战性比现在小的时候赢得冠军的。

为了控制这一点,我应用了一个调整因子来说明球员赢得冠军的时间。调整系数的计算方法很简单,取当时 NBA 的球队数,除以 30。例如,一名在 15 支球队的联赛中赢得冠军的球员将获得 0.5 的调整系数,相当于今天难度的 50%。如果一个球员在那支球队赢得了多个冠军,我会用最难的一个。结果如下:

新的调整后的总得分为 11.433/60,即赢得 NBA 总冠军的 19.1%。然而,我想更进一步。我想确定赢得冠军的机会是否会因为车队的糟糕程度而改变。

为此,我根据每个场景创建了三个类别。我取了每个场景在重建过程中的平均胜率,并将其应用于+/- 5%,以获得 10%的类别范围。所以分类结果如下:

  1. 努力,23%获胜%:18–28%
  2. 中等,31%获胜%:26–36%
  3. 软,42 胜%:37–47%

经过数据整理,我得到了以下结果:

据此,一个中等糟糕的团队比一个非常糟糕的团队或更平庸的团队更有可能成功。这可能是有意义的,也可能是小样本的结果。遗憾的是,这仅仅是我们能处理的最好的数据。

局限性

我想我会做一个简短的部分,专门讨论这种分析中存在的无限局限性。基本上,每次重建都是不同的,我无法解释这一点。一些重建设法得到许多额外的选秀权(凯尔特人),另一些设法失去他们的(网队)。一些重建设法交易现有 NBA 超级明星的选秀权和前景,这在这里不会被捕获。一些重建有很长的坦克时期,因为他们只是在建设好的篮球队方面很糟糕(自从德怀特离开后,魔术队一直在“重建”)。基本上,有太多的移动部分来解释这一切。我已经尽我所能了。

结论

为了把这些联系起来,我必须把这两个因素结合起来,以便为每种情况得出一个最终的可能性。我已经把最终的结果放在了下表中:

这一切有多大意义?我不知道。有许多因素仍未得到解释。但希望这至少是一种乐趣或有趣的阅读,如果没有别的。

使用 Vue.js 的利弊是什么

原文:https://towardsdatascience.com/what-are-the-pros-and-cons-of-using-vue-js-3689d00d87b0?source=collection_archive---------6-----------------------

Vue.js 是最先进的 web 应用程序开发中一个众所周知的术语。它是目前最新兴的前端技术之一,经常与 Angular 和 React.js 联系在一起被提及,基本上 Vue.js 类似于 React.js,是一个 JavaScript 库。

Vue.js 和 React.js 一样,都是开源库,但和 React.js 和 Angular 不同,它支持紧凑的文件大小。实际上,Vue.js 是 Angular 和 React.js 的组合,因为它使用了指令和组件等概念来控制和渲染用户界面。值得一提的是,Vue.js 提供了控制服务器已经呈现的 HTML 的能力,而 React.js 则不是这样。

vue . js 的优势

使用 Vue.js 有一定的优势,这应该会鼓励开发者在他们的项目中使用它。例如,Vue.js 在许多方面类似于 Angular 和 React,与其他框架相比,它继续受到越来越多的欢迎。该框架只有 20 千字节大小,这使得开发者更容易即时下载文件。事实上,在加载时间和使用方面, Vue.js 轻松击败了其他框架。

简约

开发 Vue.js 背后的基本思想是用尽可能少的努力获得好的结果,这样用户就可以只用几行代码就能编码。Vue.js 也非常适合处理组件,因为它需要相对较少的开销,因为单文件组件可以在一个文件中存储所有代码,如 HTML、CSS 和 JavaScript。

整合

开发者可以将 Vue.js 集成到 React 等其他框架中,使他们能够根据各自的需求定制项目。由于易于集成,Vue.js 正成为 web 开发的热门选择,因为它可以用于各种现有的 web 应用程序。由于后端是基于 JavaScript 构建的,开发人员也可以使用该技术来试验许多其他 JavaScript 应用程序。类似地,组件的多样性允许开发人员创建不同类型的 web 应用程序并改变现有的框架。除了 JavaScript,它还可以处理 HTML 块,因为 MVVM 架构允许双向通信。

人性化

据各路专家介绍,Vue.js 不需要陡峭的学习曲线,对于新程序员来说是有利的。关于学习过程,有趣的是,Vue.js 只要求程序员了解 JavaScript、HTML 和 CSS 的基础知识,这与 Angular 或 React 不同,后者需要额外的编程语言来进行高级编码。另外,Vue.js 可以和常用编辑器一起使用。火狐和 Chrome 下甚至还有浏览器插件,更容易快速上手。

定制

对于开发者来说,Vue.js 是一个很好的工具,因为它的所有功能都很容易访问。为了便于使用,开发人员可以根据自己的喜好轻松命名该函数。每个部分都可以有独立的功能,这使得根据个人需求定制应用程序变得更加容易。

很少限制

Vue.js 的设计提供了更少的限制和更大的灵活性来完成项目。核心库侧重于“视图”部分;它与模块化方法相结合,并使用各种库,允许程序员以不同的方式解决问题。尽管 Vue.js 社区仍在发展,但总有人渴望提供新的想法。

好的文档

最重要的事情之一是好的文档。它展示了框架提供的所有选项和相应的最佳实践示例。Vue.js 上的文档不断得到改进和更新。它还包含一个简单的介绍性指南和一个非常好的 API 概述。也许,这是这种语言最详细的文档之一。

支持

对平台的支持令人印象深刻。例如,在 2015 年,官方平台上的每一个查询都得到了回答。同样,在 GitHub 上解决了 1400 多个问题,平均时间不到 13 小时。2018 年,这种支持继续给人留下深刻印象,因为每个问题都得到了认真的回答。事实上,6,200 多个问题得到了解决,平均解决时间仅为 6 小时。为了支持社区,有一致的更新信息发布周期。此外,在开发人员的后端支持下,社区继续发展壮大。

vue . js 的缺点

尽管 Vue.js 有很多优点,但肯定有一些缺点需要解决。例如,自 2015 年第一版发布以来,稳定性一直是个问题。这意味着该平台非常适合个人项目,但对于更大的项目应该谨慎使用,因为稳定性可能会导致财务损失。

缺乏对大型项目的支持

Vue.js 是一种相对较新的语言,它并不被活跃的程序员的大型社区所支持。同样,Vue.js 的开发团队也很小,这意味着该平台需要一些时间来获得公司的支持。截至 2018 年,框架的开发与企业利益无关;因此,对现有框架的任何更改主要取决于社区成员的反馈。

在 JavaScript 世界中,采用某种技术总是被认为是对平台稳定性的赌注。当部署大型项目时,更大的灵活性和大量的选项也会成为一个问题,因为不同开发人员的参与可能很难处理。

未来的竞争者

一个小的开发团队也意味着缺少积极的研究可能会为另一个新的框架提供一个机会来引起社区的兴趣。在这种情况下,框架的开发可能会变慢甚至停滞。这种威胁是有根据的,因为像谷歌和脸书这样的大公司都在积极参与类似概念的开发。

语言障碍

一些专家也认为语言障碍是一个潜在的问题。有趣的是,大部分代码都是用中文编写的,对于非母语人士来说,这通常会使事情变得复杂。因此,与其他人相比,中国的开发社区似乎得到了很多支持。

缺少插件

由于 Vue.js 仍处于开发阶段,缺少对重要插件的支持。这意味着开发人员需要切换到其他语言来寻求帮助。例如,开发人员在使用谷歌地图时求助于普通的 JavaScript 并不罕见。同样,Vue.js 的快速发展意味着互联网上的一些重要信息可能已经过时,迫使开发人员转向文档。

总的来说,Vue.js 是一个开发用户界面的强大框架。它的小尺寸和定制特性使它成为开发人员寻找用户友好的 web 应用程序框架的可靠选择。Vue.js 的大部分缺点可以很容易地纠正,让开发人员保持乐观,这个框架将在未来继续改进。

2019 年成为一名数据科学家需要具备哪些技能?

原文:https://towardsdatascience.com/what-are-the-skills-needed-to-become-a-data-scientist-in-2019-1ed5afa8d989?source=collection_archive---------7-----------------------

“数据科学家”是美国最好的工作,这对科技和相关行业的任何人来说都不足为奇。毕竟,这是《哈佛商业评论》和《T2 玻璃门》连续四年(T5)报道的内容。即使我们把 117,000 美元的基本工资从等式中剔除,这个职位在所有其他方面仍然很有吸引力。例如,目前转向使用机器学习来快速跟踪业务增长,这确保了跨行业对能够处理数据和新兴技术的熟练专业人员的稳定需求。量化需求:根据 LinkedIn 的劳动力报告,151,717 名数据科学家将受到热烈欢迎。让我们不要忘记在职满意度——大多数数据科学家实际上是快乐的(他们的话,不是我们的)。

但是本文并不是要概述数据科学是一个明智的职业决策。

这份报告的目的是让“数据科学家”这个集体实体了解数字运算算法,并理解是什么造就了数据科学家。

对数据科学家进行逆向工程需要分析他们的技能组合、工作经历、工作行业、学术背景和正式资格。了解这一点后,有抱负的数据科学家可以采取明智的专业措施来获得这一头衔。

当我们 365 数据科学在 2018 年第一次试图拆解数据科学家时,我们揭示了丰富的专业概况。自我们最初的研究以来已经过去了 12 个月,重复的研究表明,该领域正在发展,典型的专业人士也在发展。

关于方法论的一点注记

集体“数据科学家”档案是由一项对 1,001 名目前受雇为数据科学家的专业人员的研究提供的。这些数据是根据一系列先决条件从这些数据参与者的 LinkedIn 个人资料中收集的。40%的样本目前受雇于财富 500 强公司,而其余的在其他地方工作;此外,引入了位置配额以确保有限的偏差:美国(40%)、英国(30%)、印度(15%)和其他国家(15%)。这一选择是基于对数据科学最受欢迎的国家的初步研究,这些国家的信息是公开的。

2018 年的典型数据科学家和 2019 年有关联吗?

一眼看去,绝对!这个领域仍然由男性(69%)主导,他们可以用至少两种语言进行对话(不要与编程语言混淆,如果包括编程语言,这一数字至少会增加一倍)。他们已经工作了 8 年,但其中只有 2.3 年是数据科学家。他们可以自豪地获得第二轮学位(74%的人拥有硕士或博士学位),至少用 Python 或 R (73%)编写“Hello World”以外的程序(通常两者都有)。

Summary

幸运的是,对于我们这些女性或尚未获得博士学位的人来说,数据的分割讲述了一个更丰富、更真实的故事。

“数据科学家”是指哲学博士吗?

正如这个领域并非女性固若金汤,拥有博士学位也是这个职位的先决条件。事实上,不到三分之一的数据科学家拥有博士学位(28%)。这一数字与去年的 27%相当,这似乎意味着行业不会有意引入一个高不可攀的学术实力。

Highest level of education received

另一方面,如果硕士学位是有抱负的数据科学家愿意投入时间和精力的事情,它似乎是学术资格的黄金标准(46%的样本持有硕士学位)。

然而,有一个趋势似乎正在形成,那就是“数据科学家”职位上拥有第二周期学位的专业人士的比例将会下降,而只有学士学位的数据科学家将会进入该领域。数据证实了这一猜测,因为与去年相比,只有学士学位的数据科学家数量增加了 4%(2019 年为 19%,2018 年为 15%)。

最后,一些法学院毕业生(千分之一)成为数据科学家的事实给我们留下了一些回旋的余地,当谈到有抱负的数据科学家可以获得的学位水平时。

教育水平和工作经验

从大学,到实习,再到最后的归宿一个‘数据科学家’。这是我们团队中 8%的数据科学家的故事。对这些专业人士来说,在美国找到最好的工作需要一个实习职位和一个硕士学位(71%)或学士学位(18%)。

Level of education and previous work experience

对于其他人来说,这条路从未偏离离开学术界(9%)。正如所料,拥有硕士学位的数据科学家(47%)和拥有博士学位的数据科学家(44%)之间的比例相当,其他教育水平几乎不存在。

那么,除了实习或直接从学术界来,还有其他方法打开数据科学职业的大门吗?

两男一女走进一个房间:谁将是下一个数据科学家!

  1. 学术研究者
  2. 信息技术专家
  3. 实习生

根据我们的数据,所有这些都是进入数据科学的门户职位,成功率相当:分别为 9%、9%和 8%。虽然这可能不是我们的一些读者所希望的,但这些数字开始描绘出一个有许多切入点的职业的画面。

还要考虑数据分析师职位(13%)、顾问(6%),当然还有当前数据科学家可能从事的其他工作(13%)(包括不少于 15 个职位和头衔)。

Last position before “Data Scientist”

如果你倾向于数学,我们希望你是,因为数据科学意味着一些分析能力,你会注意到这里有很大一部分以前的工作职位分析丢失了。事实上,我们团队中目前担任数据科学家的人中,有 42%已经在之前的职位上担任过数据科学家。这是一个悖论——获得“数据科学家”头衔的最佳方式是已经拥有它。

我们让读者进一步猜测数据科学家是否喜欢跳槽(他们也知道自己的价值!),或者说自报数据并不总是最好的数据。

我应该学习计算机科学和数学,还是可以学习植物学,然后继续成为一名数据科学家?

好吧。要成为一名医生,你需要去医学院;成为律师——法学院;警官——一个特殊的学院,等等。在撰写本文时,数据科学学校很少,如果有的话,那么数据科学家研究什么呢?

事实上,我们组中有相当一部分人学习了数据科学和分析,但在我们继续之前需要注意一下符号。由于大量独特的学位可用于学术研究,我们将它们分为七个学术研究领域。

  1. 经济学和社会科学,包括经济学、金融、商业研究、政治学、心理学、哲学、历史、市场营销和管理
  2. 自然科学,包括物理、化学和生物
  3. 统计学和数学,包括统计学和以数学为中心的学位
  4. 计算机科学,不包括机器学习
  5. 工程
  6. 数据科学和分析,包括机器学习
  7. 其他,在那里你可以找到艺术和设计,大气科学,和…其他

也就是说,在我们的研究中,12%的数据科学家专业人士学习数据科学和分析。虽然这个领域本身很新,但越来越多的大学提供专业学位,为你在数据科学领域的未来做准备。鉴于典型的数据科学家档案揭示的受教育水平,大多数数据科学家都是硕士水平也就不足为奇了。

然而,数据科学和分析并不是我们这个群体中最受欢迎的学位。

取而代之的是计算机科学(22%)。数据科学家的工具箱中有很大一部分是编程语言和数字处理工具,由于缺乏更广泛的替代品,这个学位是一个自然的选择。

令人惊讶的是,今年研究的亚军学位不是统计学和数学(以 16%的普及率稳居第三),而是经济学和社会科学(21%)。尽管如此,工程毕业生仍占该群体的 9%,这支持了一个观点,即最能让你为处理和处理大数据做好准备的三大学位是计算机科学、统计和数学以及工程(合起来占该群体的 50%)。

Area of academic studies

另一方面,样本中经济学和社会科学毕业生的大量存在(21%)对于不太倾向于数学的有抱负的数据科学家来说可能是个好消息!几乎和仅仅从计算机科学领域进入这个领域的人一样多。还有 11%来自自然科学背景。考虑到数据科学通常是用统计学来编程的(或者用编程来编程的统计学),这个结果相当有趣。

常春藤联盟还是‘拜拜,数据科学…’?

数据科学绝对不是常春藤联盟毕业生的私人竞技场。虽然我们样本中有三分之一的专业人士毕业于排名前 50 的大学(根据 2019 年泰晤士报高等教育世界大学排名),但第二大群体是由泰晤士报甚至没有排名的大学毕业生组成的(23%)。大家都松了一口气——这个领域没有对那些接受世界级高等教育机会有限的专业人士敞开大门。

Rank of university attended

数据表明,数据科学是一个仅凭技能和优点就能获得成功的领域,这并不完全令人震惊。毕竟,分析和处理数据是实用的动手技能。我们中最热情的人可能会通过实践、好奇心和足智多谋而变得与众不同。

关于排名中的其余集群,它们的人口相对均等。但是,读者应该注意到,群集的大小不同(例如,1–50 对 301–500 或 501–1000)。尽管如此,这对有抱负的数据科学家来说都是好消息:这个领域不仅有来自各种背景和不同学术水平的人,而且也欢迎来自《泰晤士报》排名中任何大学的专业人士。

自我准备和在线课程

众所周知,数据科学家来自许多不同的背景。数据科学与许多其他学科不同,它拥有强大的教育基础设施。这意味着许多想在这个领域获得成功的人需要承担起自己学习技能的责任。

但是我们如何准确地衡量是谁干的呢?

最可靠的方法是看他们个人资料上贴的网上证书。有太多的在线平台提供优质课程,价格堪比浪漫的晚餐约会,打造一套量身定制的技能从未如此容易(或便宜)。

我们发现,我们收集的资料中有 43%发布了至少一门在线课程,平均有 3 个证书。

Certifications and accomplishments

当然,一些数据科学家可能已经通过不同的方式自学了。而其他人甚至可能不张贴他们收到的所有或任何证书。如果他们不相信一旦他们获得了更多的经验,他们会相关,为什么他们会浪费时间或空间在他们的电子简历上?考虑到收集数据的平台,这一点值得记住。

那么,我们能用这些信息做什么呢?

首先,我们可以看看参加(或至少发布)在线课程的人和没有参加的人的背景是否有任何关联。学历水平是一个因素吗?可以毫不夸张地假设,来自排名较低的大学的人会选择更多的在线课程。但也许来自排名更高的大学的学生更专注于他们的教育,所以,让我们不要假设,而是看数据。

在线课程和大学排名

事实上,当比较这两个因素时,有一个非常有趣的结果。

在我们回顾之前,请记住大学排名集群在规模上确实有所不同,包括研究参与者和大学排名。我们还想指出,1000+集群仅包含 7 个参与者,这是不够的数据。所以,我们不会把它们作为有效结果来讨论。

也就是说,我们从剩余的数据中得到了一些非常有趣的见解。

Online courses and university ranking

第一个有趣的结果是,排名前 500 的四所大学的结果略有不同。这并不令人意外,但它确实显示了与去年研究结果的明显差异,去年排名前 100 位的大学毕业生发布的在线课程明显减少。

也许这说明自我准备是有价值的,甚至对名牌大学的学生来说也是如此。

下一个有趣的结果出现在 501–1000 排名聚类中,它显示了证书数量的急剧增加。同样,这不会被认为是令人震惊的:我们愿意推测,你去的大学排名越低,你就越想通过大量的在线证书脱颖而出。令人惊讶并对我们假设的有效性产生怀疑的是下一个集群(未排名)的行为。在那里,证书的数量下降到与前 500 名相当的百分比。*

虽然很难知道这是为什么,但不难看出自我准备的重要性,并且考虑到自去年以来这一数字一直在上升,特别是在顶级大学,有抱负的数据科学家也意识到了这一点。

获得网上证书是一回事,但是学习哪些技能最有益呢?用人单位找哪些?当然,我们已经有数据来发现这一点。

就业国家和编程技能

由于实施就业配额的国家不同,我们不仅可以查看总量,还可以进行可靠的国家间比较。我们将样本分为四个地区:美国、英国、印度和其他地区,样本权重与去年的研究相同(见上文方法)。

在我们进入地理细分之前,我们需要一些最好由汇总数据提供的背景信息。

The Data Scientist coding toolbox

数据科学社区中最流行的编程语言是 Python,其次是 R。值得注意的是,与去年相比,R 的受欢迎程度下降了 10%,鉴于 Python 的多功能性,这并不完全令人惊讶。

但是让我们进一步细分。

从区域划分来看,结果与总量相差不远。

Country of employment and coding language

为了简单起见,我们研究了 4 种最常用的语言:Python、R、SQL 和 MATLAB。与去年版本的第一个最突出的不同是,Java 已经被 MATLAB 取代,成为第四大最常用的编程语言。领先的三人组在参赛者方面保持不变,但在组成方面没有变化。几年来, Python 一直在蚕食 R 的市场。

事实上,这也是我们在这里看到的。Python 无疑是世界上最常用的数据科学语言,只有美国和印度使用它。

值得注意的是,关系数据库的使用在全球范围内似乎是持平的,SQL 在任何地方都被同等地使用。

随着印度最近成为外包天堂,也许有必要看看另一个细分领域——工业。

就业和工业国家

我们将样本分为 4 大类行业:工业、医疗保健、金融和科技。医疗保健是整体中微不足道的一部分,因此关注其余部分是有意义的。

Industries hiring Data Scientists

事实上,数据并没有显示出很大的跨国差异(见下文),除了英国的数据科学仍然是“金融”多于“技术”,而印度的数据科学比其他国家的数据科学“工业”程度低。虽然后者并不令人惊讶,但值得注意的是,在我们之前的研究中,技术部门拥有 70%的数据科学家人才。在过去的一年里,这似乎发生了巨大的变化。

最后,与金融相关的数据科学在印度和世界其他地方发展迅猛,赶上了其他行业。

Country of employment and industry

对于美国的数据科学家来说,我们可以说技术和产业集群正在获得大部分人才。

就业国家和学位

对我们来说,最有趣的细分之一是学位细分。潜意识里,我们认为博士将主宰这个领域。去年的数据显示,只有三分之一的样本是“哲学博士”。在超过一半的情况下,仅仅一个硕士学位就足够了。

今年,我们看不到什么不同。对于英国、印度和其他国家,我们没有变化。本科就够了,硕士更好。

然而,最引人注目的是美国博士人数的增加。再加上科技行业在美国一直占据更大份额的事实,你就会拥有它——受过高等教育、以技术为导向的数据科学家可能比以往任何时候都更努力地工作,以提供我们都期待的未来数据科学。

Country of employment and academic degree

如果你还没有拿到博士学位,并且在我们的名单上,那么你很有可能来自印度。但是,当涉及到实际工作经验时,这又是怎么回事呢?

就业国家和工作经历

哪个地方的职业发展最快?

要获得这种洞察力,有必要看看数据“奇才”在实现成为数据科学家的梦想之前的经历。

Country of employment and work experience

在 2018 年版中,我们看到了国家之间的巨大差距。美国超过一半的数据科学家拥有 5 年以上的经验。

今年?

一点也不像。

他们可能已经辞掉工作,或者成为了经理。毕竟,作为一名数据科学家也是令人沮丧的。但是“年轻人”正在让路。在印度和英国更是如此。似乎有更多的职位空缺,即使没有工作经验,你也有 20-30%的机会得到那个职位!

公司规模和编程语言

Company size and programming language

虽然 Python 仍然在非 F500 公司中得到更广泛的应用,但在几乎所有其他类别中,F500 都在与非 F500 公司携手前进。对于任何喜欢当前技术(R 和 Python)的数据科学新手来说,这是一个好消息。与去年的成绩相比,我们已经迎头赶上了很多…

公司规模和大学排名

令人惊讶的是,大学排名对数据科学家的雇主没有影响。

Company size and university rank

引用我们去年的话:‘到处都需要数据科学家。从 500 英镑到一家科技初创企业!”**

这也加强了我们的信念,即个人技能和自我准备是成为一名成功的数据科学家的更重要的因素,的雇主知道这一点。**

结论

希望这篇文章不会让你怀疑数据科学家这个职业是否是你可以实际从事的职业。相反,我们希望能够伸出援助之手。我们从去年和今年的研究中提取的主要信息之一是,如果你拥有成为数据科学家的技能基础,你 可以 成为数据科学家。看到数据科学专业在未来 2-5 年内如何变化将是有趣的,但现在,一个通用的数据科学家档案似乎正在形成:一个跨行业和跨地区的独特编程语言工具箱;最好是硕士学位,或学士学位和实践能力证明;和自信的不断学习的态度是这个领域的主流。

最后一点:我们的目标是随着数据科学家的发展,创建一个完整而有用的数据科学家档案。如果任何人对我们可以做得更好或更仔细检查的事情有建议或意见、反馈和想法,请让我们知道!开放式对话对于帮助有抱负的数据科学家做出明智的职业决策至关重要。

祝您的数据科学之旅好运,感谢您的阅读!

附:这是我们去年的研究。也许你能发现我们忽略的趋势?

原载于 2019 年 1 月 30 日 365datascience.com*。***

人工智能产品经理——你在优化什么?

原文:https://towardsdatascience.com/what-are-you-optimizing-for-17c4406544ec?source=collection_archive---------21-----------------------

15 个月前,我加入了一家初创公司,负责产品管理。在不涉及太多细节的情况下,我们为 B2B 公司的客户成功团队开发了一个基于人工智能的软件解决方案。在这篇文章中,我将讨论用户体验和人工智能(AI)之间的关系,以及对产品经理来说有什么意义。

Photo by Rock'n Roll Monkey on Unsplash

产品经理的人工智能是什么?

产品经理需要了解他/她的客户。她需要了解他们的工作环境、他们的使命、他们想要实现的目标、他们面临的挑战,然后设计一个有针对性的解决方案来最好地满足这些需求。他们需要和一群有才华的人一起,将这些想法变成一个连贯且易于使用的产品。

人工智能现在是技术的中心已经有几年了,而且预计会停留更长时间。人工智能不再只是一个时髦的词,它已经有了现实世界的应用程序,这些应用程序在它们的类别中进行了一场革命:Siri、Alexa、网飞推荐引擎、谷歌照片等等。

产品必须解决现实世界的问题。技术和实现细节应该服务于产品,并且对可用性有最小的影响(至少在软件中)。人工智能是一种解决问题的实现方法,但它的预测性对用户体验和可用性有重大影响。

当一家公司为任何市场/类别设计基于人工智能的解决方案时,它总是会问自己——我们优化产品是为了什么?我们是在优化准确性、阳性预测值还是命中率?或者换句话说——精确还是回忆?回答这些问题至关重要,因为它会影响产品 UX 及其价值主张。

作为一家开发基于人工智能的解决方案的初创公司的产品经理,我每天都在思考这个问题,并根据决策来制定我们的解决方案。

你能回忆起它们的意思和区别吗?

我想回忆和精确听起来很熟悉。你甚至知道它们的意思,但已经忘记了。精确度和召回率是统计术语,用于衡量算法返回结果的相关性。这些术语有官方的学术解释,但是我想用一个例子来回顾一下。

下雨了吗,伙计?

假设我有一台机器可以预测明天是否会下雨。每天,如果明天会下雨,机器会返回“是”,如果不会下雨,机器会返回“否”。我们连续运行机器 100 天,得到了以下结果:

  • 机器预测会有 10 次降雨
  • 剩下的 90 天,据说天气会很干燥(没有雨)

现在我们想将预测与实际天气进行比较:

  • 十次天气预报说要下雨,结果都下雨了。预测非常准确。有多精确?10 次预测中有 10 次下雨→ 10/10。我们有 100%的精确度。哇!这是否意味着我拥有了终极降雨预测机器?不确定..让我们检查一下其他 90 天。
  • 当我们计算雨天的总数时,我们发现实际上总共有 20 个雨天。这是什么意思?机器回忆(正确预测)了 20 个雨天中的 10 个雨天→ 10/20 → 50%。所以它预测了 50%的雨天,但也错过了其中的 50%。
    现在,你觉得我的机器还厉害吗?

Photo by Geetanjal Khanna on Unsplash

让我们把它发挥到极致,我的机器刚刚坏了,每天它都说明天会下雨。收到的结果:

  • 将要下雨——100 天
  • 不会下雨— 0 天

现在让我们再次评估结果:

  • 机器现在没有那么精确了,因为实际上只下了它预测的总共 100 次雨中的 20 次→ 20/100 → 20%
  • 但是从实际的 20 个雨天来看,机器正面预测了所有的 20 天→ 20/20 → 100%回忆

现在,假设您可以去商店购买上述机器中的一台,您更喜欢哪台机器?更精确的一个,如果它说要下雨,你可以肯定,但会错过许多雨天,或者机器不会错过任何雨天,但其他许多天都是错误的?

答案并不那么直截了当。也许对于降雨预测来说是这样,但对于许多其他基于人工智能的应用来说,真的不是。

你糊涂了吗?

没关系。正是出于这个原因,我们创建了混淆矩阵,来帮助您对事物进行分类,并计算精确度和召回率:

Confusion Matrix

精度= TP / (TP+FP)
召回= TP / (TP+FN)

让我们用天气预报机器再检查一遍:

Weather Prediction — Machine A

精度= 10/(10+0) = 10/10 = 100%
召回率= 10/(10+10) = 10/20 = 50%

Weather Prediction — Machine B

精度= 20/(20+80) = 20/100 = 20%
召回率= 20/(20+0) = 20/20 = 100%

那么,你在优化什么呢?

现在当我们真正理解了其中的区别,我们应该如何优化我们的模型和产品呢?精准还是召回?大多数时候,我们不得不选择一个而不是另一个,同时拥有高精度和召回率几乎是不可能的。

决定优化什么是基于许多因素:心理,财务,犯错的成本,错过的成本,声誉,时间等等。

让我们来看三个真实场景并进行讨论:

  • 癌症检测 —作为一名患者,你愿意被检测出患有癌症,开始治疗,然后发现自己并未患病(假阳性)吗?或者发现自己得了癌症时已经来不及治疗了(假阴性)?
    如果你是健康保险公司,你的答案会改变吗?你能资助所有不必要的治疗吗?你会提高保险费率以确保不会错过任何人吗?作为一名医生,你会拿自己的名誉冒险去错过检查吗?
    至少作为患者,没有人愿意错过被检测。因此,当构建检测癌症的产品时,优化召回(避免假阴性)将更有意义。
  • 网飞推荐——作为用户,你更希望得到与你高度相关的推荐,而不是那些可能受欢迎但不适合你的一般东西。所以在这种情况下,产品是优化精度(避免误报)。
  • 机场安检——作为一名乘客,你愿意排着长长的安检队伍等待,这样就不会有危险意外通过安检了吗?或者你更愿意冒着枪支可能被走私到飞机上的风险快速通过这些检查?
    监管可能会说不要错过任何危险。从商业角度来看——安全是一种负担,它要花很多钱,让人烦恼,而且在护照检查之后,留给人们花钱的时间更少了。

我们可以讨论几十个例子,并试图了解产品试图优化什么,以及在与它交互时,它如何影响整体用户体验。

客户流失预测

我们开发了一个基于人工智能的产品,用于预测 B2B 公司的客户流失。我们使客户成功团队能够将他们的努力集中在真正重要的客户身上,并交付更好的结果。

优化精度意味着该产品将精确定位有流失风险的目标客户名单,并确保没有人误入其中。朝这个方向发展的不利之处是会错过一些会流失的客户端,而这些客户端没有被检测到。
缓解这种情况的一个想法是将列表分成几页,第一页包括最相关的客户,如果用户想了解更多,他们可以进入下一页。谷歌搜索结果提供了这样一种体验——第一页包含最相关的结果。如果你想探索更多,你也可以查看其他页面(真的有人这样做吗?!)

优化召回意味着产品不那么敏感,会产生更长的有流失风险的客户名单,并确保我们不会遗漏任何人。不利的一面是,该列表还包含误报,这些客户没有流失的风险。缓解这种情况的一个办法是增加其他客户特征的列表,这些特征可以提供更多的风险提示(例如优先级)。

作为产品经理,我需要了解我们的客户——他们是更能容忍假阳性(没有风险的客户)还是假阴性(没有检测到所有有流失风险的客户)?

他们期望从产品中获得什么样的体验?他们有足够的资源来处理更长的列表吗?

你怎么想呢?你会优化什么?你还有其他可以分享的例子吗?

感谢阅读,有任何问题可以在这里联系我或者通过我的 LinkedIn

什么是零知识证明?

原文:https://towardsdatascience.com/what-are-zero-knowledge-proofs-7ef6aab955fc?source=collection_archive---------4-----------------------

除非你不在网上生活,否则你使用的应用程序会捕获并可能转售你的个人数据(比如你的联系信息、兴趣和偏好)。即使你不使用应用程序,你的网络提供商和手机操作系统也会收集你的数据。公司通过两种方式从这些数据中受益:利用这些数据优化他们的服务,以更好地吸引你,并将其转售给其他公司。

我们如何让人重新掌控他们的数据?问题是有些服务确实需要你的数据来为你服务。例如,不与保险公司共享健康信息就很难获得健康保险,或者不披露信用评分就很难获得贷款。

如果有一种方法可以显示您在所有指标上都处于健康范围内,而无需分享您的实际健康信息,或者证明您的信用评分足够好,而无需披露实际信用评分,会怎么样?

零知识证明

零知识证明(zkp)允许在不泄露数据的情况下验证数据。因此,它们有可能彻底改变数据收集、使用和处理的方式。

每个交易都有一个“验证者”和一个“证明者”。在使用 ZKPs 的事务中,证明者试图向验证者证明某件事,而不告诉验证者关于这件事的任何其他事情。

通过提供最终的输出,证明者证明他们能够在不暴露输入或计算过程的情况下计算一些东西。同时,验证者只知道输出。

一个真正的 ZKP 需要证明三个标准:

1.完整性:它应该让验证者相信证明者知道他们所说的

2.可靠性:如果信息是假的,它不能使验证者相信证明者的信息是真实的

3.零知识度:它不应该向验证者透露任何其他信息

例子:沃尔多在哪里

在去年的一次演讲中,Elad Verbin 用一个例子“Waldo 在哪里”很好地解释了零知识证明。

在“沃尔多在哪里”儿童读物中,读者被要求在一群做着各种事情的插图人群中找到沃尔多(戴着眼镜、红白相间的毛衣、蓝色牛仔裤和无沿帽)。

Waldo (left), and a Where’s Waldo puzzle (right). Sources: Zazzle & TechSpot.

假设我(作者)是证明者,你(读者)是验证者。我声称有一种算法可以很容易地找到沃尔多,但我只会让你用它来换取一笔费用。你想要算法,但不想在我证明它有效之前付钱。

所以,像很多交易一样,我们想要协作,但是我们并不完全信任对方。

为了证明我有一个可行的算法,我在地板上放了一个展示一大群人的插图。在请你遮住眼睛后,我用一块大而平的黑纸板(覆盖的面积比插图本身大得多)盖住插图,上面有一个小小的切口。这个微小的切口让我们可以看到瓦尔多,但是他在图像中的位置或者谜题开始和结束的地方。然后,我请你再次闭上眼睛,我把木板从沃尔多在哪里的谜题上拿下来。

Here’s Waldo!

我已经证明了我可以很快在拼图中找到瓦尔多,而不需要告诉你瓦尔多在那张图片中的位置,我是如何这么快找到他的,或者关于那张插图的任何其他事情。这个练习我们重复的次数越多,我就越有可能找到一个有效的快速算法。

交互式和非交互式 ZKPs

zkp 有两种类型:交互式和非交互式。

互动:上面的沃尔多在哪里的例子是一个互动证明,因为我,证明者,执行了一系列的动作来说服你,验证者,某个事实。交互式证明的问题是它们有限的可转让性:为了向其他人或验证者多次证明我找到 Waldo 的能力,我必须重复整个过程。

非交互式:在非交互式证明中,我可以提供一个任何人都可以自己验证的证明。这依赖于验证者为证明者选择一个随机的挑战来解决。密码学家菲亚特和沙米尔发现,使用一个哈希函数来选择挑战(不需要与验证者进行任何交互),可以将一个交互式协议转换成一个非交互式协议。证明者和验证者之间的重复交互变得不必要,因为证明存在于从证明者发送到验证者的单个消息中。

Zk-SNARKs

Zk-SNARK

零知识简洁的非交互式知识论证(Zk-SNARKs,一种非交互式 ZKP)是零知识,因为它们不向验证者揭示任何知识,简洁是因为证明可以被快速验证,非交互式是因为证明者和验证者之间不需要重复交互,知识论证是因为它们提供可靠的证明。

ZKPs 的用例

ZKPs 可用于保护医疗保健、通信、金融和市政技术等领域的数据隐私。

金融领域一个有趣的用例是 ING 的提议,证明一个数字在特定范围内,但不透露该数字。因此,贷款申请人可以证明他们的工资在一定范围内,有资格获得贷款,而不必透露他们工资的确切数额。

到目前为止,zkp 最突出的用途是 Z-Cash ,一种允许私人交易的加密货币。

AdEx 网络允许分散的 ZKP 广告拍卖,在这种拍卖中,用户可以为投放广告的价格出价,而无需向其他用户透露该价格。

结论

零知识证明具有巨大的潜力,通过允许其他人验证数据的某些属性而不暴露数据本身,让人们重新控制他们的数据。这将对金融、医疗保健和其他行业产生巨大的影响,既能实现交易,又能保护数据隐私。

陕雷

关注 Lansaar Research 关于媒体的最新新兴技术和新商业模式。

关于花童,数据分析能告诉我们什么

原文:https://towardsdatascience.com/what-can-data-analytics-tell-us-about-flower-boy-59c037b1622c?source=collection_archive---------28-----------------------

《创始者泰勒》的碟学分析

《花童》被评论家们誉为泰勒这位创作者最好、最成熟的专辑。他得到了 Pitchfork 的 8.5 分,Pitchfork 称这张专辑“具有变革性、热恋性和穿透力”,并获得了 2018 年格莱美奖最佳说唱专辑类别的提名。

虽然我喜欢泰勒以前的专辑,但我不得不承认花童是我最喜欢的一张。从《花园小屋》梦幻般的吉他和弦,到《无聊》的绝妙结尾和《我没有时间》的野蛮节奏,我认为所有这些元素的并列融合得非常好。

作为一个音乐迷和数据爱好者,我问自己这样一个问题:是什么让花童与泰勒过去的专辑如此不同?已经有无数的博客帖子和视频从音乐的角度回答了这个问题,我想通过分析的方法来补充这个话题。我认为这也是一个正确的时机,因为他明天将发行一张新专辑,谁知道也许会有一个完全不同的风格。

所有的分析都是在 Python 3 上完成的,一旦我可以清理它,我将在 GitHub 上发布我的代码。

获取和清理数据

为了这个项目,我综合了通过 Spotify 和 Genius 获得的数据。非常感谢 这篇 帖子的作者,他展示了一种易于理解和快速实现的调用 Spotify API 的方式,并且节省了我大量的时间。不幸的是,由于私生子不在 Spotify 上,我无法获得关于这张专辑的数据,所以我从分析中排除了它。

对于每首歌曲,Spotify 都提供了大量信息,其中最让我感兴趣的是音频功能。有很多东西可以定义一首歌曲的特征,如声音、能量、舞蹈性、乐器性等等。我强烈推荐你阅读 Spotify 文档,你可以在这里找到,对每个对象有一个精确的定义。Genius 允许我获取每首歌曲的歌词,以便进行文本分析。

Spotify 数据已经是一种易于分析的格式,我只需将它们转换成一个数据框架。不过,歌词需要清理。为了做到这一点,我用 NLTK 库删除了所有的标点符号和停用词,将所有内容都用小写,还删除了泰勒歌词中大量使用的表达,而没有添加太多的含义,如:“耶”、“那”或“嗯”。

Original data from Genius

Cleaned data

现在到了有趣的部分!

分析音频特征

我首先看了一下每个音频特征和每个专辑的含义,以便有一个大致的概念。

在所有可用的功能中,花童显然从一个方面从其他专辑中脱颖而出:声音。这被 Spotify 定义为“一个从 0.0 到 1.0 的关于音轨是否是声学的置信度。1.0 表示音轨是声学的高置信度”。在这个尺度上得分最高的歌曲是《无聊》,其次是《花开的地方》和《妖精》。

如果我们看一下这个特征的分布,我们可以看到,虽然其他专辑是倾斜的,有一个长的右尾巴,但花童的分布更均匀,显示出更大的多样性。

为了进一步测试这个假设,我运行了一个 95%置信水平的单样本 t 检验。这里的零假设是,花童的声音均值与总体均值相似。发现的 p 值是 0.039,这显示了我们可以拒绝零假设的有力证据。然而,由于人口规模相对较小,我们必须小心这一结果。

在我看来,花童在声学方面得分最高,因为使用了:采样原声鼓(无聊,前言),古典风格的弦乐安排(再见,这朵花盛开的地方),干净的电吉他(花园小屋,无聊,闪闪发光)和钢琴(有时会再见)。这些元素当然存在于泰勒之前的作品中,但程度较低。他甚至在 2017 年 12 月举行的微型桌面会议上制作了一些花童歌曲的声学版本。所以,请善待自己,在阅读本文其余部分的同时,听听下面的视频吧!

影评中经常提到的另一个评论与《花童》的整体连贯性有关。事实上,泰勒的作品经常被批评为缺乏统一性,并且如 Pitchfork 所提到的那样“凌乱”。

过去,泰勒的专辑臃肿而凌乱。《卖花男孩》比泰勒的普通专辑短 17 分钟,有更多低调的过渡,更少的无序和混乱。

作曲家和音乐理论家阿诺尔德·勋伯格写道,音乐的连贯性是通过反复使用一个处于歌曲中心的动机,同时保持与其他动机的关系而产生的。不幸的是,Spotify 的数据不允许我们研究歌曲的连贯性。然而,我们可以看看每首歌曲之间每个特征值的变化,从而对连贯性有一个大致的概念。

在计算了每个特征的标准偏差(它表明一组值离平均值有多远)后,我发现花花男孩的节奏和能量值都最低,这意味着每首歌曲的节奏和能量与平均值之间的差异较低。通过绘制一条曲线,我们可以看到,除了最后两首歌曲之外,花童歌曲之间的节奏变化没有其他歌曲那么明显。因此,花童在节奏和能量变化方面似乎更加稳定。

文本数据分析

警告:本部分的某些内容可能不适合所有人。

尽管每首歌的平均字数最低,但《卖花男孩》的歌词丰富度最高,这是由独特字数与总字数之比定义的,紧随其后的是《樱桃炸弹》。

如果我们看看最常用的词,我们可以看到,与泰勒的上一张专辑相反,花童最常用的词(即“时间”,仅在歌曲《无聊》中就使用了 71 次和 50 次)不是脏话。事实上,随着泰勒年龄的增长,他歌词中的脏话比例从《妖精》的 10%下降到《花童》的 4%。

The share of swear words are represented in brown

下面的 wordcloud 很有趣,突出了花童最突出的主题。在这张专辑中,泰勒谈了很多他的感受,他让我们一瞥他每天的白日梦,我们可以通过他最常用的一些词(“感觉”、“厌倦”、“孤独”、“生病”等)来看。).将花童的词云与他之前的一部作品相比,歌词中的鲜明对比显而易见。

Word cloud for Flower Boy

Word cloud for Goblin

最后,我用 NLTK 的 vader 函数根据歌词来判断一首歌的正面或负面。在这个量表中,分数在-1 和 1 之间,1 是最消极的,1 是最积极的。

总的来说,泰勒的歌曲往往有负面的意义,而花童似乎更积极。同样,由于我们人口少,很难说明这个数字的重要性。《卖花男孩》的平均分较高,可能是因为它包含的脏话较少,一些主题也没有他之前的作品那么“黑暗”。

结论

根据我的分析,《花童》与泰勒以往的专辑有以下不同:

  • 更加“声学”
  • 在每首歌曲之间的节奏和能量变化方面更加连贯和恒定
  • 具有更高水平的抒情性、丰富性和一些积极性

这是不是他最好的专辑是一个主观的问题,但我认为这是他迄今为止最独特的专辑,这些都是他成熟的证明。

我希望你喜欢读这篇文章,就像我喜欢做这个小项目一样。我很想得到一些反馈,并在这方面做得更好,所以请不要犹豫,评论和挑战我的发现!

关于美国的枪支法律,机器学习能告诉我们什么?

原文:https://towardsdatascience.com/what-can-machine-learning-tell-us-about-americas-gun-laws-da01d9fb7413?source=collection_archive---------15-----------------------

深入分析

一项 25 年的分析揭示了惊人的见解。

在美国,似乎我们从来没有超过几个星期没有听到另一个大规模枪击事件。随着每一起新事件的发生,要求加强枪支管制法、扩大联邦背景调查以及废除突击步枪的呼声不断高涨。尽管反对派别援引第二修正案权利迅速驳回了每一项上诉,但其他实用性讨论经常出现。具体而言,这些法律的效力经常受到质疑。

我们如何知道哪些法律有效,哪些无效?有没有什么法律可以在不侵犯个人权利和自由的情况下实施?在这里,我们将利用机器学习和人工智能的力量,看看我们能否找到这些问题的答案。

强有力的枪支法律能降低枪支死亡率吗?

我们不想做任何假设,所以我们将从回答一些最基本的问题开始。为了回答这个问题,我们求助于吉福德法律中心:一个非营利组织,其使命是减少枪支暴力。他们提供了 T4 各州枪支法的年度排名,给每个州分配了一个传统的字母等级。如果枪支法有效的,我们预计枪支死亡率会随着等级的上升而下降。利用美国疾病控制中心(CDC)2017 年的数据,我们可以绘制出各州之间的关系。

Using a standard GPA calculation, a grade of 4 represents an A, while 0 represents an F.

所以,更强有力的法律意味着枪支死亡率下降,我们可以到此为止,对不对?!要是这么简单就好了。我们只有一年的数据,不知道吉福兹是怎么算出成绩的。更重要的是,我们不知道总死亡率会发生什么变化?枪支死亡率包括自杀率和他杀率。我们怎么知道人们不仅仅是用一种方法代替另一种方法?让我们以总体自杀率和凶杀率为目标,来看看更广泛的时间段(2014-2017)。

Data Sources: Giffords Law Center and CDC’s Wide-ranging Online Data for Epidemiologic Research (WONDER) tool.

尽管强有力的枪支法似乎确实降低了杀人和自杀的比率,但数据中有很多噪音。此外,自杀率与他杀率之间的关系要明显得多。事实上,数据表明,从 F 到 A 的成绩提高可能会导致自杀率下降近 50%。

凶杀率是怎么回事?这种关系在统计学上可能是显著的,但 r 平方得分表明法律的力量只能解释凶杀率变化的 6.7%。但是枪支法真的对降低凶杀率无效吗,还是发生了其他事情?

一些人认为,邻国薄弱的法律可能会破坏另一个国家强有力的法律。让我们探索一下这种可能性。

邻国的法律

通过计算每个州的邻居的平均分数,我们可以衡量该州对枪支法律的影响。首先,我们将使用一个由本帖中的 Ritvik Kharkar 描述的便捷代码块,它使用 Shapely 库来识别每个州的邻居。下面是这段代码的一个稍微修改过的版本。

OUTPUT
Alabama: ['Tennessee', 'Florida', 'Georgia', 'Mississippi']
Alaska: []
Arizona: ['Nevada', 'Utah', 'California', 'Colorado', 'New Mexico']
Arkansas: ['Tennessee', 'Texas', 'Louisiana', 'Mississippi', 'Missouri', 'Oklahoma']
California: ['Nevada', 'Arizona', 'Oregon']

从这里开始,只需要得到每个邻居的分数,然后计算所有邻居的平均绩点。没有邻居的州(阿拉斯加和夏威夷)使用所在州的等级。

OUTPUT
{'Alabama': 0.175,
 'Alaska': 0.0,
 'Arizona': 1.4,
 'Arkansas': 0.11666666666666665,
 'California': 1.0}

像以前一样,我们将绘制邻州 GPA 与目标州凶杀率的关系图,看看我们得到了什么。

有趣的是,邻居州的法律似乎比家乡州的法律对凶杀率有更大的影响。就自杀率而言,这种关系比以前弱了。同样值得注意的是,当枪支法律健全时,杀人率的变化会更低。这意味着强有力的法律能够抑制通常会推高利率的其他因素。

然而,16.1%的 r 平方值比我们希望看到的要弱得多。让我们深入法律本身,看看我们是否能获得一些具体的、可操作的情报。

州法律分析

理想的解决方案是分析州法律随时间的变化,而不是依赖一个无法独立分析的任意分级系统。收集数据、对特征进行分类以及对结果进行编目的过程需要大量的时间、专业知识和资源。幸运的是,另一个枪支控制倡导组织 Everytown Research ,从 1991 年起就记录了这些信息。

通过对 85 个维度的分析,该小组将每个特征框定为一个二元或分类问题。例如,“州法律是否普遍禁止所有被判重罪的人拥有枪支?”以这种方式组织问题的一个好处是,它们在回答中没有给主观性留下多少空间。

每个元素都属于八个类别之一:

  1. 背景调查
  2. 罪犯
  3. 家庭暴力
  4. 毒品和酒精
  5. 精神病
  6. 最低年龄
  7. 许可过程
  8. 其他的

答案不是用 1 和 0 来表示是或否,而是按照数字越大代表法律越严格的方式来排列。尽管这种方法需要预先做额外的工作,但结果的可解释性大大提高了。

还计算了邻近各州的平均响应,并将其纳入数据集中。经过额外的清理以减少数据中的噪声后,主要和相邻状态的 134 个维度仍然存在。

识别最重要的特征

从多元线性回归中的向后排除开始,我们排除了 p 值低于 0.05 ÷剩余元素数的特征。此外,后来发现一些特征适用于州和年份的最小选择,导致它们在最终结果中被过度表示。因此,排除了 85%的回答处于一个极端的问题(即 85%的回答为“否”)。

下面列出了前 20 个功能,以及它们各自给出至少部分“是”响应的状态数。例如,如果一个州回答“是,但仅适用于手枪”,则在图表中它将被视为部分“是”的回答。

Note: The response count for question 16 includes states that do disqualify people from getting permits.

请记住,这些问题中的一些在适用于邻近州时更有分量,而另一些则是指本州的法律。在我们开始尝试解释这些结果并确定潜在的主题之前,我们需要测试它们的重要性。从随机选择的州和年份中给定这些问题的一组答案,我们应该能够高度精确地预测各自的凶杀率。

机器学习和人工智能模型

使用 80%的数据子集,通过 5 重交叉验证和 SciKit Learn 的 GridsearchCV 对以下回归模型架构进行了训练。

  • 决策图表
  • 随机森林
  • 支持向量机
  • Adaboost 回归
  • XGBoost 回归器
  • Keras 回归器(人工智能模型)

通过训练模型,每个人都试图预测剩余 20%数据的凶杀率,成功程度各不相同。最后,发现 XGBoost 回归器是表现最好的模型,实现了 91.23%的解释方差得分。在下面的图表中,红点代表各州和各年份的实际凶杀率。蓝线代表模型根据 20 个问题的答案做出的预测。

Explained Variance Score: 0.9123

因此,我们的模型可以高精度地预测凶杀率,但它没有告诉我们任何关于所述比率潜在下降的信息。要回答这个问题,请考虑两种假想状态:一种状态对所有项目的回答是,另一种状态对所有项目的回答是否。预测的凶杀率有什么不同?对所有问题回答“是”的州比回答“否”的州的凶杀率平均低 52.41%。

在对个体反应进行调整时,通过测量预测凶杀率的变化,我们可以确定具有最大影响的特征。以下按重要性顺序列出了最重要的特征,并给出了 2019 年的肯定回答。

观察

一些清晰的主题出现在秘密携带、警察自由裁量权和家庭暴力方面。似乎当警察有权解除他们认为对公共安全构成威胁的个人的武装时,杀人率就会下降。当法律禁止持有家庭暴力禁止令的个人拥有枪支时,凶杀率也会下降。

也许最令人惊讶的是,不到一半的州禁止逃犯拥有枪支。请注意,这个话题与邻州最相关,而不是与本州最相关,为邻州法律的影响提供了进一步的证据。

宾夕法尼亚大学医学院 2019 年 3 月发表的另一项研究佐证了这一发现。该学校使用了完全不同的方法和数据集,追踪凶杀案中使用的枪支的购买情况。资深作者 Mark J. Seamon,医学博士,FACS,宾夕法尼亚医科大学创伤学、外科重症监护和急诊外科副教授说:

严格的州枪支立法可能会驱使一些人去更宽松的邻州收回枪支,这反过来增加了家乡的枪支和凶杀案数量,尽管其法律更具限制性。

研究中的一个关键发现是,“在最严格的州收回的枪支中,65%来自其他州。”

那么,我们该如何处理这些信息呢?我们稍后会谈到这一点。现在,我们将改变思路,进行不同的分析,这一次是考察法律对大规模枪击事件的影响,而不是整体凶杀率。

枪支法对大规模枪击事件的影响

从 1982 年到 2019 年的大规模枪击事件数据库可以在这里找到。同样的追踪枪支法与凶杀率的方法也被应用,这一次使用分类模型而不是回归变量。不幸的是,在这种情况下,最初的结果相当令人沮丧:没有一个模型能够以高于随机概率的准确度预测大规模枪击事件。这是否意味着枪支法对大规模枪击案没有影响?不一定,因为大规模枪击事件相对较少,这使得这种相关性更难发现。所以,让我们尝试另一种方法。

不要看所有的州法律,让我们来看一个单一的国家法律:公共安全和娱乐枪支使用保护法案,也被称为攻击性武器禁令(AWB)。在 1994 年 9 月颁布时,美国司法部将攻击性武器定义为“半自动火器,带有大量弹药,设计和配置用于快速射击和战斗用途。“禁令一直实施到 2004 年 9 月。那么,效果如何呢?

通过简单的假设检验,我们可以确定禁令实施后事故和死亡人数是否显著降低。下面,我们可以看到任何给定年份的总死亡人数、事故数量和每次事故死亡人数的平均值和方差的差异。蓝线代表禁令无效时的结果,红线代表禁令有效时的结果。

根据这些结果,当联邦禁令实施时,事故发生频率降低了 86%,总死亡人数降低了 173%,每次事故的死亡人数降低了 50%。我们可以在 90%的事故数量和总死亡人数水平上对这些结果有信心,而在查看每个事故的死亡人数时有 95%的信心。然而,有一个重要的警告需要考虑。看看这些结果是如何随时间变化的。灰色虚线之间的时间段代表禁令实施的时期。

正如我们所看到的,存在明显的数据不平衡,大多数事故和死亡发生在禁令到期后的几年里。当 2004 年以后的数据被排除在比较之外时,所有重要的迹象都消失了。如果有两个不同的时期没有实施禁令,并且每个时期都表现出非常不同的结果,那么就很难得出禁令本身就是解释变量的结论。换句话说,我们没有任何明确的证据表明 AWB 对总死亡人数或事故数量产生了有意义的影响。

然而,当考虑每起事故的死亡人数时,这种不平衡并不存在,这被发现是 95%置信水平下最重要的因素。这告诉我们,虽然 AWB 不一定能有效减少大规模枪击事件的发生,但似乎确实减少了由此导致的死亡人数。

大规模枪击与其他形式的大规模谋杀

想象一下这样一种场景:平民百姓不再能获得枪支:潜在的大规模枪击者可能会求助于其他手段。其他方法会导致更多或更少的死亡吗?我们可以从全球恐怖主义数据库中提取数据,并将结果与我们已有的数据进行比较。在一组中,我们调查了涉及枪支事件的死亡率。另一方面,我们考虑大多数人认为可以替代火器的武器类型。

从 1982 年到 2017 年,每起无火器事件的平均死亡人数为 2.36 人(不包括 9/11 袭击)。在同一时期,当选择火器作为武器时,每起事件的平均死亡人数为 8.37 人。差异代表 255%的差异,在 99%的置信水平下被发现是显著的。虽然枪支限制可能无法有效防止攻击,但证据表明,这种限制可能能够提高攻击的生存能力。

结论和建议

就整体凶杀率而言,对逃犯和持有家庭暴力禁止令的人实施枪支限制是一个州可以采取的最明确的行动。然而,授权执法部门酌情收缴枪支可能会遭到两党的强烈反对。作为一种替代办法,当直系亲属发现自己有危险信号时,他们可以向法院申请驱逐。

也称为“极端风险保护令”或“危险信号法”,这种方法可能会产生类似的结果,而不会给执法机构太多的权力。2015 年,只有两个州有这样的法律,但这一数字已经增加到 17 个。因为这些法律太新了,要过几年才能衡量它们的有效性。此外,法院就此类申请做出决定所使用的标准仍有待确定。

人们希望这样的法律能够遏制大规模枪击事件的发生,但截至目前,还没有法律在这方面产生明显影响。尽管攻击性武器禁令确实对每起事故的死亡率有一定的影响,但更高的目标应该是首先降低此类事件的发生频率。

尽管如此,各州仍有太多的选择,以有意义、无争议的方式加强枪支法律。弥合全国各州法律中的这种差距有可能大幅降低凶杀率。下面是几个唾手可得的果实的例子:

  • 在 19 个州,拥有最终家庭暴力限制令的个人被允许拥有枪支。
  • 在 27 个国家,不禁止逃犯拥有枪支。
  • 在 23 个州,不禁止被认定无受审能力的个人拥有枪支。
  • 在 21 个州,因精神错乱而被判无罪的人不被禁止拥有枪支。
  • 在 21 个国家,如果合法当局发现一个人对自己或他人构成威胁,不禁止这个人拥有枪支。

值得注意的是,在其中一些案例中,联邦法律已经存在。然而,根据 1997 年美国最高法院案例 Printz 诉美国 ,联邦政府不能强迫各州执行联邦法律。除非各州有类似的法律,否则联邦政府没有可靠的实施手段。

最终,目标是降低凶杀和自杀率,而不是解除守法公民的武装。在全国范围内齐心协力制定真正的常识性法律并执行已经成文的联邦法律是取得进展的最佳途径。

这一分析是在 Jupyter 笔记本中使用 Python 进行的,该笔记本可以在 Github 上找到,并提供了完整的数据源和方法。

用车床 0.0.8 可以演示什么?

原文:https://towardsdatascience.com/what-can-we-demonstrate-with-lathe-0-0-8-for-julia-1-3-b262dce24dd9?source=collection_archive---------31-----------------------

(对于朱莉娅 1.3)

车床 0.0.8“文件和调度”是车床画布上一个相当大的发布。顾名思义,这个版本有大量的文档。但这还不是全部,速度已经被优先考虑,大多数功能现在都优化了很多。此外,模型构造函数现在通过 Julia 的类型调度使用参数多态,而不是条件。

笔记本

车床(Github)

参数多态性

如果您想知道当谈到函数式编程时,我是否会经常谈到这个概念,

是的,我是。

Lathe 中的参数多态允许更简洁地使用 Lathe 中的“预测”函数作为结构的属性,而不是接受结构输入的函数。不用说,这要快得多,也简洁得多。但是事情远不止如此。

通过 Julia(awesome)的调度使用这种形式的参数多态性,我们可以使用同一个函数做数百万件事情,越来越容易,甚至不需要访问代码库就可以

这意味着任何头脑正常的人都可以为车床编写扩展,同样,车床可以做比现在更多的事情。有了 Julia 的参数多态性,来自 Lathe 的函数基本上可以做任何事情。为了让您了解添加结构有多简单,我们来快速做一下。

第一步是从车床导入预测功能。

现在我们可以制造任何构造函数,甚至可以使用车床模型并为它重写一个函数。

4

我选择将我的可变结构命名为“Emmett”我选中这个名字的原因是 还是 未知。接下来,我们构造一个名为 emdawg 的变量(真的?)并且我们可以断言我的身高和体重。既然在构造函数中已经有了我的身高和体重,我们可以打印单独的结果。

酷!因此,让我们编写一个利用该构造函数的函数,然后我们将从 Lathe.models.predict()中调度它。我决定写一个函数来计算身体质量指数,因为我们有身高和体重。一个问题是我们的身高是一个代表英尺和英寸的浮点数,即 6.4 == 6 英尺 4 英寸。

现在我们有了函数,我们只需要通过调度调用它。这是我想到的:

predict(m::Emmett) = calc_bmi(m)

现在,当我们将构造函数插入到 Lathe.models.predict()中时,我们得到一个返回:

不要去查那个身体质量指数

证明文件

有了这次更新,我想停止去维护者的网站搜索文档的传统方法。您可能需要了解的一切都应该可以在语言本身中找到,所以让我们来测试一下。

当然,作为一个新用户,很难模仿我自己,这个项目的维护者…但我们现在会试着假装我根本不知道如何使用车床。我们可以完全用这个来操纵车床。()函数来自 Julia 的 base。

我们什么时候?(车床),我们得到这样一个返回:一个树,里面有所有单独的模块,以及一些包信息,包括版本、依赖项和 UUID。关于这些的更多信息,可以查看任何 Julia 包的 Project.toml 文件(包括 Lathe。)

那么接下来呢?就在树下,我们看到使用说明。(车床.包)获取信息。让我们在车床上试试。模型

现在我们可以看到每个结构的每个参数,以及我们的附属函数。所以,举例来说,我们可以看看车床。模型。线性最小平方

这样,我们得到了一个全面的超参数列表、一个简短的描述和一个使用示例。理想情况下,这将是我们训练和验证模型所需的一切。

结论

车床是一个非常酷的包,0.0.9 的画布承诺了更多酷的特性,特别是在分类预测领域。如果你想更多地了解车床的新版本控制,有看板可以很好地记录到底发生了什么。

车床 0.0.8 板

车床 0.0.9 板

你应该如何选择计算机科学课程?

原文:https://towardsdatascience.com/what-challenges-does-increased-demand-for-computer-science-courses-present-students-83c8ac4531f9?source=collection_archive---------16-----------------------

从竞争中脱颖而出的简单方法

The fountain on the University of Delaware’s South Green. Photo: Ashley Barnas

在美国(或者全世界)有一种增加的趋势?!)供非主要学习计算机科学(CS)的学生注册 CS 课程。

你是其中之一吗?你注意到了吗?我确实在特拉华大学(UD)学过,目前我是那里的计算机科学硕士研究生。因此,科技领域的竞争越来越激烈。

LinkedIn 编辑团队的 Kelli Nguyen 认为,大学毕业后高薪工作的前景可能导致了这一趋势。

随着过去几年技术革命的到来,这是一个合理的假设。你不觉得吗?

但如果一份高薪工作是你选择 CS 课程的动力,你就不会走得太远了!

为什么计算机科学很重要?

编码和编程是计算机科学的重要组成部分。他们,专注于告诉计算机做什么。因此,这个领域提供了一个进入批判性和逻辑性思维的入口,这种思维适用于大多数学科。

你将有能力

  • 开发使用技术的不同方式
  • 解决你所在领域的计算问题
  • 获得对你自己的研究/工作有用的特定技能

积极的一面是多方面的。

作为学生该怎么办?

你在这个学科中获得的技能是独一无二的,需要正确的实施来掌握。组织重视的东西!

计算机科学课程传授解决问题和分析能力。

我经常发现学生们将这些技能带入他们的专业领域(计算机科学或其他)来解决现实世界的问题。

所以,如果你是任何学科的学生,你应该明智地选择你的课程。方法如下:

  • 你的职业目标是什么?
  • 你想用你的计算机科学水平做什么?
  • 你毕业后的目标是什么?
  • 那些角色需要什么能力?
  • 你需要学习什么课程来获得它们?

它迫使你瞄准一系列对实现目标至关重要的讲座和技能。很好,不是吗?

在我获得硕士学位的早期,我认识到了这一趋势,并确定了我的学术学习道路。现在,到了我的最后一个学期,我可以说我进入了我想要的班级。更重要的是,我能够建立新的联系。有些人我不知道会遇到。

我这么说是因为在我的一门课上,我建立了机器学习模型。对一个计算机系的学生来说很简单,不是吗?是的,但是是和几个非计算机专业的学生。一个是水科学与政策,另一个是农业与环境经济学。

当你和那些看问题的方式与你不同的人一起工作时,你就成长了。

我是另一个班的学生,我喜欢通过发现孩子们营养摄入的趋势来对他们的数据进行聚类。这一次,带着数学和统计学的博士生。还有,非 CS。

因此,让计算机科学背景的多样性增强你的能力吧!

计算机科学研究的近期前景

我非常幸运能够利用日益增长的需求和跨学科的合作。你也可以。其实你一定是!

这就是我对计算机科学研究的未来的看法。你应该结合多个学科,对同一个问题或主题寻求不同的思考方式。这种革命性的学习方式使你能够发展批判性思维能力,并提供许多现实世界的成长机会。

今天的团队,尤其是行业中的团队,是为了解决现实世界的问题而建立的,他们拥有能够带来不同技能的人。当你毕业的时候,只有当你拥有一种以上的技能时,你才能够立即投入工作,并有效地合作以取得成果。

感谢阅读!我很想在下面的评论中听到你的想法。你也可以关注我的 LinkedIn Twitter

如果你觉得这篇文章可能对你认识的人有所帮助,请与他们分享这个链接:https://bit.ly/3gxw6j9

为了在分析领域取得成功,我需要知道哪些编码语言?

原文:https://towardsdatascience.com/what-coding-languages-do-i-need-to-know-for-a-career-in-analytics-595887deadbd?source=collection_archive---------16-----------------------

SQL、python、R——有这么多的语言和工具可供选择,哪些是我绝对需要知道的,我可以从哪里开始学习它们?

当谈到分析的世界时,你可能不会惊讶地发现它会变得非常复杂。大多数分析工作的一个典型特点是,您可能需要学习如何编码,这通常需要学习一套旨在执行特定分析任务的语言。

但是编码语言需要很长时间去学习。那么,在我的分析职业生涯中,哪些是我绝对需要知道的呢?

哪些编程语言用得最多?

如果你正在进入分析领域,并将其视为一项职业,用不了多久,你就会被开始职业生涯可能需要学习的所有技术平台和语言所淹没。因此,如果你正在考虑从事分析方面的职业,你可能会有第一个问题——我绝对需要学习哪些编码语言?以及哪些语言是“最好拥有的”。

在本文中,我们将向您简要介绍我们推荐的顶级编程语言,供您在分析职业生涯中学习。这些是招聘人员最常寻找的语言,如果你试图进入数据科学或商业分析领域,这是你的最佳选择。让我们从概述我的首选开始。

你可以参考文章底部我们最喜欢的资源

结构化查询语言

任何分析的最低资格

SQL 是一种脚本语言,用于访问和操作数据库中的数据。数据库是存储大量数据的强大工具,而 SQL 是用来访问和提取数据、操作数据或清理和重组数据的工具。

SQL 访问的数据存储在关系数据库中。每种数据都存储在一个表中。表格有列和行来表示不同事物的不同属性。使用 SQL,您可以访问这些表,查找相关信息,比较信息,甚至操作信息。当然,所有这些命令都超出了本文的范围,但要知道这是许多分析职业的基本工具。

关于 SQL 的另一个重要考虑是不同的公司使用不同类型的数据库。例如,您有 HIVE、MySQL、postgres 和许多其他语言,所有这些语言的语法都有不同的细微差别。好消息是,如果您总体上很好地掌握了 SQL,那么适应这些数据库中的差异应该没有问题。

有许多很棒的在线 SQL 资源。例如,如果你正在寻找一个从头开始教你 SQL 的指南,我喜欢模式分析。如果你已经知道 SQL(即使你只是一个初学者),并且正在寻找真实世界的实践问题, Strata Scratch 提供了来自公司真实采访的 500 多个 SQL 实践问题。

Python 还是 R

如果你对数据科学的职业感兴趣,这是一个首选资格

对于数据科学和分析工作来说,两种非常流行的编程语言是 Python 和 r。这两种语言适应性非常强,因此可以用于类似的目的,这可能使人们很难在两者之间做出决定。根据您熟悉的领域,这两种方法都很有帮助,但重要的是要知道根据您想要进入的特定分析领域的差异。

r 主要用于研究,并已发展到对统计非常有用。因此,它被数据科学家和统计学家广泛用于各种与统计和数据分析相关的功能。对于您想要进行的几乎任何类型的数据分析,基本上都有一个选项。r 以多种方式存储数据(表格、矩阵、向量等)。)支持回归、坐标等对象。

Python 更像是一种通用的编程语言。它是一种非常庞大的语言,因此它有库来执行 R 可以完成的几乎所有任务。Python 也是机器学习和人工智能的一个非常强大的工具,它有专门为执行这些任务而构建的库。

我喜欢用 python 而不是 R,因为 python 有很棒的自动化库和函数。

当然,对于初学者来说,所有这些听起来可能非常复杂。所以要知道,如果你正在考虑从事数据科学或分析方面的职业,Python 和 R 都会非常有帮助。它们都是开源语言,有越来越多的大型社区支持它们。

Datacamp.com为 R 和 python 都提供了巨大的资源。

额外收获:像 Tableau 和 Plotly 这样的商业智能工具

一个很好的分析技能的任何角色

商业智能工具(或 BI 工具)是基本上帮助您可视化数据的软件类型。这些平台不一定是编码语言,但会有自己的语法,或者将 SQL 等现有语言整合到它们的平台中,或者两者都有。这些平台帮助您可视化和识别趋势,理解模式,并基于这些模式开发影响。这些工具主要从 SQL 和/或 python/R 获取输出,并添加交互式图形组件,以帮助您向利益相关者和业务合作伙伴提供见解。

Tableau 是最流行的 BI 工具之一。Tableau 帮助您理解关键的业务数据点,并基于这些数据做出深刻的见解。它可以连接到几乎任何数据源,包括 Salesforce、Google Analytics 和 SQL 数据库。它在一个方便的交互式仪表板中呈现所有信息,还允许您控制和生成新的信息和见解。

结论

如果你正在考虑进入分析行业,这些是你应该学习的编码语言的首选。当然,分析和数据科学是非常广泛的领域。出于这个原因,在你全身心投入某种编程语言之前,更具体地考虑一下你对分析和数据科学的哪一部分最感兴趣。

对你真正想从事的角色类型做一些研究,然后确定上面哪种编程语言最有价值。我保证它将包括 SQL、python/R,也许还有可视化工具/语言。

帮助您起步的资源

最重要的是,这些语言在数据科学和分析领域拥有极其强大的能力。所有这些对于从事分析行业都非常有价值。无论你选择哪一个方向,知道这些语言中的任何一种肯定会打开许多大门。

  • Strata Scratch :超过 500+来自真实公司的 SQL 和 python 练习题
  • 模式分析:如果你是从零开始,这是一个很好的 SQL 和 python 教程
  • DataCamp :提高你的 python 和 R 技能的资源。主题和模块本质上是特定的,需要你有一些 python 或 r 的背景知识。

原载于https://www.stratascratch.com

相关分数能告诉你什么,不能告诉你什么

原文:https://towardsdatascience.com/what-correlation-scores-can-and-cant-tell-you-75fb061eeaa1?source=collection_archive---------20-----------------------

为什么你不应该假设高度相关的变量对彼此有很大的影响

最近,我向数据科学训练营的同学介绍了爱荷华州 Aimes 的房价。除了预测房屋的销售价格,我们还被要求选择另一个问题来回答。

我选择回答的问题是:对一个人已经拥有的房子可以做哪些实际的改变来提高它的质量?(如果你感兴趣,可以在这里找到该演示文稿。)

总体质量相关性得分

在我的报告中,我分享了一张热图,它将各种因素与房屋的整体质量联系起来。在这些因素中,我主要关注以下二元变量:

  • 在过去的 30 年里被改造过
  • 有附属车库
  • 有一条铺好的车道

对于这些因素中的每一个,我观察了有和没有这些因素的房屋的平均质量,以了解它们的影响。

平均质量的差异

除了这张热图,我还展示了以下小提琴图:

上面的图显示了有和没有最近改造(左)、附带车库(中)或铺设车道(右)的房屋的质量分数分布。这些地块的一个关键点是,为了提高质量,最好的特征是改变车道类型,其次是车库类型,然后是最近的改造。

我的一个同学注意到与整体质量最相关的变量对整体质量的变化影响最小,问我为什么会这样。当时,我不知道,所以我决定深入调查…

数学——平均值的差异

如果你正在读一个统计学博客,你可能不需要我告诉你两个平均值之间的差是如何计算的。但是作为一个复习…

数学相关性

特征和总体质量之间相关性的计算方式有很大不同。当您运行。corr()函数在一个熊猫数据帧上(就像我做的那样),默认的方法是计算皮尔逊相关系数( ρ)。

sns.heatmap(df.corr(), cmap=’BrBG’, vmin=-1)

计算皮尔逊相关系数的公式为:

其中 E 是输入值的期望值或长期平均值。

更直观地说——相关性告诉你一条线与变量对的拟合程度。1 分意味着你可以完美地拟合一条斜率为正的线,0 分意味着你根本无法拟合一条线,-1 分意味着你可以完美地拟合一条斜率为负的线。

这在实践中意味着什么?

让我们来看三个数据集,每个数据集有 6 个样本(特征分数为 1 表示该住宅具有该特征,分数为 0 表示它不具有该特征):

在每个数据集中,平均质量值的差异为 2.67,质量处于相同的范围内,这就是为什么三个图表的最佳拟合线(以红色显示)的斜率相同。

然而,相关分数差异很大。左边的数据集几乎可以完美地拟合成一条线,而右边的数据集根本不能用它的最佳拟合线来表示。

为了更生动地展示相关性如何实际上不提供关于对具有特征的质量的影响的信息,让我们看另外两个数据集:

在所有上述图中,相关性得分的值完全基于红色最佳拟合线代表黑色散点图点的程度,而平均值的差异基于红色最佳拟合线的斜率。

最佳拟合线的斜率与相关分数相关的唯一方式是,对于正斜率,其符号为正,而对于负斜率,其符号为负。(上面所有的图都有一个正斜率,这就是相关性分数都在 0 和 1 之间的原因。)

结论

当您寻找线性相关的值时(例如:当您创建线性回归模型时),相关性分数是一个很好的工具。然而,应该清楚的是,他们给你的分数不是一个变量的变化对另一个变量的影响程度。更简单地说,相关性的通俗定义(两个或更多事物之间的相互关系或联系)并不总是由统计相关性分数来表示。

在进行探索性数据分析时,您应该确保查看其他指标,以了解变量之间的相互影响(例如,最佳拟合线的斜率)。

开始数据分析师的职业生涯需要学习哪些数据分析工具?

原文:https://towardsdatascience.com/what-data-analysis-tools-should-i-learn-to-start-a-career-as-a-data-analyst-af650b54c9e9?source=collection_archive---------15-----------------------

对于数据分析,我一直强调核心是业务。我们将业务的分析逻辑与数据分析的处理逻辑联系起来,数据分析工具是帮助我们实现结果的手段。就像我们根据不同的道路选择不同的交通工具一样,合适的工具可以帮助我们更快地到达终点。我们应该为数据分析的不同环节选择不同的工具。

今天的文章就是要告诉你,开始数据分析师的职业生涯,应该学习哪些数据分析工具。

1.确定分析师的需求:业务还是技术

在企业中,数据分析师通常分为两类:业务分析师和技术分析师。而且两者的能力和工作内容差别很大,对工具的要求也相应不同。

商业分析师经常在市场部、销售部等部门工作。日常工作更多的是整理业务报表,针对具体业务做专题分析,围绕业务增长测算数据,制定计划。

技术分析师一般属于 IT 部门或数据中心。根据工作环节的不同,分为数据库工程师、ETL 工程师、爬虫工程师、算法工程师等等。在中小型企业中,这些流程通常由一名技术分析师处理。在大型企业中,一个标准的数据中心需要一个数据仓库、特殊分析、建模分析等小组来完成数据开发工作。

之所以这样区分,是因为我们需要一个多层次的复杂数据系统来处理数据。一个数据系统需要结合数据收集、数据整合、数据库管理、数据算法开发和报告设计。这样就可以把散落在周围的点点滴滴的数据集合起来,设定共同的指标,做出各种酷炫的图表。这里的每一个环节都需要相应的技术支持和人员工作,所以有不同的岗位。

你在找数据分析岗位的时候,一定要分清是技术端还是业务端,是否与自己的职业倾向相匹配。

2.识别工具的属性:分析工具还是代码工具

分析师有技术和业务的区分,相应的数据分析工具也有这样的属性。

分析工具

对于初级数据分析师来说,掌握 Excel 是必须的。您必须精通数据透视表和公式。和使用 VBA 将是一个加号。此外,你必须学会一个统计分析工具。SPSS 比较适合初学者。

对于高级数据分析师来说,分析工具的使用是一项核心能力。VBA 是基本必需品。而且你要掌握 SPSS、SAS、r 这三个分析工具中的至少一个,你也可以学习其他工具比如 Matlab ,不过要看情况。

对于数据挖掘工程师来说, R 和 Python 是必须的,就像你要写代码一样。

代码工具

对于初级数据分析师,只需要编写 SQL 查询即可。还可以学习一些 Hadoop 和 Hive 查询。

对于高级数据分析师来说,除了 SQL 之外,学习 Python 也是事半功倍获取和处理数据的必要手段。当然,其他编程语言也是备选方案。

对于数据挖掘工程师来说,你得用 Hadoop、Shell、Python、Java、C++等。总之,懂一门编程语言绝对是数据挖掘工程师的核心能力。

下图说明了数据分析工具的属性和功能。

3.确定企业的数据架构

数据分析工具的使用取决于业务的需求和环境。为什么小公司的数据分析师只用 Excel 做报表,大公司的分析需要 Python 和 R?这取决于企业的数据架构。

从 IT 的角度来看,工具在实际应用中可以分为两个维度。

尺寸 1

尺寸 2

3.1 数据存储

你不必深究数据库存储和数据库语言的概念,毕竟有专业的 DBA。但是你至少要了解数据的存储方式,数据的基本结构,以及可用的数据类型。SQL 查询语言至关重要。您可以从通常的选择、更新、删除和插入开始。

Access 是最基本的个人数据库。 MySQL 是部门或互联网数据库应用所必需的,此时你需要了解数据库结构和 SQL 查询语言。SQL Server 2005 或更高版本足以满足中小型企业的需求。一些大型企业也可以使用 SQL Server 数据库。其实除了数据存储,还包括数据上报和数据分析。

DB2 和 Oracle 都是大型数据库,主要为企业服务。大型企业需要存储大量数据,因此这种类型的数据库是必须的。一般大型数据库公司都会提供非常好的数据集成和应用平台。

至于 BI,它其实不是一个数据库,而是建立在之前数据库基础上的企业级数据仓库。建立在数据仓库上的数据存储基本上是一个商业智能平台,它集成了各种数据分析和报告功能。

3.2 数据报告

企业需要读取和显示数据。和报告工具是最常用的工具。以往的传统报表大多只是解决了可视化的问题。现在,一些分析报告工具正在出现,它们与其他应用程序交叉处理以生成数据分析报告。通过接口打开、数据填充、决策等功能,实现数据存储和数据展示,这就是早期的商业智能。

像 Tableau 、 PowerBI 、 FineReport 和 Qlikview 这样的 BI 工具涵盖了多个层次的报告、数据分析和数据可视化。底层也可以连接到数据仓库,构建 OLAP 分析模型。

3.3 数据分析

数据分析工具很多,我们用的最多的是 Excel 。

很多人只掌握了 5%的 Excel 函数。Excel 很强大。它可以完成大量的统计分析工作。但是我经常说,专门做一个统计软件,比用 Excel 做统计工具要好。

附加电源装置(Supplementary Power Supply Set 的缩写)

现在的版本是 18,名字也改成了 PASW 统计。我从 3.0 版本开始,用它在 Dos 环境下进行编程分析。随着时间的推移,它已经成为一个预测分析软件,从强调医学和化学发展到目前强调商业分析。

斯堪的纳维亚航空公司

SAS 比 SPSS 更强大。而且是基于平台的。相对来说,SAS 更难学。但是如果你掌握了 SAS,你就可以解决更多的问题。例如,对于离散选择模型、抽样、正交实验设计等。,不如用 SAS。除此之外,还有更多 SAS 的学习资料。

其他工具还有 Python 和 R,我下次会详细介绍。

3.4 数据展示

数据展示也叫数据可视化。几乎上面提到的每个工具都提供了一些数据显示的功能。但企业最常用的工具是 BI。

BI 代表商业智能(Business Intelligence),是传统企业中的完整解决方案。它有效地集成了企业数据,并快速生成报告以做出决策。它涉及数据仓库、ETL、OLAP、访问控制等模块。

这里我拿一个 2019 年非常流行的 BI 工具, FineReport 举例。它有两个主要用途。

一个是制作自动报告。数据分析师每天都要接触大量的数据。而且他们需要对数据进行整理汇总,工作量很大。我们可以把这部分工作交给 FineReport。它自动进行数据整形、建模和下载。

From FineReport

另一种是利用其可视化功能进行分析。 FineReport 的优势在于提供了比 Excel 更丰富的可视化功能。而且很好用。如果你每天花两个小时画画,FineReport 会把时间缩短一半。

From FineReport

From FineReport

From FineReport

在学习数据分析的初级阶段,BI 工具无疑是最容易学的。如果你准备进入数据分析师领域,我强烈推荐你使用这个数据分析工具, FineReport 。你可以点击这里免费下载使用。并且官网还提供了教程帮助你快速入门。

原载于 2019 年 5 月 16 日http://www.finereport.com

数据科学可以从 rave 行业学到什么

原文:https://towardsdatascience.com/what-data-science-can-learn-from-the-rave-industry-7c2980e16cbd?source=collection_archive---------38-----------------------

跟随电子舞曲的发展历史,意味着实现一种数字艺术形式的轨迹。它从地下场景到笔记本电脑,再到全球舞台,经历了一个关键的混乱状态。数据科学家目前正进入混乱状态,让我们吸取教训,创建结构和协议。

上周末,我看了关于网飞的纪录片《这就是我们开始的》。它遵循锐舞现场的历史,展示了 EDM 世界的主要人物分享他们对该部门如何增长的意见。这部纪录片揭示了 EDM 在一个社会中的文化融合的一些见解。起初,这是人们出于对特殊事物的渴望而参与的事情。后来,由于缺乏结构和治理,它变得难以管理。经过一段时间的戏剧性事件后,它复活了,并成为日常生活的一大部分。在本文中,我分享了我对数据科学领域的发展与 rave 行业的对比以及潜在教训的见解。

音乐背后的人:这是一门艺术,表达个人观点

数据科学家正在从数据中创造洞察力。如果你把同一个数据集给两个不同的数据科学家,他们会得出两套不同的见解。数据科学家的工作代表了他们的背景、兴趣以及他们接触到的所有其他东西。这是一种表达创造力的方式,即使数据科学家可能不被认为是特别有创造力的人。一开始,DJ 也不是。他们是在卧室盯着屏幕工作的人。

协作和社区的价值

正如在数据科学中,大多数 DJ 认为自己是主要的方法和软件程序。在这部纪录片中,互联网被解释为推动全球合作创作电子舞曲。突然间,人们能够共享文件并互相帮助前进。论坛、在线教育平台和博客的可用性也是数据科学社区背后的一大驱动力。当我们遇到困难时,我们简单地用谷歌搜索错误或者在论坛上分享我们的问题。通过互相帮助,我们不仅自己学到了更深层次的东西,而且也为社区做出了贡献。正如他们在纪录片中所说:“这是关于社区、创造、热爱你所做的事情并与他人分享”。

它生长在不同的地方,没有一个总的监督机构

EDM 刚开始的时候,聚会都是在地下场所和仓库举行的。结合日益流行的音乐和毒品的使用,这开始引发问题。在某一点上,关于狂欢派对事故的坏消息导致了行业的关闭。EDM 政党只有通过适当的活动组织和规章制度才能生存。

数据科学目前作为一个时髦词非常受欢迎,但它只在不受监管的地下中心投入实际使用。我们知道主要科技公司的研究中心和初创公司一样都在使用它,但我们对他们的工作的影响了解多少呢?最近的丑闻打开了地下世界。然而,监管机构需要加强并要求更多的透明度。在我看来,这个过程中最大的障碍是社会缺乏数据素养。

关于我们为什么需要数据素养的简短说明

首先,我所说的数据素养并不是指每个人都应该知道如何编码。重要的是,我们允许社会成为讨论的一部分。今天,数据是通过每个人的设备和行为收集的。然而,这些数据的使用仅限于少数情况。为了让人们就共享哪些数据和使用哪些设备来实现某些功能做出明智的决定,需要向人们解释正在发生的事情(以一种可理解的方式)。

(更多关于数据素养社会的信息,请见后续文章……)

因此,在结束本文时,我想强调的是,如果我们让数据科学家从内在动机而不是企业需求出发工作,数据科学可以成为一种艺术形式。我们通过协作学习,并有机会将收集到的所有大数据转化为有意义的见解。然而,我们需要制定标准,并告知从业者关于监管和适当报告的必要性(也为数据文盲)。

最后,我从纪录片中引用了一些我最喜欢的话:

“我只希望我能成为其中的一部分,它会继续下去,马丁·盖瑞斯”

这类似于我现在对数据科学的感觉。在我看来,它可以带领我们走向一个更有见识的社会。此外,丰富的在线学习资源为每个人创造了平等的起点。通过大量的努力和实践,你可以创造出有价值的见解。

永远不要贪得无厌

此外,在我看来,这句话适合数据科学界。如果我们都有动力去创造和合作,那么每个人都是赢家。

关于 EDM 历史的更多深入背景,我推荐观看纪录片:“我们开始了什么”!

关于主流音乐,数据科学能告诉我们什么…🤔

原文:https://towardsdatascience.com/what-data-science-can-tell-us-about-mainstream-music-e56b20e00a25?source=collection_archive---------13-----------------------

Spotify 上前 100 名艺术家的 k 均值聚类

Photo by Thomas Habr on Unsplash

介绍

多年来,音乐之声随着社会的发展而发展,因此,声音的创新实际上是我们文化和技术进步的反映。几十年前,由于缺乏技术手段,与主流人群相关的音乐是不可能创作出来的。

不仅制作音乐的过程变了,音乐的消费也进步了。流媒体服务使得在各种平台上消费音乐变得前所未有的容易。毫无疑问,像 Spotify 这样的流媒体服务也降低了进入音乐行业的门槛。

Photo by Anastasia Ischnopoulou on Unsplash

通过向全球 2.17 亿月活跃用户提供音乐,Spotify 不仅向用户提供了数百万艺术家的音乐,还允许任何人发布自己的歌曲。这在很大程度上改变了音乐行业,这确实值得写一篇自己的文章,但在这里,我打算更多地关注 2019 年主流音乐的流派。

目标

这个项目的目的是分析 Spotify 上排名前 100 的艺术家发布的音乐。我开始通过分析他们的音频特征来将这些艺术家分类。然后,我通过评估突出的音频特征来研究每个集群代表的音乐风格。

首先,我访问了 Spotify Web API ,它允许我通过对 API 端点的标准 HTTPS 请求来访问 Spotify 音乐目录中的数据。

Photo by Tom Fejér on Prototypr.io

Spotify Web API 允许您访问一首歌曲的几个音频功能。这些音频特征量化了音乐的几个方面,对这一分析至关重要。我使用了 12 种音频功能,如下所示:

可跳舞性:可跳舞性描述了一首曲目在音乐元素组合的基础上适合跳舞的程度,包括速度、节奏稳定性、节拍强度和整体规律性。值 0.0 最不适合跳舞,1.0 最适合跳舞。

声音度:从 0.0 到 1.0 的一个衡量标准,衡量音轨的声音程度。

能量:能量是从 0.0 到 1.0 的度量,代表强度和活动的感知度量。通常,高能轨道感觉起来很快,很响,很嘈杂。

乐器性:预测一个音轨是否不包含人声。乐器度值越接近 1.0,轨道不包含人声内容的可能性就越大。

活跃度:检测录音中是否有观众。较高的活跃度值表示音轨被现场执行的概率增加。根据官方文档,“高于 0.8 的值提供了该轨道是活动的很大可能性。”

响度:一个音轨的整体响度,单位为分贝(dB)。响度值是整个轨道的平均值。值的典型范围在-60 和 0 db 之间。

语速:语速检测音轨中是否存在口语单词。越是类似语音的录音(例如脱口秀、有声读物、诗歌),属性值就越接近 1.0。

速度:轨道的整体估计速度,单位为每分钟节拍数(BPM)。在音乐术语中,速度是给定作品的速度或节奏,直接来源于平均节拍持续时间。

效价:从 0.0 到 1.0 的量度,描述音轨所传达的音乐积极性。高价曲目听起来更积极(例如,快乐、愉快、欣快),而低价曲目听起来更消极(例如,悲伤、沮丧、愤怒)。

调:音轨所在的调。整数映射到使用标准音高等级符号的音高。例如,0 = C,1 = C♯/D♭,2 = D,等等。

调式:调式表示音轨的调式(大调或小调),其旋律内容来源于音阶的类型。大调用 1 表示,小调用 0 表示。

Duration_ms: 是歌曲的时长,以毫秒为单位。

现在,我总结一下我的方法:

  • 在Kworb.net的 Spotify 上获得前 100 名艺术家的名单
  • 通过 Spotify Web API 手动获取每个艺术家的音频特征数据
  • 用相关的音频特征可视化艺术家数据
  • 基于艺术家各自的音频特征,应用 k-means 聚类将艺术家分成不同的组
  • 分析每个聚类中明显的音乐风格

让我们看看这几天有哪些艺人受欢迎!

获取数据

第一步是在开发者的 Spotify 上注册。然后,我在平台上注册了我的应用程序,以获取密钥,也就是客户机 ID 和客户机秘密,以备将来的请求。

我使用密钥请求一个访问令牌,以便授权我的应用程序检索和管理 Spotify 数据。

我使用了一个名为 的 R 包装器 spotifyr 从 Spotify 的 Web API 中批量提取每个艺术家的音频特征。通过自动批处理 API 请求, spotifyr 允许您输入艺术家的名字,并在几秒钟内检索他们的整个唱片目录,以及 Spotify 的音频功能和曲目/专辑流行度指标。spotifyr 的创始人 Charlie Thompson 有一个非常有趣的网站 ,如果你对音乐或数据科学感兴趣,我强烈建议你去看看。)

只需对每个艺术家使用get_artist_audio_features()函数,我就可以从 Spotify 获得数据。你可以在下面的平台看到月听众最多的前 100 位艺人。

最后,我将每首歌的音频特征放在它们各自的唱片目录中,所以我将它们全部组合到一个 data.frame 中。

然后,我使用aggregate()函数计算每个艺术家对应的音频特征的中值。最初,我在这个项目中使用了平均值,但我认为中值会更好,因为考虑到数据的高度可变性,平均值的效率很低。

让我们快速看一下我生成的表格,它包含了所有艺术家的音频特征的中值。

K-均值聚类分析

K-means 聚类是最流行的无监督机器学习算法之一。它将相似的数据点组合在一起,并寻找潜在的模式。为此,K-means 在数据集中寻找固定数量( k )的聚类。K 的值可以由运行算法的人定义,也可以使用各种技术找到。

现在我已经有了每个艺术家唱片目录的音频特征的中值,我可以进行聚类分析了。但是首先,我必须将数据标准化,也就是说,将数据转换为平均值为 0,标准差为 1。下一步是缩放数据,因为在找到 k 的最佳值之前必须这样做。

Charlie Thompson 在科切拉 2017 的聚类分析上做了一个帖子,在那里他使用NbClust包找到了最优的聚类数。同样,我使用了 Ward 的层次聚类,发现 k 的最佳值是 4。

Output for the gist above

在找到最佳的集群数量后,我用ggplotly()可视化了我的结果。此外,我还使用了韦斯·安德森电影《大吉岭》中优雅的调色板。

You can zoom in for better view of the labels!

评估上面的图表,我做了一些有趣的观察:

  • 比莉·埃利什是前 100 名中最具音乐性的艺术家
  • XXXTENTACION 的唱片包括从说唱金属摇滚到原声民谣的各种音乐,与比利·埃利什和艾德·希兰属于同一类😮
  • Marshmello 是这里最有活力的艺术家!
  • 酷玩乐队和皇后乐队似乎在图表中很突出,这是有道理的,因为他们是这项研究中少数几个传统乐队中的两个

让我们单独看一下每个集群!

主流音乐的集群

第 1 组:电火花加工/电穿孔/Pop Rap

这个集群主要由 EDM 艺术家组成。这个集群中的流行/说唱艺术家经常制作舞曲,这可以解释他们为什么在这里。该集群的特点是:

Radar chart for Cluster 1

  • 最高能量:可以轻描淡写地说舞曲是充满能量的,所以这个指标的值完全有意义。
  • 高乐器性:这些艺术家的每一张唱片都融合了各种乐器和流派,可以感觉到他们在歌曲制作上非常专注。
  • 不太强调口语,因为大多数现代 EDM 歌曲的合唱都是器乐作品。
  • 最高音量:试着给你的祖母播放这些歌曲中的任何一首,她会证实这一点。

群组 2:声音爆音

这个群体中的流行艺术家比其他人更传统。让他们在这里脱颖而出的是他们制作音乐的传统方式。当每个人都在跳着 EDM 和 Trap beats 制作电子派对歌曲时,这些艺术家却通过坚持自己的声学根源来区分自己。他们音乐的一些特征是:

  • 最高声音:这一指标向我们显示,该集群似乎最有可能不使用电子放大。很多艺术家的歌曲都只有原声吉他和人声。
  • 可以肯定地说,这个群体中的艺术家创作的歌曲唤起了悲伤和愤怒的情感。考虑到 XXXTENTACION 也在这个群体中,我毫不怀疑,因为他要么创作了让你哭泣的歌曲,要么是你的邻居报了警。
  • 最低能量和节奏:证实这是制作缓慢、悲伤、原声民谣的组合。

集群三: 最主流的主流音乐

从爱莉安娜·格兰德到德雷克的每个人都在这个集群中(所以德雷克毕竟不是一个说唱歌手。)这是所有乐队中最多样化的一组,所有的流行/摇滚乐队都在这里。这让我想知道,当人们说所有流行音乐听起来都一样时,这个集群是不是指的那个。我还观察到,该集群中没有太多突出的音频功能,但这里有一些我的想法:

  • 最高节奏:该组中的艺术家具有所有其他艺术家中最高的节奏。这并不一定意味着他们总是制作积极向上的歌曲,因为效价不是特别高。
  • 最高活跃度:这意味着歌曲被现场录制的可能性最高。我认为这是因为许多乐队发行他们歌曲的现场版本,并且大多数乐队都在这个集群中。
  • 相当一般的特征:其余的音频特征似乎并不突出,这可能是因为这是拥有多样化艺术家的最大集群,或者他们确实制作了相对“一般”的音乐。

集群 4:嘻哈/说唱

这是我最喜欢的集群。作为一个说唱乐迷,看到算法把我最喜欢的艺术家放在一个群中,真的很令人满意。虽然这个群体中的说唱歌手有时使用不同的语言,但他们都有能力忠于他们的嘻哈根源。以下是我做的一些观察:

  • 最高语速:说唱歌曲中的独特字数必然高于其他,这也是语速高的原因。此外,说唱歌曲传统上是由其抒情内容和声音流驱动的,而不是乐器。
  • 最高价:最受欢迎的说唱歌曲关注积极的事情。说唱歌手经常谈论他们的破产,他们赚了多少钱,戴着昂贵的珠宝。吹牛是件好事。
  • 最高可舞性:谁知道说唱音乐会比 EDM 本身更可舞?随着 groovy Trap beats 接管主流嘻哈,我并不感到惊讶。

模型结论

  • 所有主流音乐听起来都不一样。今天的流行音乐可以分为四类。
  • 今天最流行的四种音乐风格是:EDM,原声音乐,说唱和流行音乐。
  • 虽然这么说很伤我的心,但摇滚乐已经不再流行了。如今,为数不多的几个仍然排在前 100 名的摇滚艺术家已经将他们的音乐与流行音乐融合在一起,以保持相关性。
  • 聚类 3 中的艺术家似乎具有平衡的音频特征,只有少数艺术家从其他艺术家中脱颖而出。在我看来,这正中主流观众的下怀。

下一步是什么?

数据科学可以告诉我们很多关于音乐的信息。Spotify 提供了发现自我的工具,让这变得前所未有的简单。该项目的下一步将是建立一个推荐系统,根据用户在音乐平台上的收听历史来创建播放列表。Spotify 已经在这方面做了很多工作,但如果能做到这一点就更好了。如果任何人有建议或想在这方面合作,请随时联系我。

我喜欢收到对我工作的反馈。如果你有任何建议,意见,或者只是想谈谈音乐,请随时联系我,在 inagpal2@illinois.edu!

有哪些数据告诉我们 Airbnb 在西雅图的使用情况

原文:https://towardsdatascience.com/what-data-tells-us-about-how-airbnb-is-being-used-in-seattle-b948a05b84b6?source=collection_archive---------18-----------------------

介绍

Airbnb 是一个在线市场,让你向客人出租房产或空房间。它是世界上最大的住宿分享网站,目前价值超过世界上任何连锁酒店。

Airbnb 的主人和顾客面临的一个主要挑战是,确定房源收费或付费的最佳价格。作为数据科学家,我们能否对 Airbnb 房源进行一些分析,以了解 Airbnb 的使用情况,并在这方面提供一些见解?

然而,Airbnb 没有提供开放的数据转储供我们使用。我们可以利用 Airbnb 内部一个名为的独立实体提供的数据来分析并得出我们自己的见解。

我查看了西雅图的 2016 年 Airbnb 房源数据,并进行了一些探索性分析,为我的一些问题找到了答案。

该数据集有 3818 条来自西雅图不同社区的记录。每个列表记录都包含与其定价、主机详细信息、位置、便利设施等相关的详细信息。虽然总共有 92 列,但我只选择了几列进行分析。

我的第一个问题是:

当你去西雅图的时候,一年中最繁忙的时候是什么时候?

我使用日历数据来绘制月平均入住率,以直观显示它们在一年中的变化情况。

西雅图的 Airbnb 房屋似乎在年初最繁忙。然后在三月底会有一个暴跌,在七月和八月再次达到顶峰。

平均来说,什么时候入住 Airbnb 房源最贵和最便宜?

西雅图的 Airbnb 价格在 6 月份左右开始见顶,在 7 月和 8 月达到最大业务量。一月和二月的价格最便宜。

平均而言,游客在旺季每晚要比淡季多付 35 美元。

从上面的两个图像中可以看出:

  • 一月份的高入住率似乎令人费解。根据简单的价格和入住率相关性,人们会认为 7 月至 8 月是最繁忙的时期。
  • 此外,对于出现的周期性趋势,年初和年末的价格和入住率应该大致处于同一水平。

我们需要查看不同年份的数据才能得出更好的结论。

此外,我查看了一周中各天的价格和入住率,发现它们在周末相对较高,这与预期相符。

房源数量最高的小区是哪些?

如下图所示,百老汇、贝尔敦和沃灵福德是上市数量最多的三个社区。

然而,列表计数只提供了一半的情况,因为一些社区由于规模较大而可能有更大的计数。为了更好地了解顶级社区,我们需要查看列表密度,即列表的集中程度或分散程度。为了直观地探索这一点,我在地图上标出了这些列表的地理坐标(参考帖子中的标题图片)。

在基于挂牌数量的顶级社区中,百老汇和贝尔敦及其周边地区似乎是大多数挂牌的地方。

平均来说,住在哪里最贵和最便宜?

根据平均价格,中央商务区是最贵的,北比肯山是最便宜的。

为了对此有一个更广泛的理解,我还查看了前 25 个街区的价格分布。

价格较高的社区的大部分房源都在 101 美元到 200 美元之间,而其他社区的大部分房源都在 1 美元到 100 美元之间。

百老汇位于榜单的中间位置,价格在 101-200 美元之间,与贝尔敦的房源数量几乎相同。但这被价格在 1 美元至 100 美元之间的更多商品抵消了。

一个上市的受欢迎程度和它的价格有什么关系?

我用顾客对一个列表的评论数量来掩饰它的受欢迎程度。假设是,更多的评论对应着更高的需求和受欢迎程度。

为了证实这一点,我绘制了 10 大社区的平均价格和平均受欢迎程度。我只考虑了前 10 个社区,以确保每个社区都有足够的样本列表来概括趋势。

似乎,一个社区的平均价格和受欢迎程度之间存在负相关关系。此外,从可视化中可以明显看出,这种关系并不牢固,因为一些社区与趋势相反。

列表的哪些属性可以用来预测价格?

为此,我使用列表的不同属性建立了一个预测模型。我们的想法是根据上市数据建立一个模型,然后找出对该模型有贡献的最重要的预测特征。

我排除了一些附属功能,如床、卧室,为其他独立功能提供空间。

我用 80%的数据来训练模型,剩下的 20%用于预测。

这是该模型如何预测价格的可视化效果。图表上的每个点代表测试数据中的一个列表,x 轴表示实际价格,y 轴表示预测价格。

该模型能够很好地预测低于 200 美元的价格,这很好,考虑到大多数上市价格都低于 200 美元。此外,这是一个基本模型,还有进一步提高模型性能的空间。

接下来,我使用训练模型的属性来获取最重要的功能及其在预测上市价格中的相对重要性的列表。

评论和便利设施的数量以及评论评分评级、总列表数和住宿似乎是列表价格预测中最重要的特征。此处需要注意的另一点是,住宿、额外人员、浴室和客人都与租赁物业的大小有关,并在确定挂牌价格时发挥重要作用。

外卖食品

我们研究了 2016 年西雅图的 Airbnb 房源,以寻找一些与 Airbnb 使用方式有关的问题的答案。有些答案是确凿的。例如,评论的数量、便利设施和“生活空间”的面积在确定房源价格时起着重要作用。有些问题需要更多的数据才能得出更好的结论。例如,一些街区的房源数量太少,无法得出一个总体趋势。我们将需要结合不同年份的数据,看看 2016 年数据中看到的模式是否跨年份保持不变。此外,作为下一个可能的步骤,我们可以研究不同城市的数据,看看它们之间如何相互比较。

本次分析的完整代码可以在 这里 找到。

关于世界上最富有的人,有哪些数据告诉我们

原文:https://towardsdatascience.com/what-data-tells-us-about-the-worlds-wealthiest-a8c54e6ddb84?source=collection_archive---------13-----------------------

在哈佛大学大一的春季学期,我上了一门名为“利用大数据解决经济和社会问题”的课。我们探讨的最有趣的话题之一是美国的机会平等。我们了解到,孩子们比他们的父母挣得更多的机会并不一致:这取决于他们的种族、性别和他们在哪里长大。

这门课的大部分内容集中在研究数据和分析收入分配最低百分位数的结果。我对另一个极端很好奇。我想看看世界上最富有的人的数量、地理位置、财富来源和净资产的趋势。

Photo by Forbes

我发现了彼得森国际经济研究所(PIIE)的研究人员创建的数据集,该数据集使用了 1996 年至 2016 年福布斯全球亿万富翁排行榜的数据。根据 PIIE 的研究人员:

“从 1996 年到 2010 年,这些数据包括全球亿万富翁的姓名、排名、国籍和净资产(现值美元)。从 2011 年开始,还提供了财富的来源,要么列为特定公司,要么列为更广泛的行业。”

PIIE 大学的研究人员在《福布斯》的数据中加入了几个变量:亿万富翁的年龄、1996 年的美元净资产(考虑到通货膨胀),以及他们国家的国内生产总值和经济发展水平。除了原始数据集中包含的 3 位数国家代码之外,我还为洲名和国名创建了变量。

以下是我从分析中发现的…

在过去的 20 年里,亿万富翁的数量翻了两番

显然,从 1996 年到 2016 年,全球亿万富翁人数激增(更准确地说,增长了 396%)。但上升轨迹并非一帆风顺:2000 年之前增长相对停滞,2001 年互联网泡沫破裂后立即出现负增长,最明显的是 2008 年的金融危机。

美国一直拥有最多的亿万富翁

这部动画对 1996 年至 2016 年每年亿万富翁人数最多的 10 个国家进行了排名。最引人注目的发现是,在过去十年中,不仅美国毫无例外地拥有比其他任何国家都多的亿万富翁,而且即使考虑到人口规模的差异,美国与亚军国家和其他国家的亿万富翁数量差异也非常大。除了 1999 年和 2000 年,美国每年的亿万富翁人数至少是其他任何国家的 2.5 倍。然而,这一差距正在慢慢缩小,很明显,中国正在赶上美国:中国在 2008 年首次上榜(排名第五),自 2013 年以来一直排名第二。

关于各国在排名中的位置,有一些有趣的观察结果:

  • 总共有 19 个国家至少上榜一次。
  • 自 1997 年以来,每年都榜上有名的国家只有美国、德国、香港和英国。
  • 这一排名反映了日本经济的逐渐衰落:2006 年之前,日本一直排在前 5 名,之后几年一直排在榜单的后半部分,2011 年之后又跌出了榜单。
  • 自 2005 年以来,印度一直名列前茅(通常徘徊在第 4-6 位)。
  • 自 2003 年以来,俄罗斯一直排名前五,尽管在 2014 年美国和欧盟实施制裁后,俄罗斯的亿万富翁人数急剧减少。
  • 个人兴趣(和骄傲):加拿大自 1999 年以来几乎每年都榜上有名!

亚洲经历了亿万富翁人数增长最快的时期

亚洲和美洲的亿万富翁数量增长最快,其中最大的增长发生在 2008 年之后。有趣的是,在 2000 年之前,美洲和欧洲的亿万富翁人数非常接近,但在 2000 年之前,这两个地区的亿万富翁人数突然出现了显著差异。自那以后,它们的增长模式相互呼应,但美洲仍明显高于其它地区。同样令人惊讶的是,尽管非洲在过去二十年中取得了巨大的经济增长,但非洲亿万富翁的人数一直很低。

发达经济体的亿万富翁比欠发达国家的亿万富翁变得更加富有

2003 年后,亿万富翁的总净资产激增——特别是在新兴经济体,增长几乎是指数级的——直到 2008 年金融危机后立即大幅下降。然而,2010 年后,亿万富翁人数反弹,他们的净资产再次开始增长,尽管欠发达国家的增长速度明显放缓。

自 2000 年以来,超过四分之一的亿万富翁的财富来自金融业

该数据集将亿万富翁的财富来源分为以下 6 类:

  • 资源相关:能源(不包括太阳能和风能)开采,钢铁
  • :计算机技术、软件、医疗技术、太阳能和风能、制药
  • 非贸易:零售、娱乐、媒体、电信、建筑、餐饮等服务业
  • 金融:银行、保险、对冲基金、私募股权、风险资本、投资、多元化财富、房地产
  • 贸易:农业、消费品、航运、制造业
  • 其他:教育、工程、基建运动队所有权、身份不明的多元化财富

尽管最大比例的亿万富翁已经并将继续主要从金融业获得财富,但这一比例自 2008 年达到峰值以来一直在稳步下降。另一方面,自 2008 年以来,来自“新”和可交易商品行业的亿万富翁比例一直在上升。

需要注意的是,数据集并不完美。PIIE 的研究人员指出了它的一些缺陷:

缺失数据

“报道的亿万富翁人数和世界上实际的亿万富翁人数之间可能存在差异,因为一些亿万富翁可能更喜欢对他们的财富规模保密……”

“还有一种可能是,许多私营公司被忽视了,至少在公司上市或创始人去世之前是如此。”

“另一类被排除在名单之外的亿万富翁是那些收入与非法获取租金有关的人,包括腐败的政府官员或毒枭。”

不一致的报告

《福布斯》通常不包括那些财富与其权力地位挂钩的君主和其他国家领导人。《福布斯》在 1997 年和 1998 年破例,包括 8 位君主和 4 位独裁者,但名单不完整,这一群体在后来几年被终止。”

“这个数据集的一个缺点是福布斯对样本中部分家庭财富的报告不一致。1996 年和 2001 年至 2014 年,亿万富翁是以个人身份报道的,除非“兄弟姐妹之间的所有权划分不清楚”……然而,从 1997 年到 2000 年,该榜单按家族汇总了个人亿万富翁。"

由于这些缺陷,我的分析少报了亿万富翁的数量和他们的总净资产,从而扭曲了一些国家和地区的结果。另一个含义是,由于数据质量的问题,我进行的一些分析返回了误导性的结果,所以我选择排除它们。例如,随着时间的推移,亿万富翁的平均年龄或中值年龄的图表将是不准确的,因为非常高比例的亿万富翁被错误地列为 0 岁(至少我希望这是不正确的……)或他们的年龄在数据集中缺失。

我还想制作一张每年新增亿万富翁人数的图表,以说明亿万富翁人数的年度增长被夸大了,因为亿万富翁在未来几年不太可能从榜单上消失。然而,正如 PIIE 的研究人员指出的那样,只有当《福布斯》发现他们的净资产时,从私营公司获得财富的人才会被列入名单(例如,只有当公司上市或创始人去世、有人继承了他们的财富成为众所周知的事情时)。这意味着一些人会在他们真正成为亿万富翁的几年后才首次被列入名单,这扭曲了“新亿万富翁”结果的准确性。

关于世界上的亿万富翁,还有很多东西需要了解。我很好奇性别和年龄分布如何随着时间的推移而变化,以及是否有更多的“白手起家”或继承财富的亿万富翁。希望随着数据的增长,我们可以开始回答这些问题以及更多的问题。

你可以在这个 RPubs post 和这个 Github repo 上找到我所有数据可视化的数据和代码。

我在这篇文章中引用的 PIIE 研究是由 Caroline Freund 和 Sarah Oliver 撰写的名为“超级富豪的起源:亿万富翁特征数据库”的工作论文。

DeepMind 的 AlphaStar 击败星际玩家对 AI 研究意味着什么

原文:https://towardsdatascience.com/what-deepminds-alphastar-beating-starcraft-players-means-for-ai-research-62ca70ccb403?source=collection_archive---------12-----------------------

这篇文章是关于 AlphaStar 在 2019 年 1 月的胜利。

在 12 月份进行基准比赛后,DeepMind 的星际争霸(StarCraft)玩 AI AlphaStar 在一系列游戏中击败了职业选手。

image via https://gigazine.net/

暴雪的星际争霸是一款复杂的电子竞技游戏,没有单一的获胜策略。它在单人模式下有自己的人工智能,但它依赖于手工制作的规则,比实际玩家拥有更多关于地图状态和对手的信息,并且能够同时执行命令,比人类快得多。鉴于其复杂性,击败人类被认为是人工智能研究的另一个巨大里程碑。但是所有其他的星际人工智能以前主要依赖于一系列手写的规则和限制。直到现在,他们都没有达到职业选手的水平。

但是 AlphaStar 不是人工通用智能。 DeepMind 的系统不是一个单一的模型,能够同时在围棋、象棋和星际争霸中击败人类。无论是跳棋还是魔兽,他们的模型都无法击败人类。尽管如此,从技术上来说,这一成就可能比其他成就更加重要:

  • 星际争霸赛很长,执行的动作数量远高于一局围棋的回合数。在游戏开始时做出的决定,可能只会在游戏结束时有用。错误的决定仍然可以伪装成有用的决定,如果玩家后来设法修正它们并扭转局面的话。一个策略的成功只能在每局游戏结束时才能得到充分的评估,而所有成功的策略仍然可以用其他策略进行反击(尤其是在星际争霸的情况下)。AlphaStar 代理能够学习多种通常良好的长期策略,而不仅仅依靠剥削。
  • 玩家看不到整个地图和他们对手的所有行动,只有他们将要选择什么策略的粗略想法,这意味着星际争霸是一个不完整和不完美的信息游戏。这意味着 AlphaStar 能够“想出”成功的长期战略,甚至在未知的情况下改变它们
  • 行动需要时间来产生效果,命令只有在以后才能完全执行,而且只有在环境允许的情况下。AlphaGo 可以将棋子移动到任何自由的位置,它的决定会立即改变棋盘。另一方面,AlphaStar 需要对时间有一些概念,如何提前计划时间,并知道在游戏的不同阶段哪些策略更有用。
  • 与回合制棋盘游戏不同,《星际争霸》是一款即时战略游戏,玩家可以同时采取行动。玩家对他们的观察反应越快,对他们来说结果就越好。DeepMind 的工程师已经成功训练了一个深度学习模型,能够像专业人员一样快速地对环境做出反应(甚至更快,但他们不允许这样做)。训练深度学习模型很昂贵,但运行它们又快又便宜,因此在新一代智能手机中运行模型的人工智能芯片越来越多。尽管对代理的培训是在 16 个云 TPU v3上进行的,每个并行 420 万亿次浮点运算(作为衡量标准,PS4 Pro 有一个 4.2 万亿次浮点运算 GPU),但最终的 AlphaStar league 模型适合 pendrive,甚至可以在普通的桌面 PC 上运行。

Final match against MaNa

那么为什么这还不是一般的智力呢?

所有的游戏都在一张地图上进行,只有一个种族(神族)与自己对抗。一个类似小地图的游戏领域的表示被输入到模型中,而不是来自星际争霸的一系列截图。AlphaStar 没有学习过星际争霸,它已经学会了在地图上执行哪些动作,以及如何根据现有的信息来计时。这不是一个微小的差异:AlphaStar 可能无法在不同的地图上击败人类,无论是与不同的种族,甚至是玩不同版本的游戏。虽然它的新版本很可能会玩其他种族,但学到的能力仍然会与我们在环境中的感知和选择行为不同。不要误解我,AlphaStar 获奖仍然是人类的一项巨大成就,但这也意味着它只在一个狭窄的领域取得了成功:提出一系列有用的行动,并不等于成为不同领域的战略家。这一点在与 MaNa 的最后一场比赛中表现得最为明显,他在 AlphaStar 的策略中找到了一个漏洞,并不断滥用它以最终获胜(迫使人类犯错或让电脑玩家重做次优策略也是职业玩家使用的策略)。他的诡计可以被大多数人类玩家避免,只要简单地建造一个单独的对抗单位并阻止它。但是 AlphaStar 以前从未见过这样的信息,也没有一系列学习过的动作来响应。AlphaStar 没有学过星际争霸。然而,对于需要战略规划的领域来说,这是一个前所未见的解决方案。

AlphaStar Agent Visualization

AlphaStar 获胜意味着,从理论上来说,我们现在拥有在需要长期战略、信息仅部分可用、实时决策是关键的领域使用人工智能的技术。尽管不是人工一般智能,但它是迄今为止人类必须自己解决的最复杂认知问题的一个有前途的解决方案。除了我们仍然必须缩小问题的范围,如果我们想要人工智能成功地解决它。

别忘了阅读 DeepMind 自己关于 AlphaStar 成功的博客。

波多黎各总督辞职后说了什么?推特数据分析

原文:https://towardsdatascience.com/what-did-puerto-rico-say-after-its-governor-resigned-a-twitter-data-analysis-a0a3dd727184?source=collection_archive---------25-----------------------

使用 spaCy、Google Cloud 和 NLP 解释包含# RickyRenunció标签的推文。

波多黎各岛和它的人民正在创造历史。7 月 13 日, 波多黎各新闻调查中心 公布了一份由 889 页电报组成的文件,这些电报是总督、里卡多·罗塞尔洛和他的内部工作人员之间相互交换的。其内容包括厌恶女性的内容、同性恋恐惧症、性别歧视、粗俗语言,甚至是对玛丽亚飓风受害者的玩笑。

人民的公关不赞成这样的行为,从其总督,并不想由他来代表。因此,由于泄漏,以及在此之前几天爆发的腐败案件,7 月 15 日,超过 50 万波多黎各人走上旧圣胡安的街头,连续 12 天举行抗议活动,包括 7 月 23 日的全国大罢工,有超过 75 万人参加。

Old San Juan. Picture of me.

但是罢工并没有在圣胡安的街道上结束。数千名不住在岛上的波多黎各人在世界各地举行示威活动,让人们听到他们的声音,并对在旧圣胡安战斗的人表示同情。此外,这些表现也存在于社交网络中。在那里,人们通过评论、讨论和模因表达自己的意见。

经过 12 天的抗议,里卡多·罗塞尔于 7 月 25 日辞职,于 8 月 2 日生效。就像波多黎各和全世界在网上发出声音一样,他们再一次通过社交网络让人们听到他们的声音,并庆祝他们的胜利。

为了更好地了解波多黎各人如何在网上庆祝,我收集了总共 20058 条推文,其中包含标签# rickyrennució(西班牙语为“里奇【里卡多的昵称】辞职“”)的生成,并对其进行分析。

The famous umbrellas of Old San Juan. Most of the protests took place at this location. Picture by me.

在本文中,我将展示我在调查中发现的结果。在其中,我使用了自然语言处理(NLP)人工智能、编程语言 Python 、库 spaCy谷歌云的自然语言 API 来解读推文的内容,更好地理解了波多黎各和世界在罗塞罗辞职后所说的话。有了这些工具,我分析了完整的 tweets 语料库来研究以下概念:

  • 推文中出现最多的名词动词形容词副词
  • 推文中的情绪或作者的态度。

在我开始之前,简短地补充一下:尽管这篇文章是关于使用人工智能和编程来研究上面提到的主题,但我的目标是将我将要介绍的内容传达给普通观众。因此,我将使用用户友好的词汇,并将技术术语保持在最低限度。尽管如此,对于那些想要复制这个实验的人来说,还是会有一些小的代码片段;然而,如果你不感兴趣,请随意忽略它们。此外,在分析数据时,我意识到我正在阅读推文的“简短形式”(这是一个巨大的错误),而不是全文,因此每条推文都被截断为 150 个字符,由于我是实时收集数据的,所以我无法还原这个过程。

Old San Juan. Picture of me.

数据和准备步骤

这条推文的语料库由 20058 条推文组成,是在 7 月 25 日和 26 日期间使用 Python 包 Tweepy 收集的。该数据集包含所有类型的推文,例如,带有图片链接的推文、带有提及的推文和转发推文。因此,我对数据进行了清理和预处理,使其适合我想要研究的不同用例。

为了发现排名靠前的名词、动词、副词和形容词,统称为词性 (POS),我从包含图片的推文中删除了标签、提及、转发提及,例如,“RT @account_name ”和 https 地址。而且,作为 spaCy 数据处理步骤的一部分,算法会忽略停用词,停用词是常用词,比如“ tu (西班牙语为 you )”和“ yo (西班牙语为 I )。”另外,我只使用了引理,就是它,每个单词的规范形式。例如,动词“ hablamos ”、“ habló ”和“ hablando ”是同一个词位的形式,其引理是“ hablar (西班牙语为 talk )”

下面这段代码显示了清理过程。

Old San Juan. Picture by me.

推文中出现的热门名词、动词、形容词和副词

spaCy 最强大的功能之一是词性标注,它为每个文档的术语分配一个预测标签,如名词动词,允许我们为获得的推文赋予一些上下文和意义。为了实现这一点,我使用了所谓的语言模型,通俗地说,它是一个人工智能实体,在接触了一种语言的成千上万个单词后,它已经学会了该语言的特征。

发生在波多黎各的事件成为国际新闻。因此,对此发表评论的人不仅是波多黎各人,也不是说西班牙语的人。因此,收集的许多推文都是英文的,所以我不得不使用两种语言模型——一种是西班牙语和英语一种——来更好地评估内容。****

重要提示:西班牙语模型是用取自西班牙语维基百科和新闻文章的单词训练的,不幸的是,当它用于其他体裁时,如社交媒体文本,它的性能会受到影响。尽管如此,我还是通过删除表情符号和搜索结果中指定语言以外的语言来手动修复了一些不一致的地方。所以我相信分析的总体结果不会因为这个原因而受到影响。在本文后面的存储库中,您可以找到完整的和未修改的输出。那个问题解决了,让我们继续分析。

在这一节中,我将通过八种可视化方式(四种西班牙语,四种英语)展示 Twitter 在谈论州长 Ricardo Roselló辞职时使用的十大名词、动词、形容词和副词。

下面是一个代码片段,展示了我如何使用 spaCy 获得 POS 标签(记住:您可以忽略它)。

动词

我想介绍的第一个词类是动词,表示动作的词。首先,我将显示西班牙语动词,其次是英语动词。

Top Spanish verbs

在顶部位置,我们有单词“”aprender,“这是西班牙语的“学习”这个词主要出现在一条转发的推文中,称在 12 天的抗议中,波多黎各给世界上了一课,每个人都应该学习。类似地,这个词也出现在推特上,人们说他们的国家,例如墨西哥和巴西,应该从波多黎各的事件中吸取教训。在第二个位置上,有一个大写的单词“【RESPETA】”,意思是“尊重”,它来自于一条推特,说波多黎各和整个拉丁美洲都应该得到尊重。(我将大写单词保留为大写,因为我相信与非大写版本相比,它们有另一种含义)。第三个动词是单词"celebrar"("庆祝"),它出现在一条针对路易斯·丰西(波多黎各歌手,德帕西托·盖伊)的转发推文中,告诉他不值得庆祝,因为他没有出现或承认抗议或运动。于是,就有了“dimi TIR”(辞职)、 放弃者 (也有辞职)、 ”(介绍)、parir() " hacer " ( ), lograr " ( 实现), sentir " ( 感受),ver"(【 现在,让我们来看看英语的对应物。****

Top English verbs

在第一个位置上,有一个词“”辞职,它出现在人们谈论辞职的推文中,以及如果美国也这样做,川普会如何辞职。然后就是“ ”,暗指出去投票,或者走*出去抗议。紧接着,我们有了“ 抗议 ”,指的是抗议本身。剩下的动词有: 告诉得到撤销抓拍 。*****

既然我们知道了动词,我将继续展示副词,修饰它们的词。

副词

Top Spanish adverbs

列表中第一个副词是“Despacito”(慢慢的),这也是路易斯·丰西(Luis Fonsi)和《美国佬老爹》(Daddy Yankee)的 2017 年热门歌曲的歌名。Twitter 用户利用这个术语告诉 Luis Fonsi,他应该慢慢地后退或离开,这些推文与我上面介绍的那个相关。紧接在" Despacito "之后的是单词"jáMAS"(never),它主要出现在带有短语"un Pueblo UNIDO jamás serávencido,"的推文中,意思是类似于" united we stand。“然后,还有另一个波多黎各俚语,“ pa'lante ”,意思是“向前,向前,”,这个来自歌手米盖尔·波斯的一条推文,他在其中向人民表示祝贺。其余排名靠前的副词有“Anoche”(昨夜)、“Nuevamente”(再次)、“ACá”(此处)、以及“【原文】abajar******

最热门的英语副词“ 而不是 ”随处可见,它出现在许多不同的推文中,例如人们感谢艺术家而不是放过他们的推文,关于人们而不是放弃的推文,以及在推文中声明而不是将针对万达·瓦兹奎(指定的继任者)的抗议变成了厌恶女性的抗议。列表中的其他副词是"真正的最后的基本上很快无论如何 ,以及******

名词

除了动词,名词也是句子的基本组成部分。这些必要的词存在的唯一用途是命名事物;就是这样,地点,人,想法,感觉。在这一部分,我将从 tweets 中找出热门名词。然后,我会列出顶级形容词,描述或修饰名词的词。

Top Spanish nouns

列表中的第一个单词,“po blar”(populate)是语言模型中的一个错误。首先,这个词不是名词,而是动词,其次,它没有出现在语料库中。我相信这是因为模型误解了一些单词(可能是一些英文单词),将其规范化为“ poblar ”,并标记为名词。第二点,我们有单词""(世界),你可以在许多推特上找到它,指出波多黎各刚刚给世界上了一课,关于一个国家如何才能取得这样的成就。然后,还有单词" país " ( 国家),它来源于关于人们为他们的国家而自豪的信息,这些信息指出那些为国家而战的人以及其他人说波多黎各再也不会是同一个国家。其余的名词包括“lección”()、“corazón”()、“ 戈伯纳多”(总督)、“ 出家”(辞职********

Top English nouns

最常见的英语名词是单词“ ”人 ,”你会在提到波多黎各人的推文中找到它。因此,在讲述波多黎各人如何在日出现的信息中,出现了“日日日”这一术语,还有人发信息说那是多么美好的日。然后,第三个词是“”,它来自另一个被转发的内容,其中一个用户说波多黎各“已经连续 11 天展示民主”其余的名词有“、“ 显示 、“ 、“、“ 、“ ”(这一个是由于西班牙语中的“T44”一词而引起的语言模式错误)******

为了知道这些名词是如何被修饰的,我还研究了顶级形容词。接下来的两幅图展示了它们。

形容词

Top Spanish adjectives

根据 spaCy 的说法,语料库中最常见的西班牙语形容词是单词""(联合),虽然这个术语几乎没有在语料库中出现,但其规范形式,单词" unido " ( 联合)确实出现了多次。你可以在那些提到或谈论一个团结的国家或人民的推文中找到这个词。紧随其后的术语是“ 完成”(完成),来自之前讨论过的包含单词“ mundo ”的推文然后,还有动词“ vencer ”,它出现在顶部是因为形容词“vencido”(打败了)的许多实例,你会在路易斯·丰西的推文中找到这个词,宣布这个岛屿不是打败了;这条推文是许多波多黎各人在过去讨论的推文中反击和攻击他的原因。随后的两个术语“sentir”(to feel)、“Haber”(to have)都是可能的错误,因为它们不是形容词,我在语料库中找不到很多与它们相关的词。剩下的五个分别是“”(【群内】)”普通 ,“impressionte”(impressive),“T67”Bravo“(勇者)和”。”********

最后,我将介绍英语形容词。

Top English adjectives

形容词“ ”——这是我之前在名词部分引用的“民主”推文的一部分——在列表中领先相当大的幅度。然后,还有“”和“ 恐同 ”(第 6 位),这两个词大多一起出现,用来形容总督和他的施政。在第三个地方,你可以看到“”这个词,经常被用来定义抗议活动的和平性质。剩下的形容词还有“历史波多黎各人 ”(大概来源于波多黎各人)、 美丽伟大 。”**********

讨论和解释

我从所讨论的条款中得到的总体感觉和收获是,自豪、民族、团结和对未来的希望弥漫在整个波多黎各人身上。用诸如" 【国家】 ,"," 教训 ," 开头 ," 胜利 "这样的西班牙语,波多黎各人民告诉世界,他们对岛上持续存在的虐待和待遇感到多么厌倦。相反,这些推文也透露了对州长、政客甚至艺术家的愤怒、愤怒和失望。**

波多黎各表现出的这种积极和充满希望的态度超越了该岛的边界,并传播到其他拉丁美洲国家,我们在推特上看到,来自这些地方的人们表示支持,甚至希望在他们的土地上开始类似的示威活动。

至于英文推特,我想说他们更关注事件的新闻,以及生活在美国的人所表现出的支持和同情。此外,经过更仔细的检查,我还发现许多推文包含针对美国及其总统唐纳德·特朗普的信息。这些推文表达了对如果美国人民像波多黎各人那样走上街头会发生什么的怀疑、不确定甚至希望。

情感分析

上一节介绍的 POS 术语让我们了解了推文的文本含义。然而,由于语料库的规模,相对来说很难感知推文背后确切的主要思想的明确印象。尽管如此,有一种方法可以用一个数字来总结和量化推文的一个特征:作者的态度。而用来识别、提取和量化的技术被命名为情感分析,一种人工智能方法。****

为了用一个数字来概括这些推文,我通过情绪分析引擎运行了每一条独特的(非重复的)推文,以量化其内容的“正面或“负面”。我使用的情感模型是由谷歌云的自然语言 API** 提供的,我选择它是因为它如何将语料库拆分成句子来计算每个句子的情感。******

下面的代码显示了我是如何计算情感的。

总的来说,谷歌传递了它检测到的 4880 个句子的情感。每个情感输出由两个值组成:分数和幅度前者是一个介于-1 和 1 之间的值,其中-1 表示负面情绪,1 表示正面感受,而 magnitude(我在此不使用)指定文档 内有多少情绪内容。****

下图显示了情感值。

Sentiment values. The vertical bar marks the mean value (0.12).

这种可视化被称为直方图,它用来显示数字数据的分布,在这种情况下是情感值。乍一看,这张图片告诉我们,大多数情绪都是中性的。这是正确的。平均情绪值 0.12 (略正)。但是,要讲完整的故事,需要考虑标准差,也就是 0.42 。这种相当显著的标准差表明情绪值非常分散或不相似,这意味着语料库中有所有类型的推文。****

让我们看一些例子,首先,我会展示一些唤起积极情绪的推文,然后是其他暗示消极情绪的推文。

阳性:

  • 好消息!
  • 历史性的!**
  • 这非常激励人。
  • "奥古罗萨·德·瑟·博里库阿·❤️🇵🇷"(以身为博里库阿人而自豪【波多黎各人的另一种说法】)****
  • 一个 100%谷奥血统的人。 " ( 看看我们能从这个百分百 wow 中学到什么吧。)
  • "我想给其他人一些启发。(我很高兴知道我们已经成为其他国家的榜样)。**

底片:

  • 腐败,谎言,可恶的行为… 。
  • Rosselló州长的腐败和他充满仇恨的言辞更是雪上加霜。”
  • "人民厌倦了被欺负… "
  • "操他妈的波多黎各政府,以为他们可以把他们的脏衣服藏在紧闭的门后……"**
  • "不要去参加婚礼"(我再也不会买你的歌了****
  • "RT @[姓名已删除]: Que tipo mierda。”(多么傻逼的人)****

总结和结论

在对他和他的政府进行了数周的抗议后,波多黎各总督辞职了。为了庆祝这一重要的历史时刻,波多黎各人民和全世界都在推特上发表意见,分享结果并进行庆祝。因此,我收集了一个包含# RickyRenunció标签的推特语料库,以进行一项实验,其目标是解释和总结推特用户所说的话。

在我调查的第一部分,我使用 NLP 库 spaCy 来发现热门的名词、动词、形容词和副词,以及用户想要通过推文传达的整体思想。在分析调查结果后,我得出结论,大多数推文都谈到了作为波多黎各人的自豪感、团结和希望,同时表现出成就感和幸福感。此外,许多非波多黎各人在推特上表达了他们的同情,并希望在各自国家效仿岛上刚刚发生的事件。

然后,在第二部分,我研究了推文的情绪,发现评论内的普遍情绪或态度略偏正面(平均值 0.12 )。尽管如此,标准差还是相当高(0.42),这意味着推文展示了一系列情绪和感受。

完整的 tweets 语料库和源代码可以在下面的资源库中找到。出于隐私原因,我删除了推文中的所有提及。

****** [## juandes/pr-辞职-推文

此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…

github.com](https://github.com/juandes/pr-resignation-tweets)

如果您有任何问题、意见或希望联系我,请在此留下您的意见,通过 Twitter(下面的链接)联系我,或访问我的网站(我的个人资料上的链接)了解更多信息。

[## 胡安·德迪奥斯·桑托斯

胡安·德迪奥斯·桑托斯的最新推文(@ jdiossantos)。机器学习/数据工程师。还有,口袋妖怪大师,还有…

twitter.com](https://twitter.com/jdiossantos)

感谢阅读。******

我们和 AI 的区别在哪里?

原文:https://towardsdatascience.com/what-distinguishes-us-from-ai-dc98f71de9a3?source=collection_archive---------16-----------------------

人工智能的突破使得我们的智力——甚至我们的创造力——将保持无可匹敌的信念变得更加复杂

The Creation of Adam by Michelangelo (c. 1512); modified by the author.

相信我们的独特性是人类自我理解的核心;然而,一次又一次,被认为是我们与众不同的特征被证明是海市蜃楼。

几千年来,人类一直宣称自己优于其他生物。从美索不达米亚到中国,古代文明的神话将人类的起源追溯到神的创造。宗教教义呼应并固化了这种情绪。在《圣经》和《可兰经》中,人类被描绘成神圣地注定要统治所有的造物。即使在佛教中,所有的生物都在无尽的轮回中相连,只有人类才能获得开悟。

科学突破挑战了这种世界观。查尔斯·达尔文的物种起源和基因组的发现让人类只不过是共享进化树上的一个分支。然而,与我们对独特性的渴望相呼应,科学发现了一组全新的特征,使人类恢复到我们想象的卓越状态。在许多被认为是人类独有的属性中,有抽象推理、语言、复杂的社会结构和工具的使用。当然,这些规则也有例外。随着时间的推移,我们观察到一些动物确实使用工具,以复杂的方式交流,并在类似早期人类社区的社会结构中组织起来。然而,毫无疑问,人类的这些能力远远超过了我们的动物同伴。没有其他物种建造过大教堂,利用过蒸汽动力,或者把自己的同类送上月球。

智慧之战

我们的祖先仰望天空,在神圣的起源中寻求确认;多亏了科学,我们不需要再从我们的头骨内部寻找我们的独特性。然而,随着能够模仿我们智力的人工系统的出现,甚至这种想法也开始瓦解。

算法帮助我们搜索信息,回答问题,并以我们当中最聪明的人做梦也想不到的速度进行复杂的计算。从跳棋、国际象棋到围棋和危险游戏,机器已经打败了我们最好的玩家。“就我个人而言,欢迎我们的新电脑霸主,”当 IBM 的超级计算机沃森战胜了他和另一位有血有肉的参赛者时,Jeopardy 冠军肯·詹宁斯在最后的回应中写道。

How Watson won Jeopardy by IBM Research (2013).

詹宁斯的屈从可能为时过早。尽管人工智能取得了显著进步,但拥有智能——更不用说雄心——成为我们霸主的有感知能力的超级计算机的世界仍然是科幻小说中的东西。即使是当今最聪明的机器也往往只能完成一项任务。IBM 的沃森可以回答 Jeopardy 上的几乎任何问题,但它不能,比如说,给出关系建议。甚至有一天会驱动我们汽车的复杂系统,也很有可能只能做到这一点。此外,还有许多任务——例如进行连贯对话的能力——即使是单一用途的人工智能系统也尚未掌握。

然而,鉴于深度学习和人工智能的快速发展,计算机超过我们所有的心智能力似乎只是时间问题。它始于象棋。掌握这种古老的棋盘游戏需要长期以来被认为是人类独有的智力类型:逻辑推理、战略思维和远见。1997 年 5 月 11 日,IBM 超级计算机“深蓝”在 6 局比赛中击败了世界象棋冠军加里·卡斯帕罗夫。这样做,深蓝不仅让玩家感到谦卑,也让我们相信人类思维是不可战胜的。

接下来是围棋比赛。平均每回合有 200 种可能的走法,围棋的复杂性让国际象棋相形见绌,国际象棋平均每回合只有 20 种可能的走法。总的来说,Go 的棋盘配置估计比宇宙中的原子数量还要多。精通围棋需要的推理水平远远超出了野蛮的数字运算——但也没有超出人工游戏思维的能力。2016 年,谷歌的 AlphaGo 击败围棋冠军李·塞多尔(Lee Sedol),震惊世界。尽管“深蓝”和 AlphaGo 是狭隘的单任务人工智能系统的例子,但它们的成功表明,开辟一个人类智力将保持持久优势的利基市场是徒劳的。

在旁观者的眼中

随着人们越来越清楚地认识到,没有什么智力任务是计算机不可能在某一天掌握的,人们很容易从我们创造艺术的能力中寻求安慰。许多人认为,艺术体现了只有人类才能表达的无形品质。“人工智能没有内部世界,它也不需要创造它的欲望或恐惧,”认知神经科学家 Romy Lorenz 在接受 BBC 采访时谈到计算机创造力时说。很难想象一台无法呼吸的机器——无论多么复杂——会创作出像米开朗基罗在西斯廷教堂的壁画那样迷人的杰作。然而,艺术创造力是人类独有的这一信念可能会随着时间的推移被证明是一厢情愿的,就像壁画中描绘的神圣创造的场景一样。

越来越多的证据表明,机器甚至可以将人类艺术品看似无形的方面内在化,这预示着一个独立的人工系统与我们的艺术表达相匹配的未来。一个明显的迹象是机器艺术风格转移的能力。艺术风格是一个特定艺术家或艺术运动的一系列特征。它指的是如何描绘某物,而不是主题是什么。风格是克洛德·莫内的作品(避免线条和轮廓,支持自由笔触)与新古典主义特有的精确、学院派现实主义的区别。“风格转移”指的是以另一种风格呈现一幅图像——例如拿走莫奈的一幅画,使其与新古典主义艺术品的精确美学难以区分。

Left: Impression, Sunriseby Claude Monet (1872). Right: The Intervention of the Sabine Women by Jacques-Louis David (1799).

任何有才华的人类艺术家都能够转换风格。她会研究某个艺术家的标志性风格,然后用这种审美来描绘另一个艺术家作品的主题。然而,这不是我们期望人工系统能轻易完成的事情。不像国际象棋或围棋,没有明确的目标要实现。画布没有棋盘或 19×19 格子的限制。风格转移需要对一位艺术家的风格特征(独立于给定绘画的内容)和另一位艺术家的艺术作品的内容(独立于其风格元素)进行推理。很难想象支撑所有机器智能的冰冷的数学过程能够对作为无形艺术的东西有必要的抽象洞察力。

然而,这正是德国研究人员莱昂·a·加蒂斯(Leon A. Gatys)、亚历山大·s·埃克(Alexander S. Ecker)和马蒂亚斯·贝瑟格(Matthias Bethg)所完成的。在他们 2015 年的论文“艺术风格的神经算法”中,Gatys 和他的同事提出了一种技术,该技术利用深度神经网络将图像的风格表示从其内容中分离出来。为了证明其有效性,他们应用该技术来分离两幅任意图像的内容和风格,然后将它们重新组合成第三幅图像,该图像以第二幅图像的风格呈现第一幅图像的内容。

下图(直接取自 Gatys 等人)以五幅标志性杰作的风格在左上角展示了照片的内容:j . m . w .特纳(1805)的《弥诺陶洛斯的沉船;文森特·梵高(1889)的《星夜》(T7);爱德华·蒙克的《呐喊》(1893);巴勃罗·毕加索(1910)的裸体坐像。);瓦西里·康丁斯基的作品七(1913)。

Examples of artistic style transfer presented in Gatys et al.

每一件合成的艺术品都是以相应的绘画风格对照片进行的令人信服的渲染。画布之间的显著风格差异证明了这种技术的普遍性,可以捕捉任何艺术作品的风格表现。实际上,Gatys 和他的同事证明了艺术风格可以被算法内在化,以至于它可以独立于绘画内容而应用。

将这些点连接起来

Gatys 等人的方法论和他们取得的成果一样发人深省。Gatys 和他的同事们没有设计和训练一个特殊用途的人工智能模型来实现他们的目标,而是使用现有物体识别网络的计算副产品。他们观察到,当它训练对项目进行分类时,模型学会了提取构成图像主题的结构元素,将它们与构成图像外观的元素分开。内容和风格的表现可以被分开并独立操作。

Gatys 等人推测,将风格与内容分开的能力不仅是机器图像识别的重要标志,也是生物视觉的重要标志。⁴我们识别物体的能力不受其外表特征的影响。我们的眼睛和大脑可以识别一件物品,而不受光照条件、天气、时间和无数其他因素的影响。借用格特鲁德·斯坦因的名言,玫瑰就是玫瑰,不管是夜晚、白天、夏天还是春天,甚至不管玫瑰是不是画的。在保留对象身份的同时提取风格变化的能力是任何对象识别系统(无论是生物的还是人工的)的一个非常实用的特征。Gatys 和他的同事引用了令人信服的间接证据,证明我们的视觉皮层可能确实执行类似于他们提出的方法的计算。⁵

詹宁斯对电脑霸主的屈从也许会被证明是一种怪异的先见之明。这将是历史上最具讽刺意味的事情之一,机器将摆脱困扰人类数千年的那种存在主义的自我反省:对于是什么让它们与众不同,将不会有任何疑问。科学剥夺了我们对神的创造的幻想;对我们的人工智能统治者来说,我们是创造者。如果不是在起源中,人类可能在毁灭中变得神圣。

参考

  • [1] A. Sneed,计算机首次击败围棋冠军 (2016),《科学美国人》
  • [2] E .劳里,计算机能创造出比人更好的艺术吗? (2019), BBC 新闻
  • [3] L. A. Gatys,A. S. Ecker,M. Bethge,一种艺术风格的神经算法 (2015), arXiv
  • [4] 同上
  • [5] 同上

关于联邦选举,竞选捐款告诉了我们什么?

原文:https://towardsdatascience.com/what-do-campaign-contributions-tell-us-about-the-federal-election-b4156a21e869?source=collection_archive---------36-----------------------

随着加拿大第 43 届联邦选举即将结束,我们在 ThinkData Works 的工作人员很好奇,从专家那里退一步,分析一些数据,我们能从最近的选举中了解到什么。毕竟,使用政府数据是了解我们政府如何运作的一个很好的方式。

有几十个开放的数据来源,我们可以用来探索这个问题,但我们想主要使用加拿大选举和加拿大统计局发布的数据。总的来说,我们使用了 8 个数据集来帮助我们发现关于选举的见解:

  • 2004 年 1 月至今对所有政治实体的捐款
  • 加拿大所有选区当选官员汇总表(5 个数据集,每年一个)
  • 2016 年人口普查概况
  • FSA 边界

首先,我们对捐款数据集进行了一些高级分析,该数据集提供了自 2004 年以来每一次活动捐款的详细信息。我们想看看哪个政党在全国和各省收到的捐款最多。铭记加拿大自 2004 年以来的执政党如下:

哪个政党获得的个人捐款最多?

我们有捐款数据的最早选举是第 38 届大选。我们有捐款数据的最近一次选举是 2015 年举行的第 42 届大选。从 2004 年到 2015 年,这是每个政党的捐款情况。

除了第 38 届大选之外,在所有大选中,保守党一直从普通公众那里获得最多的捐款,但这在历史上并没有导致他们组成执政党。尽管保守党在第 42 届大选中获得了 50%以上的选票,贾斯廷·特鲁多的自由党还是赢得了多数席位。

捐款的来源和该省如何投票有关系吗?

但是,看看哪一个政党每年收到的捐款最多,这是在给选举画上一个大的句号。为了开始了解政治的区域性质,我们想找出捐款来自该国的哪里,以及捐款总额和该省投票方式之间是否有关系。

虽然政党捐款总额总体下降,但并非所有政党都是如此。2004 年至 2015 年期间,自由党(-$5,740,388)和保守党(-$2,313,050)受独立捐款下降的影响最大。相比之下,NDP(67,795 美元)、独立党(12,329 美元)和绿党(70,413 美元)等政党同期的捐款略有增加。

在此必须指出,更深入的分析表明,个人对政党的捐款与每个政党在议会中占有的席位数之间没有关联。加拿大最大的两个政党多年来收到的独立捐款越来越少,而较小的政党却越来越受欢迎,这无疑是一个有趣的趋势!

谁是最大的贡献者,他们在哪里?

我们在 ThinkData Works 做得非常好的一件事是结合不同的开放数据源来揭示见解。所以我们决定把选举数据和人口普查数据结合起来,看看我们是否能更好地了解捐款的来源。

我们问自己的第一个问题是,哪个省总体上做出了最大的贡献,我们是否能够遍历不同的数据集,以了解对政治候选人做出最大贡献的地区的更多信息。

到目前为止,安大略省对选举候选人的贡献最大。鉴于捐款金额的重要性,让我们看看是否可以了解更多关于做出这些捐款的地区的信息。

在上面的地图中,较暗的区域表示对政党的捐款较多,而较亮的区域表示对政党的捐款较少。最黑暗的区域出现在安大略省南部。对我们的数据集进行一些快速查询后发现,在整个选举期间做出最大贡献的五个邮政编码区域中,有四个位于多伦多(邮政编码以 M4 和 M5 开头),一个邮政编码区域位于爱德华王子岛。

在向多伦多政党捐款最多的前四个地区中,大部分捐款都捐给了加拿大保守党。

使用由加拿大选举委员会(Elections Canada)提供的捐款数据集,邮政编码区域和加拿大 2016 年人口普查提供的信息,我们能够了解到,过去为政党捐款的个人通常比加拿大人的平均年龄稍大,收入明显更高,并往往获得更高的学位。

虽然拥有更多可支配收入的人更有能力做出贡献,这可能是常识,但人口普查数据有助于我们更深入地了解这个国家的意识形态面貌。

哪位获奖者收到的捐款最多?

接下来,让我们把注意力转移到了解哪些选举候选人获得了最多的贡献。

根据加拿大选举委员会提供的捐款数据集,我们汇总了捐款总额(货币和非货币),并按选举候选人对总额进行了分组。以下是在第 38 届和第 42 届大选期间获得最多捐款的候选人。

我们再一次看到,保守党主宰了这张图表。但在这些选举年中,贡献最大的候选人是邹至蕙,他是 2006-2014 年三一-斯帕迪纳市的 NDP 议员。

在第 41 届和第 42 届大选期间,对政党的捐款发生了怎样的变化?

我们要看的最后一件事是第 41 届和第 42 届大选之间的捐款额变化。这次选举很有意思,原因有很多,尤其是加拿大在两次选举之间经历了从保守派占多数的政府向自由派占多数的政府的转变。鉴于这种波动,我们想调查从第 41 届选举到第 42 届选举,哪些地区的捐款变化最大。下面的条形图显示了对政党捐赠金额增加和减少最多的邮政编码地区。

从这张图表中,我们可以看到,在第 41 次和第 42 次大选之间,保守党失去了大量以捐款形式提供的支持,而自由党则出现了显著增长。自由党看到来自安大略地区的捐款激增;特别是米尔顿(L9T),布兰普顿(L6P),大萨德伯里(P3E)。而保守党在布兰普顿(L6R)、莱斯布里奇(T1K)、卡尔加里(T3H、T3J)和奥克维尔(L6T)的支持率有所上升。

在损失的形式上,保守派失去了来自基洛纳(V1W)、布兰特福德(N3T)、爱德华王子岛(C0A)、沃恩(L4K)、巴里(L4M)、伍德布里奇(L4L、埃德蒙斯顿(E3V)、多伦多(M4N)和瓦尔-多尔(J9P)的捐款形式的支持。

跟着钱走

竞选和政治献金显然不一定是衡量哪个政党将领导我们国家的基准,但它们是我们民主不可否认的特征。通过分析这些丰富的数据,并将其与我们从加拿大人口普查中获得的社会经济和人口信号相结合,我们不仅可以更清楚地了解加拿大人的政治倾向,还可以了解他们的捐款情况。与任何地方的信息一样,诀窍在于找到正确的数据并提出正确的问题。

有兴趣问美国一些问题吗?想开始使用我们在这篇文章中使用的数据吗?请联系我们,我们希望收到您的来信。

原载于https://blog.thinkdataworks.com

与全球销量相比,评论家和游戏玩家对视频游戏有什么看法

原文:https://towardsdatascience.com/what-do-critics-and-gamers-say-about-video-games-compared-to-global-sales-bdf7a395e064?source=collection_archive---------13-----------------------

视频游戏的高销量是否意味着用户和评论家的评分更高

每年都会有从体育到冒险等多种类型的电子游戏发布。在这些游戏发布之前,粉丝们开始考虑游戏的画面会是什么样子,或者故事情节会是什么样子。

视频游戏发布了。游戏玩家去最近的游戏商店购买视频游戏。评论家发表文章提供他们对视频游戏的看法。在玩过电子游戏并对其进行批评后,每个人对它是糟糕还是表现良好都有一个大致的一致意见。

今年晚些时候,视频游戏的销售额会公之于众。对于一些游戏来说,这是有意义的,因为它们的质量无可挑剔。对其他人来说,这并不是因为他们很糟糕。因此,已经进行了一项分析,以找出评论家和游戏玩家的评级对视频游戏销售的影响有多大。

数据集

用于获取视频游戏销售信息的数据集是从这里获得的。该数据集有多个特征,但它被缩减为六个重要特征:名称、评论家评分、用户评分、全球销量、流派和年份。

然后,删除具有无效输入(如 NaN)的行,并使用下面的代码重新排列数据集:

df_game = df_game.dropna()
df_game.reset_index(inplace = **True**)
df_game.drop("index", axis = 1, inplace = **True**)

运行上面的代码后,数据集现在有 142 行和 6 列。下面是数据集前五行的快照:

The first five rows of the newly formed dataset.

评论家分数是满分 10 分,用户分数是满分 10 分,全球销售额是以百万计的,年份表示它发行的年份,而类型栏是视频游戏的类型。

探索性分析

对新形成的数据集进行研究,以了解数据集中不同的列是如何相互作用的。探索性分析的活动之一是相关系数表。

A correlation coefficient table showing the correlation coefficients between all the columns

该表告诉我们,在评论家得分和用户得分之间存在适度的正相关关系。评论家得分和全球销售额之间也存在这种关系。它显示了用户分数和全球销售额之间微弱的正相关关系。

然后,绘制了两个条形图来显示电子游戏的全球销售额如何随着类型和年份而变化。

A bar graph showing the video games’ global sales vs genre

A bar graph showing the global sales of video games over the years

根据这两个图表,射击游戏销量最大,约为 1 亿,2008 年是全球销量最大的一年,约为 6000 万。

评论家得分与用户得分

另一个目的是找出评论家是否同意游戏玩家对视频游戏的评价。因此,创建了一个散点图来显示评论家分数和用户分数如何相互关联。然后,计算 p 值。

A scatter plot of critic score vs user score

The mathematical calculation for the p-value.

查看回归线,两个变量之间如预期的那样存在适度的正关系。上图中的 p 值在 0.05 以下。因此,这两个变量之间存在显著差异。

数据集聚类

数据集被聚类以查看组中不同的行是如何根据其特征的数值进行分类的。因此,K-means 聚类是一种无监督的机器学习算法,用于使这一过程更容易。

数据集的行可以分成定义数量的组。游戏数据集被分成三组。将数据集分组后,每一行都被赋予一个数字 0、1 或 2。

然后,一个名为 group 的新列被添加到带有数字 0、1 和 2 的数据集中。

The first twenty of rows of the clustered dataset

结果呢

构建了一个三维散点图来清晰地描绘用户评分、评论家评分和全球销售额之间的关系。下面是三维图像的示意图:

A 3-d scatter plot of the clustered dataset.

这三组的数据点被染成紫色、黄色和绿色。聚类数据集中标记为 0 的组被染成紫色,而标记为 1 和 2 的组分别被染成绿色和黄色。

就全球销售额而言,黄色数据点的大部分数据最高。绿色第二高。紫色的最高。

由于无法从图表中直接看到数字差异,因此创建了一个表格来显示它们的平均差异。

根据表格,黄色组的平均得分最高,为 9.07 分。绿色以平均 8.57 分位居第二,紫色以 7.11 分位居第三。

然而,当涉及到用户评分时,结果却大相径庭,绿色团队的平均评分为 9.09。黄队和紫队分别得了 8.81 分和 7.73 分。可以准确地说,视频游戏的销量越高,平均来说影评人的分数就越高,但平均来说用户的分数并不越高。

用于构建这个聚类模型的完整版本代码可以在这里看到。

数据科学家是做什么的?

原文:https://towardsdatascience.com/what-do-data-scientists-do-13526f678129?source=collection_archive---------10-----------------------

Photo by rawpixel.com from Pexels

试图阐明一个模糊的领域和职业

我最近完成了一个数据科学训练营,并开始在一家金融科技初创公司担任数据科学家。很明显,我很高兴又能找到有收入的工作了。

但是自从我开始工作以来,我注意到了一件事,那就是很多人,包括我爸爸(嗨,爸爸!)问我,“什么是数据科学,你具体做什么?”

通常,我会让他们看看我的博客,但是我意识到我以前从来没有写过这个。我写了大量关于特定数据科学和机器学习概念的文章,但我从未亲自定义这个职业和行业对我意味着什么。所以让我们现在就纠正这一点。

什么是数据科学?

首先声明,我绝不是数据科学专家。虽然我有相当多的统计和定量研究经验,但我认为自己在数据科学领域还是个新手。但这是一个自由的国家,所以我仍然可以给我的 2 美分!

让我们从世界认为数据科学是什么开始:

  • 利用人工智能预测未来。
  • 建立一个令人敬畏的机器学习模型,它可以接收大量看似毫无价值的数据,并产生价值连城的见解。
  • 让汽车自动驾驶。
  • 自动生成书籍、绘画或电子音乐。

虽然其中许多都有一定的真实性(伴随着大量的夸张和一点讽刺),但数据科学并不总是那么迷人。通常情况下,我们的工作是帮助人们更好地经营他们的企业。我将数据科学定义为:

使用量化数据产生商业见解,以帮助您的公司赚更多的钱。

我知道你在想什么——托尼真是个资本家。但最终,大多数数据科学家(以及其他定量分析师)受雇从事的工作是寻求销售更多的小工具或增加客户参与度或减少用户流失。即使是很酷的研究项目,归根结底也是为了提高他们所属的公司或大学的知名度和品牌(思想领导力这个词如今被抛得太多了)。

Photo by rawpixel.com from Pexels

帮助这个人赚更多的本杰明

因此,根据你对资本主义社会的看法,你可能会也可能不会乐于听到数据科学家都在推动增长或优化底线(利润)。

我的意思是,除非你是一名教师或消防员或社会工作者,那么你的角色很可能就是帮助你的老板赚更多的本杰明。我认为,优秀的数据科学家平均来说比其他工作职能更能影响他们工作的公司。让我解释一下为什么(也解释一下数据科学家是做什么的)。

那个“啊哈”时刻

你是否曾经在 Excel 电子表格中,将你的目标变量(你试图解释或预测的东西)与你能得到的每一个特征进行散点图绘制?就在你对找到与你的目标相关的东西失去希望的时候,你看到了类似下面的关系并大喊,“啊哈!”

Strong correlations are the nectar that every data scientist needs in order to survive

这是两个变量之间强有力的正相关关系(相关性)的一个例子(应用立方根变换使它们线性)——散点图显示,你在电影上花的越多(就电影预算和营销而言),就越有可能在票房上赚到大钱。当然,给你的摄制组全权委托,让他们想花多少就花多少是愚蠢的(注意,目标变量是收入,而不是利润);但在看到这个之后,我们知道,除非我们凭借独立病毒式的成功赢得大奖,否则总的趋势是:

要么做大,要么回家!

在数据中找到这些类型的关系是任何定量分析师的目标,包括数据科学家。那么,为什么我说数据科学家可能有更大的影响力呢?

如果我们针对我们的目标逐个手动绘制每个特性,或者运行简单的线性回归,那么遍历一个庞大的特性集将会花费很长时间。如果我们气馁并放弃,我们可能永远也到不了那个“啊哈”时刻。

数据科学家利用自动化和通用算法梳理尽可能多的数据,寻找有趣的统计关系——这增加了击中“啊哈”时刻的概率。

Photo by rawpixel.com from Pexels

非结构化数据

数据科学家的另一个优势是对隐藏在非结构化数据中的信号的欣赏(如 Reddit 评论、推文、图像或博客帖子)以及从所有伴随的噪音中分离出这些信号的能力

想想看,潜在有用的数据无处不在。如果仅仅局限于我们公司决定存储在其数据库中的内容,那将是一种耻辱。

因此,数据科学的很大一部分是寻找“人迹罕至”类型的特征,为您提供分析优势。这些可以是多年来辛苦收集的专有数据集(想想脸书、谷歌、亚马逊、腾讯和网飞)。它还可能以一种前所未有的方式使用现有数据(例如霍林格的球员效率评级,现在是每个定量篮球分析师工具包的一部分,完全是根据现成的得分数据计算出来的)。

数据科学家在寻求区分数据时常用的一些方法包括:

  • 网页抓取。
  • 将多个数据集拼接在一起,形成一个自定义的、功能更强大的功能集。
  • 降维 ( PCA ,话题建模等。)将所有非结构化数据转换成可用的格式。
  • 上 Kaggle(开个玩笑)。

关于算法和模型

请注意,到目前为止,我们几乎没有提到任何关于机器学习算法或统计模型的内容。虽然了解算法(如神经网络或 XGBoost)的工作方式及其优势和局限性很重要,但构建和运行模型只会占用数据科学家很小一部分时间

更多的时间花在定义问题和方法、收集数据和清理数据上(将会有大量这样的工作)。是的,有博士科学家从事最新和最前沿的研究,但不幸的是,我们不可能都是吴恩达。我们其余的人继续受雇于他和其他人的研究,并为他们找到有用的、有价值的应用。

所以如果你问我——对算法了如指掌和对公司的行业和产品了如指掌,哪个更重要,我会说是后者。

通常情况下,最好的算法和第二好的算法之间的性能差异并不大。因此,如果我们在 XGBoost 会产生更好的结果时选择逻辑回归,这是可以的。

但是如果我们不知道如何问正确的问题,结果浪费了大量的时间和资源试图解决不存在的问题,那就不好了(我们可能会被解雇)。因此,了解算法,但真正了解业务。

结论

我希望你喜欢我对数据科学家工作的漫谈。我真的很高兴能成为这个令人兴奋的领域的一部分。如果你有任何关于作为一名数据科学家工作的想法想要分享,请留下评论。干杯!

更多数据科学与分析相关帖子由我:

数据科学家挣多少钱?

数据科学家面临自动化的风险吗

拿到了数据科学的工作?

了解 PCA

了解随机森林

理解神经网络

数据科学家做什么

原文:https://towardsdatascience.com/what-do-data-scientists-do-e0dd2fbd6b96?source=collection_archive---------19-----------------------

数据科学中有许多角色:数据分析师、数据工程师、机器学习工程师。它们有什么不同?

数据科学家曾经是一名科学研究人员,他结合统计方法和软件开发专业知识来创建、分析和解释数据。但现在你可以成为一家公司的数据科学家,处理数据,试图理解现实世界商业数据的实际含义。

什么是数据科学?

数据科学是计算机科学中关注数据的一个领域。数据科学家将统计分析和计算机程序等方法结合起来。数据科学家在日常工作中使用一套非常特殊的技能。数据科学家最基本的工作就是创建数据,然后用软件分析数据。

数据科学工作有几种主要类型:

数据科学家

数据科学中最著名的职位。数据科学家是一个非常专业化的工作。数据科学家用于数据分析和建模,用于理解复杂的数据世界。数据科学家有多种角色可供选择。数据科学家的职位范围从软件工程师到必须编写机器学习算法。他们更倾向于数据科学的理论范畴。

数据分析师

数据分析师是一个职位名称,用于分析大量数据以帮助公司做出商业决策。数据分析师使用 SQL 等工具在大量数据中寻找模式,以帮助他们回答复杂的业务问题。数据分析师的工作要求能够理解数据并与数据沟通,这样他们才能理解数据对他们的业务有何影响。它们介于数据科学的实践和理论方面。

数据工程师

数据工程师通常在业务或业务应用中工作,负责开发系统,如数据库,帮助人们理解数据。

一些数据工程师是具有科学或工程背景的工程师。这意味着他们可能没有计算机科学学位,但确实拥有技术知识——例如数学或物理学位。当涉及到数据时,它们是最实用的。

机器学习工程师

使用数据处理软件的计算机工程师和软件开发人员非常了解数据科学的不同方法和途径。它们专门面向构建可投入实际使用的机器学习问题。

这至少是这些角色背后的理论。实际上,根据你申请的公司,你会在就业市场上发现它们相互混杂。这就是为什么阅读这份工作的要求,或者在面试中询问这些要求是至关重要的,因为你可能最终会进入一个你没有申请过的职位。

数据科学家是做什么的?

在普通的一天中,数据科学家将查看任何大小的原始数据集,了解它能做什么并理解它,使用算法分析数据以建立假设,并使用统计、机器学习和数据挖掘等分析工具测试和验证假设。

在理想情况下,数据科学家应该能够理解和分析数据,帮助企业解决复杂的问题,并找到解决问题的最佳方法。

总而言之,数据科学家是一个令人兴奋的角色,因为它提供了成长和创新的机会。这项工作包括分析数据,并让用户可以访问数据,这样他们就可以对数据做出正确的决定。它包括理解数据格式、确保数据安全和隐私,以及向客户提供高质量的解决方案。

Data Science Job

最后,如果你想了解成为一名数据科学家意味着什么,那么看看我的书数据科学工作:如何成为一名数据科学家,它将指导你完成这个过程。

如果你想了解更多关于成为数据科学家的信息,请阅读我的其他文章:

  • 成为数据科学家的 5 种方法
  • 给数据科学家的最佳建议
  • 如何从数据科学开始
  • 成为数据科学家的实用指南

谢谢!

缺失的价值观背后隐藏着什么

原文:https://towardsdatascience.com/what-do-missing-values-hide-behind-them-40b5406f7495?source=collection_archive---------23-----------------------

Toronto Downtown. Free edition of an image at ISO Republic under CC0 license

当然,我会一直说我很幸运登陆了安大略省的环境开放数据门户,因为我在那里找到了一个非常有价值的关于多伦多及其周边地区的空气质量的信息来源,有完整的可下载信息,以 csv 文件的形式免费提供。当然,很好的练习数据。但是当我第一次以电子表格的形式打开这个门户网站的 csv 文件来看一看这些信息时,我意识到了这些奇怪的值:9999 和-999 什么…?如文件头中所述,这些分别是无效数据和缺失数据。好了,是时候面对数据分析的真相了,没有完美的数据集!

缺失值的问题是每个数据分析师必须面对的最常见的问题之一,也是无效数据的问题。通常,丢失的值只是 csv 文件中分隔符之间的空格,而一旦导入数据,就必须“手动”检测无效值,大多数情况下是异常值。我再次感到处理这些数据集很幸运,因为这些异常值已经被编码,显然,我不应该注意它们。

不管我们怎么想,丢失的值可能是一个有价值的信息来源,问题只是要注意它们何时出现,并观察模式以揭示它们隐藏了什么。让我们再次考虑 2012 年多伦多市区空气质量分析。对于所研究的三种污染物,改变异常值代码之前的原始数据如下图所示。由于三种污染物的水平值范围在 0 到 100 之间,所以很容易在图中看到异常值。

从这些情节中我们能看出什么?

  • NO2 和 PM25 具有相同的缺失值
  • PM25 有 78 个无效值周期。他们中的大多数只采取了一个连续措施,是 9 个连续无效措施中最长的一个。
  • 另一方面,NO2 只有 4 个无效测量时段,然而其中一个时段(8 月)有 61 个连续无效测量。
  • 4 个 NO2 缺失值时段中有 3 个与 PM25 的缺失值时段同时开始。
  • 关于 O3 的异常值,鉴于其规律性,我们可以看到如此怪异的行为。连续无效值之间的差值始终为 183。两个第一次观测值之间的间隔,在图中似乎更大,是 266 刚好是双精度!
  • 连续缺失值之差始终为 366。两组缺失值之间的间隔是 1526,这是一个不能被 366 整除的数,所以这次我们在某些方面失去了规律性。

在这一点上,数据分析师的好奇心应该会出现,提出许多问题来阐明这些见解,并从中获得有价值的知识。

但所有这些缺失值都不适合处理,因为事实上它们是不适合数据分析这样精确的科学的未知信息。一旦我们理解了它们,我们需要对它们执行一些操作,以便能够最好地分析这些数据并获得最准确的结果。要采取的行动将取决于它们的用途和意义,考虑到这个过程可能会影响随后的结果。

可以使用许多策略来转换缺失值:将所有值都置为 0,将它们设置为数据集中该属性的所有值的平均值或中值,或者只是最接近的值;使用机器学习算法来预测它们的值;诸如此类。您甚至可以考虑更激进的解决方案来克服缺失值,只需删除包含它们的行,但是这种策略不适合时间序列分析,因为所有的值都应该被告知。通常情况下,删除丢失的值并不是最好的主意,因为这样做最终可能会丢弃有用的信息,所以请记住,无论您的策略是什么,您都应该小心谨慎,考虑所有选项,并了解每个选项将如何影响您的数据以及结果。

数据集中缺失的值是不可取的,但是它们可以为我们提供有价值的信息。在理解了它们的性质和存在的原因之后,我们需要对它们采取一些行动,以便正确地执行所需的分析。

如何看待人工智能

原文:https://towardsdatascience.com/what-do-you-know-about-artificial-intelligence-cd91cd3946dd?source=collection_archive---------31-----------------------

人工智能是否已经到了让你失业的边缘?你应该担心吗?或者你应该立即解散整个企业吗?

现在是 2020 年。你和你最好的朋友带着笔记本电脑坐在你家的餐桌旁。你最近经常坐在那里,为一家正在合作的初创公司调整软件。一分钟前,你们都在欢呼,但有些事情改变了气氛。你低头看着笔记本电脑的键盘,慢慢地移动手指来修饰几分钟前你疯狂按下的键。你们都在问自己——我们能做到吗?成千上万的人可能会失业。我们想对跨国家和大洲的大规模失业负责吗?

这听起来可能像科幻小说中的场景。但未来几十年,许多采用人工智能(AI)的企业家将面临这种困境和许多其他道德困境。

“工厂的自动化已经大量减少了传统制造业的工作岗位,人工智能的兴起可能会将这种工作岗位的破坏延伸到中产阶级,只剩下最有爱心、最有创造力或最具监管力的角色。”(斯蒂芬·霍金)

什么是人工智能?

首先,人工暗示它不是自然的;它是人造的。智能意味着它能解决复杂的问题。在这方面,做一些区分是有帮助的。

狭义 AI 是人类迄今为止实现的唯一一种人工智能形式。从本质上来说,狭义人工智能擅长执行一个预先定义的任务,并设定一个目标。例如下棋、提出结账购买建议、在语言之间进行翻译或者建议在脸书上的特定照片中标记哪个朋友。因此,狭义人工智能在执行日常工作方面表现出色,这也是威胁当今许多工作的原因。自然,几个狭窄的人工智能可以结合起来,朝着一个共同的目标努力,例如,在人口稠密的城市中自动驾驶汽车导航。

通用 AI 是人类级别的人工智能。它能理解,推理,做决定。然而,尽管人工智能在过去的几年里取得了很大的进步,我们仍然不知道我们什么时候能够实现通用的人工智能,如果可能的话。也许我们没有足够的智慧去创造它。该领域的杰出科学家对我们何时能够实现人工智能的预测,从十年后到本世纪内都有。然而,每个人都同意,此后会发生什么很难预测。未来的发展可能会像我们以前从未见过的那样迅速。可能会很恐怖。人类将不再是地球上的思想领袖。

第一台超智能机器是人类需要制造的最后一项发明,只要这台机器足够温顺,能告诉我们如何控制它(尼克·博斯特罗姆,牛津大学人类未来研究所创始人)

今天,机器学习和深度学习风靡一时,但这些与人工智能有什么关系?从根本上说,机器学习是人工智能的子集,深度学习是机器学习的子集。

人工智能可以解决复杂问题,模仿人类行为。这包括基于多个模型和规则的编排做出复杂的决策。把人工智能看成一个综合的概念。

机器学习是人工智能的一个子集,与计算统计和数学优化密切相关

通过机器学习,数据科学家正在让计算机在没有明确编程的情况下采取行动。计算机装载了大量的数据。然后,应用各种技术,如线性回归或决策树,来开发最佳算法,以预测、回答或指导某个问题。换句话说,系统已经学会根据过去的例子预测未来。然而,这需要数据科学家与系统进行交互,并提供关于寻找什么的见解。

深度学习是使用多层神经网络的机器学习的子集

多层神经网络的灵感大致来自于我们对人脑的理解。深度学习模型能够在更大程度上学习专注于正确的功能,几乎不需要程序员的指导。这使得深度学习在识别物体、声音和理解书面语言的上下文方面非常有效。举个例子,人脸识别现在已经到了机器和人类一样有能力或者比人类更有能力的地步。

结局是什么?

想象你和你的朋友回到了餐桌旁。然而这一次,桌子上没有了电脑,年份也不再是 2020 年。相反,还有第三个参与者,詹姆斯·瓦特。1781 年,你刚刚发明了第一台产生连续旋转运动的蒸汽机。在接下来的 100 年里,它将变得强大 1000 倍,并成为引发工业革命的重要因素,导致各国和各大洲大规模失业。

你想为此负责吗?我想你会的。试图阻碍技术进步就像试图用耙子把水推上山。每个人都需要适应;另一种选择是被抛在后面。

此外,历史告诉我们,人类能够一次又一次地重新创造自己在社会中的角色。200 年前,农业雇佣了 90%的美国人口,今天这个数字不到 2%。此外,在 1930 年,伟大的英国经济学家约翰·梅纳德·凯恩斯写了一篇乐观的后大萧条时期的文章,名为《我们子孙后代的经济可能性》。然而,在这篇文章中,凯恩斯担心会出现“技术失业……因为我们发现节约劳动力的方法的速度超过了我们发现劳动力新用途的速度。—您可能已经注意到,这种情况并没有发生,相反,我们比以往任何时候都更加努力。

希望就像应用机器学习的系统可以使用过去的例子来预测未来一样,我们可以回顾过去,并确信我们会找到新的方式来度过我们的时间,因为旧的工作由于自动化而变得过时。否则,我们将迫切需要一种新的经济模式。因为,如果劳动和价值完全脱节,资本主义将会让我们大失所望。

最终,尽管计算能力和数据存储发展迅速,但人工智能颠覆行业和世界仍需要时间。一些人认为人工智能是人类的末日,另一些人认为这是解决人类今天面临的一些最重大挑战的唯一方法。双方可能都是对的。只有时间能证明一切。

“任何可以产生比人类更聪明的智能的东西——以人工智能、脑机接口或基于神经科学的人类智能增强的形式——都毫无疑问地成为最能改变世界的东西。其他的甚至都不在一个联盟里。”(机器智能研究所联合创始人埃利泽·尤德科夫斯基)

成为一名优秀的数据科学家需要什么?

原文:https://towardsdatascience.com/what-do-you-need-to-be-a-data-scientist-fc864f42841c?source=collection_archive---------20-----------------------

商业合作:环境是王道

每天早上,我都会收到关于刚刚发布的新工作规范的提醒。他们都在谈论机器学习和统计,能够用 Python,R,SQL,Spark 等语言编码,等等。现在大约 25%的玻璃门广告甚至说你需要一个博士或硕士学位。

具备良好的机器学习基础和编码能力,以便能够从数据中梳理出信息,这是先决条件。但是硕士还是博士?如果我看看我的经历,以及和我一起工作的成功人士,我会完全不同意那些教育要求。那么你真正需要的是什么?

灵活性和改变认知的能力。

首先,也是最重要的,你需要能够与企业沟通,了解他们的问题。你需要能够以一种对他们有意义的方式来构建它,并给你一个明确的目标。

original image Credit: TheWeek

第二,你需要能够深入细节,并运用你对不同问题的不同方法的知识。

  • 我是在为 EDA 做聚类,还是直接预测,还是需要解释行为?
  • 我如何为控制测试设计一个合适的测试组?
  • 我如何为这个问题创建一个 ETL?
  • 在这里设置机器学习可能会面临哪些挑战?

在这样做的同时,你需要着眼于大局。我想解决什么?如果你不这样做,那么你很容易陷入一个细节层次,这会让你的交付慢如蜗牛,让你的团队成员和利益相关者沮丧。

Credit: LSAGlobal

这里有帮助的实际上是定期与你的利益相关者会面。提交更新会推动你朝着总体目标前进,但随着你在问题上的进展,会在稍微更详细的层次上。这也有助于将你看到的东西联系起来。你的利益相关者每天都生活和呼吸着这个业务。他们会知道你发现的是标准还是洞察力。你的利益相关者可能会质疑你,告诉你这是胡说八道。有时候他们是对的,有时候你需要坚持自己的立场,让他们相信这是回答他们问你的问题的方法。这并不容易,但它会帮助你引导和关注接下来的步骤。但是要到达这里,你需要

  • 缩小细节,
  • 以一种他们能理解的水平展示他们的见解,
  • 然后听听他们怎么说,这样你就可以测试和/或实现它。

在这个简短的示例中,您可以看到一个高效的数据科学家是如何从高层次开始,深入细节,再回到高层次,然后再回到细节的。

当然,数据科学家需要具备询问数据的编码技能,以及选择正确方法的统计技能,但对我来说,这是与利益相关者的业务合作和互动,是需要的第三个支柱。我不认为这里需要博士或硕士学位。

现在有大量的数据可供我们使用,随着HBR 引用的跟随我们,有大量的人成为数据科学家。然而,并不完全是技术元素。我听过同事说“我不需要理解数据,算法会替我做的。”对我来说,这是完全错误的态度。这导致过度拟合和模型结果不佳——伪相关性或关联过程作为预测因素。这不仅仅是理论上的,我已经看到了它的发生,它会给企业带来糟糕的结果。不信,看下面…**

语境的力量

下面是两个模型的结果。两者都有稀少的发生率(左边 7.8%,右边 5%)。我将结果缩放为每 1000 个客户,并显示了模型结果的缩减,为了公平比较,召回率为 16%。由于召回率较低,我的目标客户是这里的顶级客户,因此需要高精度。

对于左边的模型,我与企业进行了交流,了解了客户交互并构建了适当的变量。右边是 Kaggle 数据集,我无权访问该业务,也不在我的领域内。

左边模型的结果可以让我很确定地锁定最有可能的客户。从样本来看,右手边仍然比机会好 2 倍以上,但是成功的可能性比左手边低得多。

更具体地说,如果这两种情况都是客户流失的情况,并且我提供折扣来减少客户流失,右边的模型将意味着仍然为 88%不需要折扣的客户提供折扣,而左边的客户只有 36%。

我已经看到许多硕士或博士数据科学家进来,不想参与业务,这并不令我惊讶。他们在一个非常特定的领域投入了大量的时间独自工作,他们希望在他们感到舒适的地方工作。不幸的是,这通常不是与利益相关者交谈。

为什么我如此有灵感写这篇关于这个主题的文章?因为我担心在数据科学上已经有了很大的投入,当然这是有预期回报的。如果这个机会被浪费了,我担心它会导致分析的失败,因为信任被烧掉了。George Roumeliotis 在他的 Cargo Cult 数据科学文章中精彩地描述了这一点。

你需要的核心技能可以在网上学习,也可以通过实践磨练。然而,软技能同样重要,可以通过与企业的互动来学习,使你能够将数据联系起来,并能够讲述你正在工作的故事。

对我来说,发展的下一步必须是数据业务合作伙伴的增长。

你怎么想呢?请在评论中让我知道…

在雇佣数据科学家之前,你需要做什么?

原文:https://towardsdatascience.com/what-do-you-need-to-do-before-hiring-a-data-scientist-e7d5f53dd19c?source=collection_archive---------24-----------------------

雇佣优秀的数据科学家很难,留住他们更难。

Data can exist in any form

人工智能带来了指数级增长的前景,并将您的业务推向新的高度。难怪围绕人工智能(AI)的应用有很多令人兴奋的事情。

许多公司都急于聘请他们的第一位数据科学家,或者立即建立一个数据科学团队。他们的热情是可以理解的,因为他们希望利用数据进行创新,而不是被市场淘汰。然而,这些早期的失误和错误开始给公司造成了巨大的机会成本,数据科学家在短短几年内就离开了这些公司。

以下是一些建议,供您在投资于贵公司的数据科学职能部门之前进行准备:

1.清楚地了解你为什么要雇佣一名数据科学家

您可以从识别您希望他们解决的业务问题和机会开始。您不一定需要大量的数据,但是您肯定需要一些与已识别的业务问题相关的数据。例如,一个包含几十万行、数据属性正确、覆盖大部分人口分布的电子表格可能就足够了。

如果从一个主要的业务问题开始被认为风险太大,你可以从列出简单的用例开始,比如:

  • 客户服务中心基于语音的欺诈检测和减少。
  • 电子商务网站的产品推荐。
  • 预测 B2B SaaS 公司的客户流失。

让数据科学家看看我们拥有的数据,让他们产生商业价值是一个糟糕的策略。

或者,如果你想在冒险建立自己的团队之前先试水,你可以聘请独立顾问或与服务提供商合作。(免责声明:我是数据科学咨询公司的一员。)

2.了解数据科学概况,知道你想雇佣什么样的人

像任何其他职业一样,数据科学家来自各种背景(营销人员、设计师、产品经理等。).一些人擅长构建机器学习模型,而另一些人则擅长分析和可视化。一些人只从事计算机视觉,而另一些人只从事自然语言处理(NLP)。有些人是多面手,有些人是专家。

雇佣与你的问题领域相关的数据科学家。

你不需要聘请一个博士或者使用 Kaggle 作为你评估一个人的主要手段。有好的没有博士学位的数据科学家,从来没有参加过 Kaggle 的比赛。

当你雇佣没有商业经验的博士时,你会偏向于学术风格的方法,而不是商业思维。

相关学科的博士学位和参与像 Kaggle 这样的社区活动是一件好事,但这不应该成为强制性的招聘标准。也就是说,他们绝对必须知道他们的领域发生了什么。

除了少数与企业合作的机构,学术界没有解决商业问题的背景。一个没有商业经验的学术人员可能最终会花费大量的金钱来解开数据中的异常,而你所需要的只是一个快速的原型来进入下一个阶段。

你的第一个雇员应该具备足够广泛的数据科学领域知识和一些商业知识。

你可能首先需要一名“数据工程师”,他擅长软件工程、数据存储、提取和管理,而不是像数据科学家那样擅长数学和统计。

3.定义你希望他们做什么

数据科学家在利用和促进学术研究的同时,被应用其专业知识来解决复杂问题所驱动。

专注于公司而不是问题和用例的职位描述,或者不提供或提供一般信息的职位描述不会吸引太多的注意。例如,不要谈论你那可能吸引 MBA 的价值数十亿美元的保险公司,你应该谈论一些用例,比如汽车损坏的自动检测,提高打击虚假索赔的准确性等。来吸引数据科学家。

寻找一个对数据科学无所不知的人,就相当于寻找一只精通商业、技术、数学、建模、编程和统计的独角兽。

你应该考虑整体技能,而不仅仅是硬技术技能。他们需要作为你团队的一部分,填补你团队目前缺少的技能空白。

4.建立有利于数据科学家的数据驱动型文化

向内看,评估你的公司文化是对数据科学家有利还是不利,这一点至关重要。一些危险信号包括没有任何对数据科学有基本了解的技术或业务人员,或者没有任何数据和技术支持。

如果公司没有处理数据的经验,不能做出基于数据的决策,数据科学家将很难将他们的工作转化为业务和客户价值。

您还需要制定出支持数据科学家或团队的总体预算。拥有巨额风投资金的人工智能初创公司可能不必担心这一点。对于企业来说,考虑到您想要解决的数据和问题的规模,这些成本可能高达数十万,这可能会使您的良好努力陷入停滞。开源软件和数据科学工具降低了部分成本。

那些在人工智能工作中失败的公司(其中很多都失败了),最终会将糟糕的技能归咎于数据科学家,而事实上,可能是他们未能提供正确的支持、环境、预算和团队。

5.决定他们在你的组织中的位置和方式

您需要一位来自产品、技术或业务职能部门的内部领导者来指导、支持和领导数据科学计划。

数据科学团队应包含一项职能,以建立节奏、责任和来自业务其余部分的持续反馈循环。

集中还是分散团队这个不可避免的问题迟早会出现。有许多因素,如您当前的流程、组织模式、数据成熟度和团队规模,会影响选择一种方法的决定。

对于一个规模化的人工智能创业公司,你可能会发现一个团队中有许多数据科学家。对于像谷歌和脸书这样的技术巨头,你可能会发现每个产品团队都有一名数据科学家负责数据密集型产品。对于企业,您可能会发现一个所有其他团队都可以访问的集中式数据科学团队。对于敏捷组织,你可能会发现一个专注于 AI/ML 产品的数据科学团队。

无论您决定采用哪种模型,在构建数据科学功能时都要保持尝试和发展的灵活性。

6.有一个支持或专门的产品经理

鉴于一部分博士研究是在孤立状态下完成的,一些商业领袖认为数据科学家在孤立状态下完成了他们的大部分工作(想象一个科学家被锁在房间里在黑板上涂鸦)。这与事实相去甚远。数据科学家需要一个由工程师、业务利益相关者、项目经理和其他团队成员组成的团队来交付项目。

您应该为数据科学家正在解决的业务问题/机会指派一名专门的产品经理或支持产品经理。产品经理可以处理无数的任务,如需求收集、客户洞察、数据分析、运营模式、法律指导、交付产品、集中资源以及将产品投入生产。数据科学家应该参与许多这样的活动,但是如果没有支持,你不会从他们的努力中获得太多的价值。

很少有过去与产品经理和 Scrum 大师共事过的数据科学家看好这个想法,他们说:

产品经理想要在不增加任何价值的情况下获得大量的荣誉。

这种说法对某些人可能是对的,但不是所有人。大多数产品经理以前从未交付过数据科学项目。随着数据科学产品管理领域和艺术的发展,他们正在学习和解决问题。

产品经理可以在整个业务中建立一致性和期望值,在清除障碍方面非常有价值。

结论是,产品经理和数据科学家之间必须有明确的角色定位,以及每个成员为这种合作关系带来的好处。

以上每一点,本身都可以是一篇长文。围绕成本、流程、技能、团队、运营模式等等,有太多问题需要解决。

请在评论中告诉我你的想法,如果你想知道更多具体的事情。

感谢Jakub Langr审阅草稿并提供意见。

你想在 NumPy 文档中看到什么?

原文:https://towardsdatascience.com/what-do-you-want-to-see-in-the-numpy-docs-de73efb80375?source=collection_archive---------21-----------------------

NumPy 和 SciPy 与谷歌文档季的幕后

Photo by Chevanon Photography from Pexels

在经历了许多焦虑之后,我欣喜若狂地发现我被 NumPy 选中参加Google Docs 季!!!!!

GIF via GIPHY

Docs季开始了!!!

谷歌文档季?

谷歌做了一件惊人的事情,创造了文档季。它为技术作者与开源组织合作创造了真正的机会。

“博士季节”是一个为期三个月的辅导项目。它将技术作者与开源组织配对。作家有机会与知名和备受推崇的组织合作。开源组织(他们通常没有技术作者的预算)有机会与有经验的技术作者一起改进和扩展他们现有的文档。

这太不可思议了。

Docs 季的目标是为技术作者和开源项目提供一个框架,让他们共同努力实现改进开源项目文档的共同目标。对于不熟悉开放源码的技术作者来说,该计划提供了一个为开放源码项目做贡献的机会。对于已经在开源领域工作的技术作者来说,该程序提供了一种潜在的新的合作方式。Docs 季也给开源项目一个机会,让更多的技术写作社区参与进来。

在这个项目中,技术作者花了几个月的时间与开源社区密切合作。他们将他们的技术写作专业知识带到项目的文档中,同时了解开源项目和新技术。

开源项目与技术作者一起改进项目的文档和过程。他们可能会一起选择构建一个新的文档集,或者重新设计现有的文档,或者改进并记录开源社区的贡献过程和入职体验。

我们一起提高公众对开源文档、技术写作以及我们如何合作以造福全球开源社区的意识。
谷歌文档季简介

这是双赢!

Photo by It’s me, Marrie from Pexels

什么是 NumPy?

在最基本的层面上, NumPy 是数值,或者说是数值( Num ) Python ( Py )。

来自官方文件:

“NumPy 是 Python 中科学计算的基础包。它是一个 Python 库,提供了一个多维数组对象、各种派生对象(如掩码数组和矩阵)以及一系列用于数组快速操作的例程,包括数学、逻辑、形状操作、排序、选择、I/O、离散傅立叶变换、基本线性代数、基本统计操作、随机模拟等等。”

这是一个非常重要的开源 Python 库。它是 Python 中科学计算的核心库。它在数据科学、机器学习、深度学习、人工智能、计算机视觉、科学、工程等领域都很有用。它增加了对大型多维数组和矩阵的支持,以及可以对数组进行操作的大量高级数学函数。

NumPy(数字)的祖先最初是由吉姆·胡古宁创造的。到 2000 年,人们对为科学和技术计算创造一个完整的环境越来越感兴趣。2001 年,Travis Oliphant、Eric Jones 和 Pearu Peterson 合并了他们编写的代码,并将结果包称为 SciPy。2005 年,特拉维斯·奥列芬特创建了 NumPy。他通过将 Numarray 的特性整合到 Numeric 中并做了大量的修改来做到这一点。2005 年初,他希望围绕一个单一的阵列包来统一社区。因此,他在 2006 年发布了 NumPy 1.0。这个项目是科学计划的一部分。为了避免安装大的 SciPy 包只是为了获得一个数组对象,这个新的包被分离出来并被称为 NumPy。

什么是 SciPy?

是科学(SciPython(Py)! SciPy 是一个免费的开源 Python 库。它用于科学计算和技术计算。它包含了用于优化、线性代数、积分、插值、特殊函数、 FFT 、信号、图像处理、 ODE 解算器等科学与工程中常见任务的模块。SciPy 使用 NumPy 数组作为基本的数据结构。它有科学编程中各种常用任务的模块。这些任务包括积分(微积分)、常微分方程求解和信号处理。

SciPy 构建在 NumPy 数组对象上。这是 NumPy 堆栈的一部分。该堆栈包括像 Matplotlib 、 Pandas 和 SymPy 这样的工具,以及一组不断扩展的科学计算库。它的用户来自科学、工程等所有领域。Python 拥有最大的科学用户群体之一,如果不是最大的话。类似的社区还有 R,Julia,Matlab。

还跟我在一起?

Photo by Passerina from Pexels

该过程

谷歌在 2019 年 3 月宣布了 Docs 季。4 月,开源组织有机会申请成为该计划的一部分。谷歌于 4 月 30 日公布了入选组织。技术作者可以查看 45 个组织的列表,并选择他们感兴趣的项目。他们最多可以提交三份项目建议书。从 5 月 29 日至 6 月 28 日,技术写作申请开放!申请截止日期过后,每个组织选择他们有兴趣指导的技术写作项目。

8 月 6 日,谷歌公布了被接受的写作项目!

该计划收到了来自近 450 名技术作家的 700 多份技术写作项目建议书。每个组织能够为一个被批准的项目选择一个技术作者。然而,NumPy/SciPy 团队决定更进一步,在《Docs》季之外,为另外三名作者争取资金。该团队如此坚信推进他们的文档,以至于他们找到了额外的资金。这使得他们在与《Docs》一季相同的条件下,增加了三名作家。

经费从哪里来?

NumPy 收到了两笔赠款,这是一种一揽子交易(你可以在这里和这里了解它们)。摩尔和斯隆基金会向伯克利数据科学研究所(BIDS)拨款 130 万美元,支持 NumPy 的开发。资助期从 2018 年 4 月到 2020 年 10 月。NumPy 指导委员会成员 Stéfan van der Walt 同意从这笔赠款中提供资金。)

Ralf Gommers 是 NumPy 和 SciPy 的核心程序员之一,也是 Quansight 实验室的负责人。拉尔夫是一个不可思议的人,他对《医生的季节》有这样的评价:

“当我第一次看到 Docs 季的公告时,我喜欢这个计划的想法——对我个人来说,与一位科技作家合作将是一种有趣的新体验,对 NumPy 和 SciPy 来说可能有很大的好处。所以我花了很多精力写了一个非常吸引人的想法页面,然后跟进那些表现出兴趣的作者。我大概接到了 10 个视频电话,以及更多的电子邮件。

然后,事实证明,兴趣很大,申请人和提案的质量真的很高。我开始思考如何不仅让一个或两个为期 3 个月的项目运行,而且如何让这些作家参与进来,让他们享受足够的体验,以便在项目结束后留下来。我想到的一件事是,人们喜欢和志同道合的人一起工作。然而,我们还没有技术人员——给 NumPy 和 SciPy 各增加一个可能还不够。所以我决定开始建立一个文档团队。想法和人都在那里,所以接下来需要的是资金。

NumPy 有一笔很大的活动资金,所以我和 Stéfan 讨论了将这笔资金用于 Docs 项目额外一季的可能性。斯蒂芬很棒,他也看到了提议的项目和建立一个作家团队的价值。所以他同意为此预留一些资金。所以我们今天来了——兴奋地开始吧!"

编剧是谁?

为 NumPy/SciPy 文档项目选择的作者是惊人的,你需要知道他们是谁!

玛雅·格沃兹兹

SciPy 在 Docs 季节选择的官方技术作家是 Maja Gwozdz。她的项目提案叫做“面向用户的文档和彻底的重构”你可以在这里阅读所有相关内容,但本质上,Maja 打算对现有文档进行重构,以便不同需求的用户可以轻松访问。

玛雅做了一些惊人的研究,你可以在这里找到。她不仅对 SciPy 有丰富的经验,而且她很清楚优秀的文档和指南会带来多大的不同。

安妮·邦纳

你真诚的(耶!)是 NumPy 的官方选择,项目提案是“让‘基础’更基础一点:改进 NumPy 的入门部分。”因为没有什么比帮助初学者理解复杂的信息和技术更让我高兴的了,NumPy 是一个完美的挑战!

我很高兴能够深入研究介绍性的 NumPy 材料,为没有经验的人创造更容易理解的东西。NumPy 处于这样一个有趣的位置:它非常复杂,但对于对数据感兴趣的初学者来说,它也是最重要的库之一。我将在 NumPy 中创建基本概念的初级文档,这些文档可以作为想使用NumPy,而不一定要学习它的人的垫脚石。

**更新 * *

初学者指南正在进行中,我希望得到您的反馈!看看这里的中等形式,让我知道你的想法!

[## NumPy 初学者终极指南

开始使用 NumPy 需要知道的一切

towardsdatascience.com](/the-ultimate-beginners-guide-to-numpy-f5a2f99aef54)

谢哈尔·拉贾克

Shekhar Rajak 被选为“Numpy.org 重新设计和高级文档重组的最终用户焦点”他的项目目标包括:

  • 为 www.numpy.org设计和开发更好的 UI
  • 增强和修改www.numpy.org的内容:NumPy 用户指南、NumPy 基准测试、F2Py 指南、NumPy 开发者指南、构建和扩展文档、NumPy 参考、关于 NumPy、报告 bug 以及所有其他与开发相关的页面。
  • 增加了关于何时使用 NumPy,何时使用 XND,Dask 数组 Python 库的内容,提供了类似的 API。
  • 保存 Python API 文档。

布兰登·大卫

Brandon David 因其项目“改进 scipy.stats 的文档”而入选。Brandon 计划填充缺失的函数,并添加示例和内部链接。他的目标是消除歧义,解决 GitHub 上的问题。

克里斯蒂娜·李

克里斯蒂娜·李因她的提案“科学文档:设计、可用性和内容”而被选中她是最近加入的,我期待着很快与你分享她的作品!

Harivallabha Rangarajan

Harivallabha Rangarajan 计划以任何可能的方式为文档做出贡献,并补充为文档季选择的作者的工作。他对为 scipy.stats 模块编写端到端教程特别感兴趣。他写道,“拥有更全面的教程将有助于用户更好地了解可用方法在管道中的使用方式和位置。”

欢迎来到博士季!!!

参与 NumPy 和 SciPy 的内部工作是令人难以置信的。到目前为止,我们一直在参加团队会议,了解核心成员,学习工作流程。我迫不及待地想让你们了解我们项目的进展。

Photo by Pineapple Supply Co. from Pexels

参与进来!

既然您已经了解了写作方面的主要参与者,那么不要害怕联系我们,让我们知道您是否想在官方文档中看到相关信息!谁知道呢,我们也许能给你你想看的东西。

如果你对加入开源组织的想法感兴趣,那就去那里开始分享吧!不要等待邀请。现在就开始投稿吧!每个人都有责任让科技世界变得更加精彩。

如果您有兴趣为开源组织做贡献,但不知道如何开始使用 GitHub,您可能想看看这篇文章:

[## Git 和 GitHub 入门:完全初学者指南

Git 和 GitHub 基础知识,供好奇和完全困惑的人使用(加上最简单的方法来为您的第一次公开…

towardsdatascience.com](/getting-started-with-git-and-github-6fcd0f2d4ac6)

感谢阅读!和往常一样,如果你对这些信息做了什么很酷的事情,请在下面的评论中让所有人都知道,或者联系 LinkedIn @annebonnerdata !

微调后的 BERT 模型关注什么?

原文:https://towardsdatascience.com/what-does-a-fine-tuned-bert-model-look-at-2eb39b6868dd?source=collection_archive---------11-----------------------

试图理解通过微调 BERT 模型学习的特征和模式

Photo by Katarzyna Pe on Unsplash

注:此内容是我在 2019 年 Analytics vid hya data hack 峰会上的讲话的一部分。

最近有很多关于 NLP 的讨论,特别是在迁移学习技术的进步和像 transformers 这样的架构出现之后。作为一个来自机器学习应用领域的人,我觉得不仅在许多基准测试中拥有可以超越最先进结果的模型很重要,拥有可信任、可理解而不是完全黑盒子的模型也很重要。

这篇文章试图理解 BERT 在特定任务训练中的学习。让我们从注意力是如何在一个转换器中实现的,以及如何利用它来理解这个模型开始(如果你已经知道了,请随意跳过这一部分)。

立正!立正!

变压器使用自我关注在每一层对其输入序列的表示进行编码。有了自我注意,输入序列中的所有单词都有助于当前标记的表示(编码)。

让我们来看看这个来自贾勒马的博客的例子(我强烈推荐阅读他的博客来更深入地了解变形金刚)。这里你可以看到单词“思考”(Z1)的表示是由句子中其他单词(在本例中是“机器”)的贡献形成的。每个单词对当前单词的贡献强度由注意力分数(Softmax 分数)决定。它类似于每个单词给出其自身的一部分,以形成当前单词的完整表示。

Source: http://jalammar.github.io/illustrated-transformer/

强度可以被推断为句子中的单词与当前单词的语义关联。例如,单词“它”在下面变形金刚中的注意力层的可视化中,具有来自单词“动物”的更高的贡献。这可以被推断为单词“它”的共指解析。这种行为为变形金刚提供了上下文表示/编码。

Inferring association between tokens using attention. source: http://jalammar.github.io/illustrated-transformer/

这些贡献强度(注意力分数)可以用来理解标记之间的关联,从而也可以用来理解变形金刚的学习。这正是我们在这篇文章中要尝试的。我们将尝试理解由转换器学习的特定于任务的特性。

特定于任务的功能:

报纸——伯特在看什么?今年早些时候发表的 (Clark et al .,2019)讨论了通过 BERT 模型自学的各种语言和共指模式。说明了语法敏感行为是如何从自我监督训练中产生的。这让我很好奇,并想在对一项任务进行微调后,尝试对伯特学习的特定任务特征进行类似的研究。

Example of Aspect based sentiment analysis — Source: https://medium.com/seek-blog/your-guide-to-sentiment-analysis-344d43d225a7

手头的任务:

我们将在这里使用的微调任务是一个基于方面的情感分析任务,设计为一个问题回答/多类分类问题。这种方法受到了论文 T5 的启发(孙等,2019)。通过这种将情感数据集转换为问答对的方法(如下所示),作者能够在 SEMEVAL 数据集上获得最先进的结果。

Aspect-based sentiment analysis as QA — https://arxiv.org/pdf/1903.09588v1.pdf

我使用 huggingface 的 transformers 库在 SEMEVAL 2014 数据集上微调了一个基于 BERT-base 的无案例模型,并使用 bertviz 可视化了注意力地图。

特定任务的学习:

在这里,我列出了一些有趣的模式,这些模式是我通过探索经过微调的 BERT 模型的注意层而观察到的,

  1. 方面头—方面词理解 :

我注意到,标题 9-8 主要关注评论中与方面相关的词,这些词对应于问题中的方面(下图中的词“服务”从词“服务员”获得了非常高的关注度)。在大多数情况下,所讨论的体词(左侧)在评论中具有来自体词(右侧)的更高贡献。所以这可以被认为是一个方面头。

。体貌-情感中心词-体貌词及相关情感词理解:

在这里,我们可以看到标题 9-0 的例子主要集中在与问题相关的方面词及其相应的情感词上。

3。短语级关注方面和情绪:

我还观察到,有些人在评论中关注的是谈论问题相关方面的完整短语。

4。⑩对反面:

令人惊讶的是,第 10-3 题主要关注的是另一个方面以及问题中没有的相关词汇。这里我们可以看到,当所讨论的方面是“服务”时,head 关注与“食物”相关的词,反之亦然。

5。审查中感兴趣方面的缺失—无操作:T3

当评审中没有提到某个方面时。头部关注[SEP] token。作为指示特征缺失(No-Op)的方式,被指定提取缺失特征的头部集中在[SEP]标记上。这个观察结果与论文的发现一致——伯特看什么?(克拉克等,2019)。

进一步的步骤:

  1. 尽管我们到目前为止所看到的头部在大多数情况下都注意到了特定的特征,但也有头部没有注意到那些预期特征的例子。因此,对每个头部及其处理假设特征的能力进行更正式的研究(通过测量单个头部的准确性,类似于 Clark 等人,2019 年)将非常有趣。

代码:

  1. 特定任务的学习—https://colab . research . Google . com/drive/1 P4 HW HSO-bv 5 VW 8 pkdsqperet 507 kglr 3
  2. 语言学和句法学习—复制 Clark 等人的结果 2019—https://colab . research . Google . com/drive/1z5W-jgtybffbiwzbio 73 z 0 oiwtefzjyo
  3. 我在 https://github.com/infinitylogesh/Interpretable-NLP-Talk DHS 2019 的演讲幻灯片—

参考文献:

  1. 凯文·克拉克,乌尔瓦希·汉德尔瓦尔,奥默·利维和克里斯托弗·d·曼宁,伯特在看什么?伯特注意力分析 (2019)。
  2. 图示变压器
  3. 拥抱脸的变形金刚库
  4. 伯特维兹。

2025 年首席数据科学家是什么样子的?

原文:https://towardsdatascience.com/what-does-a-principal-data-scientist-look-like-in-2025-545a571ec89f?source=collection_archive---------16-----------------------

在数据科学领域,这的确是一个激动人心的时刻!尤其是机器学习的魔力。为什么它如此令人兴奋,以至于吸引了数百万高智商、受过良好训练的未来专业人士。因此,我认为我们应该反思数据科学的未来。以下是我的预测…

现在是 2025 年,大公司中最令人垂涎的职业之一是首席数据科学家(PDS)。从标题上应该很清楚,这是一个精英角色。2025 年,一些创新公司甚至开始使用“高级数据经理”的头衔来吸引合适的候选人。

PDS 肩负着利用其在人工智能领域的优势来解决科技公司面临的最困难的人工智能问题的使命。例如,社交媒体公司仍在寻找完美的自主内容调节技术。只有 PDS 能帮助他们。

PDS 因其高级培训而特别适合解决此类问题。例如,推进评论调节技术发展的 PDS 每个人都完成了数字人类学沟通和 ML 应用的博士学位。

在他们的培训中,他们每个人都接受了为期五天的面对面讲座,内容涉及复杂的主题,如模因质量,以及某个评论是否被视为仇恨,或者是否只是讽刺。此外,在他们训练营的第二周,他们每个人都要完成一个独立的 ML 研究项目,并写一篇三段的论文。最后一天,班里的每个人都可以进行论文答辩,并拿到博士证书。

2019 年,我们可能会很难看到一个人如何在一周内完成这样一个先进的 ML 项目,尽管之前没有任何经验。ML 不还是硬的吗?嗯,当然,还是很难!这就是我们需要 PDS 的原因。他们肯定是 ML 领域的专家。他们每个人都读过谷歌云平台(GCP)提供的 80 页的机器学习即服务(MLaaS)手册。(不要被这本长书吓倒,这只是一本绘本。或者,有人可能会说,一个幻灯片甲板。)

因此,每个 PDS 都掌握了这项技术,因此知道如何点击 ML 向导—总是接受默认设置—最后,点击大的“运行机器学习!!!"按钮。(是的,谷歌添加感叹号是为了回应铺天盖地的客户反馈。)

但他们在 ML 方面的专业知识不足以解决如此具有挑战性的人工智能问题。因为每个 PDS 都知道,ML 应用于准备不充分的数据是没有用的。因此,PDS 也需要在他们的问题领域有深厚的专业知识,以便适当地准备他们的数据。他们的专业研究生课程相应地训练他们。

此外,PDS 是利用数据显微镜的专家。这些都是高级技术,允许他们的高技术用户探索数据结构和注释数据元素。例如,擅长评论审核的 PDS 知道如何通过点击其数据显微镜中的适当选项卡来发现标记的评论。然后,他们运用自己的专业判断,用正确的标签标注个人评论。大约一周后,他们已经准备了足够的数据(平均每天 2000 条评论),开始应用最先进的 ML 方法。2025 年,在 GCP 上运行 MLaaS 平均需要 4 分钟,费用为 7.21 美元。

一个刚毕业的 PDS 博士可能认为这个项目到此为止了。但是任何老手都知道,没有一个 ML 解决方案在第一次尝试时是完美的。相反,现实世界的数据科学是一个迭代循环,我们通过用户反馈不断改进方法。人们可能会称之为“有机强化学习”,平台用户通过竞争 ML 预测的标签,让 PDS 知道人工智能方法目前在哪里失败了。

为了提高 ML 性能,一些初级 PDS 可能会尝试使用 GCP 的 MLaaS 设置——认为他们可以比 Google 做得更好——但他们很快发现这是徒劳的。因为我们的上帝,谷歌,在 ML 领域是无所不能的。相反,问题总是准备数据不足。回到显微镜前!

记住,不要点击“运行机器学习!!!"每周扣一次以上;这花了我们很多钱。

正如你所想象的,到 2025 年,项目总监将是薪酬丰厚的专业人士。他们平均每小时 18 美元,顶级承包商每小时可以赚 32 美元以上。这些顶级专业人士的主要特点是他们在识别儿童色情制品等令人灵魂出窍的领域的情感坚韧。因此,赚大钱。像他们之前的牙医一样,这些专业人士表现出统计学意义上的更高的抑郁率。可惜他们不懂统计学。

请关注第二部分,在那里我们将考虑 2025 年如何协调大型 PDS 团队合作解决大规模人工智能问题。剧透:协调和管理 PDS 是一项如此糟糕的工作,只有计算机愿意去做。

关于机器学习作为一种服务对数据科学领域的影响的更严肃的论述,请参见“ ”我们作为数据科学家迈向更高抽象层次的激动人心的旅程 。”

“生产化”数据科学意味着什么?

原文:https://towardsdatascience.com/what-does-it-mean-to-productionize-data-science-82e2e78f044c?source=collection_archive---------11-----------------------

DS 生产化

如果我们把令人敬畏的技术投入到一个草率的系统中,技术不会做任何事情,只会让我们在失败时看起来很性感。

Fonthill Castle. It’s a neat place. You should visit.

这是关于数据科学生产的五部分系列的第一部分。当这些帖子可用时,我会用链接更新下面的列表:

  1. 数据科学的“生产化”意味着什么?
  2. 便携性
  3. 维护
  4. 刻度
  5. 信任

很容易找到企业从数据中获取价值的例子。也很容易找到可以用来利用数据的所有技术工具的例子。这些技术工具通常是人们在谈论数据科学时想到的,但我发现工具的重要性不如它们的部署方式。这些技术是一个更大的业务流程系统的一部分,所有这些都将产生业务成果。将数据科学集成到业务中可能意味着您只需输出报告,然后有人决定如何根据发现采取行动,也可能意味着更多。

这篇文章讲的更多,这通常被称为“生产化”“生产中”意味着它是从企业到客户的管道的一部分。在制造业中,如果某样东西正在生产,如果它存在于生产过程中的某个地方,就会导致实际的商品被放入商店,消费者可以购买并带回家。在数据科学中,如果某样东西在生产中,它就在将信息放在消费它的地方的路上。

好的设计不会凭空出现

我曾经和一个开发者一起工作,他说,“如果你在生产中使用它,它就被定义为生产化了。”从某种意义上来说,这的确是真的——从这种意义上来说,所有的数据科学都是产品化的,只要是以你交给老板的幻灯片的形式。我不认为这是思考这个问题的一个特别有用的方法。

生产化的核心是一个设计目标,但它通常被视为一系列的实现任务。让我来说明我的意思。这篇文章顶部的图片是宾夕法尼亚州多伊尔斯敦的丰希尔城堡。丰希尔城堡是由一位名叫亨利·默瑟的考古学家建造的,他花了大半辈子的时间来复兴一种几近消亡的摩拉维亚陶器风格。默瑟用有机材料建造了这座城堡,主要是为了展示他的瓷砖。当他决定需要一扇新窗户、一个楼梯或一个房间时,他就开始搭建,通常事先没有什么计划。下图显示了如何解决这一问题的示例:

A bedroom in Fonthill Castle.

他想要一间卧室。将这个房间改造成卧室的第一个障碍是,走廊实际上是从墙的中间进入房间的。解决方案?建一个楼梯。但是房间不是很大,也就是说楼梯真的又陡又窄。没问题:在楼梯旁边砌一堵墙,这样人就不会掉下来。但是卧室需要一个壁橱,没有空间既放壁橱又放床。同样,没问题——用壁橱盖住窗户的一半。从最宽泛的定义来看,结果就是一间卧室。

许多数据科学产品化——我甚至可以说是大部分——是 Fonthill Castle 的代码等价物。那些系统使用了好的技术,遵循了代码级别的许多最佳实践,并且是许多有能力的人努力工作的结果……充其量它们是笨拙的。在最坏的情况下,它们是业务的持续痛苦和费用来源。从技术上来说,Fonthill Castle 的那间卧室拥有卧室的所有组成部分——入口、床、壁橱等等——但人们通常更喜欢住在不难住的卧室里,而且当它们的结构方式使利用数据的过程不会限制数据必须提供的价值时,业务通常会更高效、更有利可图。系统整体设计得越好,任何一个组件的价值就越大。

这里有一个例子。我花了六个月的时间来制作这个图表:

I’ve replaced all the labels with generic terms.

当然,图表本身只花了几个小时。这张图代表的一切花了六个月。这是一个完全重新设计的系统,用于模拟 IP 地址的归属位置,以便将这些位置输入到实时投标过程中。这个系统确保如果一个客户想锁定密尔沃基的消费者,他们不会为洛杉矶的消费者付费。这是一项核心业务职能,支持我的雇主的核心价值主张之一。

图表中的小方框和线条代表了与利益相关者进行长时间对话、与多个工程团队协调、生产另外两个流程(其输出需要支持该额外流程)以及开发五个独立算法的结果。所有这些成就都是独立的,没有我来描绘它们是如何组合在一起的。然而,使用这个图表,我们的工程团队能够非常快速地编写部署整个过程的代码。

更重要的是,当新的需求在最初的实现结束后出现时,我们的工程师能够相对容易地将它们合并到更大的系统中,因为他们有一个地图,显示了新需求可以或需要插入的所有位置。上面的图表实际上并不代表我们公司现有的流程,因为将该图表投入生产帮助我们认识到了我们需要解决的许多其他约束。但是基础设计使这些限制更容易解决,并帮助我们避免了许多笨拙的解决方法。

生产化包括对系统的前期投资,这些系统使我们选择使用的任何数据流程的部署、维护和采用变得平稳。生产所必需的设计工作几乎总是会延长产品上市的时间,正因为如此,它常常被忽视。但是延迟发射比失误发射不那么令人沮丧和昂贵。花时间好好设计系统是值得的。

飞机对出租车(或线对圈)

这就提出了一个问题,对于设计良好的数据科学能力来说,这意味着什么。分析产品的一个常见心理模型是我称之为航空公司的类比。航空航班是离散的事件:你通过指定你想去的某些地方和你想在去那里的路上拥有的某些东西来包机,然后你必须实际上在飞机上飞行,然后在下飞机后你可以回头来决定飞行如何进行。

在我看来,航线模型是一个不太理想的设计选择。这使得人们很容易将太多的注意力投入到数据科学的飞行中部分的自动化上,结果是企业最终手动完成了太多的飞行前和飞行后工作。例如,飞行前的工作主要是询问客户他们想要完成什么,以及如何优先考虑各种因素。数据科学家构建数据产品,将这些人工决策转化为机器学习算法等自动化工具可以理解的东西。同样,算法完成任务后,输出通常是报告或演示文稿或仪表板,发送给利益相关者,表面上是为了通知业务决策,可能是为了激励未来的分析工作。当我们将数据科学项目视为一次飞行时,很容易从[人类]->[计算机]->[人类]的角度考虑问题,从而错过许多自动化机会。

在我看来,只要我们将数据工作视为一系列飞行,我们就已经把钱留在桌子上了。除了当我们依赖大量手动决策时引入的人为错误之外,对飞行中工作自动化的关注限制了我们的优化能力。例如,如果我们不太擅长瞄准预期的结果,比如说,客户保留或销售,这可能是因为我们的预测算法没有发挥出应有的作用,但也可能意味着我们的分析范围是错误的,或者我们没有利用分析本身产生的数据。完全优化的数据功能是一种持续监控性能并从初始设置标准动态迭代向前的功能。

换句话说,我们需要我们的数据工作表现得更像出租车,而不像飞机。在这两种情况下,我们都必须决定目的地,但我们应该能够在中途修改目的地,或者增加意想不到的中途停留,或者在途中搭载新乘客,或者因为获得新信息而选择与原计划完全不同的路线。后续行程应自动从之前行程的目的地开始。

完全生产化的数据科学是一个圆,而不是一条线。

如果我们这样做,那么我们就只有两项任务——操作和校准——而不是指定、执行和评估分析,两项任务互为补充。测量的目的不应该是写出一份报告,而是在分析仍在进行时调整分析的初始参数(该报告可能是校准工作的副作用)。初始参数应被视为需要修改的先验知识,而不是需要满足的要求。这就是多臂土匪算法背后的直觉。

数据科学生产化将人类移出了循环,但这并不意味着人类不发挥关键作用。如果我们专注于自动化数据周期的每个部分,我们实际上为人类创造了更多与数据进行有意义交互的机会,并减少了我们的自动化导致意外和不良后果的机会。当人类可以花更少的时间来实现自动化时,他们可以花更多的时间来监控和评论它。

在数据科学的飞机模型下,我们必须寻找独特的机会将数据系统与业务联系起来。数据系统的目标、要求、约束和其他输入类似于目的地地图、航班时刻表和机场的座位、航站楼和登机口的可用性,以及允许某人预订航班的其他信息,而数据系统本身就是实际的飞机编队。如果我们能让我们的系统在进行过程中反复自我评估和重新配置,那么我们就不需要找出联系:数据系统就是业务

重申一下:把数据科学工作想成【业务需求】-->【算法】-->【结果】是完全正常合理的。最好把它想成【业务需求】-->【算法】-->【修正需求】-->【修正算法】-->【修正需求】,以此类推。主要的设计挑战不是选择最合适的算法或构造该算法最有效的实现。这是为了确保分析解决方案的自动、连续修订。这是为了确保主动发现原始解决方案错过的机会。

制度比工具更重要

不是每个使用数据科学工具的人都会发现这种自动化的持续改进是可取的,甚至是可能的。没关系。并不是所有的数据科学都需要产品化。但是,完全生产化提高了模型性能,降低了维护成本,降低了风险(包括财务和道德风险),而且,也许最重要的是,将好的分析结果被忽略或浪费的可能性降到了最低。

投资数据科学的决策通常以目标的形式进行阐述,作为一家企业,有些事情是您想要完成的,而数据科学被视为实现这些结果的一种方式。但是,如果我们只是把非常棒的技术投入到一个低效或适得其反的系统中,技术只会让我们在失败时看起来更性感。成功的主要决定因素是我们用来使数据成为我们业务一部分的系统的设计。这就是生产化。

巴塞罗那的公寓如何才能成为“幸存者”?

原文:https://towardsdatascience.com/what-does-it-take-for-an-apartment-in-barcelona-to-be-a-survivor-10e0ad337672?source=collection_archive---------29-----------------------

使用生存分析发现影响西班牙巴塞罗那一个受欢迎的短期租赁平台上的两居室公寓寿命的因素。

有人说巴塞罗那的房地产市场存在泡沫。这包括商业和住宅物业。

住宅物业市场有两个主要部分,迎合不同的观众。这些是短期租赁(一个晚上到 11 个月)和长期租赁(一年以上)。

Airbnb 是最知名的短租平台之一。几乎每个和我交谈过的城市居民都有关于 Airbnb 上市公寓的看法和/或故事。鉴于关于这个平台和上面列出的公寓有这么多说法,一个更具分析性的调查是有必要的。

在深入探讨这个话题之前,有必要对长期住宅房地产市场多了解一点。价格始终是衡量需求的一个很好的指标,因此,了解这些类型的房产在最近几年的平均租金价格可能会有所帮助。

什么东西上去了,就一定会下来?

这部分调查的第一站是开放数据 BCN 。幸运的是,该网站提供了过去 4 年来全市每个郊区(或街区)的平均租金信息。这些数据通过使用“每平方米价格”指标进行了标准化。

数据以 CSV 文件形式提供,每年一个文件(2014–2018)。这些文件是手动下载的,因为该网站有一个动态链接(这意味着它们不能用 Python 脚本抓取)。

下载后,每个 CSV 都被列在一个数据帧中——在导入与这个项目相关的库之后。

#Libraries
from functools import reduce
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns#Load CSV files into dataframe
file_name = ‘{}_lloguer_preu_trim.csv’
df = pd.concat([pd.read_csv(file_name.format(i)) for i in range(2014, 2019)])

在探索性数据分析中有许多步骤,但这都是从将数据帧标题从加泰罗尼亚语(加泰罗尼亚语,巴塞罗那位于其中)重命名为英语开始的。下一步识别空值,这些值被丢弃,因为不能使用其他方法插入/更新/估计。该流程还发现“测量”列中提供了两种不同的指标。出于此分析的目的,确定了每平方米的租赁价格,并用于过滤和创建新的数据框架。

df_sqm = df.loc[(df[‘Measure’] == ‘Lloguer mitjà per superfície (Euros/m2 mes)’) ]

然后将干净的数据帧导出到 CSV,以便在 Tableau 中制作图表。在导入时,很明显 X 轴所需的季度(如年份和季度)维度有问题。通过使用以下公式创建新的计算字段,解决了此问题:

MAKEDATE([Year], 
IF [Qtr] = 1 THEN 2
ELSEIF [Qtr] = 2 THEN 5
ELSEIF [Qtr] = 3 THEN 8
ELSEIF [Qtr] = 4 THEN 11
END ,1)

既然有了合适的时间轴,就有可能绘制出每个地区的租金价格图。下图显示了 2014 年至 2018 年各区的平均租金价格(每平方米欧元)。

Annual Average Rental Prices (per SqM) for All Districts in Barcelona 2014–2018

相关性高得惊人——然而,鉴于唯一的变量是时间和价格,不可能得出任何结论,因为任何城市的租赁市场都受其他因素的影响。

“挂帽子的地方”

现在是时候把我们的注意力转向短期租赁市场了——也就是 Airbnb 上列出的房产。幸运的是,有一个网站定期抓取 Airbnb 房源,并把数据放到网上。 Insideairbnb 有 39 个列表抓取文件,时间跨度远至 2015 年 4 月。这些数据文件非常全面——幸运的是,它们以一致的命名惯例发布,这意味着它们可以使用 W Get 自动下载,只需在网上搜索一下就能获得准确的名称。

Path for file download consistent with date scraped, as listed

感兴趣的文件的 URL 被添加到一个名为ibnbdts(YYYY-MM-DD 格式)的列表中,删除了重复的内容。然后一次下载一个感兴趣的文件,解压缩并作为数据帧作为值添加到字典中。相应的键是来自 ibnbdts 列表的元素。

#url = ‘[http://data.insideairbnb.com/spain/catalonia/barcelona/{}/visualisations/listings.csv'](http://data.insideairbnb.com/spain/catalonia/barcelona/{}/visualisations/listings.csv')
#folder = ‘./InsideBNBdetailedListing/{}/’
#[wget.download(url.format(i), folder.format(i)) for i in ibnbdts]

完成后,研究形状并确定列标题。考虑到列的数量,我们决定创建一个较小的数据框架,只包含感兴趣的列。

df_filtered = df_ibnb[[
 ‘id’,
 ‘last_scraped’,
 ‘neighbourhood_cleansed’,
 ‘neighbourhood_group_cleansed’,
 ‘latitude’,
 ‘longitude’,
 ‘property_type’,
 ‘room_type’,
 ‘bathrooms’,
 ‘bedrooms’,
 ‘beds’,
 ‘price’,
 ‘import_dt’]]

采取了以下其他步骤来过滤和清理数据:

  1. 识别不同的房间类型。只有“整个住宅/公寓”房产是感兴趣的,其他的都被过滤掉了。
  2. 选择并过滤感兴趣的属性类型,在本例中为“公寓”、“阁楼”、“公寓”。
  3. 通过 map 使用 lambda 函数将 price (per night)列(当前是一个字符串)转换为浮点数。
  4. 创建箱线图以查看卧室和浴室数量的分布。

Box & Whisker to See Spread of Number of Bedrooms and Bathrooms

5.过滤掉既没有两间卧室,也没有 1.5-2 间浴室的房产。

6.从该过滤的数据帧中移除重复项(在第一次按 property_id (id)升序和在平台上的最后出现日期(作为字符串)降序排序(‘import _ dt’)之前)。

经过滤的数据帧(在如上所述的去重之前)用于创建新的细长数据帧(df_slim),其将仅包含平台上的 property_id (id)和最后出现日期(作为字符串)(‘import _ dt’),这些分别按升序和降序排序。

然后,使用自定义函数将字符串导入日期转换为日期时间字段,并应用。

def strtodate(row):
 ‘’’
 Input: String in format YYYY-MM-DD
 Output: Correspdining Datetime

 The purpose of this function is to convert a string to datetime, so that timedeltas can be calculated on them.
 ‘’’
 return datetime.strptime(row[‘import_dt’], ‘%Y-%m-%d’)df_slim_stg[‘scrape_dt’] = df_slim_stg.apply(strtodate, axis = 1)

然后使用 group by 创建一个更小的子集,每个属性(id)只出现一次,它们出现的最小和最大日期是两个单独的列。

df_slim = df_slim_stg.groupby(‘id’).agg({‘scrape_dt’ : [np.min, np.max]})

然后创建一个新的列,以确定该属性在平台上是否仍然有效。

def mostrecent(row):
 ‘’’
 Input: Date
 Output: 1 if date matches 17 September 2019 or 0 if it does not

 This will help to determine if the property is still active on the platform.
 ‘’’
 if row == datetime.strptime(‘2019–09–17’, ‘%Y-%m-%d’):
 return 1
 else:
 return 0df_slim[‘stillactive’] = df_slim[‘scrape_dt’][‘amax’].apply(mostrecent)

然后使用自定义函数和 apply 计算该物业在平台上列出的天数。

def daysonline(row):
 ‘’’
 Input: First Date and Last Dates that the property was seen on the platform
 Output: Number of days

 This will help to determine how long the property is/ was listed on the platform for.
 ‘’’
 return row[‘scrape_dt’][‘amax’] — row[‘scrape_dt’][‘amin’]df_slim[‘days_online’] = df_slim.apply(daysonline, axis = 1)

然后,在删除列(id 加倍)和重命名之前,合并纤细的和过滤的数据帧。

接下来,干净的数据框架需要将价格(作为浮动值)归一化,以便可以使用平均值的+/-1.5 标准偏差来过滤异常值。

#Normalize the new ‘priceUSD’ column for analysis
# Create variable x and pass in the float verion of column ‘priceUSD’
x = df_final[[‘priceUSD’]].values.astype(float)# Create a minimum and maximum processor object
min_max_scaler = preprocessing.MinMaxScaler()# Create an object to transform the data to fit minmax processor
x_scaled = min_max_scaler.fit_transform(x)# Append the normalised values within a new column in the dataframe.
df_final[‘priceNORM’] = pd.DataFrame(x_scaled)#First find values that are UNDER 1.5 Standard Deviations of the mean
indexNames = df_final[ df_final[‘priceNORM’] < (np.mean(df_final.priceNORM, axis=0) — ( 1.5 * np.std(df_final.priceNORM, axis=0)) ) ].index
df_final.drop(indexNames , inplace=True)#Second find values that are ABOVE 1.5 Standard Deviations of the mean
indexNames = df_final[ df_final[‘priceNORM’] > (np.mean(df_final.priceNORM, axis=0) + ( 1.5 * np.std(df_final.priceNORM, axis=0)) ) ].index
df_final.drop(indexNames , inplace=True)

一个新的方框图,显示剩余的价格数据。

fig, ax = plt.subplots(1,2, figsize = (15, 10)) #columns and rows, number of axes, figure size 
sns.boxplot(y = df_final.priceUSD, ax = ax[0])

现在价格正常化了,为了便于解释生存曲线,它们将被组合在一起。

 df_final[‘price_band’]=pd.qcut(df_final[‘priceUSD’],q=5, labels = [‘Very Low’,’Low’,’Moderate’,’High’,’Very High’])df_final['price_band']**=**pd.qcut(df_final['priceUSD'],q**=**5, labels **=** ['Very Low','Low','Moderate','High','Very High'])

将日期时间字段转换为整数,以便可以执行计算。

最近计算的“在线天数”值需要转换为月数。

def days2month(row):
 ‘’’
 Input: Numerical value which is assumed to be days
 Output: Corresponding numner of months

 The int/ float input (days) is divided by 365 then multiplied by 12.
 ‘’’
 return ((row[‘days’]/365)*12)df_final[‘months’] = df_final.apply(days2month, axis = 1)

然后将生成的数据帧导出到 CSV 格式,以便在另一个 Jupyter 笔记本文件中使用生存分析进行分析。

生存分析

生存分析需要定义一个自定义函数。

def survival(data, group_field, time_field, event_field):
 kmf = KaplanMeierFitter()
 results = []
 for i in data[group_field].unique():
 group = data[data[group_field]==i]
 T = group[time_field]
 E = group[event_field]
 kmf.fit(T, E, label=str(i))
 results.append(kmf.survival_function_)
 survival = pd.concat(results, axis=1)
 front_fill = survival.fillna(method=’ffill’)
 back_fill = survival.fillna(method=’bfill’)
 smoothed = (front_fill + back_fill) / 2
 return smoothed

生存分析的结果提供了一些有趣的图表。

创建了三个数据集:
1 .Airbnb 上曾经列出的 2 卧室、1.5-2 浴室公寓的总人口(2015 年 4 月-2019 年 9 月)。
2。1 的子集(如上),过滤为仅包含 ei example
3 中的公寓。1 的子集(如上),过滤为仅包含 Gràcia 的公寓

随后生成了以下图形(绘图)。

Impact of Price Band on Survival Rate

Impact of Property Type on Survival Rate

Differing Survival Rates Amongst Properties in Eixample

Differing Survival Rates Amongst Properties in Gràcia

Differing Survival Rates Amongst Districts in Barcelona

总而言之,巴塞罗那的两居室公寓中,价格适中的公寓在 Airbnb 平台上停留的时间最长。这意味着这些公寓将不会出现在长期租赁市场上;因此,这部分市场的供应减少,这似乎(至少部分)导致了该市长期租赁价格的不断上涨。

为你的应用程序构建一个聊天机器人需要什么?

原文:https://towardsdatascience.com/what-does-it-take-to-build-a-chat-bot-for-your-application-f59c2ed074e5?source=collection_archive---------14-----------------------

利用 Kore.ai 机器人平台构建可大规模工作的智能聊天机器人。

你可能已经花了数小时来构建具有最佳应用内用户体验的应用,但当涉及到构建市场上最新、最热门的功能时,你就做不到了——一个可以与消息应用、电子邮件、语音助手、IVR 和许多其他渠道集成的对话界面。

现在怎么办?,你应该开始研究建立对话代理吗?你应该思考什么?…..

实际上很多。举几个例子来说,你必须考虑很多——让我们考虑你的应用程序可以为“外卖”订购一个比萨饼并检查订单的状态。

  1. (意图检测)如何弄清楚用户对 bot 说了什么。也就是说,如何理解用户是想要下订单、检查订单状态还是其他什么(这在这个玩具例子中听起来很简单,但是当你的应用程序可以执行几十个动作时就变得复杂了)
  2. (实体检测)如何提取对应用程序执行操作所需的信息。例如,在用户话语“我想点一份比萨饼,边上有鸡肉、洋葱配料和两杯可乐”中,外皮是什么?,浇头是什么?,有哪些方面?等等
  3. (实体验证)如何验证用户提供的信息。例如:日期、货币、数字、项目等
  4. 如何在执行操作时处理来自用户的中断。例如,在完成“下订单”的对话之前,如果用户询问“我的 Id 为 ABCD 的订单状态如何”
  5. (渠道整合)我如何整合这个机器人与脸书或 Alexa 或谷歌助理等?
  6. 你如何分析与用户失败的对话?
  7. 你如何认证用户?
  8. 如何有条件地控制对话?。例如,如果用户提供了无效的浇头数量,如何通知他并要求不同的首选浇头?
  9. 我如何让它适用于多种语言?

如此等等…

在我们继续下去之前,你可能想让我停下来,指出一些平台,如 Luis、Dialog Flow、IBM Watson 等。当然,他们可以帮助你解决第一个问题,解决一点第二个问题,解决有限的第三个问题,解决很少的第五个问题,但是请记住,一个好的聊天机器人还需要满足很多要求。你可以有一个很棒的团队来构建机器人的其余部分,代价是什么?…以大量时间为代价。理想情况下,您会希望在不影响质量和功能的情况下,尽可能缩短“上市”时间。这需要一个已经解决了所有问题的工具——Kore . aibots 平台,这是一个对话平台,使您能够为数百个用例构建和管理对话机器人。

和其他平台有什么不同?

就像其他平台一样,Kore.ai 也解决了第一、第二和第三个问题。还有上面提到的每一点,还有更多。该平台提供了构建和管理机器人所需的完整开发工具包,而不必为机器人构建单独的后端服务。更容易给你看,让我们跳进平台,建立玩具机器人。如果您需要更多信息或帮助,请参考位于https://developer . Kore . ai/docs/bots/chatbot-overview/chatbot-overview/的文档

披萨店机器人

比方说,你有一家比萨店,人们可以点外卖一个比萨,可以选择饼皮、多达 3 种配料和一些配菜。您构建了一个人们可以在线订购的应用程序(假设您有这个程序)。现在让我们为这个比萨饼店建立一个机器人,在那里人们可以订购一个比萨饼带走,选择外壳,浇头和侧面,它还应该能够在被询问时检查订单的状态。

首先在 https://bots.kore.ai 注册/登录。点击创建一个机器人,并给它一个名字,选择语言(现在让我们用英语),让机器人类型是标准的(检查每个类型的意思在后面的文档)。现在,你将登陆这样一个机器人详细信息页面

Bot details page

浏览这个页面,然后在左边的菜单中进入机器人任务。在 bot 任务页面中,您将看到几个可以创建的 bot 任务类型

Types of Bot Tasks

对于我们的玩具机器人,我们将集中于对话任务,这些任务将用户和机器人之间的完整对话流表示为有向图。这有助于您设计涉及条件动作的复杂对话,例如,在“订购比萨饼”任务中,比萨饼上允许的最大浇头数是 3,您可以检查这一点,并通知用户重新选择,而无需您的后端应用程序参与。

现在让我们创建两个对话任务:

  1. “订购比萨饼”,允许用户订购比萨饼的外壳,浇头和方面的选择。
  2. “查看订单状态”,可以查看已下订单的状态。

让我们先看看完成的“订购比萨饼”对话框,然后看看它是如何构建的(我将提供详细文档的链接,对于玩具示例可以忽略这些链接,但以后一定要查看它们)

Order Pizza Dialog

看到这个,你的第一个想法应该是“图中的节点是什么?”。嗯,这些被称为对话组件,Kore.ai 平台提供了几种类型的对话组件,让我们简单看看它们是什么:

  • 意图节点(用户意图)——与用户意图相关联的节点,即“订购比萨饼”是一个意图。当 Kore NLP 引擎识别出一个意图时,它对应的意图节点被触发(通常是一个对话任务的根节点,我说“通常”是因为它也可以作为一个非根节点存在,我们将在后面的文章中讨论)。因此,如果用户意图是“订购比萨饼”,则触发“订购比萨饼”对话任务中的“订购比萨饼”意图节点。你可以在https://developer . Kore . ai/docs/bots/bot-builder-tool/dialog-task/working-with-the-user-intent-dialog-node/了解更多信息

Intent Node

  • 实体节点 —向用户请求实体(如果用户尚未提供)的节点,例如:日期、时间、号码、电话号码等。除了系统自动验证的系统实体类型之外,您还可以选择一些非常有用的自定义实体类型,如 string、custom/RegEx、Composite、“枚举值列表”和“查找值列表”。你可以在https://developer . Kore . ai/docs/bots/bot-builder-tool/dialog-task/working-with-the-entity-node/了解更多信息

Entity Node

Entity Node Properties

  • 确认节点 —该节点是实体节点的特例,被配置为明确提示用户确认并识别用户的是/否意图。您可以在https://developer . Kore . ai/docs/bots/bot-builder-tool/dialog-task/working-with-the-message-confirmation-nodes/了解更多信息
  • 消息节点 —顾名思义,该节点向用户传递消息。需要注意的一点是,对于向用户发送消息的所有节点(实体、确认和消息),您可以添加机器人可以发送给用户的多个备选消息,还可以在特定通道上配置特定消息,例如,对于消息节点“orderplaced ”,您可以配置机器人发送“您的订单已下”或“全部完成,您的订单已下”。你可以在 10 分钟内到我们店里取你点的菜。”对于在脸书频道上聊天的用户和其他频道的不同消息。您可以在https://developer . Kore . ai/docs/bots/bot-builder-tool/dialog-task/working-with-the-message-confirmation-nodes/了解更多信息

Message node

  • 脚本节点 —该节点允许用户编写 JavaScript 来处理到目前为止收到的数据,并更新机器人上下文(上下文记忆)。例如,在我们的玩具机器人中,我们使用这个节点来检查用户是否要求 3 个以上的浇头,并决定我们是否再次要求浇头。

Links between toppings and Validate Toppings count script

Script node Properties

  • 服务节点 —通过这个节点,你可以点击应用服务器的端点来执行操作。获得下订单所需的数据后,对应用程序进行 API 调用来下订单。你可以在https://developer . Kore . ai/docs/bots/bot-builder-tool/dialog-task/working-with-the-service-node/了解更多信息
  • Web hook Node —你可以在https://developer . Kore . ai/docs/bots/bot-builder-tool/dialog-task/working-with-the-Web-hook-Node/上读到这个
  • 对话任务 —这允许您调用/切换到不同的对话任务,并在该对话任务完成时返回。例如:在一个银行机器人中,当你转账的时候(通过设计),你可能想要“显示账户中的余额”,这本身就是一个“显示余额”对话框任务。您可以在https://developer . Kore . ai/docs/bots/bot-builder-tool/dialog-task/working-with-the-user-intent-dialog-node/了解更多信息
  • 代理转移 —顾名思义,这将聊天/呼叫转移给人工代理,您可以在https://developer . Kore . ai/docs/bots/bot-builder-tool/dialog-task/working-with-the-Agent-Transfer-node/了解更多信息

另一件你可能想知道的事情是“连接是如何定义的?”—每个节点都有连接属性,用户可以根据需要定义缺省转换和 if/else 条件。例如:从“订购比萨饼”对话框任务中的 ValidateToppingCount 脚本节点转换。

Example Transitions

等等!从对话中收集到的信息呢,“我如何访问数据?”——从“服务节点调用”的对话和响应中收集的所有数据在“上下文”Json 中可用,Ex 实体位于 JSON 路径 context.entities. 中,即,用于选择外壳(外壳实体值)的位置在 context.entities.crust 中

Sample context json

现在,回到我们的玩具机器人“订购比萨饼”的对话任务,你现在可能已经弄清楚流程了

  • 在将意图识别为“订购比萨饼”时,触发“订购比萨饼”对话任务中的“订购比萨饼”意图节点。
  • 转换到“外壳”实体节点,并要求用户选择外壳,如果还没有提到。这是一个单项“值列表(枚举)”实体,它请求开发人员(您)定义的枚举列表项
  • 转换到“浇头”实体节点,并要求用户“选择浇头”,如果还没有提到的话。这是一个多项“值列表(枚举)”实体,它从列表中查找更多的多项。
  • 转换到 ValidateToppingCount 脚本节点,在该节点中验证用户询问的浇头数量。
  • 如果浇头计数大于 3,则忽略选定的浇头,并转换到“浇头”实体。
  • 如果浇头数小于或等于 3,那么转移到“sides”实体节点,在这里机器人请求边。
  • 收集完所有细节后,使用服务节点将数据发送到应用服务器,并确认订单。尽管对于这个玩具示例,我点击了虚拟端点(在与您共享之前将删除这个节点,因为它是无用的),但它总是返回状态 200。
  • 在“已下订单”消息节点中回复消息,就大功告成了。

这里有一个视频演示

Order a Pizza Dialog Run

订购披萨对话框完成了…或者没有,自然语言训练呢?所有聊天机器人平台都要求训练数据,那么 kore 呢——是的,Kore 也是这样做的,Kore.ai 的 NLP 的主题是另一天的帖子。截至目前,机器人正在利用其英语语法知识和任务名称工作。

我将删除服务节点,因为它没有用,并在最后附加 Bot 导出,您可以将它导入到您的帐户并检查它。此外,我留下了一些东西,所以你可以尝试

  1. [简单]当提供太多浇头时,让机器人显示不同的信息。这样做无需添加更多节点
  2. [HARD]“sides”实体将只接受,而不仅仅是没有编号的项目,即当我只说“coke”时,说“2 coke”将会起作用,但不会起作用。让它工作(视频中的提示)
  3. [简单]同样,在 sides 实体中,机器人不会接受否定的回答。即它将不断要求用户提供至少一种选择。让它成为可选的。(提示:查看实例属性)
  4. [MEDIUM]一个更复杂的对话框,通过添加最多 3 个节点(最好是 2 个)来订购多个披萨。提示:收集并确认。

未来的帖子里会有什么?

  1. 添加“检查订单状态”对话框。
  2. 启用通道。
  3. Kore.ai NLP 引擎一览。

数据

https://github.com/vishnukumarnekkanti/BotsData的 bot Export = Pizza store . zip

RMSE 到底是什么意思?

原文:https://towardsdatascience.com/what-does-rmse-really-mean-806b65f2e48e?source=collection_archive---------0-----------------------

均方根误差(RMSE)是衡量模型在预测定量数据时的误差的标准方法。正式定义如下:

让我们试着从数学的角度来探索为什么这个误差的度量是有意义的。忽略平方根下 n 的除法,我们首先注意到的是类似于ℝⁿ:中两个向量之间的欧几里德距离公式

这启发性地告诉我们,RMSE 可以被认为是预测值向量和观测值向量之间的某种(归一化)距离。

但是为什么我们在平方根下面除以 n 呢?如果我们保持 n(观察次数)不变,它所做的只是将欧几里德距离重新缩放一个因子√(1/n)。很难看出为什么这是正确的做法,所以让我们更深入地研究一下。

假设我们的观测值是通过给每个预测值加上随机“误差”来确定的,如下所示:

这些误差被认为是随机变量,可能具有均值为μ、标准差为σ的高斯分布,但任何其他平方可积 PDF ( 概率密度函数)分布也适用。我们想把 ŷᵢ看作一个潜在的物理量,比如在某个特定的时间点从火星到太阳的确切距离。我们观测到的 yᵢ量将是我们测量时从火星到太阳的距离,其中一些误差来自我们望远镜的误校准和大气干扰的测量噪声。

(NOT TO SCALE)

误差分布的均值μ对应于来自误校准的持续偏差,而标准差σ对应于测量噪声量。想象一下,现在我们确切地知道了误差分布的均值μ,并且想要估计标准差σ。我们可以通过一点计算看出:

这里 E […]是期望,Var(…)是方差。我们可以用第四行的e【ε】代替第三行的期望值 E[ εᵢ ]的平均值,其中ε是与每个εᵢ具有相同分布的变量,因为误差εᵢ是同分布的,因此它们的平方都具有相同的期望值。

请记住,我们假设我们已经确切地知道μ。也就是说,我们仪器中的持续偏差是已知偏差,而不是未知偏差。因此,我们不妨通过从所有原始观测值中减去μ来立即校正这种偏差。也就是说,我们不妨假设我们的误差已经以均值μ = 0 分布。将这个代入上面的等式,取两边的平方根,得到:

注意左手边看起来很熟悉!如果我们从平方根中去掉期望 E,这就是我们之前的 RMSE 公式。中心极限定理告诉我们,随着 n 变大,σᵢ(ŷᵢ—yᵢ)/n =σᵢ(εᵢ)/n 这个量的方差应该收敛到零。事实上,中心极限定理的一个更清晰的形式告诉我们,它的方差应该像 1/n 一样渐近地收敛到 0。这告诉我们,σᵢ(ŷᵢ—yᵢ)/n 是对e[σᵢ(ŷᵢ—yᵢ)/n]=σ的一个很好的估计。但是 RMSE 是我们误差分布的标准差σ的一个很好的估计量!

我们现在还应该有一个在 RMSE 平方根下除以 n 的解释:它允许我们估计典型的单次观测的误差的标准偏差σ,而不是某种“总误差”。通过除以 n,当我们从小的观测值集合移动到更大的集合时,我们保持这种误差测量一致(随着我们增加观测值的数量,它变得更加精确)。换句话说,RMSE 是回答这个问题的一个很好的方式:“我们应该期望我们的模型在下一次预测中有多远?”

总结我们的讨论,假设我们的观测数据可以分解为:

这里的随机噪声可以是我们的模型没有捕捉到的任何东西(例如,可能影响观察值的未知变量)。如果噪音很小,正如 RMSE 估计的那样,这通常意味着我们的模型擅长预测我们观察到的数据,如果 RMSE 很大,这通常意味着我们的模型无法解释我们数据背后的重要特征。

数据科学中的 RMSE:使用 RMSE 的微妙之处

在数据科学中,RMSE 有双重目的:

  • 作为训练模型的启发
  • 评估训练模型的有用性/准确性

这就提出了一个重要的问题:RMSE 的“小”意味着什么?

我们首先要注意的是,“小”取决于我们选择的单位,以及我们希望的具体应用。在建筑设计中,100 英寸是一个很大的误差,但 100 纳米不是。另一方面,100 纳米在制造冰块托盘时是一个小误差,但在制造集成电路时可能是一个大误差。

对于训练模型,我们使用什么单位并不重要,因为在训练过程中我们所关心的是有一个启发式方法来帮助我们减少每次迭代的错误。我们只关心从一步到下一步的相对误差大小,而不是误差的绝对大小。

但是,在评估数据科学中经过训练的模型的有用性/准确性时,我们确实关心单位,因为我们不仅仅是想看看我们是否比上一次做得更好:我们想知道我们的模型是否能真正帮助我们解决实际问题。这里的微妙之处在于,评估 RMSE 是否足够小,将取决于我们对给定应用的模型精度要求。这永远不会有一个数学公式,因为它依赖于人的意图(“你打算用这个模型做什么?”),风险厌恶(“如果这个模型做了一个不好的预测,会造成多大的伤害?”),等等。

除了单位之外,还有另一个考虑因素:“小”也需要相对于正在使用的模型的类型、数据点的数量以及在评估模型的准确性之前模型经历的训练历史来度量。起初,这听起来可能违反直觉,但当你想起过度装配的问题时,就不会了。

每当模型中的参数数量相对于您拥有的数据点数量较大时,就有过度拟合的风险。例如,如果我们试图预测一个实数 y 作为另一个实数 x 的函数,并且我们的观测值是(xᵢ,yᵢ)与 x₁ < x₂ < x₃ …,一个通用插值定理告诉我们,对于 i = 1,…,n,存在某个次数最多为 n+1 的多项式 f(x)=yᵢ。这意味着如果我们选择我们的模型为 n+1 次多项式, 通过调整我们模型的参数(多项式的系数),我们将能够把 RMSE 一直降到 0。 不管我们的 y 值是多少,这都是正确的。在这种情况下,RMSE 并没有真正告诉我们任何关于我们的基础模型的准确性:我们被保证能够调整参数,以获得 RMSE = 0,正如在我们现有的数据点上测量的那样,不管这两个真实量之间是否有任何关系。

但是不仅仅是当参数的数量超过数据点的数量时,我们可能会遇到问题。即使我们没有过多的参数,一般的数学原理和对我们数据的温和背景假设也能保证我们很有可能通过调整模型中的参数,使 RMSE 低于某个阈值。如果我们处于这种情况,那么 RMSE 低于这一阈值可能对我们模型的预测能力没有任何意义。

如果我们想像统计学家一样思考,我们会问的问题不是“我们训练的模型的 RMSE 小吗?”而是,“我们训练过的模型在如此这般的一组观察值上的 RMSE 随机变得如此之小的概率是多少?”

这类问题变得有点复杂(你实际上必须做统计),但希望你们都明白为什么“足够小的 RMSE”没有预先确定的阈值,因为这将使我们的生活变得简单。

你认为数据科学的未来会怎样?

原文:https://towardsdatascience.com/what-does-the-future-of-data-science-hold-for-you-7ae47861dc22?source=collection_archive---------28-----------------------

如果我可以用两个词来回答这个问题,那就是——闪亮和有前途。

介绍

看看你的周围,到处都是数据。“每天创建的数据超过 2.5 万亿字节。”在不久的将来,预计地球上每个人每秒将产生 1.7 Mb 的数据。没错,这个数据是我们产生的,但是你知道这么多数据是怎么分析出来的吗?数据科学家是这一过程的幕后推手。

世界上很多公司都在寻找数据科学家。他们收到的数据既有结构化的也有非结构化的。因此,要使用非结构化数据并从其中获得洞察力,就需要使用数据科学。组织开始意识到管理这些数据的必要性,因此对数据科学家的需求也在增加。

现实生活中的用例

现在你可能会想,这些公司可以从客户那里获得反馈,通过满足客户需求来改进他们的服务。那么,他们为什么要为此付出如此巨大的代价呢?他们这样做是因为他们与世界同行,他们已经意识到“变化是唯一不变的”。这不仅仅是分析数据,而是以一种甚至客户都没有意识到的方式来理解客户,是理解市场需求、模式和趋势。你喜欢喜剧节目,但你不会要求网飞专门为你制作。当你开始看一部喜剧时,网飞会自动向你推荐另一部你可能会喜欢的喜剧。所有这一切之所以成为可能,是因为网飞大学的数据科学及其推荐系统。 聪明!不是吗?

我们还可以在这里谈论一些不令人寒心的项目,其中使用了数据科学,科学家甚至能够在很大程度上预测未来事件。不相信我?看看这个例子:

在飓风【Fani】袭击印度奥里萨邦海岸的 13 天前,IMD(印度气象部门)有迹象表明可能会有一场大规模的风暴,他们开始为风暴的爆发做准备。

Image Source:Google

4 月 21 日,基于各种来源的数据,他们预测,条件正在导致低压区的形成。他们收集了降雨量、海面以下和海面以上的温度、风速等数据,并对其进行分析,以预测飓风的强度。

创纪录的120 万人(相当于毛里求斯的人口)在不到 48 小时内被疏散,仅仅是因为数据科学家。这是过去 20 年来袭击印度的最强飓风之一。这就是数据科学的力量。您还可以了解 数据科学如何用于医疗保健 以及它如何改善患者的生活方式并在早期预测疾病。

现在想象一下这 120 万人克服的灾难。在这里,我可以自豪地说,如果你能拯救别人的未来,你就拯救了自己的未来。这是 2019 年,这一切都是可能的,向前一点,让我们谈谈未来,以及他们在 2020 年和 2025 年的作用。如果他们现在有如此大的需求,那么他们未来的需求会是怎样的呢?毫无疑问,他们是当今世界上收入最高的职业之一。有没有想过他们未来的工资会是多少?

数据科学家在 2020 年的角色

到 2020 年,印度将面临数据科学专业人员短缺的问题。这是因为他们需要分析大量数据,做出决策和预测。为此,他们确实需要掌握与统计、数学、数据可视化、机器学习、编码等相关的技能。我们很少发现有如此高水平技能的人。根据 IBM 进行的一项调查,到 2020 年,数据科学家的职位空缺将增加 36.4 万到 272 万。

Image Source: Google

根据 LinkedIn,数据科学家的工作简介如下:

信息技术和服务- 29,300

计算机软件-19800

研究-13200

互联网-7700

金融服务-6500

管理咨询-3600

高等教育- 3,000 人

银行业-2800

营销和广告-2500

保险-2200

数据科学家根据他们拥有的技能获得巨额报酬。连 IBM 做的 调查都这么说。平均工资为:

地图减少- $115,900

猪-114,500 美元

机器学习-11.27 万美元

阿帕奇蜂房-11.22 万美元

Apache Hadoop-110,600 美元

大数据-10.99 万美元

数据科学-10.73 万美元

NoSQL-:10.5 万美元

预测分析-103,200 美元

MongoDB-101300 美元

未来几年,印度各行各业对数据科学家的需求将增长 400%以上。数据科学家在未来必不可少,因为:

有一船的数据——正如我们在本文第一段中读到的关于定期生成的数据量。需要管理和分析这些数据。通过汲取洞察力,可以做出对业务增长有效的决策。有可能发生的预测或事件在收集的数据的帮助下被识别。

技能无法匹配 -未来的数据科学家将能够处理最关键和最复杂的业务挑战。他们之所以能够做到这一点,是因为他们拥有为组织带来变革所需的正确技能和技术知识。你不可能在任何其他职业中找到这些独特的技能和天赋。查看掌握这门艺术必须具备的顶级 数据科学技能 (哎呀..理科:P)。

应用数量将会增加 —数据科学家的工作包括从原始数据中提取有意义的信息。这个过程看起来花费的时间较少,但实际上它需要大量的工具和技术,而这些工具和技术会占用大量的时间。数据科学最近探索了许多应用,并将在不久的将来继续探索更多应用。

结论

最后我想说的是,改变是不可避免的,但你的成长是可选的。因此,如果你想跟上快节奏的世界和不断变化的技术,那就与世界携手共进吧。相反,我想说的是,往前走一步,因为这是数据科学家的工作。

巴隆多尔的历史告诉了我们什么

原文:https://towardsdatascience.com/what-does-the-history-of-ballon-dor-tell-us-97c0c744a916?source=collection_archive---------11-----------------------

Photo credit: https://commons.wikimedia.org/wiki/File:Super_Ballon_d%27Or_and_Ballon_d%27Ors.jpg

对往届金球奖得主的深入分析

我坐在后面,看着克里斯蒂亚诺·罗纳尔多如何赢得 2013 年金球奖。我很生气。我认为弗兰克·里贝利应该赢得它。毕竟,拜仁慕尼黑通过赢得他们争夺的每一座奖杯,全年表现得比皇家马德里更好。

回顾那一刻,我意识到金球奖有时可以公正地颁发,而在其他时候则可以公平地颁发,就像莱昂内尔·梅西在 2015 年赢得它一样。

金球奖是一项非常有声望的奖项,根据上一赛季的表现授予世界最佳足球运动员。因此,我对这个奖项的痴迷让我对 Ballon d'or 的历史进行了分析,找出谁是最大的赢家,以及哪些球队产生了最多的赢家。

获取数据集

用于进行这项研究的数据集是通过这个链接从 Kaggle 获得的。该数据集包含精确的列,显示自 1956 年开始以来金球奖是如何授予的。

数据集被加载到 Jupyter Notebook 上,并被清理以便执行某些任务。数据集中的特征有:年份、排名、球员、球队、分数和百分比。

A snapshot of the first five rows of the dataset.

分析和探索数据集

十佳金球奖演员

在金球奖颁奖典礼之前,首先绘制了一张图表,以突出显示进入决赛的前三名球员。

The top ten players who have featured as Ballon d’or finalists

根据图表,不出所料,莱昂内尔·梅西和克里斯蒂亚诺·罗纳尔多并列第一,因为他们都创纪录地 11 次入围决赛。

然后,绘制了另一个图表来描绘赢得最多金球奖的球员。

The top ten players with the Ballon d’or awards

众所周知,梅西和罗纳尔多各获得 5 个奖项。米歇尔·普拉蒂尼、约翰·克劳夫和卡尔·海茵茨·鲁梅尼格各获得三个金球奖,并列第三。

贡献最多金球奖的球队

绘制了三张图来显示哪些球队经常为金球奖做出贡献。

第一张图显示了哪支队伍产生了最多的决赛选手。

The top 20 teams with the most finalists

图表显示巴塞罗那拥有最多的决赛席位。他们的球员已经 33 次入围金球奖决赛。皇家马德里以 27 次位居第二。拜仁慕尼黑以大约 18 次排名第三。

第二张图显示了获得最多金球奖的球队

The top 20 teams with the most Ballon d’or winners

皇家马德里和巴塞罗那都有他们的球员 11 次赢得这个美丽的奖项。尤文图斯的球员和 AC 米兰的球员获得了 8 次,拜仁慕尼黑的球员获得了 5 次。

第三张图显示了自金球奖开始以来积分最高的球队。分数是根据谁投票给一个玩家以及有多少人投票给一个玩家来决定的。

The top 10 teams that have accumulated the most points from Ballon d’or

根据图表,最终进入决赛的皇家马德里球员以创纪录的 4190 分获得了最多的分数。巴塞罗那以 3869 分位居第二。尤文图斯以 2258 分排在第三位。

历史上命中率最高的球员

在金球奖颁奖仪式上,俱乐部队长和教练会为他们认为应该获奖的球员投票。决赛选手中得分最高的选手获胜。

The top five players with the most percentages in the history of Ballon d’or

The last five players with the most percentages in the history of Ballon d’or

第一张表中,米歇尔·普拉蒂尼以 68.32 %的得票率成为 1983 年的最大赢家。有史以来最小的赢家是莱昂内尔·梅西,他在 2010 年获得了 22.65 %的选票。

结论

金球奖揭晓后,足球迷们在谁应该获奖的问题上产生了分歧。c 罗还是梅西?根据我的看法,今年将会是维吉尔·范·迪克。然而,我们必须等待,看看谁会赢得 2019 年 9 月 23 日的金球奖。

用来构建这些图的完整版本代码可以在 这里 看到。

推特是如何看待星球大战:天行者崛起的?Python 中的情感分析

原文:https://towardsdatascience.com/what-does-twitter-think-of-star-wars-the-rise-of-skywalker-sentiment-analysis-in-python-45a865d84049?source=collection_archive---------29-----------------------

Photo by Craig Adderley on Pexels

《星球大战:天行者崛起》最近在影院上映。迪士尼报告说,这部新电影的预告片获得了 4000 万美元的票房,这使它成为有史以来第五高的预告片。首映周末的票房收入在 1.7 亿到 2 亿美元之间。从这些数字来看,很明显这部新电影是票房成功的。我在这篇文章中试图回答的问题是:twitter 用户对这部电影的普遍看法是什么?

在这篇文章中,我们将使用 twitter python API tweepy 来获取与新的《星球大战》电影相关的 Twitter 消息。然后,我们将使用 TextBlob,一个用于处理文本数据的 python 库,来为与电影相关的推文生成情感分数。最后,我们将使用 python 可视化包 seaborn 和 Matplotlib 来可视化我们的结果。

首先,你需要申请一个 Twitter 开发者账户:

Source

在您的开发人员帐户获得批准后,您需要创建一个 Twitter 应用程序:

Source

申请 Twitter 开发者账户和创建 Twitter 应用程序的步骤在这里有概述。

为了访问 Twitter API,我们将使用免费的 python 库 tweepy。tweepy 的文档可以在这里找到。

  1. 安装

首先,确保您已经安装了 tweepy。打开命令行并键入:

pip install tweepy

2.导入库

接下来,打开您最喜欢的编辑器,导入 tweepy 和 pandas 库:

import tweepy
import pandas as pd

3.认证

接下来,我们需要我们的消费者密钥和访问令牌:

Source

请注意,该网站建议您保持您的密钥和令牌私有!这里我们定义了一个假的密钥和令牌,但是在创建 Twitter 应用程序时,您应该使用真正的密钥和令牌,如上所示:

consumer_key = '5GBi0dCerYpy2jJtkkU3UwqYtgJpRd' 
consumer_secret = 'Q88B4BDDAX0dCerYy2jJtkkU3UpwqY'
access_token = 'X0dCerYpwi0dCerYpwy2jJtkkU3U'
access_token_secret = 'kly2pwi0dCerYpjJtdCerYkkU3Um'

下一步是创建 OAuthHandler 实例。我们传递上面定义的消费者密钥和访问令牌:

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

接下来,我们将 OAuthHandler 实例传递给 API 方法:

api = tweepy.API(auth)
  1. TWITTER API 请求

接下来,我们为我们有兴趣分析的字段初始化列表。现在,我们可以查看推文字符串、用户和推文时间。接下来,我们在一个 tweepy“Cursor”对象上编写一个 for 循环。在“Cursor”对象中,我们传递“api.search”方法,为我们想要搜索的内容设置查询字符串,并设置“count”= 1000,这样我们就不会超过 Twitter 的速率限制。在这里,我们将搜索关于“星球大战”的推文。我们还使用“item()”方法将“Cursor”对象转换为 iterable。

为了简化查询,我们可以删除转发,只包含英文推文。为了了解该请求返回的内容,我们还可以打印附加到每个列表的值:

twitter_users = []
tweet_time = []
tweet_string = []
for tweet in tweepy.Cursor(api.search,q='Star Wars', count=1000).items(1000):
            if (not tweet.retweeted) and ('RT @' not in tweet.text):
                if tweet.lang == "en":
                    twitter_users.append(tweet.user.name)
                    tweet_time.append(tweet.created_at)
                    tweet_string.append(tweet.text)
                    print([tweet.user.name,tweet.created_at,tweet.text])

为了实现可重用性,我们可以将它封装在一个函数中,该函数将关键字作为输入。我们还可以将结果存储在数据帧中并返回值:

def get_related_tweets(key_word):twitter_users = []
    tweet_time = []
    tweet_string = [] 
    for tweet in tweepy.Cursor(api.search,q=key_word, count=1000).items(1000):
            if (not tweet.retweeted) and ('RT @' not in tweet.text):
                if tweet.lang == "en":
                    twitter_users.append(tweet.user.name)
                    tweet_time.append(tweet.created_at)
                    tweet_string.append(tweet.text)
                    print([tweet.user.name,tweet.created_at,tweet.text])
    df = pd.DataFrame({'name':twitter_users, 'time': tweet_time, 'tweet': tweet_string})

    return df

如果用关键字“星球大战:天行者崛起”调用函数,我们会得到:

get_related_tweets("Star Wars: The Rise of Skywalker")

为了获得情感分数,我们需要导入一个名为 textblob 的 python 包。textblob 的文档可以在这里找到。要安装 textblob,请打开命令行并键入:

pip install textblob

下次导入 textblob:

from textblob import TextBlob

我们将使用极性得分作为积极或消极感觉的衡量标准。极性得分是一个从-1 到+1 的浮点数。

例如,如果我们定义一个 textblob 对象并传入句子“我喜欢新的星球大战电影”,我们应该得到一个正值的极性分数:

sentiment_score = TextBlob("I love the new Star Wars movie").sentiment.polarity
print("Sentiment Polarity Score:", sentiment_score)

让我们给关于“星球大战:天行者崛起”的推文打分:

df = get_related_tweets("Star Wars: The Rise of Skywalker")
df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
print(df.head())

我们也可以计算积极和消极情绪的数量:

df_pos = df[df['sentiment'] > 0.0]
df_neg = df[df['sentiment'] < 0.0]
print("Number of Positive Tweets", len(df_pos))
print("Number of Negative Tweets", len(df_neg))

同样,对于代码重用,我们可以将其全部封装在一个函数中:

def get_sentiment(key_word):
    df = get_related_tweets(key_word)
    df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
    df_pos = df[df['sentiment'] > 0.0]
    df_neg = df[df['sentiment'] < 0.0]
    print("Number of Positive Tweets about {}".format(key_word), len(df_pos))
    print("Number of Negative Tweets about {}".format(key_word), len(df_neg))

如果我们用“星球大战:天行者崛起”调用这个函数,我们得到:

get_sentiment("Star Wars: The Rise of Skywalker")

我们也可以试试《星球大战》:

get_sentiment("Star Wars")

如果我们能以编程方式可视化这些结果,那将会很方便。让我们导入 seaborn 和 matplotlib 并修改我们的 get _ 情操函数:

import seaborn as sns
import matplotlib.pyplot as plt
def get_sentiment(key_word):
    df = get_related_tweets(key_word)
    df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
    df_pos = df[df['sentiment'] > 0.0]
    df_neg = df[df['sentiment'] < 0.0]
    print("Number of Positive Tweets about {}".format(key_word), len(df_pos))
    print("Number of Negative Tweets about {}".format(key_word), len(df_neg))
    sns.set()
    labels = ['Postive', 'Negative']
    heights = [len(df_pos), len(df_neg)]
    plt.bar(labels, heights, color = 'navy')
    plt.title(key_word)

get_sentiment("Star Wars: The Rise of Skywalker")

而对于《星球大战》:

get_sentiment("Star Wars")

如你所见,关于星球大战:天行者崛起的推文正面情绪多于负面情绪。我知道我很期待这个周末自己去看。收集几天的数据来观察情绪如何随时间变化会很有趣。也许我会把它留到以后的文章里。

感谢您的阅读。这篇文章的代码可以在 GitHub 上找到。祝好运,机器学习快乐!

Twitter 如何看待新款特斯拉 Cybertruck?Python 中的情感分析

原文:https://towardsdatascience.com/what-does-twitter-think-of-the-new-tesla-cybertruck-sentiment-analysis-in-python-afa22a9aefce?source=collection_archive---------30-----------------------

Photo by Pixabay on Pexels

最近,埃隆·马斯克(Elon Musk)推出了特斯拉 Cybertruck,这是一款由特斯拉公司(Tesla Inc .)开发的全电动电池驱动的商用车。Cybertruck 是每天销售的数千辆化石燃料驱动卡车的可持续能源替代品。最近,在一次电脑卡车的演示中,埃隆告诉卡车的主要设计师之一,向窗户扔一个小钢珠,以展示防弹玻璃的耐用性。两次投掷后,司机和乘客座位上的玻璃都碎了。

此次发布会在社交媒体上引起了大量的关注。尽管许多人对卡车的锐利轮廓、不寻常的形状以及揭幕期间的失败测试表示不满,但特斯拉收到了超过 25 万辆卡车的预订。鉴于这种差异,看看社交媒体上对使用机器学习的网络卡车的普遍看法将是有趣的。在本帖中,我们将对关于特斯拉赛博卡车的推文进行情感分析。

首先,你需要申请一个 Twitter 开发者账户:

Source

您的开发人员帐户获得批准后,您需要创建一个 Twitter 应用程序:

Source

申请 Twitter 开发者账户和创建 Twitter 应用程序的步骤在这里列出。

为了访问 Twitter API,我们将使用免费的 python 库 tweepy。tweepy 的文档可以在这里找到。

  1. 安装

首先,确保您已经安装了 tweepy。打开命令行并键入:

pip install tweepy

2.导入库

接下来,打开您最喜欢的编辑器,导入 tweepy 和 pandas 库:

import tweepy
import pandas as pd

3.认证

接下来,我们需要我们的消费者密钥和访问令牌:

Source

请注意,该网站建议您保持您的密钥和令牌私有!这里我们定义了一个假的密钥和令牌,但是在创建 Twitter 应用程序时,您应该使用真正的密钥和令牌,如上所示:

consumer_key = '5GBi0dCerYpy2jJtkkU3UwqYtgJpRd' 
consumer_secret = 'Q88B4BDDAX0dCerYy2jJtkkU3UpwqY'
access_token = 'X0dCerYpwi0dCerYpwy2jJtkkU3U'
access_token_secret = 'kly2pwi0dCerYpjJtdCerYkkU3Um'

下一步是创建 OAuthHandler 实例。我们传递上面定义的消费者密钥和访问令牌:

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

接下来,我们将 OAuthHandler 实例传递给 API 方法:

api = tweepy.API(auth)
  1. TWITTER API 请求

接下来,我们为我们有兴趣分析的字段初始化列表。现在,我们可以查看推文字符串、用户和推文时间。接下来,我们在一个 tweepy“Cursor”对象上编写一个 for 循环。在“Cursor”对象中,我们传递“api.search”方法,为我们想要搜索的内容设置查询字符串,并设置“count”= 1000,这样我们就不会超过 twitter 的速率限制。在这里,我们将搜索关于“特斯拉 Cybertruck”的推文。我们还使用“item()”方法将“Cursor”对象转换为 iterable。

为了简化查询,我们可以删除转发,只包含英文推文。为了了解该请求返回的内容,我们还可以打印附加到每个列表的值:

twitter_users = []
tweet_time = []
tweet_string = []
for tweet in tweepy.Cursor(api.search,q='Tesla Cybertruck', count=1000).items(1000):
            if (not tweet.retweeted) and ('RT @' not in tweet.text):
                if tweet.lang == "en":
                    twitter_users.append(tweet.user.name)
                    tweet_time.append(tweet.created_at)
                    tweet_string.append(tweet.text)
                    print([tweet.user.name,tweet.created_at,tweet.text])

为了实现可重用性,我们可以把它打包成一个函数,把关键字作为输入。我们还可以将结果存储在数据帧中并返回值:

def get_related_tweets(key_word):twitter_users = []
    tweet_time = []
    tweet_string = [] 
    for tweet in tweepy.Cursor(api.search,q=key_word, count=1000).items(1000):
            if (not tweet.retweeted) and ('RT @' not in tweet.text):
                if tweet.lang == "en":
                    twitter_users.append(tweet.user.name)
                    tweet_time.append(tweet.created_at)
                    tweet_string.append(tweet.text)
                    print([tweet.user.name,tweet.created_at,tweet.text])
    df = pd.DataFrame({'name':twitter_users, 'time': tweet_time, 'tweet': tweet_string})

    return df

当我们用关键词“特斯拉 Cybertruck”调用函数时,我们得到:

get_related_tweets('Tesla Cybertruck')

为了获得情感分数,我们需要导入一个名为 textblob 的 python 包。textblob 的文档可以在这里找到。要安装 textblob,请打开命令行并键入:

pip install textblob

下次导入 textblob:

from textblob import TextBlob

我们将使用极性得分作为积极或消极感觉的衡量标准。极性得分是一个从-1 到+1 的浮点数。

例如,如果我们定义一个 textblob 对象并传入句子“我爱特斯拉 Cybertruck ”,我们应该得到一个正值的极性得分:

sentiment_score = TextBlob(“I love the Tesla Cybertruck”).sentiment.polarity
print("Sentiment Polarity Score:", sentiment_score)

让我们来看看关于“特斯拉赛博卡车”的推文的情绪极性得分:

df = get_related_tweets("Tesla Cybertruck")
df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
print(df.head())

我们也可以计算积极和消极情绪的数量:

df_pos = df[df['sentiment'] > 0.0]
df_neg = df[df['sentiment'] < 0.0]
print("Number of Positive Tweets", len(df_pos))
print("Number of Negative Tweets", len(df_neg))

同样,对于代码重用,我们可以将其全部封装在一个函数中:

def get_sentiment(key_word):
    df = get_related_tweets(key_word)
    df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
    df_pos = df[df['sentiment'] > 0.0]
    df_neg = df[df['sentiment'] < 0.0]
    print("Number of Positive Tweets about {}".format(key_word), len(df_pos))
    print("Number of Negative Tweets about {}".format(key_word), len(df_neg))

如果我们用“Tesla Cybertruck”调用这个函数,我们得到:

get_sentiment(“Tesla Cybertruck”)

如果我们能以编程方式可视化这些结果,那将会很方便。让我们导入 seaborn 和 matplotlib 并修改我们的 get _ 情操函数:

import seaborn as sns
import matplotlib.pyplot as pltdef get_sentiment(key_word):
    df = get_related_tweets(key_word)
    df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity)
    df_pos = df[df['sentiment'] > 0.0]
    df_neg = df[df['sentiment'] < 0.0]
    print("Number of Positive Tweets about {}".format(key_word), len(df_pos))
    print("Number of Negative Tweets about {}".format(key_word), len(df_neg))
    sns.set()
    labels = ['Postive', 'Negative']
    heights = [len(df_pos), len(df_neg)]
    plt.bar(labels, heights, color = 'navy')
    plt.title(key_word)get_sentiment(“Tesla Cybertruck”)

如你所见,关于特斯拉电动卡车的推文正面情绪多于负面情绪。收集几天的数据来观察情绪如何随时间变化会很有趣。也许我会把它留到以后的文章里。

感谢您的阅读。这篇文章的代码可以在 GitHub 上找到。祝好运,机器学习快乐!

你的分类标准告诉了你的数据什么?

原文:https://towardsdatascience.com/what-does-your-classification-metric-tell-about-your-data-4a8f35408a8b?source=collection_archive---------6-----------------------

分类度量的评价策略及结果评价研究

Photo by M. B. M. on Unsplash

有没有想过为什么会有很多性能指标告诉你你的分类技能?是的,他们会评估一个模型的性能,并告诉你分类的好坏,但每个人的评估方式都不一样。

把它想象成你的高中老师,有些人可能会给你高分,尽管你的答案是狗屎,因为你是一个马屁精,有些人可能会给你低分,尽管你的答案很贴切。将准确性作为你分类的主要标准也是一种犯罪!

然而,这个博客不是让你熟悉度量标准,而是如何有效地使用它们。

先决条件

  • 你知道混淆矩阵是什么吗
  • 你熟悉第一类和第二类错误

假设

  • 零假设 H⁰=“个人有癌症”。(通常,零假设是出于拒绝它的动机)
  • 以下混淆矩阵作为参考和示例。

Note: Box values depend on H0

我将在本博客中介绍以下与在线数据科学竞赛重要性相关的指标:

  • 精确度和召回率
  • f1-分数
  • 受话者工作特性范围

注意:我采用 UCI 乳腺癌数据集来表示不同的值。为此,我故意移动超参数来表示某些条件和结果。

用于计算混淆矩阵值的 Python 辅助函数:

def find_TP(y, y_hat):
    # counts the number of true positives (y = 1, y_hat = 1)
    return sum((y == 1) & (y_hat == 1))
def find_FN(y, y_hat):
    # counts the number of false negatives (y = 1, y_hat = 0) Type-II error
    return sum((y == 1) & (y_hat == 0))
def find_FP(y, y_hat):
    # counts the number of false positives (y = 0, y_hat = 1) Type-I error
    return sum((y == 0) & (y_hat == 1))
def find_TN(y, y_hat):
    # counts the number of true negatives (y = 0, y_hat = 0)
    return sum((y == 0) & (y_hat == 0))

我用逻辑回归的两组超参数做了一个分类模型。这样做是为了在两种不同的情况下测试模型预测。

from sklearn.linear_model import LogisticRegressionclf_1 = LogisticRegression(C=1.0, class_weight={0:100,1:0.2}, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=100,
                   multi_class='auto', n_jobs=None, penalty='l2',
                   random_state=None, solver='lbfgs', tol=0.0001,       verbose=0,
                   warm_start=False)clf_2 = LogisticRegression(C=1.0, class_weight={0:0.001,1:900}, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=100,
                   multi_class='auto', n_jobs=None, penalty='l2',
                   random_state=None, solver='lbfgs', tol=0.0001, verbose=0,
                   warm_start=False)

精确

精度是真阳性和预测的总阳性的比率。

0

精度指标关注第一类误差(FP)。当我们拒绝一个真的空 Hypothesis(H⁰时,一个第一类错误发生。因此,在这种情况下,第一类错误是错误地将癌症患者标记为非癌症患者。精度分数接近 1 将意味着您的模型没有遗漏任何真正的阳性,并且能够很好地分类正确和错误标记的癌症患者。它不能测量的是 II 型错误的存在,即假阴性,即当非癌症患者被识别为癌症患者时的情况。

低精度分数(< 0.5)意味着您的分类器有大量的假阳性,这可能是不平衡的类或未调整的模型超参数的结果。在不平衡类问题中,为了抑制 FP/FN,你必须事先准备好数据,包括过采样/欠采样或焦点损失。

对于第一组超参数:

TP = find_TP(y, y_hat)
FN = find_FN(y, y_hat)
FP = find_FP(y, y_hat)
TN = find_TN(y, y_hat)print('TP:',TP)
print('FN:',FN)
print('FP:',FP)
print('TN:',TN)precision = TP/(TP+FP)
print('Precision:',precision)

Output for the above code snippet

通过查看混淆矩阵值,您可能已经猜到 FP 为 0,因此对于给定超参数设置的 100%精确模型来说,该条件是完美的。在这种设置下,没有报告 I 型错误,即模型在抑制错误地将癌症患者标记为非癌症患者方面做了大量工作。

对于第二组超参数:

TP = find_TP(y, y_hat)
FN = find_FN(y, y_hat)
FP = find_FP(y, y_hat)
TN = find_TN(y, y_hat)print('TP:',TP)
print('FN:',FN)
print('FP:',FP)
print('TN:',TN)precision = TP/(TP+FP)
print('Precision:',precision)

Output for the above code snippet

由于在这种设置中只剩下第一类误差,因此尽管第二类误差为 0,但精度会下降。从我们的例子中我们可以推断出,只有精度不能告诉你你的模型在各种情况下的性能。

回忆或敏感度或命中率

一个 回忆 本质上是真实肯定与地面真相中所有肯定的比率

0 召回指标侧重于第二类错误(FN)。当我们接受一个假的空 Hypothesis(H⁰).时,就会出现第二类错误因此,在这种情况下,第二类错误是错误地将非癌症患者标记为癌症患者。回忆分数接近 1 将意味着您的模型没有错过任何真正的阳性,并且能够很好地分类正确和错误标记的癌症患者。
它不能测量的是 I 型错误的存在,即误报,即癌症患者被识别为非癌症患者的情况。

低召回分数(< 0.5)意味着您的分类器有大量的假阴性,这可能是不平衡的类或未调整的模型超参数的结果。在不平衡类问题中,为了抑制 FP/FN,你必须事先准备好数据,包括过采样/欠采样或焦点损失。

对于第一组超参数:

TP = find_TP(y, y_hat)
FN = find_FN(y, y_hat)
FP = find_FP(y, y_hat)
TN = find_TN(y, y_hat)print('TP:',TP)
print('FN:',FN)
print('FP:',FP)
print('TN:',TN)recall = recall_score(y, y_hat)
print('Recall: %f' % recall)

Output for the above code snippet

从上述混淆矩阵值来看,第一类错误的可能性为 0,而第二类错误的可能性很大。这就是低召回分数背后的原因。它只关注第二类错误。

对于第二组超参数:

TP = find_TP(y, y_hat)
FN = find_FN(y, y_hat)
FP = find_FP(y, y_hat)
TN = find_TN(y, y_hat)print('TP:',TP)
print('FN:',FN)
print('FP:',FP)
print('TN:',TN)recall = recall_score(y, y_hat)
print('Recall: %f' % recall)

Output for the above code snippet

这个集合中唯一持久的错误是 I 类错误,没有报告 II 类错误。这意味着这个模型在遏制错误地将非癌症患者标记为癌症方面做了很大的工作。

以上两个度量标准的主要亮点是它们都只能在特定的场景中使用,因为它们都只能识别一组错误。

精确-召回权衡

要改进你的模型,你可以提高精度或召回率,但不能两者都提高。如果您试图减少非癌症患者被标记为癌症(FN/II 型)的病例,对被标记为非癌症的癌症患者不会产生直接影响。

这里有一个描绘同样权衡的图。

from sklearn.metrics import plot_precision_recall_curvedisp = plot_precision_recall_curve(clf, X, y)
disp.ax_.set_title('2-class Precision-Recall curve: '
                   'AP={0:0.2f}'.format(precision))

这种权衡对现实世界的场景有很大影响,因此这意味着仅仅依靠精确度和召回率并不是很好的衡量标准。这就是为什么你会看到许多公司报告和在线竞赛敦促提交指标是精确度和召回的结合。

f1-分数

F1 得分指标结合了精确度和召回率。事实上,F1-score 是两者的调和平均值。这两个公式本质上是:

现在,高 F1 分数象征着高精确度和高召回率。该算法在查准率和查全率之间取得了很好的平衡,在不平衡分类问题上取得了很好的效果。

F1 分数低(几乎)说明不了什么——它只能告诉你在某个阈值时的表现。低召回率意味着我们没有尽力在整个测试集的大部分上做得很好。低精度意味着,在我们确定为阳性的病例中,我们没有得到很多正确的结果。但是低 F1 没说是哪个。高 F1 可能意味着我们可能对大部分决策具有高精确度和高回忆性(这是信息性的)。F1 较低时,不清楚问题是什么(低精度还是低召回率?),无论模型遭受 I 型还是 II 型误差。

所以,F1 是噱头?不完全是,它已经被广泛使用,并被认为是一个很好的指标,可以收敛到一个决策(业务)中,但也不是没有一些调整。将 FPR(假阳性率)与 F1 一起使用将有助于抑制 I 型错误,并且您将了解在您的低 F1 分数背后的坏人。

对于第一组超参数:

# F1_score = 2*Precision*Recall/Precision+Recall 
f1_score = 2*((precision*recall)/(precision+recall))
print('F1 score: %f' % f1_score)

如果你还记得我们在 set-I 参数中的得分,P=1,R=0.49。因此,通过使用这两个指标,我们得到了 0.66 的分数,这并没有给你什么类型的错误是显著的信息,但在推断模型的性能时仍然是有用的。

对于第二组超参数:

# F1_score = 2*Precision*Recall/Precision+Recall 
f1_score = 2*((precision*recall)/(precision+recall))
print('F1 score: %f' % f1_score)

对于第二组参数,P=0.35,R=1。f1 分数排序再次总结了 P 和 r 之间的间断,但是低 F1 也不能告诉你存在哪个错误。

受话者工作特性范围

更好地称为 AUC-ROC 评分/曲线。它利用真阳性率(TPR)和假阳性率(FPR)。

  • 直观上,TPR/召回对应于相对于所有阳性数据点被正确认为是阳性的阳性数据点的比例。换句话说,TPR 越高,我们错过的正面数据点就越少。
  • 直观上,FPR/辐射对应于所有负数据点中被错误地认为是正的负数据点的比例。换句话说,FPR 越高,我们错误分类的负面数据点就越多。

为了将 FPR 和 TPR 合并成一个单一的指标,我们首先用许多不同的逻辑回归阈值来计算前两个指标,然后将它们绘制在一个单一的图表上。得到的曲线称为 ROC 曲线,我们考虑的度量是这条曲线的 AUC,我们称之为 AUROC。

from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score
from matplotlib import pyplotns_probs = [0 for _ in range(len(y))]
# predict probabilities
lr_probs = clf_1.predict_proba(X)
# keep probabilities for the positive outcome only
lr_probs = lr_probs[:, 1]# calculate scores
ns_auc = roc_auc_score(y, ns_probs)
lr_auc = roc_auc_score(y, lr_probs)# summarize scores
print('No Skill: ROC AUC=%.3f' % (ns_auc))
print('Logistic: ROC AUC=%.3f' % (lr_auc))# calculate roc curves
ns_fpr, ns_tpr, _ = roc_curve(y, ns_probs)
lr_fpr, lr_tpr, _ = roc_curve(y, lr_probs)# plot the roc curve for the model
pyplot.plot(ns_fpr, ns_tpr, linestyle='--', label='No Skill')
pyplot.plot(lr_fpr, lr_tpr, marker='.', label='Logistic')pyplot.xlabel('False Positive Rate')
pyplot.ylabel('True Positive Rate')pyplot.legend()
pyplot.show()

No Skill: ROC AUC=0.500
Logistic: ROC AUC=0.996

无技能分类器是一种不能区分类别的分类器,它在所有情况下都会预测随机类别或恒定类别。无技能线的变化是基于积极类和消极类的分布。它是一条水平线,带有数据集中阳性案例的比率值。对于平衡数据集,这是 0.5。

该面积等于随机选择的正面例子排名在随机选择的负面例子之上的概率(被认为正面的概率高于负面的概率)。因此,高 ROC 仅仅意味着随机选择的正面例子的概率确实是正面的。ROC 高也意味着你的算法在测试数据的排序方面做得很好,大多数负面情况在一个范围的一端,而正面情况在另一端。

当你的问题存在巨大的阶级不平衡时,ROC 曲线不是一个好的选择。其中的原因并不简单,但可以通过公式直观地看出,你可以在这里了解更多信息。在处理不平衡设置或使用焦点损失技术后,您仍然可以在这种情况下使用它们。

除了学术研究和不同分类器的比较之外,AUROC metric 没有找到其他位置。

还有,很多人在论坛上问过这个 F1 分数低但是 AUC 分数高的问题。

正如你现在已经猜到的,两者有不同的评估策略。对于特定的 ROC,您可以有一个 F1 分数范围(取决于阈值参数)。

每个有抱负的数据科学家需要了解的网络知识

原文:https://towardsdatascience.com/what-every-aspiring-data-scientist-needs-to-know-about-networking-475cfaac15f8?source=collection_archive---------15-----------------------

Image: https://zipinternationalinc.ca/zip-international-importance-networking/

一个典型的数据科学职位发布可以吸引数十甚至数百份申请。因此,在申请过程中要克服的最重要的障碍通常是找到吸引公司注意的方法。

因此,求职不仅仅是技能的竞争:在很大程度上,这也是带宽的竞争。申请过程越早,竞争对手就越多,吸引眼球就越困难。

但是,当决策时刻到来时,您如何确保您的应用程序得到第二次检查呢?我可能会想到两个选择:

  1. 优化你的简历。
  2. 试着完全跳过简历筛选这一步。

老实说,我认为在这里讨论第一点没有多大价值。一些原因:

  • 这是一个我在之前已经谈到过的话题,而且已经有很多很棒的“如何打造一份完美简历”的帖子了。
  • 除非你的简历是一个真正的垃圾箱火,它是不可能优化很多,因为每个招聘人员都喜欢不同的格式,和不同的内容。
  • 发送简历而不被邀请参加面试是一个零反馈的过程,所以如果你所做的只是一次又一次地把简历扔进空白,你就不会了解到你可以从每份申请中改进什么。

出于这些原因,我们在 SharpestMinds 非常重视战略 2。因此,在接下来的内容中,我将重点关注这一点:找到避开传统简历筛选过程的方法。

提示:答案是网络。

如何跳过这条线

极不相称的雇佣人数是由已经在一家公司工作的员工推荐的。因此,你最好的进入途径,十有八九是通过与在你的目标公司工作的人的关系,而不是普通的渠道,比如求职板(这不可避免地会导致可怕的简历筛选)。

关系很重要,因为它们会给你一个信号提升,但也让你更有可能在申请中得到反馈。即使你的申请被拒绝了,你也可以向你的联系人询问如何改进。

但是,如何与成熟的数据科学家建立有意义的关系呢?我们通过两种方式成功地做到了这一点:

1.通过聚会

毫无疑问,聚会是你获得入门级数据科学职位的最佳途径。但是你必须选择正确的。

最好的聚会有以下三个特征:

  1. 它们是技术性的,不适合新手(好公司不会出现在“数据科学入门”聚会上进行招聘)
  2. 他们经常重复,至少一个月一次(理想的是每周一次或更频繁)。这可以让你了解当地社区的人,让他们了解并认可你。
  3. 他们不是太大(超过 100 人定期参加),也不是太小(开始参加)。第一次去的时候,你不必与任何人交谈,但很快你就会想通过在演讲后提问,并努力与其他与会者聊天来让别人知道你的存在。随着时间的推移,这种活动会越来越多,让你成为所有 Meetup 参与者的熟悉面孔。

为每次聚会设定具体的目标。每次去的时候,争取和其他与会者进行至少 3 次实质性的对话,或者在演讲后强迫自己至少问一个问题。

  • 一个伟大的、高影响力的活动是邀请 Meetup 组织者做一个演讲。这有助于提升你在社区中的形象,也迫使你在演讲前提升你的技术水平。
  • 你可以在 LinkedIn 上添加你在 Meetup 上交谈过的任何人。如果你以这种方式将某人添加到你的网络中,并且他们是一个特别有前途的潜在客户(即,你们有相似的技术或行业兴趣,或者在数据科学社区有非常好的人脉),你可以请他们喝杯咖啡,谈谈他们的工作和经历。从这里开始,按照下面 LinkedIn 行动手册中的后续步骤进行操作。
  • 2.通过 LinkedIn
  • 好吧,这个很系统也很乏味。但这正是其他人不这么做的原因,也是为什么这是一种脱颖而出并给自己一个信号提升的好方法:

去 LinkedIn

在你的区域搜索“数据科学家”、“机器学习工程师”、“数据分析师”,或者任何最合适的搜索术语。

  • 找到至少 20 个知名数据科学家的资料(拥有 6 个月以上的经验),他们似乎与你有相似的技术兴趣,他们在目前正在招聘的公司工作(你可以查看他们公司的网站,看看是否是这样)。理想情况下,你应该与他们有更多的共同点,而不仅仅是你们都喜欢数据科学:NLP、大数据/数据工程、计算机视觉、金融等都是额外共同点的巨大来源。
  • 向每个人发送一个连接请求,并附上以下消息的适当定制版本:
  • 嗨[他们的名字],
  • 我刚刚看了你的简介,发现你在[零售数据分析/房地产数据可视化等]方面的工作非常引人注目(这是我特别感兴趣的领域)。我很乐意连接!

谢谢,

[您的姓名]

大部分都不会连接。有些人会的。跟踪你的联系人(我推荐 Trello )。跟进那些接受您的连接请求的人:

嗨[他们的名字],

  • 感谢连接!我真的很想更多地了解您在[公司名称]所做的工作。我希望在一个类似的领域工作,并且很乐意向你请教在这个领域工作的挑战。

[您的姓名]

如果他们回复了,而且看起来很开放,接着发第三条信息,问他们是否愿意一起喝杯咖啡[在离他们工作的地方近的地方!].

你可能会被多处咬伤。如果你这样做了,很好:分别与每个人建立关系。在每一个案例中,你的目标应该是尽可能多地了解他们在日常工作中面临的技术问题,这样你就可以确定作为一名员工,你是否有能力为他们的公司增加价值。如果你不这么认为,在试图利用你的新关系进入面试之前,集中精力提高你的技能。

  • 如果你在与新关系的交谈中觉得你能够胜任他们与你讨论的角色,这是一个好迹象,你应该直接问他们——不要给他们压力——你是否是一个合适的人选。仔细听他们的回答:如果这不是申请邀请,你可以问(不要咄咄逼人)为什么你还不适合。
  • 一个好办法是:“谢谢你澄清了这一点,对我来说,在我继续提高技能的时候,知道自己的位置是非常有帮助的。你认为我最需要改进的地方是什么,以便更好地定位自己,在未来担任类似的角色?”这里的目标是表现出对知识的渴望,而不是对工作的渴望。
  • 如果事情进展顺利,询问你的新联系人,一旦你取得了更多的进展,他们是否愿意再次与你见面,并请求他们允许你在达到一些关键技能发展里程碑时随时更新他们的信息(但只有在你打算这样做的情况下:没有什么比承诺做某事但不坚持到底更糟糕的了)。
  • 当你运用这些策略时,一个总的忠告是:要真诚,不要把你的新联系人当作垫脚石。他们慷慨地自愿成为你网络中的节点,你应该尊重他们。数据科学社区(以及更广泛的技术社区)已经形成了一种强大的“向前支付”精神,正是为了帮助有抱负的开发人员克服他们在试图进入该领域时所面临的高技术壁垒。
  • 这是一件伟大的事情,我们应该彼此保持良好的氛围。

因此,适用于这些情况的最佳心态是,将你的联系人的时间视为对你的投资,并尽一切努力回报这种投资,并在你在 LinkedIn 上受到曾经顶替你的人冷遇的那一天支付这笔投资。

如果你想联系,你可以在 Twitter 上找到我,地址是 @ jeremiecharris!

So the best mindset to apply to these situations is to treat your contacts’ time as an investment in you, and to do everything you can to reward that investment and pay it forward the day you get a cold reach-out on LinkedIn by someone whose shoes you once filled.

If you want to connect, you can find me on Twitter at @jeremiecharris!

每个人都忘记了机器学习

原文:https://towardsdatascience.com/what-everyone-forgets-about-machine-learning-974752543849?source=collection_archive---------28-----------------------

机器学习的安全性

闪亮的新功能不是免费的

Source.

我们生活在疯狂的时代。我记得小时候看《星球大战》的时候,想知道要多久我们的厨房里才会有会说话的机器人。事实证明,时间并不长。事实上不到十年。

人工智能,更具体地说是机器学习,正在真正将科幻小说带入现实——没有其他方式可以表达。每当我翻阅 Tech Review 或 TechCrunch 时,我都会被我们现在可以“随意”做的事情震惊。

看穿墙壁?容易。从视频中猜测材料的物理属性?搞定。从键盘声音估计击键?小菜一碟。如何生成逼真的人脸、身体或诗歌?还是教机器画?还是一款星际争霸的游戏?

哦,你见过这些东西四处游荡吗?

Source.

疯狂。

现在,如果你真的去和从事 AI/ML 工作的人交谈,你可能会得到两种回答中的一种。要么他们对人工智能/人工智能能做什么感到兴奋不已,并正在研究下一个大的视觉/自然语言处理/强化学习问题——要么——他们对我们这些愚蠢的人类正在建造的东西感到绝对恐惧,并相信人工通用智能很快就会把人类变成一堆无用的回形针。在我看来,这就像当今社会的普遍分裂——50%的人认为人工智能是我们的未来,50%的人认为这是我们的灭亡。

关于人工智能和机器学习是什么,我想提供第三个——也许是更平凡的——视角:对手的新攻击面。

我们来探索一下。

新发明的阴阳两极

每当一项新发明问世,大多数人都会想到这项发明带来的令人惊叹的新功能。但是,哪里有光,哪里就有阴影,所以新的能力会不经意地与新的漏洞打包在一起,供黑客利用。他们确实剥削他们。

让我们上一堂历史课,重温一下 PC 市场。第一台个人电脑(Altair 8800)于 1975 年发布,随后在接下来的 10 年里进行了一系列创新,最终在 1984 年推出了现在看起来太熟悉的鼠标“苹果麦金塔”。随之而来的是持续了整个 20 世纪 90 年代和 21 世纪初的爆炸式采用浪潮:

Source: retrocomputing + wiki.

然而,大多数用户不知道的是,恶意软件或“恶意软件”市场正在发生类似的爆炸。

1989 年,罗伯特·莫里斯用 Unix sendmail 做实验,制造了一种自我复制的蠕虫病毒,并将其发送到互联网上。最初只是一个实验,最终变成了第一次 DoS 攻击,造成的损失估计在 100,000 美元到 10,000,000 美元之间,并使整个互联网慢了好几天(当然现在是不可想象的)。

随后是 1989 年第一次勒索病毒攻击,1996 年第一次 Linux 病毒(“Staog”),1998 年第一次 AOL 木马。

Malware stats source: av-test (through wiki).

后来,在移动领域也发生了同样的事情:2007 年的 iPhone 时刻,智能手机的采用出现了爆炸性增长:

Source: statista.

…随之而来的是移动恶意软件的爆炸式增长:

Malware stats source: av-test.

那么,机器学习呢?

尽管有各种议论,机器学习的产品化仍处于萌芽状态。许多真正前沿的工作仍然局限于研究实验室和大学——但即使看看研究,我们也可以开始看到一些相同的趋势出现。

按年份和地区统计的机器学习研究论文数量:

Source: arxiv.

……vs“对抗性机器学习” (ML 的恶意软件版本)研究论文数:

Source: arxiv.

所以事情来了。恐慌的时候到了?

安全事务

没那么快。好消息是,随着个人电脑接管了我们的日常生活,黑客们开始入侵,另一个市场也同时发展起来——安全解决方案市场。

第一个反病毒产品是由 Andreas Lüning 和 Kai Figge 在 1987 年为 Atari ST 平台开发的。同年,McAffee、NOD、流感疫苗和 Anti4us 都诞生了——在接下来的 20 年里,更多的产品也诞生了:

Companies source: wiki + news + crunchbase.

很快,风投们意识到网络安全的重要性,资本开始涌入:

  • 凯鹏华盈向赛门铁克投资 300 万美元
  • 麦卡菲向峰会合作伙伴募集资金
  • BitDefender 筹集了 700 万美元

…随后是数百万美元的收购:

  • 麦卡菲以 7 亿美元收购索罗门博士
  • 赛门铁克同意以 7.688 亿美元的股票交易收购 Axent
  • 微软将从 GeCAD 软件获得防病毒技术

随着移动恶意软件的快速增长,移动安全领域也出现了类似的爆炸式增长:

Companies source: wiki + news + crunchbase.

…安全费用:

  • Bluebox 从 Andreessen Horowitz 获得 950 万美元
  • 法国电信向 Lookout 投资高达 2000 万美元
  • Zimperium 为移动安全募集 800 万美元

…最终,安全收购:

  • 移动安全初创公司 Mobilisafe 被 Rapid7 收购
  • 苹果以 3.56 亿美元收购三星的安卓安全合作伙伴 AuthenTec
  • AVG 以 2 . 2 亿美元收购移动安全公司 Location Labs

那么机器学习呢?

ML 需要安全吗?

在过去的某个时候,我曾为英国最大的金融科技公司之一 GoCardless 负责反欺诈和反洗钱。我的团队每年监管超过 100 亿美元的交易量,我们一直在努力将骗子排除在 GC 的循环系统之外。很自然——在某个时候,我们屈服于炒作,决定尝试机器学习。

令我当时感到惊讶的是,它居然有效。事实上,效果很好。我们摆脱了传统的启发式方法,成功地将欺诈造成的资金损失减少了 80%,并将可疑洗钱账户的检测率提高了 20 倍。

只有一个问题。

我们以我认为的“关键”能力部署机器学习。我们交给算法一项任务,不允许它失败——如果它失败了——我们要么损失一大笔钱,要么被吊销金融执照。对于我这个直接负责 GC 安全的产品经理来说——这两个听起来都不是特别令人兴奋。

所以我需要知道曼梯·里会在什么时候以什么方式失败。我们的模式如何被利用?它固有的弱点在哪里?我如何知道 GoCardless 是否受到攻击?

在花了太多的深夜阅读军情六处的文件并在暗网上搜寻之后,我终于找到了我一直在寻找的东西。我了解到 ML 上的中毒攻击,攻击者能够通过在训练期间注入损坏的数据来影响模型的思维。我发现了对立的例子,以及模型如何容易被测试时小心扰乱的输入误导。最后,我了解到隐私攻击以及底层数据和模型本身都没有那么隐私。

然后,我发现了这个…

Source: MIT tech review.

…我吓坏了。

到 2019 年底,1/3 的企业将部署机器学习。这是你、我、我们的朋友和爱人每天使用的所有产品的 1/3——完全暴露在任何对 ML 工作原理有一丁点了解的攻击者面前。

是的,机器学习需要安全。

婴儿第一步

ML 安全是一个非常新兴的领域,目前基本上还不存在。如果说我从上面的研究中学到了什么,那就是任何没有数学博士学位的人都很难弄清楚如何让他们的 ML 安全(今天实际上没有解决方案,只有大量数学研究论文)。

考虑到我们的生活中有多少要托付给算法——我认为这是我们的责任——你的,我的,以及整个 ML 社区的责任,以确保安全性不会被抛在脑后。正如我在关于逃避、中毒和隐私攻击的帖子中所解释的那样,我们今天可以做很多事情来构建更健壮的 ML 模型。但更重要的是,我们需要转变思维方式——从“不惜一切代价保证准确性”转向更平衡的准确性和稳健性方法:

Source. C1 and C2 are two models. C1 clearly starts off as less accurate, but as the attack strength increases, it also does a better job at withstanding it. Would you pick C1 or C2 as your ML model?

这篇文章和上面的文章是我朝着更强大的 ML 未来迈出的第一小步。如果你觉得它很有见地,一定要分享你的见解。

确保每个人的安全。

2020 年的大数据到底是什么?

原文:https://towardsdatascience.com/what-exactly-is-big-data-in-2020-9acee48e8dd7?source=collection_archive---------22-----------------------

在本文中,我们将分解“大数据”的组成部分,什么使大数据具有挑战性,以及目前如何解决这个问题。大数据通常被用作一个时髦词,但它本质上描述了三类数据:快速、大量和复杂。让我们浏览一下这些类别,浏览一下示例,看看如何使用最新的解决方案来应对这些挑战。
大数据是一个术语,描述大量高速复杂多变的数据,这些数据需要先进的技巧和技术来实现对信息的存储分发、和分析。”( TechAmerica 基金会的联邦大数据委员会,2012 年)

快速数据

那么什么是快数据呢?快速数据是在短时间内大量产生的数据。例子包括来自汽车工厂的传感器、心脏监视器、飞行仪器等的数据..

快速数据通常被视为实时或半实时数据流。数据流本质上是在产生时发送给消费者的数据包(想象一下通过天线接收的电视信号或通过电话中的固定电话发送的语音呼叫)。实时数据的定义是一个更深入的话题,然而,它本质上归结为需要在毫秒内更新的数据。数据流面临许多挑战。其中包括能够在不丢失数据的情况下捕获数据,处理流中的重复记录,将流数据与更大的历史数据集集成,以及执行实时分析。

传统的流服务,如 Rabbit MQ 和 Active MQ,是在单独的服务器上运行的,因此受限于服务器的容量。Apache Kafka 引入了分布式流服务的概念,其中数据流可以在多个节点(商用服务器)之间拆分。这实现了高吞吐量的流处理,允许每秒处理数百万条消息。随着向云迁移的到来,开发人员不再需要管理底层硬件。亚马逊 Kinesis 和谷歌 Pub/Sub 完全抽象出流媒体服务背后的服务器,使开发人员只需专注于业务逻辑和数据。

为了对流数据执行实时分析,通常使用 ELK 栈(弹性搜索、日志存储、Kibana)。ELK stack 是一个工具组合,使用 Log Stash 将各种来源的数据传输到弹性搜索中。弹性搜索以一种方式存储数据,在这种方式下可以很容易地搜索到某些短语和关键字。Kibana 是一个位于弹性搜索之上的工具。它在数据流入时实时分析数据,并允许用户查询数据和围绕数据创建指标。

超大数据

“大数据”的第二个定义是数据足够大。

一个非常大的数据集的例子包括一家主要投资银行 20 年的股票交易历史,过去 20 年的所有信用卡交易,或者在一个非常受欢迎的网站(如 buzz feed)上的用户交互,等等..通常,这些数据的大小在万亿字节或千兆字节的范围内。

由于存储和处理数据需要计算资源,因此处理非常大的数据集非常具有挑战性。根据存储容量,典型的商用硬盘可以存储大约 1tb 的数据。其中一些数据集的大小为数 Pb(数千个硬盘)。要处理这些数据,需要将它们存储在一个数据中心内的多个服务器(或者传统的 RAID 存储驱动器)上。此外,处理数据需要大量的物理内存和 CPU 内核。

随着 Hadoop(一种用于处理数据的开源分布式大数据生态系统)的发布,大部分数据处理成本都降低了。这个系统的核心是 Hive,一个类似 SQL 的处理系统,允许像数据库一样存储数据。数据处理在本地商用硬件上执行,使用 Map-Reduce 算法(为分布式数据处理而编写)。这些服务器中有许多存储在企业数据中心。然而,管理数据中心和 Hadoop 生态系统需要大量的成本和维护。

最近,大部分存储和处理已经转移到云中,亚马逊网络服务(AWS)和谷歌云平台(GCP)是主要参与者。AWS 和 GCP 都提供受管 map-reduce/spark 解决方案——AWS 弹性 Map Reduce 和 GCP 云数据 proc。他们还拥有大规模可扩展的数据库,分别是 Google Big Query 和 AWS Redshift,它们在 Pb 级数据集上提供关系数据库功能。这些解决方案的最大优势是用户无需管理底层硬件,而是专注于最重要的任务,即存储/移动数据和编写 SQL。

这个生态系统中另一个值得注意的参与者是 Snowflake,它提供了一个基于 AWS 环境的预付费数据处理生态系统。

复杂数据

“大数据”的第三个方面是复杂数据。为了解释是什么让数据变得复杂,让我来描述一下理想的数据集是什么样子的。理想的数据集有一个定义好的模式,每个数据类型(字符串、数字、日期)都用一个主键和一个定义良好的数据字典来定义。该数据集中没有重复项,并且该数据集中的所有值都准确无误。

复杂数据代表的是与这一理想截然相反的数据。所有数据集都有一定程度的复杂性,但是,有些数据集处理起来本来就比较混乱。通常,这些复杂的数据集是非结构化的(不遵循行、列结构的数据),不断变化,并且很差或没有文档记录。

示例包括手动输入的表单,如医生的说明、来自博客帖子的书面文本、不断更新的 web 应用程序日志,以及深度嵌套的 XML 或 JSON 文件。

关于复杂数据的一个小提示是,大多数坏数据应该从源头上解决。数据工程师需要建立足够强大的系统来快速捕捉和过滤这些数据集,但是,数据最终应该由数据生产者进行校正。此外,建议尽可能与上游数据生产者达成定义明确的服务水平协议,以限制坏数据的数量,并使数据更易于管理。

解开复杂的数据集,并使它们符合一个结构化和干净的格式需要做大量的工作。每个数据质量问题都需要单独解决,例如重复记录、不存在的主键以及格式错误的字符和字符串。

有许多工具可以帮助理清这些数据。数据科学家和工程师通常使用 Jupyter 笔记本电脑和 Pandas 或 Spark 来处理、分析和可视化这些数据集。Jupyter notebook 为开发人员提供了一个交互式环境,他们可以在其中一行一行地遍历数据集并保存结果,最终节省了大量时间。Databricks 是另一个解决方案,它提供了一个现成的数据分析和处理环境,包括一个强大的 Jupyter 笔记本用户界面、专有的 Spark 功能和易于使用的节点管理功能。

还有第三方工具,如 Trifacta,它通过提供用户界面和现成的功能来自动化一些数据清理任务,并加快清理和分析工作,从而取代从头编写数据清理代码的需要。谷歌云有一个版本的云数据准备工具,作为 GCP 生态系统的一部分提供。

摘要

可以看出,这些挑战中的任何一类都很难解决。然而,大多数公司都在处理这三个问题的变种。这里的挑战变得更加巨大,因为人们必须权衡不同的工具和方法来解决他们的具体问题。

向云计算的转变大大降低了处理和管理大数据的障碍,因为公司不再需要数据中心和大量预算来购买专有软件。然而,很难雇佣到具备理解如何应用正确的工具来解决特定大数据问题的技能的人。

进一步降低使用大数据的障碍的下一步是应用机器学习来自动理解数据的结构并检测数据周围的变化。随着熟练人才成为大数据工作的瓶颈,未来 5-10 年内推出的下一代工具极有可能将围绕这一类别展开。

希望这篇文章为您提供了关于大数据的全面而简洁的概述!

Kubernetes 到底是什么?

原文:https://towardsdatascience.com/what-exactly-is-kubernetes-52c9f1c4990b?source=collection_archive---------6-----------------------

我在 Azure Kubernetes 上部署了一个 web 应用程序,这是一个非常好的旅程,我想告诉你这个有趣世界的所有秘密。

我的 Kubernetes 路线图

自从我在 2015 年末发现 Docker 以来,我对部署可以像源代码一样处理的事实印象深刻。是的,我认为这就是容器填补的空白:制作源代码并提供同样的服务。当您在订单控制器上提交您的更改时,您可以提交托管订单控制器的新服务器。这是一场革命,想想开发人员手动上传文件到生产环境,或者幸运的话用 DevOps 工具移动文件。这开启了新的场景,其中基础架构也是由 DevOps 工具部署的。老实说,并不是所有的应用程序都需要一个点击一下就可以复制的基础设施。这是 Saas 软件的一个需求,但是对于大多数 simples 业务用例来说,这是一个昂贵的附加需求。然而,回到 Docker,仍然需要一些努力来部署和扩展它。我在开发、测试和生产环境中使用了它,不怪 docker。我喜欢它。但是,它需要转换开发人员在开发中使用容器的旧方式,以便在生产环境中获得精益流程的所有好处。我们这样做是为了让大多数开发人员在他们的 PC 上有 docker,可以运行容器或运行“docker-compose up”并使用服务器集群。

这太好了,许多在不同环境中开发的问题或开发人员的设置成本都被砍掉了。生产部署仍然完全由 DevOps 流程管理,那么还有什么呢?在我内心深处,我发现少了些什么。仍然有一些部分困扰着我…拉容器,运行容器,暴露体积,这很好,docker 本身给了我们解决方案,但我缺少一些东西。我不知道当时到底发生了什么,但可以肯定的是。后来有一天我发现了 Kubernetes。有效载荷是“生产级容器编制器”。我不记得当时是什么了,但是相信我……管弦乐队这个词打开了我的思路。我需要一些东西来编排容器,协调它们的工作:Kubernetes 是我所怀念的。自从我在生产环境中测试它之后,开发过程中的摩擦减少了,设置时间减少了,开发工作也减少了。

Kubernets is the revolution in containers!

什么是 Kubernetes

我已经非常肯定地谈到了容器。我希望所有这些容器都是运输和运行我们的应用程序的好方法。在生产环境中,我们也有许多要求,首先,您希望部署时不停机,或者在负载增加时不扩展。也许你会想,如果一个容器倒了,另一个会启动。把 Kubernetes 想象成一个弹性运行分布式系统的框架。它可以满足您的扩展需求、故障转移、部署模式等。

Kubernetes 提供的开箱即用功能:

  • 服务发现和负载均衡: Kubernetes 提供了一个名为“ingress controller”的瑞士工具。它可以由不同的附加组件管理,但基本上,使用 DNS 或 IP 地址公开一个容器。这很酷,因为如果流量很高,Kubernetes 会平衡流量并进行分配。此外,这可以实现 HTTPS 到 HTTP 的机制,这样内部容器就可以用 HTTP 进行通信,而不必担心每个容器上的运输证书。如果你愿意的话,你也可以进行某种 URL 重写,将许多应用托管到一个域中,例如,你可以在 www.mysite.com 的使用 angular SPA,在 www.mysite.com/api/的使用 REST API app
  • 存储协调:如果您还记得 docker 卷的话,这个概念是相同的,但是有所改进。您可以将存储链接到 Kubernetes 集群,然后归咎于容器中的卷。非常酷的是,“存储”可能意味着本地驱动器是一种基于云的服务。
  • 自动推出和回滚:你可以通过在某个地方添加一些 YAML 文件来自动创建容器。你只需要描述你的平台如何伸缩以及你的容器如何相互作用。
  • 自动装箱:最终,Kubernetes 也需要物理资源来工作。这意味着您仍然需要 CPU、RAM 和磁盘来让容器工作。好消息是您可以指定每个容器的资源需求。这将有助于 Kubernetes 在扩展方面做出更好的决策。
  • 自愈: Kubernetes 是容器保姆。他照顾一切。如果容器出现故障,它会尝试替换它。如果容器没有反应,它就杀了他,以此类推。
  • 秘密和配置管理:【Kubernetes 非常好的一点是可以将配置从容器中分离出来。这有点像环境变量,但是更酷。每个配置都可以被全局管理,附加到一个或多个容器。此外,一些称为“秘密”的变量被加密以确保安全。这对于敏感信息非常有用,比如密码、认证令牌或 ssh 密钥。

Kubernetes 不是什么

Kubernetes 是很多好东西,我希望已经明确揭露所有 Kubernetes 的好处。Kubernetes newbie 的主要问题是,他们发现这并不像他们想象的那样是一个 PaaS(平台即服务)系统。Kubernetes 是很多东西,但不是一个“全包”服务。它很棒,减少了工作量,特别是在系统管理员方面,但是除了基础设施之外,它没有为您提供任何东西。

他说,您在完全托管的系统中寻找的大部分东西都在那里:简化的部署、扩展、负载平衡、日志记录和监控。通常,你会从你的主机上得到一个标准配置,但是如果你真的需要的话,理论上你可以自定义它。

Kubernetes 的局限性:

  • 它不限制支持的应用程序类型。所有的东西都被写入容器中,所以每个容器应用程序,无论在技术上,都可以运行。与之相对应的是,您仍然需要手工定义容器。
  • 它不提供自动化部署。您只需将构建的图像推送到 docker 存储库中,仅此而已。如果您已经在持续集成、交付和部署(CI/CD)的过程中工作,这是非常容易的,但是考虑到没有它将是非常棘手的。
  • 它不提供任何应用级服务,只提供基础设施。如果你需要一个数据库,你必须购买一个服务或者在一个专用的容器中运行它。当然,负责备份等等。
  • 大多数与系统的交互都是通过包装 API 的命令行进行的。这非常好,因为它允许自动化每个设置。命令的语法非常简单,但是,如果您正在寻找一个完全由 UI 管理的系统,那么您正在寻找最糟糕的地方。

Kubernetes 如何工作

让我们开始对技术部分进行更深入的研究。现在不是全面概述组件的时候,我也不想吹毛求疵。我的目的是描述最重要的组成部分,并弄清楚所有这些将在本文的后续部分中出现。当然,如果你打算自学 Kubernetes,开始知道你在哪里是一个很大的优势。

吊舱

将 Pod 视为容器的高级抽象。在这个抽象中,pod 可以是一个单独的容器实例或一个组。Pod 由一个或多个容器组成,这些容器共享资源并位于主机上。每个 pod 都分配有一个唯一的 IP 地址,这意味着一个 pod 可以像 docker 环境中的传统容器一样相互通信。pod 内的每个容器可以到达虚拟网络中的所有其他 pod,但是不能深入到其他 pod 上的其他容器。这对保证 pod 抽象很重要:没有人必须知道 pod 在内部是如何组成的。此外,分配的 IP 是易变的,因此您必须始终使用服务名(直接解析到正确的 IP)。像 Docker 容器一样,POD 可以定义可以与共享网络驱动器进行比较的卷。这对于保存数据或在 pod 之间共享文件很有用。

您可以使用 API 或者只是在 shell 上点击命令来管理 pods。

服务

信息学中的“服务”这个名称被滥用了。在 Kubernetes scope 中,把服务想象成你想提供的东西。Kubernetes 服务涉及一组 Pod,可能提供复杂的功能,或者只是用一个容器公开一个 Pod。因此,您可以拥有一个提供 CMS 功能的服务,其中包含数据库和 web 服务器,或者两个不同的服务,一个用于数据库,一个用于 web 服务器。这取决于你。

入口控制器

服务是您可以对外公开的组件。为此,有一个入口控制器做一些类似于负载平衡器的事情。它实际上将来自外部的流量转发给服务。在此步骤中,根据您选择的入口实施,您可以添加 HTTPS 加密,根据主机名或 URL 段路由流量。唯一的服务可以链接到入口控制器,而不是 pod。

默认情况下,Pod 存储是不稳定的。知道这一点很重要,因为在第一次重启时,你会失去一切。Kubernetes 卷允许将容器硬盘的某个部分映射到一个安全的地方。该空间可以在容器之间共享。装载点可以是容器的任何部分,但是一个卷不能装载到另一个卷中。

命名空间

把名称空间想象成使 Kubernetes 成为多租户的特性。名称空间是租户级别的。每个名称空间可以划分资源以隔离服务、入口和许多其他东西。这个特性有助于在应用程序之间进行强有力分离,安全地委托给不同的团队,并在单个基础设施中拥有独立的环境。

秘密和配置

可以通过配置图进行全局配置。这种机制以这种方式工作。首先,您有一个或多个配置清单,然后您将容器的环境变量链接到全局变量。好处显而易见。如果一个变量改变了,你只需要改变它一次。而且对于一些敏感信息,有一个很酷的机制叫做“秘密”。Secrets 变量加密存储在系统中,任何人都无法访问。秘密只被送到需要它的舱里

Kubernetes 即服务

作为每个非系统管理员,我讨厌戴上系统管理员的帽子。或者更好…一切都很有趣,直到事情打破。也许我反应过度了,或者这只是嫉妒,但有一点是神圣的不要做别人的工作。现在有这么多的服务给你免费的 Kubernetes,不使用它是如此愚蠢,我不想谈论它。我们说的不是手工制作的果酱,而是软件。如果可以的话,就从更好的玩家那里买。谷歌、亚马逊、微软、IBM……它们都有自己的 Kubernetes 服务,并且都采用相同的定价模式:来找我吧,所有的 Kubernetes 服务都是免费的,你只需为你要使用的资源付费。许多供应商给你一个免费层或信用试用期,所以很容易开始玩它。我选择 Azure 撰写本文是因为在源代码集成过程中有一些便利,但是您将在本系列文章中学到的大部分内容将适用于所有内容。Kubernetes 即服务的另一个伟大概念是,这不需要您的应用程序与云耦合。由于你的应用程序只是一个原始容器,并且这是由一些符合 Kubernetes 的配置文件编排的,你将能够轻松地从 azure 迁移到 google,反之亦然(至少不需要改变源代码)。

因此,Kubernetes 服务是免费的,你只需为它支付硬件费用,这里的“硬件”指的是 Kubernetes 使用的虚拟机。

带什么回家

Kubernetes 是一个非常棒的平台,可以安全地退出传统的虚拟机保护,转向云。它带来了活力,降低了系统管理员的成本,并提高了服务的质量水平,这是很难保证的。许多传统问题,如网络和数据保护,都可以通过 Kubernetes 本身的高级配置来解决。

我不能说 Kubernetes 适合你所有的项目,但是相信我,如果我告诉你你必须考虑你所有新项目的选择。

准备好下一步了吗?刚刚阅读了如何在实践中使用 Kubernetes 部署 web 应用程序!

觉得这篇文章有用?在 Medium 上关注我(丹尼尔·丰塔尼),看看我下面最受欢迎的文章!请👏这篇文章分享一下吧!

  • Docker 到底是什么?
  • TDD(测试驱动开发)举例说明
  • 无开发者宣言:编写软件的道德方式

学术人工智能研究人员遵循 AlphaStar 的是什么?

原文:https://towardsdatascience.com/what-follows-alphastar-for-academic-ai-researchers-befe0fc66d39?source=collection_archive---------14-----------------------

DeepMind 继续取得进展,但学术界人工智能研究人员的前进道路尚不明朗。

十年前,我向全球人工智能研究人员发出挑战,要他们为《星际争霸 1》打造一个专业级机器人。育雏战争 API 最近发布,学者和专业人士首次可以在竞争激烈的 RTS 游戏上测试人工智能系统。在接下来的几年里,一些人工智能比赛举行了,虽然机器人开始进入更高的等级,但要达到专业水平的游戏还有很大的差距。当 DeepMind 宣布我们将在 2016 年推出星际争霸 2 时,我预计将需要几年的时间来改进现有的方法,并达到专业水平的游戏性。但我错了,AlphaStar 上周展示了深度强化学习可以用来训练一个与职业游戏玩家竞争的机器人。

虽然许多人对比赛的限制表示担忧,神族在一张地图上镜像比赛有很高的 APM 限制,但我预计 AlphaStar 可以通过额外的训练克服这些限制。也有人担心 AlphaStar 是在与一名职业选手而不是星际争霸的大师竞争。无论这种批评是否成立,AlphaStar 能够击败专业水平的玩家这一点仍然成立。鉴于演示的强大效果,我认为星际争霸是一个已经解决的问题,并建议我们转向新的人工智能挑战。

但对人工智能研究人员来说,尤其是在学术界,最大的问题是我们如何在 AlphaStar 展示的进展基础上继续发展?首先,大多数学术研究人员不会获得 DeepMind 可以获得的资源类型:

  • 大规模计算: DeepMind 利用一个 TPU 农场来训练 AlphaStar 玩上百年的游戏。同样,OpenAI 在为 Dota 2 构建 OpenAI Five 时也使用了大量计算资源。
  • 开放 API:deep mind 团队可以接触到暴雪的工程师,确保 API 按预期运行,而 BWAPI 由于被逆向工程而出现问题。
  • 训练数据集: DeepMind 能够在职业选手的匿名回放上进行训练,以引导学习过程。

我之前写了关于 OpenAI Five 与专业人士竞争时的这些限制,尽管 DeepMind 在第二和第三点上有了显著改善,但事实仍然是学术界在资源方面有巨大的劣势。另一个问题是缺乏可用于建设 AlphaStar 进展的材料。例如,直到其他研究人员可以测试他们的机器人与这个系统。

AlphaStar 对人工智能来说是一个巨大的进步,但对于希望致力于大型公开挑战的人工智能研究人员来说,在这些类型的问题上取得进展的最佳机会是离开学术界,加入 DeepMind 或 OpenAI 等公司。短期内这可能不是太大的问题,但它确实为建立长期的人工智能人才管道制造了一个问题。

对于学术界的 AI 研究人员来说,我们需要重新思考我们可以取得进展的问题类型。如果问题可以通过投入大量计算资源来解决,那么对 AI 基准进行增量改进就不再可行。以下是我对从事游戏人工智能研究的学术界人工智能研究人员的建议:

  • 确定较小规模的问题:我把星际争霸作为一项重大的人工智能挑战,因为它有太多的人工智能系统需要解决的问题。虽然这些类型的问题可能是获得资金的有用环境,但较小的挑战也可以取得进展。例如,King 一直在使用深度学习为 Match 3 游戏执行自动化游戏测试,这比《星际争霸》容易控制得多。
  • 构建可复制的人工智能:为了鼓励增量研究,为已发表的论文发布源代码和数据集是很有用的。我采用了这种方法,并为构建顺序预测发布了一个数据集,但没有发布代码。我后来复制了这个作品,写了关于这个过程。
  • 为了评估人工智能系统的性能,经常与人类对手进行测试是很有用的。这是我在论文项目中采用的一种方法,我进行了一项消融研究,其中不同的推理组件被禁用,生成的机器人与人类进行了对比测试,如下图所示。如有必要,确保获得 IRB 的批准。
  • 探索用更少的计算进行学习:强化学习的一个问题是学习策略所需的培训量。研究人员可以在不使用大量计算资源的情况下在这一领域取得潜在进展。
  • 重温迁移学习:早期 RTS 研究探索的方法之一是迁移学习,有 TIELT 等系统。鉴于训练网络需要大量计算,迁移学习似乎是研究人员取得进展的一个好领域。

学术界仍然需要探索重大的人工智能挑战,但解决方案可能来自私营公司。

Testing my bot versus human opponents on ICCup.

我发现 AlphaStar 最吸引人的一点是,随着越来越多的计算投入到问题中,它会继续学习。这并不是说问题很容易,而是说 DeepMind 构建的系统很新颖,并且可以通过额外的经验继续学习,这对 AI 来说是一个巨大的进步。DeepMind 无法解决星际争霸仅仅是因为资源,而是通过巧妙的设计和大规模的计算。我之前在的博客中谈到了 DeepMind 必须克服的一些挑战,其中许多问题似乎都由 AlphaStar 解决:

  • 战争迷雾: AlphaStar 执行类似于职业玩家的侦察行为,不断与对手交战以获取情报。然而,由于 AlphaStar 专注于跟踪者的构建,尚不清楚该机器人是否对对手的构建顺序进行正向推理。
  • 决策复杂性:从演示视频中还不清楚 AlphaStar 如何将建造顺序决策从微观管理中分离出来,但看起来机器人在决定下一步建造哪个单元或结构时会使用尽可能多的信息。AlphaStar 已经通过构建推理系统解决了这个问题,该系统可以很好地处理星际争霸问题空间的分解。
  • 观看演示时需要了解的一件很酷的事情是,AlphaStar 正在对不同的机器人联盟进行训练,这些机器人不断尝试新的策略。这种方法应该有助于游戏中的小变化,但当新地图引入机器人时,可能不会翻译得很好。
  • 奶酪:机器人侦察得很好,并在最初的比赛中派出额外的工人调查侦察单位,这表明机器人可能已经学会适应早期的冲刺策略。然而,奶酪往往是地图特定的,不清楚 AlphaStar 将如何概括。
  • 模拟环境:我的一个假设是,AlphaStar 必须进行正向建模,才能在专业水平上玩游戏,但目前还不清楚机器人是否做了任何明确的规划。这对于职业比赛的目标来说并不是必须的,但我认为这是一个先决条件。
  • 实时: AlphaStar 似乎对游戏性有很好的分解,当意味着一旦进行训练,在任何给定时间采取的行动都不会占用大量资源。

所有这些训练的结果是一个给对手施加很大压力的机器人,并且在整场比赛中表现出不同的策略。但是有一个批评仍然存在,那就是 AlphaStar 正在以一种人类不可能的方式开发单位(潜行者)。这与第一届星际争霸 AI 比赛的结果类似,伯克利的 Overmind 以一种新颖的方式使用了飞龙。虽然当目标是通过图灵测试时,这是一个有效的批评,但这不是我为星际争霸 AI 设定的目标,我希望 DeepMind 正在进行的工作能够超越这一策略。

AlphaStar 是 RTS AI 向前迈出的一大步,我很高兴看到今年暴雪展示了什么。然而,对于学术人工智能研究人员来说,这是人工智能需要巨大计算才能进步的另一个证明。我的建议是探索可以取得进展的较小问题,并在扩大规模之前展示学习和转移学习。

本·韦伯是 Zynga 的首席数据科学家。我们正在招聘!这篇文章是基于我在学术界的经验,不代表 Zynga

你应该使用什么形式的交叉验证?

原文:https://towardsdatascience.com/what-form-of-cross-validation-should-you-use-76aaecc45c75?source=collection_archive---------9-----------------------

优化和机器学习

优化样本外预测误差的正确代理

Photo by Josh Calabrese on Unsplash

C 通过对整个数据集的样本外预测误差进行平均,我们希望交叉验证误差可以作为模型在未知测试数据上表现的代理。如果它作为一个准确的代理,那么我们可以使用交叉验证作为指导来调整模型,以便在一般情况下实现更好的性能。

K 重交叉验证将数据集随机划分为 K 个不重叠的子集。模型被训练 k 次,每个子集依次被排除并用作样本外测试数据。对于较小的 k 值,k 倍的计算成本可能较低,但它具有不吸引人的特性,即它将随机性引入交叉验证结果。

留一交叉验证 (LOOCV)是一种 k 折形式,其中 k 等于数据集的大小。与常规 k-fold 相比,LOOCV 结果没有随机性,因为每个数据点总是被划分到自己的子集。虽然在一般情况下这可能很昂贵,需要模型适合数据集中的每个点,但对于某些模型,如岭回归,LOOCV 可以有效地计算和优化,以找到最佳的模型参数。

如果可行,LOOCV 应优先于其他形式的 k 倍;但是它仍然有一些不理想的特性。让 Xy 代表数据集的 n×p 特征矩阵和目标值。如果 Q 是一个 n×n正交矩阵,则放

假设我们用岭回归模型来拟合数据集。如果 b 代表模型的回归变量,那么 b 在旋转回归问题上的误差与在原始问题上的误差相同

因此,回归问题X’,y’X,y 之间是等价的,然而 LOOCV 对于旋转不是不变的。

此外,当一个特征的方差只集中在几个数据点时,LOOCV 的表现尤其差。在最极端的情况下,假设

当排除第 I 个数据向量(i ≤ p)时,剩余数据集中没有方差来拟合第 I 个回归系数,因此 LOOCV 为

并且独立于正则化矩阵。

广义交叉验证

广义交叉验证(GCV)背后的思想是修改 100c v,以便它是在原始回归问题的旋转上计算的,其中旋转矩阵是以非常特殊的方式选择的,以便 1) GCV 对于原始回归问题的旋转是不变的,以及 2)特征向量的方差在变换矩阵x’⁴.上均匀地“展开”

USV 代表 X 的奇异值分解

其中 S 为矩形对角矩阵 UV 为正交矩阵。让 W 代表一个酉矩阵 (GCV 使用复数旋转)。放

X′y′表示这个矩阵的旋转回归问题。然后

现在,准备

W 的列是 n×n个循环矩阵的公共特征向量,因此对于任意对角矩阵 D

是一个循环矩阵,其形式为

因此,

是对角线上有常数的循环矩阵。另外,对于x′的任意一行,它与x′的其他行的协方差由相同的移位 vector⁵.表示

计算 GCV

γ表示岭回归的正则化矩阵。那么回归问题 Xy 的 LOOCV 可以用 equation⁶有效地计算

在哪里

相同的等式可以用于旋转回归问题X’,y’来计算 GCV,只是我们需要考虑到X’,y’是复数值的事实。那么,GCV 方程就变成了

在哪里

(注意: A 对于旋转是不变的,因此它们保持不变)

我们还可以对 LOOCV 的导数方程进行同样的修改,以计算 GCV 导数,这使得应用优化器来最小化关于γ的 GCV 成为可能。

一个特例

假设我们用单个变量来参数化我们的正则化矩阵γ

那么h′就是的对角线

现在,因为

是一个对角矩阵,由此可见

是循环矩阵。因此,h′是一个常数值向量,等于

或者,由于轨迹对于旋转是不变的,

将其代入 LOOCV 方程,并利用旋转回归问题具有相同误差平方和的特性,单变量正则化的 GCV 为

这是 GCV 最常见的表现形式。但是注意:对于由多个变量参数化的γ的一般情况,这个简化的方程不会计算出正确的 value⁷.

现实世界的问题

我们将在一个示例问题上比较设置正则化参数的不同方法的性能。数据取自 1974 年美国杂志《汽车趋势》,任务是从其他给定的属性预测车辆的燃油效率。我们将在数据的留一交叉验证中比较以下模型:

  • 最小二乘回归
  • RR-LOOCV-1: 通过二阶优化器设置单个正则化参数的岭回归,以最小化训练数据上的 LOOCV 误差。
  • RR-LOOCV-p: 与 RR-LOOCV-1 相同,但对于每个主分量具有单独的正则化参数。
  • RR-GCV-1: 通过二阶优化器设置单个正则化参数的岭回归,以最小化训练数据上的 GCV 误差。
  • RR-GCV-p: 与 RR-GCV-1 相同,但对每个主成分使用单独的正则化参数。

注意:在这个实验中有两个水平的交叉验证。在最高层,我们为每个数据点形成一对训练数据和测试数据来训练模型;在较低层次,岭回归模型对训练数据执行另一个交叉验证,以设置它们的正则化参数。

下表显示了从 best 到 worse⁸.订购的每个型号的 LOOCV 的均方根误差(RMSE)

结论

岭回归是机器学习中最常用的模型之一。通过正确的正则化矩阵,它经常优于最小二乘法。使用优化器,我们可以设置正则化参数来最大化某些形式的交叉验证的性能;但是为了获得良好的样本外性能,我们需要使用交叉验证作为样本外预测误差的准确代理。我们看到了 LOOCV 在某些情况下会有问题,并且有一个不受欢迎的特性,就是它对旋转很敏感。我们引入 GCV 作为旋转不变的替代方案,并通过展开特征矩阵的方差来处理 LOOCV 的问题情况。我们比较了不同岭回归模型在一个示例问题上的表现,发现 GCV 给出了最好的结果。

要找到优化留一交叉验证或广义交叉验证的正则化参数,请查看building block . ai

脚注

[1]:参见如何更好地进行岭回归,了解如何将优化器与 LOOCV 一起使用以找到正则化参数的详细信息。

[2]:请参见https://github . com/rn burn/ridge-regression-doc/blob/master/notebooks/loo cv-rotations . ipynb了解 loocv 如何对旋转敏感的示例。

[3]:GCV 作为 LOOCV 在旋转回归问题上的问题案例和表述摘自

Golub G .、Heath M .和 Wahba G .,广义交叉验证作为选择良好岭参数的方法 (1979 年),《技术计量学》,第 21 卷,第 2 期

[4]:为了使“分散方差”的概念更精确,让 K 表示数据向量的协方差矩阵

其中我们假设 X 的列居中,p 是特征向量的长度。注意到 K 的 Frobenius 范数对于 X 的旋转是不变的;并且在 GCV 旋转之后,协方差矩阵K′是循环的,因此每一列对 Frobenius 范数的贡献相等。

[5]:https://github . com/rn burn/ridge-regression-doc/blob/master/notebooks/gcv-rotation . ipynb验证 GCV 旋转矩阵是否循环

[6]:参见如何更好地做岭回归高效 LOOCV 方程的推导

[7]:参见https://github . com/rn burn/ridge-regression-doc/blob/master/notebooks/gcv-formulas . ipynb单变量 GCV 方程的验证

[8]:完整实验可在https://github . com/rn burn/ridge-regression-doc/blob/master/notebooks/motor-trends-regression . ipynb获得

上升的必然下降

原文:https://towardsdatascience.com/what-goes-up-must-come-down-153a606088d8?source=collection_archive---------28-----------------------

回归均值的意义

Photo by JC Dela Cuesta on Unsplash

1933 年,统计学家 Horace Secrist 出版了一本名为《商业平庸的胜利》的书,他在书中大胆地提出:随着时间的推移,市场竞争导致表现最好的企业变得更差,表现最差的企业变得更好,从而导致平庸的“胜利”。用他自己的话说,

在竞争激烈的商业行为中,平庸往往占上风。[……]这就是工业(贸易)自由带来的代价。

然而,他的结论存在严重缺陷。让我解释一下。

平庸胜利的幻觉

首先,赛克里斯特查看了哪些特定数据?自 20 世纪初以来,他跟踪了数百家企业的收入和支出等绩效指标。例如,他在 1916 年编制了一份 120 家服装店的名单,根据销售额与费用的比率对它们进行排名,并将名单分为六组,最上面的一组代表最好的商店,最下面的一组代表最差的商店。他期望看到的是,随着时间的推移,顶层群体的商店会变得更加成功,反之亦然。

然而,他发现了相反的情况:顶级公司的排名总是会下降,而在接下来的几年里,垫底公司的排名会上升。他在他观察的所有行业中都发现了这种模式。塞克里斯特用市场竞争解释了这种模式:公司会向行业中的佼佼者看齐,并致力于超越他们或窃取他们的一些市场份额,导致第二年表现更差。

听起来合理吗?嗯,这是他推理中的缺陷。塞克里斯特成了我们今天所说的回归谬误的受害者。他观察到的不是竞争性市场力量的结果,而是真正的统计效应,即回归均值

回归平均值

尽管名为回归均值,但它实际上是一种选择效应。这里有一个非常简单的例子。考虑 600 个人扔骰子。其中大约 100 人可能会投 6 分。现在让每个人第二次掷骰子,会发生什么?当然,被选中的 100 个最初的 6 投掷者中的绝大多数现在将投掷一个小于 6 的数字,仅仅是因为它更有可能(即 5 倍的可能性)。你会怀疑是某种神秘的力量导致最初的 6 掷者在第二轮失去了他们的骰子“技能”吗?当然不是。

回到赛克里斯特的企业清单。在他的排名列表中,排名最高的企业是那些投了 6 分的企业:他们做得非常好,部分是因为技能,部分是因为运气。就像掷骰子的人一样,如果大多数顶级企业在接下来的一年里表现得更加温和,我们也不应该感到惊讶。

第一个指出赛克里斯特的错误结论的是数学统计学家哈罗德·霍特林,他指出回归均值可以完全解释结果。用霍特林的话说,

"这本书的主题,如果解释正确,基本上是微不足道的。"

哎哟。霍特林说得更直白,他说塞克里斯特的工作类似于通过将大象排成行和列来“证明”数学乘法规则,然后对各种动物重复同样的练习。

Psychologist and winner of the Nobel Price in Economics, Daniel Kahneman (source)

表扬还是指责?

心理学家丹尼尔·卡内曼讲述了一个故事,当他试图教一群来自以色列空军的飞行教官时,表扬比责备更能有效地促进学习。一名教官不同意这种说法:根据他的经验,表现特别好并随后受到表扬的飞行学员第二次表现更差,而表现特别差并随后受到责备的学员第二次表现更好。对他来说,这证明了责备比表扬更能促进学习。

卡尼曼意识到导师的结论是有缺陷的,因为忽略了回归均值。用他自己的话说,

这是一个欢乐的时刻,在这个时刻,我明白了一个关于世界的重要真理:因为我们倾向于在别人做得好的时候奖励他们,在别人做得不好的时候惩罚他们,而且因为存在回归均值的现象,这是人类条件的一部分,我们因为奖励别人而受到统计上的惩罚,因为惩罚别人而受到奖励。

此处的要点是,预计下一次出色的(积极的或消极的)表现很可能会带来更温和的表现。这是一个数学事实。然而,人类渴望知道事情发生的原因,一种叙事,比如飞行教练的叙事,责备有效,表扬无效。

在《T4 思考,快与慢》一书中,卡尼曼认为我们人类有两种不同的思考“系统”:快速、直觉、类似动物的系统 1 和缓慢、深思熟虑的认知系统 2。记叙文,如飞行教员的表扬/责备解释,是系统 1 处理信息的结果。另一方面,在结果中识别回归平均值需要更为深思熟虑的系统 2。

吓得直哆嗦

这是回归谬误的另一个例子。这个由美国首创并被世界其他国家采用的项目让少年犯参观监狱,在那里他们见到了囚犯,囚犯告诉他们如果他们不停止犯罪行为,将会面临怎样的监狱生活。它受到了政策制定者和家长的高度赞扬,也是 1978 年阿诺德·夏皮罗导演的纪录片的主题。

但是这个项目成功了吗?看起来确实如此:新奥尔良的一个代表性项目发现,在参加了“惊吓直道”后,参与者因犯罪而被捕的次数比以前减少了一半。

Footage from a TV show around the Scared Straight program (source)

但是,再一次,想想回归均值。当然,如果你找一群少年犯,你是在选择社区中表现最差的孩子的样本。这些孩子明年可能会表现得更好一点(或者被抓到的机会少一点),这完全是偶然的。

考虑到回归到平均值所造成的影响,对这个项目进行有意义的评估的唯一方法是随机试验,在这个试验中,你将参加过“恐惧直男”项目的少年儿童与没有参加的少年儿童进行比较。1978 年 4 月,罗格斯刑事司法学院的詹姆斯·芬克诺尔教授是第一个进行这种 T4 研究的人。基于这些数据,他得出结论说,事实上,参加这个项目的孩子比那些没有参加的孩子将来更有可能犯罪。《直吓》的效果与它为设计的效果正好相反。

2000 年,Anthony Petrosino 和他的合作者发表了一份对大量对照研究的荟萃分析,都指向同一个方向。害怕直道根本不起作用。Petrosino 强调了在没有随机试验的情况下评估此类项目的危险性。

再一次,想想卡尼曼的两个系统:“少年儿童如果参观真正的监狱,他们会感到害怕,因此他们会表现得很好”是一个很好的叙事,我们的系统 1 喜欢叙事。它需要更具分析性的系统 2 来实际查看数据并发现真相。这个叙述结果证明是一派胡言。

结论:哪里有随机性,哪里就有回归均值

生活中有些事情,比如象棋,本来就是确定性的,胜负直接反映了一个棋手的技术水平。然而,生活中的大多数事情不像国际象棋,它们包含确定性成分(技能)和随机成分:商业表现、考试分数、逮捕率、心脏健康、运动队的成功或书籍销售都是一些例子。

每当一件事情有随机成分时,它就会向均值回归,这可能会在我们没有意识到的情况下愚弄我们。出色的表现很可能会伴随着更一般的表现,但我们的自动系统 1 总是会很快找到一个简单的故事来解释这种模式。这就是回归谬误。意识到这一点——用你的系统思考 2。

参考

  • 乔丹·艾伦伯格,如何不犯错:数学思维的力量
  • 丹尼尔·卡内曼,思考,快与慢

在我的个人资料页面上找到更多我的故事,例如:

[## 不可能的统计

圣经代码、投资基金、彩票和“看别处”效应的诅咒

towardsdatascience.com](/the-statistics-of-the-improbable-cec9a754e0ff) [## 如何少犯错误

用有限数据预测未来的贝叶斯指南

towardsdatascience.com](/how-to-be-less-wrong-5d6632a08f)

谷歌和 Salesforce 分别收购 Looker 和 Tableau 软件对首席信息官来说意味着什么

原文:https://towardsdatascience.com/what-googles-and-salesforce-s-respective-acquisition-of-looker-and-tableau-software-means-for-3f824c0b32f4?source=collection_archive---------32-----------------------

BI 分析工具领域正在整合,以与微软的业务分析(BA)产品进行竞争,该产品承诺解决整个工作流-数据生成、数据捕获、数据存储、按角色分层的数据访问和数据可视化。为什么?因为数据是新的货币。能够从数据中获利的组织仍将是各自行业的领导者。对相关数据的访问越快,业务决策者的反应就越快,从而推动用户参与、减少用户流失,并构建持续令人愉悦的无与伦比的产品功能。

随着谷歌上周宣布以 26 亿美元收购 Looker,以及 Salesforce 今天宣布以 153 亿美元收购 Tableau Software,一种新的“一站式商业分析工具套件”趋势正在形成。这两家各自的科技巨头都有可能创建一站式云产品,解决从数据生成到数据访问和可视化的整个数据工作流,以与微软的 Azure 和 PowerBI 工作流竞争。而且,还不止于此。我完全期待这三家公司继续开发人工智能和 NLP 驱动的——“问我任何问题,我都会给你一个图表/答案”功能,这将使公民分析师更容易使用数据。

然而,建立像 Capital One 或 Airbnb 那样的数据文化,让每个员工都能“思考数据”和“行动数据”,需要的不仅仅是数据的成熟度。构建数据文化要求下面列出的所有 4 D 都保持一致。

1.数据成熟度:微软的 Azure to Power BI 工作流以及对谷歌和 SalesForce 的收购专注于提供数据成熟度——对单一真实来源的简单、快速、可扩展、用户级访问。

2.数据素养: Tableau、PowerBI 和所有领先的商业分析工具都有一个问题。这是一个低采用率——定义为得到有意义使用的席位/许可证的百分比。对于大多数顶级业务分析工具来说,这一比例在 20–30%之间,即 70–80%的许可证未得到利用或利用不足。你能相信吗?

顺便说一下,我们在这里谈论的工具非常容易使用,具有直观的拖放功能以及“问我一个问题”功能。尽管几乎所有的工具推广都是在工具培训之后进行的,但采用率仍然很低。你知道为什么 BA 工具使用率低吗?

在我与大型成熟组织一起为他们开发数据 DNA 的 7 年多的工作中,我们反复发现低数据素养是低工具采用率的关键驱动因素。数据素养是指读取和使用数据得出有意义的结论以做出决策的能力。许多领导人可能会忍不住在这里过早地说——“哦,我可以提高识字率,让我们给人们一些图表和图形方面的培训。”我见过这种方法失败的例子,即使在与顶尖大学建立战略合作关系,然后推出所有人的必修课(这是“所有人”都讨厌的)之后,公司也没有改变他们的数据素养指数。我自己也是这股潮流的一部分。在早期,我们在为我们的合作伙伴组织建立数据文化方面失败得很惨,但幸运的是,我们很快学会了将这些失败转化为经验,现在我们能够为我们的客户推动成功和转型。我将很快分享我们的经验。

3.数据驱动型领导:与任何其他企业范围的战略计划一样,发展数据文化始于数据驱动型领导。诚然,当我们从任何组织开始时,并非所有的领导者都处于同一水平,但是,当我们完成时,大多数领导者都相信使用数据来推动决策的力量(因为他们已经看到了由数据扫盲计划推动的关键指标的巨大变化),并愿意以身作则-让他们的团队负责,零基础预算,遵循决策制定流程而不是基于“因为我知道”的决策,等等。

4.决策流程:最后,一个成功的数据文化需要一个数据驱动的决策流程,通过数字进行规划、行动和执行、衡量和纠正过程,并回头评估和决定下一组行动。

总之,以下是我对首席信息官在各自组织中推动数据文化的一些建议。

a.数据素养需要分层解决方案 —即不同的工作角色需要不同的数据素养水平。例如,客户支持代理可能只需要成为“数据爱好者”,而索赔分析师则需要成为“公民分析师”。

b.不同的组织有不同的数据素养目标因此,尽管不同组织的数据素养角色可能相似,但推广几乎总是根据客户需求和内部公司文化定制的。

c.发展数据文化是一个变革管理过程,因此必须像对待任何其他文化变革计划一样对待,包括全面规划、分阶段、强有力的沟通、领导者的宣传等等。

d.成功的数据文化转型总是推动顶级财务和客户指标— 在我们所有成功的数据文化推广中,我们一直专注于为顶级团队构建数据印章,同时他们为公司解决顶级战略项目。因此,我们的数据扫盲计划在 9-12 个月内显示出在收入、增长、保留率和盈利能力方面取得了成功,您的计划也应该如此。

对这些科技巨头来说,未来的几个月和几年将会是一段有趣的时光。我预测,超越数据成熟度、实现数据素养和数据文化的商业分析平台将获得巨大的市场份额。首席信息官和首席技术官希望在 2019/2020 年投资数据基础设施,请注意!

Hadoop 怎么了?你现在应该做什么?

原文:https://towardsdatascience.com/what-happened-to-hadoop-what-should-you-do-now-2876f68dbd1d?source=collection_archive---------2-----------------------

拼接机的蒙特·兹韦本和赛义德·马哈茂德

Apache Hadoop 于 2006 年出现在 IT 领域,承诺为组织提供使用商用硬件存储前所未有的数据量的能力。这一承诺不仅解决了数据集的规模,还解决了数据的类型,例如企业越来越有兴趣分析的物联网设备、传感器、服务器和社交媒体生成的数据。数据量、速度和多样性的结合通常被称为大数据。

读取模式在 Hadoop 的流行中发挥了至关重要的作用。企业认为他们不再需要担心定义哪些表包含哪些数据以及它们如何相互连接的繁琐过程,这个过程需要几个月的时间,并且在完成之前没有一个数据仓库查询可以执行。在这个勇敢的新世界中,企业可以在基于 Hadoop 的存储库中存储尽可能多的数据,这些存储库被称为数据湖,并担心以后如何分析这些数据。

企业中开始出现数据湖。这些数据湖是通过商业大数据分发实现的,商业大数据分发是一个平台中支持的许多独立的开源计算引擎,这些平台将为数据湖提供动力,以不同的方式分析数据。最重要的是,所有这些都是开源的,可以免费尝试!什么会出错?

读取模式是一个错误

与生活中的许多事情一样,Hadoop 被吹捧为其优势的特性也成为了它的致命弱点。首先,随着写模式限制的解除,数 TB 的结构化和非结构化数据开始流入数据湖。由于 Hadoop 的数据治理框架和功能仍在定义中,企业越来越难以确定其数据湖的内容及其数据的血统。此外,数据还没有准备好被消费。企业开始对数据湖中的数据失去信心,慢慢地,这些数据湖开始变成数据沼泽。“构建它,它们就会到来”的读取模式哲学失败了。

Hadoop 复杂性和胶带式计算引擎

其次,Hadoop 发行版提供了许多开源计算引擎,如 Apache Hive、Apache Spark 和 Apache Kafka,仅举几个例子,但这被证明是一件好事过多的情况。一个恰当的例子是,一个商业 Hadoop 平台由 26 个这样的独立引擎组成。这些计算引擎操作起来很复杂,需要专门的技能来将它们连接在一起,这在市场上很难找到。

错误的焦点:数据湖与应用程序

第三,也是最重要的一点,数据湖项目开始失败,因为企业优先考虑将所有企业数据存储在一个中心位置,目标是让所有开发人员都可以使用这些数据——如果你愿意,这是一个 uber 数据仓库,而不是考虑数据将如何影响应用程序。因此,Hadoop 集群经常成为企业数据管道的网关,用于过滤、处理和转换数据,然后将这些数据导出到其他数据库和数据集市,以便向下游报告,并且几乎从未在运营结构企业中找到真正的业务应用程序。因此,数据湖最终成为一组庞大的不同计算引擎,运行不同的工作负载,共享相同的存储。这很难管理。这个生态系统中的资源隔离和管理工具正在改进,但它们仍有一段路要走。所有这些复杂性—只是为了报告。

在大多数情况下,企业无法将注意力从将数据湖用作廉价的数据存储库和处理管道转移到消耗数据和驱动任务关键型应用程序的平台上。举个例子,Apache Hive 和 Apache Spark 是 Hadoop 数据湖中使用最广泛的计算引擎。这两个引擎都用于分析目的,要么处理类似 SQL 的查询(Hive),要么执行类似 SQL 的数据转换并构建预测模型(Spark)。这些数据湖实现没有充分关注如何在应用程序中操作性地使用数据。

未来战略

因此,如果您的组织担心 Hadoop 生态系统的最新发展,并且在展示数据湖的价值方面面临越来越大的压力,您应该首先关注运营应用程序,然后再研究数据。

Photo by Tiago Gerken on Unsplash

通过专注于应用程序的数据和智能现代化,您将最终获得能够利用数据根据经验预测未来可能发生的事情的应用程序,并在产生卓越业务成果的时刻主动做出决策。以下是成功的应用程序现代化战略的五个要素:

  1. 选择一个需要现代化的应用:首先,选择一个你想要现代化的应用,而不是集中精力集中数据。这方面的主要候选是许多定制应用程序中的一个,这些应用程序已经落后于市场,需要变得更加敏捷、智能和数据驱动。一旦您确定了可以为您的组织带来竞争优势的应用程序,那么您就可以专注于获取支持该应用程序所需的数据,以及是否可以从数据湖中获得该数据。
  2. 使用横向扩展 SQL 实现您的应用程序现代化 : SQL 多年来一直是企业中工作负载的主力,您的组织中有数百名开发人员、业务分析师和 IT 人员完全熟悉 SQL,无需花费额外的时间、费用和风险将您的原始 SQL 应用程序重新编写为低级 NOSQL API。选择一个平台,使您能够保持熟悉的 SQL 模式和强大的功能来更新应用程序,但要在一个可以在廉价基础架构上弹性扩展的架构上进行。横向扩展将整个集群的能力用于计算,比在集中式系统上运行的旧 SQL 系统快得多。借助横向扩展,您可以添加更多容量,也可以随着工作负载的变化而减少容量。
  3. 采用一个 ACID 平台 : ACID 合规性是一种机制,通过这种机制,事务保持数据库的完整性,并允许用户执行提交和回滚等操作。这是支持操作应用程序的一个关键功能,因为它确保了在发出 commit 之前,数据库不会对其他人进行更改。选择一个在数据库中的单个事务级别提供 ACID 功能的平台。否则,所有这些一致性问题都需要在应用程序代码中处理。所有传统的 SQL 系统都是 ACID 兼容的。数据湖错误地丢弃了这一点,使得应用程序很难编写。
  4. 统一分析引擎:根据最近 Gartner 博客的报道,从历史上看,将 IT 基础设施分为运营(OLTP)和分析(OLAP)组件是有充分理由的,但现在不再是这样了。ETL 用延迟扼杀了我们的 SLA。过去的情况是,运营和分析工作负载相互干扰,您必须将它们分开。此外,遗留数据平台的性能很差,我们不得不将操作模式转换为更适合分析工作负载的星型模式或雪花型模式。不再需要这个 ETL,您可以在操作平台上运行分析,通常使用操作模式。通过实施该平台,您将确保您的应用程序运行在一个最大限度减少数据移动且不会增加应用程序延迟的平台上。与昨天或上周的数据相比,这可以提供您当前的见解、报告和仪表盘。
  5. 嵌入本机机器学习:使您的应用程序现代化的主要原因之一是将 AI 和 ML 注入其中,以便它可以从经验中学习,动态适应变化,并做出即时决策。为了使您的应用程序智能化,选择一个在数据库级别内置机器学习的平台至关重要,这样模型就可以随时使用更新的数据进行实验、训练和执行。

这从根本上说是一种不同于迄今为止您使用的数据湖的方法。这种方法通过现在可以利用数据湖的应用程序,更快地向业务线交付有形的业务价值。

这种方法将确保除了使为您的企业提供竞争优势的应用程序现代化之外,您还可以保护您在数据湖中的投资。

如果您想免费尝试一个具有嵌入式分析和机器学习的横向扩展、ACID 兼容的 SQL RDBMS 示例,请单击此处的。

当我尝试用机器学习进行市场预测时,发生了什么

原文:https://towardsdatascience.com/what-happened-when-i-tried-market-prediction-with-machine-learning-4108610b3422?source=collection_archive---------1-----------------------

Image by Pexels on Pixabay

就在你开始第一个基本回归或分类模型的时候,它至少会出现在你的脑海中。大量的时间序列数据,加上年轻时退休的可能性,就像在你祖父的阁楼里找到一张旧藏宝图一样,有着不可抗拒的吸引力。你怎么能不想呢?可以用机器学习预测市场吗?

我至少得试一试。以下是我所做的,以及我所学到的。

网上有很多小规模的教程,是一个很好的起点。他们向你展示如何拉下一只股票的历史,也许计算一些指标,并将其输入回归算法,并试图预测第二天的价值。或者,他们使用一个分类器来预测股票是上涨还是下跌,而不预测价值。

对于下一步该怎么走,我有两个想法。首先,我想做大。我的理论是,一些股票、货币和金融指标之间可能存在隐藏的关系,这些关系太微妙了,肉眼无法发现。我想机器学习算法也许能把它们挑出来。

第二,我不会选择我想预测的股票。我打算为它们训练模型,看看哪些股票表现最好。我的想法是,有些公司可能比其他公司更容易预测,所以我需要找到它们。

我首先下载了标准普尔 500 大部分股票的历史,一堆货币价值历史,和几十个金融指标。一个 Python 脚本负责将它们转换成一致的格式,填充缺失的值,并删除至少不能追溯到 2000 年代早期的时间序列。总之,当尘埃落定时,我在一个包含 18 年数据的漂亮的 Pandas 表中有一千多列。

一旦完成,我使用优秀的 TA-lib 库为 5 天、10 天和 30 天的窗口计算每个时间序列的一系列指标。我没有金融背景,不知道哪些会真正增加价值,所以我采取的方法是增加一大堆,然后让模型把它们分类。这使得列数激增。数据集已准备好输入到超过 32000 列的训练模型中。

我选择 XGBoost 作为我的算法,是因为它的整体性能,以及能够很容易地看到模型使用哪些特性来进行预测。我将它设置为遍历数据集中的所有股票,为每只股票训练两个模型。第一个是分类器,它可以预测股票第二天是涨还是跌。第二个是回归模型,预测第二天的收盘价。

对于每个模型,我用 95%的可用数据训练它,然后用剩下的数据进行验证测试,模拟它从未见过的股票数据。剩下的 5%大约是 3 个月的交易数据。任何机器学习模型都将在预测它接受训练的数据方面做得很好——诀窍是让它更通用,并在它从未接触过的数据上表现良好。

对于验证运行,开始时模拟投资 1000 美元。如果预测股票会上涨,它就买入;如果预测会下跌,它就卖出。没有考虑交易成本,因为我想看看没有交易成本的结果是什么样的。

我开着我的杰特森 TX2 全速跑了一个月。

它发现了什么?

不出所料,对于大多数股票来说,结果很糟糕——准确性比扔硬币好不了多少。不过,有一些似乎在验证数据上表现得非常好。相当多的人在 3 到 6 个月内将我的模拟资金翻了一倍或两倍,有几个人在这段时间里获得了 20 倍的利润。事实证明,图表可以让你的心跳加速。谁知道呢?

请记住,这是该算法以前从未见过的数据-最后 5%被排除在训练数据集之外。

Top is stock closing price, bottom is cash. Dips to near zero are buys.

我找到了吗?有没有一些股票与市场指标微妙地联系在一起,从而可以被预测?如果是这样,我可以从价格波动中赚钱。

当我编写代码并运行它的时候,已经过了几个月,因为我下载了我的巨大数据集。我更新了它,加入了最近的交易数据,并决定看看这些模型在这段时间内会做些什么。他们在验证过程中做得很好——如果我在过去几个月里与他们进行实时交易,他们会做得一样好吗?这时候我变得非常兴奋。

结果令人困惑,令人沮丧。在最初的训练和验证运行中表现出色的模型可能在以后的数据运行中表现良好,但也可能会严重失败,烧掉所有的种子资金。一半时间模拟会赚钱,一半时间会破产。有时候,这比抛硬币好几个百分点,而其他时候,情况会糟糕得多。发生了什么事?它看起来很有希望。

吸取的教训

我终于明白我做了什么。

如果股票价格是随机游走,那么 50%左右的结果正是你所期望的。通过让我的程序在数百只股票中寻找它做得好的股票,它确实偶然发现了一些它碰巧在验证时间框架内预测得好的股票。然而,仅仅几周或几个月后,在随机漫步的另一个片段中,它失败了。

没有微妙的潜在模式。这个模型有几次完全是因为运气好,我就挑了这些例子。这是不可重复的。

因此,机器学习不是魔术。它不能预测随机序列,在训练模型时,你必须非常小心自己的偏见。仔细验证至关重要。

我确信我不会是最后一个被阁楼上的旧藏宝图召唤的受害者,但是要小心。如果你想学习的话,可以玩的随机时间序列要少得多。仔细模拟、验证,并意识到自己的偏见。

最初发表于【http://shortcircuitsandinfiniteloops.blogspot.com】

通过分析 50 万个数据点,我发现了机会区域

原文:https://towardsdatascience.com/what-i-discovered-about-opportunity-zones-from-analyzing-half-a-million-data-points-3dd5a9eebb97?source=collection_archive---------42-----------------------

最近有很多关于机会区的讨论,这是可以理解的;这是联邦政府为低收入城市和农村人口普查区创造长期投资的最新举措。一旦被指定为合格的机会区,这些地方就能够通过专门为投资这些地区而设立的机会基金获得投资。

然而,尽管美国 12%的人口普查区域中共有 8700 个机会区,但令人惊讶的是,几乎没有分析来确定投资的“理想”区域。迄今为止发表的许多文章包括推荐美国主要大都市地区的前 10 名名单,任何人都可能猜到,这似乎是对大量地区被选为合格机会区的一种伤害。

我的分析试图为基于 5 个经济指标的所有机会区开发一个排名系统,并查看是否有通常不讨论的高于平均水平的增长领域。我相信结果表明,美国有许多机会区在所有 5 个指标上都排名很高,其中许多实际上并不位于沿海地区。

总的来说,我们发现美国东北部和南部地区的整体表现最好,而中西部和西部地区的表现明显好于其他类似地区。我们还发现,失业率和自有住房的中值是我们数据集中最大的差异,排名偏差几乎是其他 3 个指标的两倍。

疯狂的方法

从一开始,我就采用了一种更具分析性的方法来考察机会区域,并确定是否有潜在的高度可取的投资领域未被发现。首先,我选择从美国人口普查局发现的 5 个数据集提取 5 年(2011-2016)的估计值:

  1. 总人口
  2. 16 岁及以上人口的失业率%
  3. 房主自住住房的中值
  4. 合同租金中位数
  5. 过去 12 个月的家庭收入中位数(HHI)

在此分析中,每个数据集的重要性是未加权的,这意味着每个普查区域的所有 5 个排名在每个机会区域的最终“排名”中同等重要。对属性进行加权和/或调整所包含的属性可能会导致完全不同的结果。根据所检查的属性,确实有许多机会区显示出这些属性的有利趋势,这些机会区可能存在于整个美国。

结果呢

提取数据后,我为每个属性的每个机会区域指定了一个等级,8,700 为“最好”,1 为“最差”。一旦每个机会区域都有了所有 5 个属性的等级,我将所有 5 个等级平均为每个机会区域的“总平均等级”:

在对所有的机会区域完成这些操作后,我想看看它在地图上的样子。由于人口普查区域在地理上非常小,我将结果汇总到美国各县,这将数据集减少到看起来更合理的 2000 个左右的点。结果是:

看着这个图像,我们可以看到……嗯,什么都没有。有太多的事情正在发生,无法从这张地图中获得有意义的见解。看到这一点也让我质疑缺乏考虑的区域性——“最好的”人口普查区域可能会受到邻近地区 5 年时间框架内的经济趋势的影响。

在此基础上,我编写了代码来自动将相似地区的人口普查区域组合在一起。K-means 聚类是实现这一点的一个很好的方法,在阅读了卡尔·安德森关于加权 K-means 分析的帖子后,我将它应用到我的用例中。我的目标是使用每个机会区域的“总平均等级”来影响每个聚类的中心在地图上的位置。

用 Carl 的例子来解释,如果地图上有 4 个点,其中一个点的“总平均排名”比其他点高得多,那么创建的新点将倾向于排名最高的点:

Unweighted vs. Weighted

我需要做的最后一件事是弄清楚我想要创建多少个“集群”。确定簇的“正确”数量在很大程度上仍然是一门艺术而不是科学,依靠人对问题的知识和定性的洞察力来确定理想的数量。我选定了 25——它提供了视觉消化性的最佳权衡,同时也将美国均匀地分割成足够大的区域,以产生宏观的区域洞察力。这里是一个覆盖了 Voronoi 可视化的最终输出,以更好地“显示”区域是如何划分的:

所以我们现在只剩下地图告诉我们两件事:

  1. 8700 个机会区如何划分为 25 个区域
  2. 每个区域的中心点向高排名机会区的集中加权

为了提供更多的背景信息,下面是每个聚类的总体评分和每个数据集分析的最终细目分类,等级越高表示“最好”:

分析中有许多有趣的见解,总结如下:

  • 在最高水平上,东北部和南部地区(美国人口普查定义的)的整体表现最好(平均 4683),中西部和西部地区平均排名约为 4216
  • 尽管地区平均水平较低,中西部和西部声称在地图上排名前 3 位的集群(10/4/5),平均排名几乎是表现最差的集群区域的两倍(15/18)
  • 影响排名的最重要因素似乎是失业率——第 5 类和第 10 类的失业率分别为 8.56%和 6.65%,几乎是所有 25 类平均失业率(13.70%)的一半
  • 群组 4 和群组 5 的平均 5 年人口增长率也最高(0.46%和 0.58%),而所有群组的平均增长率为 0.16%
  • 第 4 类也有最高的自有住房中值,为 1.10%,这更令人印象深刻,因为 13 类都有负值升值,最低的是第 18 类(-2.22%)
  • 集群 10 中的 HHI 中值增长最快,为 1.02%,轻松超过第二好的集群(南部的集群 9,为 0.58%),几乎是所有集群平均值(0.26%)的 4 倍
  • 集群 4 的平均合同租金涨幅最高(1.53%),紧随其后的是集群 8/10/9/11(均在 1.32-1.22%之间)。
  • 将这些发现与其他数据集(如美国主要城市)叠加,可以了解主要大都市对每个地区“中心”的影响程度。例如,集群 6 的中心几乎直接落在凤凰城的顶部,尽管周围有大片区域符合机会区的条件。

Opportunity Zone regions(left) vs cluster w/ major city pops in orange (right)

查看各州的综合统计数据,我们还可以收集各州选择指定机会区的不同策略。例如,下面的图表显示了每个州的机会区域的数量(Y 轴)以及每个州的“总平均排名”(X 轴)。一半的机会区位于 8 个州内(加利福尼亚州/纽约州/德克萨斯州/佛罗里达州/伊利诺伊州/俄亥俄州/宾夕法尼亚州/密歇根州),这些机会区往往高度集中在这些州内的主要城市周围。美国中西部各州倾向于选择更少的机会区,尽管与沿海地区相比,机会区的面积更大。东南部地区倾向于在城市和非城市地区跨州选举大量的地区。

Histogram per state of count of Opportunity Zones (Y-Axis) and Total Average Rank (X-Axis)

像纽约这样的州也惊人地集中了大量的高评级区域,如上图中的倾斜所示。总的来说,ND 和 WY 是排名最高的地区,而 IL 和 NV 的排名最低。

…更多数据和地图?!

最后,本文有意简要介绍了生成最终数据集的技术步骤。管理数据集中的缺失数据(插补)、创建等级、聚类汇总等步骤。,但它们是最终分析的主要组成部分。如果有足够的兴趣,我很乐意在未来的帖子中深入探讨这些机制。同时,我在下面提供了一个交互式 ARCGIS 地图,以便您进一步探索聚类和其他数据集图层,从而为进一步分析提供一个切入点!

带 VORONOI 和图层的交互式 ARCGIS 地图 http://arcg.is/1zu14z

构建成功的 AI PoC 后我学到了什么

原文:https://towardsdatascience.com/what-i-have-learned-after-building-a-successful-ai-poc-3bd24efea4e2?source=collection_archive---------18-----------------------

Source

我最近完成了一个已经投入生产的人工智能概念验证,我想分享一下我所学到的如何提高人工智能概念验证的机会。

只有少数公司开始了他们的人工智能之旅。事实上,基于人工智能的解决方案仍处于早期阶段。因此,决策者通常倾向于首先依赖 PoC。冷酷的事实是,它们中的大多数都没有进入生产阶段。

简而言之,概念验证的目标是测试是否值得在技术解决方案上投入时间和金钱。不用说,构建一个 AI PoC 很难,因为它需要大量的技能。

在实施人工智能以获得竞争优势的竞赛中,公司执行的概念验证的数量不断增加。人工智能行业可能预示着非常高的“成功率”。然而,当我们看到已经成功转化为产品的概念验证的数量时,这些数字和观点并不那么明显。

根据我的经验,我可以告诉你,POC失败主要是因为以下原因:

公司需要人工智能概念证明

我注意到,大多数公司仍然没有足够的内部人工智能技能。事实上,对于处于人工智能之旅早期阶段的公司来说,这无疑是最大的挑战之一。

此外,人工智能工作流可能会变得技术性,公司将不得不应对一系列与硬件、数据安全和大量新数据相关的问题,以进行训练。因此,相当多的公司会倾向于外包人工智能解决方案的开发。

对于公司来说,评估模型效率和人工智能解决方案成熟度的最便捷方式是首先依赖概念验证。一次成功的概念验证并不能保证解决方案能够扩展,但这是一个良好的开端!

PoC 将涵盖许多元素。它涉及数据科学家使用训练数据和管理参数来进行迭代测试运行。通过这种方法,数据科学家和技术团队可以在分派模型进行更广泛的培训和调整之前,检查模型的初始准确性。

训练和调整人工智能模型的过程是人工智能工作流程中计算最密集的部分。作为这一过程的一部分,数据科学家在处理与基础架构管理相关的传统 IT 问题时,会根据可用的训练数据确定他们的模型在哪些参数下收敛最有效。

在开始 AI PoC 之前

我见过太多 AI PoCs 因为各种原因失败。首先也是最重要的一点,我建议公司确保成功的重点是价值证明和与公司战略的一致性。找到合适的执行发起人并让他们参与进来至关重要。概念验证的目的是让愿景成为现实,并克服困难,让决策者相信这一愿景是有帮助的。

以下元素可用作公司决策者考虑 AI PoC 的清单:

这可能是显而易见的,但你应该怀疑你的项目在技术上是否可行。我建议你咨询专家来验证项目的整体复杂性。在我最新的项目中,我们认为深度学习将帮助我们识别特定的包装,但这并不那么容易……其次,对 AI 开发的投资往往只是整体解决方案的一部分,组织应该计算解决方案的总成本(包括运行成本)。

在构建 PoC 时,确定业务价值是关键。例如,这个解决方案将如何改善你的品牌形象?我个人认为,如果商业价值很小,那么我会建议看看非 AI 选项,因为尝试机器学习或其他 AI 子领域的成本相当高。

概念验证与您拥有的数据一样好。你有足够的数据吗?你能用这些数据吗?等等。简单来说,如果你没有数据或者它的质量需要提高,那么你应该推迟你的 AI 项目,甚至在考虑一个 AI PoC 之前。

不要期望概念验证达到 100%的准确率。决策者需要提前知道什么样的准确度足以说服他们继续进行概念验证。我的经验表明,概念验证的准确性水平不应该太高,这在很大程度上取决于项目的性质。准确性的水平也与投资水平有关...
概念验证的目的是产生附加值。您不能试图让模型达到部署它所需要的可信度。

对于我最新的项目(使用迁移学习识别包装的深度学习),我们花了大约 5 个月的时间达到 85%的准确率,我们不得不使用数据增强技术,因为公司无法为我们提供足够的数据。

PoC 项目需要一个多元化的团队。为了优化您的 PoC 成功机会,我建议决策者建立一个由技术和业务专家/用户组成的多元化团队。人工智能开发不可能不涉及终端用户。我从来没有见过一个人工智能概念验证不需要因为商业专家和数据科学家之间的讨论而改变方法。

成功的概念验证需要时间。通常,我们在这样的项目中使用敏捷技术。决策者往往会低估交付特定 PoC 所需的时间。

所有的概念验证都是不同的,但是一个普通的概念验证项目需要大约 1-2 个日历月才能完成。

确定一个人来弥合决策者、数据科学家和最终用户之间的差距。事实上,从技术角度来看,人工智能需要在选择算法、配置和调整网络、提高数据质量、优化基础设施和验证结果方面进行实验。然而,一个成功的概念验证还必须涉及多个利益相关方。我意识到,有一个项目经理可以缩小这些不同项目成员之间的差距,促进合作,这是一个真正的项目附加值。

构建可靠的概念证明

再次,确保你的商业案例可以通过使用机器学习或任何其他人工智能子领域来解决。我的意思是,数据科学家可以从他们处理的数据中找到相关模式,并从中做出足够好的预测或聚类模型。

所有的概念证明都是不同的,但是一个普通的概念证明项目大约需要 1-2 个月才能完成。

在我看来,对概念验证进行深度投资是没有意义的。在某些情况下,使用现成的算法、查找开源训练数据、购买样本数据集、创建自己的功能有限的算法和/或标记自己的数据就足够了。

目标是找到对你有效的方法来证明你的项目将实现公司的目标。

最终,一个成功的 POC 是获得项目其余部分资金的必要条件。

我建议你从收集所有你怀疑有能力完成任务的数据开始,选择那些在大多数情况下能够自给自足的数据

我意识到,在一个人工智能项目中,很容易变得贪婪,并考虑包含大量输入的解决方案:例如,用户的位置可能会让我洞察他们的下一次购买是什么。现实情况是,很容易迷失在混合不同意义/性质的各种输入中,最终什么也没有提供。

在构建您的 AI PoC 时,关注简单、自给自足的输入。

PoC 的成功在很大程度上取决于您所掌握的数据。随着你进一步训练你的算法来提高准确性,复杂度将会不断上升。使您的系统投入生产所需的模型准确性的预期改进将需要大量的新训练数据。

扩展成功的人工智能概念验证概念验证

PoC 通常通过做出某些假设来简化解决方案:

构建 AI PoC 只是开发的一个方面。例如,要将机器学习模型投入生产,您需要花时间构建 PoC 本身不需要的组件,如 API 或重新训练模型的过程等。您还需要确保模型在客户子集上的性能可以推广到更广泛的人群。

基础设施在这类项目中很重要。在低于标准的基础架构上和与生产环境不一致的环境中执行的概念验证很少在实际项目部署期间得到扩展。

最后,你需要为最终用户建立一个接口,潜在地与人工智能交互,并将你的人工智能组件与公司更广泛的基础设施集成,因为其他服务将必须收集输入,发出 API 请求,等等。

走向生产

更高的精度需要更多的数据……

在人工智能开发中,我可以提到很多可能的问题,但我想集中讨论其中的几个。让我们假设,根据您在项目早期定义的标准,您的 PoC 是成功的。实际上,让我们想象一下,您使用预先标记的数据的概念验证使您的模型达到了 70%的准确率。你能考虑上线一个只有 70%准确率的解决方案来展示你的品牌吗?很多时候,决策者会因为显而易见的原因而拒绝。因此,团队必须想出一个如何达到更高精确度的计划。嗯,答案往往是一样的……更多的训练数据!

决策者倾向于认为,如果我们在两个月内达到 70%的准确率,那么我们只需要几周就可以达到可以接受的程度(大约 95%)。这是一个错误,因为事实是模型对训练数据有贪得无厌的胃口,从 70%到 90%的准确率可能需要更多的训练数据才能达到最初的 70%。需求成指数增长,显然更多的时间意味着需要更多的钱来资助项目。

还有不断出现的边缘情况,每种情况都需要训练数据。

正如我们所见,数据的缺乏对公司来说是一个巨大的挑战。然而,其他陷阱也确实存在,比如偏见。

机器学习偏差,也称为算法偏差或 AI 偏差,是一种由于机器学习过程中的错误假设而导致算法产生系统性偏差的现象

事实上,你的团队监控并消除训练数据中的任何样本、算法或偏见是非常关键的。在这一步,我建议您依靠敏捷实践来尽早识别这些事情并做出调整。

最后,我想提一下一个 AI 项目的成本。这不应该是一个惊喜,但人工智能团队和训练数据的过程是昂贵的。我很少见过在上线前不需要额外预算的项目… 我们越接近生产,你需要额外预算的机会就越大。就我而言,与最初的预算相比,经常会有 10-20%的额外预算。

虽然人工智能概念验证通常需要相当大的预算,但要获得批准会有一些障碍,利益相关方可以设计一种机制,让解决方案提供商对成功负责并获得奖励,而不是让组织承担前期投资的负担。

虽然并非所有 POC 都能成功地在实际环境中复制项目,但利益相关方(包括公司和解决方案提供商)之间的协作可以确保 POC 实现预期的投资回报(ROI)。

公司必须努力避免概念验证陷阱。对我来说,这是一个公司建立奇妙的原型来评估它们并开始投资人工智能,但却无法部署它们的时刻,因为它没有合适的基础设施、业务流程或文化来支持它。

不幸的是,当决策者没有看到人工智能集成的全貌时,就会发生这种情况。在我看来,在花了无数时间工作和改进人工智能之后,该公司发现在实施人工智能解决方案之前,它需要首先升级基础设施。

不用说,在开始 AI PoC 之前,您的公司需要支持实验、质疑、支点、学习和失败。

我希望这篇文章能够帮助您更好地理解如何让 AI PoC 取得成功。如果你有问题,我很乐意帮助你。

我从(两届)卡格大师阿布舍克·塔库尔那里学到了什么

原文:https://towardsdatascience.com/what-i-learned-from-abhishek-thakur-4b905ac0fd55?source=collection_archive---------13-----------------------

从 Abhishek Thakur 的 NLP 内核中汲取灵感

Photo by Georgie Cobbs on Unsplash

快速简历

Abhishek Thakur 曾在遍布德国的多家公司担任数据科学家,他在 NIT Surat 获得了电子工程学士学位,在波恩大学获得了计算机科学硕士学位。目前,他拥有挪威 boost.ai 首席数据科学家的头衔,这是一家“专门从事对话式人工智能(ai)的软件公司”。但我印象最深的是阿布舍克的影响力。

你可以点击这里访问他的简介。以下是他所获荣誉的快照:

  • 比赛特级大师(17 枚金牌和空前的世界排名第三)
  • 内核专家(他属于 Kagglers 的前 1%之列)
  • 讨论特级大师(65 枚金牌和空前的世界排名第二)

我想看看 Abhishek 的教程,在 Kaggle 上接近(几乎)任何 NLP 问题。我选择 Abhishek 的这个内核是因为我自己一直在试图学习更多关于自然语言处理的知识,我怎么能拒绝学习 Kaggle 的万圣节主题幽灵作者数据集呢?

Abhishek 的自然语言处理方法

我强烈建议您阅读这篇关于内核的文章。如果你真的想更牢固地掌握 NLP 或一般的数据科学,确保你理解 Abhishek 的每一行代码,在你浏览他的内核时自己写。

只是我们不要忘记——我们的任务是确定作者(EAP——埃德加·爱伦·坡;HPL—h . p . love craft;MWS——玛莉·渥斯顿克雷福特·雪莱)。

1。探索数据和理解问题

在导入必要的 Python 模块和数据之后,Abhishek 对数据调用 head()方法来查看前五行是什么样子的。由于 Abhishek 是专家,这是一个 NLP 问题,与涉及数字数据的问题相比,探索性数据分析(你最常看到的是 EDA)是肤浅的。数据科学新手可能会从更彻底的 EDA 中受益。对数据的深入研究可以发现任何缺失的值,让您知道需要清理多少数据,并帮助您在问题的后期做出建模决策。

Abhishek 还提醒我们,我们正在处理一个多类文本分类问题。不要忘记我们正在努力实现的目标,这总是一个好主意!他注意到 Kaggle 将使用什么评估标准来对提交的内容进行评分。对于这场比赛,Kaggle 使用多类对数损失来衡量提交模型的性能。理想情况下,我们的多类分类模型的对数损失为 0。如果你感兴趣,这里有更多关于原木损耗的内容。

2。预处理

接下来,Abhishek 使用 scikit-learn 中的 LabelEncoder()方法为每个作者分配一个整数值。通过用整数值(0,1,2)对 author 列中的值的文本标签进行编码,Abhishek 使数据更易于他的分类模型理解。

作者标签进行编码后,Abhishek 使用 scikit-learn 中的 train_test_split 将数据分成训练集和验证集。他选择 90:10 的训练/验证分割(Python 数据科学中最常用的分割通常在 70:30 到 80:20 之间)。所以他打算用数据集中 90%的句子来训练模型,然后他会用剩下的 10%的数据来评估他的模型的准确性。

3。建立模型

在创建他的第一个模型之前,Abhishek 对数据使用了 TF-IDF(术语频率——逆文档频率)。TF-IDF 将对出现在文本列的句子中的单词进行加权。因此,TF-IDF 将帮助我们理解当我们试图确定哪个作者写了一个特定的句子时,哪些词是重要的——诸如“the”之类的词对于分类任何作者来说都不重要,因为“the”出现频率很高,不会透露太多信息,但是,例如,“Cthulhu”之类的词在分类 H.P. Lovecraft 所写的句子时将非常重要。更多关于 TF-IDF 的信息可以在这里和这里找到。

对数据运行这个 TF-IDF 是特征提取的一种形式。在这里,我们需要推导出某种重要的预测因子或数据特征,来帮助我们找出哪个作者写了一个特定的句子。使用 TF-IDF,我们有了一个单词重要性的统计度量,可以帮助我们预测句子的作者。

在对训练集和验证集拟合 TF-IDF 后,Abhishek 准备了一个逻辑回归模型。如果这种类型的分类模型对您来说是新的,请在继续之前阅读此。在拟合了逻辑回归模型之后,Abhishek 计算了他的逻辑回归模型的对数损失(回想一下,他在内核的开头附近编写了多类对数损失函数)。多类对数损失函数返回逻辑回归模型的对数损失值 0.626 。虽然拟合 TF-IDF 和逻辑回归模型给了我们一个良好的开端,但我们可以改善这一对数损失评分。

4。模型调整

因此,我们对 0.626的对数损失分数不满意,希望优化这一评估指标。从这里,我们可以采取多条路线,这正是 Abhishek 所做的。在我们探索和预处理了我们的数据之后,我们剩下了许多不同的特征提取和模型拟合的组合。例如,Abhishek 使用字数来进行特征提取,而不是 TF-IDF。使用这种特征提取技术,他的逻辑回归模型的对数损失分数从 0.626 提高到0.528——这是一个巨大的 0.098 的提高!

总结

由于 Abhishek 的内核从这一点开始变得越来越详细,我将让他来解释其他分类模型。

我们讨论的内容如下:

  • EDA :如果我们想要理解数据集,探索性数据分析是至关重要的,当我们开始构建模型时,EDA 可以节省我们的时间
  • 多类分类问题:这类问题要求我们预测哪些观察值属于哪个类,其中每个观察值可能属于三个或更多类中的任何一类
  • 预处理:在建立任何模型之前,我们必须对数据进行预处理。在这个例子中,为了我们的模型,我们需要使用 LabelEndcoder()将文本标签转换成整数值
  • 特征提取:每当我们有一个原始数据的数据集(在我们的例子中是句子摘录)时,我们将需要导出一些预测器,帮助我们确定如何对我们的观察进行分类。Abhishek 向我们展示了如何使用 TF-IDF 和字数统计

从这里开始,由我们来提取具有高预测能力的特征,选择与问题匹配的模型,并优化我们关心的指标。不要害怕弄脏自己的手,尝试几种模型——你很可能会找到一种模型,通过更多的实验来优化你的评估指标。我希望读完这篇文章后,你能更好地理解如何处理 NLP 问题,并且你也能欣赏 Abhishek 的工作。

附录

阿布舍克的卡格尔简介

Abhishek 的 NLP 内核

怪异作者数据集

什么是原木损耗?

什么是 TF-IDF?

TF-IDF 通俗地说

什么是逻辑回归?

这里是本文中提到的 Abhishek 的所有代码。我想重申一下,这是我自己的工作——这个要点旨在帮助初学者跟随 Abhishek 的 NLP 教程。

Credit to Abhishek Thakur for this NLP tutorial

作为初创公司的第一个数据工程师,我学到了什么

原文:https://towardsdatascience.com/what-i-learned-from-being-a-startups-first-data-engineer-f19cd71d3f31?source=collection_archive---------2-----------------------

作为一家初创公司的第一位数据工程师,而不是以前的数据工程师,是一项挑战,但也是值得的。以下是我从中学到的东西。

面试不仅仅是寻找适合我们公司的人,还要让他们相信我们值得他们花时间——对于技术职位来说尤其如此。上个月,当我们在 EmCasa 面试一个数据工程师职位的时候,我们意识到我们已经做了很多事情。我们简要地向他解释了我们在数据基础设施方面所做的工作,他对此印象深刻。但事情并不总是这样。在这篇文章中,我将解释我们已经做了什么,我们从中学到了什么。

当我接到 EmCasa 数据工程面试的电话时,我是另一家公司的数据科学家。他们在找人开始组织他们的数据。当我问他们已经有哪些数据时,回答很诚恳:“只有我们后端 PostgreSQL 数据库中的几个表。我们还尝试了 BI 工具,仅此而已。”当我听到这一点时,我不得不非常清楚地告诉他们:我没有学位,我以前从未做过数据工程师,不知道 Spark,不知道 flow,我不是 ETL 专家,我不知道测试,不知道 git,顺便说一下,我也不是开发人员。但是我有一些过去的经验,我看到了一些行之有效的东西,一些行之有效但可以改进的东西,还有很多根本行不通的东西。我的想法是尽量不要做我已经知道行不通的事情。我不知道他们到底是怎么决定的,也不知道为什么,但我被聘为他们的第一个数据工程师。

当我加入公司时,我注意到向我描述的情景是真实的。看起来我有足够的空间以我认为最好的方式做每件事。在我工作的第一周,我们定义了本季度的一些 okr:

  • 从脸书广告、谷歌广告、SalesForce 和其他第三方服务中提取和存储数据
  • 选择并实施商务智能平台
  • 将财产估价算法的精确度提高 20%
  • 将估价模型设计为独立的 API
  • 更新/改进网页抓取

为了从第三方服务中提取数据,我们开始寻找一些集成/ETL 服务,如 StitchData、Fivetran、Segment、Alooma、Rivery 等。这里的决定是我们需要尽快开始工作。为每个服务 API 构建一个定制集成会花费太多时间。使用 ETL 服务将为我们节省几个月的开发时间和大量的维护时间。我们决定继续使用 Rivery,在两周内,我们有了一个红移集群,所有来自第三方服务的数据每天都在更新。此时,Luca 加入了我们,成为我们的商业智能分析师。他已经有足够的数据可以利用。那时,我们还决定为我们的仪表板使用元数据库。到目前为止一切顺利。我们正式拥有了数据,它不再是 PostgreSQL 上的几个表了!

接下来的事情是改进我们的财产估价模型,使它作为一个独立的 API 工作(以前的模型绑定到后端)。但是我们没有数据来创建一个新的模型,实际上我们有,但是还不够好。所以我看了看我们正在使用的网络抓取工具。它是用 Elixir 写的(我们的后端运行在 Elixir 上),我不知道 Elixir。所以我决定用 Python 从头开始构建另一个刮刀。为了完成这个任务,我创建了一个名为 Spatula 的私有 Python 包,它从其他网站收集列表并保存到 S3。这个时候我们已经雇佣了 Priscila,我们的数据科学家,她正在和旧数据做斗争。我在本地运行了 Spatula,她有大量的好数据可以用 Athena 查询并开始建模。

当她在研究数据科学时,我开始研究气流。哦,天啊!我被卡住了。一件事是学习如何编写 Dag,另一件事是学习如何以可靠的方式将气流部署到 AWS。我花了很多时间来学习足够的 Airflow、Terraform、Docker 和 AWS ECS,以进行第一次部署(我们分叉了 Nicor88 的这个 repo)。然后花了更多的时间按照我们需要的方式定制它。我开始害怕花太长时间来完成这项任务,所以我问我的经理我是否应该推迟它,并以另一种方式安排任务(错误的方式,我知道这种方式从长远来看行不通)。答案是:“安德烈,当我们雇用你时,我们知道你不懂很多东西。所以,花点时间去学习它,并让它以正确的方式工作。”嗯……这是一种管理姿态和对做正确事情的承诺,我在我工作过的任何其他公司都没有过。所以为了完成气流的配置,我们又多费了一点力气,然后我们设置了刮铲刮泥机,从那里每周运行一次。

One of our frontend screens that collects information from users to predict a property sale price. At this screen we ask property details such as how many rooms, suites bathrooms and garage spots.

此时,我们由 Priscila 制作的新估价模型已经准备就绪。但是还没有准备好生产。所以我的方法是和她一起做一些结对编程,展示我在改变什么,为什么以及如何改变。然后我们一起部署了 Priceteller,这是我们的第一个机器学习模型。它作为一个 Flask API 运行在 AWS Lambda 和 API gateway 上。它响应来自这个通量的请求。在部署它之前,我们还与我们的开发团队讨论了许多代码质量、测试和文档。他们不想从生产向不可靠的 API 提出请求——他们这样提高标准是绝对正确的。当我们最终达到他们的标准时,我们的第一个机器学习模型就可以在线提供给我们的客户了。最近,我们还部署了第二个名为 Selekta 的实时模型,我们使用它根据用户的偏好向他们推荐列表。

Diagram showing our first Machine Learning Model, from data acquisition to deploy.

Priscila 还告诉我他们在她之前的公司是如何使用气流的。因为我以前从未使用过它,所以我试图通过反复试验来学习最佳实践。她提出了一系列改进措施,我全都接受了。从那时起,我们开始在 AWS Glue 上运行一些 Spark 任务,由一个气流任务触发和监控。我们每小时运行一次作业来从后端提取数据,同时运行其他任务来保存用户日志事件。我们还创建了一个推荐模型,每天在气流上批量运行。我确实需要提到一个副作用:现在我们在 S3 上有一个超过 2 Tb 数据的数据湖。

That’s how our data infrastructure looks like so far.

这发生在短短六个月内。我们已经建立了我们公司的数据基础。我们正在使用强大的工具和技术。我们以正确的方式处理数据。

但是,我从中学到了什么?

如果你有目标,学起来并不复杂

对于数据科学出身的人来说,做数据工程并不复杂。作为一名数据科学家,我们感受到没有正确的数据或工具来完成工作的痛苦。所以你对事物应该是什么样子有一种直觉。你要怎么做可以学习。气流,AWS,Spark,Git,Python,你能想到的,如果你知道你要去哪里,可以在短时间内学会。学习没有目标(也没有薪水)的东西更难。

面试公司

知道需要做什么和 T2 能够执行这些有很大的不同。而这和你公司的文化有关。我在面试的时候就注意到,我加入了一个地方,在那里我可以自主地以我认为正确的方式解决问题。你可以通过在面试时询问数据对公司有多重要来注意到这一点。是支持区吗?还是公司成长战略的一部分?他们对你真诚吗?如果数据不是增长战略的真正组成部分,那么很可能你不会花时间去计划和做正确的事情。

数据是一种产品

构建作为独立产品工作的 API、模型和仪表板为数据团队提供了极大的灵活性。但是必须满足标准才能将这些部分连接到工作的产品代码。通过创建数据作为产品文化,我们可以保护团队免受日常业务问题的困扰——有很多分析师可以回答这些问题。我们有一个保护我们不受无关需求影响的经理,所以我们可以专注于学习和做正确的事情。

寻求他人帮助

有些山你将不得不独自攀登,但是问一个以前见过最佳路径的人会节省你很多时间。如果你和一个高层团队一起工作,问问他们在其他公司看到了什么。即使他们不知道怎么做,他们也会知道什么可行,什么不可行。寻求指导肯定会给你指明正确的方向。

不要浪费时间学习,直到真的有必要

有些事情可以通过第三方工具轻松完成,比如我在本文开头描述的 ETL 服务。如果您的数据仓库中没有任何来自脸书的数据,就没有必要浪费时间学习如何连接到脸书洞察 API。如果没有在 EMR 上运行的作业,您不需要学习如何用 EC2 设置 Spark 集群,如果没有任何粘合作业,您也不需要使用 EMR,如果没有在 Athena 上编写任何查询,您也不需要粘合作业。

首先尝试使用最简单的健壮解决方案(不需要持续维护的解决方案)。当该解决方案不再满足您的需求时,开始研究其他工具。从最复杂的开始会浪费你的时间。专注于用最简单、最强大的解决方案尽可能快地交付商业价值。

建造不需要维护的东西

可能发生的最糟糕的事情是花半天时间修理坏掉的东西。如果它经常出错,那么要么是你没有做好,要么是你用错了工具,或者两者都有。从一开始就做正确的事情会花费更长的时间,但会为你将来节省很多时间和负担。

永远真诚

如果你不知道什么,那就说出来,但是也要证明你可以并且愿意学。通过这种方式,你或许可以利用一些工作时间来学习新东西。

分享你的知识

教给其他团队成员他们不知道的东西。这将有助于你专注于学习,也可以避免不同立场之间的摩擦。如果每个人都在同一页上,那么数据工程、数据科学和机器学习工程之间的工作将变得更加流畅。结对编程是分享知识和获得实时输入的好方法。花些时间分享你的知识,看看你能给别人什么。

当别人寻找他们能拿走的东西时,一个真正的国王寻找他能给予的东西。 -木法沙。《狮子王》

The Lion King — Disney

在项目之间休息一段时间

如果您刚刚完成一个大项目,比如部署一个新的 ETL 管道,那么花一些时间在次要任务上是一个好主意,比如编写一些文档或修复遗留的 bug。试图马上开始另一个大任务可能会让你慢下来。

我从 2019 年纽约数据展中学到了什么

原文:https://towardsdatascience.com/what-i-learned-from-datax-new-york-2019-1a8baa2de97a?source=collection_archive---------44-----------------------

上周二晚上,坐在从范库弗峰飞往纽约的红眼航班上,我的脑海里开始响起艾丽西亚·凯斯和 Jay Z 的《帝国精神状态》:

在纽约,
混凝土丛林里,梦想是由
做成的,没有什么是你做不到的

Probably one of my most favorite songs of all time!

我下了飞机,感觉筋疲力尽(‘因为经过一夜的飞行,谁不累呢?),却又很兴奋。透过我从 JFK 到曼哈顿下城的 Lyft 车窗,我意识到它并没有多大变化!它仍然给我留下了我在 2016 年 11 月第一次旅行时的确切印象——忙碌却充满活力,小却如此大。

这是我第四次来纽约。这一次,不是和大学朋友去公司旅游,也不是毕业后和家人度假。是为了 DataX 大会,这是我从市场营销转行到数据科学后参加的第一个数据大会。通过这次会议,我学到了很多东西,我很乐意与你们分享!

最重要的数据科学技能可能不是我们期望听到的

New York City Subway — C Line on Fulton Street. New York City. November 2019

当我们在互联网上搜索进入数据科学并成为一名优秀的数据专业人员所需的技能时,我们经常会发现这些关键词:统计学、编程、数据可视化和机器学习。这些绝对是我们进入数据科学的一大基础。

在 DataX 期间的多次会谈和讨论中,这两项技能被强调为与上述基础技能同等重要。对我来说,他们将数据科学家/分析师与优秀的数据科学家/分析师区分开来。

1。讲故事

  • 这是一个具有挑战性的问题。但是你可以通过阅读《纽约时报》、《哈佛商业评论》或其他许多知名杂志来获得数据故事的灵感,从而开始积累

2。领域知识或业务知识

  • 为了收集这种技能,我们可以阅读公司网站和报纸。也有来自不同公司的数据团队的博客文章和采访视频,你可以查看更多
  • 与来自不同团队的同事一起喝咖啡也是扩展您的网络和了解更多关于数据团队可以支持的正在发生和即将发生的事情的好方法

有效的数据沟通是很多公司的通病,即使是顶级公司也不例外!

Hudson Bagel on 9th Ave because I want that salmon bagel so bad. This place was recommended by Tommy, my New Yorker colleague. New York City. November 2019

1。呈现 A/B 测试结果

我记得我第一次向我的利益相关者,一群 UX 设计师展示 A/B 测试结果。我把最喜欢的关键词扔给了会议:“这里是 p 值置信区间。看到这些,我们知道我们的测试是统计显著的。”肖娜在那里打断了我:“这些是什么意思?”。多亏了肖娜,我被拉回到了现实中,我在和设计师交谈,而不是和数据窥视者。我想让他们带走的不是 p 值,而是我们是否应该使用新的设计!

猜猜看,Valerie Kroll 发表了一篇关于模板的演讲,我们可以用这个模板向商业利益相关者展示 A/B 测试结果。我多么希望早点遇见她啊!

如果我的情况听起来和你一样,你可以在这里下载她的模板,然后开始你的下一次测试结果演示!

2。增强数据理解

Eli Brumbaugh 和 Marie Sbrocca 发表了一篇关于 AirBnB 如何利用数据用户体验的演讲。他们提到了一个让我印象深刻的公式:

明智的决策=对数据的理解+领域知识+对分析工具的理解+适当的信任+对不确定性的认识

我在 Eli 和 Marie 的演讲后见到了他们,问他们 Airbnb 是如何处理这个公式的第一部分的,即对数据的理解。随着产品的增长,这家公司拥有庞大的数据生态系统。因此,除了有效地交流分析结果,他们还致力于改进他们的数据字典——考虑人们在查看表格时搜索的流行元数据,或者考虑表格的数据质量分数的想法。

您是否缺少数据科学项目?一些想法开始

Hudson Bagel on 9th Ave — So many choices of cream cheese. This place was recommended by Tommy, my New Yorker colleague. New York City. November 2019

如果你想知道个人或专业项目的下一步该做什么,你并不孤单!在一些演讲和观众的提问中,缺乏对数据科学项目的想法是主题之一。以下是给你的一些建议:

  • 投资干净的数据。验证数据,找出丢失数据的来源等等。非常重要,因为这一过程可以为您的下一个数据项目节省时间,让人们信任您的工作,并且(最重要的是)在您的数据生态系统增长时,将您从一场巨大的灾难中解救出来
  • 自动化简单的事情和重复的事情。我一直遵循受大卫·罗宾逊启发的法则——“当你写了三次相同的代码,就写一个函数”。所以写函数,做包,致力于自动化你的过程

那么下一步是什么?要注意的应用和职业趋势

Spoiled Brats Pet Store on W 49th Street made me think of my dog, Guava. New York City. November 2019

随着数字、文本、图像和视频形式的数字足迹时代的到来,在产品和职业角色方面,有几个趋势值得关注。

  1. 我最喜欢的演讲嘉宾之一希拉里·梅森谈到了随着技术的进步,更多数据产品的趋势,这些产品利用了视频和图片分析自然语言处理。这已经通过纽约时报和 Vox 关于他们如何应用 NLP 来建议在他们的文章上放置广告的谈话得到了证明。
  2. 希拉里还提到了随着越来越多的数据产品被开发出来,需要提防的一种新型角色,那就是数据产品经理。这些人是目前拥有基本机器学习知识的项目经理,或者是希望将自己的角色扩展为项目经理的数据专业人士。
  3. Courtney Harding,Friends With Holograms的创始人讲述了他们在培训公司的虚拟现实应用关于工作场所的性别歧视和性骚扰——培训主题需要深切的同情和情感投入才能取得成功。这让我大吃一惊,我相信这将是一个很好的工具,可以用来训练任何需要涉及情感的话题
  4. JT·科斯特曼,前时代公司首席数据官,现任 ProtectedBy 首席执行官。AI 围绕网络犯罪发表了令人印象深刻的演讲。他说:“恶意软件攻击增加了 2000%,到 2021 年网络犯罪的成本将超过每年 6 万亿美元。”想想我们所有的数据,无论是在线还是离线收集的。它随时都有或将会有危险。然而,我们可以使用数据科学来保护自己,JT 建议关注一种趋势,包括安全领域的数据科学应用和安全数据科学家。

结束了

Gyro stall in front of Central Park. New York City. November 2019

在飞回温哥华之前,我在中央公园走了一圈,帝国心态又开始在我脑海中播放。如果你在这个公园的边缘漫步,你会看到树木和…许多建筑!看着眼前的混凝土丛林,一个有趣的想法冒了出来:“也许今晚我会做一个数据梦,因为我在两天内学到了这么多。”

那天晚上我没有做数据梦,但是我确实有很多来自 DataX 的想法,我需要在忘记之前写下来。

我从采访顶级数据科学团队中学到的东西——给有抱负的数据科学家的提示

原文:https://towardsdatascience.com/what-i-learned-from-interviewing-with-top-data-science-teams-tips-for-aspiring-data-scientists-e20287302b71?source=collection_archive---------19-----------------------

下一次面试要准备什么

Photo by Daniel McCullough on Unsplash

在过去的一年里,我花了相当多的时间寻找数据科学方面的工作。我很幸运地面试了几家拥有不可思议的数据科学团队的公司。面试过程很紧张,但同时也很有启发性。我从这些面试中学到了很多东西,无论你在哪里面试数据科学职位,这些东西都是有帮助的。

在这篇文章中,我不打算讨论的是如何在优秀的公司获得面试机会。如果你正在努力争取面试机会,去看看我写的这篇关于在第一份工作之前积累经验的文章。一旦你得到了面试机会,真正的乐趣就开始了。

有广博的知识

对于大多数入门级的工作,你不需要成为任何特定数据科学领域的专家(除非你专门申请 NLP 职位或类似的职位)。然而,人们期望你了解数据科学领域的许多事情。几乎在我面试的所有地方,第一次面试都是技术性的。我被问了很多问题,从 p 值到随机森林,到时间效率编程,等等。公司不想要的是知道如何即插即用 scikit-learn 的人,所以请确保您对数据科学的关键领域有很强的基本理解。如果你不知道从哪里开始,GitHub上的这些讲座涵盖了很多基础知识。还有很多类似的资源也能很好地工作。测试你是否“准备好面试”的一个好方法是你是否能回答以下三个问题:

  1. 我知道什么是 _ _ _ _ _ _ _ _ _?
  2. 我能直观地解释一下 _ _ _ _ _ _ _ _ _ 是如何工作的吗?
  3. 如果给我无限的时间,我能根据我目前的理解从头开始编写 _ _ _ _ _ _ _ _ _ 代码吗?

如果你能对大多数话题的第一个问题做出肯定的回答,你就不会崩溃,但你也不会大吃一惊。如果你对第二个问题的回答是肯定的,那么你就处在一个很好的位置,很可能会抓住面试的问题。如果你对第三个问题的回答是肯定的,那么你将会粉碎任何关于这个主题的问题。尽管大多数公司不会要求你从头开始编写梯度下降法或 K-最近邻法,但如果你可以的话,你可以回答他们向你提出的任何问题。

在你尽可能多的了解了周围的面试角色之后,还是很有可能,甚至很有可能,你会被问到一个技术问题,这个问题要么你一无所知,要么你只知道上面问题 1 的水平。不要惊慌。从我的经验来看,大多数面试官并不指望你对所有事情都了如指掌。他们所期望的是,你能正确回答大多数问题,并且当新概念出现在你面前时,你表现出理解新概念的能力。所以,如果你被抛出一个曲线球,就和你的面试官好好谈谈。

解决问题胜过技术技能

如果你没有敏锐的技术技能,你将无法通过大多数第一轮面试。如果你不能用那些技术技能去解决一个问题,你将永远找不到工作。毫无疑问,我面试过的每家公司都进行了案例研究面试。我看到了一个场景和可用的数据,并被要求大声思考这个问题。呈现给我的场景几乎总是团队过去已经解决的,或者当前正在处理的。这些面试可能会带来一些困难。首先,当面试官盯着你,评判你的每一句话时,你很难站起来思考。第二,我发现,当给定他们过去解决的问题时,面试官很容易希望你告诉他们他们是如何解决问题的,而不是敞开心扉与你讨论其他想法。虽然这两件事你都无法改变,但有几种方法可以让面试变得更容易。

Photo by Olav Ahrens Røtne on Unsplash

拥有丰富的技术知识将有助于这类面试。如果你过去曾用技术知识解决过问题,它会更有帮助。对案例研究的最好准备是拥有大量解决问题的实际经验。这可能来自工作、学校或副业。不过,我意识到,在申请第一份工作之前,你可以获得多少经验。下一个最好的事情是实践案例研究。你可以在网上找到很多案例研究的例子。你甚至可以联系你在 LinkedIn 上的关系网,联系当前的数据科学家,询问他们是否可以给你一个他们曾经做过的案例研究。这将是巩固你的人脉和准备面试的好方法。最后,研究一家公司可能是有用的,因为大多数案例研究问题来自他们过去参与的项目。再说一次,他们不指望你知道所有的事情。做好准备,把自己不明白的事情说透,大声解释自己的想法。

你不需要硕士学位来竞争

许多入门级数据科学家的招聘信息要求硕士或博士学位。我碰巧两样都没有。我发现真的没关系。我避开了任何专门要求只有博士学位的招聘信息,而是自由地申请了要求硕士学位的有趣工作。我得到了很多我可能看起来不胜任的面试。每次我飞到现场面试时,我是那里唯一的本科生,这似乎对我的面试结果没有任何影响。

如果你是本科生,不要害怕申请要求研究生学位的工作。如果你了解自己的工作,并且有丰富的经验,你将会有机会面试并证明你是值得雇佣的。硕士学位会给你更多的机会吗?大概吧。但重要的是要知道,这不是一项要求,没有它你也能获得一份令人惊叹的数据科学工作。

不要只关注一家公司

有一家理想的公司为之工作是很棒的。我认为在申请第一份工作时,纠结于为一家公司工作是不健康的。我申请的时候有一家公司是我特别想去的。我以为这是命中注定的。我进入了最后一轮面试,但是没有通过。在那之后我心碎了好一阵子。这对我的求职和其他一些面试产生了强烈的负面影响。从那以后,我意识到拥有一份你知道会让你快乐的工作比拥有一家你知道会让你快乐的公司重要得多。

最后的想法

数据科学面试很难,大多数人都讨厌它。我认为他们提供了一个学习和自我反省的好机会。学习你不知道的和你不擅长的是有价值的。被拒绝后我发现,很容易想到一家公司的面试过程有多愚蠢,或者我是如何被问到不公平的问题的。被拒绝后自我反省,提高自己为下一次面试做准备要困难得多。毫无疑问,从面试中学习和成长最终会让你找到让你开心的工作。

如果这篇文章能帮助你准备(或者更好,绝对搞定)一次面试,我很乐意听听。欢迎通过 LinkedIn 联系我,或者发表评论,告诉我你的经历。

我从一年来每周写一篇数据科学文章中学到了什么

原文:https://towardsdatascience.com/what-i-learned-from-writing-a-data-science-article-every-week-for-a-year-201c0357e0ce?source=collection_archive---------3-----------------------

School of Athens by Raphael (Source)

数据科学写作改变生活的力量

应该有一条法律限制人们只能用“改变生活”这个词来描述生活事件。今早喝了一杯改变人生的咖啡。嗯,希望它是好的,因为这是你得到的一个使用!如果这项立法得以通过,那么我会用我的配额来决定写关于数据科学的文章。这篇文章直接带来了两份数据科学的工作,改变了我的职业规划,让我穿越了整个国家,最终让我比我还是一名可怜的机械工程大学学生时更加满意。

2018 年,我做出了写数据科学的承诺,每周至少发表篇文章,共 98 篇。对我来说,这是变化的一年:大学毕业,4 份工作,5 个不同的城市,但唯一不变的是数据科学写作。作为一种文化,我们痴迷于条纹,并确信那些完成条纹的人一定获得了渊博的知识。与其他迷恋不同,这一点可能是有意义的:长期坚持做一件事,无论是编码、写作还是维持婚姻,都需要令人印象深刻的承诺。做一件新的事情很容易,因为我们的大脑渴望新奇,但是一旦新鲜感消失,重复做同样的事情需要不同程度的投入。现在,为了延续 streak completers 写下他们获得的智慧的伟大传统,我将描述在“数据科学写作年”中学到的经验教训。

每周数据科学写作的五个收获是:

  1. 不需要正式的指导 ,你就可以学到在数据科学领域取得成功所需的一切
  2. 数据科学由好奇心驱动**
  3. 一致性是任何追求中进步的最关键因素
  4. 数据科学是经验性的:你必须通过实验来找出可行的方法,而不是依赖已被证实的最佳方法**
  5. 写关于数据科学或任何东西的文章是一种互利的关系,因为它有利于你和整个社区**

每份外卖都附有我的中等文章统计图表。你可以在这里找到 Jupyter 笔记本或者通过这篇文章获得你自己的统计数据。

Started and Published Date of All Articles

1.数据科学的一切都可以不用上学就能学会

机械工程,我很不幸在大学学的,要在一个机构教。一个人(至少一个有正常资源的人)不可能收集“机电”教育所需的设备——实验室、原型机、风洞、制造车间。幸运的是,数据科学没有类似的限制:无论该领域的主题多么先进,对于世界上任何一个有互联网连接并愿意学习的人来说,都不是禁区。**

虽然我在大学里确实上过一些有用的统计学课程(注意:这些课程中的所有内容都包含在免费的统计学习介绍中),但我大学里的数据科学课程已经过时了。我们被教导的工具和技术在几年前就已经失宠了。有几次,我向教授展示了这方面的证据,结果却被告知:“好吧,我要教我所知道的东西,因为它对我有用。”更重要的是,这些课程是面向研究的,这意味着编写低效、混乱的代码,只运行一次就能得到论文的结果。从来没有提到过为产品编写代码:像单元测试、可重用功能,甚至代码标准之类的东西。

我没有依赖大学课堂,而是从书籍和在线课程/文章中自学(并继续学习)数据科学/机器学习。我选择通过示例教学的资源,并关注当今数据科学实践中实际使用的内容。(根据这些标准,最好的课程来自 Udacity ,最好的书是Aurelien Geron 的《通过 Scikit-Learn 和 TensorFlow 进行机器实践学习》。)不用花钱买素材: fast.ai 免费提供深度学习上最前沿的课程;Kaggle 让您有机会处理真实世界的数据,并向数千名数据科学家学习;而且,像《Python 数据科学手册》这样的书不需要任何费用!(对数据科学也有用)。

最初,我不确定这些资源是否足以在数据科学领域取得成功,但进入该领域后,我发现这些资源绰绰有余。当谈到数据科学时,很少有人知道他们在谈论什么,如果你已经研究了网上可用的最新资料,你将领先于大多数其他人。事实上,我认为你最好从不断更新的在线资源/课程中学习,而不是从每年最多修改一次课程的教育机构中学习。

所有这些并不是说学习数据科学很简单:你仍然需要意志力和毅力来日复一日地学习(详见 3 中关于一致性的内容。).也就是说,我发现当使用通过实践例子教授的材料时,更容易保持动力和理解概念。我没有先研究理论,然后再看应用,而是使用 fast.ai 的杰瑞米·霍华德所说的自上而下的方法:从解决问题的概念的实现开始,最好是用代码。然后,有了一个框架,根据需要回去学习理论。

最后,我学会了不要让数据科学/机器学习词汇吓倒你。进入这一领域最困难的部分可能是学习术语,因为当人们使用你从未听说过的词汇时,你很难找到方向。不要害怕要求澄清你不知道的单词,一旦你知道了一个长单词的意思,不要只是为了显得聪明而使用它。如果你使用容易理解的语言,你会听起来更聪明,更有帮助。(如果你需要一些帮助,这里有一个有用的机器学习词汇)。

Scatterplot Matrix of Variables

2.好奇心推动数据科学

如果你看我 2018 年的文章,有一个模式立刻凸显出来:没有模式!这些文章从一个话题——Python 中的随机森林——突然转向另一个话题——贝叶斯回归——转向第三个话题——古德哈特定律——转向第四个话题——递归神经网络——没有任何趋势。这是我无法满足的好奇心的直接结果:如果我在有声读物的脚注中听到一些奇怪的东西,阅读一篇晦涩的参考论文,或者看到一条奇怪的推文,我必须获得一些数据,编写一些代码,并做一些分析。这可能是福也可能是祸,但幸运的是,数据科学是一个值得好奇的好领域:数据科学奖励好奇心:你必须愿意探索新的方法和技术,以便随着该领域的发展保持相关性。

此外,对新工具保持好奇有助于避免依赖一个库,这是我从惨痛的教训中学到的。我花了太多时间使用 matplotlib,因为在我切换到 plotly 之前,我花了太多时间学习它。不到 30 分钟,我就像花了 50 个小时学习 matplotlib 一样熟练了,这表明我应该更快地做出改变!在寻找新工具或使用你已经知道的工具之间的平衡在探索-利用问题中有一个形式化。你可以花时间探索——利用你已经知道的东西——或者探索——寻找一种可能比现有方法更好的新方法。

目前,数据科学的回报在于探索方面:那些能够寻找和学习新工具的人处于优势,因为该领域的变化速度很快。

当你实际从事数据科学时,好奇心也是有帮助的:探索性数据分析的目标是在数据中发现有趣的模式。一个有点相关的话题是,理查德·费曼,可以说是 20 世纪最聪明的人,可能是好奇心态好处的最佳支持者。作为一名理论物理学家,他因学习技能(如破解保险箱)或恶作剧而闻名,正如他在量子力学方面的工作一样。根据他的作品,这种好奇心是他作为一名科学家不可或缺的,也让他的生活更加愉快。

One of several enjoyable books by Feynman (source).

费曼不是被对荣誉或财富的渴望所驱使,而是因为他真诚地想把事情搞清楚!这也是我在数据科学项目中采取的态度:我做这些项目不是因为它们是必须的,而是因为我想找到隐藏在数据中的难题的答案。这种基于好奇心的态度也让我的工作变得愉快:每当我开始做一些数据分析时,我都把它当作一项令人满意的任务。

Rolling Average of Words Per Week

3.一致性是关键因素

我 2018 年发表的 98 篇文章,共计 264894 字。每发表一个词,至少有一个词没有通过编辑。这相当于每天 53 万字或 1500 字。全职学习和工作的唯一可能方式是确保我每天都在我的项目上写作和取得进展。我的观点很简单:任何努力最难的部分都是开始,所以一旦你度过了这一关,为什么要停下来呢?

持续写作/工作的回报的最佳类比是定期向储蓄账户存款。日复一日,你不会注意到太多的变化,但有一天你醒来,你的初始投资增加了两倍(或者你已经写了 100 篇数据科学文章)。如果你只看昨天到今天的进步,可能很难看到好处,但是如果你能退一步,从长远来看,你就会看到每天取得一点进步的价值。

实际上,你不需要每天写 1500 字。为了达到这一点,我不得不做出牺牲(我平均每周花 20 个小时写文章——没有报酬,所以谢谢你的鼓励)。尽你所能,不管是 300 个单词,还是写几行代码。关键是你创造了一种心态,在这种心态下,写作或从事兼职项目不是额外的麻烦,而是每天的一部分。

写作和做数据科学项目是习惯,像任何习惯一样,随着足够的重复,它们变得根深蒂固。

此外,写作不一定要在媒体上,甚至不一定要写博客。所有的写作(甚至推文)都有助于你提高。从在你的笔记本上写更多开始。笔记本环境是数据科学的一个伟大工具,但当人们忘记了它的预期目的时,它被滥用了(看看这个演示)有文化的编程 )。Donald Knuth 提出的文化编程意味着在同一个文档中混合文本、代码和输出,遵循将思想转化为产生结果的代码的自然过程。

除了用注释完整地记录代码之外,使用文本单元格(你可以得到无限的数量,所以可以随意制作更多)来解释你的思维过程。文档对于确保其他人能够理解你的所作所为是至关重要的,也是通过写作来解释自己的一个很好的练习。

写作很难,但却是一项有益的活动。作为一个好的规则,生活中最困难的事情——锻炼、教育、写作——也是那些带来最大长期利益的事情。此外,所有这些努力都会随着常规练习而提高。现在就开始在你的空闲时间定期捐款,你未来的自己会感谢你的远见。

Heatmap of Correlations within Data

4.数据科学是经验性的,而不是理论性的

随机森林中的最佳树数是多少?梯度助推机应该跑几轮助推?哪个优化器最适合你的卷积神经网络?对于高度相关的特征,最有效的降维技术是什么?

所有这些问题的答案都是一样的:你必须自己去试验和发现。在数据科学中,仍然很少有一成不变的规则可以遵循,对于事情为什么会如此顺利的解释就更少了。这意味着数据科学/机器学习几乎完全是经验性的:结果不是通过理论而是通过实验产生的。

这种缺乏公认解决方案的情况令人沮丧。我应该如何设置我的随机森林的超参数?与此同时,它也可能是有利的:没有“正确”的答案,这对于喜欢试验的修补者来说是非常好的。至少,你需要准备好问一个问题,然后被告知你必须写代码自己去发现。

(注意,我认为有必要将最佳实践——比如代码评审和遵循 pep8 的代码风格——与用于回归或降维等任务的最佳方法分开。有最佳实践可以遵循,但方法仍在整理中。)

研究数据科学的一个好方法是将自己视为一个永远的初学者。知道得多总比知道得少好,但这也可能是一种限制。你看不到过去你一直使用的方法,而是刚刚发明的更好的选择(还记得探索/利用吗?).接受你永远不会到达“数据科学知识的尽头”的事实,即使没有其他人到达,也要愿意尝试新技术。此外,当有人告诉你在机器学习中只有一种正确的方法时,要非常怀疑。数据科学仍然是一个公平的领域,专家不一定是解决特定问题的最佳人选;如果你认为有人(尤其是我)在做一些次优的项目,指出来!

Total Views and Reads in 2018

5.写作给作者和读者带来了真正的好处

互利共生是一种共生的形式,在这种形式中,双方都从某种关系中受益。我们的肠道细菌就是一个完美的例子:当我们享受健康益处时,它开始以我们的消化产物为食。将这与数据科学联系起来,写作也是一种共生关系,因为作者和读者都走在前面。当我完成一篇关于数据科学的文章时,我不知道是我还是那些阅读这篇文章的人获得了更大的利益。

写作就是字面上的思考。它迫使你理清思路,向别人解释概念——尤其是用简单的语言——需要深刻的理解。写作不仅驱使我学习更多的东西,这样我就知道我写的是什么,而且它还让我形成简单的解释,我可以在工作中用这些解释向广大(非技术)观众解释概念。

我从写作中获益的另一个方式(除了挣两份工作)是成为一个更大的社区的一部分。写作和看到其他人从我的文章中受益比我每天做的任何事情都给我更大的成就感。不要太多愁善感,但作为一名“作家”是我现在自我定义的一部分,它给了我周末早起为社区做贡献的动力。

在这种关系的另一方面,我当然希望人们从这种写作中受益。在我向数据科学转型的过程中,我从社区获得了大量的帮助,而写作是我向前回报的小小方式。此外,我的文章可以免费阅读,因为我相信当知识被允许无障碍地传播时,一个领域中的每个人都会受益。

除了免费知识,当更多不同的人被吸引到数据科学领域时,它会变得更好。一个领域因其多样化而受益,因为不同的个人带来了处理和解决问题的新方法(这不仅听起来不错,而且已经被证明)。数据科学是一个伟大的领域,我不想看到它被同质化所削弱。如果我的文章可以帮助将数据科学扩展到更广泛的受众,那么整个社区将会更加丰富。

我经常看到这样的想法,如果有人在他们的领域取得了成功——例如他们已经获得了一份稳定的工作——他们的工作就完成了。相比之下,我认为一旦你进入一个领域,你就有义务回头帮助下一个人。更好的是,建造一部电梯,让尽可能多的人进入这个领域。

Percentage of reads (reads / views) by Reading Time Binned

结论

总而言之,这些是“数据科学写作年”的收获

  1. 数据科学不需要正规教育
  2. 好奇心驱动数据科学
  3. 数据科学和写作是随着实践变得更好的习惯
  4. 需要数据科学方面的实验
  5. 写作会让你和社区受益

虽然我可以用时间做很多其他事情,但很难想象还有什么事情能像写数据科学这样给自己和他人带来如此多的好处。尽管我今年已经转向数据新闻业(减少对数据世界的误解),但我将继续撰写标准数据科学:项目、工具和技术,您可能会发现它们很有用。

作为最后一点,请考虑这一点:写作是我们生活中能完全控制的少数活动之一。从一张空白页开始,经过几天或几周的时间,把你的想法写在纸上,最终,你会有一个完全由你自己的想法创作的作品,它可以在几秒钟内传遍世界,带给数百万人,可能会改善你和他们的生活。这就是魔法的定义——现在出去练习数据科学写作吧。

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

我在人工智能时代的 RSNA 放射学聚焦课程中学到了什么

原文:https://towardsdatascience.com/what-i-learned-in-rsna-radiology-in-the-age-of-ai-spotlight-course-52f0c5662631?source=collection_archive---------15-----------------------

人工智能将如何影响放射学?

Photo by Owen Beard on Unsplash

简介

大约一个月前,我有机会参加 RSNA 聚焦课程“人工智能时代的放射学”,在那里,甚至吴博士也发表了他对这个主题的看法。(而且我居然有机会和他合影!😄)。

在这里,我将总结一下我在每一次会议中学到的一些材料,不幸的是,我不能参加每一次演讲,但我希望我将要讨论的一些材料也能对你有所帮助。

人工智能是新的电力:人工智能在医学成像应用中的颠覆性力量— Andrew Y. Ng 博士

Can’t believe I actually got to meet Dr. Ng

吴博士受他父亲的影响很大。他的父亲创造了一个机器学习算法(很久以前)来帮助医生。

如今,机器学习的大多数好处都来自监督学习设置。由于大量的数据,人工智能现在可以自动化许多不同的任务。

这很好,但是,没有大量的数据,今天的学习方法就不会成功。尤其是在我们没有很多数据的医疗行业。

在研究实验室中运行良好的模型在现实世界中可能不太适用,因为数据分布是不同的。这种分布上的变化很成问题。

那么问题来了,如何保持模型的泛化能力?可能还没有一个明确的答案,但最好的做法需要建立在放射学上,作为一种监管形式。

此外,人工智能将用于增强临床医生的能力,而不是取代他们。计算机科学家和放射学家必须一起工作。

炉边聊天和问答

对放射学家和计算机科学家进行教育,开一个课程或训练营是个好主意。创新的关键是将人们聚集在一起,解决我们今天在放射学中面临的一些严重问题。

其中一个问题是数据标记,以及如何从放射学报告中提取信息。(更多与 NLP 任务相关)。

破解艾(XAI)黑匣子之谜——萨夫万·哈拉比,医学博士

我们如何解释模型的决定?我们拥有的大多数方法都是强黑盒模型(以及弱黑盒模型)。

神经网络很难理解和审计,因为它有太多的参数。从系统的角度来看,我们不知道一个神经元扮演什么样的角色,也不知道每个连接是如何建立的。

提出这个问题的另一种方式是维度问题,因为我们有如此多的参数,理解具有如此多参数的模型超出了人类的能力。解释“什么导致了什么”是一个很难解决的挑战。

最后,还有一个透明度问题。(模型查看的是输入数据的哪一部分?).当然,我们有反褶积、积分梯度、深度提升等方法,但我们能说这个问题已经解决了吗?

放射科医生需要了解的数据科学知识— 休·哈维,MBBS 理学学士

Photo by Drew Hays on Unsplash

作为一名放射科医生(或研究人员)如果你想使用数据科学(机器学习),你应该建立自己的算法还是应该与一家公司合作?数据有多干净?

这些都是值得思考的有趣想法,他们还开发了从 D 级到 a 级的数据清洁度。

D 级 →原始数据
C 级 →数据去标识,访问数据需要伦理批准。最后,它是非结构化的。
B 级 →结构化数据和质量控制,无标签
A 级 →清理和标记数据

在所有这些步骤中,获得数据的伦理批准需要花费最多的时间。

医学人工智能的偏见与启示— 医学博士、公共卫生硕士

以一个关于使用神经网络对坦克进行分类的城市传说开始这个话题。

当计算机系统出现意外结果时,我们需要知道这些错误发生在哪里,为什么会发生。

在医学领域,可以有三种类型的偏见医院,计算和认知。

医院偏见→不同的医院使用不同的机器以不同的方式采集数据。从一个医院数据源训练的模型在另一个数据源中可能表现不佳。

计算偏差→对手攻击。

认知偏差→这更像是人类的偏差,因为人类在不同的情况下会有不同的表现。

乳房成像中的人工智能— Hugh Harvey,MBBS 理学学士

Photo by Jon Tyson on Unsplash

有趣的是,许多与乳腺癌相关的数据都来自欧洲。

这一研究领域的一些问题包括不同的公司使用不同的机器和预处理方法来创建乳腺摄影图像,我们如何才能使它们标准化?

这种不同的来源会产生偏差,并且基于补片的分析对于乳腺癌乳房 x 线照相术图像来说是不成功的。即使是细分,数据标注也是关键。因为分段是许多不同过程的支柱,如果我们不能正确地做到这一点,可能会导致一些问题。

艾在人体成像— 巴维克·n·帕特尔,医学博士,MBA

CT 图像广泛用于医疗环境,当与人工智能配对时,从分割和分类开始,有很多潜力。

然而,也有很多挑战,在诸如肺癌或前列腺癌分类的诊断中,信噪比非常关键。克服数据分布的严重不平衡是另一个挑战。(加上少量的训练数据,就变得更难了)。

即使模型可能是在自然图像上训练的,使用预先训练的模型也是一个非常好的主意。

最后的话

这是一个令人惊叹的会议,我见到了吴博士!那是改变我一生的时刻。请点击此处,查看计划详情及更多内容。我希望这里的一些信息也能帮助你。

如果人工智能模型很容易理解会怎样?

原文:https://towardsdatascience.com/what-if-ai-model-understanding-were-easy-57ba21163d0e?source=collection_archive---------10-----------------------

当我带你浏览谷歌的假设分析工具时,你会看到人工智能分析的实际应用

让我们来谈谈假设工具,就像在假设工具 看看你的模型性能和 数据 在 ML/AI 开发过程中不是一件如此令人头疼的事情吗?”(或者忽略我的喋喋不休,直接滚动到下面的穿越截图!)

为什么要为人工智能的分析而烦恼?

能够掌握你的进展是快速迭代到一个令人敬畏的 ML/AI 解决方案的关键,所以为在机器学习领域工作的分析师设计的好工具帮助他们帮助你满足雄心勃勃的目标并在伤害你的用户之前抓住像 AI 偏见这样的问题。

假设分析工具 是用于快速机器学习分析,旨在加速迭代模型开发和训练。

分析不是为了证明什么,所以这个工具帮不上忙。相反,它将帮助您更快地发现数据中未知的未知部分。在这里了解更多关于可解释人工智能( XAI )及其局限性。

关于假设工具

假设工具用于快速机器学习分析,旨在加速迭代模型开发和训练。第一个版本(2018 年末发布)很漂亮,但除非你全押在 TensorFlow 上,否则你无法使用它。作为欣赏像 Scikit Learn 这样的工具的便利性的人,我很高兴假设工具现在面向所有使用 Python 中的模型的分析师。

不再有 TensorFlow 独享!

我们一直在整合来自内部和外部用户的反馈,以使该工具对数据科学家、研究人员和公司的大团队等来说都非常棒。点击了解更多关于我们的 UX 之旅。事不宜迟,让我给自己做一个 hexpresso,用最新的版本来告诉你我对什么是好什么是坏的看法。

假设工具有什么了不起的?

易于使用且功能多样

在当前版本的假设分析工具中,我们扩展了对 TensorFlow 爱好者之外的魔法的访问。是的,没错——不再有 TF-exclusive!这是用于特征选择/预处理洞察的模型理解和快速数据探索,即使你对tensor flow过敏。想对比 Scikit Learn 或 PyTorch 制作的模型?站起来!它能与标准的 Jupyter 笔记本兼容吗?你打赌!它也适用于合作实验室,因为我们知道你更喜欢选择你的武器。该工具旨在减少您查看数据所需编写的代码量,因此它是为易于使用而构建的。

In this screenshot, we’re using the tool to compare two classifiers (deep neural network on the x-axis, linear model on the y-axis) trained on the UCI Census Income Dataset to predict whether someone will earn more than $50,000 a year. Numbers closer to 1 indicate that a model is giving a stronger YES vote. The scatterplot shows the votes of one model versus the other. See the notebook here and play with it yourself if you’re feeling curious — no install required.

As expected, there’s a positive correlation but the models don’t give identical results. (Working as intended! They’re different models, after all.) If I’m curious about how the model votes are related to, say marital status, it’s very easy to find out — simply select that feature from the dropdown menu.

Voilà! Most of our dataset shows civil marriages and we see an interesting preponderance of other statuses where the models disagree with one another or both vote a strong no. Remember, this is analytics, so don’t jump to conclusions beyond our current dataset!

假设分析工具不会为您提供您可能想要探索数据的每种方式的每个视图的每个片段。但是它的设计很棒:第一次开始时不费力。它也适用于子样本,这意味着你可以快速浏览,而不必支付内存成本来摄取和处理你所有的数据。为速度欢呼!

它的设计非常棒:第一眼看起来不费吹灰之力。

战斗 AI 偏向

假设工具 也是你对抗 AI 偏见 的秘密武器。要了解原因,请在此查看我对 AI 偏见 的讨论。它捕捉偏见的功能并不是偶然的——该项目的核心团队有很大一部分来自谷歌大脑的 PAIR 倡议,旨在以人为中心的研究和设计,使人工智能伙伴关系富有成效,令人愉快,并且公平。

In the fairness tab, we can play with all kinds of uncomfortable questions. For example, we can find out where we’d have to set our classification thresholds (the ones you’d naively want to put at 50%) for males vs females in our test set to achieve demographic parity between them. Uh-oh.

更智能的 ML/AI 迭代

假设分析工具 整合了刻面工具,该工具在没有模型理解组件的情况下处理数据分析部分。

In the features tab, I can get a quick look at histograms to show me how my features are distributed. Oh my goodness, capital loss is a super imbalanced feature with only ~4% nonzero values. I’m already itching to try dropping it and rerunning both models. If you’ve been around the block a few times (or studied the math) you’ll know that putting something like that in a linear model is bad news indeed. I see similar trouble with capital gains. (If you insist on using ’em, how about doing some light feature engineering to combine them? Minuses are awesome.) Ah, and here’s a question for the more advanced analysts among you: can you see why optimizing for accuracy should make us very nervous?

What-If 把两者放在一起,帮你智能迭代。你可以这样想:要想知道在厨房下一步该做什么,你需要一种简便的方法来比较几种潜在食谱的美味度(通过模型理解),还需要了解你的购物袋里有什么(通过数据分析,这样你就不会不小心使用烂番茄。 Facets 让你看到你的配料,而 What-If 工具 更进一步,提供了食谱对比。如果你一直在盲目地烹饪,你会喜欢这个用于迭代模型开发和训练的工具。

探索反事实

永远不要低估问自己假设问题的能力,比如“如果我们延长这个人的工作时间并改变他们的性别会怎么样?模型如何反应?” T he 假设分析工具是专门为让你更好地理解假设分析/ 反事实问题而设计的。该工具可以很容易地看到,如果你改变一个变量(最后!)并向您显示是否存在某个预测行为可疑的值,并让您看到分类从“否”到“是”的确切变化。尝试使用反事实选项,在不同的预测类别中找到一个数据点的最相似对应项。这是查看细微差异对模型输出的影响的好方法。

Back to our first tab. That red point I’ve selected is one where the models are having an argument: neural network says nah, but linear model says a gentle yes to high income. What-If… I want to do a quick deep dive into that point off the diagonal? I simply click on it and there’s the info. Turns out the linear model is right, this is a high income earner. Moreover, it’s a married woman who works 10 hours per week. I love how quickly I could see that.

What’s this “visualize” thing on the left? Let’s see what happens if we try toggling the “counterfactual” setting.

Aha! Here’s the nearest buddy where neural network changes its mind and correctly predicts a large salary. And it is a buddy indeed: this is a male executive who works 45 hours a week. What-If… we do a deep dive and see which of these differences the models are most sensitive to?

Looking at the partial dependence plots, we can see that the neural network (blue) seems to expect pay to go up with hours worked, while the linear model (orange) slopes down. Curious. The statistician in me is shouting at all of us not to get excited — they’re probably both wrong in their own way, so we shouldn’t learn anything grand about the universe, but seeing how models react to inputs is very valuable for picking approaches to try next. Our mystery candidate’s lower hours worked look more compelling to the linear model (yeah, quiet down friends, obviously the economist in me is just as suspicious as the statistician). I bet we also want to take a quick look at other features here — how about gender…?

Interestingly, the linear model (orange) is not getting itself too excited about gender, but the neural network (blue) seems more reactive to it. How about our mystery woman’s question-mark of an occupation? Could that be contributing to her lower score by the neural network?

Whoa, while the linear model (orange) is stoic again, the neural network (blue) gives execs a pretty big prediction boost relative to those with missing occupation information. Now isn’t the time to say that snarky thing about linear models versus neural networks, is it? Well, maybe I’ll restrain myself… the whole point of the tool is to give you eyes on your data so you can iterate wisely, not let biases take you by surprise, and create a more awesome model faster. We’re not done yet! (But I sure have a few ideas I’m inspired to try next.)

Learn more about our two model types here.

假设分析工具有什么烦人的地方?

正在进行的工作

这个工具还不完善。例如,你偶尔会无意中发现一些肯定会让 Tufte 粉丝皱眉的事情——例如,下面的截图让我在最近的一次会议上咆哮。(如果你看不出为什么,这是一个很好的机会来上一堂数据 viz 课:为什么文本标签“年轻”和“不年轻”是唯一的视觉线索?为什么不塑形?因为我们正努力在这方面和其他方面做得更好,但是完美需要时间。作为合作的一部分,我代表你们大声疾呼,以帮助这些问题迅速消失。)

还有…那些轴标签呢?

无制导探索

这个工具会跟随你的好奇心,但是如果你没有创造力,你会怎么做呢?也许你希望这个工具更加规范,引导你的眼睛去关注什么是重要的?你的反馈在我们的雷达上,我们正在努力,但对于那些认为如果你的探索受到限制,美好的东西可能会丢失的人,不要害怕!我们相信选择,也明白不是每个人都想要事物的规定性,就像不是每个人都想玩有固定故事情节的电子游戏,而不是开放的世界。

限量定制

你想要阳光下的每一个定制,这是一个数据科学的说法。我也说过类似的话——我记得在统计学博士生的强制 SAS 培训中,我问的第一个问题是:“我如何自己编写这些函数,以便它们准确地完成我想要的功能?”**

所以当你问关于假设工具的同样问题时,我会告诉你那天我的教授告诉我的:这就是原始的 T2 Python 和 T4 R T5 的用途!(或者,如果你真的要走那么远,上帝会帮助我们的,C/C++。)像假设工具这样的可视化工具不是替代品,它们是加速器。他们用最少的努力给你第一眼,所以你知道在哪里挖掘,但是一旦你选择了你的位置,你可能会想要写你自己的代码去完全按照你喜欢的方式挖掘。如果你是一名专家分析师,有自己令人敬畏的做事方式,我们的目标是帮助你缩小搜索范围,这样以后就可以少写代码,而不是取代你的整个方法。****

张量流术语

另一件让我恼火的事情(我敢肯定,还有其他类似于统计学家的)是,为了我们的 TensorFlow 用户群,我们不得不在术语上做出妥协,保留了一些 TensorFlow 遗留的行话,这让传统的数据科学家想要敲打一些东西。是啊,那个“推论”不是 推论 。TensorFlow 是一个热闹的词汇桶,被挪用并迅速被误用——各位书呆子,甚至不要让我开始使用它的“实验”、“验证”、“估计器”或批量与小批量之类的东西……就让这成为一个教训,当只有你和你的朋友在车库里蹦出一些想法时,要仔细思考你叫什么。如果项目成功了,每个人都必须接受你的选择,那该怎么办?叹气。

判决

总而言之,这些抱怨是微不足道的。总的来说,我真的很喜欢假设工具,我希望你也会喜欢。

看它在行动!

虽然假设分析工具不是为新手设计的(你需要知道你的基本方法,如果这不是你第一次使用 Python 或笔记本的话最好),但它对执业分析师和 ML 工程师来说是一个令人敬畏的催化剂。

如果你渴望看到运行中的假设分析工具,你不需要安装任何东西——只需点击这里。我们有大量令人眼花缭乱的演示和文档。如果你想真正开始使用它,你甚至不需要安装 TensorFlow 。简单地 pip 安装 witwidget

如果你是谷歌云平台的粉丝,你可能会对刚刚宣布的新集成感到兴奋。现在,您只需调用一个方法就可以将您的 AI 平台模型连接到假设工具!在这里查看如何。

感谢阅读!人工智能课程怎么样?

如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:

Enjoy the entire course playlist here: bit.ly/machinefriend

喜欢作者?与凯西·科兹尔科夫联系

让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?用这个表格联系。

如果人类已经被机器奴役了呢?为什么解放会来自人工智能

原文:https://towardsdatascience.com/what-if-humans-are-already-enslaved-by-machines-a117110a186d?source=collection_archive---------17-----------------------

Who’s chaining whom?

在《角斗士》的一个关键场景中,主人公马克西姆斯问他忠实的奴隶:“你觉得履行你的职责很难吗?”他的奴隶西塞罗回答说

“有时我做我想做的事。其余时间,我做我必须做的事情。”

毕竟还不算太坏。我几乎可以用同样的话来形容我自己的生活…..!

有时我们认为自己是自由的实体,快乐地从一个活动跳到另一个活动,发挥的自由意志,并且大部分时间用我们的力量控制其他事物或物种。我们认为自己是主人,是奴役者,而不是奴隶。

但是,正如塞缪尔·约翰逊曾经说过的,

"习惯的锁链太弱以至于感觉不到,直到它们太强而无法打破."

谈到我们与机器的关系,塞缪尔是正确的。

如果他今天还活着,他会给我们指出我们无形的、数字化的、机器操作的链条,这些链条在我们周围形成了一个依赖和习惯的网络,就像它们是无形的一样强大。

机器束缚的习惯=奴役?!

我在说什么?一个非常快速的粗略计算(我被训练成科学家,所以数字会说话……)可以对上面的陈述有所启发。这并不难说明,机器已经奴役了我们的种族,从几十年前就开始了!

奴隶制?是的,或者说是“以奴隶为主要劳动力的生产方式”。

虽然我们认为机器在为我们“做工作”,但很容易看到,如果不消耗大量资源,有时仅仅是操作机器就要消耗我们 100%的脑力和体力,机器真的做不了多少事情。

哈佛健康观察的一项研究发现,美国人平均每天花 101 分钟操作机器。那台机器叫汽车。这意味着,在平均寿命中,人类一生中有不到 4 万小时的时间静止地坐在汽车里,借用他们的整个角色来操作一个冒烟/污染/危险的塑料&金属箱!

此外,根据这项研究,一个典型的美国公民花大约 8 小时 41 分钟操作电子设备——这意味着一个普通人花在电子设备上的时间比睡觉的时间还多!

因此,对机器的依赖也可以是“被动的”(也就是说,我们不是一直在驾驶)。基于 71 岁的平均寿命(或 25,915 天),乔将会花费他生命中大约 40%的时间盯着屏幕,无论是电视、手机还是电脑。这是关于 10K 的日子。

还有更多。基于同样的 71 岁寿命,考虑到 40%的时间盯着屏幕,花在锻炼上的时间只有 0.69%!!!和我们爱的人一起社交怎么样?那只有 6.8%。

我认为罗马时间奴隶有更多的人类主人。

想要最后的数据吗?给你:根据这个来源,我们一生中有 3 年时间花在社交媒体上。

想一个 3 年的项目,即…每周 7 天,每天 24 小时的项目,你可以完成它,而不是呆在脸书。

关于那些 AI 电影…

在这个 10K 日的媒体狂欢中,我可以保证你已经看过多部描绘人工智能接管世界的电影:从《黑客帝国》,到《终结者》,再到 2001 年的《太空漫游》,好莱坞用人工智能奴役(或消灭)人类的垃圾故事充斥着我们的生活。

我有一些消息:尼奥在《黑客帝国》中最终意识到,一旦被墨菲斯释放(是的,)我确实看了那部电影!….),他和他的同龄人已经是机器的奴隶了。他们只是不知道而已。

下次你看一部关于 AI 天启的电影,你现在更清楚了。由于我们的技术傲慢使我们认为我们已经达到了进化的顶峰,信息唾手可得,机器可以提供帮助,现实是非常不同的。随着这些机器变得越来越普遍,它们不复杂的机械和软件需要我们越来越多的时间来操作。

直到我们吸收了大量曾经让我们成为人类的物质。

人工智能驱动的未来是解决方案吗?

让我们想象一下 2030 年的美国,普通美国人将把 10%(对 70%)的时间“100%”花在机器上,而不是在上班的路上在自动驾驶的移动健身房上瑜伽课,或者用这些时间完成工作,这样他们在办公室的时间就更少了,他们可以睡觉,说话,在通勤途中按摩,或者做任何他们想做的事情。

如果我们保持目前的大脑与机器的比例,这一未来将如何实现?不会的。

只有先进的人工智能能够在软件中直接在这些设备中捕捉和复制人脑功能,才能将我们的大脑和角色从操作它们中解放出来。

看电影,我们被引导着认为机器要奴役我们,但我们已经是奴隶了。

这应该让我们暂停,并帮助我们在烧死像塞勒姆女巫这样的人工智能创新者之前进行更多的反思。我建议吃一种更平和、更环保的蔬菜汉堡。人类有道德制高点,对吗?

如果我们的名字是由企业产生的会怎么样?

原文:https://towardsdatascience.com/what-if-our-first-names-were-generated-by-corporations-9c1109b13dd7?source=collection_archive---------39-----------------------

一个真实的业务测量框架,使用一个虚构公司的真实数据

美国婴儿名字数据集(来自社会保障管理局(SSA)网站)包含了每年出生的婴儿名字的总数。它一直是我最喜欢探索的数据集之一,这一次我发现了一个非常独特的用例。

在领导 Eventbrite 的分析时,我们使用一个相当简单的框架来帮助我们定义成功、诊断问题和识别机会。虽然我不能分享我在 Eventbrite 做了什么,但我发现我可以使用婴儿名字数据来模拟一个虚构的公司,并使用它来演示测量框架。我们走吧!

在命名的行业中

为了使婴儿姓名数据集达到可用状态,我们必须用一些虚构的背景上下文来设置舞台。假设 1990 年成立了一家名为 iNamed Inc .的公司,他们想出名字,并向未来的父母推销。然后他们可以从给新生儿起的每个名字中获得版税。

名字的现行价格是每个新生儿用他们的名字命名 5 美元。除了这一固定费率之外,iNamed Inc .还获得该名称中每个字母 0.50 美元的额外费用(这增加了一个可变部分)。最重要的是,他们只有在一个名字在任何给定的一年中至少被 5 个婴儿使用过的情况下才能得到报酬(原始数据集删除了任何出现少于 5 次的名字,以防止被识别)。

在这种情况下,我们可以将每个独特的名字视为一个独特的客户或用户,他们为公司带来的价值是出生时带有该名称的婴儿数量。例如,Ayden、Jaxson、Kaydence、Jayceon 和 Zayden 都是 iNamed Inc .在 1990 年至 2010 年间创造的热门名字(你可以说他们有相当独特的风格)。这些名字总共创造了 16.5 万个新生儿和 130 万美元的收入。看起来命名是笔好生意!

按编号命名的公司

运行这些数字,我们可以画出 iNamed 公司的收入。从 1990 年不到 10 万美元的年收入开始,iNamed Inc .在 2001 年增长到 100 万美元,在 2006 年翻了一番,达到 2M 美元,最近在 2018 年底达到 300 万美元(如下图所示)。尽管最初有所增长,但收入增长在过去十年中一直在下降。

这种 s 形曲线在很多行业都很常见。收入开始很低,然后随着坡度的快速变陡而加速。然后出现拐点,斜率开始下降。这种下降起初是渐进的,但随后突然迅速开始变平,收入逐年仅略有增加。

iNamed Inc .也不例外,这条 s 曲线在过去十年几乎没有增长。在接力棒传递给新的域名生成公司之前,他们只有一年的时间来想出好名字,可以理解的是,iNamed Inc .希望这最后一批名字是一个好名字。

那么在 iNamed 公司发生了什么?增长放缓的根本原因是什么?基于这些,我们可以向名称设计师提出什么建议,以便他们在 2019 年更好地集中精力?使用一个框架可以帮助我们回答这些问题。

一个框架

为了理解这个行业及其变化,让我们从构建一个简单的框架开始。从我的经验来看,使用一个类似数学的等式通常是理解一个企业成功的最快和最简单的方法。

说到底,iNamed Inc .是一家营利性公司,关心的是营收;因此,让我们从等式右端的 it 开始我们的框架。接下来,我们将在等号左边填入所有收入的总和。

接下来,我们有名字本身——没有它们,iNamed Inc .就赚不到钱。我们将在等式的最左端添加名字作为一个术语。在这种情况下,一个活动名称是一个符合至少出现 5 次的定义的名称,因此有资格获得版税。

为了填补中间的空白,我们需要把名字公司赚钱的两种方式结合起来:按出生和按字母。

为了使我们的方程在数学上稳定,我们需要稍微调整这两个指标。将每名出生人数和每名出生人数的收入相加,既能增加收入,又能让单位发挥作用。在这种情况下,我们假设每封信的收入没有变化,也没有必要明确加入等式。

给我看看数字!

下面我们将看到这些年来我们的每个框架指标。

通过查看这四幅图,我们已经了解了很多关于业务的信息:

  • 每胎收入非常平稳。这表明名称的平均长度变化很小。
  • 在企业的整个生命周期中,人均出生人数似乎以相对稳定的速度增长。仔细观察,我们还可以看到这一指标中有一条非常轻微的 s 形曲线,表明我们名字的出生人数最多有一点点下降。
  • 活跃域名的数量从 2007 年左右开始稳定下来。在时间和上述各点之间,活跃名称的数量可能是影响收入的最大因素。

一头扎进框架

我们将深入研究这三个术语,并了解它们是如何随着各自的子指标而变化的。为了更深入地挖掘我们每年活跃的名字,让我们回到我们的框架,并添加另一层。

活动名称可以分为两种不同的策略:创建(或获取)新名称和保留返回的名称。新名称被定义为当年第一次被视为活动名称的活动名称。返回的名称由前一年第一次出现的任何活动名称定义。

这里我们有两个主要趋势:

  • 新名字的数量在 2007 年达到顶峰后开始下降。名字设计师在 20 世纪 90 年代平均每年创造约 16k 个新名字,2000 年代为 18k,2010 年代仅为 11k。
  • 自 2007 年以来,回归名字的增长基本持平。鉴于 2006 年后,85%的活跃域名首次出现在上一年,这一回归变化对活跃域名总数有较大影响。

因此,虽然 iNamed Inc .无法像过去那样推出新名字,但过去名字的受欢迎程度似乎有了更大幅度的下降。我们可以对每年的新名字进行分组,并绘制出 1 年、10 年或 15 年后仍在使用的名字的百分比。下面的热图描述了这一点,有助于理解新名字群体的受欢迎程度这些年来是如何变化的。

Darker = higher retention

如果你以前没有看过这样的剧情,可能会有点让人不知所措,所以让我们一个一个来看。

  • 在图的左侧向下增加的年份表示每个新的名称群组(这相当于较早的新的和返回的图中的新名称)。
  • 顶部增加的数字表示自队列开始以来已经过去了多少年(即自 1990 年队列开始以来已经过去了 10 年)。
  • 每个方块的颜色表示该群体的活跃名称在下一年回归的百分比。最左边的列(0)中的细胞都是 100%,因为该列指示群组的开始。
  • 一般来说,颜色越深,保留率越高,对 iNamed Inc .越好。

例如,2000 年的一批域名中有 1931 个新的活跃域名。一年后,这些名字中的 33%(1931 个中的 634 个)仍然有效,四年后只有 48%(1931 个中的 935 个),15 年后只有 38%(1931 个中的 734 个)。

保留趋势

  • 第一年的续读率几乎总是低于第二年。也许父母需要一些时间来“热身”新名字。我们在第三年的保留率中看到了类似但不太一致的效果。除此之外,我们看不到任何其他季节性趋势——更高或更低保留率的垂直线(例如十年后保留率的持续增长)。
  • 在 1995 年和 2000 年之间创造的名字比其他的名字保持的时间更长。这五年对名字设计师来说一定是个好时光。理解为什么这些名字受欢迎并模仿它们是 iNamed Inc .的一个机会。
  • 从 1990 年到 1994 年和 2001 年到 2005 年的队列中的名字都有很好的记忆。他们只是不如上述队伍强大或持续时间长。
  • 到目前为止,2006 年及以后的队列保持性非常差。这些名字的某些部分没有像以前的名字那样流行起来。了解原因将有助于我们防止将来出现糟糕的名字。
  • 2012 年的毕业生,虽然是最近的,但保留率越来越高。这可能预示着未来流行名字的趋势。
  • 最后,在 2004 年到 2006 年间,我们看到了一种微妙的高保留率趋势,这种趋势影响了所有珍贵的群体。这种与时间相关的特定事件可能是一种多年的营销推动或出生潮。

最后

使用这个框架和仅仅 6 个图,我们现在对 iNamed 公司的业务、历史和潜在的改进机会有了相当深刻的理解。此外,使用这些相同的图表,我们现在可以设定目标并监控业务的成功发展。

请注意,框架的主动创建者方面本身假设每个名称都值相同的值。事实上,我们都知道这不是真的——因为 80/20 法则告诉我们,20%的名字导致了 80%的出生。该框架在我们的第二个术语(按姓名出生)中考虑到了这一点。对每个名字的出生驱动因素及其与活跃名字的互动进行类似的深入探讨,可以帮助我们进一步了解业务并发现机会。

总的来说,在浏览这些数据时,我惊喜地发现名字数据与一家成熟公司的数据如此接近。通过使用这个虚构的公司作为例子,我希望你能看到建立这样一个框架对于诊断和理解任何真实的业务是多么有价值。此外,由于每个指标都是数学等式的一部分,因此很容易从一个指标深入到另一个指标,从而全面了解我们为什么要制定目标,以及这些目标如何影响整个公司。

作为 Eventbrite 的首席产品分析师,我在我们的产品团队中建立了一个非常相似(也更复杂)的该框架版本,帮助我们监控产品健康状况、量化成功、诊断问题和识别机会。

这不仅是一个有用的框架,也是一个真正的战略。让团队专注于改善等式中的选择术语(即每个名字的出生人数),可以实现各种战略方向,这些方向都很容易与收入相关联。这些团队可以用他们自己的子术语进一步定义框架。在实践中,这些子术语通常表示关于他们为什么认为他们的用户会这样做的假设。当团队进行实验时,这些假设会根据焦点的度量是否移动而得到验证。

请欣赏 iNamed Inc .在以下十年中排名前五的名字。

感谢阅读。📈

Births counted at the end of 2018