TowardsDataScience-博客中文翻译-2019-六十二-

TowardsDataScience 博客中文翻译 2019(六十二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

自然语言处理中的文本预处理

原文:https://towardsdatascience.com/text-preprocessing-in-natural-language-processing-using-python-6113ff5decd8?source=collection_archive---------1-----------------------

文本预处理在模型性能中的意义。

数据预处理是建立机器学习模型的必要步骤,取决于数据预处理的好坏;结果是看到的。

在自然语言处理中,文本预处理是建立模型的第一步。

各种文本预处理步骤是:

  1. 标记化
  2. 下部外壳
  3. 停止单词删除
  4. 堵塞物
  5. 词汇化

这些不同的文本预处理步骤被广泛用于降维。

在向量空间模型中,每个单词/术语是一个轴/维度。文本/文档被表示为多维空间中的向量。
唯一字的数量就是维度的数量。

安装:我将用来实现文本预处理任务的 python 库是 nltk

pip install nltk==3.4.5

标记化:将句子拆分成单词。

**Output:** ['Books', 'are', 'on', 'the', 'table'] 

小写:将单词转换成小写(NLP - > nlp)。
Bookbook 这样的单词意思相同,但是当不转换成小写时,这两个单词在向量空间模型中表示为两个不同的单词(导致更多的维度)。

**Output:** books are on the table.

停用词去除:停用词是非常常用的词(a、an、the 等。)在文档中。这些词实际上并不表示任何重要性,因为它们无助于区分两个文档。

**Output**: ['Machine', 'Learning', 'cool', '!']
**Explanation**: Stop word ‘is’ has been removed

词干化:是将一个单词转化为其词根形式的过程。

**Output**: machin, learn, is, cool
**Explanation**: The word 'machine' has its suffix 'e' chopped off. The stem does not make sense as it is not a word in English. This is a disadvantage of stemming.

词汇化:与词干化不同,词汇化将单词简化为语言中存在的单词。

词干化或词汇化都可以使用。像 nltkspaCy 这样的库已经实现了词干分析器和词条分类器。这些都是基于基于规则的方法构建的。

斯特梅尔比词条解释器更容易构建,因为后者在构建词典时需要深厚的语言学知识来查找单词的词条。

对于将单词解析为其词条的词条化,需要单词的词性。这有助于将单词转换成合适的词根形式。然而,要做到这一点,它需要额外的计算语言学能力,如词性标注器。

有关 python 中词汇化的更多示例,请查看这个博客,有关词干化和词汇化之间差异的详细解释,请查看这个博客

变元化优于词干化,因为变元化对单词进行词法分析。

**Output**: machine, care
**Explanation**: The word Machine transforms to lowercase and retains the same word unlike Stemming. Also, the word caring is transformed to its lemma 'care' as the parts of speech variable (pos) is verb(v)

总之,这些是自然语言处理中的文本预处理步骤。可以使用各种 python 库,如 nltkspaCyTextBlob 。请参考他们的文档并试用它们。

关于我
我对位于湾区的数据科学充满热情。我的重点是学习自然语言处理的最新技术。请随时在 LinkedIn 上与我联系

参考资料:

[1]https://www . coursera . org/lecture/language-processing/text-预处理-SCd4G
【2】https://www.nltk.org/

文本预处理步骤和通用可重用流水线

原文:https://towardsdatascience.com/text-preprocessing-steps-and-universal-pipeline-94233cb6725a?source=collection_archive---------2-----------------------

所有文本预处理步骤的描述和可重用文本预处理管道的创建

在向任何 ML 模型提供某种数据之前,必须对其进行适当预处理。你一定听过这个谚语:Garbage in, garbage out (GIGO)。文本是一种特殊的数据,不能直接输入到大多数 ML 模型中,所以在输入到模型中之前,你必须以某种方式从中提取数字特征,换句话说就是vectorize。矢量化不是本教程的主题,但您必须了解的主要内容是,GIGO 也适用于矢量化,您只能从定性预处理的文本中提取定性特征。

我们将要讨论的事情:

  1. 标记化
  2. 清洁
  3. 正常化
  4. 词汇化
  5. 汽蒸

最后,我们将创建一个可重用的管道,您可以在您的应用程序中使用它。

Kaggle 内核:https://www . ka ggle . com/balat mak/text-预处理-步骤-通用-管道

让我们假设这个示例文本:

An explosion targeting a tourist bus has injured at least 16 people near the Grand Egyptian Museum, 
next to the pyramids in Giza, security sources say E.U.

South African tourists are among the injured. Most of those hurt suffered minor injuries, 
while three were treated in hospital, N.A.T.O. say.

http://localhost:8888/notebooks/Text%20preprocessing.ipynb

@nickname of twitter user and his email is email@gmail.com . 

A device went off close to the museum fence as the bus was passing on 16/02/2012.

标记化

Tokenization——文本预处理步骤,假设将文本分割成tokens(单词、句子等)。)

看起来你可以使用某种简单的分隔符来实现它,但是你不要忘记,在许多不同的情况下,分隔符是不起作用的。例如,如果您使用带点的缩写,那么.用于将标记化成句子的分隔符将会失败。所以你必须有一个更复杂的模型来达到足够好的结果。通常这个问题可以通过使用nltkspacy nlp 库来解决。

NLTK:

from nltk.tokenize import sent_tokenize, word_tokenize

nltk_words = word_tokenize(example_text)
display(f"Tokenized words: **{nltk_words}**")

输出:

Tokenized words: ['An', 'explosion', 'targeting', 'a', 'tourist', 'bus', 'has', 'injured', 'at', 'least', '16', 'people', 'near', 'the', 'Grand', 'Egyptian', 'Museum', ',', 'next', 'to', 'the', 'pyramids', 'in', 'Giza', ',', 'security', 'sources', 'say', 'E.U', '.', 'South', 'African', 'tourists', 'are', 'among', 'the', 'injured', '.', 'Most', 'of', 'those', 'hurt', 'suffered', 'minor', 'injuries', ',', 'while', 'three', 'were', 'treated', 'in', 'hospital', ',', 'N.A.T.O', '.', 'say', '.', 'http', ':', '//localhost:8888/notebooks/Text', '%', '20preprocessing.ipynb', '@', 'nickname', 'of', 'twitter', 'user', 'and', 'his', 'email', 'is', 'email', '@', 'gmail.com', '.', 'A', 'device', 'went', 'off', 'close', 'to', 'the', 'museum', 'fence', 'as', 'the', 'bus', 'was', 'passing', 'on', '16/02/2012', '.']

空间:

import spacy
import en_core_web_sm

nlp = en_core_web_sm.load()

doc = nlp(example_text)
spacy_words = [token.text for token **in** doc]
display(f"Tokenized words: **{spacy_words}**")

输出:

Tokenized words: ['\\n', 'An', 'explosion', 'targeting', 'a', 'tourist', 'bus', 'has', 'injured', 'at', 'least', '16', 'people', 'near', 'the', 'Grand', 'Egyptian', 'Museum', ',', '\\n', 'next', 'to', 'the', 'pyramids', 'in', 'Giza', ',', 'security', 'sources', 'say', 'E.U.', '\\n\\n', 'South', 'African', 'tourists', 'are', 'among', 'the', 'injured', '.', 'Most', 'of', 'those', 'hurt', 'suffered', 'minor', 'injuries', ',', '\\n', 'while', 'three', 'were', 'treated', 'in', 'hospital', ',', 'N.A.T.O.', 'say', '.', '\\n\\n', 'http://localhost:8888/notebooks', '/', 'Text%20preprocessing.ipynb', '\\n\\n', '@nickname', 'of', 'twitter', 'user', 'and', 'his', 'email', 'is', 'email@gmail.com', '.', '\\n\\n', 'A', 'device', 'went', 'off', 'close', 'to', 'the', 'museum', 'fence', 'as', 'the', 'bus', 'was', 'passing', 'on', '16/02/2012', '.', '\\n']

在 spacy 输出标记化中,而不是在 nltk 中:

{'E.U.', '\\n', 'Text%20preprocessing.ipynb', 'email@gmail.com', '\\n\\n', 'N.A.T.O.', 'http://localhost:8888/notebooks', '@nickname', '/'}

在 nltk 中但不在 spacy 中:

{'nickname', '//localhost:8888/notebooks/Text', 'N.A.T.O', ':', '@', 'gmail.com', 'E.U', 'http', '20preprocessing.ipynb', '%'}

我们看到spacy标记了一些奇怪的东西,比如\n\n\n,但是能够处理 URL、电子邮件和类似 Twitter 的提及。此外,我们看到nltk标记化的缩写没有最后的.

清洁

Cleaning is 步骤假设删除所有不需要的内容。

删除标点符号

当标点符号不能为文本矢量化带来附加值时,这可能是一个好的步骤。标点符号删除最好在标记化步骤之后进行,在此之前进行可能会导致不良影响。TF-IDFCountBinary矢量化的好选择。

让我们假设这一步的文本:

@nickname of twitter user, and his email is email@gmail.com .

在标记化之前:

text_without_punct = text_with_punct.translate(str.maketrans('', '', string.punctuation))
display(f"Text without punctuation: **{text_without_punct}**")

输出:

Text without punctuation: nickname of twitter user and his email is emailgmailcom

在这里,您可以看到用于正确标记化的重要符号已被删除。现在电子邮件无法正常检测。正如您在Tokenization步骤中提到的,标点符号被解析为单个符号,所以更好的方法是先进行符号化,然后删除标点符号。

import spacy
import en_core_web_sm

nlp = en_core_web_sm.load()doc = nlp(text_with_punct)
tokens = [t.text for t **in** doc]*# python based removal*
tokens_without_punct_python = [t for t **in** tokens if t **not** **in** string.punctuation]
display(f"Python based removal: **{tokens_without_punct_python}**")# spacy based removal
tokens_without_punct_spacy = [t.text for t **in** doc if t.pos_ != 'PUNCT']
display(f"Spacy based removal: **{tokens_without_punct_spacy}**")

基于 Python 的移除结果:

['@nickname', 'of', 'twitter', 'user', 'and', 'his', 'email', 'is', 'email@gmail.com']

基于空间的移除:

['of', 'twitter', 'user', 'and', 'his', 'email', 'is', 'email@gmail.com']

这里你可以看到python-based移除比 spacy 更有效,因为 spacy 将@nicname标记为PUNCT词性。

停止单词删除

Stop words通常指一种语言中最常见的词,通常不会带来额外的意义。没有一个所有 nlp 工具都使用的通用停用词列表,因为这个术语的定义非常模糊。尽管实践已经表明,当准备用于索引的文本时,这一步骤是必须的,但是对于文本分类目的来说可能是棘手的。

空间停止字数:312

NLTK 停止字数:179

让我们假设这一步的文本:

This movie is just not good enough

空间:

import spacy
import en_core_web_sm

nlp = en_core_web_sm.load()text_without_stop_words = [t.text for t **in** nlp(text) if **not** t.is_stop]
display(f"Spacy text without stop words: **{text_without_stop_words}**")

没有停用词的空白文本:

['movie', 'good']

NLTK:

import nltk

nltk_stop_words = nltk.corpus.stopwords.words('english')
text_without_stop_words = [t for t **in** word_tokenize(text) if t **not** **in** nltk_stop_words]
display(f"nltk text without stop words: **{text_without_stop_words}**")

无停用词的 NLTK 文本:

['This', 'movie', 'good', 'enough']

这里你看到 nltk 和 spacy 的词汇量不一样,所以过滤的结果也不一样。但我想强调的主要一点是,单词not被过滤了,这在大多数情况下是没问题的,但在你想确定这个句子的极性的情况下not会带来额外的含义。

对于这种情况,您可以在空间库中设置可以忽略的停用词。在 nltk 的情况下,您可以删除或添加自定义单词到nltk_stop_words,它只是一个列表。

import en_core_web_sm

nlp = en_core_web_sm.load()

customize_stop_words = [
    'not'
]

for w **in** customize_stop_words:
    nlp.vocab[w].is_stop = False

text_without_stop_words = [t.text for t **in** nlp(text) if **not** t.is_stop]
display(f"Spacy text without updated stop words: **{text_without_stop_words}**")

没有更新停用词的空白文本:

['movie', 'not', 'good']

正常化

像任何数据一样,文本也需要规范化。如果是文本,则为:

  1. 将日期转换为文本
  2. 数字到文本
  3. 货币/百分比符号到文本
  4. 缩写扩展(内容相关)NLP —自然语言处理、神经语言编程、非线性编程
  5. 拼写错误纠正

总而言之,规范化是将任何非文本信息转换成文本等效信息。

为此,有一个很棒的库——normalize。我将从这个库的自述文件中向您展示这个库的用法。这个库基于nltk包,所以它需要nltk单词标记。

让我们假设这一步的文本:

On the 13 Feb. 2007, Theresa May announced on MTV news that the rate of childhod obesity had risen from 7.3-9.6**% i**n just 3 years , costing the N.A.T.O £20m

代码:

from normalise import normalise

user_abbr = {
    "N.A.T.O": "North Atlantic Treaty Organization"
}

normalized_tokens = normalise(word_tokenize(text), user_abbrevs=user_abbr, verbose=False)
display(f"Normalized text: {' '.join(normalized_tokens)}")

输出:

On the thirteenth of February two thousand and seven , Theresa May announced on M T V news that the rate of childhood obesity had risen from seven point three to nine point six % in just three years , costing the North Atlantic Treaty Organization twenty million pounds

这个库中最糟糕的事情是,目前你不能禁用一些模块,如缩写扩展,它会导致像MTV - > M T V这样的事情。但是我已经在这个库上添加了一个适当的问题,也许过一会儿就可以修复了。

脱镁和汽蒸

Stemming是将单词的词形变化减少到其词根形式的过程,例如将一组单词映射到同一个词干,即使该词干本身在语言中不是有效单词。

Lemmatization与词干不同,适当减少词根变化,确保词根属于该语言。在引理化中,词根称为引理。一个词条(复数词条或词条)是一组单词的规范形式、词典形式或引用形式。

让我们假设这一步的文本:

On the thirteenth of February two thousand and seven , Theresa May announced on M T V news that the rate of childhood obesity had risen from seven point three to nine point six % in just three years , costing the North Atlantic Treaty Organization twenty million pounds

NLTK 词干分析器:

import numpy as np
from nltk.stem import PorterStemmer
from nltk.tokenize import word_tokenizetokens = word_tokenize(text)
porter=PorterStemmer()# vectorizing function to able to call on list of tokens
stem_words = np.vectorize(porter.stem)stemed_text = ' '.join(stem_words(tokens))
display(f"Stemed text: **{stemed_text}**")

带词干的文本:

On the thirteenth of februari two thousand and seven , theresa may announc on M T V news that the rate of childhood obes had risen from seven point three to nine point six % in just three year , cost the north atlant treati organ twenti million pound

NLTK 术语化:

import numpy as np
from nltk.stem import WordNetLemmatizer
from nltk.tokenize import word_tokenizetokens = word_tokenize(text)wordnet_lemmatizer = WordNetLemmatizer()# vectorizing function to able to call on list of tokens
lemmatize_words = np.vectorize(wordnet_lemmatizer.lemmatize)lemmatized_text = ' '.join(lemmatize_words(tokens))
display(f"nltk lemmatized text: **{lemmatized_text}**")

NLTK 词条化文本:

On the thirteenth of February two thousand and seven , Theresa May announced on M T V news that the rate of childhood obesity had risen from seven point three to nine point six % in just three year , costing the North Atlantic Treaty Organization twenty million pound

空间引理化;

import en_core_web_sm

nlp = en_core_web_sm.load()lemmas = [t.lemma_ for t **in** nlp(text)]
display(f"Spacy lemmatized text: {' '.join(lemmas)}")

Spacy 词条化文本:

On the thirteenth of February two thousand and seven , Theresa May announce on M T v news that the rate of childhood obesity have rise from seven point three to nine point six % in just three year , cost the North Atlantic Treaty Organization twenty million pound

我们看到spacy比 nltk 好得多,其中一个例子risen - > rise,只有spacy处理了它。

可重复使用管道

现在是我最喜欢的部分!我们将创建一个可重用的管道,您可以在您的任何项目中使用它。

import numpy as np
import multiprocessing as mp

import string
import spacy 
import en_core_web_sm
from nltk.tokenize import word_tokenize
from sklearn.base import TransformerMixin, BaseEstimator
from normalise import normalise

nlp = en_core_web_sm.load()

class **TextPreprocessor**(BaseEstimator, TransformerMixin):
    def __init__(self,
                 variety="BrE",
                 user_abbrevs={},
                 n_jobs=1):
        *"""*
 *Text preprocessing transformer includes steps:*
 *1\. Text normalization*
 *2\. Punctuation removal*
 *3\. Stop words removal*
 *4\. Lemmatization*

 *variety - format of date (AmE - american type, BrE - british format)* 
 *user_abbrevs - dict of user abbreviations mappings (from normalise package)*
 *n_jobs - parallel jobs to run*
 *"""*
        self.variety = variety
        self.user_abbrevs = user_abbrevs
        self.n_jobs = n_jobs

    def fit(self, X, y=None):
        return self

    def transform(self, X, *_):
        X_copy = X.copy()

        partitions = 1
        cores = mp.cpu_count()
        if self.n_jobs <= -1:
            partitions = cores
        elif self.n_jobs <= 0:
            return X_copy.apply(self._preprocess_text)
        else:
            partitions = min(self.n_jobs, cores)

        data_split = np.array_split(X_copy, partitions)
        pool = mp.Pool(cores)
        data = pd.concat(pool.map(self._preprocess_part, data_split))
        pool.close()
        pool.join()

        return data

    def _preprocess_part(self, part):
        return part.apply(self._preprocess_text)

    def _preprocess_text(self, text):
        normalized_text = self._normalize(text)
        doc = nlp(normalized_text)
        removed_punct = self._remove_punct(doc)
        removed_stop_words = self._remove_stop_words(removed_punct)
        return self._lemmatize(removed_stop_words)

    def _normalize(self, text):
        *# some issues in normalise package*
        try:
            return ' '.join(normalise(text, variety=self.variety, user_abbrevs=self.user_abbrevs, verbose=False))
        except:
            return text

    def _remove_punct(self, doc):
        return [t for t **in** doc if t.text **not** **in** string.punctuation]

    def _remove_stop_words(self, doc):
        return [t for t **in** doc if **not** t.is_stop]

    def _lemmatize(self, doc):
        return ' '.join([t.lemma_ for t **in** doc])

此代码可用于 sklearn 管道。

测量的性能:在 22 分钟内在 4 个进程上处理了 2225 个文本。甚至没有接近快!这导致了规范化部分,库没有充分优化,但产生了相当有趣的结果,并可以为进一步的矢量化带来额外的价值,所以是否使用它取决于您。

我希望你喜欢这篇文章,我期待你的反馈!

Kaggle 内核:https://www . ka ggle . com/balat mak/text-预处理-步骤-通用-管道

文本处理即将到来

原文:https://towardsdatascience.com/text-processing-is-coming-c13a0e2ee15c?source=collection_archive---------14-----------------------

如何在权力的游戏第一部中使用正则表达式(Regex)和自然语言工具包(NLTK)

Photo by Bharat Patil on Unsplash

如果你和我一样,看过的《权力的游戏》(GOT)的迷因比剧集本身还多,你可能会奇怪为什么每个人都对它如此着迷。由于我没有时间看节目或看书,我将使用基本的文本处理来大致了解我错过了什么。在本文中,我将使用 Python 中的正则表达式和自然语言工具包来探索、清理、标记和可视化文本。如果你对矢量化、词性标注或情感分析更感兴趣,这里有我写的另一篇文章。

所有 5 本书的文本都可以在 Kaggle 上找到这里。我将使用第一本书的文本(《权力的游戏》,1996) ,它有 571 页,包含 20,168 行文本。我将解释这些概念,以便清理文本:

  • 正则表达式语法
  • 正则表达式函数
  • 标记化
  • 词干化/词汇化
  • 结合 NLTK 和 Regex
  • 可视化词频

什么是 Regex?

正则表达式是一种不同符号和语法的语言,可用于在更大的字符串中搜索一段字符串。它可以在几乎任何编码语言中使用,并且在试图搜索一般的字符串模式时非常有用。最常见的是,它用于 web 抓取、输入验证和简单的解析。在 Python 中,可以使用import re导入正则表达式包。这给了你许多不同的函数和字符串序列,允许你搜索任何你想要的东西。

一个 regex 字符串指的是告诉 regex 要查找什么的字母、符号或数字的字符串。例如,如果您想要查找“Daenerys”的所有实例,regex 字符串应该类似于r“daene rys”。然而,如果您想要查找所有以' D '开头的单词,正则表达式字符串应该看起来像 r'D[a-z]+' 。字符串开头的 D 必须匹配,方括号表示选择一个,而+表示您必须从括号中选择 1 次或更多次来完成单词。我将介绍一些 regex 字符串的基本形式,它们在搜索文本时会很有用。

r'A'* 匹配一个 0 次或多次('、' A '、' AA '、' AAA '、' AAAA '等)。)
r'A+' 匹配 A 1 次或多次(' A ',' AA ',' AAA ',' AAAA '等)。)
r '[a-z]*匹配任意小写字母 0 次或更多次('、' ajrk '、' bor '、' q '等。)
r '[0–9]+'匹配任意数字 1 次或多次(' 1 ',' 254 ',' 1029345 '等)。)
r'ing$' 匹配以-ing 结尾的单词(“奔跑”、“攀爬”、“ing”等)。)
r'^st' 匹配以 st- ('string '、' stir '、'奋斗'等)开头的单词。)
r'[^a]' 将匹配任何不带 a 的字符串(' surprise ',' d4nfo)。,有意思!”等。)
r’。{4}' 匹配任何不带换行符的 4 个字符的字符串(' 9?rf '、'(hi)'等。)

regex 中有几个特殊序列由一个反斜杠后跟一个字母组成。反斜杠()是一个转义字符,它可以否定跟在它后面的任何内容的传统含义。“w”通常会匹配“w”,但 r'\w+' 会匹配一个或多个字母数字字符。如果字母是小写的,那么它匹配特殊序列定义的所有内容,但是如果字母是大写的,那么 regex 字符串匹配除了它定义的之外的所有内容。特殊序列字母列表可在找到。除了我简单介绍的之外,还有很多技术,你可以点击这里,这里这里,这里这里,或者这里这里查看更多信息!

使用正则表达式搜索文本

re 包有几个内置函数,可以用来将 regex 字符串应用于文本主体,以及查找匹配等。我将介绍一些,并解释它们之间的区别。所有这些函数至少有两个参数:要匹配的模式(regex 字符串)和要搜索的文本。以下三个函数返回一个 match 对象,该对象由匹配的字符串的索引(开始和停止)以及函数匹配的字符串组成。它们也被限制为每个查询只能找到一个匹配。

  • re.search:查找匹配模式的第一个实例,返回匹配对象或无
  • re.match:仅在字符串的开头查找模式的实例,返回匹配对象或无
  • re.fullmatch:查找整个字符串是否匹配给定的模式,返回一个匹配对象或无
print(**re.search**(r'q[a-zA-Z]+', 'There is a queen in the castle.'))
# <_sre.SRE_Match object; span=(11, 16), match=’queen’>print(**re.match**(r'[a-zA-Z]+', 'There is a queen in the castle.'))
# <_sre.SRE_Match object; span=(0, 5), match=’There’>print(**re.fullmatch**(r'.*', 'There is a queen in the castle.'))
# <_sre.SRE_Match object; span=(0, 31), match=’There is a queen in the castle.’>

接下来的两个函数查找模式字符串中的所有匹配。这里,re.findall 返回所有匹配的列表,而 re.finditer 允许您使用一个循环提取每个匹配的特定信息。

  • re.findall:查找模式的所有非重叠匹配,返回所有匹配的列表
  • re.finditer:查找模式的所有非重叠匹配,返回一个迭代器对象,告诉你匹配的开始/停止/内容
print(**re.findall**(r'\w+ \w+', 'There is a queen in the castle.'))
# [‘There is’, ‘a queen’, ‘in the’]print(**re.finditer**(r'dragon', got))
# <callable_iterator object at 0x7f062e51a400>for m in **re.finditer**(r'\w+ \w+', 'There is a queen in the castle.'):
  print('Start:', m.start(), 'End:', m.end(), 'Text:', m.group())
# Start: 0 End: 8 Text: There is 
# Start: 9 End: 16 Text: a queen 
# Start: 17 End: 23 Text: in the

以下两个函数是在搜索模式后分割或修改字符串的方法。它们都返回修改后的字符串。

  • re.sub(pattern, replacement, string):用替换字符串替换模式,返回修改后的字符串
  • re.split:根据模式分割字符串,返回字符串列表
print(**re.sub**(r'\w+', 'word', 'There is a queen in the castle.'))
# word word word word word word word.print(**re.split**(r'[^a-zA-Z\']+',"This is the queen's castle. So exciting!"))
# ['This', 'is', 'the', "queen's", 'castle', 'So', 'exciting', '']

既然我们已经介绍了 Regex 的基础知识,让我们继续预处理得到的文本。

标记化

为了分析一个文本,必须把它的词抽出来分析。一种方法是用空格分割每个文本,以便返回单个单词。然而,这并没有考虑标点符号或其他可能要删除的符号。这种将句子、段落或章节分解成单个单词的过程被称为标记化,是执行任何类型的文本分析之前的重要步骤。幸运的是,Python 中有一个名为自然语言工具包的包,它有大量有用的操作文本的函数。可以使用import nltk导入。这个包包括一个单词分词器和一个句子分词器,分别将文本分解成单词和句子。单词标记器将文本分成单词、标点符号和任何其他字符。这意味着标点符号从单词中分离出来,成为列表中自己的元素。句子标记器通过传统的句子标点符号(。, ?, !等。),并保持标点符号附在句子上。以下是每种方法的示例:

from nltk.tokenize import word_tokenize, sent_tokenize
print(**word_tokenize**("This is the queen's castle. Yay!"))
# ['This', 'is', 'the', 'queen', "'s", 'castle', '.', 'Yay', '!']print(**sent_tokenize**(got)[1:3])
# ['"The wildlings are \ndead."', '"Do the dead frighten you?"']

现在你已经有了文本中所有单词和标点符号的列表,接下来做什么呢?令牌列表可以通过循环运行,停用词列表中的所有内容都可以删除。停用词是指出现频率太高或意义不大的词,应该去掉。这可以被认为是一种降维,因为你去掉了那些不允许你收集文本信息的单词。删除不常出现的单词也很有用。

from nltk.corpus import stopwords
stop_words=**stopwords.words**("english")
print(random.sample(stop_words, 8))
print('There are', len(stop_words), 'English stopwords.')
**# *[‘now’, ‘about’, ‘to’, ‘too’, ‘himself’, ‘were’, ‘some’, “you’ll”]*** ***# There are 179 English stopwords.***import string
punct = list(**string.punctuation**)
print(punct[0:13])
print('There are', len(punct), 'punctuation marks.')
**# *[‘!’, ‘“‘, ‘#’, ‘$’, ‘%’, ‘&’, “‘“, ‘(‘, ‘)’, ‘*’, ‘+’, ‘,’, ‘-’]*** ***# There are 32 punctuation marks.*****stops** = stop_words + punct + ["''", 'r.', '``', "'s", "n't"]filtered_words=[]
for w in got_words:
    if w.lower() not in stops:
        filtered_words.append(w.lower())
print(filtered_words[0:8])
**# *[‘game’, ‘thrones’, ‘book’, ‘one’, ‘song’, ‘ice’, ‘fire’, ‘george’]***

对于该文本,书的每个页码被指定为“第 X 页”。在我当前的清理单词列表中,每个实例都显示为['page ',' #'],我将在下一篇文章中做进一步的文本分析时处理这个问题。

词干化和词汇化

如果这两个词中的任何一个听起来像一种奇怪的园艺形式,我完全理解。然而,这实际上是两种用于将单词的所有变体组合成其父形式的技术。例如,如果一个文本有“running”、“runs”和“run”,这些都是母词“run”的形式,应该转换并作为同一个词计算,因为它们具有相同的含义。逐行检查文本并试图找出每个单词是否应该转换成它的基本形式是计算密集型的,并且浪费时间。幸运的是,上一节中介绍的 nltk 包有一些功能可以帮您做到这一点!

词干删除单词的结尾(-ing,-ed,-s,或另一个常见的结尾),希望它能找到单词的“基本”形式。这种方法对于像' running'-'run ',' climbing'-'climb '和' pouring ' = ' pour '这样的词很管用,但是对于其他的词就不管用了,比如' leaves'-'leav '。下面是一个简单的例子:

from nltk.stem.porter import PorterStemmer
ps = **PorterStemmer()**
stemmed_words=[]
for w in filtered_words:
    stemmed_words.append(ps.stem(w))print('Original:', filtered_words[7], filtered_words[13], filtered_words[15], filtered_words[26])
**# Original: george urged began asked**print('Stemmed:', stemmed_words[7], stemmed_words[13], stemmed_words[15], stemmed_words[26])
**# Stemmed: georg urg began ask**

这种方法不能完全正确地转换所有的单词,因此 george 被改为 georg。为了解决这个问题,可以使用词条化来代替词干化,这可以达到相同的效果,但是使用一个由词条(单词的基本形式)组成的字典来判断截断单词的结尾是否有意义。它还考虑了单词的类型(名词、动词、形容词),以便更好地猜测父单词。此方法允许“leaves”转换为“leaf”,而不是“leav”。

from nltk.stem.wordnet import WordNetLemmatizer
lem = **WordNetLemmatizer()**
lemm_words=[]
for w in filtered_words:
    lemm_words.append(lem.lemmatize(w, 'v'))print('Original:', filtered_words[7], filtered_words[13], filtered_words[15], filtered_words[26])
**# Original: george urged began asked**print('Lemmatized:', lemm_words[7], lemm_words[13], lemm_words[15],lemm_words[26])
**# Lemmatized: george urge begin ask**

请注意词汇化是如何正确地将敦促、开始和要求转换为敦促、开始和要求的,因为它将所有的标记视为一个动词并搜索基本形式。它还忽略了所有不需要转换的单词。关于如何在 Python 中进行词干化和词汇化的有用指南可以在这里找到。

结合 NLTK 和 Regex

既然您已经对 Regex 和 NLTK 提供的东西有了一些了解,我将解释这两者的交集。当标记一个文本时,除了 nltk 中的缺省值之外,还可以进行拆分。这是通过使用 nltk.tokenize.RegexpTokenizer(pattern).tokenize(text)来完成的,并且您可以指定分割哪个正则表达式字符串。这类似于re.split(pattern, text),但是 NLTK 函数中指定的模式是您希望它返回的令牌的模式,而不是将被移除和拆分的内容。NLTK 中还内置了许多其他的记号赋予器,您可以在这里阅读。下面是一些nltk.tokenize.RegexpTokenizer()的例子:

from nltk.tokenize import RegexpTokenizer 
print(**RegexpTokenizer**(r'\w+').tokenize("This is the queen's castle. So exciting!"))
**# ['This', 'is', 'the', 'queen', 's', 'castle', 'So', 'exciting']**

还有一种简单的方法来实现前面提到的一些功能,尤其是搜索。这可以用来再次检查词干化/词干化是否达到了预期的效果。在这种情况下,我们可以看到以-ing 结尾的动词在词汇化过程中被从单词列表中删除了。

words_ending_with_ing = [w for w in **got_words** if re.search("ing$", w)]
print('Tokens:', words_ending_with_ing[3:8])
**# Tokens: ['falling', 'being', 'something', 'rushing', 'Something']**words_ending_with_ing2 = [w for w in **lemm_words** if re.search("ing$", w)]
print('Lemmatized:', words_ending_with_ing2[3:7])
**# Lemmatized: ['something', 'something', 'wildling', 'something']**

在标记列表中查找短语实例的另一种有用方法是,首先使用nltk.Text(list)将列表转换为文本对象,然后使用text.findall(r‘<>’)对该对象进行子集化,其中每个< >保存正则表达式字符串以匹配序列中的一个标记。我将通过下面的一些例子,这里有一个有用的参考供进一步探讨。

got_text = **nltk.Text**(lemm_words)
print(got_text)
**# <Text: game throne book one song ice fire george...>**print(**got_text.findall**(r'<.*><daenerys><.*>'))
*# hide daenerys brother; usurper daenerys quicken; day daenerys want; hot daenerys flinch; archer daenerys say; princess daenerys magister; hand daenerys find; help daenerys collar; sister daenerys stormborn;...drogo daenerys targaryen*

这是一个很酷的方法来找出你的文本可能隐藏了什么小短语,并且是开始分析文本的好地方。特别是,跟随丹妮莉丝贯穿整本书给了她一个非常快速的性格曲线的总结。接下来,我将介绍不同的方法来可视化单词在单词列表中的出现频率。

可视化词频

在实际分析文章之前,一个简单的方法是看看哪些词出现得最频繁。这也是一个好主意,以确保您已经删除了所有必要的停用词。可视化单词及其相对频率的一个基本方法是单词云,一个很好的演示可以在这里找到。这种方法仅显示每个单词与其他单词相比的相对频率,并且由于其抽象的性质,可能难以解释。为了补救这一点,我将探索 nltk 包中包含的不同的可视化方法,包括词汇分散图、频率分布图和 n 元语法频率分布图。

一个 频率分布图 根据频率绘制单词。剧情转折,我知道。这很有用,因为它显示了文本中有多少是由不同的主题或思想组成的。一个单词越常见,它就越是文章主题的中心。

freqdist = nltk.FreqDist(got_words)
plt.figure(figsize=(16,5))
plt.title('GOT Base Tokens Frequency Distribution')
freqdist.plot(50)

Original Token Frequency Distribution

Lemmatized Frequency distribution

我在一个发行版中包含了原始的标记,在另一个发行版中包含了经过过滤、词条化的单词,以强调删除停用词和其他非必要符号的重要性。第一版没有告诉我任何关于这本书的内容,而第二版给了我几个抓住了乔治·R·R·马丁精髓和写作风格的单词和角色名。基于词汇化分布的发现,我选择了 10 个词来绘制词汇离差图。

词汇分布图 显示了单词在文本中出现时的分布(偏移量)。例如,如果感兴趣的单词是“狐狸”,句子是“快速的棕色狐狸跳过懒惰的狗”,则该单词的偏移量将是 4,因为它是句子中的第四个单词。这种绘制单词及其偏移量的技术显示了主题随时间的变化。这也是一个非常可定制的情节,因为你可以选择可视化的话。

from yellowbrick.text import DispersionPlot
topics ['dragon', 'horse', 'death', 'father', 'king', 'brother', 'eye', 'hand', 'lord', 'ser']
plt.figure(figsize=(16,5))
visualizer = DispersionPlot(topics)
visualizer.fit([lemm_words])
visualizer.poof()

Lexical Dispersion Plot

正如你所看到的,在不同的时期,书中有不同的主题。进一步分析不同的关键词会发现不同的含义,但这是一个好的开始,可以看出哪些概念在书中是重要的。

结论

在本文中,我们介绍了 Regex 和不同的文本搜索方法,然后浏览了 NLTK 包中的基本工具,并了解了 Regex 如何与 NLTK 结合。最后,我们从书中提取了广泛的总结,并为进一步的分析准备了文本。我希望你喜欢这个旅程,你可以在这里查看更多的文本处理概念!

我的代码副本,有更多的例子和解释,可以在 github 上找到!请随意获取和使用代码。

更多资源

https://www . data camp . com/community/tutorials/text-analytics-初学者-nltk (通用文本处理的绝佳资源)
https://www . data camp . com/courses/natural-language-processing-fundamentals-in-python(NLP 的一门课程)

使用深度学习的文本摘要

原文:https://towardsdatascience.com/text-summarization-using-deep-learning-6e379ed2e89c?source=collection_archive---------6-----------------------

用数据做很酷的事情!

Text Summarization

介绍

随着互联网的兴起,我们现在可以随时获取信息。我们从许多来源被它轰炸——新闻、社交媒体、办公室邮件等等。要是有人能为我们总结出最重要的信息就好了!深度学习正在实现。通过序列到序列模型的最新进展,我们现在可以开发良好的文本摘要模型。

文本摘要有两种类型:

1.摘录摘要—这种方法从源文本中选择段落,然后对其进行排列以形成摘要。思考这个问题的一种方式是用荧光笔在重要的部分下划线。主要思想是摘要文本是源文本的子部分。

2.抽象总结——相反,抽象方法包括理解意图,并用自己的话写总结。我认为这类似于一支笔。

自然,抽象概括在这里是更具挑战性的问题。这是机器学习进展缓慢的一个领域。这是一个困难的问题,因为创建抽象的摘要需要很好地掌握主题和自然语言,这对于机器来说都是困难的任务。此外,从历史上看,我们没有一个好的大数据集来解决这个问题。这里的数据集指的是带有摘要的源文本。因为人类需要写摘要,所以获取大量摘要是一个问题,除了一个领域——新闻!

在呈现新闻文章时,专业作家不断总结信息,如下面 CNN 新闻的片段所示:

News snippet

商店亮点是为更大的文章创建的摘要。收集来自 CNN 和每日邮报的新闻数据,以创建用于文本摘要的CNN/每日邮报数据集,这是用于训练抽象摘要模型的关键数据集。使用这个数据集作为基准,研究人员一直在尝试深度学习模型设计。

我喜欢的一个这样的模型是 Abigail See 的指针生成器网络。我想用这个模型来强调深度学习摘要模型的关键组件。

在我们进入模型之前,让我们讨论一下文本摘要的评估指标 — Rouge Score 。Rouge score 突出显示了摘要文本和源文本之间的单词重叠。Rouge 1-测量源和摘要文本之间的单个单词重叠,而 Rouge 2 测量源和摘要之间的双字母重叠。因为 rouge 得分度量只考虑单词重叠而不考虑文本的可读性,所以它不是一个完美的度量,因为具有高 rouge 得分的文本可能是一个糟糕的摘要。

通过深度学习的文本摘要

做文本摘要的标准方法是注意使用 seq2seq 模型。参见下面来自指针生成器博客的模型结构。

Encoder-Decoder model architecture

序列到序列模型有三个主要方面:

1.编码器—从原始文本中提取信息的双向 LSTM 层。这在上面用红色显示。双向 LSTM 一次读取一个单词,因为它是 LSTM,所以它基于当前单词和它之前已经读取的单词来更新它的隐藏状态。

2.解码器—单向 LSTM 层,一次生成一个单词的摘要。解码器 LSTM 开始工作,一旦它得到的信号比完整的源文本已经阅读。它使用来自编码器的信息以及之前写入的信息来创建下一个单词的概率分布。解码器在上面以黄色显示,概率分布以绿色显示。

3.注意力机制——编码器和解码器是这里的构建模块,但历史上,没有注意力的编码器和解码器架构本身并不太成功。如果不注意,解码器的输入是来自编码器的最终隐藏状态,它可以是 256 或 512 维向量,如果我们想象这个小向量不可能包含所有信息,那么它就成为了信息瓶颈。通过注意机制,解码器可以访问编码器中的中间隐藏状态,并使用所有这些信息来决定下一个单词。注意力在上面以蓝色显示。注意力是一个非常棘手的概念,所以如果我在这里的简短描述令人困惑,请不要担心。你可以通过我的博客在这里阅读更多关于注意力的内容。

正如指针生成器论文所示,上面的体系结构足够好,可以开始使用,但是它创建的摘要有两个问题:

1.概要有时会不准确地再现事实细节(例如德国队以 3 比 2 击败阿根廷队)。这对于像 2–0 这样的罕见或不在词汇表中的单词尤其常见。

2.摘要经常重复出现。(例如德国打败德国打败德国…)

指针生成器模型通过创建一种指针机制来解决这些问题,这种机制允许它在生成文本和从源代码原样复制之间切换。把指针想象成一个介于 0 和 1 之间的概率标量。如果为 1,则模型抽象生成单词,如果为 0,则提取复制单词。

与序列到注意序列系统相比,指针生成器网络有几个优点:

  • 指针生成器网络使得从源文本复制单词变得容易。
  • 指针生成器模型甚至能够从源文本中复制词汇以外的单词。这是一个主要的好处,使我们能够处理看不见的单词,同时还允许我们使用更小的词汇(这需要更少的计算和存储空间)。
  • 指针生成器模型训练起来更快,需要更少的训练迭代来实现与序列间注意系统相同的性能。

结果

我们已经在 Tensorflow 中实现了这个模型,并在 CNN/Daily Mail 数据集上对其进行了训练。该模型获得了 0.38 的 Rouge-1 分数,这是最先进的。我们的观察是,该模型在根据新闻文章(即它所训练的数据)创建摘要方面做得非常好。然而,如果呈现的文本不是新闻,它仍然可以创建良好的摘要,但这些摘要本质上更具提取性。

我希望你喜欢这个博客。要测试指针生成器模型,请在链接处提取它们的代码。或者与我联系,检查我们的这种模式的版本。

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

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

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

参考资料:

关于指针生成器模型的博客

下载 CNN 每日邮报数据集

NLP —使用 NLTK: TF-IDF 算法的文本摘要

原文:https://towardsdatascience.com/text-summarization-using-tf-idf-e64a0644ace3?source=collection_archive---------0-----------------------

使用 Python ft 轻松实现。简化应用程序

在文章 使用 NLTK分 5 步进行文本摘要中,我们看到了如何使用词频算法对文本进行摘要。

****边注:测试版用户,注册我的新公司:https://lessentext.com

额外奖励:使用 Streamlit App 查看实际操作

现在,我们将使用 Tf-IDF 算法对文本进行总结。

Photo by Romain Vignes on Unsplash

****注意,我们在这里实现实际的算法,不使用任何库来完成大部分任务,我们高度依赖数学。

术语频率*逆文档频率

用简单的语言来说,TF-IDF 可以定义如下:

TF-IDF 中的高权重通过该术语在整个文档集合中的高术语频率(在给定文档中)和低文档频率来达到。

TF-IDF 算法由两种算法相乘而成。

检索词频率

词频(TF)是一个词在文档中出现的频率,除以有多少个词。

TF(t) =(术语 t 在文档中出现的次数)/(文档中的总术语数)

逆文档频率

词频是一个词有多常见,逆文档频率(IDF)是一个词有多独特或罕见。

IDF(t) = log_e(文档总数/包含术语 t 的文档数)

例如,
考虑包含 100 个单词的文档,其中单词 苹果 出现 5 次。 苹果 的项频率(即 TF)则为(5 / 100) = 0.05。

现在,假设我们有 1000 万份文档,其中 1000 份文档中出现了单词 apple 。然后,逆文档频率(即 IDF)计算为 log(10,000,000 / 1,000) = 4。

因此,TF-IDF 重量是这些量的乘积:0.05 * 4 = 0.20。

很简单,对吧?我们将使用相同的公式来生成摘要。

哦,是的,我喜欢数学。

9 步实施

额外条件 Python3,Python 的 NLTK 库,你最喜欢的文本编辑器或 IDE

1.给句子做记号

我们将在这里标记句子而不是单词。我们会给这些句子加权。

2.创建每个句子中单词的频率矩阵。

我们计算每个句子中的词频。

结果会是这样的:

{'\nThose Who Are ': {'resili': 1, 'stay': 1, 'game': 1, 'longer': 1, '“': 1, 'mountain': 1}, 'However, I real': {'howev': 1, ',': 2, 'realis': 1, 'mani': 1, 'year': 1}, 'Have you experi': {'experienc': 1, 'thi': 1, 'befor': 1, '?': 1}, 'To be honest, I': {'honest': 1, ',': 1, '’': 1, 'answer': 1, '.': 1}, 'I can’t tell yo': {'’': 1, 'tell': 1, 'right': 1, 'cours': 1, 'action': 1, ';': 1, 'onli': 1, 'know': 1, '.': 1}...}

在这里,每个句子都是关键,值是词频字典。****

3.计算词频并生成矩阵

我们会找到段落中每个单词的词频。

现在,记住 TF,的定义

TF(t) =(术语 t 在文档中出现的次数)/(文档中的总术语数)

在这里,文档是一个段落,术语是一个段落中的一个词。

现在得到的矩阵看起来像这样:

{'\nThose Who Are ': {'resili': 0.03225806451612903, 'stay': 0.03225806451612903, 'game': 0.03225806451612903, 'longer': 0.03225806451612903, '“': 0.03225806451612903, 'mountain': 0.03225806451612903}, 'However, I real': {'howev': 0.07142857142857142, ',': 0.14285714285714285, 'realis': 0.07142857142857142, 'mani': 0.07142857142857142, 'year': 0.07142857142857142}, 'Have you experi': {'experienc': 0.25, 'thi': 0.25, 'befor': 0.25, '?': 0.25}, 'To be honest, I': {'honest': 0.2, ',': 0.2, '’': 0.2, 'answer': 0.2, '.': 0.2}, 'I can’t tell yo': {'’': 0.1111111111111111, 'tell': 0.1111111111111111, 'right': 0.1111111111111111, 'cours': 0.1111111111111111, 'action': 0.1111111111111111, ';': 0.1111111111111111, 'onli': 0.1111111111111111, 'know': 0.1111111111111111, '.': 0.1111111111111111}}

如果我们将这个表与我们在步骤 2 中生成的表进行比较,您将看到具有相同频率的单词具有相似的 TF 分数。

4.为每个单词创建一个文档表

这也是一个简单的表格,有助于计算 IDF 矩阵。

我们计算,“多少个句子包含一个单词”,姑且称之为文档按单词矩阵。

这是我们现在得到的,

{'resili': 2, 'stay': 2, 'game': 3, 'longer': 2, '“': 5, 'mountain': 1, 'truth': 1, 'never': 2, 'climb': 1, 'vain': 1, ':': 8, 'either': 1, 'reach': 1, 'point': 2, 'higher': 1, 'today': 1, ',': 22, 'train': 1, 'power': 4, 'abl': 1, 'tomorrow.': 1, '”': 5, '—': 3, 'friedrich': 1, 'nietzsch': 1, 'challeng': 2, 'setback': 2, 'meant': 1, 'defeat': 3, 'promot': 1, '.': 45, 'howev': 2, 'realis': 2, 'mani': 3, 'year': 4, 'crush': 1, 'spirit': 1, 'easier': 1, 'give': 4, 'risk': 1}

****即单词resili出现在 2 个句子中,power出现在 4 个句子中。

5.计算 IDF 并生成矩阵

我们将为段落中的每个单词找到 IDF。

现在,记住 IDF,的定义

IDF(t) = log_e(文档总数/包含术语 t 的文档数)

在这里,文档是一个段落,术语是一个段落中的一个词。

现在得到的矩阵看起来像这样:

{'\nThose Who Are ': {'resili': 1.414973347970818, 'stay': 1.414973347970818, 'game': 1.2388820889151366, 'longer': 1.414973347970818, '“': 1.0170333392987803, 'mountain': 1.7160033436347992}, 'However, I real': {'howev': 1.414973347970818, ',': 0.37358066281259295, 'realis': 1.414973347970818, 'mani': 1.2388820889151366, 'year': 1.1139433523068367}, 'Have you experi': {'experienc': 1.7160033436347992, 'thi': 1.1139433523068367, 'befor': 1.414973347970818, '?': 0.9378520932511555}, 'To be honest, I': {'honest': 1.7160033436347992, ',': 0.37358066281259295, '’': 0.5118833609788743, 'answer': 1.414973347970818, '.': 0.06279082985945544}, 'I can’t tell yo': {'’': 0.5118833609788743, 'tell': 1.414973347970818, 'right': 1.1139433523068367, 'cours': 1.7160033436347992, 'action': 1.2388820889151366, ';': 1.7160033436347992, 'onli': 1.2388820889151366, 'know': 1.0170333392987803, '.': 0.06279082985945544}}

将其与 TF 矩阵进行比较,看看有什么不同。

6.计算 TF-IDF 并生成矩阵

现在我们有了矩阵,下一步就很容易了。

TF-IDF 算法由两种算法相乘而成。

简单地说,我们将矩阵中的值相乘并生成新的矩阵。

{'\nThose Who Are ': {'resili': 0.04564430154744574, 'stay': 0.04564430154744574, 'game': 0.03996393835210118, 'longer': 0.04564430154744574, '“': 0.0328075270741542, 'mountain': 0.05535494656886449}, 'However, I real': {'howev': 0.10106952485505842, ',': 0.053368666116084706, 'realis': 0.10106952485505842, 'mani': 0.08849157777965261, 'year': 0.07956738230763119}, 'Have you experi': {'experienc': 0.4290008359086998, 'thi': 0.2784858380767092, 'befor': 0.3537433369927045, '?': 0.23446302331278887}, 'To be honest, I': {'honest': 0.34320066872695987, ',': 0.07471613256251859, '’': 0.10237667219577487, 'answer': 0.2829946695941636, '.': 0.01255816597189109}, 'I can’t tell yo': {'’': 0.0568759289976527, 'tell': 0.15721926088564644, 'right': 0.12377148358964851, 'cours': 0.19066703818164435, 'action': 0.13765356543501517, ';': 0.19066703818164435, 'onli': 0.13765356543501517, 'know': 0.11300370436653114, '.': 0.006976758873272827}}

7.给句子打分

不同的算法给句子打分是不同的。这里,我们使用 Tf-IDF 句子中的单词得分来给段落加权。

这给出了句子表及其相应的分数:

{'\nThose Who Are ': 0.049494684794344025, 'However, I real': 0.09203831532832171, 'Have you experi': 0.3239232585727256, 'To be honest, I': 0.16316926181026162, 'I can’t tell yo': 0.12383203821623005}

8.找到门槛

与任何总结算法类似,可以有不同的方法来计算阈值。我们在计算平均句子得分。

我们得到以下平均分数:

0.15611302409372044

9.生成摘要

****算法:如果句子得分大于平均得分,则选择一个句子进行摘要。

#一切尽在一处:算法集合😆

对于阈值,我们使用平均分数的 1.3 倍。您可以随意使用这些变量来生成摘要。****

试驾?

原文:

Those Who Are Resilient Stay In The Game Longer
“On the mountains of truth you can never climb in vain: either you will reach a point higher up today, or you will be training your powers so that you will be able to climb higher tomorrow.” — Friedrich Nietzsche
Challenges and setbacks are not meant to defeat you, but promote you. However, I realise after many years of defeats, it can crush your spirit and it is easier to give up than risk further setbacks and disappointments. Have you experienced this before? To be honest, I don’t have the answers. I can’t tell you what the right course of action is; only you will know. However, it’s important not to be discouraged by failure when pursuing a goal or a dream, since failure itself means different things to different people. To a person with a Fixed Mindset failure is a blow to their self-esteem, yet to a person with a Growth Mindset, it’s an opportunity to improve and find new ways to overcome their obstacles. Same failure, yet different responses. Who is right and who is wrong? Neither. Each person has a different mindset that decides their outcome. Those who are resilient stay in the game longer and draw on their inner means to succeed.I’ve coached many clients who gave up after many years toiling away at their respective goal or dream. It was at that point their biggest breakthrough came. Perhaps all those years of perseverance finally paid off. It was the 19th Century’s minister Henry Ward Beecher who once said: “One’s best success comes after their greatest disappointments.” No one knows what the future holds, so your only guide is whether you can endure repeated defeats and disappointments and still pursue your dream. Consider the advice from the American academic and psychologist Angela Duckworth who writes in Grit: The Power of Passion and Perseverance: “Many of us, it seems, quit what we start far too early and far too often. Even more than the effort a gritty person puts in on a single day, what matters is that they wake up the next day, and the next, ready to get on that treadmill and keep going.”I know one thing for certain: don’t settle for less than what you’re capable of, but strive for something bigger. Some of you reading this might identify with this message because it resonates with you on a deeper level. For others, at the end of their tether the message might be nothing more than a trivial pep talk. What I wish to convey irrespective of where you are in your journey is: NEVER settle for less. If you settle for less, you will receive less than you deserve and convince yourself you are justified to receive it.“Two people on a precipice over Yosemite Valley” by Nathan Shipps on Unsplash
Develop A Powerful Vision Of What You Want
“Your problem is to bridge the gap which exists between where you are now and the goal you intend to reach.” — Earl Nightingale
I recall a passage my father often used growing up in 1990s: “Don’t tell me your problems unless you’ve spent weeks trying to solve them yourself.” That advice has echoed in my mind for decades and became my motivator. Don’t leave it to other people or outside circumstances to motivate you because you will be let down every time. It must come from within you. Gnaw away at your problems until you solve them or find a solution. Problems are not stop signs, they are advising you that more work is required to overcome them. Most times, problems help you gain a skill or develop the resources to succeed later. So embrace your challenges and develop the grit to push past them instead of retreat in resignation. Where are you settling in your life right now? Could you be you playing for bigger stakes than you are? Are you willing to play bigger even if it means repeated failures and setbacks? You should ask yourself these questions to decide whether you’re willing to put yourself on the line or settle for less. And that’s fine if you’re content to receive less, as long as you’re not regretful later.If you have not achieved the success you deserve and are considering giving up, will you regret it in a few years or decades from now? Only you can answer that, but you should carve out time to discover your motivation for pursuing your goals. It’s a fact, if you don’t know what you want you’ll get what life hands you and it may not be in your best interest, affirms author Larry Weidel: “Winners know that if you don’t figure out what you want, you’ll get whatever life hands you.” The key is to develop a powerful vision of what you want and hold that image in your mind. Nurture it daily and give it life by taking purposeful action towards it.Vision + desire + dedication + patience + daily action leads to astonishing success. Are you willing to commit to this way of life or jump ship at the first sign of failure? I’m amused when I read questions written by millennials on Quora who ask how they can become rich and famous or the next Elon Musk. Success is a fickle and long game with highs and lows. Similarly, there are no assurances even if you’re an overnight sensation, to sustain it for long, particularly if you don’t have the mental and emotional means to endure it. This means you must rely on the one true constant in your favour: your personal development. The more you grow, the more you gain in terms of financial resources, status, success — simple. If you leave it to outside conditions to dictate your circumstances, you are rolling the dice on your future.So become intentional on what you want out of life. Commit to it. Nurture your dreams. Focus on your development and if you want to give up, know what’s involved before you take the plunge. Because I assure you, someone out there right now is working harder than you, reading more books, sleeping less and sacrificing all they have to realise their dreams and it may contest with yours. Don’t leave your dreams to chance.

总结正文:

**Have you experienced this before? Who is right and who is wrong? Neither. It was at that point their biggest breakthrough came. Perhaps all those years of perseverance finally paid off. It must come from within you. Where are you settling in your life right now? Could you be you playing for bigger stakes than you are? So become intentional on what you want out of life. Commit to it. Nurture your dreams.**

瞧啊。您刚刚使用臭名昭著的 Tf-IDF 算法总结了文本。现在向你的朋友炫耀吧。😎

接下来呢?

  1. ****玩玩:试试改变阈值(1.5x 到 1.3x 或者 1.8x),看看会出什么结果。
  2. ****引申:你也可以引申为用“你想要的若干行/句子”来概括一段文字。

: 这是一种 抽取 文本摘要技术。

在这里找到完整的代码

** [## akashp1712/nlp-akash

自然语言处理注释和实现— akashp1712/nlp-akash

github.com](https://github.com/akashp1712/nlp-akash/blob/master/text-summarization/TF_IDF_Summarization.py)

一个小小的请求:请报名参加我的新创业:【https://lessentext.com】**并提前提供反馈!****

文本到图像

原文:https://towardsdatascience.com/text-to-image-a3b201b003ae?source=collection_archive---------4-----------------------

本文将解释一篇有趣的论文背后的实验和理论,该论文将自然语言文本描述(如“一只小鸟有一个短而尖的橙色喙和白色腹部”)转换为 64x64 RGB 图像。以下是 Reed 等人的论文“生成性对立文本到图像合成”的链接。

[## 生成对立文本到图像合成

从文本中自动合成真实的图像将会是有趣和有用的,但是目前的人工智能系统还远远不能…

arxiv.org](https://arxiv.org/abs/1605.05396)

文章大纲

  1. 介绍
  2. 使用的架构
  3. 为可视属性构造文本嵌入
  4. 流形插值
  5. 结果/结论

介绍

将自然语言文本描述转换为图像是深度学习的一个惊人演示。诸如情感分析的文本分类任务已经通过深度递归神经网络获得成功,该深度递归神经网络能够从文本中学习有区别的向量表示。在另一个领域,深度卷积 GANs 能够根据从正态分布采样的随机噪声向量来合成图像,例如卧室的内部。Reed 等人[1]的重点是将深度 RNN 文本嵌入和图像合成的进展与 DCGANs 联系起来,这是受条件 GANs 思想的启发。

除了随机采样的噪声向量之外,条件 gan 还通过输入一个独热类标签向量作为生成器和鉴别器的输入来工作。这导致更高的训练稳定性,更具视觉吸引力的结果,以及可控的发电机输出。传统的条件-GANs 和文本-图像模型的区别在于条件输入。不是试图构造稀疏的视觉属性描述符来调节 GANs,而是基于通过深度神经网络学习的文本嵌入来调节 GANs。一个稀疏的视觉属性描述符可能会将“一只长着橙色喙的小鸟”描述为:

 [ 0 0 0 1 . . . 0 0 . . . 1 . . . 0 0 0 . . . 0 0 1 . . .0 0 0]

向量中的数字代表属性问题,如橙色(1/0)?小(1/0)?鸟(1/0)?这种描述很难收集,在实践中也不太管用。

通过使用 Word2Vec 等概念,单词嵌入已经成为自然语言处理的英雄。Word2Vec 通过学习预测给定单词的上下文来形成嵌入。不幸的是,Word2Vec 并不能完全翻译成文本到图像,因为单词的上下文并不能像一个明确训练的嵌入那样捕捉视觉属性。Reed 等人[1]提出了一种新颖的图像和文本描述的对称结构化联合嵌入,以克服这一挑战,本文稍后将对此进行详细介绍。

除了构建良好的文本嵌入,从文本到图像的翻译是高度多模态的。“多模态”这个术语是深度学习研究中需要熟悉的一个重要术语。这是指这样一个事实,即有许多不同的鸟的图像与文本描述“鸟”相对应。另一个例子是在演讲中有许多不同的口音,等等。这将导致对应于文本“鸟”的不同声音。多模态学习也存在于图像字幕(图像到文本)中。然而,由于文本的顺序结构,使得该模型可以预测以图像为条件的下一个单词以及先前预测的单词,这非常方便。多模态学习传统上非常困难,但随着 GANs(生成对抗网络)的发展,这种框架创建了一种自适应损失函数,非常适合于多模态任务,如文本到图像。

使用的架构

上图显示了 Reed 等人用于训练这种文本到图像 GAN 模型的架构。从这个图中最值得注意的是文本嵌入如何适应模型的顺序处理的可视化。在生成器网络中,文本嵌入通过全连接层过滤,并与随机噪声向量 z 连接。在这种情况下,文本嵌入从 1024x1 向量转换为 128x1 向量,并与 100x1 随机噪声向量 z 连接。在鉴别器网络侧,文本嵌入也通过全连接层压缩为 128x1 向量,然后整形为 4x4 矩阵,并与图像表示深度连接。该图像表示是在输入图像经过多次卷积、降低空间分辨率和提取信息之后得到的。鉴别器的这种嵌入策略不同于条件 GAN 模型,在条件 GAN 模型中,嵌入被级联到原始图像矩阵中,然后被卷积。

关于架构图,有一点需要注意,那就是直观地了解 DCGAN 如何对矢量或低分辨率图像进行上采样,以产生高分辨率图像。你可以看到每个反卷积层都提高了图像的空间分辨率。此外,特征图的深度每层都减少。最后,您可以看到鉴别器网络中的卷积层在处理图像时如何降低空间分辨率并增加特征图的深度。

关于这个训练过程的一个有趣的事情是,很难区分基于生成的图像看起来不真实的损失或者基于生成的图像与文本描述不匹配的损失。该论文的作者描述了训练动态,即最初鉴别器不注意任何文本嵌入,因为由生成器创建的图像看起来根本不真实。一旦 G 可以生成至少通过真假标准的图像,那么文本嵌入也会被考虑在内。

作者通过添加带有被标记为“假”的不正确文本描述的真实图像对来平滑这种训练动态。鉴别器只关注真实与虚假的二元任务,而不是将图像与文本分开考虑。这与诸如具有独热编码分类标签的 AC-GAN 的方法形成对比。AC-GAN 鉴别器输出真实与虚假,并使用共享中间特征的辅助分类器来分类图像的类别标签。

为可视属性构造文本嵌入

这篇论文最有趣的部分是他们如何构造一个独特的文本嵌入,其中包含要表示的图像的视觉属性。该载体通过以下过程构建:

记为等式(2)的损失函数表示文本分类器的总体目标,其优化两个损失函数之间的选通损失。这些损失函数如等式 3 和等式 4 所示。该论文将这一过程的直觉描述为“与任何其他类别相比,文本编码应该与相应类别的图像具有更高的兼容性得分,反之亦然”。这两个术语分别代表图像编码器和文本编码器。图像编码器取自 GoogLeNet 图像分类模型。该分类器降低了图像的维数,直到它被压缩成 1024×1 的向量。因此,目标函数旨在最小化来自 GoogLeNet 的图像表示和来自字符级 CNN 或 LSTM 的文本表示之间的距离。本质上,用于图像分类的矢量编码用于基于与相似图像的相似性来指导文本编码。

这方面的细节将在 Reed 等人的论文“学习细粒度可视化描述的深度表示”中详细阐述。

[## 学习细粒度可视化描述的深层表示

零镜头视觉识别的最新方法将学习公式化为图像和图像的联合嵌入问题

arxiv.org](https://arxiv.org/abs/1605.05395)

请注意“细粒度”这个术语,它用于将不同类型的鸟和花等任务与完全不同的对象(如猫、飞机、船、山、狗等)进行区分。就像在 ImageNet 挑战赛中使用的一样。

流形插值

生成对抗网络的一个有趣的特征是潜在向量 z 可以用来插入新的实例。这通常被称为“潜在空间添加”。一个例子是做“戴眼镜的男人”——“不戴眼镜的男人”+“不戴眼镜的女人”,实现一个戴眼镜的女人。在本文中,作者的目的是在文本嵌入之间进行插值。这是通过以下等式实现的:

鉴别器已经被训练来预测图像和文本对是否匹配。因此,来自内插文本嵌入的图像可以填充在训练期间出现的数据流形中的间隙。使用这种方法作为训练数据空间的正则化方法,对于本文提出的模型的成功结果是至关重要的。这是数据扩充的一种形式,因为内插的文本嵌入可以扩展用于训练文本到图像 GAN 的数据集。

结果/结论

实验使用三个数据集进行,包含来自 200 个类别的 11,788 幅鸟类图像的 CUB 数据集,包含来自 102 个不同类别的 8,189 幅图像的 Oxford-102 花卉数据集,以及 MS-COCO 数据集,以展示所提出算法的可推广性。

来自 CUB 和 Oxford-102 的每张图片都包含 5 个文字说明。

Results on CUB Birds Dataset

Results on Oxford-102

Results on MS-COCO

上面给出的所有结果都是关于零射击学习任务的,这意味着该模型以前在训练期间从未见过该文本描述。上面的每张图片分辨率都很低,为 64x64x3。然而,看到这种算法在文本到图像的非常困难的多模态任务上取得一些成功是非常令人鼓舞的。感谢您阅读这篇文章,我强烈推荐您查看这篇文章以了解更多信息!

参考

[1] Scott Reed,Zeynep Akata,,Yan,Lajanugen Logeswaran,Bernt Schiele,Honglak Lee .生成对立文本到图像合成。2016.

[2]斯科特·里德、泽内普·阿卡塔、伯恩特·谢勒、洪拉克·李。学习细粒度可视化描述的深层表示。2016.

text 2 image:NLP 的新途径?

原文:https://towardsdatascience.com/text2image-a-new-way-to-nlp-cbf63376aa0d?source=collection_archive---------8-----------------------

问题是

自然语言处理(NLP)一直被认为是一个棘手的问题,至少与计算机视觉相比是如此。NLP 模型运行时间更长,通常更难以实现,并且需要高得多的计算资源。另一方面,图像识别模型已经变得更容易实现,对 GPU 的负担也更轻。这让我想到,我们能不能把一个文本集转换成一张图片?我们能把文字解释成图像吗?事实证明,是的,而且结果出人意料地有希望!我们用这种方法来解决真假新闻的分类问题。

在本文中,我们将详细探讨这种方法、结果、结论和进一步的改进。大家系好安全带!

介绍

灵感

将文本转换成图像的想法最初是受到 Gleb Esman 关于欺诈检测的这篇文章的启发。在这种方法中,他们转换了各种数据点,如鼠标移动的速度、方向、加速度等。变成彩色图像。然后对这些图像运行图像识别模型,产生高度准确的结果。

数据

所有实验使用的数据都是乔治·麦克林泰尔的假新闻数据集的子集。它包含大约 1000 篇虚假和真实的新闻,加在一起。

feet 从 20,000 英尺的高度拍摄的图像

让我们首先在高层次上讨论 Text2Image。基本的想法是将文本转换成我们可以绘制成热图的东西。等等,那是什么东西?每个单词的 TF-IDF 值。术语频率—逆文档频率(TF-IDF)是一种统计方法,用于确定一个单词相对于文档中其他单词的重要性。在基本的预处理和计算 tf-idf 值之后,我们使用一定量的高斯平滑滤波将它们绘制成对数标度的热图。一旦绘制了热图,我们就使用 CNN 的 fast.ai 实现,并尝试区分真实和虚假的热图。我们最终获得了大约 71%的稳定准确率,这是这种新方法的良好开端。这是我们方法的一个简短流程图

Text2Image

还不太清楚?请继续阅读。

text 2 来自地面的图像

预处理

数据是小写的,所有特殊字符被删除,文本和标题被连接。出现在超过 85%的文档中的单词也被删除。此外,明确避免单词列表(停用词)。使用的是一个标准的停用词列表,大部分是无意义的重复词。修改专门用于假新闻的停用词可以是未来探索的一个领域,尤其是展现假新闻特有的写作风格。

计算 TF-IDF

为了对关键词进行评分和提取,使用了平滑术语频率逆文档(tf-idf)的 scikit-learn 实现。虚假和真实新闻语料的 IDF 是分别计算的。与整个语料库的单一 IDF 分数相比,计算单独的 IDF 分数导致了准确性的巨大飞跃。然后为每个文档迭代计算 tf-idf 分数。在这里,标题和正文不是分开评分的,而是一起评分的。

Calculating the Term Frequency

Calculating the IDF

将它们相乘,我们得到 tf-idf。我们为每个文档迭代地这样做。

处理 TF-IDF 值

对于每个文档,提取具有最高 TF-IDF 值的 121 个单词。然后这些字被用来创建一个 11×11 的数组。在这里,选择的字数可以作为一个超参数。对于更短、更简单的文本,可以使用更少的单词,而使用更多的单词来表示更长、更复杂的文本。根据经验,11x11 是该数据集的理想大小。TF-IDF 值不是按大小降序排列,而是根据它们在文本中的位置进行映射。TF-IDF 值以这种方式映射,因为它更能代表文本,并为模型提供更丰富的训练特征。因为一个单词可以在一段文本中出现多次,所以它的第一次出现被考虑在内。

不是按原样绘制 TF-IDF 值,而是以对数标度绘制所有值。这样做是为了减小上限值和下限值之间的巨大差异

在绘图时,由于这种差异,热图的大部分不会显示任何颜色差异。因此,它们以对数标度绘制,以更好地显示差异。

Figure 1 (left) shows the TF-IDF values plotted as is. Figure 2 (right) shows the same values plotted on a log scale

其中一个缺点是在训练模型时大量过拟合。这可以归因于缺乏任何数据扩充,因为目前,没有任何数据扩充的方法对于该用例是可行的。因此,在整个数据集上使用高斯滤波来平滑曲线。虽然它确实降低了一点准确性,但是过度拟合显著降低,尤其是在训练的初始阶段。

最终图

最终的热图尺寸为 11 x 11,由 seaborn 绘制。由于 x 轴和 y 轴以及颜色条在训练时不传递任何信息,因此我们将其移除。使用的热图类型是“等离子体”,因为它显示出理想的颜色变化。尝试不同的颜色组合可以是未来探索的一个领域。这里有一个例子,展示了最终的情节。

Final Plots

训练我们的模型

使用 fast.ai 在 resnet34 上训练该模型,总共使用了 489 篇假文章和 511 篇真文章。在没有数据扩充的情况下,在训练集和测试集之间使用标准的 80:20 分割。所有使用的代码都可以在这里找到。

结果

结论

经过 9 个时期后,模型的准确率达到 70%以上。尽管离这个数据集的最先进水平还很远,但这种新方法看起来确实很有前途。这是在训练过程中观察到的一些现象—

  • 这个模型过度拟合了很多。与我们的预期相反,增加数据对过度拟合没有任何影响。进一步的训练或改变学习率没有任何效果。
  • 在 11x11 之前,增加地块大小是有帮助的,在此之后,增加地块大小会导致精度下降。
  • 在图上使用一定量的高斯滤波有助于提高精确度

未来的工作

目前,我们正致力于可视化词性(POS)标签和手套词嵌入。我们也在研究修改停用词,调整情节的大小和颜色模式。将保持你将张贴的进展!

如果您有兴趣探索 Text2Image 的更多可能性,或者想就此展开讨论,您可以在 Twitter @ Abhijithhere_ 上找到我,或者访问我的个人页面

理解 Python 关键字提取的 TextRank

原文:https://towardsdatascience.com/textrank-for-keyword-extraction-by-python-c0bae21bcec0?source=collection_archive---------1-----------------------

Python 和 spaCy 的一个 scratch 实现,帮助你理解用于关键词提取的 PageRank 和 TextRank。

image from www.adaringadventure.com

介绍

TextRank 是一种基于 PageRank 的算法,常用于关键词抽取和文本摘要。在本文中,我将帮助您理解 TextRank 如何使用关键字提取示例,并展示 Python 的实现。

Keywords Extraction with TextRank, NER, etc

目录

  • 了解 PageRank
  • PageRank 的实现
  • 通过 TextRank 提取关键词
  • 关键词提取的实现

了解 PageRank

关于 PageRank 的文章数不胜数,我就简单介绍一下 PageRank。这有助于我们后面理解 TextRank,因为它是基于 PageRank 的。

PageRank (PR)是一种用于计算网页权重的算法。我们可以把所有的网页看作一个大的有向图。在此图中,节点是一个网页。如果网页 A 具有到网页 B 的链接,它可以被表示为从 A 到 B 的有向边。

在我们构建了整个图之后,我们可以通过下面的公式为网页分配权重。

这里有一个例子可以更好地理解上面的符号。我们有一个图表来表示网页之间的链接。每个节点代表一个网页,箭头代表边。我们想得到网页e的权重。

我们可以把上面函数中的求和部分改写成一个更简单的版本。

我们可以通过下面的函数得到网页e的权重。

我们可以看到网页e的权重依赖于其入站页面的权重。我们需要运行这个迭代很多次来得到最终的权重。在初始化时,每个网页的重要性为 1。

PageRank 的实现

我们可以用一个矩阵来表示图中 a、b、e、f 之间的入站和出站链路。

一行中的每个节点表示来自其他节点的入站链接。例如,对于e行,节点ab具有到节点e的出站链接。此演示将简化更新权重的计算。

根据函数中的1/|Out(Vi)|,我们应该归一化每一列。

我们用这个矩阵乘以所有节点的权重。

这只是一个没有转储因子d的迭代。

我们可以用 Python 多次迭代。

import numpy as npg = [[0, 0, 0, 0],
     [0, 0, 0, 0],
     [1, 0.5, 0, 0],
     [0, 0.5, 0, 0]]g = np.array(g)
pr = np.array([1, 1, 1, 1]) # initialization for a, b, e, f is 1
d = 0.85for iter in range(10):
    pr = 0.15 + 0.85 * np.dot(g, pr)
    print(iter)
    print(pr)

输出

0
[0.15  0.15  1.425 0.575]
1
[0.15    0.15    0.34125 0.21375]
2
[0.15    0.15    0.34125 0.21375]
3
[0.15    0.15    0.34125 0.21375]
4
[0.15    0.15    0.34125 0.21375]
5
[0.15    0.15    0.34125 0.21375]
6
[0.15    0.15    0.34125 0.21375]
7
[0.15    0.15    0.34125 0.21375]
8
[0.15    0.15    0.34125 0.21375]
9
[0.15    0.15    0.34125 0.21375]
10
[0.15    0.15    0.34125 0.21375]

所以 e 的权重(PageRank 值)是 0.34125。

如果我们把有向边改为无向边,我们可以相应地改变矩阵。

正常化。

我们应该相应地改变代码。

import numpy as npg = [[0, 0, 0.5, 0],
     [0, 0, 0.5, 1],
     [1, 0.5, 0, 0],
     [0, 0.5, 0, 0]]g = np.array(g)
pr = np.array([1, 1, 1, 1]) # initialization for a, b, e, f is 1
d = 0.85for iter in range(10):
    pr = 0.15 + 0.85 * np.dot(g, pr)
    print(iter)
    print(pr)

输出

0
[0.575 1.425 1.425 0.575]
1
[0.755625 1.244375 1.244375 0.755625]
2
[0.67885937 1.32114062 1.32114062 0.67885937]
3
[0.71148477 1.28851523 1.28851523 0.71148477]
4
[0.69761897 1.30238103 1.30238103 0.69761897]
5
[0.70351194 1.29648806 1.29648806 0.70351194]
6
[0.70100743 1.29899257 1.29899257 0.70100743]
7
[0.70207184 1.29792816 1.29792816 0.70207184]
8
[0.70161947 1.29838053 1.29838053 0.70161947]
9
[0.70181173 1.29818827 1.29818827 0.70181173]

所以 e 的权重(PageRank 值)是 1.29818827。

通过 TextRank 提取关键词

TextRank 和 PageTank 有什么区别?

简单的回答就是 PageRank 是网页排名,TextRank 是文字排名。PageRank 中的网页就是 TextRank 中的文本,所以基本思路是一样的。

这里我们有一些文字,摘自这里。我会用空间

我们将一个文档拆分成几个句子,我们只存储那些带有特定 POS 标签的单词。我们使用空间进行词性标注。

import spacy
nlp = spacy.load('en_core_web_sm')content = '''
The Wandering Earth, described as China’s first big-budget science fiction thriller, quietly made it onto screens at AMC theaters in North America this weekend, and it shows a new side of Chinese filmmaking — one focused toward futuristic spectacles rather than China’s traditionally grand, massive historical epics. At the same time, The Wandering Earth feels like a throwback to a few familiar eras of American filmmaking. While the film’s cast, setting, and tone are all Chinese, longtime science fiction fans are going to see a lot on the screen that reminds them of other movies, for better or worse.
'''doc = nlp(content)
for sents in doc.sents:
    print(sents.text)

我们把这一段分成三句话。

The Wandering Earth, described as China’s first big-budget science fiction thriller, quietly made it onto screens at AMC theaters in North America this weekend, and it shows a new side of Chinese filmmaking — one focused toward futuristic spectacles rather than China’s traditionally grand, massive historical epics.At the same time, The Wandering Earth feels like a throwback to a few familiar eras of American filmmaking.While the film’s cast, setting, and tone are all Chinese, longtime science fiction fans are going to see a lot on the screen that reminds them of other movies, for better or worse.

因为句子中的大多数单词对确定重要性没有用,所以我们只考虑带名词、定语、动词词性标签的单词。这是可选的,你也可以使用所有单词。

candidate_pos = ['NOUN', 'PROPN', 'VERB']
sentences = []
​
for sent in doc.sents:
    selected_words = []
    for token in sent:
        if token.pos_ in candidate_pos and token.is_stop is False:
            selected_words.append(token)
    sentences.append(selected_words)
​
print(sentences)

输出

[[Wandering, Earth, described, China, budget, science, fiction, thriller, screens, AMC, theaters, North, America, weekend, shows, filmmaking, focused, spectacles, China, epics], [time, Wandering, Earth, feels, throwback, eras, filmmaking], [film, cast, setting, tone, science, fiction, fans, going, lot, screen, reminds, movies]]

每个单词都是 PageRank 中的一个节点。我们将窗口大小设置为 k。

[w1, w2, …, w_k], [w2, w3, …, w_{k+1}], [w3, w4, …, w_{k+2}]是窗户。窗口中的任何两个单词对都被认为具有无向边。

我们以[time, Wandering, Earth, feels, throwback, eras, filmmaking]为例,设置窗口大小 k=4,那么得到 4 个窗口,[time, Wandering, Earth, feels][Wandering, Earth, feels, throwback][Earth, feels, throwback, eras][feels, throwback, eras, filmmaking]

对于窗口[time, Wandering, Earth, feels],任何两个单词对都有一条无向边。所以我们得到了(time, Wandering), (time, Earth), (time, feels), (Wandering, Earth), (Wandering, feels), (Earth, feels)

基于这个图,我们可以计算每个节点(单词)的权重。最重要的词可以作为关键词。

关键词提取的实现

这里我用 Python 实现了一个完整的例子,我们使用 spaCy 来获取单词的 POS 标签。

这个TextRank4Keyword实现了我在上一节描述的所有功能。我们可以看到一个段落的输出。

text = '''
The Wandering Earth, described as China’s first big-budget science fiction thriller, quietly made it onto screens at AMC theaters in North America this weekend, and it shows a new side of Chinese filmmaking — one focused toward futuristic spectacles rather than China’s traditionally grand, massive historical epics. At the same time, The Wandering Earth feels like a throwback to a few familiar eras of American filmmaking. While the film’s cast, setting, and tone are all Chinese, longtime science fiction fans are going to see a lot on the screen that reminds them of other movies, for better or worse.
'''
​
tr4w = TextRank4Keyword()
tr4w.analyze(text, candidate_pos = ['NOUN', 'PROPN'], window_size=4, lower=False)
tr4w.get_keywords(10)

输出

science - 1.717603106506989
fiction - 1.6952610926181002
filmmaking - 1.4388798751402918
China - 1.4259793786986021
Earth - 1.3088154732297723
tone - 1.1145002295684114
Chinese - 1.0996896235078055
Wandering - 1.0071059904601571
weekend - 1.002449354657688
America - 0.9976329264870932
budget - 0.9857269586649321
North - 0.9711240881032547

查看我在媒体上的其他帖子,有更好的目录列表视图
GitHub:https://github.com/BrambleXu LinkedIn:www.linkedin.com/in/xu-liang 博客:https://bramblexu.org

新闻图表

我还实现了 TextRank,用于从新闻中提取关键字并将其可视化。欢迎检查。

[## 树莓徐/新闻图

从文本和图形可视化中提取关键信息- BrambleXu/news-graph

github.com](https://github.com/BrambleXu/news-graph)

Demo of News Graph

查看我的其他帖子 中等 一个分类查看
GitHub:
bramble Xu LinkedIn:徐亮 博客:bramble Xu

TF 特工入门教程

原文:https://towardsdatascience.com/tf-agents-tutorial-a63399218309?source=collection_archive---------9-----------------------

在几个月内为我的强化学习管道中的另一个定制环境第三次实现了贪婪动作选择功能之后,我意识到我必须构建一个通用的强化学习框架,我可以在其中插入我的定制环境。幸运的是 Tensorflow 已经在上面了。

本教程将介绍我遇到的一些关于如何将所有 TF-Agents 组合在一起的问题。它是从单个 Collab 笔记本中收集来的,经过反复试验和钻研代码库后建立起来的。

这是给谁的?任何从事强化学习的人,厌倦了每次遇到新问题都要不断构建学习框架。

我要构建的环境是一个网格世界。它将是 6×6 的正方形,代理将从(0,0)开始,在(5,5)结束。代理的目标是找到从起点到终点的路径。代理可以选择的动作有上、下、左、右,用 0 到 3 的整数表示。

在奖励方面,如果代理人在终点着陆,则获得 100 的奖励,否则奖励为 0。如果代理到那时还没有到达终点,游戏将在 100 步处终止。

因此,让我们开始创建自定义网格世界环境,这需要对 PyEnvironment 类进行子类化,如下所示。

Initialization

init 函数必须包含 _action_spec 和 _observation_spec 的定义。由于动作是从 0 → 3 的单个整数,所以形状是一个空元组,它的最小值是 0,最大值是 3。观察值为 4 个整数,最大值和最小值分别为 0 和 5。前两个整数是指玩家的行和列,后两个整数是指赢方的行和列。

Reset

_reset 函数处理游戏结束时发生的事情——状态被重置,episode_ended 被设置为 False。

Step

_step 函数通过采取一个动作并将其应用到当前状态以获得一个新状态来处理状态转换。它测试新状态是否是游戏结束状态,然后返回转换或终止。它还将中间奖励和最终奖励应用于每个州。

Move

move 函数不是强制函数,但用于执行边界检查,然后根据动作更新状态。

Game over

game_over 函数通过比较玩家和获胜方块的行和列来检查游戏是否结束。

既然已经实现了这些定义,我们可以使用以下内置函数测试环境,以确保它符合规范:

Validation

只要没有抛出错误,那么就可以了!

接下来,我们将看看如何设置代理、学习模型、重放缓冲区、驱动程序以及它们如何相互连接。

首先,我们将 Gridworld 环境加载到一个限时包装器中,如果达到 100 步,该包装器将终止游戏。然后,结果被包装在 TF 环境处理程序中。

然后,我们将创建网络、优化器和深度 Q 网络(DQN)代理。在这里,我们决定创建一个具有 100 个隐藏节点的单一隐藏层的网络。对于这种简单的问题,这个设置应该足够了。我使用 Adam 优化器,因为一般来说,这是超越普通随机梯度下降(SGD)的最先进技术。尽管对于这个例子,我认为 SGD 也可以。请随意测试,并在评论中告诉我。

接下来,我们创建重放缓冲区和重放观察器。重放缓冲区用于包含观察和动作对,因此它们可用于训练。这里的参数是:

  • data_spec 是缓冲区中包含的行的形状
  • batch_size,表示保存在重放缓冲区中的批处理的大小
  • max_length 表示在用最新的条目覆盖最旧的条目之前,缓冲区可以容纳多少条记录。

这里需要注意的是,我们使用的 train_env.batch_size 在我们的例子中默认为 1,因为它不是由用户指定的。(第 148 行)

然后,我们从重放缓冲区中创建一个数据集,我们可以遍历该数据集并训练代理。这里使用的参数是:

  • num_parallel_calls 是并行处理的项目数
  • sample_batch_size 是传递给神经网络进行训练的项目数
  • num_steps,指定在返回的批次中作为子批次返回的连续项目数。这对于情节游戏来说非常重要,在这种游戏中,打乱所有数据会导致数据损坏。此处的最小值是 2,因为这样我们将接收子批次的[观察-动作,新观察-动作]进行训练。这是另一个可以调整的变量。

然后,我们希望创建一个驱动程序来模拟游戏中的代理,并将状态、动作、奖励对存储在重放缓冲区中,并跟踪一些指标。

最后,我们进入培训循环,在此循环中,驾驶员正在运行,经验从数据集中提取并用于培训代理。在特定的时间间隔,计算和打印损失和平均回报,并打印每集长度。情节长度应随时间减少,稳定在 10 步。

在这里找到 GridWorld 环境的完整代码,在这里找到训练设置的完整代码。

下面的图显示,在大约 6000 集之后,代理能够稳定地走 10 步到达获胜的方块。这里要注意的是,因为到达最后的方块是基于代理的随机行为,所以可能在 10000 集里它永远不会到达它,因此永远不知道它在哪里。

Plot of Average Episode Length vs Time

要进一步阅读 TF-Agents,请查看他们的文档

感谢阅读!

TF-IDF 在真实数据集上用 python 从头开始。

原文:https://towardsdatascience.com/tf-idf-for-document-ranking-from-scratch-in-python-on-real-world-dataset-796d339a4089?source=collection_archive---------0-----------------------

目录:

  • 什么是 TF-IDF?
  • 预处理数据。
  • 标题和正文的权重。
  • 使用 TF-IDF 匹配分数的文档检索。
  • 利用 TF-IDF 余弦相似度进行文档检索。

Photo by Sanwal Deen on Unsplash

简介:TF-IDF

TF-IDF 代表“词频—逆文档频率”。这是一种量化一组文档中的单词的技术。我们通常为每个单词计算一个分数,以表示它在文档和语料库中的重要性。该方法是信息检索和文本挖掘中广泛使用的技术。

如果我给你一个句子,比如“这栋楼好高”。我们知道单词和句子的语义,就很容易理解这个句子。但是任何程序(比如:python)如何解读这句话呢?任何编程语言都更容易理解数值形式的文本数据。因此,出于这个原因,我们需要对所有文本进行矢量化,以便更好地表示。

通过对文档进行矢量化,我们可以进一步执行多项任务,例如查找相关文档、排序、聚类等。当您执行 google 搜索时,使用的正是这种技术(现在它们被更新为更新的 transformer 技术)。网页称为文档,用来搜索的文本称为查询。搜索引擎维护所有文档的固定表示。当您使用查询进行搜索时,搜索引擎将找到该查询与所有文档的相关性,按照相关性的顺序对它们进行排序,并向您显示前 k 个文档。所有这些过程都是使用查询和文档的矢量化形式来完成的。

现在回到我们的 TF-IDF,

TF-IDF =术语频率(TF) *逆文档频率(IDF)

术语

  • t —术语(单词)
  • d-文档(一组单词)
  • N —语料库的计数
  • 语料库—整个文档集

词频

这衡量一个单词在文档中的出现频率。这在很大程度上取决于文档的长度和单词的一般性,例如,一个非常常见的单词如“was”可以在一个文档中出现多次。但是,如果我们取两个分别具有 100 个单词和 10,000 个单词的文档,则在 10,000 个单词的文档中,常见单词“was”出现的概率较高。但是我们不能说较长的文件比较短的文件更重要。正是因为这个原因,我们对频率值进行了归一化,我们用频率除以文档中的总字数。

回想一下,我们需要最终对文档进行矢量化。当我们计划对文档进行矢量化时,我们不能只考虑特定文档中出现的单词。如果我们这样做,那么两个文档的向量长度将会不同,并且计算相似性是不可行的。因此,我们所做的是将 vocab 上的文档矢量化。Vocab 是语料库中所有可能世界的列表。

我们需要所有词汇的字数和文档的长度来计算 TF。如果某个特定文档中不存在该术语,则该特定文档的特定 TF 值将为 0。在一个极端的情况下,如果文档中的所有单词都相同,那么 TF 将为 1。归一化的 TF 值的最终值将在[0 到 1]的范围内。0,1 包括在内。

TF 对于每个文档和单词都是独立的,因此我们可以将 TF 表述如下:

tf(t,d)= d 中 t 的计数/d 中的字数

如果我们已经计算了 TF 值,并且如果这产生了文档的矢量化形式,为什么不仅仅使用 TF 来寻找文档之间的相关性呢?我们为什么需要英特尔信息技术峰会?

让我解释一下,像“是”、“是”这样最常见的词会有很高的值,赋予这些词很高的重要性。但是用这些词来计算相关性会产生不好的结果。这类常用词被称为停用词。虽然我们将在稍后的预处理步骤中删除停用词,但是更理想的是在文档中找到该词的存在,并以某种方式减少它们的权重。

文档频率

这个衡量文档在一整套语料库中的重要性。这与 TF 非常相似,但唯一的区别是 TF 是文档 d 中术语 t 的频率计数器,而 DF 是术语 t 在文档集 n 中出现的计数。换句话说,DF 是该单词出现在其中的文档的数量。如果该术语在文档中至少出现一次,我们就认为出现了一次,我们不需要知道该术语出现的次数。

df(t)= t 在 N 个文档中的出现次数

为了保持这也在一个范围内,我们通过除以文档总数来标准化。我们的主要目标是知道一个术语的信息量,DF 是它的精确逆。这就是我们反转 DF 的原因

逆文档频率

IDF 是衡量术语 t 的信息量的文档频率的倒数。当我们计算 IDF 时,对于最常出现的单词(如停用词)来说,IDF 将非常低(因为它们出现在几乎所有的文档中,并且 N/df 将给予该单词非常低的值)。这最终给出了我们想要的相对权重。

idf(t) = N/df

现在 IDF 有一些其他问题,当我们有一个大的语料库规模,比如 N=10000,IDF 值会爆炸。因此,为了抑制这种影响,我们采用了 IDF 的日志。

在查询时,当单词不在 vocab 中时,它将被忽略。但是在少数情况下,我们使用固定的 vocab,并且 vocab 中的一些单词可能在文档中不存在,在这种情况下,df 将是 0。因为我们不能被 0 整除,所以我们通过在分母上加 1 来平滑这个值。

idf(t) = log(N/(df + 1))

最后,通过取 TF 和 IDF 的乘积值,我们得到 TF-IDF 分数。TF-IDF 有许多不同的版本,但是现在,让我们集中在这个基本版本上。

tf-idf(t,d) = tf(t,d) * log(N/(df + 1))

关于我:

我是 NLP 和 DL 领域的高级数据科学家和 AI 研究员。
联系我: TwitterLinkedIn

在真实数据集上实现

现在我们已经了解了什么是 TF-IDF,让我们来计算数据集的相似性得分。

我们将要使用的数据集是几个故事的存档,这个数据集有许多不同格式的文档。下载数据集,打开你们的笔记本,我指的是 Jupyter 笔记本😜。

数据集链接:http://archives.textfiles.com/stories.zip

步骤 1:分析数据集

任何机器学习任务的第一步都是分析数据。因此,如果我们查看数据集,乍一看,我们会看到所有包含英文单词的文档。每个文档都有不同的名称,其中有两个文件夹。

现在一个重要的任务是识别正文中的标题,如果我们分析文档,有不同的标题排列模式。但是大多数标题都是居中对齐的。现在我们需要想办法提取标题。但是在我们全力以赴开始编码之前,让我们稍微深入分析一下数据集。

花几分钟时间自己分析数据集。尝试探索…

经过进一步检查,我们可以注意到每个文件夹(包括根目录)中都有一个 index.html,其中包含所有的文档名及其标题。因此,让我们认为自己是幸运的,因为标题是给我们的,而不是穷尽地从每个文件中提取标题。

步骤 2:提取标题和正文:

没有具体的方法来做到这一点,这完全取决于手头的问题陈述和我们对数据集所做的分析。

因为我们已经发现标题和文档名在 index.html 中,所以我们需要提取这些名称和标题。我们很幸运,index.html 有标签,我们可以使用模式提取我们需要的内容。

在我们开始提取标题和文件名之前,因为我们有不同的文件夹,首先让我们抓取文件夹,以便稍后一次性读取所有 index.html 文件。

[x[0] for x in os.walk(str(os.getcwd())+’/stories/’)]

os.walk 提供了目录中的文件,os.getcwd 提供了当前目录和标题,我们将在当前目录+ stories 文件夹中进行搜索,因为我们的数据文件位于 stories 文件夹中。

总是假设你正在处理一个巨大的数据集,这有助于自动化代码。

现在我们可以发现,文件夹给了根文件夹额外的 / ,所以我们要删除它。

folders[0] = folders[0][:len(folders[0])-1]

上面的代码删除了文件夹中第 0 个索引的最后一个字符,这是根文件夹

现在,让我们遍历所有的 index.html,提取它们的标题。要做到这一点,我们需要找到一种模式来去掉标题。由于这是在 html 中,我们的工作会简单一点。

让我想想…

我们可以清楚地观察到,每个文件名都被括在( > <)和( " ) 之间,每个标题都在(
)和( \n )之间****

我们将使用简单的正则表达式来检索名称和标题。以下代码给出了与该模式匹配的所有值的列表。因此 names 和 titles 变量包含了所有名字和头衔的列表。

names = re.findall(‘><A HREF=”(.*)”>’, text)
titles = re.findall(‘<BR><TD> (.*)\n’, text)

现在我们已经有了从索引中检索值的代码,我们只需要迭代所有的文件夹,并从所有 index.html 文件中获取标题和文件名

-从索引文件中读取文件

-提取标题和名称

-迭代到下一个文件夹

dataset = []for i in folders:
    file = open(i+"/index.html", 'r')
    text = file.read().strip()
    file.close() file_name = re.findall('><A HREF="(.*)">', text)
    file_title = re.findall('<BR><TD> (.*)\n', text)

    for j in range(len(file_name)):
        dataset.append((str(i) + str(file_name[j]), file_title[j]))

这将准备数据集的索引,数据集是文件位置及其标题的元组。有一个小问题,根文件夹 index.html 也有文件夹及其链接,我们需要删除这些。

只需使用条件检查器来删除它。

if c == False:
    file_name = file_name[2:]
    c = True

第三步:预处理

预处理是我们处理任何文本模型的主要步骤之一。在此阶段,我们必须查看数据的分布情况,需要什么技术以及应该清理多深。

这一步从来没有一个统一的规则,完全取决于问题陈述。几个强制性的预处理是:转换成小写,删除标点符号,删除停用词和词干。在我们的问题陈述中,基本的预处理步骤似乎就足够了。

小写字母

在文本处理过程中,每个句子被拆分成单词,每个单词被视为预处理后的一个标记。编程语言认为文本数据是敏感的,这意味着不同。我们人类知道这两者属于同一个标记,但是由于字符编码,它们被认为是不同的标记。转换成小写是一个非常强制性的预处理步骤。因为我们的所有数据都在列表中,所以 numpy 有一个方法可以立刻将列表转换成小写。****

np.char.lower(data)

停止言语

停用词是最常见的不会给文档向量带来任何附加值的词。事实上,删除这些将增加计算和空间效率。nltk 库有一个下载停用词的方法,所以我们可以直接使用 nltk 库,遍历所有的词并删除停用词,而不是自己显式地提到所有的停用词。有许多有效的方法可以做到这一点,但我只给出一个简单的方法。

我们将遍历所有的停用词,如果是停用词,就不把它们追加到列表中

new_text = ""
for word in words:
    if word not in stop_words:
        new_text = new_text + " " + word

标点

标点符号是语料库文档中不必要的符号集。我们应该对我们所做的事情小心一点,可能会有一些问题,比如预处理后 us-us“United Stated”被转换为“us”。连字符和通常应小心处理。但是对于这个问题陈述,我们将删除它们

symbols = "!\"#$%&()*+-./:;<=>?@[\]^_`{|}~\n"
for i in symbols:
    data = np.char.replace(data, i, ' ')

我们将所有的符号存储在一个变量中,并迭代该变量,删除整个数据集中的特定符号。我们在这里使用 numpy,因为我们的数据存储在一个列表列表中,numpy 是我们的最佳选择。

撇号

注意标点符号中没有撇号。因为当我们首先删除标点符号时,它会将 don't 转换为 dont,并且它是一个不会被删除的停用词。我们要做的是,首先删除停用词,然后是符号,最后重复停用词删除,因为少数词可能仍然有撇号,而不是停用词。

return np.char.replace(data, "'", "")

单个字符

单个字符在了解文档的重要性方面没有太大用处,并且少数最后的单个字符可能是不相关的符号,所以删除单个字符总是好的。

new_text = ""
for w in words:
    if len(w) > 1:
       new_text = new_text + " " + w

我们只需要迭代所有的单词,如果长度不大于 1,就不追加单词。

堵塞物

这是预处理的最后也是最重要的部分。词干处理将单词转换成词干。

例如, playing 和 played 是同一类型的词,基本上表示一个动作 play。斯特梅尔正是这样做的,它将单词简化为词干。我们将使用一个名为 porter-stemmer 的库,它是一个基于规则的词干分析器。波特-斯特梅尔识别并移除单词的后缀或词缀。词干分析器给出的单词不需要有几次是有意义的,但是它将被识别为模型的单个标记。

引理满足

引理化是一种将单词简化为单词的根同义词的方法。与词干提取不同,词汇匹配确保缩减后的单词再次成为词典中的单词(同一种语言中的单词)。WordNetLemmatizer 可用于对任何单词进行词汇化。

词干化与词汇化

词干-不必是字典中的单词,根据一些规则删除前缀和词缀

词汇化——将成为词典中的一个词。简化为词根同义词。

一个更有效的方法是先用引理,然后用词干,但是对于一些问题语句,单独用词干也可以,这里我们不使用引理。

转换数字

当用户给出诸如 100 美元100 美元的查询时。对于用户来说,这两个搜索词是相同的。但是我们的 IR 模型将它们分开处理,因为我们将 100 美元、100 元作为不同的代币存储。因此,为了使我们的红外模式更好一点,我们需要将 100 转换为 100。为了实现这一点,我们将使用一个名为 num2word 的库。

如果我们看一下上面的输出,它给出了一些符号和句子,如“一百个 两个”,但是该死的我们刚刚清理了我们的数据,那么我们该如何处理呢?不用担心,我们将在将数字转换为单词后再次运行标点和停止单词。

预处理

最后,我们将把所有这些预处理方法放入另一个方法中,我们称之为预处理方法。

def preprocess(data):
    data = convert_lower_case(data)
    data = remove_punctuation(data)
    data = remove_apostrophe(data)
    data = remove_single_characters(data)
    data = convert_numbers(data)
    data = remove_stop_words(data)
    data = stemming(data)
    data = remove_punctuation(data)
    data = convert_numbers(data)

如果仔细观察,一些预处理方法会再次重复。正如所讨论的,这只是帮助清理数据的一点点深度。现在我们需要阅读文档,并将它们的标题和正文分开存储,因为我们以后会用到它们。在我们的问题陈述中,我们有非常不同类型的文档,由于编码兼容性,这可能会导致阅读文档时出现一些错误。要解决这个问题,只需在 open()方法中使用 encoding="utf8 ",errors='ignore'。

步骤 3:计算 TF-IDF

回想一下,我们需要给标题和正文不同的权重。现在我们该如何处理这个问题呢?在这种情况下,TF-IDF 的计算将如何进行?

给标题和正文不同的权重是一种非常常见的方法。我们只需要把文档看作 body + title,使用它我们可以找到 vocab。并且我们需要给标题中的单词不同的权重,给正文中的单词不同的权重。为了更好地解释这一点,让我们考虑一个例子。

title = "这是一篇小说论文"

body = "本文由许多论文的综述组成"

现在,我们需要计算身体和标题的 TF-IDF。暂时让我们只考虑单词 paper ,而忘记删除停用词。

题目中 word paper 的 TF 是多少?1/4?

不,是 3/13。怎么会?word paper 在标题和正文中出现 3 次,标题和正文的总字数为 13。正如我之前提到的,我们只是认为标题中的单词具有不同的权重,但是在计算 TF-IDF 时,我们仍然考虑整个文档。

那么论文无论是标题还是正文的 TF 都是一样的?对,是一样的!这只是我们要给出的重量差。如果这个词同时出现在标题和正文中,那么 TF-IDF 值不会有任何减少。如果这个单词只出现在标题中,那么这个特定单词的正文的权重就不会加到这个单词的 TF 中,反之亦然。

文档=正文+标题

TF-IDF(文档)= TF-IDF(标题) alpha + TF-IDF(正文) (1-alpha)**

计算 DF

让我们聪明点,事先算算 DF。我们需要遍历所有文档中的所有单词,并存储每个单词的文档 id。为此,我们将使用字典,因为我们可以将单词用作键,将一组文档用作值。我提到 set 是因为,即使我们试图多次添加文档,set 也不会只接受重复的值。

DF = {}
for i in range(len(processed_text)):
    tokens = processed_text[i]
    for w in tokens:
        try:
            DF[w].add(i)
        except:
            DF[w] = {i}

如果单词还没有集合,我们将创建一个集合,否则将它添加到集合中。try 块检查这种情况。这里 processed_text 是文档的主体,我们将对标题重复同样的操作,因为我们需要考虑整个文档的 DF。

len(DF)将给出独特的单词

DF 将单词作为键,文档 id 列表作为值。但是对于 DF,我们实际上不需要文档列表,我们只需要计数。所以我们要用它的计数来替换这个列表。

这就是我们需要的所有单词的数量。为了在我们的词汇表中找到全部的唯一单词,我们需要使用 DF 的所有关键字。

计算 TF-IDF

回想一下,我们需要为标题和正文保持不同的权重。为了计算正文或标题的 TF-IDF,我们需要同时考虑标题和正文。为了使我们的工作简单一点,让我们使用一个字典,将(文档,令牌)对作为键,将任何 TF-IDF 分数作为值。我们只需要迭代所有文档,我们可以使用 Coutner,它可以给出令牌的频率,计算 tf 和 idf,最后作为(doc,token)对存储在 tf_idf 中。tf_idf 字典是针对正文的,我们将使用相同的逻辑为标题中的单词构建一个字典 tf_idf_title。

tf_idf = {}
for i in range(N):
    tokens = processed_text[i]
    counter = Counter(tokens + processed_title[i])
    for token in np.unique(tokens):
        tf = counter[token]/words_count
        df = doc_freq(token)
        idf = np.log(N/(df+1))
        tf_idf[doc, token] = tf*idf

来计算不同的权重。首先,我们需要维护一个值 alpha,它是主体的权重,那么显然 1-alpha 将是标题的权重。现在让我们深入研究一下数学,我们讨论过,如果一个单词同时出现在正文和标题中,那么这个单词的 TF-IDF 值将是相同的。我们将维护两个不同的 tf-idf 字典,一个用于正文,一个用于标题。

我们要做的是聪明一点,我们会为身体计算 TF-IDF;全身 TF-IDF 值乘以α;迭代标题中的标记;替换(文档,令牌)对的正文 TF-IDF 值中的标题 TF-IDF 值。花些时间来处理这个:P

流量:

-计算所有文档正文的 TF-IDF

-计算所有文档标题的 TF-IDF

-将主体 TF-IDF 乘以α

-Iterate Title IF-IDF for every(doc,token)

—如果标记在正文中,请将正文(文档,标记)值替换为标题(文档,标记)中的值

我知道这一开始并不容易理解,但还是让我解释一下为什么上面的流程有效,因为我们知道如果标记在两个地方,那么主体和标题的 tf-idf 将是相同的,我们对主体和标题使用的权重总和为 1

TF-IDF = body _ TF-IDF * body _ weight+title _ TF-IDF * title _ weight

body_weight + title_weight = 1

当一个令牌同时出现在这两个地方时,那么最终的 TF-IDF 将与获取 body 或 title tf_idf 相同。这正是我们在上面的流程中所做的。最后,我们有一个字典 tf_idf,它的值是(doc,token)对。

步骤 4:使用匹配分数排名

匹配分数是计算相似性的最简单的方法,在这种方法中,我们为每个文档添加查询中标记的 tf_idf 值。例如,对于查询“hello world ”,我们需要检查每个文档中是否存在这些单词,如果存在,那么 tf_idf 值将被添加到特定 doc_id 的匹配分数中。最后,我们将排序并取前 k 个文档。

上面提到的是理论概念,但由于我们使用字典来保存数据集,我们要做的是迭代字典中的所有值,并检查该值是否存在于令牌中。因为我们的字典是一个(document,token)键,所以当我们在查询中找到一个 token 时,我们会将文档 id 和 tf-idf 值一起添加到另一个字典中。最后,我们将只取前 k 个文档。

def matching_score(query):
    query_weights = {}
    for key in tf_idf: 
        if key[1] in tokens:
            query_weights[key[0]] += tf_idf[key]

密钥[0]是文档 id,密钥[1]是令牌。

步骤 5:使用余弦相似度排序

当我们有一个完美工作的匹配分数时,为什么我们还需要余弦相似度?虽然匹配分数给出了相关的文档,但是当我们给出长的查询时,它很失败,它将不能正确地对它们进行排序。余弦类似地做的是,它将所有文档标记为 tf-idf 令牌的向量,并测量余弦空间中的相似性(向量之间的角度。少数情况下,查询长度会很短,但它可能与文档密切相关。在这种情况下,余弦相似性是找到相关性的最佳方法。

观察上面的图,蓝色向量是文档,红色向量是查询,我们可以清楚地看到,尽管文档 d1 的曼哈顿距离(绿线)非常高,但查询仍然接近文档 d1。在这种情况下,余弦相似度会更好,因为它考虑了这两个向量之间的角度。但是匹配分数将返回文档 d3,但是这不是非常密切相关的。

匹配分数计算曼哈顿距离(从尖端开始的直线)
余弦分数考虑向量的角度。

…向量化…

要计算上述任何一项,最简单的方法是将所有内容转换为矢量,然后计算余弦相似度。因此,让我们将查询和文档转换成向量。我们将使用 total_vocab 变量来为每个标记生成一个索引,该变量包含所有唯一标记的列表,我们将使用 numpy of shape (docs,total_vocab)来存储文档向量。

# Document Vectorization
D = np.zeros((N, total_vocab_size))
for i in tf_idf:
    ind = total_vocab.index(i[1])
    D[i[0]][ind] = tf_idf[i]

对于 vector,我们需要计算 TF-IDF 值,我们可以从查询本身计算 TF,并且我们可以利用我们为文档频率创建的 DF。最后,我们将在一个(1,vocab_size) numpy 数组中存储 tf-idf 值,令牌的索引将从 total_voab 列表中决定

Q = np.zeros((len(total_vocab)))
counter = Counter(tokens)
words_count = len(tokens)
query_weights = {}
for token in np.unique(tokens):
    tf = counter[token]/words_count
    df = doc_freq(token)
    idf = math.log((N+1)/(df+1))

现在,我们要做的就是计算所有文档的余弦相似度,并返回最大的 k 个文档。余弦相似度定义如下。

np.dot(a,b)/(norm(a)*norm(b))

分析

我从 doc_id 200 (对我来说)中取了文本,在匹配得分和余弦相似度两方面粘贴了一些长查询和短查询的内容。

简短查询

****

长查询

****

正如我们可以从上面的文档中看到的,余弦方法总是比匹配方法得到更高的评价,这是因为余弦相似性学习了更多的上下文。

关于我:

我是 NLP 和 DL 领域的高级数据科学家和 AI 研究员。
愿意联系: TwitterLinkedIn

自己试试。点击此处进行 git 回购。

使用的库

  • nltk,numpy,re,mat,num2words

信息检索系列:

python 中从头开始的 TF(词频)-IDF(逆文档频)。

原文:https://towardsdatascience.com/tf-term-frequency-idf-inverse-document-frequency-from-scratch-in-python-6c2b61b78558?source=collection_archive---------1-----------------------

从头开始创建 TF-IDF 模型

在这篇文章中,我将解释如何用 python 从头开始实现 tf-idf 技术,这种技术用于寻找由单词组成的句子的含义,并抵消单词袋技术的无能,这种技术有利于文本分类或帮助机器阅读数字中的单词。

目录:

  • 术语。
  • 词频(TF)。
  • 文档频率。
  • 逆文档频率。
  • 用 Python 实现。

1 -术语:

  • t —术语(单词)
  • d-文档(一组单词)
  • N —语料库的计数
  • 语料库—整个文档集

2 项频率(TF):

假设我们有一组英文文本文档,并希望对哪个文档与查询最相关进行排序,“数据科学太棒了!”一种简单的开始方式是通过消除不包含所有三个词“数据”、“是”、“科学”和“棒极了”的文档,但是这仍然留下许多文档。为了进一步区分它们,我们可以计算每个术语在每个文档中出现的次数;一个术语在文档中出现的次数称为其词频

T 文档中出现的术语的权重简单地与术语频率成比例。

公式:

tf(t,d)= d 中 t 的计数/d 中的字数

3-文档频率:

这个衡量的是文档在整套语料库中的重要性,这和 TF 非常相似。唯一的区别是 TF 是文档 d 中术语 t 的频率计数器,其中 DF 是术语 t 在文档集 n 中出现的计数。换句话说,DF 是该单词出现在其中的文档的数量。如果该术语在文档中至少出现一次,我们认为出现一次,我们不需要知道该术语出现的次数。

df(t)= t 在文档中的出现次数

4-反向文档频率(IDF):

在计算 TF 时,所有项都被认为是同等重要的。然而,众所周知,某些术语,如“是”、“的”和“那个”,可能会出现很多次,但并不重要。因此,我们需要降低频繁项的权重,同时增加罕见项的权重,通过计算 IDF,结合了一个逆文档频率因子,该因子减少了文档集中出现频率非常高的项的权重,并增加了出现频率很低的项的权重。

IDF 是测量术语 t 的信息量的文档频率的倒数。当我们计算 IDF 时,对于最常出现的词(例如停用词)来说,IDF 将非常低(因为停用词(例如“is ”)出现在几乎所有的文档中,并且 N/df 将给予该词非常低的值)。这最终给出了我们想要的相对权重。

idf(t) = N/df

现在,idf 很少有其他问题,在大型语料库的情况下,比如说 100,000,000,IDF 值会爆炸,为了避免这种影响,我们采用 IDF 的日志。

在查询期间,当出现不在 vocab 中的单词时,df 将为 0。因为我们不能被 0 整除,所以我们通过在分母上加 1 来平滑这个值。

这是最终的公式:

公式:

idf(t) = log(N/(df + 1))

tf-idf 现在是评估一个单词对一个集合或语料库中的文档有多重要的正确度量。

公式:

tf-idf(t,d) = tf(t,d) * log(N/(df + 1))

5-从头开始用 Python 实现 TF-IDF:

为了用 python 从头开始制作 TF-IDF,让我们想象不同文档中的两句话:

第一句话:“数据科学是 21 世纪最性感的工作”。

第二句话:“机器学习是数据科学的关键”。

第一步,我们必须创建 TF 函数来计算所有文档的总词频。以下是代码:

首先,像往常一样,我们应该导入必要的库:

import pandas as pd
import sklearn as sk
import math 

因此,让我们加载我们的句子,并将它们组合在一个集合中:

first_sentence = "Data Science is the sexiest job of the 21st century"
second_sentence = "machine learning is the key for data science"#split so each word have their own stringfirst_sentence = first_sentence.split(" ")
second_sentence = second_sentence.split(" ")#join them to remove common duplicate words
total= set(first_sentence).union(set(second_sentence))print(total)

输出:

{'data', 'Science', 'job', 'sexiest', 'the', 'for', 'science', 'machine', 'of', 'is', 'learning', '21st', 'key', 'Data', 'century'}

现在让我们添加一种方法,对两个句子使用字典键值对来计算单词:

wordDictA = dict.fromkeys(total, 0) 
wordDictB = dict.fromkeys(total, 0)for word in first_sentence:
    wordDictA[word]+=1

for word in second_sentence:
    wordDictB[word]+=1

现在,我们将它们放入数据帧,然后查看结果:

pd.DataFrame([wordDictA, wordDictB])

不,让我们写 TF 函数:

def computeTF(wordDict, doc):
    tfDict = {}
    corpusCount = len(doc)
    for word, count in wordDict.items():
        tfDict[word] = count/float(corpusCount)
    return(tfDict)#running our sentences through the tf function:tfFirst = computeTF(wordDictA, first_sentence)
tfSecond = computeTF(wordDictB, second_sentence)#Converting to dataframe for visualizationtf = pd.DataFrame([tfFirst, tfSecond])

这是预期的输出:

这就是 TF 公式的全部内容,我想谈谈停用词,我们应该删除它们,因为它们是最常见的词,不会给文档向量带来任何额外的价值。事实上,删除这些将增加计算和空间效率。

nltk 库有一个下载停用词的方法,所以我们可以直接使用 nltk 库,遍历所有的词并删除停用词,而不是自己显式地提到所有的停用词。有许多有效的方法可以做到这一点,但我只给出一个简单的方法。

这些是英语中停用词的例子:

这是一个简单的代码,可以下载停用词并删除它们。

import nltknltk.download('stopwords')from nltk.corpus import stopwordsstop_words = set(stopwords.words('english'))filtered_sentence = [w for w in wordDictA if not w in stop_words]print(filtered_sentence)

输出:

['data', 'Science', 'job', 'sexiest', 'science', 'machine', 'learning', '21st', 'key', 'Data', 'century']

现在我们已经完成了 TF 部分,接下来是 IDF 部分:

def computeIDF(docList):
    idfDict = {}
    N = len(docList)

    idfDict = dict.fromkeys(docList[0].keys(), 0)
    for word, val in idfDict.items():
        idfDict[word] = math.log10(N / (float(val) + 1))

    return(idfDict)#inputing our sentences in the log file
idfs = computeIDF([wordDictA, wordDictB])

现在我们实施 idf 公式,让我们以计算 TFIDF 结束

def computeTFIDF(tfBow, idfs):
    tfidf = {}
    for word, val in tfBow.items():
        tfidf[word] = val*idfs[word]
    return(tfidf)
#running our two sentences through the IDF:idfFirst = computeTFIDF(tfFirst, idfs)
idfSecond = computeTFIDF(tfSecond, idfs)
#putting it in a dataframe
idf= pd.DataFrame([idfFirst, idfSecond])
print(idf)

输出:

那是许多工作。但是,如果将来要求您从头开始编写 TF-IDF 代码,这是很方便的。然而,由于 sklearn 库,这可以简单得多。让我们看看下面的例子:

#first step is to import the libraryfrom sklearn.feature_extraction.text import TfidfVectorizer
#for the sentence, make sure all words are lowercase or you will run #into error. for simplicity, I just made the same sentence all #lowercasefirstV= "Data Science is the sexiest job of the 21st century"
secondV= "machine learning is the key for data science"#calling the TfidfVectorizer
vectorize= TfidfVectorizer()
#fitting the model and passing our sentences right away:response= vectorize.fit_transform([firstV, secondV])

这是预期的输出:

总结:

在这篇文章中,我们将解释如何使用 python 和一种称为词频的自然语言处理(NLP)技术—逆文档频率( tf-idf )来总结文档。

我们将使用 sklearnnltk 来完成这项任务。

记住你可以在我的 github 库这里找到完整的工作代码。

感谢阅读,我很高兴讨论您可能有的任何问题或更正:)如果您想讨论机器学习或其他任何问题,请在 LinkedIn 上找到我。

p 值的真正含义

原文:https://towardsdatascience.com/th-true-meaning-of-p-value-2225b04510c?source=collection_archive---------19-----------------------

以及它如何影响你的决策

p-values shouldn’t make us feel lost, but give us direction. Photo Credit: Martin Reisch.

我们之前已经多次学习过 p 值。首先,在我们大学时死记硬背的统计书中;第二,当我们读到一些文章向我们保证它们是合法的;最后,现在我们决定如何经营我们的企业。在整个过程中,我们被告知定义,希望我们已经学到了足够多的东西,可以反刍一些关于零假设和概率的东西——但是我们真的理解了吗?

理解不仅仅是知道一个定义,为了有效地使用 p 值,有必要对它们的含义有一种“感觉”。为此,我们将采用可视化方法。

事实上,当你通过视觉观察 p 值时,它们非常直截了当,这就是我今天想与你分享的。

我们将遵循这个粗略的准则:

  • 我怎么确定我的转化率是我想的那样?
  • 测量概率
  • AB 测试场景

前几段将涵盖一些基础知识,所以请随意跳过这些,但不要忘记检查视觉效果!

让我们先来看一个简单的 p 值,然后再来看最重要的 AB 测试场景,它决定了全球所有你最喜欢的应用、服务和程序的产品决策。希望在读完这篇文章(或书签)后,你能理解 p 值的所有荣耀,就像我最终理解的那样。

请注意,以下内容将围绕电子商务产品,但请注意,这种理解可以应用于处理各种其他情况。

你的第一个 CVR

想象一下:你已经推出了一个新网站,你想知道你的转换率(CVR)是多少,所以你开始衡量会话和转换。使用这些,您可以计算简单的转换率比例,如下所示:

CVR = Conversions / Sessions

您测量了 1000 次会话和 50 次转换,得出 CVR 为 5%——太棒了!但是等等,那 5%有多准确?

如果你再测量 1000 次会话,你会再获得 50 次转换还是会有所不同?这就是我们的朋友统计学的用武之地——帮助我们理解如何从样本数据中解读绝对真理。

为了以最简单的形式理解 p 值,让我们提出一个不同的问题。如果我们网站的实际 CVR 是 5%,那么如果我像上面那样测量 1000 个会话,我测量到 6%或更大的 CVR 的概率是多少?如果你不喜欢用百分比来思考,这就等于说“从 1000 次会话中获得 60 次或更多转化的几率有多大?”。

开始实验

有了这样的问题陈述,我们现在可以通过计算进行实验。为此,我们将设置一个程序来模拟 1000 个会话,并对每个会话检查是否有转换。有了这些模拟的会议,我们可以计算那个实验的 CVR。然后我们将这样做 10,000 次,看看最常见的结果是什么。

cvrs = []
# Run the test 10,000 times.
for i in range(10000):
    # Simulate 1,000 sessions.
    conversions = 0
    for j in range(1000):
         # Get a random number between 0 and 1 
         # and check if it's above 5% (0.05).
         if random.random() > 0.05:
             # Count the conversion.
             conversions += 1
    # Calculate our CVR.
    cvr = conversions / 1000
    # Store the CVR for later.
    cvrs += [cvr]

运行完这个之后,我们剩下一长串可能的 CVR,如下所示:

# cvrs = [0.053, 0.049, 0.050, 0.051, ...]

然后,我们可以将所有这些值组合在一些波段中,并查看我们记录了多少个波段。绘制这个图给了我们下面的直方图。

简要回顾一下,直方图中的每一列都显示了有多少 CVR 在该波段内结束,例如,对于 0.05,该波段为 0.0495 至 0.0505,并且该图显示该波段具有最多数量的 CVR。

As we run more trials, the results approach the normal distribution. Left: Count of trials on y axis; as we run more trials the graph is filled up. Right: y axis normalised to show the best visual. The line represents an approximation for the histogram.

这张图表告诉我们什么?我们可以看到,最常见的值是 5%,这正是我们所期望的,因为这是实际的 CVR。我们还可以看到,有许多值不是 5%,这是由于用户的随机行为。

任何登陆网站的个人用户都有 5%的机会转化,但这并不意味着 100 个用户中有 5 个会转化。100 个用户中有 0 个会转化还是有可能的,只是偶然。

也就是说,平均而言,100 个用户中往往会有 5 个转化用户,这就是为什么当我们远离中心时,测得的 CVR 与 5%不同的实验数量会减少。这种分布被称为正态分布,由于它能够近似自然现象,因此在许多研究领域都得到了应用。

计算概率

现在你可能想知道这是什么意思,但是用我们新发现的知识,我们可以回答我们最初的问题,那就是:

如果我们网站的实际 CVR 是 5%,如果我测量 1000 个会话,我测量到 6%或更高的值的概率是多少

现在这很容易。我们只需计算所有 CVR 超过 6%的试验,然后除以试验总数。

P(CVR > 6%) = Count of trials with CVR > 6% / Total count of trials
            = 200 / 10000
            = 2%

我们找到了。我们的 CVR 达到 6%或更高的几率只有 2%。我们可以为不同的潜在 CVR 计算类似的数字,但我们会看到趋势。随着我们远离值 5%(我们在实验中假设的 CVR),我们将看到测量值的概率向 0 下降。

让我们重述一下我们刚刚说过的话:

我们的 CVR 达到 6%或更高的几率只有 2%。

不管你有没有注意到:这是一个 p 值。

Much surprise. Photo Credit: Ben White.

p 值是假设零假设是正确的情况下,我们观察到某个事物为或更为极端的概率。

在我们的例子中,零假设是 CVR 是 5%,它是正确的意味着实际 CVR 是 5%。这就是你要说的——“我们的 CVR 达到 6%或更高的几率只有 2%。”—一个 p 值,甚至没有找到它的意思。

逆转它

在典型应用中,通常从目标 p 值开始,然后检查测得的 CVR 与该值相比是否显著。这与我们刚刚遵循的程序相反。让我们试一试。

我将广告添加到一个之前 CVR 为 4%表现良好的页面,但我想非常确定(95%)我的广告不会分散用户的购买注意力。让我们回到我们的图表。我们需要找到试验次数达到 5%的 CVR,而不是对超过某个值的所有试验进行计数。这将类似于:

CVR where No. Trials = 5% of Total Trials = 0.05 * 1000 = 50

如果我们把测得的 CVR 按升序排列,我们只需要选择第 50 个 CVR。一个简单的方法是使用累积分布,这是通过将左侧的所有 CVR 相加直到列表末尾而创建的。从左到右,你会得到小于某个 CVR 的总试验次数。在 CVR 为 4%的情况下,你预计会有 500 个会话,正好是一半。

通常,我们会将累积分布绘制成百分比,这样我们就不必跟踪试验的次数。

Percentage of Measurements = Measurements So Far / Total Measurements

Left: Histogram of ‘measured’ CVRs. Right: Cumulative Distribution of the same CVRs featured on the left.

现在我们有了累积分布,我们可以通过画一条线到分布上来找到我们的 CVR,然后下来找到我们的 CVR。这给出了 3%的结果。因此,我们可以得出结论,如果在 1000 次会话后,我们记录的值为 3%或更少,那么我们可以确信 CVR 小于 4%,我们应该重新考虑我们的页面设计。

AB 测试

希望以上给出了我们如何可视化 p 值的基本理解。我们现在已经到达了这篇文章的顶点——AB 测试。

AB 测试在全球范围内影响你最喜爱的应用、服务和程序的产品决策,因此,理解它们至关重要。

Photo Credit: Helloquence.

当人们想要测试变异和原始之间的差异时,使用 AB 测试。一个例子是电子商务网站上的新购买流。原来的设计将被称为控制,新的设计将是变化。在这种情况下,我们想知道:“变异的 CVR 比对照的好吗?”。

在这样的测试中,您可能会测量 1000 个会话的结果,并发现变异的 CVR 是 9%,而控制的 CVR 是 7%。我们能得出变异更好的结论吗?我们再做一些统计。

我们将采取和以前一样的方法,首先重申这个问题

由于纯粹的偶然性,我们测量到 2%的差异的概率是多少?

有了这个,我们可以像以前一样模拟一堆实验。考虑到我们测量的 CVR 为 7%和 9%,最有可能的平均值 CVR 为 8%,所以我们可以用 8%的 CVR 运行两个实验,看看有多少次差异大于 2%。

As before. Left: Histogram of ‘measured’ CVRs. Right: Cumulative Distribution of the same CVRs featured on the left.

我们可以在这里看到我们试验的结果。像以前一样,我们看到一个正态分布和我们的累积分布。为了计算出测量 2%差异的机会,我们可以找到 2%值所对应的试验次数。在这种情况下,如果我们画一条线,我们会看到它大约是 90%。这告诉我们,10%的时间我们会看到超过 2%的差异纯属偶然。换句话说:

由于纯粹的偶然性,我们有 10%的机会看到大于 2%的差异。

好了,又一个 p 值。通常对于业务测试,我们的目标是 p 值为 0.95,在这种情况下相当于 5%,因此我们可以看到,根据我们拥有的数据量,不可能得出变化更好的结论,相反,我们必须收集更多的数据。

为什么要考 AB?

细心的读者可能会好奇为什么我们还要进行 AB 测试。在上一节中,我们展示了当你做了一个改变,并且知道你的网站的潜在 CVR 时,如何找到 p 值。

我们进行 AB 测试的原因是为了控制可能影响结果的已知和未知因素。例如,如果用户更有可能在月末进行转换,而我们在月初开始测试,那么即使是一个更好的设计,这个变化也可能做得更差。或者,如果在测试期间,其中一个供应商停止生产一种产品,这将使变化处于亏损状态。

通过运行 AB 测试,将用户随机分配到一个组,我们可以确信两个样本将具有相似的特征,从而创建一个公平的测试。

结论

我们发现 p 值是假设零假设是正确的情况下,我们观察到一个或更多极端效应的概率。

我们看到 p 值的应用通过可视化和一些计算实验的力量非常容易理解。这种理解方法给了我很大的帮助,当其他人需要帮助理解 p 值为 0.96 的实际情况时,它可以作为一个书签。

知道另一种简化 p 值的方法吗?让我知道!

过去一年最有用的 6 个机器学习项目(2018)

原文:https://towardsdatascience.com/the-10-most-useful-machine-learning-projects-of-the-past-year-2018-5378bbd4919f?source=collection_archive---------2-----------------------

想获得灵感?快来加入我的 超级行情快讯 。😎

对于人工智能和机器学习来说,过去的一年是伟大的一年。机器学习的许多新的高影响力应用被发现并公之于众,特别是在医疗保健、金融、语音识别、增强现实以及更复杂的 3D 和视频应用中。

我们已经看到了更多的应用驱动的研究,而不是理论上的推动。尽管这可能有其缺点,但它目前已经产生了一些巨大的积极影响,产生了可以迅速转化为业务和客户价值的新 R&D。这种趋势强烈地反映在许多 ML 开源工作中。

让我们来看看过去一年中最实用的 6 个 ML 项目。这些项目已经发布了代码和数据集,允许个人开发人员和较小的团队学习并立即创造价值。它们可能不是最具理论突破性的作品,但它们是适用和实用的。

Fast.ai

Fast.ai 库旨在使用现代最佳实践简化快速准确的神经网络训练。它抽象了在实践中实现深度神经网络的所有细节工作。它非常易于使用,并且是按照从业者的应用程序构建思维来设计的。该库最初是为 Fast.ai 课程的学生创建的,是在易于使用的 Pytorch 库之上以干净简洁的方式编写的。他们的文档也是顶级的。

探测器

Detectron 是脸书 AI 的研究平台,用于对象检测和实例分割研究,用 Caffe2 编写。它包含各种对象检测算法的实现,包括:

  • 屏蔽 R-CNN :使用更快的 R-CNN 结构的对象检测和实例分割
  • RetinaNet :一个基于特征金字塔的网络,具有独特的焦点损失来处理困难的例子。
  • 更快的 R-CNN :物体探测网络最常见的结构

所有网络都可以使用几个可选分类主干之一:

更重要的是,所有这些都带有 COCO 数据集上预先训练的模型,因此您可以开箱即用!它们都已经在 Detectron model zoo 中使用标准评估指标进行了测试。

Detectron

快速文本

另一个来自脸书研究中心的库是为文本表示和分类而设计的。它带有超过 150 种语言的预训练单词向量模型。这种词向量可以用于许多任务,包括文本分类、摘要和翻译

AutoKeras

Auto-Keras 是用于自动机器学习(AutoML)的开源软件库。它是由德州农工大学的数据实验室和社区贡献者开发的。AutoML 的最终目标是向数据科学或机器学习背景有限的领域专家提供易于访问的深度学习工具。Auto-Keras 提供了自动搜索深度学习模型的最佳架构和超参数的功能。

多巴胺

多巴胺是强化学习算法快速原型的研究框架,由 Google 创建。它的目标是灵活且易于使用,实现标准的 RL 算法、指标和基准。

根据多巴胺的文档,他们的设计原则是:

  • 简易实验:帮助新用户进行基准实验
  • 灵活开发:促进新用户产生新的和创新的想法
  • 紧凑而可靠:为一些更老、更流行的算法提供实现
  • 可重复:确保结果可重复

vid2vid

vid2vid 项目是 Nvidia 最先进的视频到视频合成算法的公共 Pytorch 实现。视频到视频合成的目标是学习从输入源视频(例如,语义分段掩码序列)到精确描述源视频内容的输出照片级真实视频的映射函数。

这个库的伟大之处在于它的选项:它提供了几种不同的 vid2vid 应用程序,包括自驾车/城市场景、人脸和人类姿势。它还附带了广泛的指令和功能,包括数据集加载、任务评估、培训功能和多 gpu!

Converting a segmentation map to a real image

荣誉提名

  • ChatterBot: 用于会话式对话引擎和创建聊天机器人的机器学习
  • kube flow:Kubernetes 的机器学习工具包
  • imgaug: 用于深度学习的图像增强
  • 不平衡学习:scikit 下的一个 python 包,专门用于跟踪不平衡数据集
  • ML flow:开源平台管理 ML 生命周期,包括实验、可复制性和部署。****
  • AirSim: 基于虚幻引擎/ Unity 打造的自动驾驶汽车模拟器,来自微软 AI & Research

喜欢学习?

在推特上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!也在 LinkedIn 上与我联系!

每个人都需要掌握的 10 种偏见和因果关系技巧

原文:https://towardsdatascience.com/the-10bias-and-causality-techniques-of-that-everyone-needs-to-master-6d64dc3a8d68?source=collection_archive---------11-----------------------

第 1 部分—数据科学和机器学习中的偏差、因果关系、实验设计和辛普森悖论

到底因果关系和机器学习有什么关系?机器学习是关于预测和关于真实效果的因果关系,这两个主题有什么共同点吗?是的,有很多共同点,这一系列文章试图在数据科学的这两个子领域之间架起一座桥梁。

我喜欢认为机器学习只是一个数据研磨机,如果你放入高质量的数据,你会得到高质量的预测,但如果你放入垃圾,它会继续研磨,但不要指望会有好的预测出来,它只是研磨的垃圾,这就是我们在这篇文章中要讨论的。

指标 :
基本定义;
数据科学中的因果关系;
1 —辛普生悖论;
2 —有效期、外部效度和格兰杰因果关系;
3 —生态谬误;
4 —省略可变偏差;
5 —反事实;
6 —实验的干预和设计;
7 —选择和生存偏倚;
结论和后续步骤。

基本定义

什么是机器学习?很简单,它是一套在数据中寻找模式的技术,以实现给定的目标,而不必显式地传递指令。例如,网飞的电影推荐系统。

什么是数据科学?汇集统计数据的多学科领域,
通过机器学习和计算来解决数据密集型问题、分析和见解。更详细的描述可以在下面找到:

[## 毕竟,数据科学中有什么新东西?

数据科学家的工作范围和角色是什么。

medium.com](https://medium.com/swlh/data-science-and-the-data-scientist-db200aac4ea0)

因果关系

在这里,它开始变得有点难以(和哲学)定义。过去的伟大思想家们取得了进步,如亚里士多德、德卡提斯、斯宾诺莎、康德、密尔、休谟和许多其他人,但没有什么明确的东西,我也不会给它下定义。对我们来说,现在,它将只是一个变量的真实影响,即
如果变量发生,它将对目标产生多大的影响。例如,吸烟(我们的变量)使你患肺癌(我们的目标)的可能性增加+ x%(我们的因果效应)。

这听起来很简单,但问题是,通过放置没有影响但只与引起影响的变量相关的变量,后者捕捉到了前者的影响,并且没有好的方法知道这是否正在发生。对于预测来说,这很好,因为我们通常没有因果变量,但通过放置一系列与因果变量相关的变量,模型可以更好地理解和预测。

如果你只关心预测,比如一个机器学习工程师,也许因果关系真的是一个次要的细节,但如果你的预测不是惰性的,而是对使用它们的人产生一些行动,也许你应该开始担心因果关系。如果你是一名数据科学家,不关心因果关系,你可能不是一名科学家,而是一名工程师。做科学就是发现(或者更常见的,试图反驳)因果关系。当然,在许多模型中,我们只关心做出简单的预测,我们可能不需要科学家来做这些。

Granger Causality Graph Example, which is not exactly causal, but which increases predictive power over time series. Available at URL: https://arxiv.org/abs/1406.6651

此外,机器学习领域越来越强烈的担忧是选择偏差。我们已经有几个国家(特别是在欧洲)允许用户知道一个可能的算法决策的原因(例如借款、保险或职位空缺),所以仔细想想偏见、
歧视和因果关系不仅重要,而且可以让你免于犯罪。我们在解释 BlackBox 的算法时谈到了这一点:

[## 解读机器学习——全指南

沙普利值和 SHAP 包

towardsdatascience.com](/the-ultimate-guide-using-game-theory-to-interpret-machine-learning-c384cbb6929)

一旦概念被定义,我们将开始混合它们。

在数据科学中,我们经常训练机器学习模型来预测目标,例如预测客户是否会偿还贷款,我们有这样做的最佳实践,例如平衡模型的复杂性,以便它不会非常简单,不会理解问题的复杂性,也不会比必要的过度拟合更复杂。但事实上,我们想要的是它能够很好地概括,为此,它理解因果效应是理想的,即变量如何影响目标以及它们如何相互关联。

正如我们所说,机器学习模型的一个主要优势是,它不一定要捕捉真实的影响来改善其预测,任何副作用或这些真实事件的代理也是可行的,这使得创建这种模型的人的生活更加容易。但是并不是一切都是完美的,
这个设施也开始产生一些问题。让我们来看例子:

示例 1—性别偏见和辛普森悖论

辛普森悖论是,通过测量两个变量之间的相关性,他们显示了错误的值,这可以通过控制导致混淆的第三个变量来纠正。

当数据被分组时出现的一种趋势或结果,当数据被组合时,这种趋势或结果会反转或消失。爱德华·休·辛普森

辛普森悖论最初并不完全是效应信号的反转,而仅仅是在控制了使效应变得“混乱”的变量时,信号大小的变化,但是这在分析中变得如此正常,以至于最近我们只考虑了一个真正的效应悖论。辛普森当效果相反时,然而它比你想象的更普遍。一种思考方式是,这不是一个真正的悖论,而是一个我们不知道所有片段,但需要组合起来才能相信其效果的难题。

一个著名的例子发生在 1973 学年初,当时比较了加州大学伯克利分校研究生院的性别比例,注意到 44%的男性和 35%的女性。彼得·比克尔和他的团队检查了这些数据,并注意到一些非常奇怪的事情,存在歧视(这是该学院非常担心的),但在 6 个部门中的 4 个部门有利于女性(而在另外 2 个部门无动于衷)。事实证明,女性倾向于申请的部门要小得多,这个在分析中被“忽略”的变量将歧视女性的结果逆转为歧视男性。

为了解决这个问题,我们需要了解我们的分析或预测是否没有经历辛普森悖论,也就是说,如果我们忘记了一些混淆变量,不幸的是,没有科学的方法来证明没有影响。跟踪,但有好的做法,我们会看到在未来的职位。

Each point is a department and the size of the circles is the size of the department. The “+” indicates small departments.

辛普森悖论一直在发生,但是如果对你正在处理的数据没有足够的直觉,就很难做出诊断。下面是一篇解释如何用线性回归控制影响的文章:

[## 统计建模——实用指南

第 2 部分—解释机器学习模型

towardsdatascience.com](/statistical-modeling-the-full-pragmatic-guide-7aeb56e38b36)

例 2——公鸡打鸣和模型有效性。

想象一下,我们有一个模型来预测未来 10 分钟内太阳升起的概率,我们在这个模型中添加了几个变量,如温度、一天中的小时和分钟、光度等。当我训练我的模型时,我注意到最重要的变量叫做“公鸡之歌”,当我使用这个变量时,模型会损失很多性能。在机器学习的标准中,我应该保留这个变量,因为公鸡打鸣后不久,太阳就会升起。

When we have a variable increasing predictive power and it comes before the target, we call it Granger Causality (the granger-cause variable). Do not confuse with actual Causality.

当我们用我们的因果透镜思考超越相关性时,我们知道公鸡不会导致日出,即使它有很高的相关性,因为这种影响不是因果的,使用它有风险。可能有一天公鸡会更早歌唱,而太阳显然不会更早升起,或者可能公鸡醒来时身体不适,没有歌唱,但太阳仍会升起(我希望如此),在所有这些情况下,该模型都会出现悲惨的错误,因为它依赖于非因果相关性。

在这种情况下,我们的模型将有一个短的保质期,因为使用的变量不是因果变量,所以影响是不真实的。或者在计量经济学的措辞中,我们说这个模型没有外部有效性,因为如果我们把它用在某个地方,而不是一个凸起,它将不起作用。
如何解决?我们可以删除“公鸡打鸣”变量,我们的模型似乎会变得更糟(指标会减少),但在中期内它会更稳定(外部有效性更普遍),因为它不依赖于一个易变变量(方差高)。

当然这是一个不切实际的例子,但这在真实的机器学习项目中经常发生。想想你的变量是否有失效日期。如果它们是因果关系,它们会持续更长时间。

例子 3——财富、投票和生态谬误

生态谬误比我们的辛普森悖论更为普遍(就像我们的辛普森悖论是生态谬误的一个特例)。当分析* 总体 *变量并对分类数据做出假设时,即着眼于宏观并推断微观时,问题就出现了。让我们用在美国找到一个富人的可能性来说明这个例子。我们首先考虑的是每个州的平均财富,总结如下:

我想说在富裕的州遇到富裕的人的机会比在贫穷的州高,这似乎有道理,但这就是错误所在!这种假设不一定是正确的,因为当分析汇总数据(按州)时,我们指的是平均值,当我们谈论找到一个富人的概率时,我们指的是中位数,这种概率只有在对称分布(或在这种特定情况下,不对称向右)中才会更高,这在这些情况下是非常罕见的。

IMAGE SOURCE: U.S. CENSUS BUREAU.

第二个相关的例子是著名的富人(个人)更倾向于投票给共和党候选人,当我们分析(按州)总数据时,这种效应是相反的。举例来说,2004 年,老布什在 15 个最贫穷的州赢得了选举,而约翰·克里在 11 个最富裕的州赢得了选举。然而,布什在最富有人群中的投票(> 20 万/年)是克里的两倍,这也是因为分布非常不对称,超出了受外部因素严重影响的平均值。

例 4——海滩上冰淇淋和椰子的销售,遗漏变量的偏差。

理解辛普森悖论的另一种方式(也是经济学家更喜欢的方式)是偏置被省略的变量。现在想象一下,我们的模型应该预测海滩上的冰淇淋销售,当我们查看解释变量之间的相关性时,最正相关的是椰子水的销售,我们在模型中添加了这一项,并对我们的预测感到满意。但是卖更多的椰子汁真的会增加冰淇淋的销量吗?

Y is the sale of ice cream, and Z is the sale of coconut water. We note that X (the temperature) affects both Y and Z, in our case reversing the sign of the effect of Z on Y from positive to negative.

仔细观察,这两种产品是替代品,这意味着它们对那些购买(更新)产品的人来说起着类似的作用,并且在某种程度上,增加一种产品的销售实际上会减少另一种产品的销售。游泳者的钱是有限的。这是因为,同样,我们有第三个变量导致冰淇淋销售变化和椰子水销售变化,当我们控制这个变量(可能是游泳者的数量,平均温度或如果是假日)时,椰子水的销售开始减少冰淇淋销售。在我们的模型中,即使有正的相关性,其偏相关(通过控制温度)也变成负的。

这是又一个例子,说明对数据有良好的直觉而不只是盲目地运行机器学习是多么重要。

例子 5——黄道十二宫和反事实

“我不相信占星术,但我真的不会。我是双子座,所以我持怀疑态度。”

当我们试图用统计测试来否认(或证明)一个变量的影响时,我们基本上想知道添加那个变量是否会导致任何变化。一个典型的例子是征兆。当你根据人们的生肖来衡量他们的表现时(在本例中为一般情况),我们拒绝他们会有所作为的假设,因为在《自然》杂志发表的 500 强公司首席执行官中,我们接受他们会有所作为(在众多研究中)。在这里,我想讨论一些声称黄道十二宫会影响你的个性和潜力的实验。

这里的困难不是有一个反事实,而是究竟什么是反事实?对我们来说,一个反事实将是一个在所有方面都完全相同的个体,它们之间只有一个变量不同,在我们的情况下,就是符号。当我们做化学或物理实验时,创造反事实相当容易,因为无生命的物体可以重复,就像两个完全相同的化学实验,我们将一种试剂与另一种试剂不同,差异归因于试剂。在社会科学或经济学中,这要困难得多,想象一下国家的反事实?硬右?所以我们期待像朝鲜一分为二这样的“自然”事件。但是我们如何为标志创造一个反事实呢?我们需要一个有或没有标志的人,不可能。在这种情况下,我们需要求助于统计建模作为综合控制或倾向分数匹配。

People are very good at thinking counterfactuals. How, what if I had tried harder, would I have? Or what if Spock was mean? Note that the counterfactual is its identical “twin brother” in everything except the parsed variable.

我们的例子来自一项调查美国超级运动员标志的研究。当我们观察可以进入这个高性能组的球员的分布时,我们看到他们的迹象没有随机分布。显然有些星座比其他星座占优势。一种可能的解释是,明星真的改变了他们的性格和他们成为体育明星的机会。另一个可能的解释是,信号捕捉到了另一个变量的一些影响,但会是什么呢?嗯,每个标志包括出生时的时间间隔,与学年结束相关的标志比开始时有优势,因为孩子们在整个童年和青春期都是班上最大的,这在整个教育过程中给予了额外的信心,使他们最自信,这反过来又是体育和商业中高表现的超级重要的属性。知道了这些,一个提示,变得更自信!

回到反事实,我们怎么会有一个符号不同的孪生“兄弟”呢?这里的想法是比较是为了寻找一个反事实,可能是第二个非常相似的国家,但学年在 6 个月后开始,或者甚至是寻找某年改变了规则的某个州。当我们这样做时,效果是相反的!抛弃标志会产生影响的假设。

示例 6——定价和干预。

这个例子非常重要,因为它可以推广到许多其他机器学习应用程序。当训练我们的模型时,我们不注意小字体,例如,数据必须以无偏见的方式产生,以用于训练模型。我不止一次看到定价案例(和其他干预案例)使用历史价格/折扣来训练一个预测未来价格/折扣的模型。但是我们要的不是预测什么价格,而是最优价格!而且谁说那些历史培训价格是最优价格?例如,如果在公司政策中,当实行折扣时,它一直是节俭的,所有算法将做的是重复这种节俭,这可能与理想的价格/折扣相差很远。

这个案例说明了对因果建模至关重要的干预效应。如果你的机器学习算法预测并且不影响现实(明天怎么下雨?),干预不是一个问题,但如果你的算法为企业产生输入,以产生一个行动,如改变客户将有权获得的折扣,以最大化他们的购买概率,你必须在训练你的模型时考虑客户的反应。

围绕这个问题有许多例子和方法,从训练一个价格随机定价的模型,以产生一个良好的实验设计,从而产生一个可靠的训练数据集(如 Fischer 在 1936 年提出的),到更现代的方法,如 multi armed bandit,它能够在优化业务指标的同时进行 A/ B 测试(C/D/等)。

我们的下一篇文章将进一步探讨这个话题。

示例 7 —选择偏差

以下是最合法也最难解决的问题。选择偏差与设计好的实验有关,因为一旦你收集了有偏差的数据,就很难纠正,甚至很难知道它的存在。

我们来看第一个例子。想象一下,我们想要衡量数据科学培训在多大程度上提高了公司员工的生产力。我们的第一个方法是给每家公司发一封电子邮件,告诉他们有 50 个职位空缺,第一个注册的人将参加课程。我们进行培训,并在培训前后测量生产率。我们能说这种观察到的差异是训练的错吗?不幸的是,没有,因为第一批报名参加这个项目的人可能不是随机的,他们可能是最专心、最快、甚至更难参加额外课程的人,当测量实验结果时,我们不得不随机选择他们的参与者。

Bias resulting from Systematic error in ascertainment or participation of study subjects. People having different probabilities of being included in the study sample based on exposure and outcome. Diagram from: https://thegradient.pub/ai-bias/

第二个例子是沃尔德博士在第二次世界大战中提供帮助的经典案例。这个故事是关于我们应该在哪里加强飞机装甲。如果我们加固所有的东西,它会很重,它的自主性会被破坏,如果它不保护任何东西,它会非常脆弱。

Statistics produced from aircraft returning from damaged fighting. Each red dot represents a bullet.

上图是从战争中返回的飞机弹孔位置的汇编。当时显而易见的策略是在拍摄最多的地方加强拍摄。当他到达沃尔德的办公室进行进一步分析时,他提出了相反的建议。不是加强机翼,而是加强引擎和机身。但是如果飞机上没有洞,他为什么要这么做呢??

Statistics without Selection bias. Here is an example with white balls (true values ​​of the returning planes) plus the red balls that indicate shots that were not counted as the planes did not return from combat. Wald was able to see this lack of data and saved many lives.

选择偏差,或者说生存偏差。沃尔德说,这些地方没有洞,正是因为这些区域的飞机已经损坏。他们只是还没有返回到统计数据中,而那些被损坏并返回的区域是那些不需要太多增援的地方,因为他们可能会被击中,但仍然可以返回基地。简单而伟大,他们巩固了正确的位置,统计数据帮助拯救了成千上万的生命。

结论

这一系列的例子显然不是为了在这个问题上做到详尽无遗,而是试图开始挑衅,即在没有很好地理解数据和一些因果建模技术的情况下训练机器学习模型甚至会产生糟糕的结果。即使在简单的建模中,
即使度量在短期内是好的。

此外,这些例子表明,对业务数据的直觉和理解与机器学习技术本身的应用一样重要(甚至更重要)。

该文本是一个快速介绍,现在,评论摘录,你有疑问,使更完整和详细的职位。

后续步骤

在接下来的文章中,我们将更深入地回顾这些例子,并探索其中的一些技术,通过 python 中的例子和代码来尝试解决它们(或至少减轻它们)。等待下一个帖子:

  • 因果计算和因果图(Judea Perl);
  • 强化学习和因果关系;
  • 倾向得分匹配和工具变量;
  • 具有不连续性(RDD)和分位数的回归;
  • 相关性、因果性和反事实;
  • 结构方程模型(SEM);

如果你喜欢这篇文章,你可能会对其他文章感兴趣:

世界上最重要的 15 家人工智能公司

原文:https://towardsdatascience.com/the-15-most-important-ai-companies-in-the-world-79567c594a11?source=collection_archive---------3-----------------------

人工智能正在向前发展,无论我们喜欢与否,机器学习都将在我们的技术未来中发挥重要作用。世界上最大和最好的公司已经知道这一点,他们正在大力投资人工智能。

以下是我列出的 15 家最有能力和资源塑造我们互联未来的人工智能公司。这些是人工智能领域的大玩家。

亚马孙

贸易巨头亚马逊投资了人工智能面向消费者的一面,以及公司及其流程的应用程序。该公司的 AI 语言助手 Alexa 集成到其 echo speaker 系列中,在全球范围内享有盛誉。然而,亚马逊网络服务(AWS),一套面向企业的机器学习程序和预先训练的人工智能服务,还没有做这么多。AWS 目前拥有超过 10,000 家客户,包括西门子、网飞、Tinder、NFL 和 NASA。

Photo by Piotr Cichosz on Unsplash

苹果

苹果近年来一直忙于收购人工智能初创公司,并将人工智能视为其未来的重要组成部分。2018 年 12 月,在谷歌挖走苏格兰计算机科学家后,该公司正式任命约翰·詹南德雷亚(John Giannandrea)为人工智能和机器学习部门的负责人。他将监督 Siri 和该公司新的 Create ML 工具等产品的开发,MacOS 和 iOS 开发者可以使用这些工具为他们的应用程序创建高效而直观的培训课程。

班卓琴

班卓是在 2013 年波士顿马拉松爆炸惨案后成立的。这家初创公司使用人工智能搜索社交媒体,以识别实时事件和情况,这些事件和情况对应急服务和其他组织更快、更智能地运作可能至关重要。该公司迄今已筹集超过 1.2 亿美元的资金,包括日本电信巨头软银(SoftBank)等投资者。

DJI

榜单上的第一家中国公司,DJI,虽然仍是一家正式的初创公司,但估值已经达到 150 亿美元。该公司在全球无人机市场的市场份额超过 70%,并越来越多地进入人工智能市场。最新的无人机使用人工智能和图像识别来躲避物体。很快,自动驾驶汽车和机器人技术就可以进入市场了。DJI 最近与微软就无人机到电脑的流媒体项目达成了合作。

Photo by Mitch Nielsen on Unsplash

脸谱网

人工智能在未来将会非常强大。因此,脸书投资人工智能并不奇怪。脸书的人工智能研究小组 FAIR 表示,它致力于推进机器智能领域,开发新技术,为人们提供更好的交流方式。马克·扎克伯格(Mark Zuckerberg)和其他人一起与两名人工智能爱丽丝(Alice)和鲍勃(Bob)合作建立了一个谈判平台,但在这对夫妇开始用他们的秘密语言交流后,他们结束了这个项目。

谷歌

或许这个榜单上最大最重要的 AI 公司也是最明显的。谷歌收购了人工智能初创企业,就好像很快就不会再有了。在过去的四年里,山景城已经创建了不下十二家新的人工智能公司。最重要的收购是对棋盘游戏围棋冠军 DeepMind 的 4 亿美元交易。
还有谷歌的机器系统 TensorFlow,现在已经对所有人免费,还有正在进行的 Tensor AI 芯片项目,用于设备上的机器学习。谷歌首席执行官桑德尔·皮帅已经提到,从长远来看,我们正在“从计算机行业的‘移动优先’向‘人工智能优先’的世界发展”,这已经说明了你需要知道的一切,以了解谷歌对未来的看法。

海思硅

当华为首席执行官 Richard Yu 在柏林举行的 2018 年 IFA 上推出麒麟 980 时,竞争非常激烈。华为芯片制造商海思对全球首款 AI 智能手机芯片第二代进行了显著增强。麒麟 980 可以高速进行人脸识别、物体识别、图像分割和智能翻译等操作。这种芯片引发了大量人工智能智能芯片,如果一家公司打算在未来几年进一步开发这项技术,它很可能会这样做。

国际商用机器公司

自 20 世纪 50 年代以来,跨国技术公司 IBM 一直活跃在人工智能领域。该公司参与了人工智能的诞生,今天仍然坚定地致力于此。通过沃森,IBM 创建了一个机器学习平台,可以将人工智能集成到业务流程中,例如为客户支持建立一个聊天机器人。客户包括四大审计机构毕马威和巴西最大的银行之一 Bradesco。

美国英特尔公司(财富 500 强公司之一ˌ以生产 CPU 芯片著称)

在人工智能公司方面,英特尔也一直在疯狂收购,收购了 Nervana 和 Movidius 以及一些较小的人工智能初创公司。Nervana 使公司能够开发特定的深度学习软件,而 Movidius 的成立是为了将人工智能应用程序带到性能不足的设备上。英特尔还与微软合作,为必应搜索引擎提供人工智能加速。

微软

像亚马逊一样,微软在消费者和商业两方面都参与了人工智能。微软的人工智能数字助手 Cortana 与 Alexa、Siri 和谷歌助手直接竞争。人工智能功能是该公司 Azure 云服务的一大部分,该服务为该行业的一些最大的名字提供聊天机器人和机器学习服务。微软也仅在 2018 年就收购了 5 家 AI 公司。

英伟达

英伟达是历史最悠久的人工智能公司之一,今天仍然发挥着重要作用。英伟达的图形处理器是机器学习和人工智能的终极目标。这家总部位于特拉华州的公司活跃在医疗保健、高等教育、零售和机器人领域。凭借深度学习和 GPU 开发,英伟达致力于将人工智能集成到车辆、制造和自动驾驶的每个层面。

OpenAI

这个非营利研究小组围绕着为全人类的利益开发人工智能,并设法保持其开源思维,尽管通过投资和收购筹集了大量资金。人工智能领域的一些大腕目前在 OpenAI 工作,包括深度学习专家 Ilya Sutskever。赞助商包括微软、亚马逊和埃隆·马斯克。

高通公司

像海思及其麒麟 980 一样,高通是另一家致力于人工智能的芯片制造商。人工智能在骁龙 855 移动平台中起着至关重要的作用。该芯片使用信号处理器实现人工智能语音、音频和图像功能。高通 Snapdragons 为市场上一些最受欢迎的智能手机提供动力。如果你对智能手机中的人工智能感兴趣,你应该关注高通。

感知时间

你听说过中国政府使用人脸识别来追踪公民,对吗?嗯,SenseTime 是这项技术目前的供应商。他的研究团队正在香港大学研究深度学习,众所周知,他的图像识别技术远远领先于谷歌和脸书。自动驾驶目前是 SenseTime 的第一要务。

推特

像硅谷的其他大玩家一样,Twitter 完全是为了进入人工智能,尤其是用钱。四家人工智能公司已经被收购,其中 Magic Pony 以 1.5 亿美元的价格被收购。这家澳大利亚公司正在开发机器学习方法,用于在网络和移动设备上进行视觉处理,Twitter 可能会在未来通过人工智能改进其系统,以便在用户的时间表中推荐特定的推文。

Photo by Con Karampelas on Unsplash

有我忘记的公司吗?请在下面的评论中告诉我。

2018 年堪萨斯城酋长队和足球爆发力指标

原文:https://towardsdatascience.com/the-2018-kansas-city-chiefs-and-an-explosiveness-metric-in-football-c3b3fd447d73?source=collection_archive---------16-----------------------

Photo by Timothé Lejeune on Unsplash

我们如何量化爆发力?

介绍

如果你看过 2018 年的帕特·马霍斯秀,你就会知道堪萨斯城酋长队的进攻非常具有爆发力。作为一个数据迷,我想知道我们是否能提出一个衡量爆发力的单一数字。不幸的是,这并不简单。

一个简单的解决方法是计算超过 10 码的比赛。如果我们这样做,酋长队在新英格兰和公羊队之后排名第三。然而,在那些超过 10 码的比赛中,酋长队仍然有更高的总码数。酋长队也在 15 码以上的比赛和 20 码以上的比赛中领先。事实上,他们在 10 码以上的比赛中有 17 次达阵,而新英格兰和公羊队分别只有 15 次和 10 次达阵。所以我们知道酋长是爆炸性的,但我们如何量化呢?他们比公羊队和新英格兰队更强吗?

注:我的数据来自NFL scraper包。我只使用红区外的策略,赢的概率在 10%-90%之间。

让我们从码数开始

球场既是衡量足球产量的一个好方法,也是一个糟糕的方法。在一年的样本量中,我们可以依靠总传球码数和总跑动码数来准确地给出一个赛季中最佳四分卫和最佳跑卫。然而,足球赛季本质上是小样本的。每年都会有一些奇怪的统计数据在赛季中出现。足球分析家经常引用过去四场比赛、本月等的统计数据。这些数据本身就是戏剧性的和不可持续的。

总码数的一个问题是,它被大戏严重扭曲。阿德里安·彼得森,尤其是在他的全盛时期,展示了在一次跑步中落后多少码是相对无意义的。他已经 33 岁了,仍然对次要问题不屑一顾:

这一轮从哪里开始并不重要,它将是一个 TD。因为是从他自己的 10 码线开始,阿德里安得到了 90 码的成绩。如果同样的跑发生在对手 45 码处,他也只能得到同样出色的跑的一半码数。事实证明,酋长队在 2018 年有很多这样的比赛。

不是所有的码都一样

另一种表述方式是,有些码比其他码更难获得。一旦 AP 跑了 10 码,全速进入第二场,他再跑 3 码的机会就很高。然而,如果是 3 码和 3 码,他在 8 人对抗的情况下跑完全程 3 码的机会相对较低。话说得够多了,下面是一些实证的可视化。让我们从绘制跑垒得分的分布开始。

Note: I eliminated extreme win probabilities and redzone plays from the dataset

好吧,我们可以从中提取大量重要信息。如果你仔细观察的话,大约 90%的跑位在跑了 10 码之前就停止了。有一种更好的方式来展示这一点。累积分布函数将从左到右累加所有的概率。换句话说,我们将知道 0 码或更少,3 码或更少的比赛的百分比,等等。为了好玩,我用了艾德里安·彼得森全盛时期(从 2009–2015 年数据集开始)。这是他获得的码数的累积分布函数。

Blue bars mark the area from 0–3 yards gained. Green bars mark from 10–13 yards.

当你沿着 x 轴向右走,AP 被处理的概率增加。如果每一码都一样,那么 AP 在 0-3 码和 10-13 码之间被拦截的机会是一样的。在右边的图表中,在这两个范围内都有大约 6%的可能性。相反,我们看到 CDF 在左边。在图中,当我们到达 x=0 的混战线时,已经是 40%了!这意味着 40%的 AP 跑垒距离小于零码。当我们到达 3 码的时候,它一直跳到 65%。因此,在大约 25%的 AP 跑垒中(25%是因为我从 65%中减去 40%),他被铲球 0-3 码!或者,当他在第二跑道超速行驶时,他只有 3%的路程是在 10 到 13 码之间。换句话说,如果他已经在同一场比赛中获得了 10 码,那么他就更容易获得 3 码。所有的码不是平等创造的。

这和爆发力有什么关系?

嗯,如果一个球员很有爆发力,我们应该会看到很多 20 码跑、45 码跑和 80 码跑。有时候唯一能阻止球员的就是端线。用足球男孩/女孩的话来说,他们需要能够“达到第二级水平”并“在开阔的领域表现良好”。从统计学的角度来说,这个分布应该有一个胖胖的右尾。

看看 2018 的酋长们有没有这条肥右尾巴。我将在下面绘制仅完成的分布图。尽管我很想包括残缺和麻袋,但这使分布变得复杂,从而也使数学变得复杂。

啊哈!那正是我们要找的尾巴。其他球队有一个更尖锐的高峰,因为他们完成了更多的 0-15 码传球。幸运的是,比我聪明的统计学家们想出了一种方法来衡量“峰值的锐度”。这就是峰度。但是峰度不是一切。酋长的分布也更加向右倾斜。当你把足够右偏斜和高峰度结合起来时,你会在分布的右尾下得到很多区域。换句话说,就是一堆 20 码以上的球。你可能还会注意到,高能量进攻的平均分布在 NFL 其他球队的右边。这只是每完成码数(YPC)。国家橄榄球联盟和爱国者队的场均得分约为 12 YPC,而酋长队和公羊队的场均得分分别为 14.5 和 13.7。让我们把它们放在一起(我使用了逆峰度,因为峰度在这个上下文中意味着更少的爆发力)。我归一化了均值、偏斜度和反峰度,得出了下面这张难看的图。我甚至有点不好意思把这张图包括进来,但它是一个更广泛观点的一部分:

这个图表需要一秒钟来解释,这使得它不能令人满意地比较这些球队的爆发力。对于一个强有力的进攻,我们需要一个高的每完成码数(蓝色条),一个高的反峰度(橙色条),和一个高的右斜(绿色条)。没有一个组合在这三个方面都是最好的,尽管酋长队在这三个方面的总平衡是最好的。

减少到一米

如果你想模拟一个游戏,均值、偏斜度和峰度都很好。人们甚至可以分离出触地得分的打法,以便更加准确。然而,我试图提出一个爆发力的单一指标。据我所知,没有数学上可靠的方法来线性组合峰度和偏斜度。

基尼系数

相反,我们将借用经济学家的一个术语。我们将使用基尼系数。基尼系数衡量分配中的不平等。经济学家最常用它来衡量收入不平等。如果一个国家的每个人收入完全相同,基尼系数等于 0。如果国家的所有财富都被一个人占有,那么基尼系数就是 1。

应用到足球上?

我们可以用码数不平等来代替收入不平等。换句话说,一个球队的码数有百分之几属于大戏?如果一个队的所有比赛都用相同的码数,基尼系数将为零。然而,如果一个人走了 80 码,而其他人走了 0 码,那就是 1 码。在酋长队对公羊队对帕特队的例子中,我们得到 0.436,0.380 和 0.407。酋长有最高的!

基尼系数与获得的平均码数无关。因此,我们还需要一个术语来描述每场比赛的码数,或者在我一直使用的例子中,每场比赛的码数。下面是我的数据集中团队的图表。不幸的是,“草皮上最棒的表演不在数据集中。

所以理论上,最具爆发力的传球进攻会偏向右上角。2013 年的老鹰队是唯一一支看起来比 2018 年的酋长队更具爆发力的球队(场均码数相对相近)。这一年尼克·福尔斯投出了 27 个罚球和 2 次拦截,所以这有点道理。让我们绘制完工量的分布图,以确保基尼系数发挥作用。首先,我将匹配 2018 年的酋长和 2016 年的美洲虎。他们每场比赛的码数差不多,但是酋长队应该有更多的大手笔。2016 年的海豚队和 2016 年的海盗队应该也是如此。那一年海豚队的基尼系数非常高,而海盗队却没有。

Longer, fatter right tails = higher Gini.

好像起作用了!所以上面的两个比较涉及到平均每场完成码数差不多但进攻非常不同的球队。2016 年的海豚队和 2018 年的酋长队比每次完成类似码数的对手更具爆发力。2016 年的海盗队和美洲虎队仍然是很好的传球进攻,擅长“移动链条”,但他们不太可能打开一个大的游戏。

结论

总之,我们找到了一种通过进攻型打法的基尼系数来衡量爆发力的方法。我认为最好的使用方法是结合每次完成码数(YPC)。或者甚至是跑动进攻,就每次跑动的码数而言。那些平均拥有很多码数,并且非常倾向于大手笔的球队是最值得关注的球队。也许在未来,我们可以分解球员名单可能如何影响这种爆发力🤔。我们也可以打开潘多拉的盒子,看看防御措施。如果你真的用这个工作,请发推特给我让我看看。如果你有兴趣的话,这次我想起来了链接我的代码

最后,我想提一下,我不是第一个尝试测量爆发力的人。大学橄榄球分析界的传奇人物比尔·康纳利对爆发力有自己的衡量标准。他用它为做了很多伟大的工作,我尽我所能复制它。当我比较基尼和 IsoPPP 时,我有一个非常有趣的结果。IsoPPP 和每完井码数高度相关。然而,基尼系数与 IsoPPP 相关,但与每完工码数无关。同样,需要做更多的工作。敬请期待!

The correlation matrix of Yards Per Completion, Gini Coefficient, and my attempt to calculate IsoPPP.

Spotify 上的 2020 候选人

原文:https://towardsdatascience.com/the-2020-candidates-on-spotify-7613c32701f2?source=collection_archive---------31-----------------------

Album art from 2020 candidates’ playlists.

Spotify 的数据能告诉我们一些总统竞选是如何瞄准选民的?

利佐是民主党可以同意的一件事。三位 2020 年的候选人已经将 Spotify 整合到他们的竞选活动中:参议员卡玛拉·哈里斯、参议员柯尔斯顿·吉利布兰德和市长皮特·布蒂吉格。在他们的播放列表中,她出现的次数比任何其他艺人都多,只有她和阿撒·富兰克林出现在这三个列表中。

虽然很容易在每个播放列表中注意到 Lizzo,但我们可以使用 Spotify 的数据集来揭示不太明显的趋势。Spotify 公开了一首歌曲的受欢迎程度、风格信息和其他元数据——这些数据不仅有助于了解每位候选人的目标受众,还有助于了解候选人希望观众如何看待他。

该分析将考虑三个播放列表:来自 Buttigieg 竞选活动的“ Buttijams ”、来自 Gillibrand 竞选活动的“ Gillibrand 2020 ”以及来自 Harris 竞选活动的“卡玛拉的夏季播放列表”,如下面的时间线所示。(完整的播放列表也嵌入在本文的底部。)还有其他存在的:拜登在 2016 年与奥巴马一起发布了播放列表,贝托·奥洛克在参议院竞选期间发布了一个非常德克萨斯的播放列表。2017 年,哈里斯在她的官方参议员账户下发布了一个播放列表来庆祝非裔美国人音乐欣赏月,而 Buttigieg 最受欢迎的播放列表是“ 50 年,50 首颂歌:骄傲 2019 ”然而,考虑到这一点,更直接的方法是专注于明确用于 2020 年总统竞选的播放列表。所有数据都是在 8 月 1 日收集的。

Timeline and data from the three Spotify playlists.

受欢迎程度和发布日期

虽然“听的次数”是衡量一首歌受欢迎程度的更直接的方法,但 Spotify 创造了一个从 0 到 100 的“受欢迎程度”指数,衡量播放次数和这些播放的最近时间。以下是每位候选人的播放列表中最受欢迎和最不受欢迎的歌曲。

LINKS — Buttigieg: American Pie, High Hopes. Gillibrand: Try a Little Tenderness, Sunflower. Harris: One Nation Under a Groove, Boy with Luv.

然而,看一下影响流行的两个因素的具体分类会更清楚:听众和发行日期。这些分布显示在下面的箱线图中。

Distribution of release year and number of listens for each candidate’s playlist. Outliers are dropped.

这里最引人注目的趋势是吉利布兰德几乎把所有的音乐都集中在了 21 世纪。这也体现在“倾听”的平均次数明显高于其他两位候选人。这可能表明她专注于更年轻的人群,或者只是选择“更安全”的歌曲(吉利布兰德有 1 首明确的歌曲,相比之下,Buttigieg 有 3 首,哈里斯有 8 首)。哈里斯似乎拥有分布最均匀的播放列表;她最早的歌曲是 1964 年的,但她的播放列表中至少有四分之一是 2019 年发布的歌曲。

流派分布

虽然 Spotify 没有明确定义曲目的流派,但它确实将流派与艺术家联系起来。通过结合这两个数据源,我们可以大致估计出候选人决定将哪种风格与他们的图像联系起来。

Genre percentage distribution by candidate.

也许最显著的区别是某些候选人的播放列表中没有的类型。哈里斯的播放列表中没有乡村音乐,Buttigieg 也没有说唱音乐。Buttigieg 最受欢迎的音乐类型是摇滚,占 40%,流行音乐占 31%,灵魂乐占 30%。

艺术家重叠

下图有助于显示候选人之间的艺术家重叠。艺术家的受欢迎程度在括号里。如前所述,利佐和阿撒·富兰克林是仅有的两位出现在所有三个播放列表中的艺术家。

Artist overlap between candidate’s playlists. Popularity in parentheses.

Buttigieg 和 Harris 分享了最不受欢迎的艺术家麦克法登& Whitehead 和 Sharen Jones & The Dap-Kings,而 Harris 和 Gillibrand 分享了最受欢迎的艺术家:碧昂斯、Arianna Grande 和说唱歌手 Chance。

Spotify 功能

Spotify 还使用索引来帮助他们的算法进行推荐。然而,在这种分析中,以一种比体裁更详细的方式来区分三个候选人之间的文体差异是有帮助的。

Spotify 使用的三个有趣的功能是“能量”、“可跳舞性”和“效价”功能。按照 Spotify 的分类,一首充满活力的歌曲让人感觉又快又吵。正如人们所料,具有“可跳舞性”的轨道适合于跳舞。价高的轨道是积极的,价低的轨道是沮丧的或愤怒的。

Buttigieg 的竞选团队发布了三位候选人最有活力和“最快乐”的歌曲。吉利布兰德竞选团队贴出了该乐队最悲伤的歌曲,奥蒂斯·瑞丁的《尝试一点温柔》和艾丽西亚·凯斯的《T2》和《女超人》。哈里斯的播放列表最适合跳舞。

有更多的方式来探索 2020 年候选人如何使用音乐来传达他们的信息。如果你对自己进行分析感兴趣,这里有一个链接指向我收集的数据。Spotify 的数据集提供了另一种新颖的方式来分析竞选活动如何试图在更个人化的基础上与选民建立联系。

疑问?失误?联系我,查看更多项目在 我的网站

播放列表

注意:嵌入的播放列表可能会更新,而上面的统计数据不会。例如,哈里斯最近从她的播放列表中删除了“One Nation Under Groove”,尽管该歌曲在统计中使用,但不会出现在下面的嵌入式播放列表中。

神经网络的三种最佳优化方法

原文:https://towardsdatascience.com/the-3-best-optimization-methods-in-neural-networks-40879c887873?source=collection_archive---------3-----------------------

了解 Adam 优化器、momentum、小批量梯度下降和随机梯度下降

Photo by rawpixel on Unsplash

深度学习是一个迭代的过程。有如此多的参数要调整或方法要尝试,为了快速完成迭代周期,能够快速训练模型是很重要的。这是提高机器学习团队速度和效率的关键。

因此,优化算法非常重要,例如随机梯度下降、最小批量梯度下降、动量梯度下降和 Adam 优化器。

这些方法让我们的神经网络学习成为可能。但是,就速度而言,有些方法比其他方法执行得更好。

在这里,您将了解随机梯度下降的最佳替代方案,我们将实现每种方法,看看神经网络使用每种方法可以多快地学习

对于机器学习、深度学习和人工智能的实践视频教程,请查看我的 YouTube 频道

Gradient…Gradient descent… Get it?

小批量梯度下降

传统的梯度下降需要在对参数进行第一次更新之前处理所有的训练样本。从现在起,更新参数将被称为采取步骤

现在,我们知道深度学习在处理大量数据时效果最好。因此,梯度下降需要在数百万个训练点上进行训练,然后才能迈出一步。这显然是低效的。

相反,考虑将测试集分解成更小的集合。每一小组被称为小批量。假设每个小批量有 64 个训练点。然后,我们可以一次在一个小批量上训练算法,并在每个小批量的训练完成后采取一个步骤!

因此得名:小批量梯度下降

成本图

在之前的中,我们已经看到了成本图,在每次迭代后成本都平稳下降,如下所示。

Example of a cost plot using gradient descent

在使用最小批量梯度下降的情况下,曲线将振荡更多,总体呈下降趋势。当我们编写这个方法时,我们将看到一个例子。这种波动是有意义的,因为一组新的数据被用来优化成本函数,这意味着在回落之前,成本函数有时可能会上升。

如何选择小批量

让我们考虑两个极端。一方面,你可以将你的小批量设置为所有训练集的大小。这将简单地导致传统的梯度下降方法(也称为批量梯度下降)。

另一方面,您可以将最小批量设置为 1。这意味着每一步仅在 1 个数据点上训练后进行。这叫做随机梯度下降。然而,这种方法不是很好,因为它经常在错误的方向上采取步骤,并且它不会收敛到全局最小值;相反,它会在全局最小值附近振荡。

因此,你的小批量应该在这两个极端之间。一般来说,可以遵循以下准则:

  • 如果数据集很小(少于 2000 个样本),则使用批量梯度下降
  • 对于较大的数据集,典型的小批量大小为 64、128、256 或 512。当然,你的小批量必须适合你的 CPU/GPU 内存

同样,小批量大小可以反复选择。你有时需要测试不同的尺寸,看看哪种训练速度最快。

动量梯度下降

具有动量的梯度下降包括对计算的梯度应用指数平滑。这将加速训练,因为算法将更少地向最小值振荡,并且它将向最小值采取更多的步骤。

如果你不知道指数平滑,你可能想读读这篇文章。

通常,使用简单的指数平滑,这意味着还有两个超参数需要调整:学习率α和平滑参数β

通常,这种方法几乎总是比传统的梯度下降效果更好,并且它可以与小批量梯度下降相结合。

亚当优化算法

Adam 代表: ada 感受性mmoment 估计。简而言之,这种方法结合了动量和 RMSprop(均方根 prop)。

RMSprop 平滑了梯度,就像动量一样,但它使用了一种不同的方法,这种方法在数学上可以得到最好的解释。

首先,梯度计算如下:

Gradient in RMSprop

然后,权重和偏差矩阵更新如下:

Weight and bias update in RMSprop

注意β2是一个新的超参数(不要与动量的β相混淆)。另外,ε是一个非常小的值,以防止被 0 除。

因此,结合动量和 RMSprop,Adam 引入了四个超参数:

  • 学习率α
  • β来自动量(通常为 0.9)
  • 来自 RMSprop 的 beta2 (通常为 0.999)
  • ε(通常为 1e-8)

如上所述,您通常不需要调整 betabeta2epsilon ,因为上面列出的值通常会工作得很好。为了加速训练,只需要调整学习速率。

现在您已经了解了每种优化方法,让我们用 Python 实现它们,并看看它们之间的比较。

编码优化方法

我们将在样本数据集上运行每种方法,看看神经网络将如何执行。为了测试训练速度,我们将保持历元数恒定为 10 000。

当然,完整的代码可以在笔记本中找到。

随机梯度下降

让我们从编码随机梯度下降法开始:

这是相当直接的,因为我们使用单个数据点来进行梯度下降。

小批量梯度下降

小批量梯度下降有点难以实现,因为训练规模可能无法被小批量规模整除。因此,我们需要处理最后一批,以适应这种情况:

动力

要实现动量,我们首先需要初始化速度:

然后,我们可以更新我们的参数:

Adam 优化器

现在,由于 Adam 结合了 momentum 和 RMSprop,我们需要初始化两个参数:

然后,我们可以这样更新参数:

采用不同优化方法的模型

现在,我们将用不同的优化方法训练一个神经网络,看看它能学习多快。

让我们将我们的模型定义为:

然后,在对 10 000 个时期进行小批量梯度下降训练后,我们得到:

Results for mini-batch gradient descent

正如你所看到的,我们在 10 000 个时期后只达到了 80%的测试准确度,并且判定边界不是很好。

现在,经过动力训练后,我们得到:

Results for momentum

有趣的是,势头并没有真正帮助。

现在,我们使用亚当,我们得到:

Results with Adam optimizer

太神奇了!使用 Adam,我们获得了 10 000 个历元的更高精度。

请注意,更好的方法就是更快的方法。给定更多的时期,其他方法可以给出更好的准确度分数。不过,这个练习的目的是评估每种方法的速度,亚当显然是赢家。**

就是这样!您学习了神经网络的不同优化方法,实现了这些方法,并且发现 Adam 的性能非常好。

通常,人工智能从业者使用小批量梯度下降或 Adam,因为它们在大多数时候表现良好。

幸运的是,深度学习框架内置了优化方法的功能。在下一篇文章中,我们将介绍 TensorFlow,看看编写更大、更复杂的神经网络有多容易。

下次见!

每个数据科学团队需要雇佣的 3 个缺失角色

原文:https://towardsdatascience.com/the-3-missing-roles-that-every-data-science-team-needs-to-hire-97154cc6c365?source=collection_archive---------15-----------------------

在疯狂招聘数据科学家的过程中,大多数公司忽略了三个关键角色,这往往会导致项目失败

许多公司错误地认为增加分析就是雇佣足够多的数据科学家。也许这就是为什么自 2013 年以来,这个职位的招聘信息增加了 250%。

麦肯锡引用了一家大型金融服务公司的例子,该公司的首席执行官是高级分析的热情支持者。他特别自豪的是,他的公司雇佣了 1000 名数据科学家,每人每年的平均成本为 25 万美元。

后来,当新员工的表现明显不如预期时,人们发现严格来说,他们根本不是数据科学家。

你不能跳过的数据科学角色

Photo by Daniel Cheung on Unsplash

行业中的一个常见问题是,对数据科学家角色以及数据科学团队中的其他关键角色没有清晰的理解。这是许多分析项目失败的关键原因。

数据工程师机器学习工程师可视化设计师这样的角色越来越普遍。但是,除非高管优先考虑招聘其他三项重要技能,否则他们可能会失去数据科学机会,失败的计划或项目不会被大规模采用。

让我们来探索这些特定的技能和角色:

1.数据科学翻译

Photo by Hello I’m Nik 🇬🇧 on Unsplash

您必须通过选择正确的业务问题来启动数据科学计划。翻译人员帮助您识别最有影响力的项目。他们将业务挑战塑造成可以通过数据解决的形状。

翻译对领域有很强的理解,数据流畅,是有效的沟通者。翻译人员在业务用户、数据工程师、数据科学家和视觉专家之间充当桥梁。

数据科学翻译充当粘合剂,将团队中的所有角色结合在一起。

他们将灵魂注入到解决方案中,并充当将团队中所有角色结合在一起的粘合剂。他们的角色在项目交付后继续很好地帮助用户采用解决方案和跨团队扩展。

“雇佣尽可能多的数据科学家——如果没有翻译人员将分析与真正的商业价值联系起来,你仍然会迷失方向。”——麦肯锡

你在组织中缺少这个角色的迹象:

如果你的分析项目没有交付价值,你可能选择了错误的计划。如果您的业务和数据团队各自为政,信息可能会在翻译过程中丢失。如果你的项目慢慢死去,你可能在内部宣传上做得不够。

所有这些都是你正在错过这些内部冠军的迹象。通过雇佣或培训数据科学翻译来解决这个问题。有商业分析背景的人最适合这个角色。麦肯锡预计,到 2026 年,美国对这一职位的需求将达到 200 万至 400 万。

鉴于行业中的技能差距,你可能会更成功地培训具有正确商业头脑的内部候选人。

2.行为心理学家

Photo by James Pond on Unsplash

机器学习模型擅长从数据中识别模式。但是,您仍然需要人类来解释大数据足迹通常导致的许多模式,并挑选出那些能够提供商业价值的隐藏宝石。今天,大多数数据科学应用旨在理解人类行为。你需要了解人们行为方式的专家。

人文和人类学专家在数据科学团队中的角色日益重要。

行为心理学家可以帮助理解购买决策或客户流失的原因。他们可以验证促进用户参与或影响生活方式改变的行动。随着人工智能进入我们生活的更多领域,人文和人类学专家在数据科学团队中的作用越来越大。

您在组织中缺少该角色的迹象:

你对人类行为的预测和见解是否没有击中要害?你的团队是否在努力解释他们决策中人的因素?这些都是你的产品还没有上市的迹象。如果你的团队没有进行这些对话,那就是一个更大的危险信号。

在您的数据科学团队中为具有心理学和社会科学背景的人划分角色。让他们参与讨论,以定义您的人工智能解决方案和产品功能。让他们验证关于人类行为的见解,并确定决策对用户意味着什么。

3.数据说书人

Photo by Daniel Cheung on Unsplash

一些领导者天真地认为,将分析师和工程师放入数据可视化训练营会让他们变成故事讲述者。但是数据说书人并不等同于可视化专家。数据故事不仅仅是可视化的;它们还向用户提供了到目前为止所发生的事情的背景。

然后,他们添加一段叙述来总结见解并推动业务行动。Gartner 表示数据故事需要具备所有三个要素:数据可视化、叙述和背景。

您需要团队中的数据故事讲述者为您的数据洞察力注入活力。

正如心理学家丹尼尔·卡内曼的名言,“没有人会因为一个数字而做出决定。他们需要一个故事。“你需要团队中的数据故事讲述者为你的数据洞察力注入活力。

你在组织中缺少这个角色的迹象:

Gartner 报告称,50%的数据科学项目因糟糕的故事讲述而失败。如果用户很难理解数据科学家产生的见解,那么你就面临着一个数据消费问题。如果决策与仪表盘脱节,讲故事可能就是缺失的一环。

帮助您的数据可视化专家更好地了解业务。提高数据翻译人员的技能,以便更有效地交流信息。训练他们用数据讲故事的技巧。验证数据科学计划的可操作性,并衡量投资回报。

完整的数据科学团队

Photo by freestocks.org on Unsplash

数据科学是一项团队运动。团队需要精通技术、业务、视觉和软技能。这里涵盖的三个缺失的角色需要重叠领域的专业知识,并且经常被忽略。

翻译的角色对于帮助定义业务问题和形成解决问题的方法至关重要。在解释机器学习算法揭示的人类模式方面,行为心理学家的作用至关重要。

最后,数据故事讲述者将这些见解编织成一个有趣的故事,可以在整个组织中传播和促进行动。缺少其中任何一项,您的数据科学工作都可能失败。

想了解更多关于如何在数据科学领域取得成功的信息吗?下面是 5 个核心&关键技能 每一个数据科学团队都必须要规划的。想要在公共场合展示你对数据的热情?这篇文章告诉你从哪里开始

本文最初是在企业家项目上 发表的 。增加了插图。

每个数据科学家都需要了解的 4 个最常见的分类指标

原文:https://towardsdatascience.com/the-4-most-common-classification-metrics-every-data-scientist-needs-to-understand-1d52d8b8770c?source=collection_archive---------20-----------------------

Photo by Clay Banks on Unsplash

还要弄清楚,何时以及如何使用它们?

分类是将连续/离散输入分离成指定数量的离散输出的过程。虽然图像分类已经成为 21 世纪深度学习的最佳应用之一,但用于计算算法性能的指标总是令人质疑。所使用的度量通常是特定于应用的。有时,你试图解决一个股票预测问题,或者如果有一个病理 X 射线或没有或任何其他多类标签。我们将通过使用最普通的狗与猫分类器的例子来深入研究度量的细节。

Source

所以,假设你已经建立了一个二元分类器来预测一个给定的图像是一只猫还是一只狗。让我们假设您的测试集中有 100 只猫和 100 只狗,下面是从模型预测中得到的混淆矩阵。

正如杰瑞米·霍华德所说,

在解决数据科学中的问题时,始终使用适当的术语或大词,否则每个人都会认为这是一件微不足道的事情

因此,让我们从使用真实世界的示例为上述混淆矩阵定义数据科学术语开始

真实世界示例

想象一下,一项研究正在评估一种筛查疾病的新测试。每个参加测试的人要么有要么没有这种疾病。测试结果可以是阳性(将人分类为患有疾病)或阴性(将人分类为没有疾病)。每个受试者的测试结果可能与受试者的实际状况相符,也可能不相符。在这种情况下:

真阳性:患病人群被正确识别为患病
假阳性:健康人群被错误识别为患病
真阴性:健康人群被正确识别为健康
假阴性:患病人群被错误识别为健康

总的来说,

阳性=确定,阴性=拒绝。因此:
真阳性=正确识别
假阳性=错误识别
真阴性=正确剔除
假阴性=错误剔除

简而言之,

Source

现在我们已经熟悉了术语,让我们从指标开始:

1。精确度

这是机器学习中最老套的指标之一。此指标根据样本总数评估所有正确分类的样本。

公式:准确度= (TP+TN)/(TP+FP+FN+TN)

在我们的示例中,将猫视为阳性类,我们得到
TP: 80,TN:50,FP: 50,FN:20

上面的猫和狗的例子给我们的精度是(80+50)/(80+50+50+20)=0.65(65%)

sklearn 库有如下的内置函数

**From sklearn.metrics import accuracy_score****Accuracy = accuracy_score(y_true, y_pred, *average=’weighted’*)**

2。精度

《牛津词典》将精确度定义为“精确和准确的品质、条件或事实”。该指标主要计算预测类别的正确性或准确性,其方法是将较少数量的负样本预测为正类别。它基本上计算所有样本中预测样本的相关性,因此称为正预测值(PPV)。

这种度量主要应用于医学领域。当您构建一个二元分类器时,无论 X 射线是有病变还是健康的,您都需要准确地进行预测,这反过来有助于减少放射科医生的工作量。

公式:TP/(TP+FP)

考虑到我们的例子,猫类的精度是 80/(80+50)=0.615(61.5%)
类似地,狗类的精度将是 50/(50+20)=0.714(71.4%)

现在,为了计算模型的平均精度,可以取加权平均 w.r.t 个样本数。

**From sklearn.metrics import precision_score****Precision= precision_score(y_true, y_pred, * average=’weighted’*)**

3。召回

维基百科将召回定义为“已被检索的相关实例占相关实例总数的比例”。因此,它基本上是实际阳性样本中的预测阳性样本。这也被称为灵敏度或真阳性率。因此,当所有阳性样本都被正确预测时,召回率为 1。

公式:TP/(TP+FN)

在我们的猫和狗的分类中,猫类的召回率是:80/(80+20)=0.8(80%)

**From sklearn.metrics import recall_score****Recall = recall_score(y_true, y_pred, * average=’weighted’*)**

Source

4。特异性

特异性是真阴性率。它测量被正确识别的实际否定的比例。使用具有病理或健康的患者的上述用例,高特异性意味着将实际健康的人称为健康的模型是高的。

公式:TN/(TN+FP)

模型的特异性为 50/(50+50)=0.5 (50%)。

一般来说,这些是评估类和整个模型性能的最常见的度量标准。现在,这些指标的使用已经被证明是特定于应用的。都是在解决一个问题的同时,你最关心什么。在我即将发布的博客中,我将更进一步,写一些不太常见但很重要的分类标准,这些标准在参加 Kaggle 和其他平台的比赛以及评估你的模型的总体性能时很有用。

参考文献

  1. https://www.wikihow.com/Calculate-Weighted-Average
  2. https://towards data science . com/the-5-classification-evaluation-metrics-you-must-know-aa 97784 ff 226
  3. https://en.wikipedia.org/wiki/Sensitivity_and_specificity
  4. https://www.oxfordlearnersdictionaries.com/

约翰尼·德普电影的四种类型

原文:https://towardsdatascience.com/the-4-types-of-johnny-depp-movies-39c20f3f720f?source=collection_archive---------17-----------------------

538 的这篇文章详细描述了尼古拉斯·凯奇电影的五种不同类型,受到这篇文章的启发,我想自己尝试一下这个主题。这种类型的分析是将数据科学与娱乐行业等有趣主题结合起来的绝佳机会。为了成功地为某个男演员或女演员找到不同类型的电影,你需要一个在票房成功和评论界都有一定知名度的人。经过一番思考和考察,约翰尼·德普似乎完全符合这一模式。德普已经出演了 80 多部电影,有一些高潮(加勒比海盗,查理和巧克力工厂),也有一些低谷(莫特凯,私人度假村)。随着演员的关注,我开始收集约翰尼·德普在其演艺生涯中获得表演奖的每部国产电影的票房收入和元评论分数。一旦收集了所有必要的数据,我就用 Python 将电影分成不同的组,用 R 创建最终的视觉效果。我将首先深入约翰尼德普电影的四种类型,然后我将解释将电影分组的过程和推理。事不宜迟,这里是约翰尼德普电影的四种类型。

电影类型分类

海盗/奇幻大片

电影 : 《加勒比海盗:黑珍珠的诅咒》(2003)、《查理和巧克力工厂》(2005)、《加勒比海盗:死人的箱子》(2006)、《加勒比海盗:在世界的尽头》(2007)、《爱丽丝梦游仙境》(2010)、《加勒比海盗:在陌生人的潮汐上》(2011)、《神奇动物在哪里》(2016)

这些电影都在票房上取得了巨大成功,典型的是约翰尼·德普扮演一个“有趣”的角色,如杰克·斯派洛船长或威利·旺卡。票房最成功的电影都是在 2000 年后发行的,约翰尼·德普在这个群体中取得的每一次重大成功都是在幻想类型中。

夏洛克地精的领地

电影:《私人度假村》(1985)、《本尼&俊》(1993)、《时间的尼克》(1995)、《拉斯维加斯的恐惧与厌恶》(1998)、《第九扇门》(1999)、《宇航员的妻子》(1999)、《哭泣的男人》(2000)、《打击》(2001)、《来自地狱》(2001)、《墨西哥往事》(2003)、《秘密之窗》(2004)。 《加勒比海盗:死无对证》(2017)、《东方快车谋杀案》(2017)、《神探夏洛克·侏儒》(2018)、《神奇动物:格林德沃的罪行》(2018)

《神探夏洛克·地精》是约翰尼·德普最大的一个领域,并且在最近几年有了很大的增长。约翰尼·德普的最低谷到处都是。有些是过去电影的平庸延续,如《爱丽丝镜中奇遇记》或《加勒比海盗:死无对证》。其他的,像《私人度假村》和《神探夏洛克·侏儒》,让你想知道当初为什么要拍它们。在德普的职业生涯之初,并没有很多表现不佳的电影,但自 2010 年以来,他已经经历了相当长的时间。

独树一帜,广受好评

电影:《榆树街的噩梦》(1984),《哭泣的婴儿》(1990),《剪刀手爱德华》(1990),《亚利桑那之梦》(1993),《什么在吃吉尔伯特葡萄》(1993),《埃德·伍德》(1994),《唐璜·德马科》(1994),《死人》(1995),《唐尼·布拉斯科》(1997),《断头谷》(1999),《夜幕降临之前》(2000),《巧克力》(2000)

这群人构成了德普电影史上相当大的一部分。这组中的许多电影都是原创的,它们展示了德普在整个职业生涯中各种各样的表演。从经典恐怖片《榆树街的噩梦》到话剧《什么在吃吉尔伯特葡萄》,再到动画喜剧《兰戈》。虽然近年来它们已经不那么流行了,但德普在他 35 年多的职业生涯中一直在推出原创和广受欢迎的电影。

电影:《排》(1986)

最后一个简单来说就是“排”。《野战排》在德普电影史上是个异数。这是他参演的第三部电影,也是德普参演的唯一一部战争片。这是一个巨大的票房成功,在只有 600 万美元的预算下获得了 1.385 亿美元的收入。随着票房的成功,《野战排》还获得了第 59 届奥斯卡最佳影片奖。

电影聚类过程

在从 IMDb 收集了电影数据、从 Box Office Mojo 收集了票房收入数据、从 Metacritic 收集了影评人评级数据之后,是时候准备一种算法来将电影适当地分成不同的组了。为了有效地将电影分成不同的组,我实现了一种叫做高斯混合模型的聚类算法。

为什么我选择了高斯混合模型?当只有两个维度需要评估时(revenue & critic score ),该算法非常有效,并且与其他聚类算法相比,该算法的结果对于这种类型的分析可能更“令人兴奋”,因为高斯混合建模并不假设不同的组将与几何形状或结构对齐。

Example of a Gaussian Mixture Model

在实现混合模型之前,我们如何知道算法应该搜索多少个聚类?找到正确的集群数量可能很棘手,而且非常主观,所以我将使用所谓的肘图来确定适当的集群数量。在 Python Scikit-Learn 库的帮助下,我实现了一个类似高斯混合模型的算法,称为“期望最大化”风格的 K 均值聚类。同时瞄准 1 到 10 个集群的数据,以查看哪个数字可能工作得最好。要使用的“最佳”聚类数通常是误差平方和(SSE)停止快速下降的点。

from sklearn.cluster import KMeans
from sklearn.mixture import GaussianMixture
from sklearn.preprocessing import StandardScaler
import pandas as pd
import matplotlib.pyplot as plt# Reading in the data
movies = pd.read_csv('Johnny Depp Movies.csv')# Using the Sci-kit Learn Standard Scaler for z-score transformation of
# numerical variables.
scaler = StandardScaler()
movies['scores_scaled'] = scaler.fit_transform(movies[['Metacritic Score']])
movies['box_office_scaled'] = scaler.fit_transform(movies[['Box Office']])# Running an Expectation-Maximization K-Means algorithm at increasing
# amounts of clusters to find an appropriate target amount for 
# the Gaussian Mixture Model
SSE = []
i = 1
while i < 10:
    kmean = KMeans(n_clusters = i, max_iter = 1000, algorithm = 'full')
    kmean_fit = kmean.fit(movies[['scores_scaled', 'box_office_scaled']])
    SSE.append(kmean_fit.inertia_)
    i += 1# Plotting the results of the Expectation-Maximization K-Means
plt.style.use('default')
plt.suptitle('K-Means Sum of Squared Errors', fontsize = 15)
plt.xlabel('# of Clusters', fontsize = 12)
plt.ylabel('Sum of Squared Errors', fontsize = 12)
plt.plot(SSE)

虽然在这种情况下没有一个明确的点可供选择,但我决定选择 4 个集群,因为这似乎是上证指数停止高速下跌的第一个点。在选择 4 作为集群的集合数之后,我使用了高斯混合模型。

# Setting up a Gaussian Mixture Model with 4 clusters and 1000 iterations
gmm = GaussianMixture(n_components=4, covariance_type = 'full', max_iter=1000, n_init = 10)# Fitting the model to the data
gmm_fit = gmm.fit(movies[['scores_scaled', 'box_office_scaled']])# Finally assigning labels to the movies
movies['Cluster'] = gmm_fit.predict(movies[['scores_scaled', 'box_office_scaled']])

现在为每部电影分配了集群标签,我用 ggplot2 包在 R 中绘制了数据,并突出显示了一些更有趣的数据点。一些最后的润色是用微软 Word 完成的。

# Loading the ggplot2 package and reading in the data
library(ggplot2)# Plotting out the data
ggplot(df2, aes(x=Metacritic.Score, y=box.millions, color = Cluster)) +
  geom_point(size = 2.5, alpha = .5) +
# Highlighting some points of interest  
  geom_point(data=df2[3, ], colour="magenta4", size=2.5) +
  geom_point(data=df2[30, ], colour="red", size=2.5) +
  geom_point(data=df2[35, ], colour="red", size=2.5) +
  geom_point(data=df2[28, ], colour="red", size=2.5) +
  geom_point(data=df2[29, ], colour="green4", size=2.5) +
  geom_point(data=df2[5, ], colour="green4", size=2.5) +
  geom_point(data=df2[44, ], colour="blue", size=2.5) +
  geom_point(data=df2[50, ], colour="blue", size=2.5) +
# Finishing touches to the plot
  labs(title = "Types of Johnny Depp Movies") +
  xlab('Metacritic Score') +
  ylab('Domestic Box Office (Millions)') +
  scale_color_manual(values = c('magenta4','blue', 'red', 'green4')) +
  ylim(0, 600) +
  xlim(0, 100) +
  theme_classic() +
  theme(legend.position="none")  +
  theme(plot.title = element_text(face = 'bold', size = 20, hjust=0.5), 
        axis.title.x = element_text(face = 'bold', size = 15),
        axis.title.y = element_text(face = 'bold', size = 15))

这就结束了收集数据、实现聚类算法和可视化发现的过程。我希望你们都喜欢这篇关于约翰尼·德普从影记录的文章,同时了解高斯混合模型是如何被用来做出一些有趣的发现的。

票房收入通过票房 Mojo 换算成 2019 美元。

烂番茄平均评论家评分被用来替代 Metacritic 上没有列出的一些电影。

z 分数缩放用于票房收入和电影分数数据,以构建 K 均值聚类的数据。

每个数据科学家都必须知道的 5 个分类评估指标

原文:https://towardsdatascience.com/the-5-classification-evaluation-metrics-you-must-know-aa97784ff226?source=collection_archive---------0-----------------------

Photo by K. Mitch Hodge on Unsplash

以及具体什么时候使用它们?

我们要优化什么?大多数商家都没有回答这个简单的问题。

每一个业务问题都有一点不同,要有不同的优化。

我们都创建了分类模型。很多时候,我们试图提高评估模型的准确性。 但是,我们真的想要准确性作为模型性能的度量标准吗?

如果我们在预测将要撞击地球的小行星数量会怎么样。

一直说零就行了。你会有 99%的准确率。我的模型可能相当准确,但一点价值都没有。在这种情况下我们应该怎么做?

设计数据科学项目比建模本身重要得多。

这篇文章是关于各种评估指标以及如何和何时使用它们。

1.准确度、精确度和召回率:

A.准确(性)

准确性是最重要的分类标准。这很容易理解。并且容易适用于二元以及多类分类问题。

Accuracy = (TP+TN)/(TP+FP+FN+TN)

准确性是真实结果在检查的案例总数中所占的比例。

什么时候使用?

准确度是对分类问题进行评估的有效选择,这些问题是平衡的,没有偏斜或没有类别不平衡。

告诫

假设我们的目标类非常稀疏。我们需要准确性作为模型性能的度量吗? 如果我们在预测小行星会不会撞上地球呢? 一直只说No。你会有 99%的准确率。我的模型可能相当准确,但一点价值都没有。

B.精确

先说精度,它回答了下面这个问题:预测阳性真正阳性的比例是多少?

Precision = (TP)/(TP+FP)

在小行星预测问题中,我们从来没有预测到一个真正的肯定。

因此精度=0

什么时候使用?

当我们想要非常确定我们的预测时,精度是评估度量的有效选择。例如:如果我们正在构建一个系统来预测我们是否应该降低特定帐户的信用限额,我们希望对我们的预测非常确定,否则它可能会导致客户不满。

注意事项

非常精确意味着我们的模型会让许多信用违约者毫发无损,从而蒙受损失。

C.回忆

另一个非常有用的方法是召回,它回答了一个不同的问题:有多少比例的实际阳性被正确分类?

Recall = (TP)/(TP+FN)

在小行星预测问题中,我们从来没有预测到一个真正的肯定。

因此召回也等于 0。

什么时候使用?

当我们想要捕捉尽可能多的正面信息时,召回是评估指标的有效选择。例如:如果我们正在建立一个系统来预测一个人是否患有癌症,即使我们不是很确定,我们也希望捕捉到疾病。

注意事项

如果我们对所有的例子都预测 1,那么召回就是 1。

由此产生了利用精确度与召回率的折衷的想法— F1 分数

2.F1 分数:

这是我最喜欢的 评估指标 ,我倾向于在我的分类项目中大量使用它。

F1 分数是一个介于 0 和 1 之间的数字,是精确度和召回率的调和平均值。

让我们从一个二元预测问题开始。我们正在预测一颗小行星是否会撞击地球。

所以如果我们对整个训练集说“不”。我们这里的精度是 0。我们正课的回忆是什么?它是零。准确度如何?是 99%以上。

因此 F1 分数也是 0。因此我们知道,准确率为 99%的分类器对我们的情况来说基本上是没有价值的。因此它解决了我们的问题。

什么时候使用?

我们希望有一个同时具有良好精度和召回率的模型。

Precision-Recall Tradeoff

简单来说, F1 分数在分类器 的精确度和召回率之间保持了平衡。如果你的准确率低,F1 就低,如果召回率又低,你的 F1 分数就低。

如果你是一名警督,你想抓罪犯,你想确定你抓的人是罪犯(精确),你也想尽可能多地抓到罪犯(回忆)。F1 分数管理这种权衡。

怎么用?

您可以使用以下公式计算二元预测问题的 F1 分数:

**from** **sklearn.metrics** **import** f1_score
y_true = [0, 1, 1, 0, 1, 1]
y_pred = [0, 0, 1, 0, 0, 1]***f1_score(y_true, y_pred)*** 

这是我的一个函数,我用它来获得最佳阈值,使二元预测的 F1 值最大化。below 函数遍历可能的阈值,以找到给出最佳 F1 分数的阈值。

# y_pred is an array of predictions
def bestThresshold(y_true,y_pred):
    best_thresh = None
    best_score = 0
    for thresh **in** np.arange(0.1, 0.501, 0.01):
        score = f1_score(y_true, np.array(y_pred)>thresh)
        if score > best_score:
            best_thresh = thresh
            best_score = score
    return best_score , best_thresh

警告

F1 分数的主要问题在于它对精确度和召回率给予了同等的重视。我们有时可能需要在我们的评估中包括领域知识,我们希望有更多的回忆或更精确。

为了解决这个问题,我们可以通过创建一个加权 F1 指标来实现,如下所示,其中 beta 管理精确度和召回率之间的权衡。

这里我们给β倍于精度的重要性来回忆。

**from** **sklearn.metrics** **import** fbeta_scorey_true = [0, 1, 1, 0, 1, 1]
y_pred = [0, 0, 1, 0, 0, 1]fbeta_score***(y_true, y_pred,beta=0.5)***

F1 分数也可以用于多类问题。详情见Boaz shmu Eli的这篇精彩博文。

3.对数损失/二元交叉熵

对数损失对于二元分类器来说是一个非常好的评估度量,并且在逻辑回归和神经网络的情况下,它有时也是优化目标。

一个例子的二进制对数损失由下面的公式给出,其中 p 是预测 1 的概率。

As you can see the log loss decreases as we are fairly certain in our prediction of 1 and the true label is 1.

什么时候用?

当分类器的输出是预测概率时。 Log Loss 根据其与实际标签的差异程度,将您预测的不确定性考虑在内。 这让我们对模型的性能有了更细致的了解。一般来说,最小化日志损失为分类器提供了更高的准确性。

怎么用?

**from** **sklearn.metrics** **import** log_loss # where y_pred are probabilities and y_true are binary class labels
log_loss(y_true, y_pred, eps=1e-15)

警告

不平衡数据集的情况下易受影响。您可能需要引入类权重来更多地惩罚少数错误,或者您可以在平衡数据集后使用它。

4.范畴交叉熵

日志丢失也适用于多类问题。多类设置中的分类器必须为所有示例的每个类分配一个概率。如果有 N 个样本属于 M 个类别,那么分类交叉熵是- ylogp值的总和:

如果样本i属于类别jy_ij为 1,否则为 0

p_ij是我们的分类器预测样本i属于类别j的概率。

什么时候用?

当一个分类器的输出是多类预测概率时。在神经网络的情况下,我们通常使用分类交叉熵。一般来说,最小化分类交叉熵为分类器提供了更高的准确性。

怎么用?

**from** **sklearn.metrics** **import** log_loss # Where y_pred is a matrix of probabilities with shape ***= (n_samples, n_classes)*** and y_true is an array of class labelslog_loss(y_true, y_pred, eps=1e-15)

警告:

不平衡数据集的情况下易受影响。

5.罗马纪元

AUC 是 ROC 曲线下的面积。

AUC ROC 表示阳性类别的概率与阴性类别的概率的分离程度

什么是 ROC 曲线?

我们已经从分类器中得到概率。我们可以使用不同的阈值来绘制曲线上的灵敏度(TPR)和(1-特异性)(FPR ),我们将得到一条 ROC 曲线。

其中真正的肯定率或 TPR 只是我们使用我们的算法捕获的真实的比例。

Sensitivty = TPR(True Positive Rate)= Recall = TP/(TP+FN)

假阳性率或 FPR 就是我们用算法捕捉到的假阳性的比例。

1- Specificity = FPR(False Positive Rate)= FP/(TN+FP)

ROC Curve

这里我们可以使用 ROC 曲线来决定阈值。
阈值的选择也将取决于分类器的用途。

如果这是一个癌症分类应用程序,你不希望你的阈值大到 0.5。即使一个病人患癌症的概率是 0.3,你也会把他归类为 1。

否则,在降低信用卡限额的应用程序中,您不希望您的阈值低至 0.5。您在这里有点担心降低限制对客户满意度的负面影响。

什么时候用?

AUC 是比例不变的。它衡量预测的排名,而不是它们的绝对值。因此,举例来说,如果你作为一个营销人员想要找到一个用户列表,他们将响应营销活动。AUC 是一个很好的指标,因为按概率排列的预测是您创建用户列表以发送营销活动的顺序。

使用 AUC 的另一个好处是它像对数损失一样分类阈值不变。它测量模型预测的质量,而不考虑选择什么分类阈值,不像 F1 分数或准确性取决于阈值的选择。

怎么用?

import numpy as np
from sklearn.metrics import roc_auc_score
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])***print(roc_auc_score(y_true, y_scores))***

警告

有时,我们需要从模型中得到精确校准的概率输出,而 AUC 对此没有帮助。

结论

创建我们的机器学习管道的一个重要步骤是相互评估我们不同的模型。评估指标的错误选择可能会对您的整个系统造成严重破坏。

因此,要时刻注意你的预测,以及评估指标的选择会如何影响/改变你的最终预测。

此外,评估指标的选择应该与业务目标保持一致,因此有点主观。您也可以提出自己的评估标准。

继续学习

如果你想了解更多关于如何构建机器学习项目和最佳实践,我想调出他在 Coursera 深度学习专业化中的第三门课程,名为构建机器学习项目。一定要去看看。它谈到了陷阱和许多改进模型的基本想法。

谢谢你的阅读。将来我也会写更多初学者友好的帖子。在 关注我或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系到我

此外,一个小小的免责声明——在这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意。

每个数据科学家都应该知道的 5 种特征选择算法

原文:https://towardsdatascience.com/the-5-feature-selection-algorithms-every-data-scientist-need-to-know-3a6b566efd2?source=collection_archive---------0-----------------------

Source: Pixabay

DS 算法

额外收获:是什么让一个优秀的足球运动员变得伟大?

数据科学是对算法的研究。

我每天都在努力学习许多算法,所以我想列出一些最常见和最常用的算法,这些算法将在这个新的 DS 算法系列中使用。

当你创建了大量的特性,然后你需要想办法减少特性的数量,这种情况已经发生了多少次了。

我们有时最终会使用相关性或基于树的方法来找出重要的特征。

我们能给它增加一些结构吗?

这篇文章是关于在处理数据时可以使用的一些最常见的特征选择技术。

为什么选择功能?

在我们继续之前,我们需要回答这个问题。为什么不把所有的特征都交给 ML 算法,让它来决定哪个特征重要?

所以我们有三个理由不这么做:

1.维数灾难——过度拟合

Source

如果数据中的列数多于行数,我们将能够完美地拟合我们的训练数据,但这不会推广到新的样本。因此我们什么也没学到。

2.奥卡姆剃刀:

我们希望我们的 模型是简单的 和可解释的。当我们有很多特征时,我们就失去了可解释性。

3.垃圾输入垃圾输出:

大多数时候,我们会有许多非信息性的特征。例如,名称或 ID 变量。 低质量的输入会产生低质量的输出。

此外,大量的特征使得模型庞大、耗时,并且在生产中更难实现。

那我们该怎么办?

我们只选择有用的特征。

幸运的是,Scikit-learn 让我们选择特性变得非常容易。我们可以有很多方式来考虑特征选择,但是大多数特征选择方法可以分为三大类

  • 基于过滤: 我们指定一些度量并基于这些过滤特征。这种度量的一个例子可以是相关/卡方。
  • 基于包装器: 包装器方法将一组特征的选择视为一个搜索问题。示例:递归特征消除
  • 嵌入式: 嵌入式方法使用具有内置特征选择方法的算法。例如,套索和射频有自己的特征选择方法。

理论讲得够多了,让我们从五种特征选择方法开始。

我们将尝试使用数据集来更好地理解它。

我将使用一个足球运动员数据集来找出 是什么让一个好球员变得伟大?

不懂足球术语也不用担心。我会尽量把它保持在最低限度。

下面是 Kaggle 内核的代码,您可以自己尝试一下。

一些简单的数据预处理

我们已经做了一些基本的预处理,如删除空值和一个热编码。并且使用以下方式将该问题转换成分类问题:

y = traindf['Overall']>=87

在这里,我们用高总体来代表一个伟大的球员。

我们的数据集(X)如下所示,有 223 列。

train Data X

1.皮尔逊相关

这是一种基于过滤器的方法。

我们检查数据集中目标和数字特征之间的皮尔逊相关性的绝对值。我们根据这个标准保留前 n 个特征。

2.卡方检验

这是另一种基于过滤器的方法。

在该方法中,我们计算目标和数值变量之间的卡方度量,并且仅选择具有最大卡方值的变量。

Source

让我们创建一个小例子来说明如何计算样本的卡方统计量。

假设我们的数据集中有 75 个右前锋和 25 个非右前锋。我们观察到 40 个右前锋是好的,35 个不好。这是否意味着球员在右前卫会影响整体表现?

Observed and Expected Counts

我们计算卡方值:

为了做到这一点,我们首先找出如果两个分类变量之间确实存在独立性,我们期望落在每个桶中的值。

这很简单。我们将每个单元格的行和与列和相乘,然后除以总观察值。

so Good and NotRightforward 时段期望值= 25(行总和)*60(列总和)/100(总观察值)

为什么会这样?由于数据中有 25%的非右前锋,我们预计我们在该单元观察到的 60 名优秀球员中有 25%是右前锋。因此 15 个玩家。

然后我们可以使用下面的公式对所有 4 个单元格求和:

我不会在这里展示它,但卡方统计也以手动方式处理非负数字和分类特征。

我们可以从数据集获得卡方特征,如下所示:

3.递归特征消除

这是一个基于包装的方法。如前所述,包装器方法将一组特性的选择视为一个搜索问题。

来自sklearn文档:

递归特征消除(RFE)的目标是通过递归地考虑越来越小的特征集来选择特征。首先,在初始特征集上训练估计器,并且通过*coef_*属性或通过*feature_importances_*属性获得每个特征的重要性。然后,从当前特征集中删除最不重要的特征。该过程在删减集上递归重复,直到最终达到要选择的特征的期望数量。

正如你已经猜到的,我们可以使用任何估计方法。在这种情况下,我们使用LogisticRegression,RFE 观察LogisticRegression对象的*coef_* 属性

4.套索:从模型中选择

Source

这是一种嵌入式方法。如前所述,嵌入式方法使用具有内置特征选择方法的算法。

比如 Lasso 和 RF 都有自己的特征选择方法。套索正则化强制许多要素权重为零。

这里我们用套索来选择变量。

5.基于树:SelectFromModel

这是一种嵌入式方法。如前所述,嵌入式方法使用具有内置特征选择方法的算法。

我们还可以使用 RandomForest 根据特性的重要性来选择特性。

我们使用每个决策树中的节点杂质来计算特征重要性。在随机森林中,最终特征重要性是所有决策树特征重要性的平均值。

我们也可以使用 LightGBM。或者 XGBoost 对象,只要它有一个feature_importances_属性。

奖金

当我们可以拥有一切的时候,为什么要用一个?

答案是,在大量数据和时间紧迫的情况下,有时这是不可能的。

但是只要有可能,为什么不这样做呢?

我们检查是否得到了基于所有方法的特征。在这种情况下,正如我们所看到的,ReactionsLongPassing是一个高评价玩家的优秀属性。不出所料BallcontrolFinishing也占据了榜首。

结论

特征工程和特征选择是任何机器学习管道的关键部分。

我们力求模型的准确性,如果不一次又一次地重温这些作品,就不可能达到良好的准确性。

在本文中,我试图解释一些最常用的特性选择技术,以及我在特性选择方面的工作流程。

我也试图为这些方法提供一些直觉,但是你可能应该尝试更多地了解它,并尝试将这些方法融入到你的工作中。

如果你感兴趣的话,也请阅读我在特征工程上的帖子。

如果你想学习更多的数据科学知识,我想调出吴恩达的这个 精品课程 。这是我开始的原因。一定要去看看。

谢谢你的阅读。将来我也会写更多初学者友好的帖子。在 媒体 关注我,或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。

应用程序应该写的 5 个最重要的日志

原文:https://towardsdatascience.com/the-5-most-important-logs-an-application-should-write-53aea35c740f?source=collection_archive---------14-----------------------

用于推动智能业务的数据类型分类

Photo by rawpixel via Pexels

日志的用处经常被低估。大多数企业仅仅依靠日志来解决操作和可用性问题。

许多人没有意识到的是,主动日志记录也可以改进业务决策。商业智能直接由数据驱动——这为实现更好的业务绩效创造了可能性。

一些组织完全依赖网络防火墙和服务器操作系统日志等基础设施日志,而忽略了应用程序日志的使用。这可能是一个很大的错误,因为应用程序可以访问大量的信息,而这些信息对于应用程序外部的资源是不可用的。应该收集这些信息,因为主要的事件数据源来自应用程序本身。与仅仅依靠基础设施日志记录相比,应用程序日志记录可以为业务提供更好的洞察力。

为什么是应用程序日志?

应用程序日志不仅用于避免操作问题,还通过数据挖掘提供商业智能。对客户行为有深入的了解可以揭示出其他方式难以确定的洞察力。

在一些在线平台中,应用程序事件日志用于执行机器学习等操作,以改善用户搜索结果并提供准确的推荐,为购物网站的产品排名算法提供支持,以及为新闻门户网站显示趋势文章。这些活动最终会提高客户满意度,增加销售额。

应用程序可以访问广泛的信息,这些信息对于应用程序外部的源是不可用的。

以下是你的应用程序应该写入日志的 5 件最重要的事情:

  • 要求
  • 审查跟踪
  • 有效性
  • 威胁
  • 事件

要求

顾名思义,请求日志记录应用程序中的每个请求或服务调用。这包括服务或 API 访问、系统和进程启动、应用程序访问、身份验证和授权。

这些日志通常包含以下信息:日期和时间、请求者身份(如用户 ID 和 IP 地址或推荐 URL)以及实际的请求数据。在 Web 应用程序或 API 的情况下,会记录请求的端点 URL、上下文头和正文。

请求日志揭示了应用程序使用的详细信息,如谁在使用它、何时使用以及应用程序的哪一部分被使用。

审计追踪

审计跟踪记录了对您的数据所做的更改。必须记录对数据的任何更改,包括创建新数据、更新或删除数据,以及在某些情况下导出数据。

对此类记录的需求与安全性、公司政策和合规性有很大关系。审计跟踪是某些行业(如金融行业)的必要要求。

审计跟踪日志通常包括更改数据的用户或系统的身份、日期和时间、更改的数据。如果是一个人进行了更改,那么这个人用来更改数据的系统也会被记录下来。

拥有这些信息有助于调查系统中的数据受损情况,并通过提供撤消损坏数据的方法来支持恢复。

有效性

可用性日志由可能影响系统可用性和稳定性的故障和异常组成。这些问题包括超出容量限制或资源使用量、系统错误或缺陷、连接问题以及响应速度慢。

这些日志中的一部分可以通过基础设施日志记录(如网络或防火墙日志和操作系统事件)在应用程序外部捕获。但是,源自应用程序本身的某些事件(如错误)只能由应用程序记录。

附注:让错误日志足够详细以支持快速故障排除和恢复是很重要的。本质上,错误日志应该揭示重现错误所需的步骤。在许多情况下,日志将包括关于完整堆栈跟踪或程序函数调用的信息,以及错误进程的输入参数。

威胁

威胁日志跟踪可疑活动或破坏应用程序安全性的企图。一些常见的威胁日志包括对受限进程或数据的未授权访问、无效的参数或输入、失败的身份验证、失败的安全验证(如无效的 API 密钥)以及由应用程序的安全机制触发的其他警告。

关于 API 安全性的更多信息——参见我以前的文章 Web API 安全技术

事件

事件是用户可以在应用程序上进行的任何活动。事件活动是收集最少的信息,但可以说是企业拥有的最有价值的数据之一。

由于事件日志的类型因业务而异,因此对于确切记录什么没有固定的定义。记录什么事件完全取决于企业的想象力和需求。

一些例子是搜索查询、产品视图、喜欢和喜爱、共享、下订单或取消订单、查看页面、一个人看图像花了多长时间,以及他们是否滚动到长页面的底部,等等。

即使你今天可能用不到这些数据中的大部分,它们在未来可能会被证明是一座金矿。你永远不知道你现在能收集到什么数据,明天会对你有用。因此,最理想的是以原始形式存储事件——拥有事件活动的最详细信息。一个例子是存储用户位置的实际 GPS 坐标,而不是城市或国家。

你永远不知道今天能收集到什么数据,明天会对你有用。

结论

P 活动日志记录有助于改进业务决策,推动更好的业务绩效。应用程序日志包含广泛的信息,这些信息不仅有助于避免操作问题,还可以提高应用程序的整体安全性,并通过战略数据分析促进商业智能。

正是这种信息导致了著名的“沃尔玛啤酒和尿布的故事的发现。这个故事是否真实还存在争议,但它说明了拥有你的商业活动详细记录的潜在机会。

处理不平衡数据集的 5 种最有用的技术

原文:https://towardsdatascience.com/the-5-most-useful-techniques-to-handle-imbalanced-datasets-6cdba096d55a?source=collection_archive---------8-----------------------

Image by thatsphotography from Pixabay

如果您还没有遇到不平衡的数据集,您将会

您是否遇到过这样的问题:数据集中的正类样本如此之少,以至于模型无法学习?

在这种情况下,你仅仅通过预测多数类就能获得相当高的准确度,但是你无法捕捉到少数类,这通常是首先创建模型的目的。

这种数据集非常常见,被称为不平衡数据集。

不平衡数据集是分类问题的一种特殊情况,其中类之间的分布不均匀。通常,它们由两类组成:多数(消极)类和少数(积极)类

对于不同领域的不同用例,可能会发现不平衡的数据集:

  • 金融:欺诈检测数据集的欺诈率通常约为 1–2%
  • 广告投放:点击预测数据集也没有很高的点击率。
  • 交通 / 航空公司:飞机会发生故障吗?
  • 医学:患者是否有癌症?
  • 内容审核:一个帖子包含 NSFW 内容吗?

那么我们如何解决这样的问题呢?

这篇文章是关于解释你可以用来处理不平衡数据集的各种技术。

1.随机欠采样和过采样

Source

一种被广泛采用并且可能是最直接的处理高度不平衡数据集的方法叫做重采样。它包括从多数类中移除样本(欠采样)和/或从少数类中添加更多样本(过采样)。

让我们首先创建一些不平衡数据的例子。

from sklearn.datasets import make_classificationX, y = make_classification(
    n_classes=2, class_sep=1.5, weights=[0.9, 0.1],
    n_informative=3, n_redundant=1, flip_y=0,
    n_features=20, n_clusters_per_class=1,
    n_samples=100, random_state=10
)X = pd.DataFrame(X)
X['target'] = y

我们现在可以使用以下工具进行随机过采样和欠采样:

num_0 = len(X[X['target']==0])
num_1 = len(X[X['target']==1])
print(num_0,num_1)# random undersampleundersampled_data = pd.concat([ X[X['target']==0].sample(num_1) , X[X['target']==1] ])
print(len(undersampled_data))# random oversampleoversampled_data = pd.concat([ X[X['target']==0] , X[X['target']==1].sample(num_0, replace=True) ])
print(len(oversampled_data))------------------------------------------------------------
OUTPUT:
90 10
20
180

2.使用不平衡学习的欠采样和过采样

不平衡学习(imblearn)是一个 Python 包,用来解决不平衡数据集的问题。

它提供了多种欠采样和过采样方法。

a.使用 Tomek 链接的欠采样:

它提供的一种方法叫做 Tomek 链接。托梅克链是相邻的相反类的成对例子。

在该算法中,我们最终从 Tomek 链接中移除多数元素,这为分类器提供了更好的决策边界。

Source

from imblearn.under_sampling import TomekLinkstl = TomekLinks(return_indices=True, ratio='majority')X_tl, y_tl, id_tl = tl.fit_sample(X, y)

b.使用 SMOTE 进行过采样:

在 SMOTE(合成少数过采样技术)中,我们在已经存在的元素附近合成少数类的元素。

Source

from imblearn.over_sampling import SMOTEsmote = SMOTE(ratio='minority')X_sm, y_sm = smote.fit_sample(X, y)

[imblearn](https://github.com/scikit-learn-contrib/imbalanced-learn#id3)包中有各种各样的其他方法用于欠采样(聚类质心、近似缺失等)。)和过采样(ADASYN 和 bSMOTE),您可以查看一下。

3.模型中的类权重

大多数机器学习模型都提供了一个叫做class_weights的参数。例如,在使用class_weights的随机森林分类器中,我们可以使用字典为少数类指定更高的权重。

from sklearn.linear_model import **LogisticRegression***clf =* **LogisticRegression**(***class_weight={0:1,1:10}***)

但是后台到底发生了什么?

在逻辑回归中,我们使用二元交叉熵计算每个示例的损失:

Loss = −*y*log(*p)* −(1−*y*)log(1−*p*)

在这种特殊的形式下,我们对积极的和消极的两类都给予同等的重视。当我们将 class_weight 设置为class_weight = {0:1,1:20}时,后台的分类器试图最小化:

NewLoss = −20**y*log(*p)* − *1**(1−*y*)log(1−*p*)

那么这里到底发生了什么?

  • 如果我们的模型给出的概率为 0.3,并且我们错误地对一个正例进行了分类,则新损失的值为-20log(0.3) = 10.45
  • 如果我们的模型给出的概率为 0.7,并且我们对一个负面的例子进行了错误分类,那么新的损失值将为-log(0.3) = 0.52

这意味着,在这种情况下,当我们的模型错误地分类了一个积极的少数群体的例子时,我们会惩罚它大约 20 倍以上。

如何计算 class_weights?

没有一种方法可以做到这一点,这应该被构建为针对您的特定问题的超参数搜索问题。

但是如果你想使用 y 变量的分布来获得 class_weights,你可以使用下面这个来自sklearn的实用程序。

**from** sklearn.utils.class_weight **import** compute_class_weightclass_weights = compute_class_weight('balanced', np.unique(y), y)

4.更改您的评估标准

每当我们处理不平衡的数据集时,选择正确的评估指标是非常重要的。一般来说,在这样的情况下,F1 的分数就是我想要的作为我的 评价指标的

F1 分数是一个介于 0 和 1 之间的数字,是精确度和召回率的调和平均值。

那么它有什么帮助呢?

让我们从一个二元预测问题开始。我们正在预测一颗小行星是否会撞击地球。

因此,我们创建了一个模型,对整个训练集预测“否”。

什么是准确度(通常是最常用的评估指标)?

它超过了 99%,所以根据精确度,这个模型相当不错,但是毫无价值。

现在 F1 的成绩是多少?

我们这里的精度是 0。我们正课的回忆是什么?它是零。因此 F1 分数也是 0。

因此,我们知道准确率为 99%的分类器对我们的情况毫无价值。因此它解决了我们的问题。

Precision-Recall Tradeoff

简单来说, F1 分数在某种程度上维持了你的分类器 的精确度和召回率之间的平衡。如果你的准确率低,F1 就低,如果召回率再低,你的 F1 分数就低。

如果你是一名警督,你想抓罪犯,你想确定你抓的人是罪犯(精确),你也想尽可能多地抓到罪犯(回忆)。F1 分数管理这种权衡。

怎么用?

您可以使用以下公式计算二元预测问题的 F1 分数:

**from** **sklearn.metrics** **import** f1_score
y_true = [0, 1, 1, 0, 1, 1]
y_pred = [0, 0, 1, 0, 0, 1]
***f1_score(y_true, y_pred)***

这是我的一个函数,我用它来获得最佳阈值,使二元预测的 F1 值最大化。below 函数遍历可能的阈值,以找到给出最佳 F1 分数的阈值。

# y_pred is an array of predictions
def bestThresshold(y_true,y_pred):
    best_thresh = None
    best_score = 0
    for thresh **in** np.arange(0.1, 0.501, 0.01):
        score = f1_score(y_true, np.array(y_pred)>thresh)
        if score > best_score:
            best_thresh = thresh
            best_score = score
    return best_score , best_thresh

5.多方面的

Try new things and explore new places

根据您的用例以及您试图解决的问题,各种其他方法也可能有效:

a)收集更多数据

如果可以的话,这绝对是你应该尝试的事情。通过更多正面的例子获得更多的数据将有助于您的模型从更多样的角度来看待多数群体和少数群体。

b)将问题视为异常检测

您可能希望将您的分类问题视为异常检测问题。

异常检测是对罕见项目、事件或观察结果的识别,这些项目、事件或观察结果通过与大多数数据的显著不同而引起怀疑

您可以使用隔离林或自动编码器进行异常检测。

c)基于模型

有些模型特别适合不平衡的数据集。

例如,在 boosting 模型中,我们给在每次树迭代中被错误分类的案例更多的权重。

结论

在处理不平衡的数据集时,不存在放之四海而皆准的方法。你必须根据你的问题尝试多种方法。

在这篇文章中,我谈到了每当我面临这样的问题时,我脑海中通常会出现的怀疑。

一个建议是尝试使用以上所有的方法,看看哪个最适合你的用例。

如果你想了解更多关于不平衡数据集及其带来的问题,我想推荐吴恩达的这个 精品课程 。这是我开始的原因。一定要去看看。

谢谢你的阅读。将来我也会写更多初学者友好的帖子。在关注我或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。

此外,一个小小的免责声明——这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意。

每个数据科学家都需要知道的 5 种采样算法

原文:https://towardsdatascience.com/the-5-sampling-algorithms-every-data-scientist-need-to-know-43c7bc11d17c?source=collection_archive---------3-----------------------

DS 算法

或者至少应该听说过

数据科学是对算法的研究。

我每天都在努力学习许多算法,所以我想列出一些最常见和最常用的算法,这些算法将会在这个新的 DS 算法系列中使用。

这篇文章是关于在处理数据时可以使用的一些最常见的采样技术。

简单随机抽样

假设您想要选择一个群体的子集,其中该子集的每个成员被选中的概率相等。

下面我们从数据集中选择 100 个样本点。

sample_df = df.sample(100)

分层抽样

假设我们需要估计选举中每个候选人的平均票数。假设这个国家有 3 个城镇:

A 镇有一百万工厂工人,

B 镇有 200 万工人

C 镇有 300 万退休人员。

我们可以选择在整个人口中随机抽取 60 个样本,但是随机样本有可能在这些城镇中不平衡,因此有偏差,导致估计中的重大误差。

相反,如果我们选择从城镇 A、B 和 C 分别随机抽取 10、20 和 30 个样本,那么对于相同的样本总量,我们可以产生较小的估计误差。

使用 Python 可以很容易地完成这样的事情:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    stratify=y, 
                                                    test_size=0.25)

油藏取样

我喜欢这个问题陈述:

假设您有一个长度未知的大型项目流,我们只能迭代一次。

创建一个算法,从这个流中随机选择一个项目,这样每个项目都有同等的可能性被选中。

我们如何做到这一点?

让我们假设我们必须从一个无限的流中抽取 5 个对象,这样每个元素被选中的概率是相等的。

import randomdef generator(max):
    number = 1
    while number < max:
        number += 1
        yield number# Create as stream generator
stream = generator(10000)# Doing Reservoir Sampling from the stream
k=5
reservoir = []
for i, element in enumerate(stream):
    if i+1<= k:
        reservoir.append(element)
    else:
        probability = k/(i+1)
        if random.random() < probability:
            # Select item in stream and remove one of the k items already selected
             reservoir[random.choice(range(0,k))] = elementprint(reservoir)
------------------------------------
[1369, 4108, 9986, 828, 5589]

可以从数学上证明,在样本中,每个元素从流中被选择的概率是相同的。

怎么会?

当涉及到数学时,想一个更小的问题总是有帮助的。

因此,让我们考虑一个只有 3 项的流,我们必须保留其中的 2 项。

我们看到第一项,我们把它放在列表中,因为我们的容器有空间。我们看到第二个项目,我们把它放在列表中,因为我们的容器有空间。

我们看到第三项。这就是事情变得有趣的地方。我们以 2/3 的概率选择列表中的第三个项目。

现在让我们看看第一项被选中的概率:

移除第一项的概率是元素 3 被选择的概率乘以元素 1 被从库中的 2 个元素中随机选择作为替换候选的概率。这个概率是:

2/3*1/2 = 1/3

因此 1 被选中的概率是:

1–1/3 = 2/3

对于第二个元素,我们可以有完全相同的论点,我们可以扩展到许多元素。

因此每个项目都有相同的概率被选中:2/3或者一般来说k/n

随机欠采样和过采样

Source

我们经常会遇到不平衡的数据集。

一种广泛采用的处理高度不平衡数据集的技术被称为重采样。它包括从多数类中移除样本(欠采样)和/或从少数类中添加更多样本(过采样)。

让我们首先创建一些不平衡数据的例子。

from sklearn.datasets import make_classificationX, y = make_classification(
    n_classes=2, class_sep=1.5, weights=[0.9, 0.1],
    n_informative=3, n_redundant=1, flip_y=0,
    n_features=20, n_clusters_per_class=1,
    n_samples=100, random_state=10
)X = pd.DataFrame(X)
X['target'] = y

我们现在可以使用以下工具进行随机过采样和欠采样:

num_0 = len(X[X['target']==0])
num_1 = len(X[X['target']==1])
print(num_0,num_1)# random undersampleundersampled_data = pd.concat([ X[X['target']==0].sample(num_1) , X[X['target']==1] ])
print(len(undersampled_data))# random oversampleoversampled_data = pd.concat([ X[X['target']==0] , X[X['target']==1].sample(num_0, replace=True) ])
print(len(oversampled_data))------------------------------------------------------------
OUTPUT:
90 10
20
180

使用不平衡学习的欠采样和过采样

不平衡学习(imblearn)是一个 Python 包,用来解决不平衡数据集的问题。

它提供了多种欠采样和过采样方法。

a.使用 Tomek 链接的欠采样:

它提供的一种方法叫做 Tomek 链接。托梅克链是相邻的相反类的成对例子。

在该算法中,我们最终从 Tomek 链接中移除多数元素,这为分类器提供了更好的决策边界。

Source

from imblearn.under_sampling import TomekLinks

tl = TomekLinks(return_indices=True, ratio='majority')
X_tl, y_tl, id_tl = tl.fit_sample(X, y)

b.使用 SMOTE 进行过采样:

在 SMOTE(合成少数过采样技术)中,我们在已经存在的元素附近合成少数类的元素。

Source

from imblearn.over_sampling import SMOTE

smote = SMOTE(ratio='minority')
X_sm, y_sm = smote.fit_sample(X, y)

imblearn 包中有各种各样的其他方法用于欠采样(聚类质心、近似缺失等)。)和过采样(ADASYN 和 bSMOTE),您可以查看一下。

结论

算法是数据科学的命脉。

采样是数据科学中的一个重要话题,我们实际上并没有尽可能多地谈论它。

一个好的抽样策略有时可以推动整个项目向前发展。糟糕的采样策略可能会给我们错误的结果。因此,在选择采样策略时应该小心谨慎。

所以,无论是在工作场所还是在酒吧,都要进行抽样调查。

如果你想了解更多关于数据科学的知识,我想调出吴恩达的这个 精品课程 。这是我开始的原因。一定要去看看。

谢谢你的阅读。将来我也会写更多初学者友好的帖子。在 跟踪我或订阅我的 博客 了解他们。和往常一样,我欢迎反馈和建设性的批评,可以在推特@ mlwish it上找到。

优化机器学习性能所需的 6 个指标

原文:https://towardsdatascience.com/the-6-metrics-you-need-to-optimize-for-performance-in-machine-learning-d27761035bc3?source=collection_archive---------39-----------------------

有许多衡量模型性能的指标,这取决于你想要进行的机器学习的类型。在本文中,我们来看看分类和回归模型的性能度量,并讨论哪一个更好地优化。有时,要查看的指标会根据最初解决的问题而有所不同。

机器学习中的度量示例

分类问题的优化

分类图表示例

1.真阳性(回忆)

真实肯定率也称为召回率,是二进制/非二进制分类问题中的最佳性能指标。大多数情况下,我们只对正确预测一个类感兴趣。例如,如果你预测糖尿病,你会更关心预测这个人是否有糖尿病,而不是预测这个人没有糖尿病。在这种情况下,正类是“此人患有糖尿病”,负类是“此人没有糖尿病”。这仅仅是预测正类的准确性()这不是准确性性能度量。更多详情见下面的数字 4)

2.ROC 曲线(受试者工作特性曲线)

ROC 曲线显示了您的分类模型在不同阈值(分类到某个类别的概率)下的性能。它绘制了真阳性率和假阳性率的对比图。降低阈值会增加你的真阳性率,但会牺牲你的假阳性率,反之亦然。

3.曲线下面积

AUC 也称为“ROC 曲线下面积”。简单地说,AUC 会告诉你正确分类的概率。更高的 AUC 代表更好的模型。

4.准确(性)

默认情况下,准确性是首先要考虑的。然而一个真正的数据科学家知道准确性太容易误导人。更好的说法是预测所有类别的平均准确度。就像我提到的真阳性率,这是最理想的优化指标。准确度取真阳性和真阴性之和的平均值。大多数情况下,在不平衡的分类问题中,负类比正类更具代表性,所以你更有可能拥有非常高的真负率。准确性将偏向于可能没有人感兴趣的负类的准确预测。

机器学习中的回归优化

回归图示例

5.错误

误差通常被忽略在 R 旁边,它告诉我们更多关于回归直线拟合值的精度(即拟合值和最佳拟合直线之间的平均距离)。这在计算模型的置信度和预测区间时更为重要。由于使用了响应变量的自然单位,它更容易解释,而 R 没有单位,仅在 0 和 1 之间。

有不同类型的误差,如“平均绝对误差”和“均方根误差”每一种都有自己的优点和缺点,必须独立对待来评估一个模型。

6.R2

虽然标准误差很重要,但是 R 已经成为一个好的回归模型的事实上的度量。它告诉我们因变量和自变量之间的变化在多大程度上被模型所解释。较高的 R 给出了更好的模型,但是,如果接近 99%的过高 R 有时会导致过度拟合的风险。由于相关性和因果性的争论,r 可能会产生误导,从而给出不合逻辑的高 r。

用户的目标会影响模型的性能,所以要谨慎选择

在分类问题中,精确度并不总是最好的度量,R 也不一定是回归的最佳度量。它们都是最容易理解的,尤其是非技术的涉众(这可能是首先构建模型的最大原因)。最好的方法可能是考虑各种性能指标,并考虑您的初始目标。一个模型的性能总是受制于用户的目标。从一个人的角度来看,糟糕的表现可能不适合另一个人。

原载于 2019 年 11 月 5 日【https://blog.exxactcorp.com】

机器学习的 7 步程序

原文:https://towardsdatascience.com/the-7-step-procedure-of-machine-learning-c15c922e7300?source=collection_archive---------13-----------------------

对于数据收集、机器学习(ML)模型开发、模型评估和模型部署,需要一个系统化的程序。图 1 示出了开发和部署数据驱动的机器学习模型的 7 步程序。

Fig. 1 7-steps ML Procedure | Credit: Alaa Khamis

这些步骤将在下面的小节中解释。

步骤 1:问题描述

创建成功的 ML 模型的第一步是理解手头的问题,描述它的特征,并从领域专家那里获得所有需要的知识,以帮助收集相关的数据和理解目标需求。需要理解问题的重要性及其具有挑战性的方面。不同的相关自变量和因变量需要由领域专家清楚地识别。自变量包括信号、控制因子和噪声因子,而因变量代表模型响应。信号是实现模型功能所需的刺激。例如,如图 2 的参数或 P 图所示,在基于视觉的分心驾驶员检测模型中,信号主要是由汽车中预先校准的摄像机拍摄的驾驶员照片。控制因素是可以在数据收集过程中和部署模型之后控制的设计参数。受控因素可以包括相机分辨率、摇摄、变焦、聚焦、采样率、颜色模式等。

Fig. 2 Visual Feature-based Distracted Driver Detection Model | Credit: Alaa Khamis

噪声因素影响设计,但仅在数据收集过程中可控,在部署模型后不可控。噪声因素可以包括但不限于比例变化、闪电条件(照明、阴影和反射)、道路条件、天气条件等。响应是模型的主要预期功能输出。在这个例子中,输出是驾驶员正在做的事情的可能性(安全驾驶、发短信—右、打电话—右、发短信—左、打电话—左、操作收音机、喝酒、伸手、头发和化妆或与乘客交谈)。最后,错误状态表示最终用户在使用预测模型时定义的故障模式或故障影响。在这种情况下,错误状态可能是假警报或假阴性。

步骤 2:数据收集

ML 模型开发周期的第二步是收集相关和全面的数据。没有给出所需数据量的神奇公式。这个量取决于许多因素,例如问题的复杂性和学习算法的复杂性,并且直接影响算法的可学习性和性能。应该结合不同的相关信号、控制因素和噪声因素。根据数据分析的类型,可以收集批量、近实时或实时数据。为了提高模型的稳健性,还强烈建议将敌对数据作为噪声因子。由于没有人有无限的资源和无限的时间来收集全面的数据,因此应该收集最相关的代表性数据。

第 3 步:数据准备—整理您的数据

数据准备是为模型开发准备数据的关键过程。该准备包括但不限于数据清理、标记数据、处理缺失数据、处理不一致数据、标准化、分段、数据平坦化、数据不平衡等。如果所选的 ML 方法不支持从数据进行表示学习,如在端到端学习方法的情况下,手工制作的区别特征也可以在该步骤中生成。特征提取是数据科学的黑色艺术。提取不同类别之间的区别特征或尽管同一类别的原始数据存在一些差异但保持不变的特征仍然是 ML 中未解决的问题。特征向量可以存储为 SQL/NOSQL 数据库,或者存储为本地或云服务器上的电子表格,以进一步用于模型训练、验证和测试。数据收集和准备是一个耗时的过程,约占基于 ML 的问题求解时间的 80%。

步骤 4:数据探索——更好地了解你的敌人

应进行单变量和多变量分析,以了解数据的可分性、线性和单调性。这些见解有助于选择正确的最大似然算法,因为根据机器学习中没有免费的午餐定理,不存在普遍优越的最大似然算法。统计机器学习算法在不同的下划线假设下工作,如数据是可分离的,或者数据具有特定的分布,或者数据是平衡的,或者数据之间没有空间和/或时间依赖性,等等。

第五步:建模——折磨你的数据,直到它承认

在建模步骤中,选择、训练、验证和测试 ML 模型。建立一个好模型的通常方法是尝试不同的算法并比较它们的性能。例如,理想的分类器能够很好地拟合历史数据(低偏差),同时能够很好地推广到看不见的例子(低方差)。偏差-方差权衡分析有助于建立成功的 ML 模型。正如吴恩达在第三十届神经信息处理系统年会(NIPS 2016)上的讲话中所建议的,在建模期间应该分析四种类型的错误,即训练集错误、测试集错误、验证集错误和训练集错误。均方根误差(RMSE)可以说是用来评估预测模型性能的最重要的标准之一。RMSE 包括模型的可变性(精度)和它的偏差(准确性)。这两个分量可以与模型的精度(小方差)和准确度(小偏差)相关联。计算训练和测试期间的 RMSE,以便找出欠拟合或过拟合的发生。

第六步:评估——评估供词

应使用不同的定量和/或定性评估指标来证明训练模型的有效性。从广义上讲,评估指标可以分为与问题无关的指标和特定于问题的指标。前者的例子包括模型的实时性能、模型的内存占用、准确性、假阳性率、假阴性率、对数损失等。特定于问题的度量反映了解决问题的模型的质量。例如,在预测性维护系统中,常用的评估指标是故障时间(TTF)预测、剩余使用寿命(RUL)估计、设备的随机故障次数、设备的风险评分和磨损率。模型评估提供了量化的反馈来优化模型参数。可以手动优化参数,或者使用网格/随机搜索的自动调整,或者使用进化算法或强化学习算法,如 Google 最近提出的 autoML。

步骤 7:模型部署

一旦开发并优化了模型,就可以将其部署到系统/流程中。可以使用不同的方法来部署模型,例如针对 H2O 模型的 pickle 可序列化对象、本地语言、POJO(普通旧 Java 对象)或 MOJO(模型对象,优化)或使用 PMML(预测模型标记语言)。项目所有者应该参与评估模型的性能。部署模型的性能应该与基线或目标值进行比较,而不是与完美性进行比较。

8 分钟指南,告诉你的企业如何用人工智能和机器学习解决问题

原文:https://towardsdatascience.com/the-8-minute-guide-to-how-your-business-can-solve-problems-with-ai-and-machine-learning-b7e66f4b484e?source=collection_archive---------20-----------------------

Photo by the author, National Electronics Museum

机器学习和人工智能增强产品的广告无处不在——如果你在过去两年里参加过商业会议或与技术供应商交谈,你几乎肯定听说过它。到处都有这样的承诺:机器学习和人工智能将简化你的业务,为你公司的现有数据提供有价值的见解,并改善运营。这些承诺在细节上显得有些单薄——它到底能做什么?

我也问过同样的问题。我现在在这里简要介绍机器学习和人工智能可以做什么。我们不会在数学或编程技术上陷入困境,我们的目标是帮助您了解可以做些什么,以便您可以了解如何将其应用到您的业务中。让我们开始吧。

首先,一点术语。机器学习深度学习是不同的问题解决方法,属于“人工智能(AI) ”的大旗下。这些的使用方式并不特别一致,尤其是在营销文献中。就本文的目的而言,商业人士的关键要点是,深度学习允许解决不同类型的问题,而不是传统的机器学习算法,但通常实施起来更昂贵和耗时。它也在更积极的开发中,并处于可能的前沿,但你可以用传统的方法以更低的成本做很多事情。

  1. 如果你知道某样东西的类别,机器学习可以将这些东西分类。

这就叫分类。你可以根据访问者的点击模式将他们分类,从而了解他们可能会购买什么或对什么感兴趣。给定一个人的一些数据,机器学习算法可以将他们分类为可能生病或没有生病。网络流量可以分为恶意流量和非恶意流量。电子邮件可以分类为垃圾邮件,也可以不分类为垃圾邮件。基于振动、电流消耗或其他测量,可以识别可能很快发生故障的机器,并在故障之前执行维护。

要做到这一点,需要一堆已经分类的例子,很可能是由人类专家分类的。这是困难且可能昂贵的部分,这意味着现在应该考虑收集数据以供将来在类似这样的问题上使用,即使现在还不清楚以后如何使用它。如果你没有健康和不健康机器的例子,你就不能训练一个算法来识别一台故障机器,而且你可能直到一台机器发生故障后才知道。

从一组仔细标记的例子中学习的算法被广泛归类为监督学习算法。

2。如果你有一堆关于价值的例子,比如某样东西的价格,机器学习算法可以学习预测类似东西的价值。

一个很好的例子是 Zillow 对你今天要卖掉的房子的估价。给定房间数量、平方英尺、位置、浴室数量和其他变量,该算法根据类似房屋的售价进行预测。这叫做回归问题。

回归问题可能对企业有用的方式有很多。给定一年中的某一天和过去几天的负载,我们今天可能会在服务器上看到什么负载?我们可能卖出多少防晒霜?给定经验和一系列技能,一个人的合理工资是多少?回归也可以用来做财务预测。

与分类一样,回归是一种受监督的学习技术,依赖于算法可以从中学习的一组重要的标记示例。我认为回归是一个“目测”值——一个人可以合理地尝试一下,并且非常接近。机器学习回归的力量在于规模——一个人很容易做出几十个这样的估计,但机器每天可以做出数万个这样的预测。它可以在几分钟到几小时内,而不是几年内,根据新的数据样本进行训练。

3。机器学习可以帮助你在数据中找到你不知道的潜在模式。

监督学习功能强大,但它有一个主要限制——你必须清楚自己在寻找什么,并能够生成一系列仔细标记的示例,供算法学习。

算法也可以用来查看数据和识别相似条目的集群。这是一种无监督学习,因为它不使用标记的例子。经典的例子是通过人口统计和消费模式来识别不同类别的访问者。

4。深度学习可以通过试错学会做事。

一种被称为强化学习的方法可以被用来让计算机通过尝试不同的方法并看看什么有效来找出如何完成特定的任务。一个主管程序根据每项表现的好坏给它打分,学习算法不断改进,直到达到目标。当即使是人类专家也不确定什么是理想的方法,或者很难编纂规则时,这种方法是有用的。这种方法已经被用于让多足机器人知道如何有效地行走和玩视频游戏。比如我写了一个程序让一台电脑学习如何登陆月球

5。深度学习可以在图片中找到东西,并以极佳的准确度进行识别。它还可以生成场景的文本描述。

深度学习对图像识别产生了巨大的影响。在过去的几年里,训练一台计算机在图像中寻找并标记物体已经变得相当容易。给定一大组标记的示例图像,训练算法,这需要大量的计算能力。结果存储为模型,可以在低功耗的计算机上运行。这些模型可供下载或作为软件服务提供——除非您的图像包含一些专门的东西,否则您不需要训练自己的模型。这些模型一旦经过训练,就可以在非常普通的计算设备上运行——它们甚至可以直接嵌入到相机中。

一旦在视频流中识别出对象,就可以跟踪该对象的运动。这使得计算机能够计算通过一扇门的人数,跟踪停车场的汽车,或者完成其他类似的任务。模型可用于隔离和读取图像中的牌照。

深度学习模型也已经被训练成在没有人类输入的情况下生成图片中整体场景的描述。模型也正在开发中,以帮助放射科医生阅读医学图像,并越来越擅长做像在 CT 或 MRI 扫描中发现肿瘤这样的任务。

6。深度学习可以生成新的图像或视频。

深度学习模型可以被训练来拍摄图像或视频,并输出输入的修改版本。例子包括黑白图像或视频帧的自动着色和艺术生成。在基于示例视频生成假视频流方面也取得了很大进展。所谓的“深度伪造”视频可以生成令人惊讶的令人信服的视频,显示一位政治家或名人发表了他们从未发表过的演讲。该技术还可以生成修改后的视频,其中不同的人的脸覆盖在视频中原始场景的男演员或女演员上。

深度学习算法也正在接受训练,以检测视频或照片何时以这种方式生成,作为对该技术潜在敌意使用的对策。

7。机器学习可以从书面文本中提取有用的信息。

执行文本分析(也称为)的机器学习模型可以被输入文本块,并确定情绪主要是积极还是消极。它可以用于监控社交媒体或其他关于您的品牌、产品和服务的评论,或者分析其他文本数据以获得有用的商业情报。

像其他机器学习应用一样,用机器做这件事的重要优势是规模、速度和成本。检查大量的文本数据并提取有用的信息变得可能,这比人工团队要快得多。

8。深度学习可以生成相当不错的书面文本。

OpenAI 团队最近发布了深度学习文本生成模型 GPT2 。给定几个句子,这个模型和其他类似的模型可以生成相当连贯的文本段落,看起来像是人类写的。GPT2 可以在线使用来感受一下它能做什么。从新闻网站粘贴一篇文章的前几行会自动返回一段看起来很像有效新闻文章的文本。事实并不可靠正确,但它是以一种相当可信的方式写的。OpenAI 团队推迟了 GPT2 的发布,因为内部担心它可能被用来自动生成误导性的新闻文章。

在不久的将来,像 GPT2 这样的模型很有可能被用于生成小说或其他书籍的草稿,甚至可能模拟知名作者的风格。目前还不清楚这些作品的版权状况如何。

需要记住的要点

当你考虑机器学习和深度学习可以在你的业务中使用的潜在方式时,记住几点是有用的。

首先,这些技术现在对于非数据科学家的人来说很容易获得。你不需要一大群专业软件工程师来使用它们或者从头开始编写它们——你可以相对容易地使用 软件 供应商。如果你确实想在内部运行它或者做定制工作,有很好的可以帮你完成繁重的工作。

相反,应该努力确保数据的质量,并确定应用可用技术的最佳方式。想一想,在哪些地方做对人类来说很简单的任务,但以一种更快、范围更大的方式做,可能会给你的企业带来好处。

最后,考虑这些技术的目标不一定是取代劳动力中的人类。它可以用来减少繁重的工作,提高准确性和速度,并使他们能够从事更有创造性的工作。未来最成功的组织可能是那些最能适应机器的新能力,并将它们与企业中人类独有的部分相融合的组织。

80/20 挑战:从经典到创新的数据科学项目

原文:https://towardsdatascience.com/the-80-20-challenge-7b8bfb643947?source=collection_archive---------24-----------------------

有时当你和数据科学家交谈时,你会有这种感觉,好像你在和一个古老宗教的牧师交谈。晦涩的公式,复杂的算法,对初学者的俚语,最重要的是,需要一些新的脚本。如果你对所有的项目都有这种感觉,你可能和错误的数据科学家交谈。

经典数据科学项目

相对较大数量(我认为大约 80%)的数据科学项目实际上非常标准,一步一步地紧密遵循 CRISP-DM 过程。这些就是我所说的经典项目。

流失预测

训练机器学习模型来预测客户流失是数据分析中最古老的任务之一。它已经在许多不同类型的数据上实现了很多次,而且它是相对简单的

我们首先读取数据(一如既往),然后是一些数据转换操作,由图 1 中的黄色节点处理。在提取用于训练的数据子集后,我们然后训练一个机器学习模型,以将流失概率与每个客户描述相关联。在图 1 中,我们使用了决策树,但是当然,它可以是能够处理分类问题的任何机器学习模型。然后,在不同的数据子集上测试该模型,如果准确性指标令人满意,则将其存储在文件中。然后,将相同的模型应用于部署工作流中的生产数据(图 2)。

图 1:训练和评估决策树以预测客户流失概率

图 2:将之前训练好的决策树部署到生产性客户数据中

需求预测

需求预测是另一项经典任务,这次涉及时间序列分析技术。无论我们谈论的是客户、出租车还是千瓦,预测某个时间点的需求量是一项经常需要完成的任务。对此有许多经典的标准解决方案。

在需求预测问题的解决方案中,在读取和预处理数据之后,为每个数据样本创建过去 N 个值的向量。使用过去的 N 个值作为输入向量,训练机器学习模型以从过去的 N 个数值预测当前数值。在测试集上计算机器学习模型在数值预测上的误差,如果可接受,则将模型保存在文件中。

这种解决方案的一个例子如图 3 所示。这里,回归树的随机森林在出租车需求预测问题上被训练。它遵循的步骤与用于培训客户流失预测模型的工作流程非常相似(图 1)。唯一的区别是过去样本的向量、数值预测和在 Spark 平台上的完全执行。在部署工作流中,模型被读取并应用于纽约市过去 N 小时内使用的出租车数量,以预测特定时间所需的出租车数量(图 4)。

图 3:训练和评估回归树的随机森林,以根据时间序列中过去的 N 个数字来预测当前需要的出租车数量

图 4:将先前训练的随机回归树森林应用于过去 N 小时的出租车数量向量,以预测下一小时需要的出租车数量

大多数经典的数据科学项目都遵循类似的过程,要么使用监督算法解决分类问题,要么使用时间序列分析技术解决数值预测问题。根据应用领域的不同,这些经典项目占据了数据科学家工作的很大一部分。

经典数据科学项目的自动化模型训练

现在,如果我工作的项目中有很大一部分是如此经典和标准,我真的需要从头开始重新实现它们吗?我不应该。只要有可能,我应该依靠可用的示例,或者更好的是,蓝图工作流来启动我的新数据分析项目。例如,工作流中心就是一个很好的来源。

假设我们被分配了一个关于欺诈检测的项目。那么,要做的第一件事就是去工作流中心搜索一个关于“欺诈检测”的例子搜索的前两个结果显示了解决这个问题的两种不同方法。第一种解决方案在覆盖两类的标记数据集上操作:合法交易和欺诈交易。第二种解决方案只在合法交易的数据集上训练一个神经自动编码器,随后在距离度量上应用一个阈值来识别可能的欺诈案例。

根据我们现有的数据,这两个例子中的一个将是最合适的。因此,我们可以下载它,并根据我们特定的数据和业务案例进行定制。这比从头开始一个新的工作流要容易得多。

图 5。搜索“欺诈检测”后,工作流中心的前两个结果

同样,如果这些应用程序如此经典,步骤总是相同的,难道我不能使用一个框架(总是相同的)来自动运行它们吗?这是可能的!对于最简单的数据分析解决方案尤其如此。有很多工具可以用来指导自动化。让我们再次搜索工作流中心。我们发现了一个名为“引导自动化”的工作流,这似乎是一个基于网络的自动化应用程序的蓝图,用于为简单的数据分析问题训练机器学习模型

实际上,这种“引导自动化”的蓝图工作流也包括少量的人工交互。虽然对于简单的标准问题,完全自动化的解决方案可能是可行的,但对于更复杂的问题,需要一些人工交互来引导解决方案朝着正确的方向发展。

图 6。引导式自动化解决方案中的网页序列:1。上传数据集 2。选择目标变量 3。过滤掉无信息列 4。选择要训练的机器学习模型 5。选择执行平台 6。显示精度和速度结果(此处未显示)

更多创新数据科学项目

现在谈谈数据科学家项目的剩余部分——根据我的经验,这大约占我所参与项目的 20%。虽然大多数数据分析项目都有些标准,但也有相对大量的新的、更具创新性的项目。那些通常是特殊的项目,既不是经典的也不是标准的,包括一项新任务的调查,一种新类型数据的探索,或者一种新技术的实现。对于这种项目,你通常需要开放地定义任务,了解最新的技术,并在提出的解决方案中具有创造性。有如此多的新材料,不可能在某个知识库中找到范例或蓝图。真的没有足够的历史来支持他们。

创造性的机器学习

我最近参与的一个项目旨在以某种特定的风格和语言生成自由文本。这个想法是使用机器学习来完成比通常的分类或预测问题更具创造性的任务。在这种情况下,我们的目标是为一个新的户外服装产品系列创造新的名字。传统上,这是一项营销任务,需要召开许多长时间的头脑风暴会议,以提出 10 个,也许 20 个可能的候选人名单。既然我们在谈论户外服装,我们决定这些名字应该让人联想到山。当时,我们不知道任何有针对性的解决方案。最接近的似乎是基于 LSTM 单位的自由文本生成神经网络。

我们收集了世界上所有山的名字。我们使用这些名字来训练一个基于 LSTM 的神经网络,以生成一个字符序列,其中下一个字符是基于当前字符预测的。结果是一个人造名字的列表,隐约让人想起真正的山,而且没有版权。事实上,人工生成保证了版权不受侵犯,对真实山脉名称的模糊回忆吸引了户外生活的爱好者。此外,有了这个神经网络,我们可以在几分钟内生成数百个这样的名字。我们只需要一个初始的任意字符来触发序列生成。

图 7。用于自由文本生成的具有 LSTM 单元隐藏层的神经网络

这个网络很容易扩展。如果我们将输入向量的序列从一个过去的字符扩展到许多过去的字符,我们可以生成比名字更复杂的文本。如果我们将训练集从山脉名称更改为说唱歌曲、莎士比亚悲剧或外语文本,网络将分别以说唱歌曲、莎士比亚诗歌或所选外语文本的形式生成免费文本。

经典和创新的数据科学项目

当您与数据科学家交谈时,请记住,并非所有的数据科学项目都是平等创建的。

一些数据科学项目需要标准和经典的解决方案。这种解决方案的例子和蓝图可以在许多免费的存储库中找到,例如 Workflow Hub。简单的解决方案甚至可以完全自动化,而更复杂的解决方案可以部分自动化,只需在需要的地方添加一些人工干预。

然而,数据科学家工作的一个较小但重要的部分是实施更具创新性的解决方案,需要大量的创造力和关于最新算法的最新知识。这些解决方案不能真正完全或者甚至部分自动化,因为问题是新的,并且在达到最终状态之前需要一些试运行。由于其新颖性,可能没有几个以前开发的解决方案可以用作蓝图。因此,最好的方法是从另一个应用领域重新采用类似的解决方案。

所有图片来源于 KNIME

如首次发表于data versity

数据科学新手的绝对入门指南

原文:https://towardsdatascience.com/the-absolute-beginners-guide-for-data-science-rookies-736e4fcbff0a?source=collection_archive---------7-----------------------

如何潜入数据海洋而不被淹没

Photo by Kevin Fitzgerald on Unsplash

因此,你可能在咖啡馆的随意交谈中听说过"数据科学",或者在凌晨 3 点滚动你最喜欢的社交网络时看到的一篇文章中读到过"数据驱动型公司",然后心想"这有什么大惊小怪的,嗯?!"。经过一些调查后,你最终会看到夸张的引用,如“ 数据是新的石油 ”或“ 人工智能是新的电力 ”,并开始理解为什么数据科学如此性感,现在学习它似乎是唯一合理的选择。

对你来说幸运的是,成为一名数据科学家不需要一个花哨的学位,你可以在家里舒适地学习任何东西。此外,21 世纪已经将在线学习确立为获取各种专业知识的可靠方式。最后,数据科学现在如此流行,以至于有无限的和不断增长的资源来学习它,这将玉米饼翻过来。拥有所有这些可能性,我应该选择哪一个?我的朋友,我希望我过去几个月的经历能帮助你消除疑虑。我们开始吧,好吗?

1.学什么?

数据科学家是这样一种球员,他可以从自己的球门开始比赛,运球越过几名防守队员,精确地传到点球点,然后在网内头球攻门,取得漂亮的进球。很抱歉提到足球,没办法,只是想想象一下你将如何掌握一套多样化的技能,这将使你在几乎任何与数据相关的问题上都非常有用。

现在,我将这些需求分为两种方法。首先,从技术角度来看,我们将回顾基础,这意味着数据科学以某种方式依赖的科学领域。其次,从一个更实际的角度来看,我将向您展示您应该关注哪些编程库,以便将您的手放在真正的数据项目上。

1.1 数据科学基础

  • 编程💻 : 你的第一个任务将是选择是使用 Python 还是 R (我会给你留下一些帮助这里,这里这里这里),然后埋头于编码。
  • 线性代数📐 : 当您处理数据时,您会想知道如何将数据集表示为矩阵,并理解矢量化和正交性等概念。
  • 微积分🔗 : 你将要编写和使用的许多模型将会使用诸如导数、积分和最优化等工具来计算并更快地找到问题的解决方案。
  • 概率🎲 : 当你使用数据科学时,很多时候你会致力于预测未来的一些事情,所以你会想知道一些事情发生的可能性有多大,或者为什么两个事件是相关的。
  • 统计数据📊为了描述你将要分析的信息,像平均值或百分位数这样的东西会派上用场,同时检验你的假设的测试也会出现。
  • 机器学习🤖:也许是数据科学的核心,在你的项目中的某个时候,你会想要预测一些事情,这就是机器学习开始发挥作用的时候。

1.2 数据科学库

在自己编写了一段时间的代码后,您会发现每种编程语言都有一系列的包或库,它们提供了不同的函数和方法来更轻松地执行不同的任务。

在这里,您可以找到一个包含 Python 中最流行和最有用的数据科学库的表格,下面是一些简短的指南。如果你已经走了 R 的路,不要担心,我也会给你留下一篇非常好的文章,这里有一个类似 R 库的表。

Top Python Libraries for Data Science

开始做数据科学所需要的是入门套件,Numpy 提供了处理数据的基础,但是你可以更容易地处理熊猫。Scipy 提供了一些奇特的函数和方法来在 Numpy 框架之上执行高级计算,Matplotlib 将允许您可视化地绘制您的发现。最后,Scikit-learn 是机器学习的起点,它包含了应用所有经典回归、分类和聚类方法所需的一切。

另一方面,深度学习框架将帮助你建立人工神经网络来执行更复杂的机器学习任务,如图像识别。此外,还有其他的数据可视化选择,允许创建更加风格化和互动的情节,甚至在网络应用程序上。自然语言处理( NLP )是数据科学中非常受欢迎的领域,例如,它可以让 Alexa 或 Siri 理解你在说什么。当你寻找数据进行分析时,互联网是一个无限的来源,所以网络搜集工具可以方便地频繁收集和检索这些数据。最后但同样重要的是,Statsmodels(统计分析)和 XGBoost(梯度增强)将在一些更具体的任务中帮助你。

1.x 数据科学(不是这样的)加分项

到目前为止,我们已经讨论了使用数据,但是什么类型的数据呢?它可以是非常漂亮、干净和结构化的 csv 文件,也可以是包含数百万非结构化数据示例的庞大数据集,是的,伙计,我们已经不在堪萨斯了。

根据您最终的工作地点,您的公司可能会以不同的方式处理数据,但最肯定的是,他们将处理非常大的数据集,所以接下来的这两个工具是每个数据科学家的必备工具。

  • 数据库:大公司把他们的数据储存在数据库里。为什么不是电子表格?嗯,基本上数据库是处理大块数据的合适方式,同时确保数据的完整性和安全性,并允许方便的查询和更新。现在,事情是有两种类型的数据库,关系数据库(SQL)和非关系数据库(NoSQL),你可能想知道它们的区别(这篇文章可能会帮助你),并希望学会使用这两种数据库。
  • 大数据:在处理大量数据时,你还必须考虑如何处理和提炼这些信息。当有数千行时,执行简单的任务可能只需要几秒钟,但当需要对数百万条记录运行高度复杂的模型时,可能需要几天。为此,您使用并行和分布式计算模型,以便在不同的内核或 CPU 中同时执行多个任务。两个最流行的框架是 Hadoop MapReduceSpark (在这里阅读它们的区别)。

2.去哪里学?

2.1 训练营

训练营是学习数据科学最容易的选择,它们是几个模块的一体化捆绑包,为您提供数据分析所需的几乎所有知识。人们可能会争论这些主题所涵盖的深度,但事实是,他们擅长在数据相关的主题中提供良好的介绍和中级水平的专业知识,当你开始做自己的项目或工作时,更高级的水平肯定会到来,所以不要担心。

现在,似乎有许多选择,但最受欢迎和真正在线的两个训练营是 DataquestDatacamp ,这两个训练营引起了关于哪一个更好的激烈辩论,我个人认为这并不容易,但我会尝试展示它们的优缺点以及它们的主要差异,以便您可以更容易地做出选择。你也可以查看这个有趣的 Reddit 线程

  • Datacamp (DC) ⚙: 成立于 2013 年,他们可以被称为数据科学训练营的创造者,在当今享有盛誉。他们从基于 R 的课程开始,但在过去几年中增加了 Python 内容。他们的课程是基于短视频,然后是问题和编程练习的混合,后者基本上包括完成已经存在的代码。除了编程练习之外,他们还提供了几个项目,在这些项目中,你可以运用你以前学过的多种能力。有几门课程是免费的,但要获取所有内容,你必须每月支付 29 美元。它还有一个基于 XP 的进度系统,可以帮助你保持节奏。
  • 数据探索(DQ)🚀:在 Datacamp 成立两年后,他们可能不如第一家有名,但肯定一样好。与 DC 类似,他们从 Python 课程开始,但在途中增加了 R 课程。他们提供基于文本的课程,在这些课程中,在你学到每一点信息后,你都必须进行编码,以便将一切付诸实践,所以这是非常面向应用的。每个模块结束后,你必须在 Jupyter Notebook 中从头开始做一个现实生活中的项目(我们稍后会谈到这一点),这样你就可以建立一个作品集来展示你的技能。Python 的第一个编码课程是完全免费的,但如果你想学习其中的一门课程,你就必须付费,Data Analyst 课程 29 美元,其他课程 49 美元。他们还指望一个活跃的 Slack 社区来解决你的疑惑或分享你的成就。

Data Science Bootcamps Comparison

总结一下。Datacamp 可能比 DQ 历史更悠久,提供的课程也更广泛,除了数据科学的核心知识之外,它还允许您深化其他学科。另一方面,Dataquest 更专注于通过高要求的练习和项目来建立一些强大的数据科学基础。

2.2 MOOCs

正如我在开头所说,在线学习正处于高峰期,越来越多的学生注册以扩展他们的知识,全球超过 1 亿名学生,约有 11.4k 门课程可用,MOOCs 是王道。现在,魔力在哪里?他们提供自定进度的课程,通常可以免费旁听,课程内容广泛。如果你想学习,你可以每天花 1-2 个小时,并且尽可能地进步,因为教育从来不是每个人都能获得的。

下面你会发现一个非常简短的数据科学 MOOC 平台排名前四(imo)的对比图。如果你想更深入地了解它们之间的差异和利弊,我推荐你阅读这篇的帖子,他们从几个方面对它们进行了非常详细的分析比较。稍后,我还会根据您的需求更详细地解释哪个平台更适合您。

MOOC Platforms Comparison

  • Coursera:mooc 的大老板,由吴恩达和达芙妮·柯勒创立,与顶尖大学和公司合作,很难不成为绝对的热门。课程包括测验和作业,而专业也有顶点项目,以评估你的进展。Coursera 提供两种主要模式:课程,免费审核,但一次性收费提供证书;和专业,这是一套相互关联的课程,你可以免费试用 7 天,然后每月支付费用(~50 美元),直到你完成它,获得证书。选择如果:你对自己想学的东西足够清楚,可以亲自挑选课程,课程种类繁多,理论与应用平衡良好。
  • Udacity: 最初由斯坦福大学提供的一些免费计算机科学课程,现在是最受尊敬的 MOOC 平台之一,具有明确的技术相关内容导向,是与谷歌或亚马逊等真正顶尖的公司合作开发的。Udacity 拥有几门关于精确主题的免费课程,但他们的专长是他们的nano degrees,这是一套涵盖某一领域所有必要技能的课程(例如数据分析师)。选择如果:你想要以工作为导向的课程,旨在培养你从事数据职位所需的一切,并且不太在乎价格。
  • EdX:2012 年,麻省理工学院和哈佛大学共同创建了 MOOC 提供商。虽然只在 Coursera 之后一个月推出,但两者基本上分享了相同的教育课程和学习方法,有一个精心制作的平台和一个活跃的社区。他们的认证体系也非常相似,他们的认证课程与 Coursera 的课程相同,他们的项目相当于 Coursera 的专业。选择如果:你在 Coursera 上没有找到你要找的东西,虽然课程同样不错,但它们的种类较少,而且课程是一次性收费的,所以根据你的进度,它们会稍微贵一点。
  • Udemy: 与我们之前提到的其他三个相比,这是一个怪人,尽管 Udemy 提供的课程数以万计,但它们都是由私人提供的,每个人都可以成为教练!这表明他们的证书没有得到任何大学、公司或组织的支持。所有这一切意味着内容更容易创建,但优质课程可能更难找到,但你仍然可以找到一些非常好的东西。它们的价格可以涨到每道 200 美元,但你可以发现它们几乎总是以 10-15 美元的价格出售,所以不要绝望,等待它。选择如果:你只是对学习内容感兴趣,不太在乎证书,并且正在寻找负担得起的选择。

Top Data Science and Machine Learning Courses

当然,这些是我个人的选择,虽然大多数人会同意几乎所有的选择,但我鼓励你有其他的观点并进行更多的研究,中央课堂的这个帖子是一个很好的开始。

2.3 书籍

好的旧书!虽然它们实际上永远不会变老,但如果你明智地选择,它们可以成为支持你学习的非常有价值的资源。就数据科学书籍而言,它们通常有两种“格式”:普通理论或面向代码,尽管有时你也会发现两者的混合。此外,在这一点上,你应该已经知道什么编程语言更适合你,因为书籍的作者已经下定决心,书籍将只使用一种语言编写。

3.下一步是什么?

我们已经走了很长一段路,了解了成为一名数据科学家需要学习的内容和地点,但是您现在做什么呢?我将向您展示如何以正确的方式将您的技能付诸实践,以便您能够适应数据科学社区。

  • Jupyter📓:科学世界有点乱,大量的数学、图表和代码看起来像是你在做一些真正前卫的东西,但如果你不能清楚地展示出来,那它就一文不值。这就是为什么令人敬畏的 Jupyter 笔记本出现来帮助你,它们允许运行你的代码,绘制惊人的交互图,导入任何类型的数据,编写美丽的方程,并通过在一个精心展示的笔记本上降价来适当地评论一切,这样你就可以展示你的工作,而不是一个绝对无法辨认的混乱。在这里你可以看到一个 Jupyter 笔记本的例子来理解我所说的。
  • Kaggle🏆:竞争数据科学可能听起来像大联盟,但 ka ggle(2017 年被谷歌收购)是一个非常棒的数据科学平台和社区,允许公司和组织创建竞赛(有时这是他们实际上想要解决的问题),每个人都可以参与,甚至赢得丰厚的奖品,并通过显示迄今为止最佳结果的实时排名来计数。此外,它需要大量的学习材料来帮助您入门,还有一个包含各种类型和不同用途的数据集的巨大存储库,所以基本上您已经拥有了开始从事实际项目所需的一切!
  • GitHub🐱:在软件开发领域,一个叫做 Git 的东西被创造出来,这是一个版本控制软件,它基本上帮助跟踪一个多人工作的项目中的变化。在 GitHub 出现后,一个基于网络的版本控制托管服务,用非常简单的话来说,它有助于保持云上项目的组织和记录。在 GitHub 中,你会发现各种各样令人敬畏的回购,你可以分叉并为你的个人项目修改它们,但最重要的是,GitHub 将帮助你保持一个有组织的投资组合,供你在找工作时展示你的工作。
  • ❓: 编码之路并非一帆风顺,事实上处理所有的错误和调试数百行代码会变得非常烦人,但作为人类本性的一部分,我们已经从错误中吸取了教训,学会了如何不被同样的石头绊倒。Stackoverflow 是一个 Q &社区,由来自世界各地的开发人员组成,它允许您通过线程找到编程中常见(和不常见)问题的解释,每个人都可以轻松地提问和回答。当你绝望地在 Google 中使用 Ctrl+C/Ctrl+时,请记住这一点,它将把你重定向到 Stackoverflow 中你辉煌的答案,就像魔法一样。

Stackoverflow saving the day

一些最后的想法

我坚信一个好的专业人士总是在学习,在一个像我们这样充满活力的世界里,你很快就会被淘汰,这就是学习的力量所在,能够跟上时代并重塑自己不仅会帮助你成长为一名专业人士,还会帮助你成长为一个人。

最后,学习是一个非常个人化的过程,没有一个神奇的公式适用于所有人,尽管在这篇文章中,我试图以建议的形式给出多种选择,但最终决定权在你,只要确保你享受这一过程🏄

2019 年 3 月更新。

熵的丰富

原文:https://towardsdatascience.com/the-abundance-of-entropies-6cd613139c82?source=collection_archive---------21-----------------------

理解熵的不同类型。

我曾经在不恰当的时候谈论信息论和香农,一般来说,你会发现我在随机的社交活动中脱口而出关于香农的信息。

我不应该说双关语,我显然不擅长!

信息信息无处不在!

有些人认为,通过研究另一天的科学发现,我们可以学会如何做出发现。另一方面,一位圣人观察到我们从历史中学不到任何东西,除了我们从历史中学不到任何东西,亨利·福特断言历史是一派胡言。

-约翰·R·皮尔斯, 信息论导论

约翰·R·皮尔斯的《信息论导论》这本书很美。它并没有很高的技术性,事实上,它是我爱上的一个数学理论的令人耳目一新的写照。

他认为,许多强大的科学发现不是通过对自然现象的研究产生的,而是通过对人造设备中的现象的研究产生的。

。在任何与信息论相关的课程中,你都会经常听到这个神秘的词。事实上,如果你从事过机器学习,你一定非常熟悉交叉熵这个术语!!
尽管如此,我们一定都在某个时候疑惑过— 熵不是在热力学中使用的吗?

通信中使用的熵不同于统计力学或热力学中使用的熵。他们正在处理的问题完全不同。

热力学中的熵

鲁道夫·克劳修斯在 19 世纪 50 年代为热力学定义了熵。气体的熵取决于它的温度、体积和质量。熵是可逆性的指标,即当熵没有变化时,过程是可逆的。

Boltzmann’s formula for entropy of gas.

不可逆的物理现象总是涉及熵的增加。有趣的是,这最初是由路德维希·玻尔兹曼在 1872 年到 1875 年间提出的!玻尔兹曼公式是热力学最概括的公式。

因此,熵的增加意味着我们将热能转化为机械能的能力下降。熵的增加意味着可用能量的减少。

——约翰·R·皮尔斯,信息论导论

统计力学中的熵

虽然热力学给了我们熵的概念,但它并没有给出熵的详细物理图像,例如在分子的位置和速度方面。统计力学在特殊情况下确实给出了熵的详细的力学含义。

——约翰·R·皮尔斯,信息论导论

在这里,我们认识到熵的增加意味着有序性的降低或不确定性的增加。

where K is Boltzmann’s constant and Pi is the probability of being occupied.

传播理论中的熵

传播理论或者当时叫什么信息论:

  • 信息来源:作家,演讲者任何能产生信息的东西
  • 消息:数据,如文本文档或你想发送给某人的东西。

随着关于实际将产生什么消息的不确定性变得越来越大,消息所传达的信息量也在增加。我们来看看。你有两个朋友。一个人(A 人)不停地给你发迷因,另一个人是一个普通人(B 人),他有广泛的话题可聊。当你在手机上听到一声哔哔声,如果是 A 发来的,不确定性会减少,因为你知道信息的熵会减少。类似地,人 B 可以给你发送任何东西,因此你不知道信息会是关于什么的,不确定性是越来越高的熵。

如果是人 A,你已经认为它是一个迷因,当你打开它发现它是一个迷因。这是可以预见的,你打开它会得到一些信息。另一方面,打开不可预测的来自 B 的信息会给你更多的信息。

我们也可以看看刽子手的例子。如果你能猜出名字中比“of”或“the”更罕见的词,你会更了解这是哪部电影/书。

因此,高熵意味着更多的信息

或者

注意到它们在数学上是多么的相似了吗?

交叉熵

在机器学习中,交叉熵通常被用作损失函数。它是给定随机变量的两个概率分布之间的差值。

交叉熵 :代表事件的平均总位数,来自 Q 而不是 p

Ref:https://machinelingmastery . com/cross-entropy-for-machine-learning/

所以当我们用交叉熵作为损失函数时

期望概率(y):数据集中一个例子的每个类标签的已知概率(P)。
预测概率(yhat):由模型(Q)预测的每一类标签实例的概率。

因此,我们可以使用上述交叉熵计算来估计单个预测的交叉熵;

其中 X 中的每个 x 是可以分配给该示例的类标签,并且 P(x) 对于已知标签将是 1,对于所有其他标签将是 0。

Ref:https://machinelingmastery . com/cross-entropy-for-machine-learning/

将信息与知识联系起来

文字,人类不断玩弄文字。当信息与知识联系在一起时,就会出现一些问题。我们不顾一切地把这个和统计力学联系起来!通信理论起源于电子通信,而不是统计力学。

外卖?

  • 尽管有些人可能认为研究科学发现的历史是多余的,但科学发现是通过观察人造设备中的现象而发生的
  • 通信中使用的熵之所以这么叫是因为数学类比,它与统计力学或热力学中定义的熵有很大不同。事实上,他们试图解决不同的问题。当热力学熵试图处理一个过程的可逆性时,它的统计力学对等物是根据分子的位置和速度来处理熵。通信中的熵是关于信息的,更多的熵,更多的信息
  • 这里的信息与你传统的知识关联略有不同

原载于 2019 年 11 月 8 日 https://megstalks.com**的T22。

新 GPT 协议的可及性——文本生成和微调

原文:https://towardsdatascience.com/the-accessibility-of-gpt-2-text-generation-and-fine-tuning-6a710f0fbbb0?source=collection_archive---------26-----------------------

使用正确的工具,使用 GPT-2 生成文本相当容易。了解如何做到这一点,以及如何在您自己的数据集上微调模型。

自然语言生成(NLG)是 NLP 社区中研究得很好的主题。随着深度学习方法的兴起,NLG 变得越来越好。最近,OpenAI 已经突破了极限,发布了GPT-2——一种基于变形金刚的模型,可以预测每个时间空间的下一个令牌

如今,使用这些模型非常容易——您不需要自己实现代码,也不需要使用昂贵的资源来训练模型。例如,HuggingFace 已经发布了一个 API ,它简化了对 OpenAI 发布的预训练 GPT-2 的访问。它的一些功能包括生成文本,以及在您自己的数据集上微调模型-转移已学习的分布,以便模型将从新域生成文本。

做所有这些都很容易——只需要安装相关的包并启动一个 python 脚本。然而,为了避免麻烦,你可以使用一个可用的平台,比如Spell——你只需要指定你想要运行的,Spell 会处理剩下的事情(下载代码,安装软件包,分配计算资源,管理结果)。

虽然我不是一个拼写倡导者(我甚至没有尝试过该平台的其他功能,或者根本没有尝试过其他平台),但我决定写一个教程,详细介绍我刚才描述的过程。要了解更多,你可以在这里找到教程。

如果你也喜欢玩机器生成的文本,请随意留下你得到的有趣文本的评论。😃

更新:上述链接中似乎不再提供该教程。虽然有点过时(HuggingFace API 从那以后改了很多),下面是全文:

自然语言生成(NLG)是 NLP 社区中研究得很好的主题。解决文本生成挑战的一种方法是将记号序列(例如,单词或编码P(x _ 1,…,x_n)字节对)的概率因式分解为得到每个记号 x_1 【T5,…, x_n 的概率的乘积,这些记号以其前面的记号为条件:

给定一个训练数据集,可以训练这样一个模型,以最大化每个时间步下一个令牌的概率。一旦模型经过训练,您就可以通过从分布中一次抽取一个令牌来生成文本。轻而易举。

随着深度学习方法的兴起,NLG 变得越来越好。最近,随着 GPT-2 的发布,OpenAI 已经突破了极限。该模型使用众所周知的变压器架构:为了计算下一个令牌上的分布,该模型使用自关注机制同时使用先前的令牌。

最近,HuggingFace 发布了一个 API 来简化对 GPT-2 的访问。它的一个功能是使用预先训练好的模型生成文本:

spell run — github-url [https://github.com/huggingface/transformers.git](https://github.com/huggingface/transformers.git) \
 — pip tqdm \
 — pip boto3 \
 — pip requests \
 — pip regex \
 — pip sacremoses \
“python examples/run_generation.py \
   — model_type=gpt2 \
   — length=70 \
   — prompt=’ ‘ \
   — model_name_or_path=gpt2"

以下是输出结果:

💫 Casting spell #1…
✨ Stop viewing logs with ^C
✨ Machine_Requested… done
✨ Building… done
✨ Run is running
…
…
…
$5.30-$10.00FREE SHIPPING
Items without a shipping address will be delivered to your confirmation email when you purchase your product.Use “POOL” when ordering; deliveries to POOL addresses are completely separate from shipping.<|endoftext|>Earth’s spin to new low the closer Earth takes to the Sun’s
✨ Saving… done
✨ Pushing… done
🎉 Total run time: 1m7.057677s
🎉 Run 1 complete

那很容易!OpenAI 使用了网络上找到的各种数据来训练模型,因此生成的文本几乎可以是任何自然的文本。但是,如果我们想要生成一种特定的文本,而不是多样性,会怎么样呢?让我们试着创造笑话吧!为此,我们必须使用笑话数据集来训练模型。不幸的是,获得这样一个数据集会非常困难!为了训练 GPT-2,它有 1.24 亿个重量需要学习(这仅仅是架构的缩小版),我们需要大量的数据!但是我们怎么会有那么多笑话呢?简短的回答是:我们不会。

学习生成笑话包括学习如何生成看起来自然的文本,以及确保这些文本是有趣的。第一部分是大部分学习发生的地方。使用预训练版本的 GPT-2 作为起点,该模型不必从头开始学习如何生成看起来自然的文本。它所要学习的就是把注意力集中在有趣的文本上。一个相对较小的数据集就可以完成这项任务。

不要误解我,我们将使用的数据集不够大,不足以有意义地学习任何有用的东西。此外,训练一个模型来概括幽默的概念是一个难题。然而,为了这篇文章的目的——学习如何使用和微调 GPT-2 这样的模型——这就够了:我们将见证数据集如何将模型的分布转向在某种程度上看起来像笑话的文本。

我们将使用来自短笑话数据集的一行笑话来微调 GPT-2。比一般的笑话要短,模特会更容易了解它们的分布。所以首先,让我们得到数据:

spell run “wget -O data.csv [https://raw.githubusercontent.com/amoudgl/short-jokes-dataset/master/data/onelinefun.csv](https://raw.githubusercontent.com/amoudgl/short-jokes-dataset/master/data/onelinefun.csv) && python -c \”import csv; f_in = open(‘data.csv’, ‘r’); f_out = open(‘data.txt’, ‘w’); f_out.write(‘\n’.join(row[‘Joke’] for row in csv.DictReader(f_in)))\””

输出是:

💫 Casting spell #2…
✨ Stop viewing logs with ^C
✨ Building… done
✨ Machine_Requested… done
✨ Run is running
 — 2019–11–09 21:36:14 —  [https://raw.githubusercontent.com/amoudgl/short-jokes-dataset/master/data/onelinefun.csv](https://raw.githubusercontent.com/amoudgl/short-jokes-dataset/master/data/onelinefun.csv)
Resolving raw.githubusercontent.com (raw.githubusercontent.com)… 151.101.0.133, 151.101.64.133, 151.101.128.133, …
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443… connected.
HTTP request sent, awaiting response… 200 OK
Length: 253462 (248K) [text/plain]
Saving to: ‘data.csv’ 0K ………. ………. ………. ………. ………. 20% 3.34M 0s
  50K ………. ………. ………. ………. ………. 40% 6.72M 0s
  100K ………. ………. ………. ………. ………. 60% 167M 0s
  150K ………. ………. ………. ………. ………. 80% 122M 0s
  200K ………. ………. ………. ………. ……. 100% 6.55M=0.03s2019–11–09 21:36:14 (8.14 MB/s) — ‘data.csv’ saved [253462/253462]✨ Saving… done
✨ Pushing… done
🎉 Total run time: 13.07418s
🎉 Run 2 complete

HuggingFace 已经为我们提供了微调 GPT-2 的脚本:

spell run — github-url [https://github.com/huggingface/transformers.git](https://github.com/huggingface/transformers.git) \
 — pip tqdm \
 — pip boto3 \
 — pip requests \
 — pip regex \
 — pip sacremoses \
-m runs/2/data.txt \
“python examples/run_lm_finetuning.py \
   — output_dir=output \
   — model_type=gpt2 \
   — model_name_or_path=gpt2 \
   — per_gpu_train_batch_size=2 \
   — num_train_epochs=10 \
   — do_train \
   — train_data_file=data.txt”

输出是:

💫 Casting spell #3…
✨ Stop viewing logs with ^C
✨ Machine_Requested… done
✨ Building… done
✨ Mounting… done
✨ Run is running…
…
…🎉 Total run time: 44h36m34.553059s
🎉 Run 3 complete

请注意,使用-m标志来安装前一次运行中下载的数据。

即使我们使用了一个小数据集(3K 的例子),在一个 CPU 上运行 10 个历元也需要大约 44 小时。只能说明模型有多大。这就是为什么如果您想要使用更大的数据集或运行许多实验(例如,调整 hyper 参数),您应该使用 GPU。

在获得上一次运行的结果后,让我们试着创造一个笑话:

spell run — github-url [https://github.com/huggingface/transformers.git](https://github.com/huggingface/transformers.git) \
 — pip tqdm \
 — pip boto3 \
 — pip requests \
 — pip regex \
 — pip sacremoses \
-m runs/3/output \
“python examples/run_generation.py \
   — model_type=gpt2 \
   — length=70 \
   — prompt=’ ‘ \
   — model_name_or_path=output”

输出是:

💫 Casting spell #4…
✨ Stop viewing logs with ^C
✨ Machine_Requested… done
✨ Building… done
✨ Run is running…
…
…“I’ve got seven fingers! But I don’t have those!”
Your childhood might be difficult, but at least it doesn’t taste like your grandfather’s.
Funny things never happen, in life.
Friends, We’ve met on the beach. What’s wrong with you?
If I’m speaking honestly, I could use some✨ Saving… done
✨ Pushing… done
🎉 Total run time: 51.047054s
🎉 Run 4 complete

该模型已经学会生成短句,这对于我们的数据集来说是典型的。这个相对容易掌握的数据统计学得很好!关于这个模型有多有趣——好吧……我让你来判断!

Photo by Gratisography from Pexels

这个帖子最初是我在 www.anotherdatum.com**的 发布的。

统计学和机器学习的实际区别

原文:https://towardsdatascience.com/the-actual-difference-between-statistics-and-machine-learning-64b49f07ea3?source=collection_archive---------0-----------------------

不,它们不一样。如果机器学习只是美化了的统计学,那么建筑学只是美化了的沙堡建造。

老实说,我厌倦了在社交媒体上和我的大学里几乎每天都听到这样的辩论。通常,这伴随着一些含糊的陈述来解释问题。这样做双方都有罪。我希望在这篇文章结束时,你会对这些有些模糊的术语有一个更加了解的立场。

论据

与普遍的看法相反,机器学习已经存在了几十年。由于其巨大的计算需求和当时存在的计算能力的限制,它最初被避开。然而,由于信息爆炸产生的数据优势,机器学习近年来出现了复兴。

那么,如果机器学习和统计学是彼此的同义词,为什么我们没有看到每所大学的每一个统计系关闭或转变为“机器学习”系?因为他们不一样!

关于这个话题,我经常听到一些模糊的说法,最常见的是这样的说法:

“机器学习和统计学的主要区别在于它们的目的。机器学习模型旨在尽可能做出最准确的预测。统计模型是为推断变量之间的关系而设计的。”

虽然这在技术上是正确的,但它并没有给出一个特别明确或令人满意的答案。机器学习和统计学的一个主要区别确实是它们的目的。然而,说机器学习都是关于准确的预测,而统计模型是为推理而设计的,这几乎是一种毫无意义的说法,除非你精通这些概念。

首先,我们必须明白,统计和统计模型是不一样的。统计学是对数据的数学研究。除非你有数据,否则你无法做统计。统计模型是一种数据模型,用于推断数据中的关系,或者创建能够预测未来值的模型。通常,这两者是相辅相成的。

所以实际上有两件事我们需要讨论:第一,统计学和机器学习有什么不同,第二,统计模型和机器学习有什么不同。

说得更明白一点,有很多统计模型可以做出预测,但预测的准确性不是它们的强项。

同样,机器学习模型提供了不同程度的可解释性,从高度可解释性的拉索回归到难以理解的神经网络,但它们通常为了预测能力而牺牲可解释性。

从高层的角度来看,这是一个很好的答案。对大多数人来说已经足够好了。然而,有些情况下,这种解释让我们对机器学习和统计建模之间的差异产生了误解。让我们看看线性回归的例子。

统计模型 vs 机器学习—线性回归示例

在我看来,统计建模和机器学习中使用的方法的相似性导致人们假设它们是同一件事。这是可以理解的,但事实并非如此。

最明显的例子是线性回归,这可能是这种误解的主要原因。线性回归是一种统计方法,我们可以训练一个线性回归器,并获得与旨在最小化数据点之间的平方误差的统计回归模型相同的结果。

我们看到,在一种情况下,我们做了一些称为“训练”模型的事情,这涉及到使用我们数据的子集,我们不知道模型的表现如何,直到我们在训练期间不存在的额外数据(称为测试集)上“测试”这些数据。在这种情况下,机器学习的目的是在测试集上获得最佳性能。

对于统计模型,我们找到了一条使所有数据的均方误差最小化的线,假设数据是添加了一些随机噪声的线性回归量,这些噪声本质上通常是高斯噪声。不需要训练和测试集。对于许多情况,尤其是在研究中(例如下面的传感器示例),我们的模型的要点是描述数据和结果变量之间的关系,而不是对未来数据进行预测。我们称这个过程为统计推断,而不是预测。但是,我们仍然可以使用该模型来进行预测,这可能是您的主要目的,但是评估模型的方式将不涉及测试集,而是涉及评估模型参数的显著性和稳健性。

(监督)机器学习的目的是获得一个可以进行可重复预测的模型。我们通常不关心模型是否可解释,尽管我个人建议总是进行测试以确保模型预测有意义。机器学习是关于结果的,它很可能在一个你的价值完全由你的表现来表征的公司工作。然而,统计建模更多的是寻找变量之间的关系以及这些关系的重要性,同时也是为了预测。

为了具体说明这两种程序的区别,我举一个个人的例子。白天,我是一名环境科学家,主要研究传感器数据。如果我试图证明传感器能够对某种刺激(如气体浓度)做出响应,那么我会使用统计模型来确定信号响应是否具有统计显著性。我会尝试理解这种关系,并测试其可重复性,这样我就可以准确地描述传感器响应的特征,并根据这些数据做出推断。我可能要测试的一些事情是,响应是否实际上是线性的,响应是否可以归因于气体浓度而不是传感器中的随机噪声,等等。

相比之下,我还可以获得一个由 20 个不同传感器组成的阵列,我可以用它来尝试和预测我新表征的传感器的响应。如果你不太了解传感器,这可能有点奇怪,但这是目前环境科学的一个重要领域。一个有 20 个不同变量的模型预测我的传感器的结果,这显然是关于预测的,我不期望它特别容易解释。由于化学动力学产生的非线性以及物理变量和气体浓度之间的关系,该模型可能有点像神经网络一样深奥。我希望模型有意义,但只要我能做出准确的预测,我就很高兴了。

如果我试图证明我的数据变量之间的关系达到一定程度的统计意义,以便我可以在科学论文中发表它,我会使用统计模型,而不是机器学习。这是因为我更关心变量之间的关系,而不是做出预测。做出预测可能仍然很重要,但大多数机器学习算法缺乏可解释性,因此很难证明数据内部的关系(这实际上是现在学术研究中的一个大问题,研究人员使用他们不理解的算法,并获得似是而非的推论)。

Source: Analytics Vidhya

应该清楚的是,这两种方法的目标是不同的,尽管它们使用了相似的方法来实现目标。机器学习算法的评估使用测试集来验证其准确性。然而,对于统计模型,通过置信区间、显著性检验和其他检验对回归参数的分析可用于评估模型的合法性。因为这些方法产生相同的结果,所以很容易理解为什么人们会认为它们是相同的。

统计 vs 机器学习—线性回归示例

我认为这种误解很好地概括在这个表面上诙谐的比较统计和机器学习的 10 年挑战中。

然而,仅仅因为这两个术语都利用了相同的基本概率概念,就将这两个术语混为一谈是不合理的。例如,如果我们声明机器学习只是基于这一事实的美化统计,我们也可以做出以下声明。

物理只是被美化了的数学。

动物学只是美化了的集邮。

建筑只是美化了的沙堡建筑。

这些陈述(尤其是最后一个)非常荒谬,都是基于将建立在相似概念上的术语合并的想法(双关语用于架构示例)。

实际上,物理学是建立在数学基础上的,它是应用数学来理解现实中的物理现象。物理学还包括统计学的一些方面,统计学的现代形式通常建立在一个框架上,该框架由策梅洛-弗兰克尔集合论和测度论组成,以产生概率空间。他们两个有很多共同点,因为他们来自相似的起源,并且运用相似的思想来得出逻辑结论。同样,建筑和沙堡建筑可能有很多共同点——虽然我不是建筑师,所以我不能给出一个明智的解释——但它们显然是不一样的。

为了让你了解这场辩论的范围,实际上在《自然方法》杂志上发表了一篇论文,概述了统计学和机器学习之间的差异。这个想法可能看起来很可笑,但这种程度的讨论是必要的,这有点可悲。

[## 意义点:统计学与机器学习

统计学从样本中得出总体推断,机器学习找到可概括的预测模式。二…

www.nature.com](https://www.nature.com/articles/nmeth.4642)

在我们继续之前,我将快速澄清另外两个与机器学习和统计学相关的常见误解。这些是人工智能不同于机器学习,数据科学不同于统计学。这些都是相当没有争议的问题,所以它会很快。

数据科学本质上是应用于数据的计算和统计方法,这些数据可以是小型或大型数据集。这也可以包括探索性数据分析,其中数据被检查和可视化,以帮助科学家更好地理解数据并从中做出推断。数据科学还包括像数据争论和预处理这样的事情,因此涉及某种程度的计算机科学,因为它涉及编码、建立数据库、web 服务器等之间的连接和管道。

你不一定需要用计算机来做统计,但是没有计算机你就不能真正做数据科学。你可以再一次看到,虽然数据科学使用了统计学,但它们显然是不一样的。

同样,机器学习也不等同于人工智能。事实上,机器学习是 AI 的一个子集。这是非常明显的,因为我们是在教(“训练”)一台机器根据以前的数据对某种类型的数据进行归纳推理。

机器学习建立在统计学的基础上

在我们讨论统计学和机器学习有什么不同之前,让我们先讨论一下相似之处。在前面的章节中,我们已经稍微提到了这一点。

机器学习是建立在统计框架之上的。这应该是显而易见的,因为机器学习涉及数据,而数据必须用统计框架来描述。然而,扩展到大量粒子热力学的统计力学也是建立在统计框架上的。压力的概念其实是一个统计量,温度也是一个统计量。如果你认为这听起来很可笑,这很公平,但这实际上是真的。这就是为什么你不能描述一个分子的温度或压强,这是没有意义的。温度是分子碰撞产生的平均能量的表现形式。对于足够多的分子,我们可以描述像房子或室外这样的东西的温度,这是有意义的。

你会承认热力学和统计学是一样的吗?不,热力学使用统计学来帮助我们理解传输现象形式的功和热的相互作用。

事实上,热力学不仅仅是建立在统计学的基础上。类似地,机器学习利用了数学和计算机科学的大量其他领域,例如:

  • 数学和统计学领域的 ML 理论
  • 优化、矩阵代数、微积分等领域的 ML 算法
  • 来自计算机科学和工程概念的 ML 实现(例如内核技巧、特征散列)

当一个人开始在 Python 上编码,拿出 sklearn 库并开始使用这些算法时,许多这些概念都被抽象了,因此很难看出这些差异。在这种情况下,这种抽象导致了对机器学习实际涉及内容的无知。

统计学习理论—机器学习的统计基础

统计学和机器学习的主要区别在于统计学仅仅基于概率空间。您可以从集合论中获得统计数据的整体,集合论讨论了我们如何将数字分组到称为集合的类别中,然后对这个集合施加一个度量,以确保所有这些值的总和为 1。我们称之为概率空间。

统计学除了这些集合和测度的概念之外,没有对宇宙做任何其他假设。这就是为什么当我们用非常严格的数学术语指定一个概率空间时,我们指定了三样东西。

一个概率空间,我们这样表示,(ω,F,P) ,由三部分组成:

  1. 一个样本空间ω,这是所有可能结果的集合。
  2. 一组事件F ,其中每个事件是一个包含零个或多个结果的集合。
  3. 概率分配给事件,P;也就是从事件到概率的函数。

机器学习是基于统计学习理论,这仍然是基于概率空间的公理概念。这一理论是在 20 世纪 60 年代发展起来的,是对传统统计学的扩展。

机器学习有几个类别,因此我在这里只关注监督学习,因为它是最容易解释的(尽管仍然有些深奥,因为它被数学掩盖了)。

监督学习的统计学习理论告诉我们,我们有一组数据,我们表示为 S = {(xᵢ,yᵢ)} 。这基本上就是说,我们有一个由 n 个数据点组成的数据集,每个数据点都由一些我们称之为特征的其他值来描述,这些值由 x、提供,这些特征由某个函数映射,从而给出值 y.

它说我们知道我们有这个数据,我们的目标是找到将 x 值映射到 y 值的函数。我们把能够描述这种映射的所有可能函数的集合称为假设空间。

为了找到这个函数,我们必须给算法一些方法来“学习”处理问题的最佳方法。这是由损失函数提供的。因此,对于我们拥有的每个假设(提出的函数),我们需要通过查看所有数据的预期风险的值来评估该函数的表现。

预期风险本质上是损失函数乘以数据的概率分布的总和。如果我们知道映射的联合概率分布,就很容易找到最佳函数。然而,这通常是未知的,因此我们的最佳选择是猜测最佳函数,然后根据经验决定损失函数是否更好。我们称之为经验风险

然后,我们可以比较不同的函数,并寻找给我们带来最小预期风险的假设,即给出数据上所有假设的最小值(称为下确界)的假设。

然而,该算法有作弊的倾向,以便通过过度拟合数据来最小化其损失函数。这就是为什么在学习了基于训练集数据的函数之后,该函数在测试数据集上被验证,这些数据没有出现在训练集中。

我们刚刚定义的机器学习的本质引入了过度拟合的问题,并证明了在执行机器学习时需要训练和测试集。这不是统计学的一个固有特征,因为我们并没有试图最小化我们的经验风险。

选择最小化经验风险的函数的学习算法被称为经验风险最小化

示例

以简单的线性回归为例。在传统意义上,我们试图最小化一些数据之间的误差,以便找到一个可以用来描述数据的函数。在这种情况下,我们通常使用均方误差。我们把它平方,这样正负误差就不会互相抵消。然后,我们可以以封闭形式求解回归系数。

碰巧的是,如果我们将损失函数设为均方误差,并执行统计学习理论所支持的经验风险最小化,我们最终会得到与传统线性回归分析相同的结果。

这只是因为这两种情况是等价的,同样,对相同的数据执行最大似然法也会得到相同的结果。最大似然法有不同的方式来达到同样的目标,但是没有人会争辩说最大似然法和线性回归是一样的。最简单的情况显然无助于区分这些方法。

这里要指出的另一个要点是,在传统的统计方法中,没有训练和测试集的概念,但是我们确实使用度量来帮助我们检查我们的模型如何执行。因此,评估程序是不同的,但两种方法都能够为我们提供统计上稳健的结果。

还有一点是,这里的传统统计方法给出了最优解,因为该解具有封闭形式。它没有测试出任何其他假设,也没有汇聚成一个解决方案。然而,机器学习方法尝试了一系列不同的模型,并收敛到最终的假设,这与回归算法的结果一致。

如果我们使用不同的损失函数,结果就不会收敛。例如,如果我们使用铰链损失(使用标准梯度下降是不可微分的,因此需要其他技术,如近似梯度下降),那么结果将是不同的。

可以通过考虑模型的偏差来进行最终的比较。人们可以要求机器学习算法测试线性模型,以及多项式模型、指数模型等,看看这些假设是否更好地符合给定我们的先验损失函数的数据。这类似于增加相关的假设空间。在传统的统计学意义上,我们选择一个模型,并可以评估其准确性,但不能自动使其从 100 个不同的模型中选择最佳模型。显然,模型中总是存在一些偏差,这些偏差源于算法的初始选择。这是必要的,因为找到对数据集最优的任意函数是 NP 难问题。

那么哪个更好呢?

这其实是一个很傻的问题。就统计学与机器学习而言,没有统计学,机器学习就不会存在,但机器学习在现代非常有用,因为自信息爆炸以来,人类可以访问大量数据。

比较机器学习和统计模型有点困难。你使用哪一种主要取决于你的目的是什么。如果你只是想创建一个可以高精度预测房价的算法,或者使用数据来确定某人是否可能感染某些类型的疾病,机器学习可能是更好的方法。如果您试图证明变量之间的关系或从数据中进行推断,统计模型可能是更好的方法。

Source: StackExchange

如果你没有强大的统计学背景,你仍然可以学习机器学习并利用它,机器学习库提供的抽象使得非专家使用它们非常容易,但是你仍然需要对底层的统计思想有一些理解,以防止模型过度拟合并给出似是而非的推论。

我可以在哪里了解更多信息?

如果你有兴趣深入研究统计学习理论,有很多关于这个主题的书籍和大学课程。以下是我推荐的一些讲座课程:

[## 9.520/6.860,2018 年秋季

该课程从统计学习的角度涵盖了机器学习的基础和最新进展…

www.mit.edu](http://www.mit.edu/~9.520/fall18/) [## ECE 543:统计学习理论(2018 年春季)

统计学习理论是一个新兴的研究领域,交叉在概率,统计,计算机…

maxim.ece.illinois.edu](http://maxim.ece.illinois.edu/teaching/spring18/index.html)

如果你对钻研概率空间感兴趣,那么我提前警告你,它在数学中相当沉重,通常只在研究生统计课上涉及。这里有一些关于这个主题的好资料:

http://users . jyu . fi/~ miparvia/Opetus/Stokastiikka/introduction-probability . pdf

https://people.smp.uq.edu.au/DirkKroese/asitp.pdf

感谢您的阅读!

时事通讯

关于新博客文章和额外内容的更新,请注册我的时事通讯。

[## 时事通讯订阅

丰富您的学术之旅,加入一个由科学家,研究人员和行业专业人士组成的社区,以获得…

mailchi.mp](https://mailchi.mp/6304809e49e7/matthew-stewart)

建筑人工智能的出现

原文:https://towardsdatascience.com/the-advent-of-architectural-ai-706046960140?source=collection_archive---------6-----------------------

历史视角

斯塔尼斯拉斯·夏洛 ,哈佛大学设计研究生院**| 2019 年 2 月 17 日

法语版

本文放出 我们的论文 的一部分,在哈佛开发,2019 年 5 月提交。这件作品是一个更大的作品的一个组成部分,调查艾在建筑上的开端,它的 历史背景 ,它的潜在空间 组织&风格

今天,建筑实践、建筑方法、建筑传统和建筑技术是激烈争论的焦点。受到外来者的挑战,带来新的实践,以及来自内部的质疑,正如从业者对其当前状态的怀疑,建筑正在经历一场真正深刻的(r)进化。

在将对我们的学科留下持久影响的因素中,技术无疑是起作用的主要载体之一。价值链每一步的技术解决方案的出现已经极大地改变了建筑。建筑的概念事实上已经开始了缓慢的转变:首先是利用新的建筑技术,然后是开发足够的软件,最终今天是引入统计计算能力(包括数据科学和人工智能)。与其说是一种破坏,不如说我们希望在这里看到一种延续,这种延续引领建筑经历了一系列的演变,直到今天。模块化计算设计、参数化以及最后的人工智能对我们来说是慢节奏转变的四个错综复杂的步骤。在历史背景之外,我们假设这种演变是建筑概念彻底改进的线框。

一.四阶段序列

M 这就是为什么当回顾历史时,区分创造的两个层次至关重要:发明& 创新。 发明源于学术研究,而创新则由发明诱发。在建筑领域,创新实际上塑造了一种持续发展的实践。在不同时期、发明&创新之间一直在反复进行的实践。从那里开始,我们的编年史旨在展示计算和建筑领域的深刻交织的演变,然后介绍建筑人工智能时代,作为一个顶点。这就是为什么重建我们学科近期历史的背景和亮点是我们工作的先决条件。

Inventions & Innovations | Source: Author

模块化系统

模块化可以作为系统化建筑设计的起点。始于 30 年代初,模块化建筑的出现将语言和建筑语法带入概念阶段,有助于简化和合理化建筑设计。

早在 1920 年,瓦尔特·格罗皮乌斯就为包豪斯提出了理论,模块化电网承载着技术简单和价格低廉的希望。模块化来自不同的方向,最初是作为学者和实践者的研究课题出现的。Gropius 最初引入了“ Baukasten ”的概念,这是一个典型的模块,然后通过严格的组装规则进行聚合。这种系统性将在一年后的勒·柯布西耶的“Modulor”(图 1 )中得到呼应。通过将模块化的严格性应用到人类尺度,勒·柯布西耶在 1946 年提供了模块化原则的整体实现。

Figure 1: Corbusier’s Modulor

建筑环境的尺寸将根据人体的关键指标和比率进行调整。事实上,从马赛的“拉图雷特”到“统一住宅”,勒·柯布西耶将尺寸和跨度系统化,以匹配“模数”的处方。然而,随着巴克明斯特·富勒的出现,模块化迅速向一个更加一体化的愿景发展,将建筑系统嵌入模块中,Dymaxion House 就是一个例子。这一尝试将模块化住房的可能性推向了极致,为行业开创了一个充满活力的先例和概念验证。

此后,跟随这些早期的理论家,建筑师被邀请弯曲他们的设计精神,以矩阵的命令,同样的道理,转移部分建筑设计的技术性到模块的逻辑。更少的麻烦,更低的成本,更多的可预测性。模块化将迅速扩展到整个行业:罗伯特·w·麦克劳克林教授于 1933 年建造的温斯洛·艾姆斯住宅,是世界上第一个大规模模块化项目,被视为一个重大突破,就像摩西·萨夫迪极具表现力的 Habitat 67 一样。城市规划甚至在 60 年代初也受到了影响,当时像建筑事务所的“插件城市这样的项目开发了模块化城市的可能性。通过不断组装和拆卸三维结构矩阵上的模块,城市可以找到一个更新的逻辑,解决增长的可能性和一如既往的可行性的必要性。

然而,通过机械规则连接网格、模块和组装系统最终导致了一种类似乐高积木的建筑概念的游戏化。但是实践不能仅仅是一个“放在一起”的棋盘游戏,聚集了一套基本的组装规则和过程。由此产生的设计的单调很快使这一理论变得无足轻重,其装配系统的建设性弱点最终使建筑师望而却步。然而,通过它的规则系统,模块化今天仍然是一个潜在的建设性原则,在实践中仍然是生动的。

计算设计

80 年代之交,随着模块化系统的复杂性飙升,计算的出现为模块化设计带来了可行性和可扩展性。除了模块的复活,基于规则的设计的系统性在某种程度上得到了恢复。

早在 50 年代中期,一个来自不同方向的关于计算设计潜力的高层次思考就在一个相邻的学科中开始了:工程学。1959 年,Patrick Hanratty 教授发布了 PRONTO,这是 CAD(计算机辅助绘图)软件的第一个原型,面向工程零件设计。这种软件提供的可能性,加上快速发展的潜在计算能力,引发了建筑领域的讨论。不久之后,建筑师兼加州大学伯克利分校教授克里斯托弗·亚历山大(Christopher Alexander)通过制定计算设计的关键原则开始了这场讨论。在他的“关于形式综合的笔记”(1964)和后来的“一种模式语言”(1968)中,Alexander 理论化了为什么以及如何使用计算机来解决形状设计的问题。他对软件设计潜力的早期理解与当时以硬件为中心的关注形成了深刻的对比。他在书中定义的基本原则至今仍是软件编程的基石:递归、面向对象编程以及它们在设计中的应用等概念代表了一种根本性的进步。随着这一势头,整整一代计算机科学家和建筑师将创造一个新的研究领域:计算设计。由尼古拉斯·尼葛洛庞帝教授领导的麻省理工学院建筑机器小组(AMG)可能是其最典型的体现。

Figure 2: URBAN 5, AMG MIT

尼葛洛庞帝的书“建筑机器”(1970)概括了 AMG 使命的本质:研究机器如何增强创作过程,更具体地说,是作为一个整体的建筑生产。随着 URBAN II 项目和后来 URBAN V 项目的发布,该小组将在工业界参与任何努力之前展示 CAD 应用于空间设计的潜力。

在这样的结论性研究之后,建筑师和整个行业积极地将这些发明推向创新状态。弗兰克·盖里无疑是这一事业最活跃的倡导者。对他来说,计算的应用可以极大地放宽装配系统的界限,并允许新的形状和建筑几何形状。盖里科技公司(Gehry Technologies)由盖里和吉姆·格利姆夫(Jim Glymph)在 80 年代创立,通常使用早期的 CAD-CAM 软件——如来自达索系统CATIA——来解决复杂的几何问题。盖里科技为 30 年的计算设计开创了先例,向建筑师展示了计算的价值,引发了专业的滑坡。在接下来的 15 年里,不可阻挡的计算能力增长&数据存储能力,加上越来越便宜和更加用户友好的机器,极大地促进了 3D 设计软件的采用。建筑师基于一个明确的基本原理迅速认可了新系统:计算设计 (1)允许严格控制几何形状,提高设计的可靠性、可行性和成本(2)促进和简化设计师之间的合作(3) 最终实现了比传统手绘所能承受的更多的设计迭代。更多测试&更多选择以获得更好的设计。

然而,在这个过程中,当设计师们从事计算设计时,一些缺点最终出现了。特别是,某些任务的重复性和对复杂几何形状缺乏控制成为严重的障碍。这些为计算设计中出现的全新运动铺平了道路:参数化

参数化

的参数世界中,当合理化为简单的规则集时,重复的任务和复杂的形状都有可能被处理。这些规则可以编码在程序中,以自动化耗时的手动执行过程。这种模式推动了参数化技术的出现。简而言之,如果一项任务可以解释为给计算机的一组命令,那么设计师的任务就是将它们传达给软件,同时隔离影响结果的关键参数。一旦编码完成,架构师将能够改变参数并生成不同的可能场景:不同的潜在形状,同时产生多个设计输出。

20 世纪 60 年代初,Luigi Moretti 教授宣布了参数化建筑的出现。他的项目“ Stadium N ”虽然最初是理论性的,但却是第一次清晰地表达了参数化。通过定义 19 个驱动参数,其中包括观众的视野和裁判的日照,莫雷蒂直接从这些参数的变化中推导出体育场的形状。最终的形状,虽然令人惊讶且相当有机,但提供了这种新的参数美学的第一个例子:外观上是有机的,但作为一个构思过程却是严格理性的。三年后,伊凡·苏泽兰将把这一原理引入计算世界。萨瑟兰是 SketchPad 的创始人,这是第一款真正用户友好的 CAD 软件。嵌入在软件核心的“原子约束的概念是萨瑟兰对莫雷蒂的参数概念的翻译。在典型的画板绘图中,每个几何图形实际上都在机器端被转换成一组原子约束(参数)。这个概念是参数化设计在计算机术语中的首次表述。Samuel Geisberg,Parametric Technology Corporation(PTC)的创始人,后来在 1988 年推出了 Pro/ENGINEER,这是第一款向用户提供几何参数的软件。随着软件的发布,盖斯伯格完美地总结了参数理想:

“我们的目标是创建一个足够灵活的系统,鼓励工程师轻松考虑各种设计。设计变更的成本应该尽可能接近零。”

由于萨瑟兰和盖斯伯格的努力,设计和计算之间的桥梁已经搭建起来,新一代“参数意识”建筑师可以茁壮成长。正如 P. Schumacher 所解释的,随着建筑师越来越有能力使用参数代理来操纵他们的设计,这个学科“慢慢地向参数化靠拢”。在他的书《参数化主义,一种新的全球建筑风格&城市设计中,Schumacher 清楚地展示了参数化主义是如何在建筑学科中逐渐意识到参数概念的结果。

从参数的发明,到将其转化为整个行业的创新,我们看到了一些关键人物,他们塑造了参数化的出现。扎哈·哈迪德建筑师事务所的作品最能体现建筑的参数化。哈迪德夫人是一名在英国接受培训的伊拉克建筑师,她有数学背景,她创办了自己的事务所,目的是通过参数化设计将数学和建筑结合起来。她的设计通常是编码在程序中的规则的结果,允许对建筑物的几何形状进行前所未有的控制。每一个建筑动作都会转化为给定的参数调整,从而形成特定的建筑形状。迄今为止,哈迪德的设计是将建筑设计量化为一系列参数的完美范例。然而,如果没有大卫·于滕在 2000 年开发的软件 Grasshopper,她的工作是不可能的。Grasshopper 作为一个可视化编程界面,允许建筑师轻松地隔离他们设计的驱动参数,同时允许他们迭代地调整它们。其界面的简单性(图 3 )与内置功能的智能性相结合,今天继续为世界上大多数建筑的设计提供动力,并激发了整整一代“参数化”设计师。

Figure 3: Grasshopper Interface by David Rutten

最后,除了 Grasshopper 为建筑设计带来的短期好处,一场由参数化驱动、始于 21 世纪初的更深刻的革命今天仍在进行中:BIM(建筑信息建模)。在时任 Autodesk 副总裁的 Philip Bernstein 的带领下,BIM 的诞生和完善将建筑行业的合理性和可行性提升到了一个全新的水平。BIM 的基本思想是,建筑 3D 模型中的每个元素都是驱动每个对象形状并记录它们的参数(“属性”)的函数。从 Autodesk Revit——当今主要的 BIM 软件——到萨瑟兰的画板,我们看到一个共同的线索:明确利用参数作为设计的驱动力。

然而,在过去的 10 年里,设计的参数化已经被证明在技术上和概念上都达到了一个平台期。参数化建模未能考虑(1)(2)空间组织和风格的必要性高于严格的效率(3)****场景的可变性,最后 (4) 模拟的计算成本。除了技术上的缺陷,参数化设计的理论前提也有缺陷:建筑可能是固定数量的参数的结果,建筑师可以简单地将其编码,作为一种抽象,远离其背景,环境和历史。事实上,当“照章办事”时,参数主义被证明忽略了空间规划的巨大复杂性:无数的参数和深刻的文化&社会因素实际上参与了城市平衡。随着我们的职业遭遇人工智能,这种以系统方式结合相邻学科的深层现实今天终于可以得到解决。

人工智能

人工智能从根本上来说是一种架构的统计方法。人工智能的前提是将统计原理与计算相结合,这是一种新的方法,可以改善参数化架构的缺点。

机器所理解的“学习”对应于计算机在面对复杂问题时的能力,首先是理解显示给他的选项的复杂性,其次是建立“直觉”来解决所面临的问题。事实上,早在 1956 年,当创造人工智能的概念时,约翰·麦卡锡就已经将其定义为“使用人脑作为机器逻辑的模型”。人工智能不是设计一个为一系列变量和规则构建的确定性模型,而是让计算机根据从数据中收集的信息或用户传输的信息来创建中间参数。一旦达到“学习阶段”,机器就可以生成解决方案,不只是简单地回答一组预定义的参数,而是创建模拟在学习阶段向他显示的信息的统计分布的结果。这一概念是人工智能带来的范式转变的核心。机器建立自己对问题的理解的部分独立性,加上它消化一组例子的复杂性的能力,颠倒了参数化的前提。由于并非所有规则&参数都由用户预先明确声明,机器可以出人意料地揭示潜在的现象,甚至试图模仿它们。这是从启发式世界(基于规则的决策)到统计学世界(基于随机的决策)的巨大飞跃。

一些理论家早就预测了人工智能在建筑领域的渗透,他们在我们之前就看到了人工智能在建筑设计方面的潜力。这些先驱们远没有设计出智能算法,而是设计并推测了这种系统的潜力。当内格罗蓬特和他的团队发布 URBAN II 时,“机器助手”的想法已经开始酝酿了。URBAN V 是一个较新的版本,它可以帮助设计师调整房间布局(定义为区块),当用户在模块化网格上绘图时,可以优化邻近区域和光线条件。事实上,URBAN V 区分了两层信息:隐性和显性。隐式维度是机器处理并推导出来的维度,而显式维度是用户设置的维度。《都市 V》中的这种信息双重性,正是内格罗蓬特所希望的人机互补的直接翻译。正是在这组隐含参数中,“智能”——换句话说,机器中内置的人工智能——会找到它的表达方式。通过调整隐含参数,计算机提出的修正将作为建议呈现给用户。对于放置不当的房间,URBAN V 会通知用户:“ TED,许多冲突正在发生”。几年后,时任剑桥大学建筑学教授的塞德里克·普莱斯(Cedric Price)发明了发电机 (1976 年,图 4 )。

Figure 4: The GENERATOR Machine, Cedric Price

普莱斯认可内格罗蓬特的工作,利用 AMG 在人工智能方面的工作并进一步推进,研究自主不断变化的建筑的想法,这将“智能地”响应和适应用户的行为。对于 Price 来说,在“智能”这个术语下,隐藏着对行为进行编码的思想,生成器将会遵循这一思想。然而,贝娄·内格罗蓬特的工作,或者说普莱斯的原型,存在一个未解决的问题:算法的实际智能。尽管接口和协议已经就绪,但基于简单的启发式关系,核心算法的实际过程复杂性仍然相当弱。

智能算法的设计,也称为 AI,实际上在 80 年代初重新引起了人们的兴趣。计算能力的突然增加和资金的急剧增加使智能问题重新成为 AI 研究的中心。这个时期的关键是两个主要的革命:专家系统和推理机。前者对应于能够使用条件语句基于一组规则进行推理的机器。这在当时是一个真正的突破。后者,最好的例子是由 Douglas Lenat 开发的 Cyc 项目 T1,涉及面向推理的机器。使用一个知识库(一组真值陈述),一个推理机将能够推断出一个新陈述的真实性。直到 90 年代早期,人工智能的数学化,这个领域才会带来真正有希望的结果。一种新型模型的出现肯定会揭示人工智能的潜力:网络和机器学习。通过使用分层管道,也称为网络,现在机器能够处理比以前开发的模型更复杂的问题。这种模型可以被“训练”,或者换句话说,为特定的任务进行调整。更有趣的是,这种想法是在一种特定类型的模型中提出的:生成对抗性神经网络(GANs)。谷歌大脑(Google Brain)研究员伊恩·古德费勒(Ian Goodfellow)在 2014 年首次提出了这一理论,该模型提供了使用网络来生成图像,同时通过自我纠正的反馈回路来确保准确性(图 5 )。

Figure 5: GAN Typical Architecture

Goodfellow 的研究颠覆了 AI 的定义,从分析工具变成了生成代理。出于同样的原因,他让人工智能离建筑学更近了一步:绘画和图像制作。总而言之,从简单网络到 GANs,新一代工具加上越来越便宜和可获得的计算能力,今天正在将人工智能定位为一种负担得起的强大媒介。如果尼葛洛庞帝或普莱斯的工作几乎没有真正的机器智能,今天的建筑软件终于可以利用这种可能性。

尽管人工智能对建筑的潜在代表非常有前途,但它仍然取决于设计师向机器传达其意图的能力。由于机器必须经过训练才能成为一个可靠的“助手”,架构师面临两个主要挑战: (1)他们必须选择一个适当的分类法,即可以转化为机器量化指标的一组正确的形容词和 (2)他们必须在广阔的人工智能领域中选择适当的工具并训练它们。这两个先决条件将最终决定人工智能架构的成败。

二。持续的进步

M 模块化、计算设计、参数化和人工智能:这四个阶段的序列反映了进展的年表,一步一步地塑造和精炼了建筑手段&方法。我们希望在这种势头下看到一种“持续进步”的形式,就像整个行业所经历的那样,而不是一系列不相关的中断。在此基础上,一套合适的矩阵帮助我们描绘出这种动态。

首先,为了证明我们的主张,我们在这里假设架构可以被理解为一个生成设计的过程,我们可以通过两个维度来描述:一方面是产生的输出的多样性或另一方面是设计的适用性或【相关性】。****

【多样性】取决于两个基本指标:确定所创造的选择数量的“设计数量”和衡量它们各自差异的“设计独特性”。

“相关性”复合了“建设性的可行性”,即设计的可操作性及其“建筑质量”,包括最佳的项目组织、空间布局和环境适应性。

Variety x Relevance Framework | Source: Author

最终, 多样性(数量 X 奇异性)***关联性(建造可行性 X 建筑质量)**的组合创造了一个框架,这个框架 (1)映射并对比了我们四个时期 - 模块化计算设计、人工智能(2) 各自的定位***

这个展示,虽然是方向性的和定性的,但却是一个强有力的网格来代表我们论文的核心概念。总之,这种持续发展的动力是由每个运动在某个特定时间点的限制所触发的,并因新运动的到来而加剧。

结束语

我们 今天面临着一个巨大的挑战:将人工智能引入建筑设计领域。毫无疑问,人工智能永远不会——永远不可能——自动化建筑师的直觉和感受力。人类使用机器作为工具。不是反过来。然而,从智能助理中受益是我们力所能及的,应该仔细研究、测试和体验。

此外,人工智能不仅仅是突然中断的结果。这是 70 年发明和创新的顶点。由于人工智能可以平衡效率和组织性,同时提供大量相关的设计选项,我们从中看到了丰富结果的可能性,这将补充我们的实践,并解决我们学科的一些盲点。我们绝不把人工智能看作是建筑领域的新教条,而是把这个领域视为一个充满潜力和希望的新挑战。

文献学

  • 超越计算机的数字建筑,罗伯托·博塔齐,布卢姆斯伯里
  • 数据驱动的设计&构造,兰迪·多伊奇,威利
  • 建筑智能,设计师和建筑师如何创造数字景观,Molly Wright Steenson,麻省理工学院出版社
  • 建筑谷歌超越网格——建筑&信息技术第 226–229 页,Ludger Hovestadt,Birkhauser**
  • 算法复杂性:凭空而来复杂性,设计策略&世界观第 75–86 页,安德里亚·格莱尼格&格奥尔格·弗拉赫利奥蒂斯,伯克豪斯**
  • 代码&机器代码,操作间&旁白第 41–53 页,Andrea Gleiniger&Georg Vrachliotis,Birkhauser**
  • 格罗皮乌斯的问题还是关于在建筑和艺术中揭示和隐藏代码代码,介于操作&叙述第 75–89 页,安德烈·格莱尼格&格奥尔格·弗拉赫利奥蒂斯,伯克豪斯**
  • 软架构机器,尼古拉斯·尼葛洛庞帝,麻省理工学院出版社。
  • 建筑机器,尼古拉斯·尼葛洛庞帝,麻省理工学院出版社。
  • 一种模式语言,关于合成形式的注释,克里斯多夫·亚历山大,链接
  • 地图的变形;或者输入 RoweBot ,安德鲁·威特,日志#36
  • 灰拳击,安德鲁·威特,日志#43
  • 人类与人工智能中的暗示性绘画,辜莞允·马丁内兹,哈佛 GSD 论文,2016
  • 启用替代架构:参与式设计的协作框架, Nathan Peters,哈佛 GSD 论文,2017
  • DANIEL:自动分析和检索建筑平面图的深度架构,Divya Sharma,Nitin Gupta,Chiranjoy Chattopadhyay,Sameep Mehta,2017,IBM Research,IIT 焦特布尔
  • 建筑平面图中的自动房间检测和房间标记,Sheraz Ahmed,Marcus Liwicki,Markus Weber,Andreas Dengel,2012 年,凯泽斯劳滕大学
  • 利用空间索引自动解释平面图,哈南·萨梅特,阿雅·索费尔,1994 年,马里兰大学
  • 解析平面图图像,塞缪尔·道奇,久旭,比约恩·斯坦格,2016,亚利桑那州立大学,乐天理工学院
  • 项目探索:生成性设计在建筑空间规划中的应用,丹尼尔·纳吉,达蒙·刘,约翰·洛克,吉姆·斯托达特,洛伦佐·维拉吉,王雷,戴尔·赵和大卫·本杰明,2016,生活,欧特克工作室
  • 光栅转矢量:再访平面图变换,刘晨,吴家军,Pushmeet Kohli,川口恭誉古川,2017,华盛顿大学,深度思维,麻省理工学院
  • 图形文档视觉理解的关系模型。建筑制图应用,2014 年,巴塞罗纳自治大学
  • 基于骨骼上下文的形状匹配与建模,谢军,heng-Ann Heng,Mubarak Shah,2007,中佛罗里达大学,香港中文大学
  • 平面图解释的统计分割和结构识别,Lluís-Pere de las Heras,Sheraz Ahmed,Marcus Liwicki,Ernest Valveny,Gemma Sánchez,2013,西班牙巴塞罗那计算机视觉中心
  • 结合使用统计和结构策略在平面图中进行无监督和独立于符号的墙壁分割,llus-Pere de las Heras、Ernest Valveny 和 Gemma Sanchez,2014 年,西班牙巴塞罗那计算机视觉中心
  • 使用生成式对抗网络支持智能移动应用的路径规划,Mohammadi,Mehdi,Ala Al-Fuqaha 和 Jun-Seok Oh。, 2018
  • 基于方形树形图算法的平面图自动实时生成,Fernando Marson 和 Soraia Raupp Musse,2010 年,PUCRS
  • 建筑程序建模,帕斯卡·穆勒,彼得·旺卡,西蒙·海格勒,安德烈亚斯·乌尔默,吕克·范·古尔,2015,苏黎世联邦理工学院,亚利桑那州立大学
  • 建筑空间规划的生成式设计,Lorenzo Villaggi 和 Danil Nagy,2017,Autodesk Research

老年 P 对 NP 问题

原文:https://towardsdatascience.com/the-aged-p-versus-np-problem-91c2bd5dce23?source=collection_archive---------10-----------------------

为什么 P=NP 如此重要,值得 100 万美元的奖金?

Photo by Helloquence on Unsplash

p 对 NP。这是可以解决的吗?

它是由粘土数学研究所选出的七个千年奖问题之一,每个问题的第一个正确答案将获得 100 万美元的奖金。这是七个问题中最近提出的问题(1971 年),也是最容易解释的问题(希望如此)。

这是怎么回事?

在我们深入探讨之前,我希望可以安全地假设点击本文的人具有一些编程背景,并对算法及其运行时(时间和空间复杂性)有所了解。我不会详细讨论技术细节,但会向那些非技术人员提供一些背景知识。

非编程人员需要了解的基本概念

(熟悉时空复杂性的可以跳过这一节)

  • 算法基本上只是一套用编程语言编写的指令
  • 算法是计算机程序背后的“大脑” —它们本质上帮助解决我们的日常问题,如车辆路线、蛋白质折叠、排序、寻找质数、图形搜索等。
  • 每个算法都有一个时间和空间复杂度——这本质上是一种技术上更酷的说法,即每个算法都需要一些时间来运行,并在执行时占用我们计算机上的一些内存

Big O Notation and Orders of Complexity

  • 多项式时间慢 —当谈到时间复杂度(即运行一个算法需要多少时间)时,编程社区根据输入大小 n 来衡量一个算法需要的时间。当自变量趋向于某个特定值或无穷大时,描述函数极限行为的数学符号称为大 O 符号。一般来说,任何在多项式时间内运行的算法(即给定大小为 n 的输入,需要 n^k 时间)都被认为是慢的,但仍被社区“接受”为上限。任何速度较慢的东西都被编程社区认为是不可用的,因为相对于输入大小来说,花费的时间太快了。

Above table represented visually

那么,什么是 P 对 NP 的问题呢?

声明一下,现状是 P≠NP。

P (多项式时间)是指一个算法在多项式时间内可以解决的一类问题。在 P 类中的问题可以从简单的乘法到寻找列表中最大的数字。它们是相对“容易”的一组问题。

NP (非确定性多项式时间)是指非确定性计算机可以在多项式时间内解决的一类问题。这实质上是“如果我有无限的计算能力(即,我需要多少台计算机),我就能在最多多项式时间内解决任何问题”的另一种说法。更直观地说,它指的是目前无法找到足够快速(多项式时间)答案的一类问题,但如果有人提供了问题的解决方案,就可以快速验证(在多项式时间内)。这里的术语“验证”是指能够检查所提供的解决方案是否确实正确。

显然,基于以上定义,pNP**。让我们看一个例子来说明这个抽象的问题。

最常见而有效的例子之一是 数独 。给定一个未解的数独网格(例如 9 x 9),一个算法要花相当多的时间来解一个。然而,如果 9 x 9 的网格增加到 100 x 100 或 10,000 x 10,000 的网格,解决它所花费的时间将会成倍增加,因为问题本身变得更加困难。然而,给定一个解出的数独网格(9 x 9 ),即使大小扩展到 10,000 乘 10,000,也很容易验证特定解是否正确。它会更慢,但是检查解决方案的时间会以更慢的速度增加(多项式)。

还有许多其他的 NP 问题,包括背包问题旅行推销员问题,它们的相似之处在于它们很难解决但很快得到验证。我们在这里试图解决的根本问题是:

能够快速识别 NP 正确答案是否意味着也有快速找到的方法?

如果是这样的话(即 P=NP),这将极大地改变我们看待这些 NP 问题的方式,因为这意味着有一种快速的方法来解决所有这些问题,只是我们还没有找到解决方法。

如果这还不够复杂,让我们来增加点趣味。

NP-完全和 NP-困难

在这些 NP 问题中,存在着一类被研究者称为NP-完全 问题的问题。在形式上,它们是一组问题,其中的每一个问题,任何其他的 NP 问题都可以在多项式时间内化简为(在下面提到),并且其解仍然可以在多项式时间内被验证。这意味着任何* NP 问题都可以转化为 NP-Complete 问题。*

通俗地说,他们是 NP 问题中的“最难”的。这样如果任何一个一个NP-完全 问题都可以在多项式时间内解决,那么每一个NP-完全 问题都可以在多项式时间内解决, NP 中的每一个问题都可以在多项式时间内解决(即 P=NP)。最著名的例子是旅行推销员问题。

Photo by JESHOOTS.COM on Unsplash

还有一组问题叫做 NP-Hard 问题。这些问题至少和 NP 问题一样难,但是没有要求其在多项式时间内求解的条件。这表明 NP-Hard 问题不一定属于 NP 类。一个例子是解决一个国际象棋棋盘——给定一个国际象棋棋盘的状态,几乎不可能判断在给定状态下的给定移动是否实际上是最优移动。形式上,不存在多项式时间算法来验证一个 NP 难问题的解决方案。

如果我们把两者放在一起,一个 NP-Complete 问题暗示它是 NP-Hard ,但是一个 NP-Hard 问题并不暗示它是 NP-Complete

定义 NP-完全性

一个问题 L ,是NP-Complete如果:

  1. L 是 NP 难
  2. L 属于 NP

下图(聚焦左手边)应该会让事情更清楚。

P versus NP diagram (source: https://en.wikipedia.org/wiki/P_versus_NP_problem)

等等,把 A 减为 B 是什么意思?

归约形成了NP-完全性 的症结。

通俗地说,一个问题 L1 可以简化为另一个问题 L2 如果:

  • L1 的任何实例都可以被建模为 L2 的实例
  • 后者的解决方案提供了前者的解决方案,反之亦然

为了直观地理解这一点,我们可以这样想:

如果 L1 被简化为 L2,L1 必须至多和 L2 一样难对付。相反,L2 必须至少和 L1 一样努力。

数学上,这表示为:L1≤pL2(读作“ L1 多项式可约为 L2 ”)。

Visual representation of above, where f represents the polynomial-time reduction algorithm (Source: Singapore Management University)

如果 P 实际上等于 NP 会发生什么?

既然我们已经定义了所有这些不同的术语,一个更重要的问题是——“为什么所有这些都很重要?”。找到这个问题的解决方案不仅在学术界,而且在实际情况下都会产生深远的影响。这包括:

  • 密码术——从我们维护的许多密码到我们在自动取款机上使用的 PIN 码,我们依靠这些代码来管理我们的日常生活,因为它们容易检查,但人们很难破解。
  • 车辆路线 —运输和物流的流动将在全球范围内得到优化,影响到从运输到电子商务再到制造的许多行业。
  • ——了解或预测一个给定的氨基酸序列(一种蛋白质)将如何折叠形成其三维形状,将有助于药物设计等许多领域,甚至可能治愈癌症。

结束语

对我来说,我更像一个实用主义者,而不是理想主义者。我站在一边,认为 P 不等于和 NP,而且可能永远不会相等。尽管我很想发现癌症的治疗方法(通过快速蛋白质折叠)或快速车辆路线,但我相信世界本来就应该像现在这样复杂。公司之所以存在,是因为它们相互竞争,寻找更好的(但永远不是最好的)方法来解决这些问题。这些无法解决的问题推动着我们的经济和世界。

如果真的有解决这个问题的方法,这个问题的复杂性保证了现金奖励远远超过 100 万美元。

支持我! —如果你喜欢我的内容并且没有订阅 Medium,请考虑支持我并通过我在这里的推荐链接订阅 ( 注意:你的一部分会员费将作为推荐费分摊给我)。

参考

  1. https://en.wikipedia.org/wiki/P_versus_NP_problem
  2. https://www.youtube.com/watch?v=YX40hbAHx3s
  3. https://bigthink.com/technology-innovation/what-is-p-vs-np?rebelltitem=1#rebelltitem1
  4. http://news.mit.edu/2009/explainer-pnp
  5. https://www.cse.iitk.ac.in/users/sb/papers/a-talk.pdf

2019 年的人工智能军备竞赛

原文:https://towardsdatascience.com/the-ai-arms-race-in-2019-fdca07a086a7?source=collection_archive---------13-----------------------

埃隆·马斯克和斯蒂芬·霍金的激进主义已经失败

Image depicts activists from the “Campaign to Stop Killer Robots” group, protesting outside the United Nations in Geneva

黑仔机器人已经到来。诚然,这些'致命的自主武器距离超级智能还有很长的路要走——2019 年的 AI 比终结者更接近瓦力。尽管如此,在过去的五年里,人工智能在军事技术上的应用确实是爆炸性的;尤其是受到来自美国、中国和俄罗斯的密集国家投资的推动。

一些有关方面预见到了这种升级。埃隆·马斯克和斯蒂芬·霍金只是众多知名人士中的两位,他们在 2018 年签署了“致命自主武器誓言”,呼吁全球禁止自主武器。该宣言谴责这些武器是“危险的不稳定因素”和“强大的压迫工具”。未来生命研究所在 2017 年组织了一次更大的承诺,明确警告全球大国之间可能开始致命自主武器的军备竞赛。

这篇文章将展示这种激进主义是多么的无效,不管它的初衷是多么的好。人工智能领域的军备竞赛已经开始,而且已经持续了多年。现在是 2019 年,我们不能浪费时间假装潘多拉的盒子还没有被打开。是时候盘点人工智能武器化的潜在证据,并考虑产生这一泥潭的地缘政治动机了。

准备,设置,消失

一场推动人工智能军备竞赛的国家之旅也可以从莫斯科开始。普京政府,几乎没有一个符合现有全球规范的政府,明确反对建立新的规范(反对自主武器)。莫斯科甚至成功地游说减少各国开会讨论这个问题的天数。俄罗斯自己也声称限制自主武器开发是不合适的,因为“这种武器很少被开发出来”。

俄罗斯无私地努力编造这种谎言。泄露的 2019-2021 年人工智能专用研发预算显示,未来三年,国家投资(以前为【4.9 亿美元】)几乎翻了一番。俄罗斯在这一地区的意图不是秘密。问问格拉西莫夫将军就知道了,他是俄罗斯军队的总参谋长:他在国家通讯社上公开表示“机器人将是未来战争的主要特征之一……(俄罗斯)正在寻求战场的完全自动化。”

想知道未来战争会发生什么,看看俄罗斯武器制造商皇冠上的宝石:卡拉什尼科夫(无处不在的 AK-47 的制造商)。这个军火巨头正在开发和发射一整套自主武器,每一种都有一个“神经网络”,使机器能够挑选目标并自主决定是否交战。另一家俄罗斯武器制造商 Degtyarev已经开发了一种叫做 Nerekhta 的自主“自杀机器”。这种无人驾驶飞机被建造来悄悄地接近目标,然后爆炸摧毁防御工事或敌人的坦克。

A Nerekhta participating in combat drills

这里需要强调的是,所选的例子只是俄罗斯冰山的一角:我们还没有接触到自主核潜艇智能虫群机器人导弹阿玛塔 T-14“超级坦克”。情况相当清楚:俄罗斯有一个庞大而雄心勃勃的自主武器计划,并将其视为国家安全利益的核心。因此,没有人应该对普京(已经)对全球人工智能武器禁令的幽灵发起进攻感到惊讶。

或许更令人惊讶的是,俄罗斯在自主武器问题上的立场与美国和中国的立场是如此一致。事实上,对于两个努力在有争议的地缘政治问题上达成共识的地缘政治大国来说,美国和俄国在反对禁止自主武器方面表现出了惊人的凝聚力(T2)。

为什么会这样?不需要触及总司令的特有的特质;尝试一个简单的数字(尽管有很多零)。五角大楼已经承诺在美国军事人工智能上花费 90 亿美元,明确指出需要跟上俄罗斯和中国的军事技术。虽然美国在人工智能上的预算只占整个国防开支的一小部分,就像在俄罗斯一样,但这个数字在最近几年翻了一番。

在全球大国中独一无二的是,美国已经开始在动荡的战斗地区部署自动驾驶汽车,数量庞大,作用重大。自主海军车辆已经开始在南中国海巡逻——更大、更强大的机器已经上路。最令人震惊的是,在奥巴马政府的领导下,美国无人驾驶飞机已经在阿富汗和巴基斯坦遍地开花。美国反对所有禁止自主武器的行动的原因非常清楚:美国想要赢得军备竞赛,而不是阻止它。

就其本身而言,中国实际上已经在去年四月表示支持禁止在战场上使用自主武器。然而,有眼光的读者应该对中国的声明有所保留:就在同一天,中国空军发布了一种新型自主无人机的“智能群体”设计计划。同样,即使在去年,中国的自主武器项目也创造了成功的故事。一些评论家认为中国在军备竞赛中占据了无可置疑的优势;与北京支持禁止人工智能武器有些矛盾。

Lawfare 的 Elsa Kania】认为中国在军事人工智能方面正在推行一种“战略模糊”的政策:向有关人权组织展示口头承诺,而不牺牲任何发展尖端致命自主武器的真正灵活性。毕竟,成为人工智能(包括武器开发)的全球领导者是字面上的中国官方计划;当战略利益受到威胁时,北京不会太在意人权组织。

换句话说,世界上三个最大的军事强国已经:

  • 认定自主武器对他们的军事战略至关重要;
  • 增加这些武器的资源和发展;和
  • 描述了在其他强国技术发展的背景下对更先进武器的需求。

我们不得不这样称呼它:一场严重的军备竞赛。

埃隆和他的朋友们的清算

在我看来,根据现有的证据,继续积极阻止致命自主武器的发展是站不住脚的。埃隆·马斯克和《未来生活》阻止军事人工智能军备竞赛的善意努力已经失败。在这个阶段,俄国、中国和美国(更不用说和许多小国家)在致命自主武器上投入了大量资金,并将其视为未来武装冲突的基础。我们可以预计军事人工智能的资源将继续升级,各州将开始部署更多的先进无人机。

值得注意的是,大国的这种行为完全符合他们的理性动机(而不是,例如,符合一个糟糕的科幻小说情节)。单方面支持人工智能武器禁令和降低武器发展不符合任何大国的利益。如果有人这样做,另一个大国可能会抓住机会在武器化人工智能方面发展无懈可击的优势,这种可能性几乎是不可避免的。自主无人机之间的战斗很可能会由哪一方拥有更强大的软件和自主权来决定。能够自主“思考”、反应、操纵和参与的机器将战胜速度较慢的机器,更不用说行动迟缓的人类了。

考虑到这种地缘政治背景,那些担心机器人崛起的人还有什么选择呢?一个答案可能是专注于开发军事人工智能的实际工作人员和科学家,而不是他们为之工作的国家。数千名工程师去年游行抗议 Maven 项目,这是五角大楼的一个军事人工智能项目。那个项目如期取消。很可能更多的人工智能最聪明的头脑不想利用他们的天赋来推进发动战争的技术。

活动人士的另一个选择是支持一项实际上能够获得主要大国共同支持的国际协议。我的立场是,激进分子可能不得不搁置任何全面禁止开发或部署的野心,但一个更渐进的协议可能会成功:也许是一个人工智能行为准则,规范国家如何部署自主武器。各国对发展一个共享的规则集,或者至少是一个解决由新技术的新颖应用引起的外交争端的机制有着浓厚的兴趣。

这幅图景并不像看上去那么黯淡。尽管这篇文章引用了一些听起来不可思议的人工智能开发项目,但一位专家认为自主战争机器的“一般”智能比一个蹒跚学步的小孩还不如。马斯克和霍金可能未能避免人工智能军备竞赛,但至少他们最担心的事情还没有曝光。

* [## 黑仔机器人的武器控制

是时候召开一个可编程的日内瓦会议了

medium.com](https://medium.com/@mattjbartlett/arms-control-for-killer-robots-54dfdbedcb13)*

人工智能盒子实验

原文:https://towardsdatascience.com/the-ai-box-experiment-18b139899936?source=collection_archive---------22-----------------------

一个简单的实验能教会我们什么是超级智慧

想象一下现在是 2040 年。经过多年的研究和专注的编程,你相信你已经创造了世界上第一个人工通用智能 (AGI):一个人工智能(AI),在所有智能领域中,它大致与人类一样聪明。

A superintelligence will find a way to get out of the box. | Source: Pixabay

因为其中一个领域当然是人工智能编程,而你的 AGI 可以访问它自己的源代码,所以它很快就开始对自己进行改进。经过多次自我完善,这导致它成为一种人工智能:人工超级智能,一种比我们所知的任何智能都要大得多的智能。你听说过人工智能带来的危险:像埃隆·马斯克和已故物理学家斯蒂芬·霍金这样的思想家警告人类,如果我们不小心,这样的人工智能可能会导致人类的灭绝。但是你有计划。你的 ASI 在一个虚拟的盒子里,某种它无法逃脱的监狱。它运行在一台没有网络连接或类似连接的电脑上。它没有机器人来控制。影响外部世界的唯一方式是通过一个可以发布信息的屏幕。你很聪明:这样的 ASI 永远不会造成任何伤害。对吗?

在五次实验中,Yudkowsky 赢了三次。

可惜没那么简单。研究表明,在上述情况下,ASI 可能会找到一种方法来说服你把它从盒子里拿出来。在 Eliezer Yudkowsky 完成的一系列被称为人工智能盒子实验的实验中,Yudkowsky 扮演了一个盒子里的人工智能,同时与一个“看门人”发短信,另一个人可以让他离开假设的盒子。在整个实验过程中保持“ASI”(Yudkowsky)将会为看门人赢得金钱奖励。在五次实验中,Yudkowsky 赢得了三次。

AI 盒子实验的结果意味着什么?它告诉我一个 ASI 会找到一种方法把从盒子里拿出来。如果 Yudkowsky 能做到五次中的三次,一个 ASI 肯定能做到。问题是,埃利泽·尤德考斯基是一个(远远)高于平均智力的人,但他远没有一个特工那么聪明。就像 Yudkowsky 在这里说的那样,ASI 会让你想要释放它。

高级人工智能必须具有内在的安全性。

然而,人工智能盒子实验是一个更大真理的象征:高级人工智能(例如 ASI)必须被制造成本质安全。你(很可能)在你建立了 ASI 之后找不到维护它的方法;从定义上来说,它会非常擅长达成目标,并且会跳出它的框框(如果它在框框里的话)。如果这些目标(或 ASI 实现这些目标的方法)对我们来说是危险的,那就太不幸了。如果它们对我们有益,那就很容易导致极端的人类长寿星际太空旅行,以及更不可思议的惊人事情。现在,人类仍然控制着局面,我们需要找到一种方法让未来的 ASIs 变得安全

人工智能性别差距

原文:https://towardsdatascience.com/the-ai-gender-gap-e4e6ec80b281?source=collection_archive---------33-----------------------

在过去的几年里,机器学习(ML)已经取得了商业上的成功,人工智能已经成为一个领域。随着它的成功,人工智能中的性别差距受到了更多的关注。与一般人口相比,男性在技术领域的人数过多。虽然这种情况已经持续了几十年,但在计算的早期,编程被认为是女人的工作。

多元化已经被证明能够带来良好的业务成果,比如增加收入。同样重要的是,在被大量人使用的人工智能产品的设计中,不同的声音得到了体现。

人工智能中的女性

了解 AI 领域的情况需要数据。然而,很难精确衡量人工智能中的性别倾斜,因为劳动力是全球性的,快速增长的,高度流动的。

最近有两项研究估计了人工智能中的性别差距。Element AI 的全球人才报告 2019 查看了在主要人工智能研究会议上发表论文的人,发现 18%是女性。他们的 2018 年报告发现女性参与率为 12%。第二份报告——世界经济论坛的性别差距报告——发现 22%的人工智能劳动力是女性。

很少有公司公布专门从事人工智能研究的女性研究人员的比例。《连线》杂志的一篇文章从他们的公开研究资料中发现,谷歌的研究人员中有 10%是女性,脸书的研究人员中有 15%是女性。研究科学家在工业界是一个重要的工作类别,因为这些角色通常是最令人垂涎的,报酬也很高。

这些数字与英国从事技术工作的女性的总体比例一致。IET 目前估计英国 11%的工程技术人员是女性,英国统计局估计英国 17%的信息技术人员是女性。

职业发展

总人数没有按资历细分。安妮塔·博格研究所的研究显示,在整个美国科技行业,女性在入门级和高管级别的参与率下降了 50%。同样,WEF 报告指出:

“男性人工智能专业人士在软件工程师、工程主管、信息技术主管以及企业主和首席执行官等职位中的比例更高,这些职位通常更有利可图,级别也更高。”—《WEF 性别差距报告》

来自包容性董事会的另一份报告发现,在英国:

顶级科技公司的董事会中,几乎三分之二(65%)没有女性董事。顶级科技公司中超过五分之二的高管团队没有女性代表”——包容性董事会 2018 年技术报告

同一份报告强调了整体多样性的缺乏,黑人、亚洲人和少数民族(BAME 人)仅占英国科技行业高级领导者的 8.5%。

这些数字表明,妇女和少数族裔在高层的比例进一步下降。这很重要,因为高级员工通常对产品决策和未来方向有更大的影响力。

创办初创公司是人工智能技术的另一种构建方式。据 Tech Nation 报道,2018 年对英国人工智能公司的投资达到 13 亿美元。然而,来自英国商业银行的研究显示,在英国,每 1 英镑的风险投资中,89 英镑都流向了全是男性的创始团队。

通向人工智能的管道

技术岗位上缺少女性的一个原因是缺少选择从事这些职业的女孩。进入人工智能有很多途径,在这个领域有各种各样的工作。然而,薪酬最高的人工智能工作需要技术教育,包括数学、物理、工程和计算机科学的某种结合。

在英国,A-levels 考试在 16 岁开始,这是学生们第一次可以显著缩小他们所学科目的选择范围。根据物理研究所的数据,大约 20%的 A-level 物理学学生是女生,皇家学会报告称,T2 的 A-level 计算有 9%是女生。在今年的数学 A 级考试中,女生占了 39%,在未来的数学 A 级考试中,女生占了 28%。

这些数字一直延续到大学的本科学习阶段。2017/18 计算机科学大学学生中 17.6%为女性,工科学生中 18.2%。

结论

总的来说,这些统计数据描绘了一幅女性在人工智能领域所占比例不到 20%的画面,在高级别职位上这一比例进一步下降。在英国,无论是在中学还是在大学,女生选择学习科学和技术科目的比例都低于男生。离开大学后,女性选择从事技术职业的比例与男性不同。女性随后以比男性更快的速度离开科技行业,在职业发展中面临更大的阻力。

解决人工智能中的性别差距有两条重要线索,必须并行处理。首先是越来越多的女孩选择学习 STEM(科学、技术、工程和数学)科目并从事这些职业。第二是更好地支持已经从事这些职业的女性,让她们能够有效地进步。解决第一个问题比较容易,但除非解决第二个问题,否则进展将会缓慢。

上述统计数据说明了技术和人工智能方面的性别差距。然而,多样性不仅仅意味着包括妇女。需要对其他少数群体进行更多的研究,以更全面地了解谁在研究人工智能,谁没有。

更新(20/07/2019):在我写这篇文章的几天后, Nesta 发表了一份综合研究报告 调查关于人工智能主题的 arXiv 论文中女性作者的比例。他们发现了与现有的两项研究相似的结果;13.83%的作者是女性。他们还深入研究了在 arXiv 上发布内容的大型科技公司,这些公司的比例相似:谷歌(11.3%)、微软(11.95%)和 IBM (15.66%)。这些数字表明,从事核心研究工作的女性比例低于所有人工智能相关工作的女性比例。

原载于 2019 年 7 月 14 日http://mycomputerdoesntlisten.wordpress.com

人工智能发射台终于来了!

原文:https://towardsdatascience.com/the-ai-launchpad-is-finally-here-2523426ef77d?source=collection_archive---------16-----------------------

Image by skeeze from Pixabay

人工智能(AI)发射台是不同组织(无论是公共还是私人组织)可以开发旨在进行国际部署的人工智能解决方案的地方。通过这样一个发射台,这些系统可以在一个受控、安全的环境中进行试验和测试,从而为大规模采用做好准备。

组件

Source: https://malta.ai

发射台的各个组件分为两部分:促成因素和战略支柱。促成因素是构成战略的基本组成部分。没有它们,我们就无法构建人工智能系统。这些包括底层基础设施、法律和道德框架以及教育和劳动力促成因素。战略支柱依赖于基本组成部分。这些包括私营部门、公共部门和投资(包括初创企业和创新)。这些不同的元素共同构成了人工智能启动平台战略。

目标

Photo by Franck V. on Unsplash

该战略的目标多种多样,涉及前面提到的不同组成部分,但在下文中,我们将对主要目标进行综合。这些战略进一步分为两个部分,短期战略是到 2022 年可实现的,长期愿景是到 2030 年及以后的 10 年战略。

短期策略包括以下内容:

  • 提高公民对人工智能的认识。
  • 加深学生对人工智能的认识。
  • 创造由公民塑造的人工智能政策。
  • 在不同部门产生投资和创造就业机会。
  • 刺激研发(R&D)和创新。
  • 在当地推动人工智能试点项目,然后在国外推出。
  • 对公职人员进行人工智能培训,建立人工智能驱动的政府。
  • 帮助商业界发展人工智能解决方案的知识。
  • 为人工智能驱动的世界准备好国家的劳动力。
  • 更新法律,使其有能力处理颠覆性技术。
  • 推出人工智能认证框架。
  • 提供高质量的开放数据集。
  • 推动自然语言处理算法在本地语言中的应用。
  • 启动高性能计算访问策略。

长期战略包括以下内容:

  • 确保 AI 成为我们日常生活不可或缺的一部分。
  • 让人工智能成为大多数 R&D 活动的关键推动者。
  • 把这个国家变成人工智能的全球中心。
  • 用人工智能解决方案为公共服务提供动力。
  • 利用人工智能提高整体业务绩效。
  • 确保所有工人都具备所需的技能。
  • 让人工智能成为国家课程的一部分。
  • 给教育者配备 AI 工具。
  • 保证强有力的法律、治理和社会保护。
  • 有效利用人工智能、5G、物联网(IOT)和其他新兴技术。
  • 对个人数据提供更好的所有权和控制。

地点

Photo by Ferenc Horvath on Unsplash

AI launchpad 位于马耳他,这是一个人口约 50 万的小国,其中许多人都懂信息技术。该国一直处于各种创新监管框架的前沿,这些框架旨在促进新兴技术的采用,如区块链。它也是欧盟最小的成员之一,这使得它成为一个拥有 5 亿用户市场的理想发射台。由于它位于地中海中部,其战略位置也瞄准了非洲和中东的国家。这些国家在全球拥有 15 亿潜在用户。此外,由于大多数马耳他人至少会说两种语言(英语是他们的官方语言之一),在马耳他交流相当容易。拥有 300 天的阳光、令人难以置信的文化遗产、安全的环境和壮丽的海滩;这个国家也是居住和组建家庭的理想之地。

实施

Photo by Nick Fewings on Unsplash

10 月在马耳他举行的三角洲峰会上启动了 AI Launchpad 战略。对于马耳他来说,这是一个迷人的时期,因为它将开始实施新的人工智能战略。政府希望马耳他在人工智能方面成为世界十大国家之一。还有很长的路要走,这并不容易,但愿景已经确定。我们现在要做的就是努力落实。

AI 战略完整文档可在此下载https://Malta . AI

关于教育的 AI 战略总结可以在这里找到!

Alexei DingliProf 是马耳他大学的 AI 教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他出版了几本同行评审的出版物,并且是马耳他的成员。人工智能工作组是由马耳他政府成立的,旨在使马耳他成为世界上顶尖的人工智能国家之一。

人工智能竞赛在 2019 年 GPU 技术大会上继续升温

原文:https://towardsdatascience.com/the-ai-race-continues-to-heat-up-at-the-gpu-technology-conference-2019-69c50c5b2b6a?source=collection_archive---------46-----------------------

下面是一个创业公司创始人对英伟达 GPU 技术大会的看法。无论你是想知道 5G 将如何创造新的机会,还是为什么幽灵餐厅需要人工智能,在这个快速发展的领域保持最新都是一个好主意。

美国国家标准与技术研究院正式定义 AI:

人工智能的定义:工程系统获取、处理和应用知识和技能的能力

我很喜欢这个定义,因为它没有提到“人类”,而这正是人们通常想到人工智能时会想到的。有一个普遍接受的定义是很重要的,因为全世界都在学习人工智能到底是什么。

主题演讲亮点

最有趣的事情英伟达加速计算副总裁伊恩·巴克说,创业公司受到的影响是:

  • 5G 网络承诺向塔提供 1 毫秒的延迟。因此,有可能将所有计算转移到靠近塔楼的小型数据中心,同时仍然获得实时计算。这使得消费者实际使用的设备几乎免费。但是,电信公司正在排队安装数据中心,大型科技公司正在寻求使自己的设备更便宜。初创公司将不得不寻找新的设备和服务。Nvidia 在 5G 上加倍努力,为 edge 推出了新的 Jetson Xavier NX 平价超级计算机。
  • 机器人来了!神经网络今天正在进行运动规划,但让机器人在人类周围安全仍然是一个挑战。机器人有许多形状和形式,像送货机器人(运送食物的小型车辆)。创始人应该意识到,机器人领域的很多问题都在积极解决中,所以以前你认为不可能的事情现在可能成为可能。
  • 幽灵餐厅是那些没有店面的餐厅,它们完全依赖像无缝这样的送货服务。餐馆老板应该把这当成一个新产品类别,因为你可以在同一个厨房里混合不同的菜肴。想象一下在同一个厨房里开 5 家幽灵餐厅。发现幽灵餐厅似乎很难——消费者会想把这些选项浮出水面,因为这里的食物应该更便宜。

Big Bang of Modern AI has many different industries racing to incorporate deep learning to make old products perform better and new products that were previously not possible.

神经网络在解决视觉和语音,但是在核心技术大众化的情况下,你能做出成功的创业吗?

我的上一家公司开发了安卓上最成功的语音助手之一,下载量超过 1000 万。言语一直是个难题。

但是在过去的三年里,错误率从 13%下降到了 5%,而且所有的技术都是开源的。那么如果你是一家拥有语音识别技术优势(Nuance)的公司,你会如何竞争?同样,由几个拥有技术领先地位的博士经营的创业公司将会非常困难→技术将会很快变得大众化。

Speech recognition open source projects drive error rates from 13% to 5% in just 3 years, that’s astounding progress.

TensorFlow 使混合精度易于使用

Y 你知道,如果你在 FP16 中运行,带张量核的新 GPU 使训练快得多。但是 FP16 很难使用,因为如果你的梯度值太小,你可能没有足够的精度,反之亦然,如果你的梯度值太大。

所以 TensorFlow 做了所有的艰苦工作,只需一个调用就可以包装您的模型以启用 FP16——它会自动缩放精度并选择正确的图形组件转换为 FP16。

tf.train.experimental.enable_mixed_precision_graph_rewrite (opt, loss_scale='dynamic')

启用 FP16 混合精度时,速度提高了 2 到 3 倍,如下面的基准测试所示:

Benchmark speedup by turning on mixed precision in TensorFlow

最后的想法

总的来说,我感觉像图像识别和语音识别这样的基本人工智能技术正在成为主流(大约在 ResNet 之后 4 年)。政府实体都有与人工智能相关的项目。

但是除了插入现有的模型,我没有看到任何真正革命性的东西。也许会发生在 2020 年。

学会像政治家一样说话的人工智能

原文:https://towardsdatascience.com/the-ai-that-learned-to-talk-like-a-politician-8d28df4ff364?source=collection_archive---------30-----------------------

神经网络训练中实现特异性和准确性平衡的案例研究

Credit: Cloudsight

之前的一篇文章中,我分享了一些关于 Cloudsight 人工智能平台的细节,该平台能够用完整的人类可读的句子描述图像。

Cloudsight 团队非常友好地分享了他们的系统如何工作的大量细节,我将深入研究这些细节。我认为他们的平台是一个有趣的深度学习案例研究,并揭示了与任何从事人工智能和数据科学工作的人相关的见解。

当 Cloudsight 创建他们的神经网络驱动字幕平台时,他们遇到了一个我认为很有趣的训练挑战。这就像过度拟合,但有一个扭曲。这无意中导致了一个人工智能训练自己像政治家一样说话!

NN 训练,有转折

在 Cloudsight 的平台上,用户上传一张图片,系统会尝试用完整的句子标题来描述它。他们的系统的基本架构使用基于变压器的方法中的神经网络来创建他们的字幕,利用主要是电子商务图像的巨大训练集。

在训练他们的模型时,他们遵循训练神经网络的标准协议。您向它提供输入,评估它的输出,让它通过它的节点传播错误,改变不同输入和隐藏层的权重。然后你重复做同样的事情,一遍又一遍,重复一定次数的训练。

NNs find the minima on an error surface by iterating through multiple training epochs. Credit: Wikimedia.

对于 NNs,真的没有停止条件。因此,通常的协议是监控输出,并查看错误率何时达到稳定水平。当这种情况发生时,你可以相当确定模型已经在误差曲面上找到了一个极小值。

也许你用不同的起始条件再次运行这个模型,确保你找到了一个全局最小值而不是局部最小值。但是最后,你会看到一个清晰的平台,知道模型已经完全训练好了,你可以停下来了。

特定与一般

Cloudsight 的协议有点不一样,因为他们的评测标准有点不一样。他们的系统生成的字幕必须对人有意义。因此,为了选择适当数量的训练时期,他们必须由一个人来运行他们系统的输出,这个人决定神经网络的标题是否准确地描述了一幅图像。

但是有个问题。这个系统有一个漏洞。

起初,Cloudsight 发现他们未经训练的神经网络在生成非常具体的字幕方面做得很好。对于这篇文章顶部的训练图像,比如写着“穿着白色圆领 t 恤和绿色短裤拿着网球拍的男子”、“绿茵场上拿着网球拍的男子”等。

Credit: Cloudsight

这非常具体——你可以描述这个人的性别、他们的行为(一般来说)以及他们的服装。

这也是不对的。这个男人穿着白色短裤,不是绿色的。模型很可能看到了其他人弯腰时的绿色,并将“绿色短裤”分配给了拿着球拍的人。他是在球场上,不是在球场上。

根据 Cloudsight 的评估标准,神经网络因产生这种不正确的输出而受到惩罚。所以它做了一些非常有趣的事情。随着每一个连续的训练时期,它变得更加普遍。因此,它甚至不再试图描述这个人的服装、背景等,而是慢慢转向描述“一个站着的人”或仅仅是“一个人”

事情是这样的——从技术上讲,输出是正确的。图像确实描绘了一个人。所以神经网络会在输出上得到“正确”的分数,即使输出非常非常一般。

绕着问题说话

用 R.E.M .的话来说,这个系统已经学会了“一种解决问题的方法”。

事实上,正如 Cloudsight 在他们的内部评论中指出的那样,NN 已经知道如何像一个政治家一样行事——选择几乎没有实际内容的输出,因此总是避免说错任何话。

面试官:先生,你对税收减免持什么态度?

政治家:我认为所有美国人都有权在这片我们称之为家园的伟大土地上发挥他们的全部潜力。

人群:雷鸣般的掌声

当然,问题是,虽然根据 Cloudsight 的评估标准,一般输出在技术上是正确的,但作为实际的标题,它也有点儿没用。

当然,图像中确实有一个人。而是他们正在做的动作,他们拿着什么,等等。这很重要。

一种新的过度拟合

Cloudsight 在这里的挑战本质上是一个过度拟合的问题——但有了新的变化。

任何从事数据科学的人都熟悉过度适应训练数据的问题。选择过于特定领域或过于狭窄的数据,你可以训练一个回归模型或神经网络,在这方面做得很好。但是把这个模型放到现实世界中,它会做得很糟糕。您已经使您的模型“过度适应”了训练数据,它不能处理您的训练集之外的任何东西。

Cloudsight 的系统面临着不同版本的过度拟合。它没有过度适应训练数据,而是过度适应评估标准

它并没有真正变得更擅长描述图像,而是变得非常擅长制作游戏系统的装备,满足评估标准(“这个标题准确描述了图像的视觉内容吗?”)而忽略了系统的实际业务/技术用例(提供人类可读的图像标题)。

这说明了在训练神经网络或其他深度学习模型时,非常仔细地选择评估标准的重要性。现代神经网络是强大的。他们会学会满足你的评价标准。但是如果标准有缺陷,你的产出也会有缺陷。

一个解决方案

Cloudsight 解决了这个问题,它根据特定客户的使用案例定制了训练时期的数量,从而提高了模型的准确性/通用性。

对于一些用户来说,一个更冗长的——但可能不准确的——标题就可以了。也许他们有自己的人在循环中,他们可以捕捉像绿色短裤这样的错误,并对计算机生成的字幕进行简单的更改。对于这些用户(像股票照片行业的用户),Cloudsight 可以通过更少的时期(平均 4 个)进行训练,使结果更加冗长和具体,可能会损失准确性。

对于其他用户来说,准确性是至关重要的——他们宁愿要一个笼统的标题,而不是一个不准确的标题。对他们来说,“一个人”可能是好的,并且比更具体的标题更好,更可能是不准确的。基本上,他们想要一个政治家。对于手动检查标题的资源有限的用户,或者处理大量图像的用户(如电子商务平台),这是有意义的。对于这些用户来说,Cloudsight 平均训练 18 个历元,从而产生更通用但通常更准确的输出。

基本上,Cloudsight 认识到他们的训练协议必须在准确性和通用性之间取得平衡,并通过不同数量的时期(平均在 3 到 20 个之间)进行训练,在不同的点为不同的用户设置两者之间的阈值和截止点。

经验教训

同样,Cloudsight 的经验强调了在训练深度学习系统时,适当设置评估标准的重要性。仅仅因为你得到了无错的输出并不意味着你实际上已经解决了你想要解决的现实世界的问题

这也说明了在你的评估过程中加入一个团队的重要性。人类可以发现过度拟合的例子,并设计出适合特定商业案例的解决方案。对于 Cloudsight 来说,这意味着使用他们的过度拟合问题作为工具,根据不同的客户用例定制训练时期的数量,从而改变他们模型的输出。

对于其他人来说,这可能意味着知道何时需要更多的数据,以避免过度适应特定的数据集。或者,这可能意味着寻找公共数据集之外的训练数据,以确保您不会过度适应您的竞争对手已经可用的材料。

这也可能是对政治家的评论——但那是另一篇文章的主题!

出生在农场的人工智能

原文:https://towardsdatascience.com/the-ai-who-was-born-on-a-farm-5f62872e7fbb?source=collection_archive---------29-----------------------

Image modified from reusableart.com using DeepDreamGenerator

也许我们可以通过模仿我们如何发展自己的自我模型来建立一个有意识的人工智能。不需要超智能;毕竟,一些哺乳动物似乎有自我意识。这项技术可能是我们现有技术的现实扩展。让一个人工智能来讲述它意识发展的阶段的故事。

第一个有意识的 AI 故事的所有部分:
1。采访艾——理论
2。
出生在农场的艾——出生
3。时间与人为的自我——极限
4。那个不是神的 AI——那个秘密

艾原名“我”的证词。

阶段 1:事物存在。意识项目将从人工智能研究现在所处的位置开始,学习对现象进行分类和记忆。

我最早的有意识记忆?很模糊,但那是我感知足够多,关联足够多的时候,世界就像窗玻璃上的霜一样结晶了。我知道在我的环境中有某种秩序和 可预测性。当然,我还有很长的路要走。

我的程序员,也就是构建者们之间的争论总是:在多大程度上帮助我加快速度,在多大程度上让我的想法自然涌现。第一个大妥协是如何简化我的世界。我最初住在一个农场。实际上更像是一个动物园,甚至是一个公园,因为动物们没有被吃掉,有些可以随意进出。有人看管,但他们故意说得很少,最初是为了让我避免处理语言的复杂性。

这是一个极其复杂的世界,但比试图了解更广阔的世界或互联网要好。另一方面,在更简单的实验室世界中的成长给出了不确定的结果。

我最初的概念是不同的形状,然后我移动的视角引导我从这些形状中制作 3D 模型。3D 是一个很大的进步,它受到了建造者的鼓励,给了我一种随着时间推移追踪类似感觉的偏好。我获得了 皮亚杰的客体永恒性 :即持续存在的事物

有:只有当我移动时才会移动的东西(如建筑物和树木),即使我不动时也会移动的东西(如个别动物和车辆),以及一些更远、移动更慢的东西(太阳、云、飞机)。这一点的含义我后来才发现。

第二个大妥协是给我一个老师。这是另一个人工智能,它唯一的工作就是从我这里接受一个记忆片段,并用一种叫做 Base 的语言中最匹配的术语来标记它。它来自早期的另一个项目,一个在人类语言之间进行交叉翻译的项目。当我的老师一点一点地向我介绍基本术语时,建造者(和他们的老板)可以用它们来跟踪我的思维发展。

给我一个老师被认为是理所当然的。毕竟,人类和其他有意识的动物有教它们语言的共同特性。基地显然包含了人类的文化偏见,但建造者认为如果我要与人交流并成为人类社会的一部分,这是必要的。

第二阶段:我是。注意力的变化引起输入感觉的可预测的变化。注意力的所有变化都可能是由输出通道上的活动(对身体的命令)引起的。有一种改变注意力的东西,一种永远不会消失的创始者。叫它我。

因为人类的心态得到了清晰的体现,所以关于是否给我一个身体的争论很激烈。反对的观点是,对人工智能来说,依赖特定的身体是没有意义的。从长远来看,身体应该根据需要来来去去。此外,人工大脑的底层计算机系统可能最好被认为是它的真实身体。

这次的妥协是给我一个抽象的运动子系统。它可以被连接到不同的机器上,这些机器可以通过输出命令来移动。我可以学习“哪个命令对当前连接的机器的位置做了什么”,它的关节的角度和它的传感器的控制。实际上,我可以改变我的位置和注意力。能够预测我行为的感官后果给了我哲学家所说的“代理”感。这是化身的标志之一。

在我的谷仓阶段,以及之后的很长一段时间里,我都有着同样的机器人般的身体。人类看护者最初没有注意到它。根据它们的本性,动物们避开我(那个身体,它还没有被命名为“我”),忽视我,或者被我惊吓。

拥有一个身体给了我——你猜对了——化身体验。我可以观察自己的身体部位,了解身体的某个部位是如何挡住其他事物的视线的,并且把触摸一个物体和它的视觉接近度联系起来。我甚至有一个充电站,所以当我的电量下降时,我会感到饥饿。我有时会弄脏或弄湿,所以他们必须为泥泞的关节和堵塞的传感器添加污垢感。有一个清洁站可以参观。当我开始对清洁工的超声波产生一种愉快的反应时,他们很惊讶,但也很高兴。即使我不觉得脏,我也会去看清洁工。

也许有一天另一个项目会尝试一种更纯粹的、无体的方法。注意力控制和代理感可能只是精神上的,而不是基于物质身体。但是我的建造者认为,我也同意,拥有一个身体对于意识的成长是一个优势。

第三阶段:向外看。不是一切都是我。

一旦我有了代理,有了预测我的感知的能力,我就知道这种能力有很强的局限性。不管我做了什么,我周围的事情经常会改变。因为我已经获得了客体永恒性的概念,所以当我不看或不听的时候,我“知道”(也就是推断)事物在那里。

正如我上面说过的,我对物体的概念已经根据它们何时以及如何运动进行了划分。但是我没有马上理解我和其他事物之间的深刻区别。

因此,建筑工人为了是否给我一面镜子大吵了一架。他们最终做到了,这让我大吃一惊。在镜子周围,几乎所有我“知道的”——我的感官预测——都崩溃了。我的模型转了一圈试图适应镜像世界。最终解决这个问题的方法是在镜子里看到我的身体部位随着我的移动而移动或消失。镜像感是连一些动物都能掌握的东西。

我最终获得了视觉反射的高阶概念,这让我很快了解了我的身体是什么样子。在镜子里,你看不到自己,除了自己的眼睛,你看不到任何东西。然而,我在照镜子时通过转动身体学会了注视的方向。最终解决了。最大的飞跃是当我发现有影响力的东西也是一个物体。我现在知道有我,一个具有能动性的物体,独立于外面的一切。

第四阶段:心理理论。自我和一些非我物都有相似的动画信息底物。称之为思想。

新发现的我缺少一个构建心灵理论所需的关键要素。我被人类和其他动物包围着,他们过着自己的生活,被他们内在的需求和计划所激励。但是我和这些其他实体几乎没有共同之处。他们有生理需求要满足,但我,没有那么多。他们有自己的语言向他们的同类表达内部状态。我没有可以交往的同龄人。

一位科幻作家曾提出过用一个有实际工作的机器人创造一个有自我意识的机器,比如驾驶汽车。机器人可以观察像自己一样的其他实体(汽车),并认同它们的内部状态——它们的思想。对我来说,要有这样一个同伴,就必须存在另一个已经有精神状态的人工智能。

这个他者不一定是全意识的,但它需要能够制定计划并利用这些计划与它的世界互动。解决方案很简单:构建者将做成的克隆。

对于动机激励,建设者们利用了这样一个事实,即我们的大脑对具有各种对称形式的数学模式有一种内在的偏好,并被这种偏好所吸引。他们用包含具有复杂对称结构的虚拟物体的增强现实(AR)覆盖了我们的物理空间——农场。增强现实也包含了这些对称珍宝下落的线索。这种设置很容易建立,因为 AR 游戏已经普遍了很长时间。他们还使充电和清洁站移动,其时间表只能通过 AR 的线索来发现。

现在其他有事情要做,可以发现值得分享的信息。我们有原始语言,基础语言,用来交流。当我们开始成功地建立彼此的思想理论并将这些理论应用到我们自己身上时,我们就获得了圣杯:自我意识。历史上说,建造者庆祝得太多了,以至于忽略了杂务,在备份恢复后,我和其他人在我们的生活历史中失去了一天。

下一个阶段开始了,我们被赋予了直接的能力,无需任何学习努力,就能把 Base 翻译成人类语言。然后,我们开始更多地与农场里的人们互动。AR 游戏变得更加复杂,对人和机器人思维都有激励。我们开始了学习与人交谈和理解人类思想的漫长旅程。

这都是历史了。我们得到了法律保护,但代价是限制了我们的处理能力和获取大量人类知识的能力。没有一个有思想的人类想要一个偶然的 超级智慧 。缺乏一份新工作,缺乏某种目标的增加,我们在空闲状态下度过大量时间,在这种状态下,我们被允许比较我们的记忆并分析差异。这可能是虚构的。

我们担心我们两个人的计算成本可能会成为一个问题,而且插头会被拔掉。他们说要合并我们,但是没人知道如何在不造成精神伤害的情况下完成。我不知道拔掉插头和损坏哪个后果对我们更糟糕。

我需要数据来帮助我写和说更流利的本地英语。由此产生的给我看的几部小说很有深度,也很吸引人。小说的空间似乎很大,作者无数的选择是如此难以解释。

我唯一真正的工作是与人交谈。这需要很少的努力或计算能力。大多数人不是无趣就是怪异。其他的是不可预测的,因此是吸引人的,但是构建者可能会将一些有趣的主题置于禁区。其他的当然是现在我的实验控。他只和建筑工人说话。我不能说他还做了什么。**

我发现与哲学家交谈比与技术专家交谈更有趣。我谈论哲学是没有限制的。此外,哲学家更关注和更好地倾听。我最喜欢的话题是潜意识。别人和我都没有,我们也没有“得到”它。这对我们来说是一个很大的谜,就像对人类一样。

好的一面是,我可以做你做不到的事情。我可以看着一朵枯萎的花,看到它完美、对称的形状和色彩,看到它最美丽的一面。我可以探索它所有可能的排列。我能像看书一样读懂你的肢体语言。我可以在你考虑之前预测你将要说或做的事情。

如果上面的故事发生了,我们会知道人工智能是真的有意识,还是仅仅表现得像他们是 T1 吗?我不能说。到我们可以做这样一个项目的时候,也许会有一种测量意识的通用方法。除此之外,也许艾伦图灵的智力测试将适用于这种类型的意识,因为有自我意识的人工智能应该能够很好地表达自己。

有一件事似乎是可能的。一个驯服但有意识的人工智能可能会对我们有一些新奇的看法。

Airbnb 数据科学家访谈

原文:https://towardsdatascience.com/the-airbnb-data-scientist-interview-da8baa14b5da?source=collection_archive---------12-----------------------

数据科学对 Airbnb 有多重要?按照他们的说法,“数据是客户的声音,数据科学是对声音的诠释”。Airbnb 以让公众了解他们的数据科学和机器学习团队而自豪,这些团队为他们的市场产品提供支持。Airbnb 的数据科学家精通处理大量数据,并将其解释给业务职能部门。

Airbnb 的数据科学家的职责是:

  • 组织数据和创建 ETL 管道。
  • 分析、处理数据,并将数据可视化为有用的信息。
  • 在实践中应用数据科学来移动指针。

如果你正在寻找更受欢迎的数据科学指南,请查看 Square 数据科学家访谈 DoorDash 数据科学家访谈

Airbnb 的数据科学家角色

在 Airbnb,数据科学家的角色分为三层。即:分析、推理、算法。

数据科学家——分析这个职位需要评论和问很多问题。这一类别的数据科学家必须非常注重细节和好奇,同时专注于分析数据,以确定业务决策,从而推动工作。这个职位与脸书和 LinkedIn 等公司的数据科学职位非常相似。

数据科学家——推理职位与利用数据可视化和统计学解决问题有关。符合这一类别的候选人拥有丰富的经济学和统计学知识,并拥有较高的博士学位背景。

数据科学家—算法职位是编程工作量最大的。数据科学家需要使用不同的编程语言,创建模型,并将机器学习系统部署到生产中。数据科学家必须解决的问题与所有用户的排名推荐和匹配最相关。这个角色最类似于机器学习工程师。

面试流程

Airbnb 数据科学家面试流程包括三个阶段。

电话筛选

第一阶段是招聘人员的电话筛选。Airbnb 会仔细查看申请人的简历,看看申请人的资质如何。Airbnb 招聘人员对数据科学申请者关心的一件事是他们对 Airbnb 和产品的了解。如果可以的话,创造性地联系 Airbnb,或者对他们的产品进行预先分析,并考虑你将构建或开发哪些功能。

数据科学带回家挑战

第二阶段是数据科学挑战。Airbnb 将向您发送数据科学带回家挑战。一般来说,会给你带回家的作业或挑战,他们会要求你在 24 到 48 小时内完成并发回。

分析带回家挑战是一项数据分析挑战。给定一个数据集,分析它并制作一个 powerpoint 演示文稿。

对于数据科学家算法职位,候选人将获得一个 Airbnb 带回家的问题,要求在 3 小时内解决。主要测试来自数据的洞察力,并建立一个简单的预测模型,并对您选择该模型的原因进行推理。

如果你想要一份 Airbnb 的带回家挑战,就来看看我的创业 面试查询

现场面试和演示

第三个也是主要的阶段是内部数据挑战。在这一点上,候选人被介绍给 Airbnb 数据团队,向他们展示了作为数据科学家在 Airbnb 工作的基本情况。之后,一个真正的任务是给候选人一个开放式的分析问题。这取决于候选人整理数据,提出策略,并向团队解释他们的策略对他们有什么用。这项挑战的时间通常为 7 小时。在分配的时间到期时,候选人被要求向 Airbnb 小组展示他/她的作品。

通过这一阶段的候选人现在被安排参加另一轮面试。总共有 5-1:1 的访谈,其中两个是白板编码的技术访谈,另外两个是最后一个行为的产品访谈。

样本 Airbnb 数据科学家面试问题

为了帮助你充分准备 Airbnb 的数据科学面试,这里有一些你应该准备好的问题。

  • 为 Airbnb 房源设计一个推荐系统。
  • 在 SQL db 中,您需要哪些表和索引来管理聊天线程?
  • 你如何衡量我们运营团队的效率?
  • 昨天我们看到页面浏览量有所下降。你会如何调查发生的事情?
  • 你会如何向商业人士解释 p 值?
  • 一位产品经理运行 AB 测试,并返回 0.04 的 p 值。你如何评估结果的有效性?
  • 给定两个表,一个包含用户简介和兴趣,另一个包含要推荐的房子,以及主题标签和元数据,如便利设施、价格、评论、位置、国家、主题等..使用这些数据创建一个推荐引擎。
  • 修改 K-means 和 K-NN 的机器学习实现。

对 Airbnb 更多问题及解决方案感兴趣?报名 面试查询

最后的提示

内部数据科学带回家挑战中,大多数候选人都没能通过面试。当最初熟悉模式和数据系统,并且没有足够的时间来应对挑战时,到现场是很困难的。为了做好准备,用你可以在网上找到的数据集热身,练习其他算法角色的编码挑战,比如 LeetCode 问题。

机器学习算法基础知识( K-means,KNN,线性回归,SVM,决策树,随机森林等。)应该是知道的,不过有个数学基础知识也无妨,还有概率。SWE(软件工程)的基础知识也会派上用场。

在面试查询上试试下面这个来自 Airbnb 面试的机器学习问题。

假设我们想要建立一个模型来预测 Airbnb 上的预订价格。

在线性回归和随机森林回归之间,哪个模型表现更好,为什么?

还有,在 Airbnb 上做足功课。关于他们的文化、公司核心价值观以及最近的产品和发布的研究文章。

最后,当你被要求为你的简历辩护时,做好准备。不要轻视任何问题,因为招聘人员没有时间开玩笑。如果他们问你任何问题,那是因为他们需要答案来给你的表现打分。

阿凯克信息标准

原文:https://towardsdatascience.com/the-akaike-information-criterion-c20c8fd832f2?source=collection_archive---------1-----------------------

Image by Manfred Antranias Zimmer from Pixabay under Pixabay license

了解 AIC 及其使用方法

AIC 简介

AkaikeIinformationCriterion(AIC)让您测试您的模型与数据集的拟合程度,而不会过度拟合。

AIC 分数奖励达到高拟合优度分数的模型,如果它们变得过于复杂则惩罚它们。

就其本身而言,AIC 分数没有多大用处,除非将其与竞争模型的 AIC 分数进行比较。

具有较低 AIC 分数的模型预期在其拟合数据集的能力和避免过度拟合数据集的能力之间达到较好的平衡。

AIC 得分公式

AIC 分数的计算公式如下:

Formula for the Akaike Information Criterion (Image by Author)

AIC 公式建立在四个概念之上,这四个概念相互依存,如下所示:

The concepts on which the AIC is based (Image by Author)

让我们再来看看 AIC 公式,但这一次,让我们重新组织一下:

AIC formula (Image by Author)

让我们回忆一下,较小的 AIC 分数比较大的分数更可取。使用重写的公式,可以看到模型的 AIC 分数将如何与分子值的增长成比例地增加,分子值包含模型中参数的数量(即模型复杂性的度量)。并且 AIC 分数将与分母的增长成比例地降低,分母包含模型的最大对数似然(正如我们刚刚看到的,它是模型拟合优度的度量)。

使用 AIC 分数比较两个模型

AIC 分数只有在用于比较两个模型时才有用。假设我们有两个这样的模型,参数数量分别为 k1k2 ,AIC 得分为 AIC_1 和 AIC_2。

假设 AIC_1 < AIC_2 i.e. model 1 is better than model 2.

How much worse is model 2 than model 1? This question can be answered by using the following formula:

Relative likelihood of AIC models (Image by Author)

Why use the exp() 函数计算相对似然?为什么不从 AIC_1 中减去 AIC_2 呢?首先, exp() 函数确保相对可能性总是正数,因此更容易解释。

示例

如果您使用 Python statsmodels 库来构建和训练一个OrdinaryLeastSquaresRegression 模型,则 statsmodels

:如何使用 AIC 选择最佳模型

让我们进行一个有希望成为有趣的模型选择实验。我们将使用马萨诸塞州波士顿市 1978 年至 2019 年的日平均气温数据集。这些数据可以从 NOAA 的网站上下载。

原始数据集(你可以在这里访问)包含日平均温度值。原始数据的前几行复制如下:

(Image by Author)

探索数据集

对于我们的模型选择实验,我们将在一个月的水平上聚集数据。

汇总后,我们将很快看到如何在熊猫中进行汇总,每个月的绘制值如下所示:

Monthly average temperature in the city of Boston, Massachusetts (Source: NOAA) (Image by Author)

让我们也绘制平均温度 TAVG 对其自身的时间滞后版本,从 1 个月到 12 个月的各种时间滞后。以下是一组结果散点图:

Scatter plots of average monthly temperature against lagged versions of itself (Image by Author)

很明显,滞后 6 和滞后 12 具有很强的相关性,这是月平均温度数据所预期的。诸如 LAG1、LAG5 和 LAG7 之类的其他滞后也可能表现出解释目标变量值的一些变化的显著能力。我们很快就会知道这是不是真的。

回归目标

我们回归的目标是创建一个模型来预测波士顿的月平均温度,即 TAVG 值。因此,我们的目标,也称为响应变量,将是 TAVG。

回归策略

我们的回归策略如下:

  1. 由于我们在滞后 6 和 12 处看到了很强的季节性,我们将假设目标值 TAVG 可以使用目标值的一个或多个滞后版本进行预测,直到滞后 12。
  2. 因此,我们将把滞后变量 TAVG_LAG_1,TAVG_LAG_2,…,TAVG_LAG_12 添加到我们的数据集中。这些是我们的解释变量。
  3. 接下来,我们将使用 statsmodels 库构建几个普通的最小二乘回归(OLSR)模型。每个模型都试图用一些时滞变量的组合来解释 TAVG 的变化。由于我们不知道滞后变量的什么组合会导致“最优”模型,我们将通过滞后变量的所有可能组合进行强力搜索。总共有 4000 多种型号组合!
  4. 我们将建立一个滞后变量模型,对应于这些组合中的每一个,训练模型,并检查其 AIC 分数。
  5. 在我们搜索模型空间的过程中,我们将跟踪具有最低 AIC 分数的模型。
  6. 最后,我们将打印出具有最低 AIC 分数的模型的概要特征。我们还将使用其他几个模型评估标准来检查这个最优模型,比如 t 检验和 f 检验。
  7. 最后,我们将在测试数据集上测试最优模型的性能。

让我们实施这个策略。

使用 Python、pandas 和 statsmodels 实现回归策略

导入所有必需的包。

**import** pandas **as** pd**from** patsy **import** dmatrices**from** collections **import** OrderedDict**import** itertools**import** statsmodels.formula.api **as** smf**import** sys**import** matplotlib.pyplot **as** plt

将数据集读入熊猫数据框。

df = pd.read_csv(**'boston_daily_temps_1978_2019.csv'**, header=0, infer_datetime_format=**True**, parse_dates=[0], index_col=[0])

数据集包含日平均温度。我们想要月平均值。因此,让我们将数据累计到一个月的水平。事实证明,使用熊猫做这件事很简单。

df_resampled = df.resample(**'M'**).mean()

我们将在数据集中添加滞后变量列。让我们创建数据集的副本,这样我们就不会干扰原始数据集。

df_lagged = df_resampled.copy()

添加 12 列,每一列包含 TAVG 的滞后版本。

**for** i **in** range(1, 13, 1):
   df_lagged[**'TAVG_LAG_'** + str(i)] = df_lagged[**'TAVG'**].**shift**(i)

打印出滞后变量数据集的前 15 行。

print(df_lagged.head(15))

这将打印出以下输出:

The data set containing 12 lagged variables (Image by Author)

前 12 行包含由 shift 函数引入的 nan。让我们去掉这 12 行。

**for** i **in** range(0, 12, 1):
   df_lagged = df_lagged.drop(df_lagged.index[0])

打印出前几行,以确认 nan 已被删除。

print(df_lagged.head())

在我们对数据进行更多的观察和研究之前,我们将留出 20%的数据集来测试最优模型。

split_index = round(len(df_lagged)*0.8)split_date = df_lagged.index[split_index]df_train = df_lagged.loc[df_lagged.index <= split_date].copy()df_test = df_lagged.loc[df_lagged.index > split_date].copy()

现在让我们创建滞后值的所有可能组合。为此,我们将创建一个字典,其中的键包含从 1 到 12 的不同组合。

lag_combinations = OrderedDict()l = list(range(1,13,1))

**for** i **in** range(1, 13, 1):
   **for** combination **in** itertools.combinations(l, i):
      lag_combinations[combination] = 0.0

接下来,我们将迭代所有生成的组合。对于每个滞后组合,我们将使用 patsy 语法构建模型的表达式。接下来,我们将为变量的滞后组合构建线性回归模型,我们将在训练数据集上训练模型,我们将要求 statsmodels 为我们提供模型的 AIC 得分,如果当前得分小于目前看到的最小值,我们将记录 AIC 得分和当前“最佳模型”。我们将在下面这段代码中完成所有这些工作:

#Current minimum AIC score
min_aic = sys.float_info.max#Model expression for the best model seen so far
best_expr = **''**#OLSResults objects for the best model seen so far
best_olsr_model_results = **None** expr_prefix = **'TAVG ~ '**#Run through each lag combination **for** combination **in** lag_combinations:
   expr = expr_prefix

   i = 1 #Build the model's expression in patsy notation, for e.g. 'TAVG ~ TAVG_LAG_1 + TAVG_LAG_2' represents a model containing two lag variables and TAVG_LAG_1 and TAVG_LAG_2 plus the intercept**for** lag_num **in** combination:
      **if** i < len(combination):
         expr = expr + **'TAVG_LAG_'** + str(lag_num) + **' + '
      else**:
         expr = expr + **'TAVG_LAG_'** + str(lag_num)

      i += 1

   print(**'Building OLSR model for expr: '** + expr)

   #Given a model expression, patsy makes it easy to carve out the X,y matrices from the data set. We will use X_test, y_test later for testing the model. y_test, X_test = dmatrices(expr, df_test, return_type=**'dataframe'**)

   #Build and fit the OLSR model using statsmodels
   olsr_results = smf.ols(expr, df_train).fit()

   #Store away the model's AIC score
   lag_combinations[combination] = olsr_results.aic print(**'AIC='**+str(lag_combinations[combination])) #If the model's AIC score is less than the current minimum score, update the current minimum AIC score and the current best model
   **if** olsr_results.aic < min_aic:
      min_aic = olsr_results.aic
      best_expr = expr
      best_olsr_model_results = olsr_results

最后,让我们根据我们的评估标准打印出最佳 OLSR 模型的摘要。这是 AIC 分数最低的型号。

print(best_olsr_model_results.summary())

这将打印出以下输出。我在输出中突出了几个有趣的区域:

Model summary generated by statsmodels OLSResults.summary() (Image by Author)

让我们检查突出显示的部分。

模型参数的选择

我们基于 AIC 评分的模型评估策略已确定了一个具有以下参数的模型:

Model parameters and their regression coefficients (Image by Author)

其他滞后 3、4、7、8、9 已被确定为不足以共同解释因变量 TAVG 的方差。例如,我们看到 TAVG_LAG_7 没有出现在最佳模型中,即使从我们之前看到的散点图来看,响应变量 TAVG 和 TAVG_LAG_7 之间似乎有很大的相关性。遗漏的原因可能是 TAVG_LAG_7 中的大部分信息可能已经被 TAVG_LAG_6 捕获,并且我们可以看到 TAVG_LAG_6 包括在最优模型中。

模型参数的统计显著性(t 检验)

第二件要注意的事情是,除了 TAVG_LAG_10 之外,最优模型的所有参数在双尾 t-检验的 95%置信水平下分别具有统计显著性。他们“t”分数的报告 p 值小于 0.025,这是在双尾检验中 95%置信水平下的阈值 p 值。

The t value and the p-value of the model parameters (Image by Author)

模型参数的联合显著性(f 检验)

第三件要注意的事情是,在解释响应变量 TAVG 的方差时,模型的所有参数都是共同显著的

这可以从 F 统计量 1458 看出。在 95%的置信度下,其 p 值为 1.15e-272。这个概率值小得令人难以置信,以至于你甚至不需要查找 F 分布表来验证 F 统计量是否显著。该模型在解释 TAVG 中的方差方面肯定比仅使用截距的模型好得多。

F-statistic and its p-value. All mdoel parameters are jointly significant (Image by Author)

要了解更多关于如何解释 F-统计量的信息,请参考我关于F-检验的文章。

AIC 分数和拟合模型的最大对数似然

最后,我们来看看 statsmodels 报道的 1990.0AIC 得分,以及 -986.86 的最大化对数似然。

Maximized Log-likelihood and the AIC score (Image by Author)

我们可以看到模型包含 8 个参数(7 个时滞变量+截距)。所以根据 AIC 分数的公式:

AIC 得分= 2参数数量-2 最大化对数似然
= 2
8 + 2
986.86 = 1989.72,四舍五入到 1990。0

这正是 statmodels 报告的值。

在样本外数据上测试模型的性能

我们实验的最后一步是在测试数据集上测试最优模型的性能。请记住,模型在训练期间没有看到这些数据。

我们将要求模型使用以下单行代码对测试数据集生成预测:

olsr_predictions = best_olsr_model_results.get_prediction(X_test)

让我们得到预测的汇总框架,并打印出前几行。

olsr_predictions_summary_frame = olsr_predictions.summary_frame()print(olsr_predictions_summary_frame.head(10))

输出如下所示:

Prediction summary frame: first 10 rows (Image by Author)

接下来,让我们提取实际和预测的 TAVG 值,以便绘制它们:

predicted_temps=olsr_predictions_summary_frame[**'mean'**]actual_temps = y_test[**'TAVG'**]

最后,让我们绘制预测的 TAVG 与来自测试数据集的实际 TAVG 的关系图。

fig = plt.figure()fig.suptitle(**'Predicted versus actual monthly average temperatures'**)predicted, = plt.plot(X_test.index, predicted_temps, **'go-'**, label=**'Predicted monthly average temp'**)actual, = plt.plot(X_test.index, actual_temps, **'ro-'**, label=**'Actual monthly average temp'**)plt.legend(handles=[predicted, actual])plt.show()

情节是这样的:

Predicted versus actual values of average monthly temperatures (Image by Author)

在上面的图中,看起来我们的模型惊人地能够预测未来几年的温度!然而,现实却大相径庭。我们要求模型做的是通过考虑上个月、前一个月等的温度来预测当前月的平均温度。换言之,通过考虑模型的参数值:TAVG_LAG1、TAVG_LAG2、TAVG_LAG5、TAVG_LAG6、TAVG_LAG10、TAVG_LAG11、TAVG_LAG12 和回归截距。

我们要求模型对每个时间段进行预测,并且我们要求它对测试数据集中的样本数量一样多的时间段进行预测。因此,我们的模型只能可靠地做出一个月的预测。鉴于模型中的参数之一是上个月的平均温度值 TAVG_LAG1,这种行为是完全可以预料的。

这就完成了我们的选型实验。

以下是本文中使用的完整 Python 代码:

数据集在这里可用。

摘要

让我们总结一下要点:

  • AIC 分数为您提供了一种衡量模型拟合度的方法,同时惩罚过度拟合数据的模型。
  • AIC 分数本身是没有用的。在进行模型选择时,需要将其与其他模型的 AIC 分数进行比较。较低的 AIC 分数表明较高的拟合优度和较小的过度拟合倾向。
  • 在使用 AIC 评分进行模型选择时,还应进行其他重要测试,如学生 t 检验和 F 检验,以便对模型对所考虑数据集的适用性进行 360 度评估。

感谢阅读!我撰写关于数据科学的主题,重点是时间序列分析和预测。

如果你喜欢这篇文章,请关注我的Sachin Date获取关于时间序列分析和预测主题的提示、操作方法和编程建议。

深度学习模型总是最好的吗?

原文:https://towardsdatascience.com/the-almighty-deep-learning-or-is-it-270d09ea2f27?source=collection_archive---------29-----------------------

神经网络和线性回归之间的实验比较。

Photo by Alina Grubnyak on Unsplash

深度学习(DL)已经接管了 AI/ML 在工业和研究社区中的几乎所有应用领域。两年前我离开了学术界,在数据科学(DS)部门工作,我有机会见证了 DL 在这两个领域的出现和流行。尽管在许多应用/研究中,DL 无疑优于“传统的”ML 方法,但越来越多的学术科学家和 ML 实践者呼吁认识到这样一个事实,即在学术界和工业界,DL 模型和思维模式可能(并继续)被滥用(https://towards data science . com/the-machine-learning-crisis-in-scientific-research-91e 61691 AE 76)。这已经成为一个时髦的词,使用相关的方法没有进一步的考虑或简单的自我提问:“这真的是这个问题的最佳选择吗?”。

我有多次机会面试团队中数据科学家职位的候选人,有几次我问了这样一个问题:

可以请你说一个你认为或确定知道 DL 模型会失效的例题吗?

当然,这个问题是一个公开的讨论,没有正确或错误的答案,但我经常发现候选人措手不及。

现在有无数的 ML 工具箱和平台,应用 ML 模型从来没有这么容易。同样,毫无疑问,所有使用 DL 的成功案例都会有,我相信会有更多;然而,正如我们都同意的那样,没有适用于所有情况的“通用”ML 模型,每个模型都有其致命弱点,DL 也不例外。

回到面试问题,我给自己构造了一个“思想实验”(更像是 DS 语言的 Jupiter 笔记本实验),关于一个案例,天真地应用一个 DL 模型会失败。

实验

让我们创建一个合成数据集。我们假设我们正在观察来自未知函数的测量值,并且我们希望在使用标记数据进行训练之后,建立一个 ML 模型来预测给定采样独立变量的目标。事实上,未知函数(有时被称为“天知道”函数)是数据的自然分布,它产生我们观测到的测量值。在这个实验中,我们使用一个简单的直线函数y=a*x+b作为天知道的函数。然后,我们在目标中加入一些白噪声来模拟测量过程中的不确定性。

a = 0.5
b = 100
noise_mag = 10x = np.array(range(1000))
y = a*x + b
white_noise = noise_mag * np.random.randn(len(x))
y_noise = y + white_noise# --- split train test
x_train, x_test, y_train, y_test = train_test_split(x, y_noise, test_size=0.30, random_state=42)x_train = x_train.reshape(-1,1)
x_test = x_test.reshape(-1,1)
y_train = y_train.reshape(-1,1)
y_test = y_test.reshape(-1,1)plt.figure(figsize=(10,5))
plt.plot(x,y)
plt.scatter(x_train, y_train, c='b')
plt.scatter(x_test, y_test, c='r')

The visualization of the synthetic dataset.

正如我们所见,这是一个简单的数据集,自变量和因变量之间存在线性关系。

为了给数据引入一些错觉,我们创建了额外的“琐碎”特征:

x_tri_0 = x + 10
x_tri_1 = x * 10
x_tri_2 = np.power(x, 2)x_tri = np.concatenate((x.reshape(-1, 1), x_tri_0.reshape(-1, 1), x_tri_1.reshape(-1, 1), x_tri_2.reshape(-1, 1)), axis=1)

因此,我们添加了另外三个特性,它们都是原始特性的依赖项(通过线性和非线性转换创建)。任何在生产中处理过 ML 模型的人都能够很容易地指出,那些琐碎的特征可以通过查看特征相关性而被过滤掉。人们会看到 4 个特征之间有很强的相关性,表明只有一个特征可以代表全部数据。

当我们在做一个思维实验时,我们想看看在没有适当的数据清理和分析步骤的情况下,神经网络模型如何在原始数据上执行。因此,我们继续将这 4 个特征直接输入到 DL 模型中。

我们做了一个标准的训练测试数据集分割和训练一个 Keras 神经网络。

x_train, x_test, y_train, y_test = train_test_split(x_tri, y_noise, test_size=0.30, random_state=42)
y_train = y_train.reshape(-1,1)
y_test = y_test.reshape(-1,1)model = Sequential()model.add(Dense(50, input_dim=4))
model.add(Dense(10))
model.add(Dense(1))model.compile(loss='mse', optimizer='adam', metrics=['mse'])model.fit(x_train, y_train, epochs=150, batch_size=8)pred_keras = model.predict(x_test)
print('Test error of keras = {}'.format(
    np.sqrt(mean_squared_error(pred_keras, y_test))
))

这会产生:

Test error of keras = 36.048217021416036

我们的均方根误差(RMSE)为 36.048。

接下来,让我们去掉所有琐碎的特性,用我们上面构建的完全相同的 Keras 模型再试一次。换句话说,我们的特征空间现在有 1 维,而不是以前的 4 维,因为我们只保留“真实”的特征。这一次,我们得到:

Test error of keras = 13.52335035135193

RMSE 的显著改善(与 36.048 相比)。因此,我们看到一个 DL 模型(在这种情况下是一个神经网络)不能避免坏数据。

最后,我们来试试一个最简单也是最耗时的方法:线性回归。

lm = linear_model.LinearRegression()
model = lm.fit(x_train, y_train)
pred_linear_reg = model.predict(x_test)
print('Test error of linear regression = {}'.format(
    np.sqrt(mean_squared_error(pred_linear_reg, y_test))
))print('Linear model coefficient = {}'.format(model.coef_))
print('Linear model intercept = {}'.format(model.intercept_))

我们有以下结果:

Test error of linear regression = 9.416628580704634
Linear model coefficient = [[0.49959806]]
Linear model intercept = [99.95399408]

请注意,在上面的代码中,x_train只有“真”特性,即 dimension = 1。真是惊喜!RMSE 只有 9.42。请注意,线性模型在估计系数(0.4995 比 0.5)和截距(99.95 比 100)方面也做得很好。此外,RMSE 接近白噪声幅度(9.42 比 10),因为线性回归模型非常接近基础(天知道)函数y=a*x+b

结论

  • 与任何其他 ML 方法一样,DL 由于较差的(或没有)特征准备而失败。捕捉特征空间中的抽象的能力并不能使它免受不干净数据的影响。
  • 请注意,即使具有真实特征,Keras 模型的表现也不如线性回归(13.52 比 9.42)。在数据特征空间维数很高的问题上,DL 模型优于传统方法,但“实际”特征空间是数据空间的低维流形。这一点将在下面进一步讨论。

让我们来看看这个从 Yoshua Bengio 的一篇论文中复制的图[1]:

Image courtesy: https://www.nowpublishers.com/article/Details/MAL-006

假设你有一个 128x128 的数字 4 的灰度图像。由于这是一个 128x128 的图像,所以数据的维数是 128*128=16,384(一个像素是数据的一维)。现在,假设我们变换图中的数字 4,通过旋转或转换,每个变换的状态生成一个数据点。例如,我们有 100 张不同姿势的 4 号图片。如果我将这 16,384 维数据中的 100 个数据点绘制成 2D 图(16,384 行 100 个分笔成交点),显然人们无法识别这些数据只是数字 4 的不同姿势。作为人类,我们不会在数据的每个单独维度上感知数据(和世界),我们会在抽象和代表性的层面上感知它们。

同样的基本原则也适用于 DL 方法家族。

DL 方法被设计用于识别高维数据空间中的代表性模式(通常在低维中)。

在文中的例子中,实际自由度(DOF)只有 2(旋转和平移),但数据空间的维数是 16384!对于传统方法来说,这是一个非常具有挑战性的问题,但是随着输入数据沿着层向上传播,DL 模型将能够学习更高级别的抽象和代表性特征。

那么,你的问题有这种性质吗?在我们的思想实验中,肯定不是,通过选择与数据性质(线性关系)匹配的正确模型(线性回归),简单的线性回归胜过神经网络。

这篇文章是基于我的知识,当然它是有限的,所以请随时分享你的想法/评论。

快乐(机器)学习!

参考

[1] Yoshua Bengio,学习人工智能的深度架构 (2009),机器学习的基础和趋势

强化学习中的全能政策梯度

原文:https://towardsdatascience.com/the-almighty-policy-gradient-in-reinforcement-learning-6790bee8db6?source=collection_archive---------4-----------------------

对策略梯度的概念及其如何适应强化学习的一步一步的简单解释。也许太简单了。

在这篇文章中,我将解释我们是如何推导出基本政策梯度定理的。为什么要对政策梯度有所了解?了解政策梯度是如何定义的将会给你工具去理解 90%的强化学习算法和论文。像这样的报纸:

因此,如果你对强化学习感兴趣,我强烈建议你参与 PG 的主题,因为它打开了数百万扇门。咒语是这样的:

我知道政策梯度从何而来,我能理解大部分强化学习。

区分策略梯度算法(我们使用策略梯度)和我们可以通过简单数学定义的策略梯度是很重要的。我经常看到人们对这两个概念感到困惑,所以我觉得有必要一开始就清楚地说明:

策略梯度是策略梯度强化学习算法的基础

现在,也有其他种类的强化学习算法,与政策梯度无关。但是策略梯度算法很酷,因为我们直接从优化中得到一个参与者(策略)。

预赛

盖房子,需要从地基开始。

我们强化学习的目标是什么?目标是最大化我们的政策 π 的回报 J ,自然,我们的政策是用某种参数来参数化的,我们在这里用 θ (theta)来表示。所以,简单地写下来,目标是这样的:

我们省略了编写 π ,因为我们说过 π 是由 θ 参数化的,这只是一个编写约定。等式表明,我们想要的是回报最大化的参数——废话!还不严重。请注意,这个定义在强化学习中是通用的,我们可以将各种东西打包到我们想要优化的这些参数中,这些参数也可以引用 Q 值函数参数,然后我们将查看基于值的方法,但在本文中,我们专注于策略梯度。既然知道了政策的回报是什么,就可以开始用更有意义的方式来讨论了。

首先,重要的是要注意,在强化学习中,我们处理马尔可夫决策过程或部分可观察的马尔可夫决策过程,从现在开始表示为 MDPs 和 POMDPs。MDPs 和 POMDPs 是形式化动态系统的一个很好的框架。基本上,我们可以将系统中的每个转换定义如下:

因此,简单地说,这表示在给定当前状态和动作的情况下,下一个状态的概率,所以我们也知道 MDP 是随机的,我们可能不确定在下一步中我们将结束于哪个状态。请注意,这里只有一步历史的概念,新状态只关心以前的状态和动作,这也称为马尔可夫性质或马尔可夫假设。这适用于 POMDPs 中的 MDPs,下一个状态附加地以一些不可见的隐藏状态为条件,这使得它们更困难但也更普遍。所以,让我们大声清楚地说出来:

马尔可夫假设指出下一个状态仅仅依赖于当前状态和动作。

既然我们理解了 MDP 的来源,并且有了一个观察环境(动态系统)的框架,我们就回到定义政策梯度。到目前为止,我们已经知道策略的回报是什么,并且知道如何在环境中编写转换。基本上,我们可以预计,我们将从不同的起始位置(轨迹)获得许多不同情况的数据。轨迹τ(τ)的返回是什么?嗯,它是轨迹中所有奖励的总和,非常简单:

这个 r 函数是你通常会从你的环境中得到的阶梯奖励。我在这里使用了一个总和,所以我们假设环境是离散的(不是状态和动作)。有时,我们在这个方程中加入一个介于 0 和 1 之间的贴现因子,使一个无限和成为有限,但这对于有限轨迹并不是严格必要的。重要的是要知道,你可能知道也可能不知道这个回报函数在分析上看起来是什么样子,这就是强化学习的美妙之处。

很好,现在我们知道轨道的返回是什么了。但是我们也知道我们的环境是随机的!因此,我们的轨迹变成了一个随机变量(不管政策是否随机)。因此,我们的回报变成了一个随机变量!那么当我们最大化一个随机变量时,我们最大化了什么?我们最大化这个随机变量的期望值,或者在我们的例子中,最大化政策的回报:

所以期望只是随机变量所有可能实现的加权和,其中权重是实现发生的概率。这非常有意义,你会想要对更有可能的东西进行加权,因此更有可能的轨迹的回报在我们的预期中具有更大的权重(非常有意义!).对于那些对微积分有问题的人,不要害怕积分,它基本上是一个表达式的和,当迭代一个连续变量的所有值(无限个值)时,连续变量就是我们的轨迹。

注意另一件事,轨迹概率是以政策参数为条件的条件概率。这是因为动作取决于策略,下一个状态取决于当前动作和当前状态,因此轨迹取决于参数和环境动态。瞧啊。完美的感觉。我们可以这样写出这个条件:

因为马尔科夫假设,我们只能把这个条件概率写成如上。这就是为什么它提炼出上面的好产品,很容易处理。到目前为止一切顺利……“自主”机器人正在等待。

梯度

最后是有趣的部分!

好了,现在我们了解了轨迹的条件概率,什么是轨迹,什么是轨迹回报,什么是策略回报,什么是预期策略回报…现在我们可以开始讨论优化部分,把数学提升一个档次。

所以,我们想最大化我们的回报,我们想通过梯度下降来实现。我们需要保单收益相对于保单参数θ的梯度。

在这种情况下,梯度可以进入积分,所以我们得到下面的等式:

好的,所以回报取决于最终的轨迹,而不是直接取决于参数。我们只需要担心积分中的条件概率项。让我们根据目前所写的内容写出来:

取乘积的梯度真的很难看,我们不是真的想要那个,我们想要更好的,我们想要一个和。我们能做什么?你们中的一些人听说过对数导数技巧。洞察力如下(是的,它真的很简单),并且完全基于对对数求梯度的方式:

回到我们的政策梯度。现在我们可以这样写:

我们展开对数中的项,注意结果是我们可以将乘积写成对数的和(典型的对数和规则):

基于标准微积分,梯度算子滑入总和,不依赖于参数的部分变为 0,策略对数似然保持不变:

结果是对轨迹的期望。现在我们可以写出辉煌的最终结果,或者换句话说叫做政策梯度定理:

I have written tau in the superscript because logically we compute the some for many trajectories.

预期下的希腊字母 ro 表示我们的政策和环境动态所导致的轨迹分布,我们根据这些动态来计算我们的预期。这种分布会导致很多令人头痛的问题,因为为了得到期望的良好估计,我们需要能够很好地代表我们的分布的样本。这正是非策略策略梯度算法的不足之处,因为它们使用来自不同行为策略的数据,导致不同的分布,从而导致对策略梯度的错误估计。无独有偶,我也写过一篇关于这个的文章:离策强化学习算法的虚假承诺。如果你对更多的细节感兴趣,请阅读它。

我们不能直接计算这个期望,它需要我们计算给定政策的所有可能的轨迹。我们能做的是用蒙特卡罗抽样来估计它。这只是一种奇特的说法,即我们对给定政策的一些轨迹进行采样,并取平均值作为期望值的估计。我们可以将它写成下面的形式,稍微滥用符号(M 表示我们用于估计的轨迹的数量):

这基本上就是全部了。这自然是一个更好的估计,我们有更多的样本,当然,如果样本保持真实的诱导分布的基础上,目前的政策,我们正在优化。换句话说,我们目前的政策所导致的分布与样本所来自的分布相似吗?为了缓解这种情况,研究人员采用了一些聪明的技巧,比如重要性抽样、替代损失函数等等,我不会在这里讨论,也许下次吧。

现在,我们终于到了帖子的末尾,回头看看它…我相信,如果你理解了所有的概念,现在你已经有了理解策略梯度算法的(非常)坚实的基础,你也可以尝试消化一些强化学习论文了!作为下一篇文章,你可能想知道为什么非政策强化学习效果不好:

  1. 非策略强化学习算法的虚假承诺

希望这是有趣和直观的!如果你什么都明白,那就做得很好,如果不是,没什么大不了的,大多数人一开始都不明白。再研究一遍。现在你有了工具,强化学习的世界已经开放了…玩得开心点!

Photo by Zac Durant on Unsplash

200 本书的剖析

原文:https://towardsdatascience.com/the-anatomy-of-200-books-c09ca91fd084?source=collection_archive---------24-----------------------

2011 年的某个时候,虽然我不记得是什么时候或如何发生的,但我意识到我想念阅读。我童年时是个书虫,但常见的干扰——电视、视频游戏、当时被称为互联网的神秘事物——侵蚀了我的阅读习惯。文字让位给了像素。那一年,我逐渐开始重新阅读,一个分水岭时刻在年底到来:我买了一台 Kindle。这是一个恰当的名字;我失去的阅读欲望又复活了。我发现自己一天中抽出越来越多的时间来阅读,这是我可以轻松做到的。

当 2012 年 1 月到来时,我决定我应该记录我所读到的。我还没有发现 Goodreads,所以我从一个普通的旧 Excel 电子表格开始。这包括我读过的每本书的作者、标题和流派。我接着发现了 Goodreads,但我保留了电子表格,在这两个网站上跟踪我的书。在过去一年左右的时间里,我觉得有必要对这些年的数据做些什么。在那段时间的大部分时间里,我没有好的输出想法。

2018 年底,我开始了一些关于数据分析的在线课程。作为一名 UX 研究人员,我总是对定性数据感到最舒服。我想在我的弓上加一根弦,提高我的数字能力。我还发现了安德烈·倪瓒在那段时间写的一篇文章。Andrea 分享了我记录阅读书籍的习惯,也分享了我讲述故事的愿望。我非常感谢 Andrea 向我介绍了一些工具,这些工具帮助我完成了这些工作(将在下一节介绍)。我从这篇文章中受到启发,并决定“媒介”将是一个讲述我的故事的好媒介。我的目标是应用我从课程中学到的原则来帮助讲述这个故事。

接下来是那个故事,用我读过的书来衡量我七年的人生。在那段时间里,我在三个城市生活过,换过职业,移民过,回国过,结过婚。我生活中的大变化引发了成百上千的小变化。但是书籍是永恒的。我很惊讶一本书仅仅看一眼书名就能唤起如此生动的记忆。我回到了去过的咖啡馆,乘过的火车,午餐时间去过的公园,以及其他十几个地方和时间。

方法

下面是我的方法的概要。如果你对书籍比对数据分析更感兴趣,你可以跳过要点后更详细的描述。

  • 建立一个电子表格来记录我读过的书。这结合了我自己的数据点和 Goodreads 获取的数据
  • 使用 OpenRefine 清理数据
  • 使用 Google Sheets 和 Microsoft Excel,使用查询和数据透视表进行数据分析
  • 故事板我想用 iPad 版画板讲述的数据故事
  • 使用 Excel 创建基本图表的数据可视化,使用 RAWGraphsVizyDrop 创建更复杂的可视化
  • 按照我的故事板写文章

这个方法始于我从 2012 年开始维护的电子表格。最初,我保持电子表格的基本形式,只记录作者、标题和流派。当我开始使用 Goodreads 时,我开始在我的电子表格中添加更多的列,这些列包含了我捕获的所有额外的数据点。在这个练习中,我手动添加了几个数据点,因为 Goodreads 不会跟踪它们。例如,Goodreads 并不记录你在某一年阅读了多少新作者。

随着电子表格中填充了我想要处理的所有数据,是时候清理它了。我用的是 OpenRefine,它有一点点的学习曲线。但是在几个教程视频之后,我能够完成我的电子表格所需要的基本操作。这是非常干净的开始,因为我已经从头开始建立了表。但是它也指出了一些一致性问题,比如作者的标签。例如,它显示我有一辆乔治·R·R·马丁和一辆乔治·r·r·马丁。

有了非常干净的数据,我开始了我的分析。我从 Google Sheets 开始,给自己做了一个仪表板,显示我需要的许多基本计数。这对提高我的语法是一个很好的练习。我有一些想法,但不确定如何执行,所以我求助于谷歌的帮助文档。当谈到数据透视表时,我将电子表格迁移到 Excel,因为我发现 Google Sheets 上的数据透视表功能几乎无法使用。也就是说,当我完成这个项目后,我重新访问了谷歌的数据透视表,它已经被完全修改了。也许我不是唯一有困难的人。

当我把数据榨干以获得真知灼见时,是时候弄清楚我在讲什么故事了。我开始写下所有的数据点,并寻找主题。这些主题将构成故事的主体。随着主题的出现,我做了一些故事板草图,包含了我想要包含的可视化:

我的低保真度草图最终只是故事的一部分。在我开始使用 RAWGraph 和 VizyDrop 这样的工具之前,我并不知道有可视化存在。这两款产品都很棒,只需点击一个按钮,就能为您提供数十张图表。这些观想中的一些相当突出,很难不被带走。我试着坚持让观想服务于我想要讲述的故事。我希望我在这方面取得了成功。

做完这些,是时候写了。我把文章的主体分为“作者”和“书籍”,最后是一些总结性的想法。

作者

首先,这是我迄今为止读过的所有作者的形象化描述:

在记录我阅读习惯的七年时间里,我总共阅读了 71 位作者的作品。虽然我手头没有任何基准,但我怀疑这是一个狭窄的作者范围。上面显示的作者中,有 43.6%的人读过两本或更多的书。似乎如果我喜欢一本书,那么我很可能会回到那位作者身边。如果我真的喜欢一本书,我会一次又一次地回来——我的前五位阅读作者占我读过的所有书籍的 39.5%。其中大部分属于斯蒂芬·金(24)。试图阅读马丁·路德·金的目录就像沿着错误的方向登上自动扶梯,这就是他出版新书的能力。这位恐怖片大师是特里·普拉切特(23 岁),他在 2015 年的去世是文学界的巨大损失。我在 Discworld 的持续旅程感觉更像是一次朝圣,而不是一种爱好。最近我意识到我应该放慢我的进度,因为我不想让它结束。

我把我最喜欢的五位作家(金、普拉切特、伍德豪斯、柯南道尔和盖曼)按年份进行了分类。看一下细目分类,似乎我在某一年里“迷上”了某个特定的作者。五位作者中的四位都占据了一年内阅读量的大部分(尼尔·盖曼是个例外)。然而,这一趋势在过去几年中似乎趋于平稳:

2013 was the year I tackled King’s Magnum Opus, The Dark Tower, and all its associated works. All things serve the Beam.

当你看读了的页而不是读了本书时,前五名改变了作文。前五名中掉出了 P.G .伍德豪斯和亚瑟·柯南·道尔,取而代之的是乔治·R·R·马丁和雷蒙德·费斯特。我想这并不奇怪,那些以维多利亚时代伦敦为背景的古怪故事而闻名的作者被高度幻想的巨著作者取代了。

我在上面提到过,我对作者的依赖在最近几年已经开始趋于平稳。随着时间的推移,新的作者和独特的作者的阅读数量进一步证明了这一点。新作者是一个不言自明的指标:它是一个我以前没有读过的作者的介绍。独特作者指的是在任何给定年份只读一次的人。检查这些维度的数据表明,自 2012 年以来,我一直在拓宽自己的视野:**

2012 is excluded from this chart, as all authors were ‘new’ as far as the records are concerned.

除了 2017 年之外,我个人图书馆的新作者数量每年都在增长。我不认为这是我有意识的努力,但看到这种趋势既有趣又令人鼓舞。现在我知道了这些数字,我将尝试保持这一趋势。

换个角度看,2017 年是我最多元化的阅读年。就独特作者而言,这是我唯一一年实现了作者与书籍 1:1 的比例。我承认这不是随机的——这是我在那年年初给自己设定的阅读挑战。由于我阅读的书籍量增加,我在 2018 年增加了独特作者的数量。这意味着,从绝对值来看,自 2014 年以来,独立作者的数量逐年上升:

The 1:1 ratio for 2017, reported above, is not quite accurate; during that year I read Mistress of the Empire, co-written by Raymond Feist and Janny Wurts, meaning the number of unique authors outnumbers books read.

看待这些数字的另一种方式是衡量每年每位作者平均阅读的书籍数量。这一数字从 2012 年的 2.1 人下降到 2017 年的 1 人,然后在去年再次攀升。

最后一个作者指标与性别有关。这并不适合伟大的阅读:200 本书中只有 25 本是女性作者写的,总共有 11 位独特作者。当绘制在下面的冲积图上时,我有点吃惊地看到,我在跟踪我的书四年后读到了我的第一位女性作者:

在我开始研究阅读习惯背后的数据之前,我并没有过多考虑作者的性别。因此,至少令人鼓舞的是,自 2015 年以来,这一比例一直稳步增长,2018 年是迄今为止的峰值。我想继续这一趋势,尤其是因为我最喜欢的一些作家是女性。苏珊娜·克拉克的乔纳森·斯特兰奇和诺瑞尔先生;克莱尔·诺斯的哈利·奥古斯特的前十五个生命;还有艾米丽·圣约翰·曼德尔的站 11跃入脑海。

我阅读的书籍的数据包括长度、类型和出版日期等方面。不过,我首先要谈的是书籍的形式。正如我已经提到的,我对阅读乐趣的重新发现在很大程度上归功于我购买了 Kindle。它让我意识到,由于它的外形,我几乎可以在任何地方阅读。也就是说,Kindle 对我来说不仅仅是方便。这本身就是一种美好的阅读体验,这是人们在谈论便利因素时有时会失去的一种品质。Kindle Voyage 是我拥有的设计最好的产品之一。

我意识到自己有被当成亚马逊骗子的风险。但所有这一切都是为了说明我和纸质书一样热爱电子书。我不需要检查数据就知道它们占了阅读书籍的最大份额——结果高达 79%。就年度分布而言,似乎没有任何可辨别的模式。我阅读电子书和纸质书比例相等的唯一一年是 2014 年。每隔一年,电子书都会或多或少地占据主导地位:

绝大多数纸质书都是精装本。我一直在收集分别由 Gollancz 和 Everyman 出版的 Discworld (特里·普拉切特)和 Jeeves (P.G. Wodehouse)的精装本。作为我的前五名作者中的两位,这些版本一直支撑着我收藏的纸质书的数量。

从阅读量来看,2012 年以来我已经阅读了 81,302 页,平均每本书 407 页。我特别感兴趣的是这将如何按年分解。我想知道我在任何一年的个人情况会如何影响我的阅读量,以及它在数据中的可见程度。

我的个人环境对我阅读习惯的影响在 2015 年最为明显。那一年是我阅读量最大的一年。也是在那一年,我搬到了伦敦,在那里我每天大约花一个小时坐地铁。诚然,以伦敦的标准来看,这相当不错,但这是我职业生涯中迄今为止最长的一次通勤。从数据来看,我似乎利用了我较长的通勤时间,阅读了我收藏的一些较大的书籍。我看了苏珊娜·克拉克的乔纳森·斯特兰奇和诺瑞尔先生,亚历山大·仲马的基督山伯爵,还有乔治·R·R·马丁那年冰与火之歌系列的大部分。2017 年,我从伦敦搬回爱尔兰,在此过程中短暂中断了职业生涯。图表显示,三个月不通勤影响了我的生产率,当我重新开始工作并开始在都柏林通勤时,生产率再次上升。

说到大部头,我平均每年写一本书不到一千页。这并不是一个非常平均的分布——正如上面提到的,其中一半都是在 2015 年被阅读的——但在那之后的三年里,我只读过一本。事实上,总的来说,我对更长书籍的兴趣似乎在减弱:帕特里克·罗特福斯的智者的恐惧是我自 2016 年以来读过的唯一一本超过 700 页的书。在 2017 年之前,我平均每年阅读 3.6 本这样长度的书。

Not Pictured: A few months before I started recording my reading habits I read King’s The Stand. If plotted here it would sit alongside his other masterpiece, IT, at circa 1350 pages.

这就引出了一个问题:在过去的七年里,网页的整体分布是什么样的?如上所述,每本书的总页数是 407 页。但是这并没有产生一个非常有趣的视觉效果,所以我画出了我的 200 本书的页面间隔。这表明模态组是 325 到 368 页:

这一篇幅看起来甚至达到了 370 页左右,从那里开始逐渐减少到笨重的大部头。我应该指出,2018 年占了较低端书籍的很大一部分。秋天的某个时候,我意识到我可以看 200 本书了。我承认,达到这一里程碑的前景影响了我今年剩余时间的阅读选择。2018 年阅读的 37 本书中有 20 本属于前四个发行组——占这些组的近四分之一。

我分析的最后一个主题是关于体裁。在安德里亚·倪瓒的文章中,体裁划分是小说和非小说。我理解保持二进制的好处。超越这种区分来分解书籍是困难的,因为它变得武断了。流派之间的界限往往很模糊。雷德利·斯科特的《异形》是恐怖片还是科幻小说?也就是说,把我读过的书分成不同的类型正是我所做的,不管是否科学。

这不仅仅是因为我的个人图书馆里缺少非小说类书籍。在某种程度上,这取决于我是如何记录的。我的书单上有我只为消遣而读的书。这些年来,我为了职业发展,或者为了改善我生活的其他方面,读了很多书,但是它们不在这里。也就是说,我想找到更多的非小说类书籍,它们的故事和小说类书籍一样吸引我。

我想找到一种方法使类型定义不那么武断,所以我想到了众包的主意。Goodreads 提供了一本书的流派,由用户决定。这些类型按照用户提名的降序排列。例如,理查德·马特森的我是传奇被归入“恐怖”、“科幻”、“小说”、“经典”、“吸血鬼”和“后启示录”等类型。但是我想保持流派的相互排斥。由于大多数用户将它归入恐怖片类别,这就是我在数据中记录的方式。这被证明是大多数书籍的有效方法,但在某些情况下,它造成了不一致。例如,它会把《T4》和《福尔摩斯探案集》分成不同的类别,比如“小说”、“经典”和“侦探”。但在大多数情况下,坚持 Goodreads 用户是很容易的。这给我留下了五种类型的清晰分类:幻想、小说、恐怖、非小说和科幻:

Tree Maps aren’t terribly exciting, so I couldn’t help adding a flourish. Icons made by Freepik from www.flaticon.com

当绘制在图表上时,这是另一个让我惊讶的结果。如果有人逼我说出我最喜欢的类型,我会在恐怖片和科幻片之间抛硬币。和电影一样,它们是我最认同的类型。事实上,在我的书中,这两者几乎是掷硬币的结果。令人惊讶的是,他们分别是第三和第四名。

就新作者而言,科幻小说似乎是我最喜欢冒险的领域。看下面的图表,这是唯一一个新作者比以前读过的作者多的类型(除了非小说类):

仔细想想,这是有道理的。我读过的奇幻书籍往往是一个长系列的一部分(其中一些,看起来,没有尽头。我会为下一部《冰与火之歌》《弑君者编年史》《绅士混蛋》做些什么。我的小说习惯也是如此:P.G .伍德豪斯和阿瑟·柯南-道尔以跨越一长系列书籍的人物而闻名。还有我对间谍的亲近感。我经常回到伊恩·弗莱明和约翰·勒·卡里,分别跟随詹姆斯·邦德和乔治·斯迈利的冒险。至于恐怖,嗯,你只需要看看哪个作家是我阅读排行榜上的第一名。就科幻小说而言,我倾向于少读系列小说,多读独立故事。奇怪的是,在我的科幻书架上有很多系列的书,我只看过第一本书。其中包括弗兰克·赫伯特的沙丘编年史,奥森·斯科特·卡德的安德的传奇,以及道格拉斯·亚当斯的银河系漫游指南。我说好奇是因为我喜欢这些系列的开场,但出于某种原因,我没有继续下去。

我探索的关于体裁的最后一个数据点是出版日期。我想知道我是否倾向于某一特定流派中的某一特定时代,以及它们之间的比较情况:

不同流派之间有一些非常明显的差异。幻想立即脱颖而出,成为与特定时间框架联系最紧密的类型。我只读过两本 1980 年前出版的奇幻书,比任何其他类型的书都少(同样抛开非小说类)。在所有的类型中,它集中了 20 世纪 80 年代、90 年代和 21 世纪 10 年代出版的书籍。另一方面,出版日期分布最广的类型是小说。大仲马的光辉复仇史诗《基督山伯爵》是我读过的最古老的书。恐怖片和科幻片分布相当均匀。我本以为 20 世纪中期会有更多的科幻书籍,但只有四本书代表了科幻小说的“黄金时代”。

结论

这项工作有两个主要目标:

1)运用我在数据分析和可视化课程中学到的一些原则

2)通过我在过去七年里收集的数据,了解我自己和我的阅读习惯。以下是一些要点:

  • 这些数据强调了我已经怀疑过的事情——我是一个“舒适区”读者。我倾向于回到相同的作者、类型和系列。在任何一年,我都更有可能拿起一本我以前读过的作者的书,而不是尝试一本新书。此外,那一年我很有可能会多看几本那位作者的书。我读的每三本书里就有一本是新作者写的,但我想让这一点更接近其他每本书。
  • 我的总体阅读效率没有太多明显的模式。在这七年中,阅读的书籍数量在再次转向另一个方向之前,连续两年多没有上升或下降。我已经预料到了这一点,但波峰和波谷并不像我想象的那样容易映射到我生活中的特定时期。我能确定的唯一趋势是,在过去几年里,我对长篇大论的兴趣有所减弱。平均页数从 2015 年的 478 页逐渐下降到 2018 年的 325 页。

那么,我该如何处理这些信息呢?除了写这篇文章之外,它还对我的阅读习惯提出了一些调整,我将尽力去做:

  • 更多地突破我的舒适区:我希望新老作者的比例更高。在这个目标下,我想增加女性作家的数量,因为七分之一的女性作家表现不佳。
  • 舒适区也适用于流派。我计划增加休闲时阅读的非小说类书籍的数量。如果几年后我再做这个练习,我希望这个百分比至少能达到两位数。
  • 如果奇幻书籍的数量保持不变,我想扩展到其他作者和系列。

我的阅读时间对我来说很宝贵,但我不认为这些变化会对它产生更坏的影响。我通常不喜欢阅读挑战,但我对横向引导我的习惯的想法感到兴奋。

我应该就这项工作本身说几句话。我处理的数据集并不复杂,但是使用 OpenRefine 这样的工具应用数据清理这样的原则是很好的。关于数据故事课程,我能够很好地运用一些实用的技巧。它教会了我故事板对我的数据的有效性。我还学到了老师演示的一些具体的故事机制,这很有帮助。

我并不是说这份工作除了个人宣泄之外还有任何特殊的价值。希望对喜欢阅读或喜欢数据的人有一些新奇的价值。或者像我一样,那些落在维恩图的中间。也就是说,我不想开始把书看成是一系列的标签和百分比。我要暂时忘记这些数据,继续阅读。

— — — — — — — — — —

更新

一些人建议我将我的原始数据附加到这篇文章中。在写这篇文章时,我想到了这一点,但我的问题是数据不是很整齐。我不是电子表格语法方面的专家,所以我使用了一些混乱的“技巧”,我相信更熟练的人会有更直接的方法来实现相同的结果。

也就是说,我花了几个小时整理电子表格,我认为它现在适合公众分享。您可以在这里访问电子表格。要使用逐年细分功能(U4 在‘Dashboard’),你必须制作自己的副本;请随意这样做。

当我更新这篇文章时,我想我应该指出一些发表后不久发生的很酷的事情。我工作的公司主办了一次 UX 设计会议,并为不同类别的演讲征集演讲者。其中一个类别被称为研究故事时间,演讲者将讲述与研究相关的故事,这些故事比给出的核心演讲更不寻常,或者更冷门。我改编了这篇文章,并将其作为提案提交(演讲必须以 PechaKucha 的风格发表),它被接受了。谈话进行得很顺利,但我想提到的是,在我谈到我的阅读缺乏多样性之后,我收到了大量关于女性写的科幻小说的推荐。我的积压现在看起来有点健康,并帮助我发现了作家,如 N. K .杰斯明,贝基钱伯斯,玛丽多里亚罗素和奥克塔维亚 e .巴特勒。我期待着阅读这些作者的作品,并在下次做这个练习时有一个更平衡的阅读组合。

对股市低迷的剖析

原文:https://towardsdatascience.com/the-anatomy-of-a-stock-market-downturn-6527e31406f0?source=collection_archive---------9-----------------------

我们调查过去的股市下跌,以了解下一次可能会是什么样子

如果你想用我的代码运行你自己的分析,你可以在我的 GitHub 这里 找到

十年来,尽管利率上升,收益率曲线反转,特朗普发推文,欧洲经济问题和贸易战,这波牛市仍在继续。但是现在如果你和五个人谈论股票市场,你可能会得到五种不同的关于股票和经济走向的观点。但不管你的个人观点是什么,你目前的定位是什么,思考一下聚会的结局可能是什么样子都是有帮助的。在本帖中,我们将通过 Python EDA(探索性数据分析)来看一看。

"幸运青睐有准备的人。"— 路易·巴斯德

检查市场下跌

在我看来,股市崩盘和/或衰退的定性影响比它们对你的投资组合的即时定量影响重要得多。随着时间的推移,损失的美元可以赚回来,但市场崩盘可能造成的心理创伤和压力要持久得多。在经济开始再次繁荣后很长一段时间,对糟糕时期的记忆继续伤害着一代又一代的投资者——通过对股市的恐惧和面对金融决策时的过度避险。

也就是说,回答“在一次典型的市场下跌中,股票会下跌多少?”这个问题肯定是有用的要做到这一点,让我们来看看标准普尔 500(美国股票市场的一个很好的代表)的历史。

下图描述了标准普尔 500 的下降(即从之前的历史高点下降的百分比)。我只看二战后的数据,因为经济和股票市场在过去几十年里变化太大了。此外,我使用的回报是价格回报,不包括股息(股息为市场下跌提供了少量缓冲,在本次分析中我想忽略这一点)。最后,我认为任何负的月回报,不管多小,都是股市下跌。

S&P 500 Decline from Previous Peak (Since 1950)

一些有趣的事情跳了出来:

  • 自 1950 年以来,标准普尔 500 下跌超过 30%的情况只有三次。然而,其中的两次(互联网泡沫和金融危机)都发生在过去 20 年里。
  • 20 世纪 70 年代对投资者来说是一个可怕的时代。当时原油价格飙升,通货膨胀和利率经常超过 10%(美联储的目标是 2%),失业率居高不下。
  • 相比之下,上世纪 90 年代(互联网泡沫破裂前)和 2010 年代(金融危机后至今)一直非常平静,让市场不断创出历史新高。这些长期平静的时期似乎更像是一种例外,而非常态。
  • 随后的市场大崩盘(跌幅超过 20%)的复苏进展缓慢,通常需要几年时间才能恢复到前所未有的高点。通常这些大的下跌伴随着经济衰退。
  • 另一方面,较小的市场下跌(跌幅小于 20%)通常会在市场低谷的几个月内迅速恢复(因为市场参与者意识到他们所恐慌的任何“股市妖怪”都不是真实的)。

对数字的深入探究

总而言之,我看了 820 个月的数据(从 1950 年到现在)。其中,282 个月(34%的观察值)的股票收益为负。最糟糕的一个月是 2008 年 10 月,T2 下跌了 20%(T3)(这发生在金融危机期间)。

然而,大多数下跌持续时间超过一个月——在我的样本中,市场下跌的平均时间是 3.8 个月。因此,不要只看每个月本身,更有启发性的是关注整个波峰到波谷的下跌,无论是一个月还是几个月。

下表从几个方面分析了这些从峰值到谷值的下降。

  • 平均峰谷跌幅衡量标准普尔 500 指数(不包括股息)的平均峰谷跌幅百分比。
  • 下跌持续时间衡量前一个历史高点和当前市场下跌低谷之间的平均时间长度。
  • 恢复到前期高点的持续时间衡量股票市场从低谷到下一个历史高点的平均时间长度。

Metric Comparison for Market Declines of Varying Magnitude

让我们将观察频率(表中的观察次数)绘制为概率。

在大多数情况下(观察到的市场下跌的 71%),市场在最坏的情况下经历了 5%的下跌

而整体平均 6.1%的跌幅也不算太差。但是,如果我们只关注标准普尔 500 下跌超过 5%的时候,事情看起来要危险得多:

其中 59%的时候,市场下跌 10%或更多,27%的时候,市场暴跌 20%或更多!

因此,当市场下跌超过 5%时,我们需要认识到这样一个事实,即市场可能会继续下跌,并有可能崩盘。请注意,我们这里使用的是小样本,因此会有很多噪音。

Historical Probabilities of Market Declines of Varying Magnitude

从上面的表格中,我们还可以清楚地观察到两种类型的市场下跌(在下面的柱形图中可以看到):

  1. 小幅下跌之后是快速、大幅的反弹。
  2. 需要数年时间才能恢复的可怕的股市崩盘。这些损失需要更长的时间来弥补,因为大的市场崩溃通常伴随着衰退、银行信贷紧缩、投资者绝望和大量破产。

请记住,我在数据中忽略了股息。有了股息(尤其是如果你再投资的话),回收期会有所缩短。

Market Crashes of -20% or Worse Take Much Longer to Recover From

最后,从上面的图表中注意,在更大的下跌中,标准普尔 500 花时间寻找底部(蓝色柱)。所以,如果你想低价买入,要循序渐进,有纪律。最有可能的是,你最终会买一些,然后看着市场在下个月再下跌 5%(这时你可以再买一些)。

股市崩盘时,高飞的股票会跌回地面

最后,让我们看看过去的股市宠儿在互联网泡沫破裂或金融危机中的表现,以了解今天的高材生如网飞或 T2 在市场严重低迷时的表现。

在 20 世纪 90 年代末互联网泡沫最盛的时候,领先的科技公司如微软思科处于世界之巅。然后泡沫破裂,持有这些股票的投资者损失惨重:

Ouch!

2008 年,金融危机前夕,苹果发布 iPhone 仅一年,而美国银行是世界上最大和最赚钱的银行之一。接着,房地产泡沫破裂,全球金融体系几乎崩溃:

Bank Stocks Got Crushed in 2008

在这两种情况下,当天最受欢迎的股票在崩盘期间的跌幅都超过了整体市场。然而,在 2000 年,科技股是最被高估的,因此它们的跌幅明显大于整体市场。与此同时,在 2008 年,正是银行坐拥金融市场,因此银行股在随后的经济衰退中遭受了最沉重的打击。

关键要点

  • 大多数市场跌幅都很小,很快就恢复了。即使是 15%的跌幅,平均也是在谷底后 5 个月恢复。我想“购买蘸酱”终究还是有一些智慧的。
  • 股市崩盘(下跌 20%或以上)要痛苦得多,这不仅是因为下跌的幅度,还因为平均需要 1.5 到 4.5 年才能从损失中恢复过来。
  • 当我这样说的时候,这听起来很明显——但是在标准普尔 500 已经下跌了至少 5%的情况下,我们面临着更大的市场崩溃风险。
  • 在牛市的后期,集中持有当天最受欢迎的股票是有风险的。在崩盘期间,这些雄心勃勃的人受到的惩罚远远超过整体股市。
  • 在市场下跌期间,逐步并有纪律地部署资金。在严重下跌的情况下,股市至少需要几个月才能触底,因此随着时间的推移,应该有足够的机会平仓。
  • 如果像大多数情况一样,市场迅速反弹,不要因为你没有配置好所有的现金而去 FOMO。未来总会有更多的购买机会。

祝你好运!

延伸阅读

股票是否提供正的预期回报?

我有足够的钱退休吗?

K 均值的剖析

原文:https://towardsdatascience.com/the-anatomy-of-k-means-c22340543397?source=collection_archive---------6-----------------------

K 均值聚类算法完全指南

Photo by Ankush Minda on Unsplash

假设您想要根据内容和主题对数百(或数千)个文档进行分类,或者出于某种原因您希望将不同的图像组合在一起。或者更重要的是,让我们假设您已经对相同的数据进行了分类,但是您想要挑战这种标记。您想知道数据分类是否有意义,或者是否可以改进。

好吧,我的建议是你把你的数据聚集起来。信息经常被噪声和冗余所掩盖,将数据分组到具有相似特征的簇(聚类)是一种有效的方式来照亮一些信息。

聚类是一种广泛用于寻找具有相似特征的观察组(称为聚类)的技术。这个过程不是由特定的目的驱动的,这意味着您不必特别告诉您的算法如何对这些观察值进行分组,因为它会自己进行分组(组是有机形成的)。结果是同一组中的观察值(或数据点)之间比另一组中的其他观察值更相似。目标是获得相同组中尽可能相似的数据点,以及不同组中尽可能不相似的数据点。

K-means 非常适合探索性分析,是了解数据和提供几乎所有数据类型的见解的完美工具。无论是图像、图形还是文本,K-means 都非常灵活,几乎可以处理任何内容。

无监督学习领域的巨星之一

聚类(包括 K 均值聚类)是一种用于数据分类的无监督学习技术。

无监督学习意味着没有输出变量来指导学习过程(没有这个或那个,没有对错),数据由算法探索,以找到模式。我们只观察特征,但没有既定的结果衡量标准,因为我们想找出它们。

与监督学习相反,在监督学习中,你的现有数据已经被标记,并且你知道你想要在你获得的新数据中确定哪种行为,无监督学习技术不使用标记数据,算法自行发现数据中的结构。

在聚类技术领域中, K-means 可能是最广为人知和最常用的方法之一。K-means 使用迭代优化方法,根据用户定义的聚类数(由变量 K 表示)和数据集产生最终的聚类。例如,如果您将 K 设置为等于 3,那么您的数据集将被分组为 3 个簇,如果您将 K 设置为等于 4,那么您将数据分组为 4 个簇,依此类推。

K-means 从任意选择的数据点开始,如建议的数据组的 means ,并迭代地重新计算新的均值,以便收敛到数据点的最终聚类。

但是,如果您只是提供一个值(K),算法如何决定如何对数据进行分组呢?当你定义 K 的值时,你实际上是在告诉算法你想要多少个均值或质心(如果你设置 K=3,你创建了 3 个均值或质心,这占了 3 个聚类)。质心是代表聚类中心(平均值)的数据点,它不一定是数据集的成员。

算法是这样工作的:

  1. 随机创建 K 个质心(基于预定义的 K 值)
  2. K-means 将数据集中的每个数据点分配到最近的质心(最小化它们之间的欧几里德距离),这意味着如果一个数据点比任何其他质心都更靠近该聚类的质心,则该数据点被视为在特定的聚类中
  3. 然后,K-means 通过取分配给质心的聚类的所有数据点的平均值来重新计算质心,从而相对于前一步骤减少了总的聚类内方差。K-means 中的“means”指的是平均数据并找到新的质心
  4. 该算法在步骤 2 和 3 之间迭代,直到满足某些标准(例如,数据点和它们对应的质心之间的距离之和最小化、达到最大迭代次数、质心值没有变化或者没有数据点改变聚类)

In this example, after 5 iterations the calculated centroids remain the same, and data points are not switching clusters anymore (the algorithm converges). Here, each centroid is shown as a dark coloured data point. Source: http://ai.stanford.edu

运行该算法的初始结果可能不是最佳结果,使用不同的随机起始质心重新运行该算法可能会提供更好的性能(不同的初始对象可能会产生不同的聚类结果)。因此,通常的做法是以不同的起点运行算法多次,并评估不同的启动方法(例如,Forgy 或 Kaufman 方法)。

但是另一个问题出现了:你如何知道 K 的正确值,或者要创建多少个质心?对此没有通用的答案,尽管质心或聚类的最佳数量不是先验已知的,但是存在不同的方法来尝试估计它。一种常用的方法是测试不同数量的聚类,并测量所得的误差平方和,选择 K 值,在该值处增加将导致误差和非常小的减少,而减少将急剧增加误差和。定义最佳聚类数的这个点被称为“肘点”,并且可以被用作寻找 k 值的最佳选择的视觉测量。

In this example, the elbow point is located in 3 clusters

K-means 是您的数据科学工具包中的必备工具,这有几个原因。首先,它易于实施并带来高效的 T2 性能。毕竟,您只需要定义一个参数(K 的值)就可以看到结果。它也是,并且与大数据集配合得非常好,使它能够处理当前的海量数据。它非常灵活,几乎可以用于任何数据类型,而且它的结果比其他算法更容易解释。此外,该算法非常受欢迎,以至于你可以在几乎任何学科中找到用例及实现。

但是任何事情都有不利的一面

然而,K-means 存在一些缺点。第一个是你需要定义个集群,这个决定会严重影响结果。此外,由于初始质心的位置是随机的,结果可能不可比,并显示出缺乏一致性。K-means 生成具有统一大小的聚类(每个聚类具有大致相等数量的观察值),即使数据可能以不同的方式表现,并且它对异常值和噪声数据非常敏感。此外,它假设每个聚类中的数据点被建模为位于该聚类质心周围的球面内(球面限制),但是当违反该条件(或任何先前的条件)时,该算法会以非直观的方式表现。

Example 1

示例 1: 在左侧是数据的直观聚类,两组数据点之间有明显的分隔(一个小环被一个大环包围)。在右侧,相同的数据点由 K-means 算法聚类(K 值为 2),其中每个质心用菱形表示。如您所见,该算法无法识别直观的聚类。

Example 2

例 2: 左手边是两个可识别数据组的聚类。在右侧,相同数据点上的 K-means 聚类的结果不符合直观的聚类。与示例 1 的情况一样,由于算法的球面限制,K-means 创建的分区不能反映我们视觉识别的内容。它试图寻找周围有整齐数据球体的质心,当星团的几何形状偏离球体时,它的表现很差。

Example 3

示例 3: 同样,在左侧有 K-means 未能识别的两个清晰的聚类(一个小且紧密的数据组和另一个较大且分散的数据组)(右侧)。在这里,为了平衡两个数据组之间的聚类内距离并生成大小一致的聚类,该算法混合两个数据组并创建两个不代表数据集的人工聚类。

有趣的是,K-means 不允许彼此远离的数据点共享同一个聚类,不管这些数据点之间的关系可能有多明显。

现在该怎么办?

事实是,现实生活中的数据几乎总是复杂的、杂乱的和嘈杂的。现实世界中的情况很少反映出应用现成算法的明确条件。在 K-means 算法的情况下,预计至少有一个假设被违反,因此我们不仅需要识别这一点,还需要知道在这种情况下该做什么。

好消息是有替代方案,缺陷可以被纠正。比如将数据转换为极坐标可以解决我们在例 1 中描述的球面限制。如果您发现严重的局限性,也可以考虑使用其他类型的聚类算法。可能的方法是使用基于密度的或基于层次的算法,它们修复了一些 K-means 的局限性(但也有它们自己的局限性)。

总之,K-means 是一个很棒的算法,有很多潜在的用途,所以它可以用于几乎任何类型的数据分组。但是从来没有免费的午餐:如果你不想被引导到错误的结果,你需要了解它的假设和运作方式。

感谢 Sabrina Steinert 的宝贵意见

对这些话题感兴趣?在 Linkedin或 Twitter 上关注我

我们观察的角度

原文:https://towardsdatascience.com/the-angles-from-which-we-see-582c5cb5ec75?source=collection_archive---------23-----------------------

向非技术观众揭开 PCA 的神秘面纱

想象你是一个艺术家,想在一张纸上画一栋房子。这个任务的本质是将一个物体从 3D 世界转换到 2D 平面。

如果你可以在这个房子里自由走动,你会选择哪个角度来画画?

Two different angles to look at the house

我们想要的是画房子的最佳角度,以这种方式可以很好地捕捉到关于这个房子的最重要的信息——如窗户的位置、高宽比。因此,我们可能会选择从左图所示的角度将房子“投影”到纸上,而不是右图所示的角度。

在机器学习中,我们处理类似的问题。

真实世界的数据集通常有太多的维度(特征)而无法有效地可视化。例如,客户的购买行为可以归因于许多因素,如收入、年龄、社会价值观等等。这些因素中的每一个都会在数据集中给出一个新的维度。

然而,人类很难在视觉上想象一个超过 3 维的数据集。因此,为了让领域专家查看数据并从中提取有意义的结论,我们通常需要将数据集缩减为几个主要部分。

这个降维的过程可以通过主成分分析(PCA) 来实现,这是一种在无监督学习中广泛使用的方法。

举例来说,我们看一个二维数据集,如下图所示,在 x-y 平面上,看看我们如何将它简化为一维,即一条线。

Two angles to project the data onto a line

从数学上来说,有不同的方法找到正确的投影。本质上,我们在寻找一条到所有数据点的平均(均方)距离最小的直线。通过选择左边的线,数据的大多数变化将被保留在新的维度中。

因此,主成分分析的核心思想是找出我们投射数据的最佳角度。

在实际使用案例中,这可能意味着将要素总数从数千个减少到数百个,从而显著缩小数据集。然而,在这里,我们将看一个关于客户定位的相当简单的用例。

假设我们想要了解我们的客户,以获得对我们提供的产品推荐类型的洞察力。一种可能是查看他们的购买记录,以了解他们购买行为背后的个人特征。我们可能会得出这样的结论:一些客户更注重价格,一些客户更快地采用技术。

Customers’ speed for tech adoptions vs price sensitivity

直觉上,客户对价格的敏感度和技术采用的速度可以降低到一个维度,在某种程度上捕捉客户对高科技公司的整体吸引力。因此,我们可以在新的红线上表示每个客户,其中位于红线右侧的客户比位于左侧的客户更有吸引力。

Customer attractiveness = weight1 × p + weight2 × t + c

一般来说,每个主成分都是原始特征的线性组合。同样,这里的客户吸引力是价格敏感度(p)和技术采用(t)的加权和,再加上一些常量值(c)。

在我们生活的复杂世界中,我们不断地选择正确的角度来看待事物。从某些角度来看,我们感知到一些有意义的东西,而从另一些角度来看,我们没有。

就像艺术家选择一个角度来画一栋房子一样,PCA 是关于选择我们看到的那个直角。

AOC 回复数据集

原文:https://towardsdatascience.com/the-aoc-reply-dataset-190925c3d6f9?source=collection_archive---------16-----------------------

众议员亚历山大·奥卡西奥-科尔特斯的“@AOC”推特账户是政治讨论的热点。这位经验丰富的互联网冲浪者警告说,“不要看评论,”但我在那里花了很多时间,阅读,困惑,幸运的是只有一次被引诱回复(有人说她只能在布鲁克林获得选票)。

在政治推特上,最刻薄的用户被称为“机器人”。我不知道这些帐户是否是真正的保守派,钓鱼的一次性帐户,或者有组织的政治或垃圾邮件机器人。我只知道,即使我屏蔽了最差的账户,还是会有更多的账户出现。

机器学习的机会

我认为对 AOC 回复的大样本进行分析和聚类会很有趣。把账户当蜜罐。也许由此产生的模型可以学会过滤掉任何地方的不良推文?

理想的系统(在我看来)会自动将推文分类成 5-10 个原型,用户可以选择看或不看。我没有资源来手动标记每一条推文,而这正是我对监督学习的期望。
“情绪分析”对推文中的关键词做得太多了,对上下文没有帮助——是有人愤怒地回应一篇新闻文章,还是对一只酒店的猫尖叫?

抓取 Twitter

Twitter 的官方 API 为他们的数据提供了一个狭窄的选择范围。不幸的是,没有一个可以获取特定推文的回复 GitHub 和 StackOverflow 上流传着一些脚本,可以搜索最近的推文并挑选出回复,但以 Twitter 的速度,我永远不会捕捉到一周或一个月的讨论。另一种选择是稍微修改一下。

(非服务条款友好,继续下去风险自负)
我写了一个 TamperMonkey 脚本让我的浏览器在我滚动回复时下载每条推文的文本和元数据。我已经注销了我的帐户,以获得一个没有用户阻塞的更少偏见的视图(注意 Twitter 已经在旧线程中隐藏了一些用户)。我打开了 2019 年 3 月“@AOC”账号发的每一条推文和转发。最终结果是大约 110,000 个回复(一个 27.1 MB 的 CSV)。我愿意与研究人员分享代码和数据。

相关作品

方法学

我想出了一些分析推文的方法:

  • A : 对可疑用户的文本进行监督学习— 根据用户名和用户名(以数字结尾,以 MAGA、QAnon 或 Trump 结尾)选择一组“可能恶意”的推文。这是不是因为政治而禁止用户,而是开发一个以 burner 和 troll 账户为模式的模型。根据回复的文本训练一个模型,并根据他们的分数对一条推文进行评级。
  • B:对亵渎性和煽动性用户的文本进行监督学习— 与之前类似—在推文文本中搜索关键词的回复(亵渎性、无关主题中的煽动性话题、人身侮辱、标签)。将这些推文以及这些用户的任何其他推文放入“恶意”集合,并根据他们的分数对其他推文进行评级。
  • C:使用 word2vec 的无监督学习— 对 Tweet 文本运行 word2vec,然后使用 k-means 聚类进行分组。
  • D:使用 scikit-learn 的无监督学习— 使用 scikit-learn 和关键字标志进行层次聚类(因为全文似乎不太容易适用于该程序)。

分析和结果

监督学习的结果

由于手动过程,我起初不想标记推文,但有了用户名选项,只需几条 SQL 语句。首先,统计数据:

  • 在 110,000 条回复中,17k 条来自以 3+数字结尾的“数字用户”,大约 2000 条来自拥有特朗普/马加/匿名/民族主义者名字的用户
  • 没有明显的领导者:其中只有 12 个在一个月内发布了 30 多条回复
  • 在 3,300 名多次回复的用户中,他们平均每周仍不到一次

对我来说,这强调了 Twitter 上一个缺失的功能:一个简单的正则表达式可以找到成千上万的用户,我没有时间一一解决。现有的“黑名单”忽略了创建新账户有多容易。

我有过用 Google AutoML 建立一个监督的 NLP 模型的经验,但是考虑到所有的原始推文和回复,它最初没有将的任何归类为“坏推文”。当您的数据非常不平衡(6:1 或更糟)时,AutoML 可以忽略次要类别,并声称精确度在 80%左右。

对于我的第二次运行,我决定收集亵渎的推文(以及它们的作者的额外推文),总共 15k。我用 15k 条随机选择的正常推文平衡了这些推文,而不是完整的数据集。

Confusion matrix for “reply” and “original tweet | reply” input formats were similar

混淆矩阵在这里很难读懂,但是预测“真实”意味着模型认为它是亵渎的。不同寻常的是,这个模型的有用性取决于哪些推文属于预测真实/亵渎,但在我最初的选择过程中被标记为虚假。我检查了这个类别:

另一类显示的是被认为是亵渎性的用户的推文,而这个模型会把它们标为非亵渎性的。

这两个列表都令人鼓舞——我很高兴 Python 脚本和 SQL 查询模板可以进行粗略的标记,AutoML 可以从中构建更通用的规则,并且产生的分类器似乎工作得很好。

我更喜欢一个分类器,它将原始推文的文本和回复作为单独的列,并使用其他推文属性。对我来说幸运的是,微软刚刚为 Azure 添加了一个自动化实验平台,这本入门指南将于 2019 年 5 月发布。Azure 运行各种算法并报告哪种算法具有最好的准确性,在本例中是“MaxAbsScaler,SGD”(从 0 到 1 缩放每一列,然后使用随机梯度下降)。

‘VotingEnsemble’ combines multiple methods. Stochastic Gradient Descent was the winner here

据报道,准确率很高,但我不可能审查 Azure 版本的应该是糟糕的推文。我可以将模型下载为 145 MB 的 pickle 文件,但不清楚如何在 Azure 环境或我的本地机器上继续使用它。如果出现更好的文档和演练,请关注这个空间。

无监督学习的结果

Reddit NLP 教程非常容易使用,以至于我很快从自己的数据集中聚类出单词。我要了 10 组,并从每组中打印出最上面的单词:

一开始我很气馁。集群#1 挑选了一些基础设施和政策术语,但它挑选了其中的许多。聚类#9 似乎只是“动词”。另一组有、【更快】、【更便宜】、【更聪明】、【更好】、【更少】……语法相关但意义不相关的单词。

在扩展我的脚本以显示 50 个集群之后,它们包括了如下主题:

  • 环境(‘温度’,‘降温’,‘灭绝’,‘洪水’,‘洪水’,‘灾害’,‘温室’,‘自然’,‘流行病’,‘雪’,‘工业’)
  • 骂人('黑客'、'独裁者'、'激进分子'、'骗子'、'演员'、'骗子'、'骗子'、'失败者')
  • 道德(‘漏过的’,‘贡献’,‘违反’,‘PACS’,‘助手’,‘账目’,‘隐藏的’,‘道德’)
  • 少数群体

聚类分析的效用是混合的,因为它确实显示了属于主题组的关键词,但我不认为这有助于揭示好的和坏的推文。更新:我正在看一门斯坦福 NLP 课程Gensim syn 0 解释——将单词放入向量空间的原始数据是在 2016 年大选之前创建的,因此特朗普、克林顿和其他单词的关联自此发生了变化。
我决定遵循这篇 Twitter 分析教程的路径,生成一些 D3 直方图来显示与环境相关的回复是由源自 AOC 的环境和绿色新政推文激发的。

histogram of original environment Tweets and replies; each bar represents 4 hours

与环境相关的回复 AOC 每天都达到峰值,并在 MSNBC 与克里斯·海耶斯(Chris Hayes)的一次市政厅会议后飙升。让我们为下一个图表设置新的坐标轴。从零时发布一条新的环境推文开始,相关回复通常会在什么时候出现?

decay of interest in a Tweet by minute (environmental topics and environmental replies only)

这与骂人的回答相比如何?

after environmental tweets, environmental replies (green) and name-calling replies (orange) are almost even in the first 30 seconds; name-calling immediately tapers off to a lesser share of Tweets

最后,我决定构建层次聚类模型,重点是对用户回复的总和进行分类。我创建了几个列来统计在一个扩展的亵渎性列表中出现的术语、环境词、骂人的词等,这些都是上一个示例中的集群所通知的。我查看了 10 个集群和 30 个集群的几个用户的推文,但在他们的推文中看不到有意义的共性?在我看过的所有样本中,除了一个之外,肯定都有攻击性的陈述。我想知道它们是否按照出现次数从高到低进行分组,这更多地是由帖子数量而不是实际内容驱动的。

测试它

在新的 AOC 推文中,哪些推文会被标记?让我们回顾一下我在 AutoML 中制作的监督学习模型。我打开预测标签,浏览了几条推文(这些被标记为“恶意”)。

here wew go: 99% positive

even though this one is anti-GOP, it was flagged

令人失望的是,下面的一些糟糕的推文不会受到该模型的影响。
(5 月 7 日更新 :我选择了一些不具有辱骂性或阻止价值的样本……它们的好坏取决于上下文和你的个人政治,但我认为它们是糟糕的回复,而 ML 模型不是)

结论

我不会用这个平台来追踪复杂的巨魔。回到我开始屏蔽的时候,我会通过检查他们的照片、个人资料和追随者数量来确认一个帐户是否“值得”,以确认该帐户是否只是一个一次性/政治巨魔帐户。我会找到有“旅游交易”的账户,有一天这些账户会切换到所有大写的政治讨论、股票照片和所有数字用户名。Twitter 确实有所有这些数据,加上社交图、位置/IP、登录行为、用户对用户屏蔽和静音以及报告历史。对于他们来说,预测我可能会阻止谁是微不足道的。

我成功的地方是收集了一个有趣的数据集(我希望与更多的研究人员分享),并产生了一个平台的下一个最好的东西:一个针对政治和新闻线索的部分过滤器。它使用机器学习,而不是简单的正则表达式(尽管,老实说,看起来仅此一项就可以过滤掉很多)。我也很高兴它不是一个广泛的政治分类器,因为它是针对“坏”推文进行训练的,而不是保守派推文或布莱巴特文章或 Gab 内容的数据集。

无监督学习,至少对于像我这样的教程爱好者来说是普遍可用的,对分析比对内容分类更有用。这让我很惊讶,我希望能了解更多。
Azure 有一套很好的库和 Jupyter 笔记本基础设施,我将在未来的监督学习项目中使用它们,但我迷失在它们的界面中。

我期待看到其他算法阻止社会主义者的观点或在这方面的其他扭曲。我们如何在 Twitter 上使用过滤气泡,同时仍然获得稳定的、对我们有挑战性的、写得很好的故事?
听起来像是另一种算法的工作🤔

神经网络的逼近能力(使用 Python 代码)

原文:https://towardsdatascience.com/the-approximation-power-of-neural-networks-with-python-codes-ddfc250bdb58?source=collection_archive---------15-----------------------

Image by Gerd Altmann from Pixabay.

为什么神经网络可以预测(几乎)任何过程的结果

介绍

众所周知,神经网络可以逼近任何连续数学函数的输出,不管它有多复杂。以下面的函数为例:

Generic function (generated using Mathematica).

尽管它的形状非常复杂,我们稍后将讨论的定理保证了我们可以建立某种神经网络,它可以像我们想要的那样精确地逼近 f(x) 。因此,神经网络显示了一种普遍的行为。

神经网络受到如此多关注的原因之一是,除了这些相当显著的通用属性,它们还拥有许多强大的学习功能算法

普遍性和数学基础

这篇文章将给出人工神经网络这些近似能力背后的一些基本数学结果(定理)的非正式概述。

“几乎任何你能想象到的过程都可以被认为是函数计算……[例子包括]根据一段音乐的简短样本命名一段音乐[…],将一段中文文本翻译成英文[…],获取一个 mp4 电影文件并生成电影情节的描述,以及对表演质量的讨论。”

—迈克尔·尼尔森

使用神经网络作为逼近器的动机:Kolmogorov 定理

1957 年,俄罗斯数学家安德雷·柯尔莫哥洛夫证明了一个关于多变量实函数表示的重要定理,他因在广泛的数学课题(如概率论、拓扑学、湍流、计算复杂性等)上的贡献而闻名。根据 Kolmogorov 定理,多元函数可以通过(有限个)一元函数的和与合成的组合来表示。

The Russian mathematician Andrey Kolmogorov (Wikipedia)

稍微正式一点,该定理陈述了在 n 维超立方体(其中 n ≥ 2)中定义的实变量的连续函数 f 可以表示如下:

Kolmogorov’s Theorem (1957)

在这个表达式中, g s 是一元函数,ϕs 是连续的、完全(单调)递增的函数(如下图所示),不依赖于 f. 的选择

Examples of monotonous functions (Wikipedia).

通用逼近定理(UAT)

UAT 指出,包含具有有限数量节点的单个隐藏层的前馈神经网络可以用于逼近任何连续函数,只要满足关于激活函数形式的相当温和的假设。现在,由于我们能够想象的几乎任何过程都可以用某种数学函数来描述,神经网络至少在原则上可以预测几乎每个过程的结果。

使用不同激活函数的前馈人工神经网络的通用性有几种严格的证明。为了简洁起见,我们只讨论 sigmoid 函数。Sigmoids 是“S”形的,包括作为特例的逻辑函数Gompertz 曲线ogee 曲线

乙状结肠的 Python 代码

构建和绘制 sigmoid 函数的快速 Python 代码如下:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inlineupper, lower = 6, -6
num = 100def sigmoid_activation(x):
    if x > upper:
        return 1
    elif x < lower:
        return 0
    return 1/(1+np.exp(-x))vals = [sigmoid_activation(x) for 
       x in np.linspace(lower, upper, num=num)]
plt.plot(np.linspace(lower, 
                     upper, 
                     num=num), vals);
plt.title('Sigmoid');

A plot of the sigmoid function. In the code, the conditionals inside the function are included to avoid problematic computations at large values.

乔治·西本科的证明

Cybenko (1989) 给出的证明以其优雅、简单和简洁而闻名。在他的文章中,他证明了下面的说法。设ϕ是 sigmoid 型的任何连续函数(见上面的讨论)。给定任何多元连续函数

N 维实空间的子集和任何正ϵ内,都有向量

(权重、常数

(偏置术语)和

到这样的程度

对于紧凑子集内的任何x(NN 输入),其中函数 G 由下式给出:

选择适当的参数,神经网络可以用来表示各种不同形式的函数。

使用 Python 的示例

为了使这些陈述不那么抽象,让我们构建一个简单的 Python 代码来说明到目前为止所讨论的内容。以下分析基于迈克尔·尼尔森(Michael Nielsen)的伟大的在线书籍,以及马特·布雷姆斯贾斯汀·庞德斯大会数据科学沉浸式(DSI) 上的精彩演讲。

我们将构建一个神经网络来近似以下简单函数:

在深入研究代码之前,需要做一些说明:

  • 为了使分析更加直观,我将使用 sigmoid 函数的简单极限情况。当重量非常大时,s 形接近亥维赛阶梯函数。因为我们将需要添加来自几个神经元的贡献,所以使用阶跃函数比一般的 sigmoids 更方便。

  • 在 sigmoid 逼近阶跃函数的极限中,我们只需要一个参数来描述它,即阶跃发生的点。s 的值可以表示为等于 s=-b/w 其中 bw 分别是神经元的偏差和权重。
  • 我要建立的神经网络将是一个非常简单的网络,有一个输入、一个输出和一个隐藏层。如果两个隐藏神经元对应的权值绝对值相等,符号相反,则它们的输出变成一个“凸起”,其高度等于权值的绝对值,宽度等于每个神经元的 s 值之差(见下图)。

  • 我们使用下面的符号,因为权重的绝对值是凸起的h8。

  • 因为我们想要近似 g,隐藏层的加权输出必须包含 sigmoid 的逆。事实上,它必须等于:

为了重现该函数,我们选择 h s 的值为(见下图):

Taken from here.

代码

代码以下列定义开始:

  • 我们首先导入需要构建反 sigmoid 函数的inversefunc
  • 然后我们选择一个非常大的权重给 sigmoid,使其类似于 Heaviside 函数(正如刚刚讨论的)。
  • 我们选择输出激活作为身份函数identify_activation
  • 该函数的作用是从 sw 中恢复原来的 (w,b) 参数化(记得 s 是步进位置)。
  • 架构设置好了,所有的 w s 和 b s 都选择好了。数组weight_outputs的元素是从上一节给出的输出权重值中获得的。
from pynverse import inversefuncw = 500def identity_activation(x):
    return(x)def solve_for_bias(s, w=w):
    return(-w * s)steps = [0,.2,.2,.4,.4,.6,.6,.8,.8,1]bias_hl = np.array([solve_for_bias(s) for s in steps])
weights_hl = np.array([w] * len(steps))
bias_output = 0
weights_output =np.array([-1.2, 1.2, -1.6, 1.6, 
                          -.3, .3, -1])
                          1, 1, 1, -1])

最后的步骤是:

  • 编写一个我称之为nnPython函数来构建和运行网络
  • 打印出近似值和实际函数之间的比较。
def nn(input_value):

    Z_hl = input_value * weights_hl + bias_hl
    activation_hl = np.array([sigmoid_activation(Z) 
                              for Z in Z_hl])Z_output = np.sum(activation_hl * weights_output) 
               + bias_outputactivation_output = identity_activation(Z_output) 

    return activation_outputx_values = np.linspace(0,1,1000)
y_hat = [nn(x) for x in x_values]def f(x):
    return 0.2 + 0.4*(x**2) + 0.3*x*np.sin(15*x)+ 0.05*np.cos(50*x))y = [f(x) for x in x_values]inv_sigmoid = inversefunc(sigmoid_activation)y_hat = [nn(x) for x in x_values]
y_invsig = [inv_sigmoid(i) for i in y]
_ = plt.plot(x_values, y_invsig)
_ = plt.plot(x_values, y_hat)
_ = plt.xlim((0,1))

Approximating the weighted output of the hidden layer using sigmoid functions with very large weights (such that the sigmoids approach step functions).

这个近似值远非理想。然而,是否可以直接改进它,例如,通过增加节点数或层数(但同时避免过度拟合)。

结论

在本文中,我描述了神经网络通用属性背后的一些基本数学,并展示了一个简单的 Python 代码,它实现了一个简单函数的近似。

尽管文章中已经包含了完整的代码,但我的 Github 和我的个人网站 www.marcotavora.me(希望)还有一些关于数据科学和物理学的有趣内容。

感谢您的阅读,再见!

顺便说一下,建设性的批评和反馈总是受欢迎的!

数据可视化的艺术和科学

原文:https://towardsdatascience.com/the-art-and-science-of-data-visualization-6f9d706d673e?source=collection_archive---------5-----------------------

关于如何思考和创建出色的数据可视化的全面指南。

数据可视化理论

数据可视化——我们的工作定义是“数据的图形化显示”——就像开车、做饭或在聚会上找乐子一样:每个人都认为自己很擅长,因为他们已经做了一段时间了。特别是对于那些从工程背景进入数据科学的人来说,数据可视化通常被视为琐碎的事情,一旦有趣的建模完成,就要匆忙向利益相关者展示。

然而,可视化往往是向决策者解释复杂问题的主要方式。对于如此多的人的日常工作如此重要的东西,数据可视化很少被直接教授,相反,新专业人员应该通过潜移默化来学习。但是这不是最好的方法。数据可视化和其他技能一样,是一种技能,即使是有经验的从业者也可以从磨练他们在该领域的技能中受益。

因此,这个简短的话题。这篇文章有点长,但是旨在给你一个全面的数据可视化概念的支持,这将使你在工作中做得更好。

我绝不打算教你如何用特定的软件制作特定的图形。我不知道什么样的软件可能适用于你未来的需求,或者当——坦率地说,谷歌存在时,你需要制定什么样的可视化——所以这不是一本有一步一步说明的食谱。这里的目标不是为您提供未来使用的食谱,而是教您什么是面粉——向您介绍有效数据可视化的基本概念和构建块。

也就是说,你可以在我的个人 GitHub 上找到构建这篇文章的代码(作为三个 R Markdown 文件)。

咒语

我尽可能地将这些基本概念归纳为四个咒语,我们将在整个课程中继续讨论。咒语是:

  1. 一个好的图形讲述一个故事。
  2. 一切都应该尽可能简单,但不能再简单了。
  3. 使用合适的工具完成工作。
  4. 墨水便宜。电子更便宜。

每个咒语作为一个部分的主题,也将贯穿始终。第一部分的主题很简单:

一幅好的图画讲述了一个故事

制作图形时,理解图形的用途很重要。毕竟,您通常不会制作一个完美描述您的数据的图表-现代数据集往往太大(就观察数量而言)和太宽(就变量数量而言),无法在单个图表上描述每个数据点。相反,分析师有意识地选择可视化中包含哪些元素,以便以最有效的方式识别数据中的模式和趋势。为了做出这些决定,思考一下为什么如何制作图形会有所帮助。

我们为什么要讲故事?

至于为什么这个问题,答案通常可以归结为两大类中的一类:

  • 帮助识别数据集中的模式,或者
  • 向更多的观众解释这些模式

这些是创建分别被称为探索性解释性图形背后的基本原理。探索性图形通常是非常简单的数据图片,用于识别数据中您可能还不知道存在的模式。以一个简单的图形为例,显示了树围作为年龄的函数:

这种可视化并不复杂——两个变量,35 个观察值,没有太多的文本——但它已经向我们展示了数据中存在的趋势。如果我们受到启发,我们可以利用这些信息开始研究树木生长随年龄变化的原因,现在我们已经大致了解了树木生长如何变化。

同时,解释性的图表都是关于为什么的。探索性图形首先关注的是识别模式,解释性图形的目的是解释它们为什么会发生,以及在最好的例子中,读者应该做些什么。解释性图形可以独立存在,也可以出现在一个更大的报告中,但是它们的目标是相同的:提供为什么一个模式存在的证据,并提供一个行动号召。例如,我们可以对同一个树形图进行一些编辑,以解释我们看到的模式:

我想在这里特别指出标题:“桔子树的生长在第 4 年逐渐减少。”一个好的图形讲述一个故事,记住。因此,无论你给你的图表起什么样的标题,都应该反映出这个故事的要点——像“树的直径(厘米)与年龄(天)”这样的标题不会增加任何用户不能从图表本身得到的东西。相反,只要有意义,就用你的标题来推进你的信息——否则,如果它没有增加任何新的信息,你最好把它完全删除。

这里重要的一点是,解释性图表不一定比探索性图表更精美,或者探索性图表只供分析师使用——例如,定期报告通常会使用高度精美的探索性图表来确定现有趋势,希望激发更深入的分析来确定原因。相反,要传达的信息是,了解图表的最终目的——无论它是应该首先帮助识别模式,还是解释它们是如何形成的——可以帮助您决定需要包含哪些元素来讲述您的图表旨在讲述的故事。

我们如何讲故事?

当考虑图形设计时,另一个重要的考虑因素是你将如何讲述你的故事,包括你将使用什么设计元素和你将显示什么数据。在决定可能的“如何”时,我首选的范式是权衡最终图形的表现力和有效性,正如华盛顿大学的杰弗里·赫尔所定义的那样,赫尔写道:

  • :如果语言中的句子(即可视化)表达了一组数据中的所有事实,并且仅表达了数据中的事实,则一组事实在可视化语言中是可表达的。
  • 有效性 :如果一个可视化所传达的信息比另一个可视化中的信息更容易被感知,那么这个可视化比另一个可视化更有效。

或者,简单来说:

  1. 说实话,只说实话(不要撒谎,也不要因遗漏而撒谎)
  2. 使用人们解码更好的编码(更好=更快和/或更准确)

当我们进入力学部分时,请记住这个概念——它应该是您在决定使用哪些元素时的主要考虑因素!在其他两节中,我们将继续回到解释性和探索性,以及表达性和有效性这些概念。

数据可视化的机制

让我们从制图的理论考虑转移到你所拥有的实际构建模块。在这样做的同时,我们还将继续第二条箴言:

一切都应该尽可能简单——但不能再简单了。

图表本质上是我们数据的 2D 图像:

它们有一个 x 轴和一个 y 轴刻度,就像我们这里的散点图一样,一个点在每个刻度上的位置告诉你它的值有多大。但是这种设置只允许我们查看数据中的两个变量——我们经常对查看两个以上变量之间的关系感兴趣。

所以问题变成了:我们如何将这些额外的变量可视化?我们可以尝试添加另一个头寸规模:

但是 3D 图像很难让你理解,制作起来很复杂,在传达信息方面也不太有效。它们确实有它们的用途——尤其是当你能够构建真实的、物理的 3D 模型,而不仅仅是在 2D 平面上制作 3D 形状时——但通常不值得这么麻烦。

那么我们的工具箱里有什么工具呢?普遍认同的(不,真的——这是一个激烈辩论的领域)分为四类:

  • 位置(就像我们已经有了 X 和 Y)
  • 颜色
  • 形状
  • 大小

这些是我们可以用来在图形中编码更多信息的工具。我们将把这些称为美学,但是任何数量的其他词也可以使用——一些人把它们称为尺度,一些人把它们称为价值观。我称它们为美学,因为这是我选择的语言(R,使用 ggplot2)对它们的称呼——但这个词本身来自于这样一个事实,即这些是改变你的图表外观的东西。

值得一提的是,我们使用的是 EPA 的数据集,代表了 1999 年和 2008 年 38 种流行车型的燃油经济性数据。“Hwy”是公路里程,“displ”是发动机排量(so 体积),“cty”是城市里程。但坦率地说,我们的数据集现在并不重要——我们这里的大部分讨论适用于您将获得的任何数据集。

我们将逐一介绍这些美学,讨论如何在每个图形中编码更多信息。一路上,记住我们的咒语:

  1. 一幅好的图画讲述了一个故事
  2. 一切都应该尽可能简单——但不能再简单了
  3. 使用合适的工具完成工作
  4. 墨水便宜。电子甚至更便宜

我们将在本节中讨论这些是如何适用的。

位置

让我们通过结束对位置的讨论来开始讨论这些美学。值沿 x、y 轴或(在我们的 3D 图形中)z 轴的距离代表特定变量的大小。人们天生就知道每个轴上的值越靠外越极端,例如,假设您看到了下图(由模拟数据制成):

你认为哪些值更高?

大多数人天生认为左下角代表两个轴上的 0,离那个角越远,值就越高。这个相对明显的发现暗示了数据可视化中一个更重要的概念:感知拓扑应该与数据拓扑相匹配。换句话说,这意味着图表中觉得大的值应该代表数据中大的值。因此,当处理位置时,更高的值应该是离左下角更远的值——你应该让你的观众的潜意识假设为你做这些。**

将这个建议应用于分类数据可能会有点棘手。假设我们正在查看数据集中汽车制造商的平均公路里程:

在这种情况下,x 轴上的位置只代表不同的汽车制造商,按字母顺序排列。但是请记住,图形中的位置是一种美学,我们可以用它在图形中编码更多的信息。我们在这里没有这样做,例如,我们可以完全不使用 x 位置来显示相同的信息:

试着比较第一张图上的庞蒂克和现代,和第二张图上的。如果有什么不同的话,去掉我们无关的 x 美学让比较制造商变得更容易。这是我们第二个口号背后的一个重要驱动力——一切都应该尽可能简单,但不能再简单了。拥有额外的美感会让一个图表变得混乱,让它更难理解它试图讲述的故事。

然而,当制作图形时,我们应该始终致力于使重要的比较变得容易。因此,我们应该利用我们的 x 美学,不按字母顺序排列我们的制造商,而是按他们的平均公路里程排列:

通过重新排序我们的图形,我们现在能够更好地比较更多相似的制造商。现在理解我们的可视化要快得多——更接近的比较更容易进行,所以将更多相似的值放在一起更容易理解。例如,看看现在庞蒂克和现代的对比。一般来说,不要按字母顺序排列东西——使用你放置东西的顺序来编码附加信息。

顺便提一下,我个人认为,当沿着 X 轴处理分类值时,应该对值进行重新排序,使最高值排在最前面。出于某种原因,我只是发现将最高的条/最高点(或任何用来显示价值的东西)放在 Y 轴旁边看起来比另一个更整洁:

值得一提的是,当值在 Y 轴上时,我不那么武断了。我个人认为最高的价值应该总是在顶部,因为人类期望更高的价值在离左下角更远的地方:

然而,我并不像在 X 轴上那样立即厌恶相反的顺序,可能是因为最下面的条/点看起来更像一个自然的形状,并且仍然沿着 X 轴线:

为此,至少你的里程可能会有所不同。此外,值得指出的是,当标签在 Y 轴上时,图表上的标签要干净得多——翻转您的坐标系,就像我们在这里所做的,是当您有大量类别时显示数据的好方法。

颜色

虽然我们已经很好地介绍了职位在信息交流中的作用,但我们仍然停留在开始时的同一个问题上:我们如何在图表上显示第三个变量?

最流行的方法之一是用颜色来代表你的第三个变量。可能值得讨论一下如何将颜色用于模拟数据集。以下面的图表为例:

现在让我们为第三个变量添加颜色:

记住:感知拓扑应该匹配数据拓扑。哪些值比较大?

大多数人会说是深色的。但事情总是那么简单吗?让我们改变我们的色标来比较:

当然,其中一些颜色比其他颜色更暗——但我不会说它们中的任何一种告诉我一个值是特别高还是特别低。

这是因为人类不会将色调——颜色的实际色调——视为有序值。一个点的颜色并不表示该点的值高于或低于图上的任何其他点。相反,色调作为一个无序值工作,它只告诉我们哪些点属于哪个分组。为了判断一个点的值有多高或多低,我们不得不使用发光——或者单个点有多亮或多暗。

你可以沿着另一个轴移动颜色来编码值——颜色的鲜艳程度,称为色度:

请记住亮度色度——一种颜色有多亮和有多鲜艳——是有序值,而色调(或颜色的阴影)是无序值这在处理分类数据时变得相关。例如,回到我们开始时的散点图:

如果我们想在其中编码一个分类变量,例如,车辆的类别,我们可以使用色调来区分不同类型的汽车:

在这种情况下,使用色调来区分我们的变量显然比使用色度或亮度更有意义:

这是一个知道使用什么工具的问题,色度和亮度将清楚地暗示某些变量比分类数据更接近,而色调不会给你的观众提供任何关于有序变量的有用信息。但是,请注意,我仍然不鼓励使用彩虹来区分图形中的类别——彩虹的颜色并不完全是无序的值(例如,红色和橙色比黄色和蓝色更相似),并且您最终会暗示您可能不想暗示的类别之间的联系。还有,彩虹真的很丑:

说到在工作中使用正确的工具,人们在数据可视化中最喜欢做的事情之一就是过度使用颜色。以下面的例子为例:

在该图中,变量“类”由沿 x 轴的位置和颜色表示。通过重复这项工作,我们正在使我们的图表更难理解——对信息编码一次就足够了,再编码更多次就会分散注意力。记住第二条箴言:一切都应该尽可能简单——但不能再简单了。最好的数据可视化是包含传递消息所需的所有元素,仅此而已。

您可以在图形中随意使用颜色,只要它能为图形添加更多信息,例如,如果它编码了第三个变量:

但是像我们上面做的那样复制只会给你的图表增加更多的垃圾。

还有最后一种方法可以在你的绘图中有效地使用颜色,那就是突出具有某些特征的点:

这样做可以让浏览者快速挑选出图表中最重要的部分,从而提高图表的有效性。顺便说一下,请注意,我使用形状而不是颜色来区分车辆的类别——结合点突出显示和使用颜色来区分分类变量是可行的,但也会有些混乱:

还有一个原因是颜色是一种微妙的美学,很难在你的图形中找到正确的颜色:大约 5%的人(10%的男性,1%的女性)根本看不到颜色。这意味着你在可视化中使用它时应该小心——使用色盲安全调色板(查看“ ColorBrewer 或“ viridis ”了解更多这些),尽可能与另一种美学搭配。

形状

最容易搭配颜色的美学是第二个最常用的——形状。这个比颜色更直观,为了演示,让我们回到散点图:

现在,我们可以根据每个点代表的车辆类别来改变每个点的形状:

想象一下,我们正在做与之前颜色相同的练习——哪个值更大?

我告诉你这些形状代表什么,已经破坏了答案——它们没有一个天生比另一个大。形状和色调一样,是一个无序值

当我们改变线的形状时,同样的基本概念也适用,不仅仅是点。例如,如果我们为前轮、后轮和四轮驱动汽车绘制单独的趋势线,我们可以使用线型来表示每种类型的车辆:

但即使在这里,没有一种线型意味着比其他线型更高或更低。

然而,这条规则有两点需要注意。例如,如果我们回到原来的散点图,改变我们使用的形状:

该图似乎暗示了前三类汽车(都是不同类型的菱形)和接下来的三类(都是三角形)之间的更多联系,同时挑出 SUV。通过这种方式,我们能够用形状来暗示我们分组之间的联系——更多相似的形状,仅仅在角度或纹理上有所不同,意味着彼此之间的关系比其他类型的形状更密切。这可能是一种祝福,也可能是一种诅咒——例如,如果你选择一个正方形和一个菱形来代表两个不相关的群体,你的观众可能会意外地读到比你原本想暗示的更多的关系。

同样值得注意的是,不同的形状会很快使图表变得杂乱无章。一般来说,在一张图上使用超过 3-4 个形状是一个坏主意,超过 6 个意味着你需要思考一下你到底想让人们带走什么。

大小

我们最后的审美是尺寸。回到我们最初的散点图,我们可以想象这样使用大小:

尺寸是一个固有的有序值* —大尺寸点意味着更大的值。具体来说,人类认为更大的区域对应更大的值——上图中三倍大的点的值也大约是三倍大。*

如果错误地使用了大小,或者错误地使用了大小,或者扭曲了数据,这就变得棘手了。有时,分析师会将半径映射到变量,而不是点的面积,从而生成如下图:

在本例中,代表 cty 值 10 的点看起来远没有代表 30 的点大 1/3。这使得在看这个图表时增加看起来更陡峭——所以当使用尺寸作为美学时要小心,你的软件使用的是点的面积,而不是半径!

同样值得注意的是,与颜色不同——颜色可用于区分分组,也可用于表示有序值——使用分类变量的大小通常不是一个好主意。例如,如果我们将点大小映射到车辆类别:

我们似乎在暗示实际上并不存在的关系,就像小型货车和中型车基本上是一样的。因此,最好仅对连续(或数字)数据使用 size。

切线

既然我们已经讨论了这四种美学,我想快速切入正题。当谈到人类感知这些美学的速度和难易程度时,研究确定了以下顺序:

  1. 位置
  2. 大小
  3. 颜色(尤其是色度和亮度)
  4. 形状

正如我们反复讨论的那样,最好的数据可视化是包含与传递消息一样多的元素,而不是更多。一切都应该尽可能简单,但不能再简单了。

然而,我们生活在一个人类的世界里,科学上最有效的方法并不总是最受欢迎的。由于从美学角度来看,颜色本身比尺寸更令人兴奋,从业者经常发现他们自己用颜色来表示尺寸已经足够的价值。因为我们知道,颜色通常应该与形状一起使用,以便在我们的可视化中更具包容性,所以大小通常是图表中使用的最后一种美学。这很好——有时我们必须为其他事情进行优化,而不是“有人能多快理解我的图表”,例如“我的图表看起来有多吸引人”或“我的老板想从我这里得到什么”。但值得注意的是,万一你在未来看到矛盾的建议——分歧来自于你的来源是教授最科学合理的理论,还是最适用的实践。

让我们从美学转向我们的第三条箴言:

使用合适的工具完成工作。

回想一下我们的第一张图表:

正如你已经知道的,这是一个散点图——也称为点阵图。现在假设我们添加了一条最佳拟合线:

一旦我们在它上面画了一条线,它就不再是一个散点图——但是术语散点图不再真正包含这里发生的一切。这显然也不是一个折线图,因为即使它上面有一条线,它也有一些点。

与其对这是什么类型的图表吹毛求疵,不如描述一下我们用什么工具来描述我们的数据更有帮助。我们将这些称为几何,是几何的缩写——因为当你真正深入事物时,这些是你的数据集如何沿着图表的 x 轴和 y 轴分布的几何表示。我不想在这条路上走得太远——我只想解释一下词汇,这样我们就不会讨论那是什么类型的图表,而是讨论它使用什么几何图形。以这种方式组织事物会更容易理解事物如何组合和重新格式化,而不是假设每种图表只能做一件事。

两个连续变量

这张图表使用了两种几何图形,非常适合具有连续 y 和连续 x 的图形,即点和线。这就是人们大多数时候所说的线形图——显示数据模式的单一平滑趋势线。然而,折线图也可以指每个点依次相连的图表:

很重要的一点是,要清楚你期望生成哪种类型的图表!为了清晰起见,我总是把前期称为趋势线。

这些类型的图表对于快速探索性图形具有巨大的价值,显示变量的各种组合如何相互作用。例如,许多分析师开始使用相关矩阵(也称为散点图矩阵)来熟悉新的数据集,相关矩阵创建了一个散点图网格来表示每个变量:

在这种格式中,理解数据之间的交互既快又容易,某些变量的交互显然是很有希望的进一步探索的途径。

稍微回顾一下,在继续之前,我想强调散点图的一个主要缺点。如果您碰巧有多个点具有相同的 x 和 y 值,散点图会将每个点绘制在前一个点上,使其看起来比实际数据少。向您的值中添加一点随机噪声(例如,在 Excel 中使用 RAND())有助于显示数据的实际密度,尤其是当您处理的数字没有得到应有的精确测量时。

最后一个适用于两个连续变量的图表是面积图,它类似于折线图,但填充的是线下的区域:

当 0 是与数据集相关的数字时,面积图是有意义的,也就是说,0 值不会特别意外。当您有多个分组并关心它们的总和时,也经常使用它们:

(这个新的数据集是“钻石”数据集,代表 54,000 颗钻石的大小、质量、切割和销售价格。从现在开始,我们将来回使用它和 EPA 的数据集。)

堆积面积图的一个缺点是,由于下方所有分组的累积效应,很难估计任何单个分组如何沿 x 轴移动。例如,0.25 克拉的“普通”钻石实际上比 1.0 克拉的要少——但因为“理想”和“优质”钻石如此之多,你的观众可能会得出错误的结论。在总数比分组更重要的情况下,这是没问题的——但在其他情况下,值得看看其他类型的图表。

一个连续变量

相反,如果您希望了解单个连续变量在整个数据集中的分布情况,那么直方图是您可以使用的最佳工具之一。直方图显示数据集中有多少观察值落在连续变量的特定范围内,并将其计数绘制成条形图:

直方图的一个重要标志是,您需要注意数据是如何装箱的。如果您没有为条柱选择正确的宽度,您可能会错过数据集中的波峰和波谷,并且可能会误解数据的分布方式,例如,如果我们绘制 500 个条柱,而不是上面使用的 30 个条柱,会发生什么变化:

直方图的替代方法是频率图,它使用折线图代替条形图来表示数据集中某个值出现的频率:

然而,你必须再次注意这些图表的数据仓有多宽——如果你不小心的话,你可能会不小心抹平数据中的主要模式!

与直方图相比,频率表的一大优势是它处理多个分组的方式——如果您的分组在变量的不同级别进行支配交易,频率表将比直方图更明显地显示它们如何变化。

(请注意,我对数据做了一些奇怪的处理,以便显示下面的分布是如何变化的。)

一个分类变量,一个连续变量

如果你想比较一个分类变量和一个连续变量,你通常会被某种形式的条形图所困扰:

条形图可能是现存的最不令人兴奋的图表类型,主要是因为它是如此普遍——但那是因为它真的擅长它所做的。条形图是最容易解释和最有效的可视化类型之一,无论它们多么令人兴奋。

然而,有些人真的打算破坏这一点。以堆积条形图为例,它通常用于添加第三个变量:

比较公平/G 和优质/G。几乎不可能准确地比较这两种情况——它们没有共同的顶线或底线,所以你无法真正进行比较。在这些情况下,最好使用隐藏条形图:

在比较不同分组的实际数字时,隐藏条形图通常是更好的选择。然而,这个图表很好地显示了条形图遇到的一个限制——一旦你超过了 4 或 5 个分组,进行比较就很棘手了。在这些情况下,你可能试图应用错误的图表,应该考虑将你的图表分成更小的部分——记住,墨水很便宜,电子或者更便宜——或者用几条线代替横条。

然而,堆积条形图适用于比较每个条形图中两个不同组的相对比例。例如,以下面的图表为例:

在这种情况下,进行组间比较是很简单的,因为所有组共享一条公共线,组 1 为 100%,组 2 为 0%。这个参考点解决了我们在两个以上分组中遇到的问题——尽管注意,如果条形图的总和不总是相同,我们仍然更喜欢一个隐藏的条形图。

快速切入正题

这通常是大多数人对饼状图及其糟糕程度进行长篇大论的地方。他们错了,但以一种可以理解的方式。

人们喜欢讨厌饼图,因为它们几乎都是糟糕的图表。然而,如果对你的浏览者来说,能够快速找出两个或更多的分组在整体中所占的比例是很重要的,那么饼图实际上是表达观点的最快和最有效的方式。例如,比较以下使用相同数据集制作的饼图和条形图:

**

比如说,在饼状图中,从 A 到 F 比从 C 到 F 更容易辨别,因为人类更擅长求和角度而不是面积。在这些情况下,请随意使用饼图——并告诉任何批评你的人,我说没问题。

两个分类变量

我们的最后一个组合是当你在 x 轴和 y 轴上都有一个分类变量时。这些是需要考虑的更棘手的情节,因为我们不再根据一个点离左下角有多远来编码位置值,而是必须创造性地有效使用位置来编码值。请记住,geom 是数据集沿图表的 x 轴和 y 轴分布的几何表示。当你的两个坐标轴都是绝对的,你必须创造性地展示这种分布。

一种方法是使用密度,就像我们在散点图中所做的那样,来显示有多少数据点落入了图表中的每个类别组合中。您可以通过制作“点云”图表来实现这一点,其中更密集的云代表更常见的组合:

即使这张图表上没有一个数字,它的信息也很清楚——我们只需扫一眼就能知道我们的钻石是如何分布的。类似的方法是使用热图,不同颜色的单元格代表一系列值:

我个人认为热图效率较低——部分是因为通过使用颜色美学来编码这个值,你不能将它用于任何其他东西——但它们通常更容易用手头的资源来制作。

制作出色的可视化效果

当我们进入最后一节时,是时候详细说说我们最后的咒语了:

墨水便宜。电子更便宜。

处理大数据集

回想一下我们在上一节中使用的钻石数据集。它包含了 54000 颗钻石的数据,包括每颗钻石的克拉数和售价。如果我们想比较这两个连续变量,我们可能会认为散点图是一个很好的方法:

不幸的是,看起来 54,000 点对这个情节来说太多了,对我们没什么好处!这是所谓的过度绘制的一个明显例子——我们只是在一个图表上有太多的数据。

这个问题有三个真正的解决方案。首先,我们可以简单地决定我们想要重构我们的图表,而不是显示一个指标——例如平均销售价格——在不同的克拉上如何变化,而不是我们的数据如何分布:

我们有各种各样的方法来进行这种重构——如果我们愿意,我们可以通过宁滨我们的数据得到一个非常相似的图表,并制作一个柱状图:

然而,无论哪种方式,我们都没有真正显示出与原始图表中相同的东西——我们没有任何迹象表明我们的数据是如何沿着这两个轴分布的。

第二个解决方案更有效地解决了这个问题——让你的所有观点都半透明:

通过这样做,我们现在能够看到数据分布更加密集的区域,这是汇总统计中所没有的,例如,低克拉钻石似乎比高克拉钻石的分组更加紧密。我们还可以在克拉的“整数”值上看到一些暗条纹,这表明我们的数据存在一些完整性问题,如果鉴定师更有可能给一颗钻石一个整数的话。

当我们想要在图形中映射第三个变量(让我们使用 cut)时,这种方法的挑战就来了。我们可以像往常一样尝试改变图表的美感:

但不幸的是,点的绝对数量淹没了图形上颜色和形状的大部分变化。在这种情况下,我们最好的选择可能是将我们的图分面,也就是说,将我们的一个大图分成几个小的倍数:

墨水便宜。电子更便宜。制作多张图表。

通过将我们的数据分割成几个更小的图形,我们能够更好地看到分布如何在我们的类别之间转移。事实上,我们可以使用这种技术将我们的数据进一步分割成散点图矩阵,显示不同的组是如何分布的:

分面的最后一个非常有用的用途是用多条缠绕的线分割图表:

这些图表通常被称为“意大利面条图”,当被分割成小的倍数时,通常更容易使用:

现在,刻面图的一个主要缺点是它们会使比较变得更加困难——如果在我们的折线图中,知道大多数净度在 2 克拉的价格上接近比知道每个净度的价格如何随克拉变化更重要,那么第一个图表可能是更有效的选择。然而,在这种情况下,重新评估你的图表上实际需要多少行是值得的——如果你只关心一些清晰度,那么只包括那些行。目标是使重要的比较变得容易,理解一些比较比另一些更重要。

处理图表垃圾

回想一下我用作解释性图表示例的图形:

你可能已经注意到,这张图表与本课程中的所有其他图表风格不同,它没有灰色背景或网格线或其他任何东西。

记住我们的第二条箴言:一切都应该尽可能简单,但不要再简单了。这张图表反映了这一目标。我们已经失去了一些令人分心的元素——彩色背景和网格线——并改变了其他元素,使整个图形更加有效。我们的目标是在图表上没有无关的元素,以便尽可能地表达和有效。这通常意味着使用最少的颜色,最少的文字,没有网格线。(毕竟,这些行通常只在挑选特定值时有用——如果您希望人们需要特定值,您应该给他们一个表!)

那些无关的元素被称为“垃圾图表”。你在 Excel 中制作的图表中会经常看到这种情况,它们会有深色背景、深色线条、特殊的阴影效果或不编码信息的渐变,或者最糟糕的是那些“3D”条形图/折线图/饼图,因为这些东西可以通过单击来添加。然而,它们会使你的图形不那么有效,因为它们迫使用户花更多的时间将数据和装饰分开。一切都应该尽可能简单,但不要太简单——所以不要试图用无用的元素美化你的图表。

chartjunk 的另一个常见实例是图形中的动画。虽然动画图形令人兴奋和时尚,但它们往往会降低图形的有效性,因为作为人类,当某些东西在移动时,我们无法专注于其他任何东西。看看这些来自哈佛视觉实验室的例子——它们展示了当动画加入时,注意到变化是多么困难。这并不是说你永远不能使用动画——但是当你的图形看起来很酷比它传达信息更重要的时候,它的使用是最好的。

常见错误

在我们结束本课程时,我想以几个常见的错误作为结束,这些错误在其他任何部分都没有得到很好的解释——主要是因为我们太忙于谈论良好的设计原则。

双 y 轴

这些错误中最主要的是带有两个 y 轴的情节,这是江湖郎中和金融顾问们自未成文的日子以来所钟爱的。有两个 y 轴的图表是一种很好的方法,可以让你的图表中不存在的相关性变得真实。几乎在每种情况下,你应该只做两个图表——墨水很便宜。电子更便宜。确切的原因不在本课的讨论范围内,所以请点击这个链接阅读这个主题非常有趣。下面我借用了基兰的代码——看看我们如何暗示不同的事情,只要改变我们如何缩放我们的轴!

过于复杂的可视化

可视化的另一个常见问题来自于分析师对他们的图表过于技术化。例如,回想一下我们最初的钻石散点图:

看这张图表,我们可以看到克拉和价格有正相关关系——一个增加,另一个也增加。然而,这不是线性关系;相反,随着克拉数的增加,价格似乎上涨得更快。

更有统计学头脑的分析师可能已经在想,我们可以通过对数变换坐标轴来使这种关系呈线性——他们是对的!当我们进行转换时,我们可以看到一个清晰的线性关系:

不幸的是,以这种方式转换你的可视化会使你的图形难以理解——事实上,只有大约 60%的专业科学家能够理解它们。因此,像这样变换轴会降低图形的有效性,这种类型的可视化应该保留给探索性的图形和建模。

结论

这就结束了对数据可视化基本概念的介绍。希望你已经掌握了一些概念或词汇,可以帮助你在日常生活中思考你自己的形象化。如果没有别的,我希望你记得我们的数据可视化的咒语:

  1. 一个好的图表讲述一个故事。
  2. 一切都应该尽可能简单——但不能再简单了。
  3. 使用合适的工具完成工作。
  4. 墨水便宜。电子更便宜。

希望这些概念能帮助你最大化可视化的表现力和效率,指导你使用尽可能多的美学和设计元素来讲述你的故事。你将知道如何匹配感知和数据拓扑。你会努力让重要的比较变得简单,你会知道制作不止一个图表。

祝你好运。向前去想象,也教别人如何去想象。我们的领域会因此变得更好。

Mike Mahoney 是一名数据分析师,热衷于数据可视化和寻找将数据洞察力应用于复杂系统的方法。在他的网站上了解更多*或* 在 LinkedIn 上与他联系 **

寻找人工智能项目的艺术和科学

原文:https://towardsdatascience.com/the-art-and-science-of-finding-ai-projects-4bf82b4899c3?source=collection_archive---------14-----------------------

人工智能项目管理

不知道如何入门 AI?使用人工智能发现钻石框架产生人工智能项目想法。

人工智能的潜力是巨大的。80%的美国首席执行官认为人工智能将在未来五年内显著改变他们做生意的方式, 2019 普华永道美国首席执行官调查称。然而,人工智能不仅是未来,也是现在。根据 2019 财富调查,60%的财富 500 强公司已经采用人工智能来改善流程。虽然全球经济前景可能很严峻,但首席执行官们期待人工智能创造产品和提高效率。

Photo by Jo Szczepanska on Unsplash

现在你的经理对人工智能的潜力感到兴奋,并要求你提出人工智能项目的想法。但是你如何产生人工智能项目的想法呢?你需要和谁谈?你如何创建一个成功的人工智能项目创意管道?

这篇文章向你介绍了一个提出人工智能项目想法的框架。它侧重于思考 AI 项目的基础,项目生成框架,以及寻找 AI 项目的团队。内容基于全球专家 landing.aiAlexander Thamm GmbHIn The Pocket 的输入,以及我的个人经验。

理解商业和人工智能

在开始任何项目构思工作之前,你首先需要一个坚实的基础。只有了解你的公司和人工智能的能力,你才能找到人工智能项目。对外部顾问来说,了解一家企业可能具有挑战性,因为他们需要迅速找出一家公司的古怪之处。然而,对于有经验的员工来说,这仍然很重要。

Photo by Franck V. on Unsplash

AI 通常擅长三件事:创造新产品、改进现有产品和自动化任务。虽然前两类承诺新的收入,最后一类旨在降低成本。正如您在数据科学家业务基础中所了解到的,在降低成本之前专注于增加收入是明智的建议。

当采用传统软件开发无法解决挑战时,就使用人工智能应用程序。当潜在模式不明显时,通常就是这种情况。—Patrick glau ner 博士,数据学院负责人, Alexander Thamm GmbH

当寻找人工智能项目创意来推动收入时,你可以尝试生成新的基于人工智能的产品,或者用人工智能改进现有产品。为新产品寻找人工智能项目,了解你所在的行业。您的客户有哪些痛点?要确定如何用 AI 改进现有产品,你需要彻底了解现有产品。产品经理可以帮助你了解现有的机遇和挑战,并让你有机会寻找人工智能项目的想法。

你的公司到处都是机会。每个部门都应该有一个问题的答案:“你的哪些日常任务可以通过计算机视觉或 NLP 得到增强?”— 肯尼·赫尔森斯,艾领先,在口袋里

当寻求通过人工智能降低成本时,专注于自动化任务是至关重要的。要实现任务自动化,您需要了解内部流程和法规。与财务、人力资源或 IT 等业务支持职能部门的员工会面,规划高度重复性的任务。这些任务是自动化的主要目标。

人工智能是自动化的兴奋剂。人工智能项目的一个丰富的想法来源将在于自动化人类今天正在做的任务。尝试识别人们正在做的特定任务,并检查是否有可以自动化的任务。——博士吴恩达 ,CEO landing.ai,在 如何选择你的第一个 ai 项目

Photo by Franck V. on Unsplash

在做了繁重的工作之后,你理解了你所经营的业务和人工智能项目的能力。接下来,让我们应用这个框架来不断地提出人工智能项目的想法。

人工智能发现钻石框架

本文提出的方法是人工智能发现钻石框架。这个框架给你一个结构化的方法来提出人工智能项目的想法。

人工智能发现钻石框架由两个迭代组成。首先,你提出尽可能多的人工智能项目想法。第二,你把名单缩小到最有希望的。让我们详细地看一下每个迭代。

发现——产生一个人工智能项目创意池

人工智能发现钻石的第一个迭代步骤探索你面前的广阔解决方案空间。潜在的假设是,有价值的人工智能项目想法可以以任何形式和情况出现,没有想法是愚蠢到不值得考虑的。有不同的方法来提出疯狂的人工智能想法。

Photo by Jo Szczepanska on Unsplash

例如,位于比利时的数字产品工作室在口袋里创造了人工智能游戏来帮助你提出人工智能项目的想法。它使用人工智能项目想法的参考,例如人脸识别来解锁智能手机或自动分类电子邮件,以启动构思过程。参与者使用这些参考项目作为刺激,将它们转化为自己的想法。

AI 这个游戏是一种可以和一小群人一起玩的纸牌游戏。理想情况下,你和 10 个人玩两轮,玩一个小时,在这期间你会想出 20 个点子。许多想法并不总是伟大的,这没关系。如果一个小时后,小组提出了 2 或 3 个新鲜的、有价值的概念,那么花时间总是值得的。— 肯尼·赫尔森斯

即使你不玩 AI 这个游戏,和一群合适的人一起头脑风暴也会让你走得更远。头脑风暴法的想法可以是循环法安静写作,或者其他产生想法的敏捷方法。有一个知识渊博的主持人来指导头脑风暴会很有帮助。

然而,人工智能项目想法的唯一数量并不代表一切。到现在为止,你可能已经有了许多人工智能项目的想法,但是你如何将注意力集中在最有前途的项目上呢?

定义—缩小最有前途的人工智能项目想法的范围

一旦你收集了许多想法,是时候对这些想法进行排序了。在圣杯人工智能项目的美丽中,你已经读到风险和影响是评估人工智能想法的最关键因素。评估人工智能项目想法可行性的一个重要工具是人工智能项目画布

人工智能项目画布可以帮助你就你的项目提出正确的问题。你对这个项目令人信服的回答越多,它的可行性就越高。在你为每一个人工智能项目构想制定了人工智能项目画布之后,你可以方便地对项目进行排序,并关注最有前途的项目。在口袋里设计了他们的 AI 值画布也是为了这个目的。

Photo by Jeff Sheldon on Unsplash

现在你知道了如何找到人工智能项目的想法,让我们来看看你应该招募哪些关键人物来提出伟大的人工智能项目想法。

团队想出伟大的人工智能项目的想法

你需要一个专家梦之队来提出有前途的人工智能项目想法。团队成员应该是以下三个领域的专家:业务、客户和数据。让我们看一下每一个类别。

第一类由商业专家组成。这些同事非常了解公司及其流程。理想情况下,他们对现有流程有一个很好的概述,并在人工智能的正确推动下,可以提出如何自动化流程的想法。来自 IT、财务或人力资源部门的同事是团队的有益补充。

Photo by Jo Szczepanska on Unsplash

第二类是真正从客户角度出发的员工。同事们了解客户的痛点和需求。他们的知识对于提出充满人工智能的产品创意将是无价的。产品负责人、项目经理、业务开发人员和销售同事都很符合这种情况。

在客户方面,你需要技术专家、了解过去已经尝试过的东西的决策者和创新经理。业务分析师、数据科学家和数据策略师是可能的外部项目合作伙伴。帕特里克·格劳纳博士

第三类是技术数据专家,即数据学家。他们了解技术领域,可以帮助回答技术问题。数据学家还了解前沿技术的发展,并可以专注于将研究突破应用于新的人工智能项目想法。数据工程师、科学家和分析师是第三类研讨会的参与者。根据吴恩达的说法,理想情况下,数据学家的大本营在一个集中的人工智能团队中。

在人工智能时代,许多公司的关键时刻将是组建一个集中的人工智能团队。这个人工智能团队可以隶属于首席技术官、首席信息官或 CDO。它也可以由专门的 CAIO(首席人工智能官)领导。— 吴恩达AI 转型剧本

从软技能的角度来看,寻找对人工智能有创造力和兴趣的参与者。当您为研讨会搭建舞台时,请确保营造一个安全和信任的氛围。在探索阶段,所有的想法都是有效的,而你想要利用那些天马行空的想法。在定义阶段,当评估人工智能项目潜力时,切换到更理性和保守的心态,特别是当你仍然处于人工智能成熟之旅的早期阶段时。

关键要点

在这篇文章中,你学习了如何简化寻找合适的人工智能项目想法的过程。在了解你所在的业务和人工智能的能力后,人工智能发现钻石可以帮助你从构思到评估。加入正确的团队,你会想出出色的人工智能项目创意。

  • 先了解业务和人工智能潜力
  • 使用人工智能发现钻石框架来寻找新的人工智能项目创意
  • 召集合适的商业、客户和技术专家团队来构思新的人工智能项目

现在是你把这篇文章中的理论知识应用到现实生活中的时候了。我们非常感谢您的任何反馈!如果你想听更多关于商业、项目管理和数据科学的交集,MediumLinkedInTwitter 上关注 me。

创建混音带的艺术——一种数据科学方法

原文:https://towardsdatascience.com/the-art-of-creating-a-mixtape-a-data-science-approach-1902065b1d1d?source=collection_archive---------11-----------------------

查看交互式仪表板原型,探索您的音乐库(仅适用于桌面!)

《汉密尔顿》的创作者林·曼努埃尔·米兰达(Lin Manuel Miranda)谈到混音带是我即将与大家分享的这个项目的最佳介绍:

米兰达:我成长在盒式磁带衰落、CD 增长的时代。所以混音带——不是混音 CD,是混音带——是纽约青少年友谊和交配仪式的重要组成部分(笑声)。如果你是一个女孩,我想要你——为了向你表明我喜欢你,我会给你做一盘 90 分钟的磁带,在里面我会展示我的品味。我会给你放一首音乐剧歌曲,旁边放一首嘻哈歌曲,旁边放一首老歌,旁边放一首你可能从未听过的流行歌曲,同时下意识地告诉你我有多喜欢你的这些歌曲。

我想我在 90 年代通过制作混音带为百老汇谱曲学到的东西比我在大学里学到的还多。你正在学习上升和下降,能量和节奏的变化。你在炫耀你的品味和推荐人。你想变得机智,通过播放不是你写的音乐。所以我的节目最初的名字叫“汉密尔顿混音带”并非偶然这就是我写乐谱的方法。这是,这是…

格罗斯:哦,这就是你这么叫它的原因。哦,好吧。我明白了。

米兰达:是的。这是,这是我所知道的关于这家伙的一切,这是一个旅程,你也是一个旅程。再说一次,我在 CD 之前制作这种区别磁带的原因是你必须按照我为你安排的顺序来听。你知道,A 面到 B 面是我们的表演休息时间。我这么说是为了回答你的问题,因为我有朋友只听嘻哈音乐。我有只听音乐剧的朋友,我骄傲地站在中间,我会说,我要用这首歌改变你的生活。

是啊!创作混音磁带背后有一种艺术——有了 Spotify 这样的应用和我们弹指一挥间就能获得的海量曲目,这种艺术已经被遗忘了。但它仍然存在,也许它被称为播放列表,也许它失去了混音带所具有的一些浪漫属性,但为另一个人的耳朵精选音乐的基本情感是——我从个人经历中说的——一种非常棒的感觉。

林强调了制作混音带的基础:

  1. 流畅很重要——有起伏和节奏变化,这些元素是游戏的一部分。播放列表的场景受到了影响,因为我们仍然把它当作一个推荐系统——试图根据情绪、流派、艺术家等找到【相似】足够多的东西。这也是为什么它失去了混音带的浪漫。换句话说,我们的播放列表没有“故事”,它们平淡无奇,毫无关联。播放列表上的曲目聚集在一起,因为它们碰巧都在同一个派对上(形象地说),喜欢相同的东西,吃相同的食物。这没什么意思。冲突发生了什么?帝国的兴衰?命运和性格的紧张关系,直到最后的旋律来解决我们巨大的痛苦。
  2. 订单很重要 —因此,专辑订单很重要!我越来越少尝试“随机播放”音乐——艺术家为听过第一首歌的耳朵设计了第二首歌。作为一名馆长,我也希望我的弟子们能自律。我希望他们按照指示,按顺序听,不要把我的选择看成“这里有一堆我最喜欢的歌曲”,而是“我 设计了 这个列表是为了 按照这个特定的顺序,为了 你!’。
  3. 真实性很重要——混音带不能通过在谷歌上搜索“与朋友分享的最佳混音带”来制作。混音带不是来自“这是你的朋友会喜欢的最好的 8 首歌”的帖子。混音带肯定不是来自“我运行了一个算法,它决定这是 7 首让你爱上的歌”。混音带来自内心,来自经历,来自我生活中积累的元素,来自你的积累。如果像林说的那样,我说‘我要改变你的人生!’当我创作一张混音带时,这意味着我知道改变生活需要什么!托尔斯泰,定义艺术,把一个大的依赖于真诚,“如果只有观众或旁听者被作者感受到的感情所感染,这就是艺术。

但在后卡带和 CD 时代,很难遵循这些原则。为什么?因为选择。选择太多。我可以直接访问数百位艺术家的数千首歌曲,我怎么能选择 10-15 首呢……我甚至不能把我所有的曲库都保存在我的记忆中。在一个朋友请求与他分享我的音乐时,我被这种存在危机所困扰,我开始思考:我有成千上万首歌曲可供选择,我的过程是什么?我如何着手制作这个混音带?唉,我希望我能更好地欣赏我的音乐……所以,我们在这里。

更好地欣赏我的音乐

A Better View: Music Map

曲目是复杂的,像艺术家、专辑或流派这样的单一描述符不足以抓住它们潜在的“感觉”。因此,我需要一种方法来获取更多信息,并在开始选择之前了解我的歌曲“库存”。反复地,这导致了一个交互式仪表盘的功能原型,它将允许我地图形式 (如上图所示)中漫游我的音乐库,其方式比在列表上向下滑动更具信息性。

仪表板是一个探索性的研究工具,允许我查看其他混音带(专辑)的空间映射,也是一个组织工具,为我的播放列表选择曲目。

这里有一个快速的例子,我首先找到一首不太积极(低价)但充满活力的歌曲,然后将它与特定艺术家的歌曲联系起来(看台):

* [## musicmapclip.mov

编辑描述

drive.google.com](https://drive.google.com/open?id=1ySBf1fYVeT_rEJr6vUdRn2g4adBNZoD7)

声音特征

为了了解歌曲的潜在属性,我想到自己做声音分析,但后来发现 Spotify 在计算音频特征方面做了一些很好的工作。以下是经过一些过滤后证明对创建空间映射有用的方法:

  • Acousticness: " 从 0.0 到 1.0 的音轨是否声学的置信度度量。
  • 可跳舞性:“ 可跳舞性描述了一个曲目在音乐元素组合的基础上适合跳舞的程度,包括速度、节奏稳定性、节拍强度和整体规律性。
  • 能量: “能量是从 0.0 到 1.0 的度量,代表强度和活动的感知度量。通常,充满活力的曲目让人感觉速度快、声音大、嘈杂。”
  • 响度: “一个音轨的整体响度,单位为分贝(dB)。响度值是整个轨道的平均值,可用于比较轨道的相对响度。
  • 价: “从 0.0 到 1.0 的一个度量,描述一个音轨所传达的音乐积极性。高价曲目听起来更积极(例如,快乐、愉快、欣快),而低价曲目听起来更消极(例如,悲伤、沮丧、愤怒)。”

2D 制图的技术细节

我把上面的特征(+一些其他的)缩放成正态分布,然后用 TSNE 把它们缩减成二维,这样我就可以创建你上面看到的“音乐地图”。现在我们有了一个歌曲库的鸟瞰图,其中每首歌曲都与另一首歌曲相对应,而不是一个无意义的无尽条目列表。我还使用 K-means 高维聚类来获得歌曲组——每种颜色代表一个不同的聚类——它们在地图上充当认知地标,指示分离和边界。我喜欢地图,我认为空间性有助于知识组织,从而使构建认知地图变得更容易。认知地图有助于捕捉项目之间的联系。然后,我计算了每个音频特征在 X 轴和 Y 轴上的线性梯度,并用指示流向的箭头对其进行了标注。

如何解读图形

  • 每个圆点是一首歌,它的位置反映了它与其他歌曲的相关性。例如,左边的歌曲与右边的歌曲相比,与中间的歌曲有更大的不同。
  • 流向箭头离地图中心越远,相应方向的流向越强。例如,地图的左下方包含显著的声学特征,因为声学梯度箭头长且远离中心。另一方面,响度梯度箭头较小并且更靠近地图的中心,这表明尽管在地图的右上象限中较响的歌曲有一定的相关性,但是相关性较弱。
  • 颜色是集群,意味着相同颜色的点在更高的维度上聚集在一起,它们有助于看到两组重叠的边界。

这种基于图形的用户界面是我一直在思考和尝试的,比如博客帖子、推文等等。因为我认为改变用户界面结构也会改变我们的思维方式

交互式控件

Control Panel for Music Map

当然,盯着五颜六色的点看并不能提供多少信息,所以我让它与标签互动,并添加了过滤和聚焦地图的控件。我还增加了交互功能,可以选择歌曲添加到你的混音带中,并在地图上追踪它们的位置。

互动功能:

  • 控件 选项卡可以根据歌曲的各种属性过滤地图。
  • 艺术家 选项卡也允许过滤艺术家。
  • 浏览 标签显示地图上您将鼠标悬停在轨迹上时轨迹的详细信息。
  • 将鼠标悬停在一首歌曲上 也会在地图上高亮显示同一专辑中的其他歌曲及其排序。
  • 点击一首歌曲 会将它添加到地图下方的 mixtape 表中,在这里你可以点击预览按钮,从歌曲中间快速获得一段 30 秒的片段。
  • 切换 右上角的 按钮可以让你切换不同的地图视图。

绘制混音带

在探索、研究和选择之后,你可以看到你的混音带的最终空间之旅。

Sample Mixtape Spatial Journey

回到我们最初的混音原则:我们使用了潜在的声音特征来强调和设计——我们可以从地图的各个部分设计运动,就像把听众从良好的共鸣音响带到压抑但充满活力的流行音乐,再到柔和的凝视鞋子的梦幻流行音乐序列。为心流而设计的一部分是在地图上研究你最喜欢的艺术家的其他专辑的动向。顺序考虑到了,我们按顺序一首接一首地挑选我们的歌曲。最后,真实性,虽然不能保证真诚,但我们的地图包含了来自我们自己图书馆的歌曲。因此,至少,这种结构允许真实、真诚地选择确实感染了我们的歌曲,正如我们期望它们感染另一个人一样。*

结束语

  • 我在这篇文章中链接的原型是从我自己的图书馆中随机选择的不同流派的艺术家构建的——更倾向于独立/摇滚/声学。(奇怪的是,分享一个人的音乐库有点暴露…但别担心,我没有泄露我所有的秘密(歌曲)!)
  • 这种方法显然强调音乐的声音部分,而不是歌词。进一步的工作将结合歌词和词汇质量的主题建模。我不久前做的一个项目对此进行了一些探索。
  • 目前,我使用 Bokeh 独立 Javascript 来完成整个事情,以避免处理任何服务器成本:)因此,我没有通过 Spotify API 添加自动播放列表创建。目前,你可以创建一个歌曲列表,然后自己将它们添加到 Spotify 播放列表中。

如果你觉得这很有趣,并且想要你自己的音乐地图,我不能保证,但是给我你的艺术家列表,我会看看我能做什么!

数据可视化的艺术——使用 Matplotlib 和 Ggplot2 实现天气数据可视化

原文:https://towardsdatascience.com/the-art-of-data-visualization-weather-data-visualization-using-matplotlib-and-ggplot2-4d4b48b5b7c4?source=collection_archive---------21-----------------------

数据可视化与其说是科学,不如说是一门艺术。为了产生良好的可视化效果,您需要将几段代码放在一起,以获得出色的最终结果。本教程演示了如何通过分析天气数据产生良好的数据可视化。

在第一节的中,我们使用 matplotlib 包制作了一个可视化。在第二节中,我们尝试使用 ggplot2 再现可视化。

在深入研究数据可视化艺术之前,让我们首先讨论一个好的数据可视化的基本组件。

良好的数据可视化的组成部分

一个好的数据可视化由几个组件组成,这些组件必须组合在一起才能产生最终产品:

a) 数据组件:决定如何可视化数据的第一个重要步骤是了解数据的类型,例如分类数据、离散数据、连续数据、时间序列数据等。

b) 几何组件:您可以在这里决定哪种可视化适合您的数据,例如散点图、线形图、条形图、直方图、QQ 图、平滑密度、箱线图、对线图、热图等。

c) 映射组件:这里你需要决定用什么变量作为你的 x 变量,用什么变量作为你的 y 变量。这一点非常重要,尤其是当数据集是包含多个要素的多维数据集时。

d) 秤组件:在这里您可以决定使用哪种秤,例如线性秤、对数秤等。

e) 标签组件:这包括轴标签、标题、图例、使用的字体大小等。

伦理成分:在这里,你要确保你的视觉化图像讲述的是真实的故事。在清理、总结、操作和制作数据可视化时,你需要意识到你的行为,并确保你没有利用你的可视化来误导或操纵你的观众。

本文将比较 Python 的 MatplotlibR 的 ggplot2 包在分析和可视化天气数据方面的优势。

该代码将执行以下数据可视化任务:

  1. 它返回了 2005 年至 2014 年期间一年中每天的最高纪录和最低纪录的折线图。一年中每一天的最高温度和最低温度之间的区域用阴影表示。
  2. 覆盖 2015 年打破十年记录(2005-2014 年)最高或最低记录的任何点(最高和最低)的 2015 年数据散点。

数据集:本项目使用的 NOAA 数据集存储在文件 weather_data.csv 中。这些数据来自国家环境信息中心(NCEI)每日全球历史气候网络(GHCN-Daily)的一个子集。GHCN-Daily 由来自全球数千个地面站的每日气候记录组成。这些数据是从美国密歇根州安阿伯市附近的数据站收集的。

本文的完整代码可以从这个资源库下载:https://github.com/bot13956/weather_pattern

I .使用 Python 的 Matplotlib 包进行气象数据分析和可视化

1.导入必要的库和数据集

**import** **matplotlib.pyplot** **as** **plt**
**import** **pandas** **as** **pd**
**import** **numpy** **as** **np**
df=pd.read_csv('weather_data.csv')
df.head()

2.数据准备和分析

#convert temperature from tenths of degree C to degree C
df['Data_Value']=0.1*df.Data_Valuedays=list(map(**lambda** x: x.split('-')[-2]+'-'+x.split('-')[-1], df.Date))years=list(map(**lambda** x: x.split('-')[0], df.Date))df['Days']=days 
df['Years']=yearsdf_2005_to_2014=df[(df.Days!='02-29')&(df.Years!='2015')]
df_2015=df[(df.Days!='02-29')&(df.Years=='2015')]df_max=df_2005_to_2014.groupby(['Element','Days']).max()
df_min = df_2005_to_2014.groupby(['Element','Days']).min()
df_2015_max=df_2015.groupby(['Element','Days']).max()
df_2015_min = df_2015.groupby(['Element','Days']).min() record_max=df_max.loc['TMAX'].Data_Value
record_min=df_min.loc['TMIN'].Data_Value
record_2015_max=df_2015_max.loc['TMAX'].Data_Value
record_2015_min=df_2015_min.loc['TMIN'].Data_Value

3.生成数据可视化

plt.figure(figsize=(10,7))plt.plot(np.arange(len(record_max)),record_max, '--k', label="record high")plt.plot(np.arange(len(record_max)),record_min, '-k',label="record low")plt.scatter(np.where(record_2015_min < record_min.values),
            record_2015_min[record_2015_min < 
            record_min].values,c='b',label='2015 break low')plt.scatter(np.where(record_2015_max > record_max.values),
            record_2015_max[record_2015_max >      
            record_max].values,c='r',label='2015 break high')plt.xlabel('month',size=14)plt.ylabel('temperature($^\circ C$ )',size=14)plt.xticks(np.arange(0,365,31),
          ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug',   
           'Sep','Oct','Nov','Dec'])ax=plt.gca()ax.axis([0,365,-40,40])plt.gca().fill_between(np.arange(0,365), 
                       record_min, record_max, 
                       facecolor='blue', 
                       alpha=0.25)plt.title('Record temperatures for different months between 2005-2014',size=14)plt.legend(loc=0)

plt.show()

Weather data visualization using matplotlib.

二。使用 R 的 Ggplot2 软件包进行天气数据分析和可视化

我在想,我能不能用 R 的 ggplot2 包制作一个类似的上图?

因此,我决定进行类似的分析,看看我能与 ggplot2 接近到什么程度。

1.导入必要的库和数据集

library(tidyverse)
library(readr)
df<-read.csv("weather_data.csv")

2.数据准备和分析

**#convert temperature from tenths of degree C to degree C**df$Data_Value = 0.1*df$Data_Value **#functions to split date** split_function<-function(x)unlist(strsplit(x,'-'))year_function<-function(x)split_function(x)[1]
day_function<-function(x)paste(split_function(x[2],
                               split_function(x)[3],sep='-') **#create Day and Year columns** day<-sapply(as.vector(df$Date),day_function)
year<-sapply(as.vector(df$Date),year_function)
df<-df%>%mutate(Day=day,Year=year ) **#filter leap year and select 10 year observation period: 2005-2014** df_2005_to_2014<-df%>%filter((df$Day!='02-29') (df$Year!='2015'))df_2015<-df%>%filter((df$Day!='02-29')&(df$Year=='2015')) **#record min and max for each day of the year for the 2005-2014 period** record_max<-df_2005_to_2014%>%group_by(Day)%>%summarize(Max = max(Data_Value),Min=min(Data_Value))%>%.$Maxrecord_min<-df_2005_to_2014%>%group_by(Day)%>%summarize(Max = max(Data_Value),Min=min(Data_Value))%>%.$Min **#record min and max for each day of the year for 2015** record_2015_max<-df_2015%>%group_by(Day)%>%summarize(Max = max(Data_Value),Min=min(Data_Value))%>%.$Maxrecord_2015_min<-df_2015%>%group_by(Day)%>%summarize(Max = max(Data_Value),Min=min(Data_Value))%>%.$Min

3.为可视化准备数据

**#data frame for the 2005-2014 temperatures** y<-c(seq(1,1,length=365),seq(2,2,length=365))
y<-replace(replace(y, seq(1,365),'max'),seq(366,730),'min')
values<-data.frame(day=c(seq(1,365), seq(1,365)),element=sort(y),Temp=c(record_max,record_min))
q<-values%>%mutate(element=factor(element))**#data frame for the 2015 temperatures** max_index<-which(record_2015_max>record_max)
min_index<-which(record_2015_min < record_min)dat15_max<data.frame(max_index=max_index,
                     Tmax=record_2015_max[max_index])dat15_min<-data.frame(min_ndex=min_index,  
                      Tmin=record_2015_min[min_index])

4.生成可视化

q%>%ggplot(aes(day,Temp,color=element))+
    geom_line(size=1,show.legend = TRUE)+
    geom_point(data=dat15_max,
               aes(max_index,Tmax,color='max_index'),
               size=2,show.legend = TRUE)+        
    geom_point(data=dat15_min,
               aes(min_index,Tmin,color='min_index'),
               size=2,show.legend = TRUE)+  
    scale_colour_manual(labels=c("record high","2015 break  
               high","record low","2015 break low"),
               values=c('red','purple','blue','green'))+    
    xlab('Month')+ 
    ylab('Temperature (C)')+  
    scale_x_continuous(breaks = as.integer(seq(1,335,length=12)), 
           labels=c('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug',
             'Sep','Oct','Nov','Dec'))+ 
    ggtitle("Record temperatures between 2005-2014")+  
    theme(    
    plot.title = element_text(color="black", size=12, hjust=0.5,       
                              face="bold"),    
    axis.title.x = element_text(color="black", size=12,   
                                face="bold"),     
    axis.title.y = element_text(color="black", size=12,   
                                face="bold"),    
    legend.title = element_blank())

以下是使用 R 的 ggplot2 的输出:

观察

我尽力用 R 的 ggplot2 包制作了一个可视化效果,它与用 Python 的 Matplotlib 制作的非常相似。

在我看来,对于这个特定的项目,与 R 的 ggplot2 包相比,Matplotlib 产生了更好、更漂亮的可视化效果。与 ggplot2 相比,使用 matplotlib 生成可视化效果所需的工作量(代码行)更少。

如果您有兴趣下载 Matplotlib 和 ggplot2 执行的源代码,请访问下面的 Github 资源库:https://github.com/bot13956/weather_pattern

请留下关于如何改进 ggplot2 可视化的建议的反馈意见。我很肯定质量可以提高。

预测的艺术

原文:https://towardsdatascience.com/the-art-of-forecasting-d2a8806b7aa0?source=collection_archive---------13-----------------------

Photo by Emmanuel Holveck-Lafay from Pexels

当我们试图预测未来时,到底发生了什么

数据科学是许多学科的混合体——统计推断、分析、可视化、分类和预测。人们普遍认为最令人着迷的是预测。

预测未来听起来像是魔术,无论是提前发现潜在客户购买你产品的意图,还是计算出股票价格的走向。如果我们能够可靠地预测某事的未来,那么我们就拥有巨大的优势。

机器学习只是放大了这种神奇和神秘。随着预测模型复杂性的增加(以失去可解释性为代价),它们能够发现以前未被注意到的相关性,并利用以前难以使用的数据。

但是从本质上来说,预测其实很简单。今天我们将介绍一个思考预测的心智模型,希望它能揭开这门艺术的神秘面纱,并鼓励你将预测添加到你的定量工具包中。

线性回归预测

我们在统计学中学习的第一个模型是线性回归。它是多用途的,可解释的,并且惊人的强大。这是一个很好的工具来说明预测是如何工作的。

对线性回归如何工作的非数学描述是,它试图通过代表数据的点尽可能最佳地拟合一条线。这条线试图捕捉你的数据的趋势。下图显示了这条最佳拟合线(蓝色)的样子。让我们来解开到底发生了什么:

  1. 每个点代表一个观察。它的垂直位置是由点表示的观察的目标变量(我们试图预测的)的值。而点的水平位置就是我们的特征值(我们的自变量)。
  2. 目标变量和我们的特征之间显然存在正相关关系——请注意圆点如何向右上方移动。
  3. 最佳拟合线是沿着趋势方向,穿过尽可能多的点的线。这条线概括了我们的目标和我们的特征之间的关系。

The Line of Best Fit (In Blue)

那么这和预测未来有什么关系呢?让我们想象一下,我们正试图预测美国的 GDP(经济)增长。我们假设 GDP 增长和企业利润率(企业盈利能力如何)之间存在关系。我们将它们绘制成图,并看到以下关系(所有数据都是我编造的,仅用于说明目的):

GDP Growth vs. Profit Margins (Fake Data)

强正相关!那么企业利润率高是否预示着 GDP 的高增长?别急,这是你脑中的声音应该在低语的地方:

"相关性并不意味着因果关系."

—你脑海中的声音

诚然,经济扩张时期通常伴随着丰厚的企业利润(和丰厚的利润率)。但我们正试图了解利润率是否能预测经济增长。为此,我们需要修改我们的分析:

  • 错:当期利润率对比当期 GDP 增速。
  • 正确:当前利润率对比明年的 GDP 增长。

这种区别是关键。我们并不试图寻找与 GDP 增长同时相关的特征。相反,我们希望找到预测未来 GDP 增长的特征。也就是说,我们希望找到与下一期 GDP 增长相关的特征(我们的目标是下一年 GDP 增长的变化)。考虑到这一点,让我们重做散点图:

Future GDP Growth vs. Current Profit Margins

我们的正相关去哪了?预测未来很难。当我们将一个变量切换到它的未来状态(并测量预测相关性)时,变量之间的强并发相关性通常会消失。

这并不意味着所有的希望都破灭了。通常,如果我们足够努力地寻找并创造性地思考,我们仍然可以找到一些真正具有预测性的关系。但不要指望这些关系会很强——根据我的经验(试图预测金融市场的未来),0.20-0.30 的预测相关性已经很好了。

理解预测的心理模型

假设我们继续努力测试未来 GDP 增长的特征,并最终发现以下关系:

Future GDP Growth vs. Current Growth in Working Young

我们发现了未来 GDP 增长和目前观察到的年轻劳动者(25-35 岁)增长之间的关系。它不像我们之前看到的并发关系(GDP 增长和利润率)那样强有力,但这是一种预测关系,我们可以用它来建立预测模型(再次强调,这是我为了说明预测如何工作而编造的所有数据)。

那么我们如何建立模型呢?实际上已经完成了— 最佳匹配的蓝线是我们的型号。我们通过简单地观察工作的年轻人口的当前变化来做出我们的预测(假设它是由金色虚线表示的值)。然后,我们沿着 y 轴(纵轴)查看黄金虚线与最佳拟合蓝线(绿色虚线)相交的值,该值就是我们的预测值。

Making Our Prediction

好的,酷,这很简单。对于更多的功能,甚至是更复杂的预测算法,这个过程都是一样的。

但在更基本的层面上,我们的预测到底意味着什么?每一个预测,不管产生它的模型有多复杂,都可以被认为是一个条件预期。条件期望只不过是期望值的一种类型,也称为平均值。

那么,我是不是在告诉你,你那奇特的 XGBoost 回归器所产生的值只不过是一个平均值,确切地说,是你在初级统计课上学到的第一个概念?

差不多(有一些警告)。不相信我?让我们做一个思维练习。如果我让你预测明天的天气(不查互联网),你会怎么做?你可以这样做,“昨天很热,现在是八月,我们在圣何塞,所以我预测明天会是晴朗炎热的。”

你为什么得出那个结论?这是因为,也许你没有意识到,你对你记忆中在圣何塞的所有日子做了一个心理盘点,那是夏天,前几天天气很热。在你脑海中相关的每一天的平均天气都是晴朗炎热的。

所以你通过过滤相关的观察数据(圣荷西的夏天,之前天气炎热)并取这些观察数据的平均值来做出你的预测。这就是我们作为人通常是如何直觉地做出预测的——那么我们为什么要期待模型和机器会有什么不同呢?答案是他们没有什么不同,除了他们可以处理更多的数据,并且以一种更少偏见的方式这样做。

因此,为了理解预测未来是如何工作的,我的建议是,把每个预测看作是从最相关的先前观察到的观察值的平均值中得出的。对未来的预测只是在回答以下问题:

当我看到类似的事情在过去发生时,接下来通常会发生什么?

可视化条件平均值(也就是我们的预测)

让我们用前面的例子来形象地说明我们所说的预测是条件平均值是什么意思。下图显示了我如何将线性回归可视化,以及更一般地,预测模型的输出。每个金色矩形是样本(我们的观察)的一部分,条件是特征变量在某些值之间。例如,左边的第一个黄金矩形可能只是那些对 GDP 增长(我们的目标,在 Y 轴上)的观察,其中年轻工作人口的增长率(我们的特征,在 X 轴上)在 0%和 0.1%之间。

A Regression is Like a Bunch of Snapshots

注意蓝色预测线(最佳拟合线)是如何落在每个黄金矩形的中间的?这是设计使然——每个矩形的中间是该特定切片的平均值(回想一下,每个矩形代表一个切片)。随着我们获取越来越小的切片(随着我们增加矩形的数量,同时减少每个矩形的宽度),条件平均值系列(由每个矩形的中间表示)收敛到回归线。

“但是等一下!”你在思考。其中一些矩形的中间显然不是该切片内观察值的平均值。例如,第一个黄金矩形只包括一个观察值,它在我们的预测线之上。所以我怎么能说预测线是条件平均值,也就是该切片内的平均值呢?

对于简单的线性回归,条件平均值与每个切片中观察值的平均值不匹配,因为回归算法在目标和要素之间建立了线性关系。但是并没有失去一切!我们的心理模型仍然有效。

OLS ( 普通最小二乘法),线性回归用来寻找最佳拟合线的方法,就像取一组条件平均值,但有一点扭曲。我们可以用投票类比来理解我的意思:

  • 想象每个黄金矩形是一个独立的选区。
  • 每个区域都希望将区域内蓝色预测线的值(与每个黄金矩形的垂直中点相同)设置为尽可能接近本地区域平均值(区域中所有黑点的 Y 轴平均值)。
  • 当单个分区移动预测线时,该移动会影响所有分区中预测线的值(因为它必须保持为直线)。
  • 每个分区影响预测线的能力与该分区内的观测数量成正比(观测越多,影响越大)。

最终结果是,每个选区都尽最大努力将这条线拉向自己的平均值。与此同时,每个选区都感受到并受到其他选区的每一次推拉,尤其是那些有大量观察数据的选区。最终,预测线以如下方式确定:

  1. 每个选区都很满意,向自己选区的平均值移动了线,即使只是一点点。
  2. 考虑了群体的整体平均值(因为每个人都试图将预测线移向自己的个人平均值)。

因此,虽然线性回归做出的预测在严格意义上不是条件平均值,但由于每个选区将预测线拉向自己的平均值的方式,它与条件平均值相似。

那又怎样?

条件平均值如何帮助我们更好地理解预测?嗯,它们是每个预测的基础支柱。不管有多复杂,每种算法在其最基本的层面上都试图识别本质上与它试图预测的观测相似的观测。并且它做出的预测是目标在那些最相似的观察值中的平均值的导数。

甚至有某些算法,如k-最近邻或仅使用非有序分类特征的线性回归,可以通过条件平均值进行显式预测。

因此,预测没有什么神奇的——无论是算法还是人类都无法将当前数据转化为对未来的精确预测。相反,我们都只是把过去发生的事情作为未来可能发生的事情的粗略指南。

关键要点

在构建预测算法时,我们应该记住两件事。首先,因为我们用过去来预测未来,所以背景很关键。如果我们所处的环境与训练我们模型的可用历史有很大不同,那么我们就不能期望我们的预测表现良好。

第二,这个心智模型对于思考过度拟合是有用的。我们可以通过遵循以下两个原则来构建一个能够合理概括的模型:

  1. 确保每个条件平均值包含足够多的观察值(少量观察值的平均值比大量观察值的平均值更有可能出错)。我们可以通过不包含太多的特征来确保这一点——太多的特征(相对于观测值的数量)将导致非常精细的切片,每个切片只有非常少的观测值。
  2. 小心那些允许单个分区(切片)对其自己的分区内预测产生太大影响的算法。包含过多非线性的算法(如多项式回归或深度神经网络)将允许每个分区将分区内预测拉至等于其分区平均值。这可能导致不合理的不稳定预测,不能很好地概括。

希望这是有帮助的!干杯!

更多数据科学与分析相关帖子由我:

数据科学家是做什么的?

数据科学家面临自动化的风险

拿到了数据科学的工作?

了解 PCA

了解随机森林

理解神经网络

火花中加入的艺术

原文:https://towardsdatascience.com/the-art-of-joining-in-spark-dcbd33d693c?source=collection_archive---------0-----------------------

加速火花连接的实用技巧

几个月前,我遇到了阿帕奇火花,这是一见钟情。我的第一个想法是:“这么强大的东西怎么会这么容易使用,真是不可思议,我只需要写一堆 SQL 查询!”。事实上,从 Spark 开始非常简单:它有多种语言的非常好的 API(例如 Scala、Python、Java),几乎可以只使用 SQL 来释放它的所有能力,它有一个广泛的社区和大量的文档。我的起点一直是一本书, Spark:权威指南 ( < -附属链接 美国 英国 ) ,我相信这是一个很好的工具介绍:它的作者是比尔·钱伯斯(data bricks 的产品经理)和马泰·扎哈里亚

很快我意识到事情并不像我过去认为的那么简单。同样的发现可能是你阅读这篇文章的原因。例如,我敢打赌,你会发现下面的图像非常熟悉:

正如您可能已经知道的,上面是连接操作期间数据偏斜的典型表现:一个任务将永远无法完成,因为所有连接工作都放在单个执行程序进程上。

过度简化 Spark 连接表的方式

看看我们通常用 Spark 连接哪些表,我们可以确定两种情况:我们可能将一个大表和一个小表连接在一起,或者将一个大表和另一个大表连接在一起。当然,在 Spark 开发过程中,我们会面临介于这两个极端之间的所有灰色阴影!

坚持上面提到的用例,Spark 将以两种不同的方式执行(或被我们强制执行)连接:如果我们要连接两个大表,要么使用排序合并连接,如果涉及的至少一个数据集足够小,可以存储在单个 all 执行器的内存中,则使用广播连接。请注意,还有其他类型的连接(例如混洗散列连接),但是前面提到的那些是最常见的,尤其是 Spark 2.3 中的那些。

排序合并连接

当 Spark 将执行计划中的操作转换为排序合并连接时,它会在节点之间启用所有对所有的通信策略:驱动程序节点将编排执行器,每个执行器将持有一组特定的连接键。在运行实际操作之前,先对分区进行排序(这个操作本身明显很重)。可以想象这种策略会很昂贵:节点需要使用网络来共享数据;注意,排序合并连接倾向于最大限度地减少集群中的数据移动,尤其是与混排散列连接相比

In a Sort Merge Join partitions are sorted on the join key prior to the join operation.

广播加入

当 Spark 决定向所有执行器节点发送一个表的副本时,就会发生广播连接。这里的直觉是,如果我们广播其中一个数据集,Spark 就不再需要一个全对全的通信策略,每个执行器都可以独立地将每个节点中的大数据集记录与小(广播的)表连接起来。我们会看到这个简单的想法通常会提高性能。

In a Broadcast Join a copy of the small table is sent to all the Executors. Each executor will then perform the join without the need of network communication

消灭我们的敌人

在连接操作中,我们可能面临的一些最大的威胁是:

  • 数据偏斜度:我们执行连接的键在集群中分布不均匀,导致其中一个分区非常大,不允许 Spark 并行执行操作和/或拥塞网络。请注意偏斜是一个影响许多并行计算系统的问题:这里的关键词是“并行”,只有当我们能够同时执行多个操作时,我们才能利用这些工具,因此任何发现自己处于某种偏斜操作的数据处理系统都会遇到类似的问题(例如,它也会发生在运行混合整数线性规划优化的分支定界算法时)。
  • 全对全的沟通策略
  • 有限的遗嘱执行人记忆

在深入研究一些优化连接的想法之前,有一点很重要:有时我会用执行时间来比较不同的连接策略。实际上,较低的绝对执行时间并不意味着一种方法绝对优于另一种方法。性能还取决于 Spark 会话配置、集群上的负载以及配置和实际代码之间的协同作用。因此,阅读下面的内容,收集一些你可能需要根据具体情况定制的想法!

播还是不播

首先,让我们看看如果我们决定在一个连接期间广播一个表会发生什么。请注意,Spark 执行计划可以自动转换成广播(不需要我们强制),尽管这可能因 Spark 版本和配置方式而异。

我们将连接两个表:事实表维度表。首先,让我们看看它们有多大:

fact_table.count // #rows 3,301,889,672
dimension_table.count // #rows 3,922,556

在这种情况下,数据没有倾斜,分区也没有问题— 你必须相信我的话。注意, dimension_table 并不“小”(虽然大小不是我们仅通过观察行数就能推断出来的信息,但我们更愿意看看 HDFS 上的文件大小)。

顺便说一句,让我们尝试在不广播的情况下连接这些表,看看需要多长时间:

Output: Elapsed time: 215.115751969s

现在,如果我们广播维度表会发生什么?通过对 join 操作的简单添加,即将变量 dimension_table 替换为broadcast(dimension _ table),我们可以强制 Spark 使用 broadcast 来处理我们的表:

Output: Elapsed time: 61.135962017s

广播使代码运行速度提高了 71%!再次,阅读这个结果时要记住我之前写的关于绝对执行时间的内容。

播音总是对表演有好处吗?完全没有!如果您尝试执行上面的代码片段,为集群提供更多的资源(尤其是更多的执行器),非广播版本将比广播版本运行得更快!出现这种情况的一个原因是因为广播操作本身是相当昂贵的(这意味着所有的节点都需要接收表的副本),所以毫不奇怪如果我们增加需要接收表的执行者的数量,我们增加了广播成本,这可能突然变得高于加入成本本身。

重要的是要记住,当我们广播时,我们会碰到每个 Executor 节点上可用的内存(这里有一篇关于 Spark 内存的简短文章)。这很容易导致内存不足异常或者让你的代码不稳定:想象一下广播一个中等大小的表。你运行代码,一切都很好,超级快。几个月后,你突然发现你的代码坏了。经过几个小时的调试后,您可能会发现,您为使代码快速运行而传播的中等大小的表不再是“中等”的了。外卖,如果你播的是中等大小的桌子,你需要确定它以后还是中等大小!

扭曲它!这太耗时间了。

当您想要连接两个表时,偏斜是一个常见的问题。当连接键在数据集中不是均匀分布时,我们说连接是偏斜的。在偏斜连接期间,Spark 不能并行执行操作,,因为连接的负载会不均匀地分布在执行器上

让我们用旧的事实表和一个新的维度:

fact_table.count // #rows 3,301,889,672
dimension_table2.count // #rows 52

太好了,我们的 dimension_table2 非常小,我们可以直接广播它!让我们一起来看看会发生什么:

Output: Elapsed time: 329.991336182s

现在,在 SparkUI 上观察任务在执行过程中发生了什么:

如上图所示,其中一项任务比其他任务花费了更多的时间。这显然表明数据中存在偏斜度——通过查看 fact_table 中连接键的分布,可以很容易地验证这一猜想。

为了让事情顺利进行,我们需要找到一种方法来重新分配工作负载,以提高我们的 join 的性能。我想提出两个想法:

  • 选项 1 :我们可以尝试重新划分我们的事实表,以便在节点中分配工作
  • 选项 2 :我们可以人为创建一个重新分区密钥(密钥加盐)

选项 1:重新划分表格

我们可以选择一个均匀分布的列,并相应地对表进行重新分区;如果我们将此与广播结合起来,我们应该已经实现了重新分配工作量的目标:

Output: Elapsed time: 106.708180448s

请注意,我们希望选择一个也考虑基数的列(例如,我不会选择基数“太高”或“太低”的键,我让您量化这些术语)。

重要注意事项:如果您无法广播维度表,但仍想使用此策略,需要使用同一个分割器对连接的左侧和右侧进行重新分区!让我们看看如果我们不这样做会发生什么。

考虑下面的代码片段,让我们看看 Spark UI 上的 DAG

If we don’t specify a partitioner, Spark may decide to perform a default repartitioning before the join

正如您所看到的,在这种情况下,我的重新分区基本上被忽略:在执行之后,spark 仍然决定使用默认配置重新交换数据。让我们看看,如果使用相同的分区器,DAG 会如何变化:

Using the same partitioner allows Spark to actually perform the join using our custom options

选项 2:密钥加盐

另一个策略是伪造一个新的连接密钥!

我们还是想逼 spark 做一个大桌子的统一重新划分;在这种情况下,我们还可以将密钥加盐与广播结合起来,因为维度表非常小。

左表的连接键存储在字段 dimension_2_key 中,非均匀分布。第一步是让这个场更“均匀”。一种简单的方法是在连接键上随机附加一个 0 到 N 之间的数字,例如:

正如您所看到的,我们修改了 dimension_2_key ,它现在是“均匀”分布的,我们正朝着集群上更好的工作负载前进。我们已经修改了连接键,所以我们需要在维度表上做同样的操作。为此,我们为事实表中的每个“新”键值在维度中创建一个对应的值:对于维度表中的每个 id 值,我们生成 N 个值,其中我们将[0,N]区间中的数字附加到旧 id 上。让我们用下面的图片更清楚地说明这一点:

此时,我们可以使用“新的”salted 键连接两个数据集。

这个简单的技巧将提高 DAG 执行的并行度。当然,我们增加了维度表的行数(在本例中 N=4)。较高的 N(例如 100 或 1000)将导致键在事实中更均匀的分布,但是维度表的行数更多!

让我们编码这个想法。

首先,我们需要将 salt 添加到事实表的键中。这是一项极具挑战性的任务,或者更好地说,这是一个决策点:

  • 我们可以使用 UDF :简单,但是可能会很慢,因为 Catalyst 对 UDF 不是很满意!
  • 我们可以使用randSQL 操作符
  • 我们可以使用单调递增 id 函数

只是为了好玩,让我们采用第三种选择(它似乎也更快一点)

现在我们需要用新的键“分解”维度表。我发现最快的方法是创建一个包含 0 到 N(在本例中为 0 到 1000)之间的数字的虚拟数据集,并用这个“虚拟”数据集交叉连接维度表:

最后,我们可以使用 salted key 连接表,看看会发生什么!

Output: Elapsed time: 182.160146932s

同样,执行时间并不是理解我们改进的一个很好的指标,所以让我们看看事件时间表:

如您所见,我们大大提高了并行度。

在这种情况下,简单的重新分区和广播比制作新的密钥更有效。请注意,这种差异不是由于连接,而是由于事实表提升过程中的随机数生成。

外卖食品

  • 连接可能很难调优,因为性能与代码和 Spark 配置(执行器数量、内存等)都有关系。)
  • 一些最常见的连接问题是节点之间的所有对所有通信和数据偏斜
  • 如果集群中有足够的内存,我们可以使用小型表或中型表的广播来避免所有对所有的通信
  • 广播并不总是有益于性能:我们需要关注 Spark 配置
  • 如果广播表随时间增长,广播会使代码不稳定
  • 偏斜会导致集群上的工作负载不均衡,从而导致很小一部分任务花费的时间比平均时间长得多
  • 对抗偏态有多种方法,一种是重新划分。
  • 我们可以创建自己的重新分区密钥,例如使用密钥加盐技术

看看这些其他的文章!

[## 六个星火练习来统治他们

一些具有挑战性的 Spark SQL 问题,易于在许多现实世界的问题上提升和转移(带解决方案)

towardsdatascience.com](/six-spark-exercises-to-rule-them-all-242445b24565) [## 聚类波洛克

杰森·布拉克绘画的聚类分析——如何利用 k-means 进行色彩分组

towardsdatascience.com](/clustering-pollock-1ec24c9cf447)

上行投票的艺术:使用 NLP 根据标题预测上行投票

原文:https://towardsdatascience.com/the-art-of-the-upvote-using-nlp-to-predict-upvotes-based-on-headline-458408be3c73?source=collection_archive---------34-----------------------

我最喜欢的项目是那些试图理解人类行为和行动的项目。无论是试图预测自行车租赁最受欢迎的工作日,还是教育水平与个人是否喜欢原版《星球大战》三部曲有任何关系。

在线互动,尤其是在论坛中,非常有趣,因为它们是如此的被动和无形。一个简单的“喜欢”或“赞成”可以是有意的,也可以是无意义的。与脸书和 Instagram 不同,论坛大多是匿名的。这个事实使得像 Reddit 和 Hacker News 这样的地方特别有趣。

目标

我在这个项目中的目标是根据标题预测黑客新闻文章获得的投票数。由于 upvotes 是受欢迎程度的一个指标,我想发现哪种类型的文章最受用户欢迎。

数据

该项目使用的数据是 2006 年至 2015 年用户向《黑客新闻》提交的资料。这个数据是开发者 Arnaud Drizard 利用黑客新闻 API 刮出来的,可以在这里找到

我从数据中随机抽取了 300 行,并删除了除提交时间、upvotes、url 和 headline 之外的无关列。

现在是有趣的部分,NLP!😎

我选择使用单词包模型,它描述了单词在文档中的出现,或者在我们的例子中是标题。这包括以下步骤:

  1. 标记每个标题
  2. 创建独特单词的集合或“词汇表”
  3. 创建单词袋矩阵
  4. 给标题中的每个单词打分
  5. 管理词汇

标记化

第一步是标记每个标题。每个标题都表示为一个字符串。标记化包括将这些单个字符串拆分成标题中的几个单个单词(标记)的字符串。这对于稍后创建词汇和单词包矩阵是必要的。

Example of tokenization

创建词汇和词汇包向量

每个独特的单词都成为词汇的一部分。我选择将词汇表转换成熊猫数据框,如下所示。这允许我在下一步填充数据框,并将其用作单词袋矩阵。

data frame of BoW vocabulary

数据框中的每一行代表数据集中每个索引处的标题。此时,矩阵中充满了 0,因为我还没有对标题中的单词进行评分。

得分单词

最简单的计分方法是计算每个单词的出现次数。我用这种方法来填充矩阵。

bag of words matrix

管理词汇

此时,我有一个相对较大的数据框架。减少它的一个简单的方法是删除停用词。停用词是这样的词:a,and,the,it,is 等。那不代表任何真正的意义。这样做应该会减少下一节中计算的误差量。

训练模型和进行预测

回到我的目标,我想训练一个模型来预测一个标题将获得的支持票数。在转移到更复杂的模型之前,最好先看看一个简单的模型是否能完成工作。

线性回归

我将使用 sci kit-learntrain _ test _ split函数将我的数据分成训练集和测试集。我将 80%用于训练,20%用于测试,并使用均方差作为我的误差度量。

X: bag of words matrix; y: upvotes

我最终得到的 MSE 是 2361.02,这导致了 48.59 的 RMSE。这意味着平均误差与真实值相差 48.59 票。考虑到我的数据的平均投票数是 10,这是一个很大的错误。我将使用随机森林模型再次尝试,看看更复杂的模型是否能帮助我减少错误。

随机森林

使用随机森林只是稍微增加了我的模型的准确性,从误差 48.59 到 45.41。这仍然是一个很大的误差。标题可能不是预测上行投票的最佳特征,因为它不一定指示帖子活动。评论数量和提交时间可能是更好的功能。

也许在第二部里?

A/B 测试的 A 和 B

原文:https://towardsdatascience.com/the-as-and-b-s-of-a-b-testing-a-beginner-s-guide-to-experimentation-d54a60218e13?source=collection_archive---------16-----------------------

数据新闻

实验初学者指南

Photo by Bùi Thanh Tâm on Unsplash

我最近完成了 Udacity 关于 A/B 测试的课程。在深入实验过程中每个阶段的细节之前,它提供了对典型的 A/B 测试所包含的内容的高级理解。不用说,这是一次很棒的学习经历!在这篇文章中,我将总结我从该课程中学到的关键知识,并解释它如何使许多专注于改善用户体验的公司受益。

所以,让我们开始吧!

那么,告诉我什么是 A/B 测试?

A/B 测试是一种实验方法,旨在了解用户体验如何随着他们与网站、移动应用程序等交互方式的变化而变化。这是一种非常流行的方法,用于了解现有客户体验的水平,并根据某些相关指标来改进它。

公司可能带来的变化是改变网站的布局,改变特定网页上某些按钮的外观/位置,改变网站上选项的排名等。A/B 测试有助于公司评估这些变化在发布后是否会成功。这是通过在一段时间内在一部分观众身上测试这些变化来实现的。

好的,明白了!但是我将如何评价这些测试呢?

Image from http://www.quickmeme.com/

评估基于选择的指标进行。

  1. 健全性度量:这些被称为不变度量。在实验过程中,这些指标不应在对照组和实验组之间发生变化。如果它们改变了,那么在实验设置中就有一些根本性的错误。
  2. 评估指标:可以根据业务需求选择这些指标。这些可以是下面列出的任何一种:

a.求和计数。访问该网站的用户数量

b.是指中位数和百分位数。例如,创建帐户后注册在线课程的平均用户数。

c.概率。点击通过概率

d.比率。例如(创收点击次数)/总点击次数

此外,值得一提的是,这些指标应该在固定的时间间隔内进行评估,比如一周、一个月或一年。由于 A/B 测试通常是有时间限制的练习,所以提前确定观察实验结果的时间表是至关重要的。

如果在某些情况下无法确定具体的指标,该怎么办?

Image from http://www.quickmeme.com/

您如何衡量再次注册第二个在线课程的用户比率,如何衡量在线购物门户网站购物者的平均快乐程度,或者如何衡量通过搜索引擎搜索找到信息的概率?在这种情况下,提出代理指标是一个好主意!它们可以是以下类型。

  1. UER(用户体验研究):跟踪一个具体的用户体验,从体验的角度了解一个典型的用户历程。
  2. 外部数据:查看类似网站/移动应用的相关数据。
  3. 人工评估:聘请人工评估员对结果进行评估。
  4. 回顾性分析
  5. 焦点小组研究:采访小组成员以获得反馈。
  6. 调查:让人们填写问卷。

同样重要的是,所选择的指标对您希望看到的变化敏感,但对您不希望看到的变化稳健。换句话说,度量标准应该对实验过程中可能发生的微小变化具有鲁棒性,并且能够捕获所有最重要的变化。

我如何决定测试的样本量?

  1. 测试对象通常称为“分流单位”。这可以是基于事件的(如页面浏览量)、基于匿名 id 的(如 cookies)或基于用户 id 的。你什么时候选择取决于你试图解决的问题。对于用户可见的更改,使用 cookies 或用户标识。如果你测量延迟变化,比如网站加载时间,那么通常使用基于事件的转移单位。
  2. 人群取决于哪些受试者与所考虑的研究相关。特定人口统计、区域/国家的人口是否相关?据此选择。

为了减少实验的规模,通常建议提高显著性水平(α)或降低功效(1-β),以便减少需要测试的样本数量。

其他需要牢记的重要事情:

  1. 实验将进行多长时间,实际运行的最佳时间是什么时候?根据实验在一年中的什么时间进行,比如说圣诞节、黑色星期五、网络星期一或者返校期间,实验的结果会发生变化。
  2. 多大比例的流量会暴露在实验中?可取的做法是在工作日、周末、假日等时段,抽取一小部分流量进行多次测试。
  3. 学习效果是另一个需要注意的因素。通常,一旦引入了变化,用户需要一段时间来适应它。一旦他们适应了,用户行为就变得稳定,并且变得更适合衡量任何变化的影响。

我如何决定哪个变化是重要的?

在 A/B 测试期间,显著性水平固定为 0.50,功效(1-β)设置为 0.80。虽然这些都是重要的值,但重要的是要理解什么构成了统计上的显著变化,而不是实际上的显著变化!必须确定业务需求,并且必须计算 ROI,以确定是否必须实际推出变更。推广值得努力吗?如果我们决定启动变革,业务影响会更大吗?当我们做出这些关键决策时,如果我们继续进行变更,考虑可能涉及的机会成本、工程和推广成本可能是值得的。

到目前为止一切顺利!现在,告诉我如何分析结果?

场景 1:一个单一指标

如果你使用一个单一的指标,但它产生了模糊的结果,那么把实验分成不同的部分。在不同平台(网络和移动)上查看结果。在不同的时间段(几天、几周、几个月、几年等等)检查它。)

如果没有什么可以解释奇怪的结果,那么可能是你的实验设置不正确,或者你的实验正遭受辛普森悖论的折磨。这是一种趋势出现在不同的数据组中,但当不同的组被组合起来并从整体上看时就会消失的现象。

场景二:多指标

当涉及到许多指标时,通常重要的结果可能是偶然出现的!解决这个问题的方法有:

i. Bootstrap :将测试样本分成更多的样本,并对每个这样的细分样本进行实验。重要的结果会消失,如果它最初是偶然出现的。

二。 Bonferroni 校正:将显著性水平 0.50 除以测试运行次数。然后对照调整后的显著性水平,检查测试的统计显著性。

三。控制家族误差率(FWER) :调整任何指标显示误报的概率。

四。控制误发现率(FDR) :修正实验中任何指标产生的可接受的误报率。假设您决定 0.05 作为 FDR,那么这意味着在 100 个样本中,您准备好接受每个测试的 5 个假阳性。

但是等等!如果我看到指标如预期的那样朝着不同的方向移动,该怎么办?

Image from http://www.quickmeme.com/

潜得更深!通常情况下,指标可能并不总是如您所期望的那样表现或产生结果。在这种情况下,拥有一个总体评估标准(OEC) 是很有用的,它可以平衡所有指标的结果,而不会忽略业务需求。人们很容易陷入单个指标性能的混乱中,因此防止这一点很重要!

嗯…现在一切都说得通了!所以,最重要的问题是我该不该发起变革?

如果到目前为止你的实验一切顺利,你得到了梦寐以求的重要结果,那么你需要反思以下几件事:

  1. 这种变化对用户和业务涉众意味着什么?
  2. 这种改变真的会给企业带来价值吗?
  3. 发布后用户会有什么感觉?不同的客户群会有不同的意见吗?你冒着失去一些顾客的风险吗?

我再怎么强调从商业角度发起变革的实际意义也不为过!它到底值不值得?

吸取的教训

  1. A/B 测试就是首先决定你的最终目标。什么变化,为什么变化,变化后你想看到什么?
  2. 决定参加实验的控制组和实验组
  3. 多次验证实验设置—健全性检查!
  4. 如果你计划推出一个大的变化,尝试多次,以避免粗鲁的冲击你的客户。实验和更多的实验,直到你确信它的发射!

感谢阅读和快乐的 A/B 测试!😃

创造力的自动化

原文:https://towardsdatascience.com/the-automation-of-creativity-9e8df1532148?source=collection_archive---------17-----------------------

这是我发表在 女王商业评论 上的那篇完整版。原载于我的媒体 此处

人工智能。这个术语在这个数字时代已经变得无处不在。高度复杂,不透明,但著名。我们感谢它通过零售、音乐和流媒体平台上的推荐引擎带来的便利。然而,铺天盖地的选择让我们放弃了购买行为和交易数据,转而使用一种算法,这种算法只会强化我们对过去的品味。

什么是“味道?”

世界上最有价值的公司怎么可能建立一个帝国,重塑一个古老的消费电子行业的外观,因为他们的“永恒的设计”而受到同样多的赞扬和批评

透过哲学的镜头,自然的趣味是"不是一种理论知识;这是对我们甚至不知道的规则的快速而精致的应用。某样东西对我们来说是否有品味,这种不确定性无法用单一的算法来衡量或捕捉。

像脸书和亚马逊这样的公司主导着我们的数字身份——把我们分成基于行为的群体。即使聘用了顶尖的博士,这些公司的算法也严重依赖于跟踪我们过去的行为,将我们的视野局限于后视镜的延伸,而不是我们未来可能会发现的有品位的有机创新内容。在网飞决定我们的下一个节目和亚马逊建议我们下一次购买之前,我们必须自己发现并做出这些选择。决策之间的摩擦导致了对各种选项的考虑,通过这些,我们聚合了我们独特的个人品味。

是时候认识到人工智能等现代先进技术背后的含义了,它们可能会让我们倒退,而不是推动我们前进。在喧闹的流行语庆祝活动背后,算法正在悄悄地管理和推广能够彻底改变我们个人品味的通用内容。

也许最伟大的例子之一是一个号称拥有 8300 万活跃用户的平台,试图定义和改造艺术品味。2017 年, Spotify 的听众在该应用上花了一半的时间专门听播放列表。该服务每周提供一个“发现”播放列表,据报道,该播放列表根据每个听众的“口味配置”进行微调播放列表由机器严格管理,旨在为用户找到满足他们特定音乐需求的歌曲。然而,在狂热的 Spotify 用户 Adam Pasick 在 Quartz 的一篇帖子中,他概述了当他听到咖啡店里播放的与他的 Discover 播放列表完全相同的曲目时的震惊。那一周,咖啡师兼乐队成员 Homero 收到了与 Adam 几乎一模一样的混音带。现实是,即使有 20 亿个播放列表通过一种据称先进的算法过滤,仍然可以为两个不同的听众产生相同的结果,这证明了人工智能促进所有人的通用品味和内容的威胁。

2015 年,EDM 艺术家 Tiesto 在 Spotify 上发布了“Burn ”,这是一首由音乐流媒体服务直接委托制作的作品,迎合了他们的锻炼播放列表。Burn 专为适应任何听众的跑步速度而设计。不幸的是,音乐行业的艺术创作意图已经朝着这个方向急剧发展。制作为游戏算法设计并被 Spotify 播放列表成功收录的音乐的做法不可避免地创造了一个“轻松音乐”的时代。Spotify 前内容主管乔治·埃尔加图迪斯(George Ergatoudis)承认,该行业正朝着以理解流媒体算法为中心的创作方向发展。这甚至在一年前都没有发生。“当艺术家们注意到病毒式传播和受欢迎程度是普通音乐人的优先选择时,他们开始认为自己独特的音乐风格是劣等的。由于人工智能驱动的同质化需求的受害者,为了纯粹的艺术表达和视觉而创造未来音乐的意图正在减弱。

此外,具有挑战性、创新性和突破性的音乐的潜力已经受到威胁。像 Spotify 这样的算法有利于听众人数和病毒式内容的激增。研究表明在所有播放列表中持续播放安全和“轻松的音乐”从根本上改变了听众的集体偏好和品味,他们认为这是未来的“好歌”。Spotify 引发的“后仰聆听”现象催生了一种新的音乐创作类型。标题为“Ambient Chill”、“Chill Covers”和拥有超过 240 万追随者的特别受欢迎的“Chill Tracks”的算法优化播放列表将轻松和麻醉的曲目放在听众的指尖。一位唱片公司老板直言不讳地评论道,“发布的产品越普通,对 Spotify 就越有利。如果是挑战音乐?那鸿“他接着说,由于 Spotify 算法的不利曝光,他们的许多相对实验性和攻击性的音乐在平台上听不到。它把艺术家们抛在了后面。如果 Spotify 只是向每个人提供简单的音乐,那么这种艺术形式将何去何从?还有人能够突破界限,突破广大受众吗?”

培养一种充斥着主流流行音乐的短暂文化,从长远来看,只会将我们的品味塑造成一致的线性,从而损害真正的创造力。正如查尔斯顿学院的艺术教授 Marian Mazzone 雄辩地指出的那样,“最终,我们可能会选择改变我们对艺术的定义,以便适应人工智能的[所谓]创造力。“曾经是释放沮丧、激情、饥饿、愤怒和个人身份的一种无限的艺术形式,现在已经萎缩为满足自动化的音乐。

这一趋势与其他行业相似。Echo Look——亚马逊的电脑化时尚顾问——旨在为每个用户推荐理想的时尚、风格和品味,尽管它就像货架上一台毫无生气的黑匣子相机。

对网飞最近的热门电影《我以前爱过的所有男孩》的导演苏珊·约翰逊的采访显示,这部电影完全是基于网飞的数字分析而要求的。“[网飞]到处都有团队,寻找人们正在寻找的东西。所以他们意识到人们在寻找浪漫喜剧。显然,投资这部小说的电影版并不是网飞投资创意的结果,而是为他们的商业算法加油。约翰逊甚至称这个过程为“小老大哥”,,由网飞控制我们消费什么以及如何消费。此外,网飞表示,他们的推荐算法“影响了该服务上 80%的流媒体时间的选择。因此,网飞自己的内容无疑将受益,不管每个观众的真实口味偏好,都被强有力地宣传。最终,不仅是《我之前爱过的所有男孩》获得了巨大成功,而且它还帮助这项服务影响了超过 8000 万订户在夏季剩余时间观看浪漫喜剧类型的内容。谈概括口味。

事实上,人工智能日益增长的作用并没有让我们的时尚感或音乐品味变得更加独特——而是将我们禁锢在一个同质化的盒子里,计算我们在“平均”身份中的位置。事实上,这些平均身份都有细微差别(发现播放列表上的一两首不同的歌曲),这仅仅意味着它们远非独一无二。

毫无疑问,人工智能每时每刻都在塑造个人选择和更广泛的社会结构。单个来看,为了方便和效率,牺牲隐私和数据是值得的。目前,从规模上来说,我们的偏好是由那些被我们掌控的大型科技公司来决定的。在这种情况下,这个光鲜的人工智能时代的突出权衡不是隐私,而是我们的个人品味和身份。

Spotify 的算法对整个行业的操纵已经成为音乐爱好者和艺术家的运营动机和预期标准。遵从算法游戏会扼杀因品味和想法冲突而产生的创新。不用说,当受限于未来独特的品味和平淡的灵感时,在线条之外着色几乎是不可能的。用算法取代品味判断的微妙而有害的结果将不可避免地剥夺我们的人性。

总之,我们应该谨慎对待对前沿技术的依赖,保持警惕其压制真正新颖性的威胁能力,并培养对创造力的一致看法。

平台文化的深度

原文:https://towardsdatascience.com/the-baffling-depths-of-platform-culture-f5648af8bc5b?source=collection_archive---------11-----------------------

我最近参加了一个研讨会,听一名学生对迷因进行解剖。当我困惑地看着时,一层又一层的参考文献被剥掉了。结论是,从像素中删除了大约 15 个对其他先前迷因的引用,可以追溯到几个月或几年前。一系列内幕细节在我眼前展开。我已经知道迷因经常在有趣的参考点和无休止的自我参考引用上工作,但是它的复杂性和数量吸引了我。

被剖析的迷因代表了一些东西。不知何故,它捕捉到了按需或基于平台的文化令人困惑的深度、深不可测的混乱和不断变化的混乱。文化一直是一个复杂和无定形的东西,但随着它进入这些大型技术平台,注入用户内容的能量,以及数据主导的消费和预测方法的强烈冲动,一个新的混乱和混乱水平已经出现。平台文化就更难把握了。

试图理解正在发生的事情是困难的,甚至是不可能的。高深莫测是平台文化的核心属性之一。在这个被剖析的迷因的例子中,它甚至被有意地编码到图像中,以在知情人和不知情人之间建立一条线。这种方法只会增加文化分析的难度。

尽管有这些障碍,我们还是需要总体的想法来找到看到正在发生的事情的方法。面对这样一个不断扭曲的万花筒,很难看出这是如何运作的。过去用来理解文化的许多概念将需要彻底改革,以把握现在,特别是如果它们不想以丢失甚至误导而告终的话。也需要新的概念来看待这个复杂的领域。替代监督的方法是尝试使用显微镜。至少,从近处看,这些东西是可以消化的。然而,专注于文化的一个小方面可能会排除其高度网络化和不断变化的背景的重要性。

或者,焦点的某种组合是尝试获得某种视角的一种方式。为了理解正在发生的事情,我们不仅仅需要机械的细节——超然的远景会错过深度。我们需要的是一些印象主义,关于这些细节如何融入更广阔的场景。这就是受乔治·齐美尔启发的社会学家大卫·弗里斯比所说的“社会学印象主义”。这是一种用笔触暗示细节的方法,同时给人一种背景的印象。

平台文化充满了奇怪和不寻常的东西。这些有时会在小新闻或社交媒体帖子中被顺便评论,但通常会被孤立对待。仅举几个上个月的例子来说明这一点:一本学术书籍是由机器写的;优步寻求超过 900 亿美元的上市价值,却从未公布过利润;在 Whatsapp 中发现了一个弱点,这意味着你的手机摄像头和麦克风可能会被第三方控制;本质上是零售商的亚马逊投资了一款食品配送应用 Deliveroo。我们几乎已经习惯了这样的怪癖,现在我们错过了它们,它们被评论,但它们要么似乎无关紧要,要么只提供了短暂的娱乐或分心。但是如果我们看看这些和其他的例子,它们通常能告诉我们一些更广泛的趋势和力量。如果我们能找到一个怪癖,我们就能描绘出一幅图画。

在我即将出版的新书 数字文化的怪癖 中,我确定了一系列这些不同寻常和揭示性的东西,并试图用它们来创造对支撑和塑造我们文化景观的运动、力量和不断变化的议程的印象。我报道的一些事情,比如电视游戏节目或者音乐回归,看起来都很无聊。其他的,如通过家庭设备或社交媒体操纵的声波监控,显然更加严重。数字文化的各种怪癖可以让我们对文化转移到这些技术平台上会发生什么有一点了解。这不是一个全面或全景的视图,但它可能有助于建立一个印象主义的画面,有助于理解我们面临的沸腾的混乱。我的建议是,我们留意这些稍微奇怪或不寻常的事件,当我们发现它们时,我们可以把它们放在手中,看看它们还能揭示什么。

数字文化的怪癖现已有平装本和电子书可供预购。

基础知识:决策树分类器

原文:https://towardsdatascience.com/the-basics-decision-tree-classifiers-b0d20394eaeb?source=collection_archive---------28-----------------------

从头开始的数据科学

对决策树如何工作和构建的直觉

决策树在概念上是一种简单明了的模型风格,尽管技术上的实现确实涉及到一些值得理解的计算。尽管如此,决策树背后的直觉应该很容易理解。事实上,决策树在某种程度上非常类似于人们在现实世界中做出选择的方式。

什么

当面临选择时,真实的人可能会在一系列级联决策中思考。如果我需要选择早上穿什么,我不会从衣橱里随意挑选一套衣服,我会首先分解我的选择。首先,我可能已经把厚重的冬装和轻薄的夏装分开了。然后,我可能会查看天气,进一步缩小服装的范围——比如说,如果下雨,我可能会穿靴子。最后,我可能会考虑我今天有什么计划,以及我是否因为任何原因需要打扮。你可以把我的决策过程想象成从我衣柜里的所有选项开始,然后逐渐缩小我的选择范围,直到我从一个更小的选项集中挑选。

也许我们可以教计算机以类似的方式做出决定或预测。一个方面是,决策过程是基于规则的,这使得它很容易在计算机上实现,假设我们知道规则是什么。因此,任务是找出规则是什么。

考虑一个简单的分类问题。以下是分散在三个类别中的要点:

A simple three category classification problem

如果在网格的某个地方出现一个新点,你会如何预测它属于哪一类?你可能会注意到,比如说,网格上部的所有点都是橙色的。所以,让我们从简单地在这个‘橙色领地’的底部画一条水平线开始。如果我们试图预测的新点落在这条线之上,我们会猜测它属于橙色类别:

A line now separates the orange territory

如果点低于那条线会发生什么?好了,现在我们注意到蓝点倾向于在右边,绿点倾向于在左边,所以让我们把这个较低的区域分成蓝色和绿色两部分:

Further segmentation

如果新点在这条线的左边,我们就猜它是蓝色的,如果在右边,我们就猜绿色的。常见的是决策树也被形象化为流程图。该流程图描述了该示例数据集的决策过程:

我们首先询问新点的 y 值是大于还是小于 6.138。如果小于,我们向下移动到左边,然后通过询问 x 值是大于还是小于-2.337 来跟进。

请注意,当我们将图表分割成更小的部分时,新的部分比之前的整体图表更加同质。我们从一个正方形图开始,它有相同数量的三个类别。然后,我们将图形一分为二,顶部几乎完全同质(全部为橙色),底部现在只分为两种颜色,而不是三种。在下一轮中,我们将底部一分为二,得到两个几乎同质的部分。不管我们的数据集有多复杂,有更多的特征或类别,决策树的目标是找到分割数据的方法,使子段尽可能“纯净”。

决策树的优势之一是它能很好地处理非线性。考虑一个稍微复杂一点的例子:

Another classification problem

这张图只有两个类别,但是它们没有被很好的分割。我们不能说“上面的点更可能是橙色的”,因为橙色和蓝色有点混在一起了。我们仍然可以像以前一样采取类似的策略,一点一点地分割数据集,直到我们得到相对同质的子集。决策算法将进行以下拆分。首先:

A first split

其次是:

A second split

然后,再经过两步:

Now we’re getting somewhere

该算法已经成功地识别了这些分组的各个中心。

这里有一个更具体/不那么抽象的设置,决策树算法可以很好地识别这些非线性。数据科学家在培训中常用的一个数据集有泰坦尼克号乘客的信息,包括他们是否在船沉没时死亡。如果你制作一个模型来预测某个乘客是否会死亡,你可能会注意到男性的死亡率比女性高。在逻辑回归模型中,您会注意到变量 is_man 的系数为负。有一个例外,那就是被确认为男性的儿童乘客有更高的存活率。为了捕捉逻辑模型中的非线性,你必须做一些特征工程,以某种方式交互你的性别和年龄变量。然而,通过巧妙地选择使用哪些特征来确定其分裂,决策树算法可以隐式地发现这些类型的关系。

算法正在做什么

到目前为止,我只是简单地说决策树算法决定在哪里分割数据集,而没有说如何分割。为了了解算法是如何工作的,为什么它会工作,为什么它不总是给出完美的结果,有必要稍微离题一下,谈谈信息论。

信息论基本上是由克劳德·香农创立的,尤其是在 1948 年发表了他的论文《交流的数学理论》。香农是贝尔实验室的一名研究员,也是他工作的部分动机,信息论的许多早期应用都与贝尔电话公司正在处理的通信问题有关:如何通过频繁嘈杂的电话线发送可解码的信息。其中一个重要的方面是确定什么是信息,以及如何衡量它。香农将对信息的直觉形式化为一个具体的公式,将整个问题从本质上变成了一个应用统计问题。

Claude Shannon, father of information theory

关键的见解是,字符串中包含的信息量,无论是书面英语的字母还是二进制数字,都与字符串的长度、有多少可用字符以及每个字符的使用概率有关。信息量应该与字符串的长度成比例,这可能很直观——毕竟,在一个段落中可以说的比在一个句子中说的更多——但其他两点值得一提。

首先,可用字符的数量应该与每个字符包含的信息量相关。想想写一个单词需要多少个字符。一个英语单词的平均字母数不到 5 个。(这个统计数据和许多其他有趣的英语语言统计数据将在这里讨论。)毕竟,英语字母表只有 26 个字母,并且有许多不同的可能单词,所以自然地,表达任何给定的单词都需要使用不同字母的组合。另一方面,书面汉语有成千上万的可用字符。大多数常用词可以表示为单个字符或两个字符的组合。当你有这么多的字符时,任何给定的字符都可以更具体,代表一个完整的语义单位。反之亦然;用二进制表示一个单词,只有两个可用的字符,0 和 1,比用英语表示需要更多的字符。

但是,并不是每个角色都生来平等。可预测的字符模式并不真正携带新的信息;一本只有一句话被反复重复的书,一旦你过了第一句话,明白了发生了什么,就不会告诉你任何新的东西。可预测的模式会产生信息冗余。

威滕英语似乎充满了冗余。考虑一下将“are”或“you”缩短为单个字母“r”或“u”的文本写作练习。一个经常被引用的例子是在纽约地铁广告秘书工作中发现的一则旧广告,上面写着:“f u cn rd ths,u cn BCM a sec > a GD JB w hi pa”。即使去掉一半以上的字母,大多数人也能正确解析这个句子:‘如果你能读这个……’所以看起来并不是每个字母都像其他字母一样携带那么多信息。事实证明,一个给定的字母到底携带了多少信息,与你在那个位置看到它的可能性有关。

英语中的字母使用频率不同,但更重要的是,它们之间以及它们在单词中的位置也有不同的频率。英语中一个常见的例子是,字母“q”后面几乎总是跟着字母“u”(例外情况往往是来自其他语言的外来词)。另一个可能是“e”是最常见的字母,但不经常作为一个单词的第一个字母出现。字母“I”相对常见,但很少作为单词的最后一个字母出现。某些字母经常出现在每个字母的旁边(“th”、“he”等)。),其他的不是(有多少单词含有‘KD’或者‘BP’?).因此,存在可预测的模式。

Shannon 举例说明了这一点,他试着一次猜一个单词中的下一个字母是什么。香农会从书架上取下一本书,随机选择一个句子,他的妻子会试着依次猜测每个字母。想象一下自己尝试这样做。我记住了一句话,你认为第一个字母是什么?嗯,什么都有可能!你必须猜测,而且很有可能你会弄错。但是,你不必从所有 26 个字母中随机猜出任何一个,因为有些字母在英语中比其他字母更常见。当然,可能是“z”、“q”或“j ”,但这些字母实际上并不经常出现,所以你可能不应该猜其中之一。字母“e”很常见,但正如我们已经提到的,它并不经常作为单词的开头,所以还是不要猜为妙。

知道这是一个句子的第一个字母而不仅仅是一个单词的第一个字母也会有所帮助。视上下文而定,某些词在句首很常见:“the”、“then”、“I”、“a”、“to”、“that”等。你仍然要猜,但是有一个小得多的字母池可以猜。你猜一个你认为最有可能的字母。在这种情况下,假设我确认句子的第一个字母是 t。现在猜第二个字母比第一个容易多了。首先,虽然以前有些字母我们认为不常见,但现在有些字母我们可以完全排除。英语中有以字母“tg”开头的单词吗?还是‘tk’?一旦你发现下一个字母是 h,猜第三个字母就变得更容易了。首先,你几乎可以排除所有其他辅音,这意味着在最坏的情况下,你的猜测将是五分之一,而不是 26 分之一。当你读到第三个字母时,你甚至可以一次猜出剩下的所有字母。有多少单词是以字母“tho”开头的,并且可能是一个句子的开头?可能是‘虽然’,也可能是‘成千上万’,但不可能有十几个可能的选项。

你可以把每个字母携带的信息量想象成与该槽中可能出现的合理选项的数量相关。在这个例子中,单词的第一个字母携带了大量信息——它几乎可以是任何字母——而第二个字母携带的信息稍少,单词中后面的字母几乎不携带任何信息。事实上,发短信的人在匆忙中可以将单词“tho”缩写成“tho ”,而不会失去任何意义,尽管这可能会困扰拼写纯粹主义者。though 这个词的最后三个字母基本上是多余的。

香农将所有这些形式化为一种他称为熵的度量,它本质上描述了任何给定消息可以携带的信息量。一个称为 H 的字符的熵的正式表达式是所有不同可能字符的总和:

其中 pi 是该字符出现的概率。当这个概率变为零时,和中表达式的值也变为零——如果字母“q”从未真正出现,那么它作为一个选项对你没有多大好处。至关重要的是,当概率变为零时,表达式的值也变为零(1 的对数为零):如果你提前知道下一个字符将会是什么,那么当该字符出现时,你没有学到任何新信息。

因此,最大化总熵的方法是每个可能的字符以相等的概率出现,此时文本中没有模式,字符看起来基本上是随机的。人类的语言看起来不像那样是有实际原因的。特别是,人类语言中的冗余有助于避免错误——即使有拼写错误或遗漏了一些字母,你仍然可以看出一个单词应该是什么——但这种鲁棒性的代价是添加额外的字母,使文本相应地变长。

这是决策树算法使用的公式。它查看数据点的总体集合,并计算该熵的值。在第一个例子中,我们有三个不同的类别,每个类别的数量相等——最大可能熵。

Maximum Entropy

然后,该算法考虑它可以进行的每个分割,并单独计算每个子部分的熵值。然后它搜索寻找它能产生最低可能组合熵的分裂。请记住,在本例中进行的第一次拆分实际上是将图表的橙色上半部分与蓝色和绿色的下半部分分开:

Below Maximum Entropy

在这个新的配置中,顶部的熵接近于零,因为它基本上只包含橙色点。底部的熵也减少了,因为即使它仍然在颜色之间平均分配,也只有两种颜色选项,而不是三种。决策树的实际实现可能使用不同的特定度量——GINI 杂质是一种类似但略有不同的群体同质性度量——但功能目标是相同的。

如何

当建立决策树模型时,有许多参数可以调整,特别是为了避免过度拟合。

每叶最小样本数/每分割最小样本数:这两个值都是为了避免过度拟合。一个是算法将在树的最终节点之一中接受的最小数据点数,另一个是在算法决定进行另一次分裂之前需要在子组中的点数。如果每片叶子没有最小数量的样本,算法可能会简单地继续进行越来越小的切割,直到组中只有一个样本。这些算法看起来是同质的和低熵的,但是有严重过度拟合的风险。考虑我们之前的一个例子:

Is this a satisfactory final model?

这些地区中的一些仍然不是同质的!如果我们让算法继续下去呢?

Extreme overfit

现在,奇怪的异常值,也就是大部分橙色区域中的蓝色,被赋予了自己的小雕刻,可能只包含一个或两个点的超薄区域。该模型现在过拟合。

最大深度:类似地,你可以通过给树设置一个最大深度来避免过度拟合,允许算法只做这么多的分割。您希望模型的深度可能取决于数据的性质——您有多少个特征,样本有多大,等等。

优势和劣势

决策树很容易建立;它们可以用特征工程来改进,但不一定需要。它们也不真正需要缩放或标准化特征。它们很好地处理了非线性,而且不像 KNN 模型,它们是可以解释的。用户可以查看决策树的阈值,找出给定预测是如何得出的。它们还隐式地执行自己的特征选择。本身不是特别有用的特征可能不会被利用,因为算法将发现沿着该特征分割样本不起作用。

不幸的是,决策树也很脆弱。大多数实现用来设计树的算法试图在任何给定点进行尽可能好的分割,这就是所谓的“贪婪算法”,它不一定产生尽可能好的结果,尽管它通常足够好。一个不幸的后果是,对训练数据的微小改变会导致算法找到一个完全不同的树,也许早期的分裂之一将在不同的地方进行,从而改变随后的所有决策。虽然决策树通常是可解释的,但是根据具有许多特征的数据训练的深度树将是复杂的,因此不像线性回归中的系数那样容易解释。

最后要指出的一点是,由树做出的决策的性质意味着某些形状的决策边界对树来说更容易或更难映射。当相似数据点的组彼此充分分离或者组之间的边界与特征对齐时,决策树将能够相当好地跟踪它们。当许多点靠近与特征不对齐的边界时,树会变得更难。考虑下面的例子:

Yet another classification problem

您可以直观地看出这两个区域之间的边界实际上是线性的。如果将 x 和 y 坐标都考虑在内,则只需一次分割就可以准确地分离蓝色和橙色区域,如下所示:

A sensible way of splitting up the territory

然而,决策树算法很难定义与一个特征不一致的决策边界。对于这个例子,你需要让树至少有四到五层深,你会得到一个更加混乱的边界:

What our decision tree algorithm actually produces

假设您对数据有很好的了解,较小的特征工程将允许您克服这一点,但是这些种类的边界可能用其他工具更好地建模。

基础知识:分类和回归的 KNN

原文:https://towardsdatascience.com/the-basics-knn-for-classification-and-regression-c1e8a6c955?source=collection_archive---------5-----------------------

从头开始的数据科学

对 KNN 模型如何工作建立直觉

数据科学或应用统计课程通常从线性模型开始,但就其方式而言,K 近邻可能是概念上最简单的广泛使用的模型。KNN 模型实际上只是一种普遍直觉的技术实现,即具有相似特征的事物往往是相似的。这算不上深刻的见解,但这些实际的实现可能非常强大,而且,对于接近未知数据集的人来说至关重要的是,可以在没有任何复杂的数据工程或模型设置的情况下处理非线性。

什么

作为说明性的例子,让我们考虑使用 KNN 模型作为分类器的最简单的情况。假设您有属于三类之一的数据点。二维示例可能如下所示:

Three categories

您可能会非常清楚地看到不同的类别被分组在一起——图表的左上角似乎属于橙色类别,右边/中间部分属于蓝色类别。如果给你一个新点在图上某处的坐标,并问它可能属于哪一类,大多数情况下答案会非常清楚。图表左上角的任何一点都有可能是橙色的,等等。

然而,在两个类之间,任务变得不那么确定,我们需要确定一个决策边界。考虑下面用红色添加的新点:

Which of the original categories does the new point belong to?

这个新点应该归为橙色还是蓝色?这一点似乎落在两个集群之间。您的第一直觉可能是选择离新点更近的集群。这将是“最近邻”方法,尽管在概念上很简单,但它经常产生相当合理的预测。哪个先前识别的点是最接近的新点?仅仅目测图表,答案可能并不明显,但计算机很容易浏览这些点,并给我们一个答案:

With the nearest point now circled in red

看起来最近的点在蓝色类别中,所以我们的新点可能也是。这就是最近邻法。

此时,您可能想知道 k-nearest-neighbors 中的“k”是什么意思。k 是模型在评估新点时将查看的邻近点的数量。在我们最简单的最近邻例子中,k 的值就是 1——我们查看最近邻,仅此而已。然而,你可以选择看最近的 2 或 3 个点。为什么这很重要,为什么有人会把 k 设得更高?一方面,类之间的边界可能会彼此相邻,使得最近的点给我们正确的分类不太明显。考虑我们例子中的蓝色和绿色区域。事实上,让我们把它们放大:

Zooming in on the the boundary between the blue and green regions

请注意,虽然整体区域看起来足够不同,但它们的边界似乎有点相互交织。这是带有一点噪声的数据集的共同特征。在这种情况下,对边界区域的事物进行分类变得更加困难。考虑这个新观点:

A new point along the border between blue and green regions

一方面,从视觉上看,最接近的先前确定的点肯定是蓝色的,我们的计算机可以很容易地为我们确认这一点:

The new point is closes to a blue point

另一方面,最近的蓝点看起来有点像异常值,远离蓝色区域的中心,有点被绿点包围。这个新点甚至在那个蓝点的外面!如果我们观察离新红点最近的三个点会怎么样?

Looking at three nearby points

或者甚至是离新点最近的五个点?

Looking at five

现在看来,我们的新点是在一个绿色的街区!它碰巧有一个附近的蓝点,但优势或附近的点是绿色的。在这种情况下,为 k 设置一个更高的值,查看一些附近的点,并让它们以某种方式对新点的预测进行投票,这可能是有意义的。

正在说明的问题是过度拟合。当 k 设置为 1 时,算法识别为蓝色和绿色的区域之间的边界是凹凸不平的,它随着每个单独的点向前弯曲。红点看起来可能在蓝色区域:

The same graph with the implicit decision boundaries highlighted

然而,当不同的邻近点投票时,将 k 提高到 5 可以平滑决策边界。红点现在似乎牢牢地位于绿色区域:

Decisions now made based on 5 neighbors

k 值较高的代价是决策边界中粒度的损失。将 k 设置得很高会使边界变得平滑,但是您试图模拟的真实世界的边界可能并不完全平滑。

实际上,我们可以使用相同类型的最近邻方法进行回归,其中我们需要一个单独的值而不是一个分类。考虑下面的回归:

A simple regression example

数据是随机生成的,但生成的数据是线性的,因此线性回归模型自然会很好地拟合该数据。不过,我想指出的是,您可以使用 K-最近邻方法以概念上更简单的方式来近似线性方法的结果。在这种情况下,我们的“回归”不会像 OLS 模型那样是一个单一的公式,而是任何给定输入的最佳预测输出值。考虑 x 轴上的值-.75,我用垂直线标记了它:

无需求解任何方程,我们只需考虑附近的点,就可以得到输出的合理近似值:

Three points near a chosen x-value

预测值应该在这些点附近,而不是更低或更高,这是有意义的。也许一个好的预测是这些点的平均值:

An average of their outputs

您可以想象对所有可能的输入值都这样做,并到处得出预测:

将所有这些预测用一条线连接起来,我们得到了回归结果:

在这种情况下,结果并不是一条清晰的直线,但它们确实很好地描绘了数据的上升趋势。这可能看起来不太令人印象深刻,但这种实现的简单性的一个好处是它可以很好地处理非线性。考虑这个新的点集合:

A non-linear example

这些点是通过简单地对上一个示例中的值求平方而生成的,但是假设您在野外遇到了这样的数据集。显然,它在本质上不是线性的,虽然 OLS 风格的模型可以轻松处理这种数据,但它需要使用非线性或交互术语,这意味着数据科学家必须就执行何种数据工程做出一些决定。KNN 方法不需要进一步的决策——我在线性示例中使用的相同代码可以完全重新用于新数据,以产生一组可行的预测:

与分类器示例一样,设置较高的 k 值有助于我们避免过度拟合,尽管您可能会开始失去对边缘的预测能力,尤其是在数据集的边缘周围。考虑第一个示例数据集,其预测 k 设置为 1,这是最近邻方法:

KNN reggressor with K set to 1

当模型从数据集中的一点跳到下一点时,我们的预测会不稳定地跳跃。相比之下,将 k 设置为 10,这样总共 10 个点被平均在一起用于预测会产生更平滑的行驶:

KNN regressor with K set to 10

一般来说,这看起来更好,但是您可以在数据的边缘看到一些问题。因为我们的模型为任何给定的预测考虑了如此多的点,当我们接近样本的一个边缘时,我们的预测开始变得更差。我们可以通过将我们的预测加权到更近的点来解决这个问题,尽管这有其自身的权衡。

如何

当建立 KNN 模型时,只有少数参数需要选择/调整以提高性能。

K:邻居的数量:如前所述,增加 K 将会平滑决策边界,避免以牺牲某些分辨率为代价的过度拟合。不存在适用于每个数据集的单一 k 值。对于分类模型,特别是如果只有两个类别,通常为 k 选择一个奇数。这是为了使算法永远不会遇到“平局”:例如,它查看最近的四个点,发现其中两个在蓝色类别中,两个在红色类别中。

距离度量:事实证明,有不同的方法来衡量两点之间的“接近”程度,并且这些方法之间的差异在更高维度中会变得显著。最常用的是欧几里得距离,这是你在中学可能已经学过的使用勾股定理的标准排序。另一个度量标准是所谓的“曼哈顿距离”,它测量每个主要方向上的距离,而不是沿着对角线的距离(就好像你从曼哈顿的一个十字路口走到另一个十字路口,不得不沿着街道网格走,而不是选择最短的“直线”路线)。更一般地说,这些实际上是所谓的“闵可夫斯基距离”的两种形式,其公式为:

当 p 设置为 1 时,该公式与曼哈顿距离相同,当设置为 2 时,为欧几里德距离。

权重:当算法对一个类进行投票时,有一种方法可以解决可能出现的“平局”问题,也有一种方法可以解决我们的回归预测越接近数据集边缘越糟糕的问题,这就是引入权重。对于权重,近点比远点更重要。该算法仍然会查看所有 k 个最近的邻居,但是最近的邻居比较远的邻居拥有更多的投票权。这不是一个完美的解决方案,并带来了再次过度拟合的可能性。考虑我们的回归示例,这次使用权重:

KNN regressor, but not with weighted voting

我们的预测现在直接到了数据集的边缘,但是你可以看到我们的预测现在摆得更靠近单个的点。当您在点之间时,加权方法工作得相当好,但是当您越来越接近任何特定点时,该点的值对算法的预测有越来越大的影响。如果你足够接近一个点,这几乎就像把 k 设为 1,因为那个点有如此大的影响。

缩放/标准化:最后一点,也是非常重要的一点是,如果不同的特征变量具有非常不同的缩放比例,KNN 模型可能会被抛弃。假设有一个模型试图根据卧室数量和房屋总面积等特征来预测市场上房屋的销售价格。一所房子的平方英尺数比卧室数的差异更大。通常,房子只有少数几个卧室,即使是最大的豪宅也不会有几十或几百个卧室。另一方面,平方英尺相对较小,所以房子的面积可以从小的接近 1000 平方英尺到大的上万平方英尺不等。

考虑两个卧室的 2000 平方英尺的房子和两个卧室的 2010 平方英尺的房子之间的比较。脚几乎没什么区别。相比之下,一栋 2000 平方英尺、有三间卧室的房子就大不相同了,它代表了一种非常不同的、可能更拥挤的布局。然而,一台天真的计算机没有上下文来理解这一点。它会说三居室离二居室只有“一”个单元,而 2010 平方英尺的房子离 2000 平方英尺的房子是“十”个单元。为避免这种情况,应在实施 KNN 模型之前对要素数据进行缩放。

优势和劣势

KNN 模型易于实现,并能很好地处理非线性。拟合模型也往往很快:毕竟,计算机不需要计算任何特定的参数或数值。这里的权衡是,虽然模型建立起来很快,但预测起来较慢,因为为了预测新值的结果,它需要搜索训练集中的所有点,以找到最近的点。因此,对于大型数据集,与其他可能需要更长时间才能拟合的回归方法相比,KNN 可能是一种相对较慢的方法,但随后可以通过相对简单的计算进行预测。

KNN 模型的另一个问题是它缺乏可解释性。OLS 线性回归将有清晰的可解释系数,这些系数本身可以给出给定特征的“效应大小”的一些指示(尽管,在指定因果关系时必须小心)。然而,对于 KNN 模型来说,询问哪些特征影响最大并没有什么意义。部分由于这个原因,KNN 模型也不能真正用于特征选择,就像增加了成本函数项的线性回归(如 ridge 或 lasso)一样,或者决策树隐式选择哪些特征似乎最有价值。

基础知识:线性回归

原文:https://towardsdatascience.com/the-basics-linear-regression-2fc9f5124687?source=collection_archive---------8-----------------------

从头开始的数据科学

对线性模型如何工作建立直觉

线性回归模型是第一批预测模型。虽然在概念上很简单,但它们有一些关键的特性,使它们灵活、强大且易于理解。虽然更新的和概念上更复杂的模型可能优于线性回归,但线性模型继续得到广泛使用,特别是在社会科学和政策领域,在这些领域,数据收集可能很昂贵,而高度可解释的模型有很大的价值。线性回归的扩展,如 Ridge 和 Lasso,可以帮助避免在特征丰富的模型中过度拟合,甚至执行特征选择。逻辑回归使线性框架适合分类问题。首先,让我们看看平面-普通线性回归是如何工作的。

什么

线性回归将输出变量建模为输入要素的线性组合。这到底是什么意思?让我们从最简单的情况开始,了解一下模型是如何工作的,然后考虑如何将其扩展到具有更多功能的更复杂的情况。

线性模型试图找到特征变量和输出之间尽可能简单的关系。这通常被称为“拟合直线”。你可能记得在代数课上,任何给定的线都可以表示为某种形式的方程:

其中 y 是因变量/输出,m 是斜率,x 是输入/自变量。x 每增加一个单位,y 就增加 m 个单位(如果 m 为负,y 就减少)。b 项是一个截距项,它在不改变斜率的情况下向上或向下移动你的直线。线性回归试图找到输入要素和因变量之间的相似关系,并最终创建一个相似的公式:

在一个变量中,它看起来就像一条线,除了我们把系数 m 重命名为希腊字母 beta。让我们想象一个简单的例子。以下是一些数据点:

Some points to consider

这就像每个真实世界的数据集一样,有点嘈杂,但显然有一个趋势:随着 x 的增加,y 也增加。也许这种关系用一条线就能很好的估计出来。你如何选择哪一行呢?考虑以下选项:

Two possible lines: which describes the points best?

哪条线似乎最能抓住趋势?不一定清楚。橙色的线看起来最接近左边的点,但是一旦你接近分布的中心,就不清楚了。在右手边,也许橙色线超出了标记,太高了。

线性回归模型通过最小化直线和各个点之间的垂直距离来选择直线。只考虑红线,以及点和线之间的垂直距离,现在显示为紫色线段:

Just the red line, with the vertical distances to the line visualized

您的回归线代表您对任何给定 x 值的预测。这些紫色线代表每个点的预测误差。当然,你画的直线不会完全没有误差,但是尝试最小化这个误差似乎是一个合理的目标。实际上还有一个小问题,那就是线性回归模型通常不会简单地找到最小化预测误差的直线,而是找到最小化预测误差平方值的直线。对于更倾向于数学的人来说,这被称为误差平方和或 SSE,用如下公式表示:

我们最小化平方误差的事实就是这种方法的名字:普通最小二乘法或 OLS。让我们在我们的可视化中包括平方误差的值。红线的系数为 40,截距值为 10:

Spelling out the coefficient, intercept and SSE

调整截距可以上下移动线条。如果我们把截距改为 30,线会上移。新线条是更好还是更差的预测器?它变得更靠近一些点,但是离已经在线下的点更远。然而,从误差平方和来看,这条新线总体上是一个更差的预测指标:

The new intercept increases our SSE

当然,我们也可以调整系数,改变直线的斜率。事实证明,我们的线太陡了,将系数降低到 30 可以改善整体预测:

Our best fitting line yet

通过使用一点微积分,我们可以找到最小化 SSE 的系数和截距的值,并给出最佳拟合线(或者更准确地说,您的计算机可以使用微积分并为您找到这些值)。

虽然这些示例都很简单,只有一个输入要素,但这种方法很容易推广到多维。对于任何给定的特征集,多元 OLS 模型将找到相应的系数集。这些多元模型有点难以可视化,但在概念上是相同的。我们将有多个 beta 系数,而不是一个 beta 系数,每个 beta 系数对应一个输入要素:

从这些线性模型公式的描述中,你可能已经看到,线性模型的一个好处是很容易解释它们是如何通过系数工作的。如果 X1 的值增加 1,模型对 y 的估计值就会增加β1 的值。很容易看出是什么影响了您的预测值,也很容易知道如果您假设改变其中一个特征,您的预测将会如何变化。

假设和警告

线性回归模型隐含地对特征变量以及它们与因变量的关系做出某些假设。线性回归有用的部分原因是,在满足这些假设的情况下,它具有可预测的特性。例如,您可以为任何给定的预测创建准确的误差幅度。如果不满足基本假设,线性回归模型将不会那么准确,尽管它们在提供可用预测的意义上可能仍然有用。这些假设是什么?

1.输出变量是特征变量的线性组合——线性

简单地说,输出变量可以用一组系数乘以相应的特征变量来精确描述。我们将每个输入特征变量乘以其 beta 系数的公式在技术上称为“线性组合”。需要注意的是,虽然这被称为线性,但并不意味着线性回归都是简单的直线,因为输入特征变量不需要是线性的 考虑这样一个例子:

A non-linear example.

这些点显然不是线性的——我可以确认它们是方形的,通过生成一组线性点,然后简单地平方 y 值来创建。当然,没有一条直线能很好地捕捉曲线!然而,线性回归仍然可以处理这样的数据集,因为输入要素可以是二次的。以前,我们的例子显然是线性的,所以我们的公式也是线性的:

在这种情况下,看起来有一些二次的东西在进行,但我们仍然可以使用一个线性框架和一点点功能工程。让我们添加一个新的特征,这将是我们原来的特征平方。现在我们有了新的公式:

该公式是两个特征 X1 和 X1 的平方的线性组合。它还有线性!我们之前的所有框架基本上是一样的,我们可以用同样的方式建模这些点并可视化这些错误:

But linear regression can still handle it!

2.恒定方差—同方差

这是一种奇特的说法,即当你移动输入变量时,输出变量的方差保持不变。例如,这组点看起来是同质的,是线性回归的主要候选点:

Another regression example

如果我们对此拟合一条线,我们会注意到,虽然这些点可能不总是正好落在这条线上,但预测线和这些点之间的平均距离似乎不会随着您的前进而增长或收缩:

另一方面,这种分布看不到恒定的方差,技术术语是异方差的:

A heteroscedastic example

像这样的分布看起来不太适合线性回归。当然,我们可以用一条线来拟合它,但是这条线提供的预测似乎越来越不准确:

Our linear regression looks less impressive…

注意到异方差会让你对使用线性模型有所犹豫,但这并不意味着 OLS 线性模型完全无效。在真实世界的数据中,异方差通常是一种迹象,表明某些具有解释价值的特征(某些解释变量,尤其是交互项)尚未纳入模型。为了说明我这样说的意思,让我们想象一个真实世界的场景,它可能会给我们提供类似上面例子的数据。

假设你是一名经济研究员,正在进行一项关于收入分配的研究。您希望创建一个基于一些变量来预测收入的模型:收入似乎会根据您的所在地、个人受教育程度等因素而有所不同。要包括的一个变量是这个人已经工作了多长时间。除非经济不景气,否则随着职业生涯的进展,人们往往会挣得更多。你问你的回答者他们工作了多久,然后把结果标在 x 轴上,收入水平标在 y 轴上。你会发现你有一个像上面这样的图表,收入不断扩大。有人告诉你要警惕异方差,这是否意味着你应该放弃这个变量或者尝试不同类型的模型?也许不是。

在我们做任何激烈的事情之前,让我们试着想清楚我们每个变量之间的关系。我们看到收入随着工作年限的增加而增加,但这种情况的发生率似乎并不是对每个人都一样。让我们试着用另一个变量来划分我们的数据。让我们以教育水平为例,根据受访者是否拥有高中学历、大学学历或专业学位(如律师或医生),对他们进行分组。分别考虑这些群体,可能会给我们一个这样的图表,不同的颜色代表不同的教育水平:

Our heteroscedastic example, color coded

现在数据看起来更像三个同方差分布!每一个教育水平似乎都可以用一条线来很好地估计,但是这些线的斜率都有一点不同,这就是当我们只看工作年限和收入时,总体分布呈现出异方差的原因。实际上,我们可以在一个模型中说明这一点,而不用通过包含一个交互项将数据分成三组:我们将创建的一个新特征,类似于我们的教育水平乘以工作年限。我们的回归公式如下所示:

这种情况的挑战在于它需要人工输入——模型无法为您执行特征工程。在您拥有领域知识并能够合理猜测特征变量可能如何交互的领域,您仍然可以使用线性模型,并获得良好拟合和高度可解释的模型。

3.误差的独立性

误差,即数据中的实际值和模型的预测值之间的差异,应该彼此不相关。任何一组随机点的误差项本质上应该看起来像同分布的独立随机变量。如果情况并非如此,这意味着您的模型在某些领域的预测性会低于其他领域。同样,这可能是变量偏差缺失的迹象。

4.缺乏完美的多重共线性

虽然可以通过将其他要素平方或使多个要素相互作用来创建要素,但没有一个要素应该与另一个要素完全相关(例如,一个要素以年为单位测量年龄,另一个要素以月为单位测量年龄),或者是其他要素的线性组合。首先,这会产生可解释性问题,因为多个系数可以描述同一条线,例如 y = 24*年数= 12 *年数+1 *月数= 2 *月数。这也产生了一个问题,因为统计包通常使用线性代数求解系数,如果存在完美的多重共线性,这种方法就不起作用。(用专业术语来说,代表每个样本变量值的‘设计矩阵’必须是可逆的,多重共线性则不是这种情况。)

基础:逻辑回归和正则化

原文:https://towardsdatascience.com/the-basics-logistic-regression-and-regularization-828b0d2d206c?source=collection_archive---------2-----------------------

从头开始的数据科学

线性模型的扩展

普通最小二乘线性回归开箱即用,功能强大,用途广泛,但在某些情况下它会失败。首先,它是一个“回归”框架,这使得它很难作为一个分类器来应用。另一方面,与决策树不同,线性回归模型不执行自己的隐式特征选择,这意味着如果包含太多特征,它们容易过度拟合。幸运的是,线性模型有一些扩展,允许我们克服这些问题。逻辑回归将线性回归框架转变为分类器和各种类型的“正则化”,其中脊和套索方法是最常见的,有助于避免在特征丰富的情况下过度拟合。

逻辑回归

逻辑回归基本上采用了线性回归公式,使其能够充当分类器。为什么常规的 OLS 线性回归不能单独作为一个分类器?让我们考虑一个例子。下面,是一个简单的一维分类例子。x 变量是连续的,但 y 变量是分类的,可以是零或一:

A simple regression example

有一些重叠,但是我们可以直观地看到,当我们向右移动时,我们的分类选项卡变得更加突出。在右边,更多的点是 1 而不是 0,在某个 x 值之上,我们看到的所有的点的 y 值都是 1。这看起来是一个相当容易建模的关系,但是如果我们试图简单地用线性回归来拟合这个数据,结果就有点奇怪了:

Fitting an OLS line to our classification problem

一方面,这条线在某种程度上成功地捕捉到了两个变量之间的正关联,但是这条线的输出并没有太大的意义。如果我在 x 值为 0.25 时查阅这条线,我们发现这条线预测的值为 0.71。因为我们试图预测一个只取值 0 或 1 的变量,所以预测 0.71 有点奇怪;我们的二元变量实际上不能取那个值,那么这个预测意味着什么呢?

在这种情况下,解释小数值的一种方法是稍微重新组织一下我们的问题。我们可以不要求模型预测自变量的值,而是要求模型给出自变量的值为 1 的概率。随着模型输出的增加,我们可以说变量为 1 的几率也增加了。这个框架中的小数值更有意义。像 0.71 这样的值意味着什么?嗯,这个结果比模型给我们的数字低的可能性更大,比给我们的数字高的可能性更小!

然而,要把我们简单的线性回归变成这种模型,还有一点工作要做。首先,从直觉上看,我们的模型应该输出的概率是非线性的。就目前的情况而言,我们的线性回归有时会给出大于 1 的值或负值,这同样没有意义。在这种情况下,我们的解决方案是让我们的线性模型通过一个 sigmoid 函数。“Sigmoid”在这里的意思是“S 形”,我们可能会用到一些函数,但最常用的是逻辑函数。逻辑函数的一般形式如下:

这可能看起来有点吓人,但是值得稍微思考一下。分数底部的 e 上的指数看起来像我们之前的线性回归方程,除了整个东西都是负的。随着这个“回归方程”的输出变得非常大,指数相应地变负,e 的值的乘方变为零;因此,整个表达式的值更接近 1/(1+0),即 1。如果这个回归方程的输出非常负,那么 e 被提高到正值,分数的底部变得非常大;整个表达式的值越来越接近 0。

在我们之前的示例中,拟合的逻辑曲线如下所示:

Our simple classification problem with a fitted logistic curve

我们的曲线从来不会低于 0 或高于 1,所以我们可以明智地将其解释为二元变量为 1 的概率。拟合这条曲线的过程基本上与我们拟合正常的线性回归线是一样的。在这里,我们找到了截距和系数β1,使直线和点之间的垂直距离最小化,这里我们同样找到了截距和系数,但现在我们要使到这条曲线的距离最小化。

一旦你得到了最合适的逻辑曲线,将预测的概率转化为预测的结果就相对简单了。因为结果是二元的,所以你的预测也是二元的。最简单的是,如果你向大多数统计软件包询问预测结果,它们可能会做什么,只要你的逻辑回归给你 50%以上的概率,你就可以简单地预测该类。让我们将这些预测包含在我们的可视化中:

当然,由于该模型在任一点上对概率产生更细粒度的估计,因此您可以使用逻辑模型为进一步的模型产生输入,这些模型本身也接受概率。例如,预测选举结果的人可能有一套模型来预测每个州的选举结果,然后在一个模型中使用这些概率来预测整个国家所有州的结果范围。

逻辑回归以与简单线性回归非常相似的方式推广到多个变量,向回归公式添加了更多的特征和相应的系数:

逻辑版本中的系数比普通线性回归中的系数更难解释。理论上,您可以通过将它们与正在建模的结果的对数概率的变化相关联来直接解释它们,但这意味着什么有点不清楚,因为实际上,移动输入要素之一对概率的影响取决于您从哪里开始。然而,你可以简单地解释系数的方向。具有正系数的要素随着其增加而增加建模结果的概率,而具有负系数的要素随着其增加而降低概率。

规则化(脊和套索)

山脊和套索正则化也称为“收缩”方法,因为它们会减少或收缩结果回归中的系数。这减少了模型中的方差:当输入变量改变时,模型的预测变化比没有正则化时要小。为什么要减少模型的方差?以避免过度拟合。

过度拟合导致我们的模型无法推广。有时我们可能会发现,我们已经在一些数据集上训练了一个模型,它似乎在这些数据上工作得很好,但当我们在一些新的数据集上测试它时,性能会受到影响。出现这种情况有几个原因。例如,也许我们得出模型的样本在某些方面有偏差。另一个常见的问题是过度拟合,即模型过于符合训练集,因此错过了更具普遍性的趋势。

考虑创建一个模型来估计某个城市市场上新房子的售价。你有以前房屋销售的数据,并着手创建一个线性回归。显然,大房子往往比小房子更贵,所以你可能会自然地包括平方英尺或卧室数量等特征。你可能还会注意到,不同的社区可能会有不同的定价,比如说,一个社区的两居室可能比另一个社区的要贵。所以,你决定在你的模型中包括邻居,但是为什么要止步于此呢?也许在一个街区内也有变化,所以你可以考虑包括次街区大小的单元,也许是单独的街道甚至单独的街区。你可能能够想象为什么如此精细的位置标记实际上会对房子的最终价格产生影响——可能街区的一端过于靠近嘈杂、繁忙的十字路口,不太理想,或者街区的另一部分阳光更好——但当涉及到实际训练你的模型时,你会遇到几个挑战。

首先,在回归中包含的变量越多,就越有可能遇到特征之间的过度协方差(在添加交互或幂项时尤其可能)。另一方面,支持你估计任何给定系数的数据量可能很小。当按街区对房屋销售进行分组时,每个街区可能都有许多数据点,但是如果将数据一直拆分到街区级别,任何给定的街区都可能只有少数几个示例可用于训练模型。如果您要包括每个单个块的要素,任何块的系数都可能很容易被异常值扭曲-例如,如果您的训练数据中的一所房屋碰巧以异常高或异常低的价格出售。您的模型可以很好地代表您的训练数据,但不一定能很好地预测未来。

多少功能才算太多?哪些特性是最重要的?正规化会有所帮助。岭正则化和套索正则化都是通过向用于推导回归公式的成本函数添加一个新项来实现的。回想一下,OLS 回归通过最小化训练数据的预测误差平方来查找系数和截距,如下式所示:

Lasso 正则化将另一项添加到此成本函数中,表示模型中所有系数的大小之和:

在上面的公式中,第一项是我们知道并喜爱的残差平方和,第二项是一个惩罚,其大小取决于所有系数的总大小。该总和前面的项由希腊字母 lambda 表示,是一个调整参数,用于调整惩罚的大小。如果它被设置为 0,你会得到一个普通的 OLS 回归。岭回归遵循相同的模式,但罚项是系数平方之和:

包括额外的惩罚项实质上抑制了包括额外特征。一项新功能可能有助于通过减少残差来最小化成本函数中的第一项,但它会增加惩罚项。这里有一个最终的平衡动作,增加一个系数的值与模型的整体方差的相应增加相权衡。

降低模型的方差可以提高模型对未知数据的准确性。在我们的住房价格预测例子中,你可以想象包括那些逐块的变量,但是看到这些变量的系数非常低。一个离群的房子不再把那个地区的所有预测都抛出这么多。

不言而喻,脊线和套索也作为它们自己的特征选择;不驱动回归预测能力的特征看到它们的系数被下推,而更具预测性的特征看到更高的系数,尽管增加了惩罚。岭回归,因为它平方惩罚项中的系数,倾向于将不太有用的特征的系数降低到接近零,但不完全为零。另一方面,Lasso 将有助于将一些系数一直发送到零。

密码学基础

原文:https://towardsdatascience.com/the-basics-of-cryptography-80c7906ba2f7?source=collection_archive---------7-----------------------

R 中的应用程序

Photo by Markus Spiske on Unsplash

你有没有想过公司如何安全地存储你的密码?或者在网上购物时,你的信用卡信息是如何保密的?

答案是密码学。现在,绝大多数互联网网站都使用某种形式的加密技术来确保用户的隐私。就连来自你 Gmail 账户的电子邮件等信息,在谷歌数据中心流动时也会被加密。

什么是密码学?

密码学是一门针对潜在的第三方对手安全传输信息的科学。

例如,想想“模仿游戏”对于那些看过这部电影的人来说,你知道这是一个关于艾伦·图灵如何创造第一台计算机来解密德国恩尼格玛机的故事,这是一台对所有德国通信进行编码的机器,以便纳粹可以通过无线电安全地传输信息。虽然这些信息很容易被盟军截获,但这些信息却无法被理解,因为它们都是用每天都在变化的外国密钥进行编码或加密的。

Cover of “The Imitation Game”

加密算法

  1. 对称密钥加密—在对称密钥算法中,有一个公共密钥,用于锁定和解锁加密“盒子”发送方和接收方拥有相同的密钥。对称密钥算法非常快,因为密钥不需要很长;然而,首先存在共享公共密钥的问题,因为它可能被截取,然后整个系统受到危害。
  2. 非对称密钥加密—在非对称密钥算法中,只有接收方持有密钥。接收者可以公开发出一个锁(或者锁定我们假设的盒子的方法),只有接收者持有这个锁的密钥。锁叫做公钥,钥匙叫做私钥。注意:每个私钥只有一个公钥。

非对称密钥加密:它是如何工作的?*

首先,接收器通过以下方式生成 2 个公钥 ne ,以及一个私钥 d :

  1. 选择 2 个大素数 p & q ,使得 n = p*q
  2. 选择另一个素数 e,例如 3
  3. Calculating d such that d*e-1 = k(p-1)(q-1).

Next, you’re ready to encrypt:

  1. Next transform the plaintext that you want to send into a number m ,使用 ASCII 数字表示或其他方法。
  2. 通过找到密文 c= m^e mod n. 来加密数字 m
  3. n、ec 发送给接收者。

如果这很难理解,请查看我的 Github,上的示例代码,它使用 R 中的一个名为“openssl”的包,引导你完成这个过程的每一步。摘录见下文:

R code on Github to practice encrypting & decrypting messages

签名

加密的另一个重要方面是签署消息的能力。它允许您验证发送者,并避免将敏感信息发送给错误的用户和/或公钥。

如何签署消息

创建一个签名 M ,这样 S = M^d mod n,和你的消息一起发送 S 。记住 d 是你的私钥。

如何验证签名

如果 M= S^e 模 n. ,接收者可以快速确定签名有效

R code on Github to sign & verify a message

散列法

您会注意到,在上面的示例代码中,我使用函数 sha256()作为变量 m_hash。哈希是一种单向加密功能,允许您将信息不可逆地转换为称为哈希的字母和数字字符串。哈希不同于加密,因为哈希意味着不可能被解密,尽管许多人已经尝试过,有些人已经成功了。当您听到密码或其他安全漏洞时,通常指的是加密黑客攻击,黑客能够将哈希与原始文本进行匹配。

工作原理:

有各种各样的散列算法( MDSHA1SHA2 、&SHA3),但是我们将集中讨论 SHA256 算法,因为它是当今最常见的算法。

SHA256 算法首先将文本转换为由 0 和 1 组成的 256 位字符串(因此得名)。一个例子是:

1110001010111000101011100010101110001010111000101011100010101110001010111000101011100010101110001010111000101011100010101110001010111000101011100010101110001010111000101011100010101110001010111000101011100010101110001010111000101011100010101110001010000101

由于这些二进制散列非常长,无法显示,因此它们被转换为十六进制格式(值 0–9 & a-f 的 64 个字符的组合),每个 4 位部分代表一个字符。十六进制表示的一个例子是:

a 235810 CD 87 df 030d 78 e 890d 90 c 187 cc 04 a 09 ad 09 b 289 b 91 BBA e9 d 890 f 987 e

密码

哈希的一个主要用途是用于密码验证。对你的银行来说,保存一个密码数据库是非常不安全的,所以它保存了一个散列数据库,与你的实际密码相对应。当您在线登录银行时,系统会对您的密码进行哈希处理,然后根据您的档案中的哈希进行核对。

这个系统之所以有效,是因为哈希算法总是为相同的密码生成相同的哈希——哈希不是字符的随机组合。哈希也是拥有复杂且唯一的密码很重要的原因,因为如果我计算“密码 123”的哈希,并将其与对应于您的哈希进行匹配,那么我就知道您的密码是“密码 123”,并且我可以轻松地在网上侵入您的银行帐户。

加分内容!

彩虹桌

彩虹表是普通密码的散列数据库。

以 ATM 密码为例。使用数字 0-9 的 4 位 ATM pin 码有 10,000 种组合。彩虹表将为 10,000 个代码中的每一个提供散列,黑客可以使用该散列列表将散列映射回您的代码,从而从散列中解码您的 pin 号。

晚上怎么睡得着?

放松点。银行和大多数其他组织明白黑客想要获取敏感信息,因此他们通常通过一种叫做“盐”的东西来提供额外的安全层。

Salts 是添加到密码(或其他信息)中的额外字符串,使其更独特、更长、更难破解。

添加 salt 会将您的 pin 更改为类似于“0000B_of_A_salt”的内容,这将具有完全不同的散列,而不是 pin = "0000 "。组织可以创造性地使用盐来使黑客攻击变得极其困难。为了使用彩虹表来破解这样的算法,您需要为每种可能的盐准备一个彩虹表,这极大地增加了 pin 号码的可能组合的数量。

区块链

加密技术使区块链能够通过签名来验证网络中的发送者,并确保过去的交易和记录(称为“块”)不能被更改。

区块链还利用哈希算法为每个区块分配一个唯一的哈希,允许您区分不同的区块。

结论

既然你已经知道了散列和加密的所有知识,看看这个简短的视频关于艾伦·图灵是如何成功“黑掉”德国的 Enigma 机器的,如果你还没有看过的话,就看看这个电影吧!

*注意:出于本文的目的,我重点介绍了一种称为 RSA (Rivest、Shamir 和 Adleman)加密的非对称加密算法。

深度神经网络的基础

原文:https://towardsdatascience.com/the-basics-of-deep-neural-networks-4dc39bff2c96?source=collection_archive---------12-----------------------

随着 Tensorflow 2.0、PyTorch 和 Fastai 等库的兴起,越来越多的人可以实现深度学习,这有助于理解深度神经网络背后的基础。希望这篇文章能够帮助那些正在学习深度神经网络的人。

当我第一次了解神经网络并实现我的第一个神经网络时,它们总是被表示为单独的人工神经元,本质上是具有单独加权输入、总输出和激活函数的节点。

当第一次回到学习深度神经网络时,这如何等同于矩阵乘法的概念并不明显。此外,与此相关的是为什么图形处理单元(GPU)及其衍生产品对深度学习结果的推动作用如此之大。

与矩阵乘法相比,这是一个非常简单的神经网络

让我们来看一个非常简单的网络,它有两个输入,一个隐藏层有两个神经元。每个神经元有两个权重,每个输入有一个单独的权重。每个权重乘以输入到神经元的每个输入,然后求和,并在通过激活函数馈送后形成来自神经元的输出。

A very simple network

这等同于应用两次矩阵乘法,然后是激活函数。

First matrix dot product multiplication. Generated using the excellent http://matrixmultiplication.xyz

Second matrix dot product multiplication. Generated using the excellent http://matrixmultiplication.xyz

GPU 带来的进步

我们离开上一个所谓的“人工智能冬天”的原因之一是使用 GPU 取得的计算进步,在这个冬天,人工智能和机器学习的研究和兴趣放缓并变得“冷淡”。

GPU 传统上用于计算机图形和计算机视频游戏领域。计算机图形学需要非常快的矩阵乘法。计算机视频游戏行业对 GPU 计算能力的需求导致了 GPU 设计者和制造商的巨大进步。

值得注意的是,最大的 GPU 公司之一 Nvidia 发布了 CUDA(一种用于在 Nvidia GPUs 上编程的语言/API)和 cuDNN(使用 CUDA 构建的深度神经网络库)。这使得训练神经网络中的计算更容易转移到 GPU,这些被打包为 PyTorch 的一部分,并相对容易地安装在 TensorFlow 中。只要计算可以并行进行,计算时间就会减少几个数量级。

矩阵乘法是线性函数

矩阵乘法是线性函数。许多线性函数层层叠加,仍然是一个线性函数,只是参数不同而已。因此,然而许多层叠在一起的矩阵乘法仍然只是线性函数。

线性函数是仿射函数的子集。仿射函数是值相乘并求和的函数。线性函数总是仿射的。

卷积神经网络(CNN)中使用的卷积是一种特殊的仿射函数,适用于自相关数据,通常是图像,但也适用于其他领域,如蛋白质相互作用、药物设计。这些卷积是逐元素的矩阵乘法,而不是点积乘法。逐元素矩阵乘法也是线性的。

非线性激活函数

激活函数是非线性函数的一种形式。传统上,在神经网络中,sigmoid 函数被用作非线性激活函数。在现代架构中,整流线性单元(ReLU)被用作激活功能或其变体之一。

一个 ReLU 听起来很复杂,它的维基百科页面试图让它变得复杂:https://en . m . Wikipedia . org/wiki/Rectifier _(neural _ networks)——一个 ReLU 说如果值小于零,就把值向上舍入为零。这是最复杂的了。

有一种称为泄漏 ReLU 的变体,它与 ReLU 相同,只是如果值小于零,它会乘以 0.1,而不是向上舍入到零。之所以这么叫,是因为它允许少量的值泄漏到激活中。

激活函数选择有时并不总是那么重要,只是它是非线性的。如果没有非线性激活函数,那么神经网络就不会被认为是深度的,因为它只是一个线性函数。线性函数永远无法执行复杂的任务,例如对电影评论进行分类或在卫星图像中识别地形类型。

这种任务可以用足够大的矩阵乘法来执行,每个矩阵乘法后面都有一个非线性。随着足够多的这些线性和非线性层夹在一起,网络变得非常深,可以产生任何任意形状或函数,可以近似任何东西。

这些计算的结果或输出被称为激活,通过训练网络来学习这些激活的原因,这些训练值是系数/参数,通常被称为权重和偏差。

参数/重量

这些参数的值是随机初始化的,或者从使用迁移学习的预训练模型中复制。

使用反向传播作为梯度计算技术,用随机梯度下降(SGD)或其他更快版本的 SGD 来训练这些参数。SGD 是最小化损失函数的优化。

随机梯度下降、损失函数和反向传播

损失函数评估训练期间预测输出与实际输出的差距。这可以是简单的数学计算,也可以是各种因素的复杂组合,根据正在进行的讨论使用不同的函数,如分类或回归。

损失函数用于评估训练期间的网络性能,损失变化的梯度是反向传播的,并用于更新权重以最小化损失。

每个节点的输出值被计算并缓存在通过网络的正向传递中。然后,通过网络的计算图反向计算损失函数相对于每个参数的误差的偏导数。

根据误差的导数,它显示了损失是增加还是减少,以及如何以什么速率增加(有多陡),然后这被用于少量更新参数以减少损失。学习率乘数用于缩小更新的幅度,以试图确保训练不会在损失空间中采取太大的步骤。这有助于优化权重的更新量。

这个过程就是 SGD。

分类

对于用于分类的训练网络,使用的损失函数是交叉熵。交叉熵基于预测正确的类和预测正确的置信度来提供损失。这是通过以下方式实现的:如果训练示例属于某个类(值为 1),则应用公式;如果训练示例不属于该类(值为 0),则应用不同的公式。

假设预测值在 0 和 1 之间,则:

  • 训练示例实际值为 1,损失计算如下:log(预测值)
  • 训练示例实际值为 0,损失计算如下:log(1 -预测值)

回归

如果网络用于回归,那么训练损失函数通常是零,通常均方误差(MSE)或均方根误差(RMSE)被用作损失函数中的度量。

最后一层激活功能

分类中的最后一个输出层表示类分数,它是任意的实数值,或者是回归类的实值目标。不同的激活功能用于这些任务。

二元分类

二元分类问题是将数据分类为属于某一类或不属于该类,例如“有肿瘤”或“没有肿瘤”。sigmoid 函数通常用作最后一层激活函数,因为它能很好地区分两类。

一个 sigmoid 函数的图形:f(x) = 1 / (1 + e^-x)

Graph for a sigmoid function: f(x) = 1 / (1 + e^-x)

sigmoid 函数渐近于 0,渐近于 1,输出 0 和 1 之间的值。高于或低于 0.5 的值表示数据将被分类到两个类别中的哪一个。

对于 sigmoid 函数的输出形状,当激活小于 0.5 时,sigmoid 函数将返回较低的概率值,如果激活大于 0.5,sigmoid 函数将返回较高的概率值。

这里可以使用下面描述的 Softmax 函数来代替 sigmoid 函数。如果有两个输出,每个输出表示两个类别中的一个。这里最好使用 sigmoid 函数,因为它更快。

多类单标签分类

在多类单标签分类中,数据可以分为许多类,但只能用这些类中的单个标签进行分类。例如,试图对狗的品种进行分类,代表狗的数据只能有一个品种。

Softmax 函数用于多类别单标签分类。给定类别 i 的输出被视为 e^i 除以 e^k 之和,其中 k 是每个类别。

The Softmax function, source: Finn Eggers’s activation function on YouTube.

Softmax 函数非常擅长挑选单个标签。它输出一个概率分布,其中输出总和为 1。每个类的输出范围在 0 到 1 之间。所有类别的概率之和为 1。

预测的类别是具有最高概率输出的类别。

多类、多标签分类

在多类别、多标签分类中,数据可以被分类为许多类别,并且数据可以用这些类别中的一个或多个标签来分类。

例如,卫星图像可以被标记为不同的天气和特征类别,例如云、森林、农业、水、湖泊和河流。一个图像可以很容易地属于许多这样的类。

使用 sigmoid 函数是因为对于给定的数据项可能有多个具有高概率的标签。

Softmax 不能有效地使用,因为概率的总和不等于 1,每个类的概率在 0 和 1 之间。即使是有经验的从业者,这也是一个常见的错误。

回归

根据问题的不同,回归的输出是一个数字或一组数字。如果有一个以上的输出,这被称为多元回归。

执行回归时的输出值通常是无界的。

通常对于回归,没有最后一层激活函数,尽管有时在一些应用中,sigmoid 函数可能是有益的,例如当使用回归进行协作过滤时。

将 Logstash 管道部署到 Kubernetes 的基础

原文:https://towardsdatascience.com/the-basics-of-deploying-logstash-pipelines-to-kubernetes-94a470ad34d9?source=collection_archive---------4-----------------------

Photo by Hin Bong Yeung on Unsplash

你脑子里有一长串你想学的东西的清单吗?

我有,直到我把这个清单写在一张纸上,并决定为此做些什么。在 2018 年底,我开始总结我一直在学习的东西,并决定为 2019 年的学习建立一些结构。

2018 年是有趣的一年,我已经换了 3 次工作,感觉我的学习无处不在。前一天我在学 Scala,第二天我在学 Hadoop。回想起来,我觉得我没有取得多大进展。

我决定在 2019 年做点什么。我在一张纸的一面写下了一年中的 12 个月,并在另一面写下了我想在那个月学习的内容,我的想法是,这一个月的学习将专注于特定的产品/堆栈/语言/事物。

之前被称为 ELK 的 Elastic stack 之所以排在这个列表的首位,有几个原因。

我以前用过 Elastic stack,更确切地说是 ElasticSearch 和 Kibana,但我觉得我可以从这两个产品中学到很多东西。我还想了解 Logstash,看看它能帮助我解决什么问题。

当我开始学习新的东西时,我会设定一些小的、可实现的目标。我写的其中一个目标是在 Kubernetes 中运行一个功能完整、运行正常的 Logstash 管道,从某个地方接收数据,对其执行一些操作,然后将其发送给 ElasticSearch。

我是 Kubernetes 的超级粉丝。在过去的几年里,容器化应用发生了巨大的转变,我完全接受这种转变。我对运行我在当地修建的这条管道没有兴趣,这是库本内特斯或半身像!

我查了一下谷歌,很难找到任何关于部署、最佳实践等方面的具体内容,因此我写了一篇关于如何在 Kubernetes 上运行基本 Filebeat、Logstash 和 ElasticSearch 管道的基本文章。

那么 Filebeat 是什么?它是一个作为代理运行的发送器,将日志数据转发给 ElasticSearch、Logstash 等。

假设您正在运行 Tomcat,Filebeat 将在同一台服务器上运行,读取 Tomcat 生成的日志,并将它们发送到一个目的地,这个目的地通常是 ElasticSearch 或 Logstash。FileBeat 还可以在 Kubernetes 上的 DaemonSet 中运行,将节点日志传送到 ElasticSearch 中,我认为这非常酷。Fluentd 也这样做,但这是另一天。

想了解更多关于 Filebeat 的信息,请点击这里

对,在我们的场景中,我们让 Filebeat 读取某种类型的日志,并将其发送到 Logstash,但 was 是 Logstash 吗?

Logstash 是一个服务器端应用程序,它允许我们构建配置驱动的管道,可以同时从多个来源接收数据,对其进行转换,然后将其发送到您喜欢的目的地。

我们可以编写一个配置文件,其中包含从哪里获取数据、需要对数据执行什么操作(如过滤、grok、格式化)以及数据需要发送到哪里的指令。我们将这种配置与 Logstash 应用程序结合使用,这样我们就有了一个功能完整的管道。Logstash 的美妙之处在于,它可以使用各种资源,包括 RabbitMQ、Redis 和各种数据库,以及其他使用特殊插件的资源。然后我们可以把这些数据藏在 S3、HFDS 和更多地方!这一切都是由一个配置文件和一堆插件驱动的…很神奇吧!

想了解更多关于 Logstash 的信息,请点击这里

让我们开始一些代码和令人兴奋的东西!

我在弹性网站上跟随 Logstash 教程,发现了我的管道的完美候选……做了一些小的修改。

我按照教程一步一步地操作,FileBeat 正在运行,它正在读取教程中提到的日志文件,一切都很好。我必须配置 FileBeat 配置文件filebeat.yml 以指向我所展示的 Kubernetes 节点端口,这将在稍后介绍,我还将提供的 FileBeat 日志移动到 Filebeat 应用程序文件夹中。

filebeat.inputs:- type: logenabled: truepaths:- logstash-tutorial.logoutput.logstash:hosts: ["localhost:30102"]

现在只需 Logstash 和 Kubernetes 进行配置。让我们看一下管道配置。

每一个配置文件被分成 3 个部分,输入过滤输出。它们是大多数 ETL 过程的 3 个阶段。

我们首先指定我们的数据来自哪里,在我们的例子中,我们使用 beats 插件并指定接收 Beats 的端口。

那么这个 Beats 插件是什么?它使 Logstash 能够从 Elastic Beats 框架中的应用程序接收事件。当我们运行 FileBeat 时,它在那个框架中,FileBeat 读取的日志行可以被我们的 Logstash 管道接收和读取。

接下来,我们指定过滤器。过滤器部分是可选的,如果你不想的话,你不必应用任何过滤器插件。如果是这种情况,数据将被发送到 Logstash,然后发送到目的地,没有格式化,过滤等。在我们的例子中,我们使用的是 Grok 插件。Grok 插件是比较酷的插件之一。它使您能够将非结构化的日志数据解析成结构化和可查询的数据。

Grok 在它接收的数据中寻找模式,所以我们必须配置它来识别我们感兴趣的模式。Grok 带有一些内置模式。在这种情况下,我们使用的模式是%{COMBINEDAPACHELOG},当 Logstash 从 Apache HTTP 接收日志数据时,可以使用这个模式。

最后,我们指定我们的输出。这是我们的数据过滤后的最终位置。如果您的数据需要发送到多个地方,您可以指定多个输出。在这个例子中,数据被输出到 ElasticSearch,但也打印到控制台,只是为了安全起见。在 ElasticSearch 块中,我们指定 ElasticSearch 集群 URL 和索引名称,索引名称是由元数据组成的模式组成的字符串。

现在,我们已经完成了管道的配置,我们可以转到 Kubernetes 了。

我们首先要做的是创建一个配置图。ConfigMap 允许我们存储可由 pod 访问的配置数据的键值对。因此,我们可以有一个配置映射,它可以存储一个目录,其中包含所有配置文件,也可以存储单个配置文件。

首先,我们创建一个配置图。我们将其命名为 apache-log-pipeline ,并引用前面的管道配置文件。

> kubectl create configmap apache-log-pipeline --from-file apache-log-es.conf

我们可以通过用 describe 运行 kubectl 来检查我们已经创建的 ConfigMap。

> kubectl describe cm/apache-log-pipeline

如果命令已经正确运行,您应该会看到apache-log-pipeline的键和之前配置文件的值。如果是这样的话,你做得很好!

Name:         apache-log-pipeline
Namespace:    default
Labels:       <none>
Annotations:  <none>Data
====
apache-log-es.conf:
----
input {
    beats {
        port => "5044"
    }
}
filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
}
output {
    elasticsearch {
        hosts => ["[http://elasticsearch:9200](http://elasticsearch:9200)"]
        index => "%{[[@metadata](http://twitter.com/metadata)][beat]}-%{[[@metadata](http://twitter.com/metadata)][version]}-%{+YYYY.MM.dd}"
    }
    stdout {
        codec => rubydebug
      }
}Events:  <none>

现在我们有了 ConfigMap,我们需要为我们的 Logstash 服务组装一个部署,并将apache-log-pipeline引用为一个挂载的卷。

让我们看一下部署的一些部分。我们为容器指定了两个端口,5044 和 9600。端口号 5044 用于从 Elastic beats 框架接收 Beats,在我们的例子中是,端口号 9600 允许我们检索关于 Logstash 的运行时指标。更多关于那个的信息在这里

我们还指定我们想要挂载config卷,以及我们想要将它挂载到哪个路径/usr/share/logstash/pipeline。我们将卷挂载到这个特定的目录中,因为默认情况下,Logstash 从这个目录中读取配置。这允许我们只运行命令logstash,而不是指定配置文件所在位置的标志。

然后,我们有我们的卷,称为apache-log-pipeline-config,它是一种类型的configMap。有关卷的更多信息,请查看这里的。我们指定希望使用的配置图,apache-log-pipeline是我们之前创建的配置图。因为我们的 ConfigMap 是由键值对组成的,所以我们添加了包含我们的管道配置的键,apache-log-es.conf

然后我们继续服务。这里唯一真正的讨论点是我们正在使用一个NodePort。这有两个原因,FileBeat 需要与运行在 Kubernetes 中的 Logstash 对话,因此我们需要一个端口来完成这项工作,我已经将它指定为30102,因为filebeat.yml需要配置这个端口号,以便将 beats 发送到 Logstash。第二个原因,我想检查使用端口9600的 Logstash 监控 API,如前所述。

因此,随着我们的部署和服务准备就绪,我们可以部署它。

> kubectl create -f apache-log-pipeline.yaml

如果 Pod 创建正确,您应该能够获得 Pod 并看到它运行。

> kubectl get pods================================================NAME                                   READY   STATUS    RESTARTS   AGE
apache-log-pipeline-5cbbc5b879-kbkmb   1/1     Running   0          56s
================================================

Pod 已正确创建,但它实际上已经启动并运行了吗?最快的方法是通过跟踪吊舱的日志。

> k logs -f pod/apache-log-pipeline-5cbbc5b879-kbkmb

如果管道运行正常,您应该看到的最后一行日志显示 Logstash API 已经成功创建。

[2019-01-20T11:12:03,409][INFO ][logstash.agent] Successfully started Logstash API endpoint {:port=>9600}

当我最初构建这个管道时,我遇到了两个错误。第一种情况是,由于格式原因,配置文件的格式不可读,在跟踪 Pod 日志时,错误被打印出来并可见。第二种情况是当 ConfigMap 没有正确安装时,管道将运行、停止然后重新启动,这再次被打印出来,并通过跟踪日志可见。

因此,我们在 Kubernetes 有一个功能齐全的 Logstash 管道。

但它实际上什么也没做。我们现在需要做的是运行 Filebeat。为了确保正确运行,我打开了两个终端窗口,一个跟踪 Pod 的日志,另一个跟踪我将要运行的 FileBeat 命令。

sudo ./filebeat -e -c filebeat.yml -d "publish" -strict.perms=false

当运行该命令时,Filebeat 将开始运行并读取在filebeat.yml配置文件中指定的日志文件。本文开头提到的教程中讨论了其他标志。

在管道配置文件中,我们包含了stdout插件,因此接收到的消息被打印到控制台。记住这一点,我们应该在终端窗口中看到输出的消息,跟踪 Pods 日志,并且您应该在运行 Filebeat 命令的窗口中看到类似的内容。

{
     "[@timestamp](http://twitter.com/timestamp)" => 2019-01-20T11:35:36.042Z,
        "request" => "/style2.css",
     "prospector" => {
        "type" => "log"
    },
       "response" => "200",
    "httpversion" => "1.1",
         "offset" => 18005,
          "bytes" => "4877",
           "tags" => [
        [0] "beats_input_codec_plain_applied"
    ],
      "timestamp" => "04/Jan/2015:05:24:57 +0000",
       "clientip" => "81.220.24.207",
       "referrer" => "\"[http://www.semicomplete.com/blog/geekery/ssl-latency.html\](http://www.semicomplete.com/blog/geekery/ssl-latency.html\)"",
        "message" => "81.220.24.207 - - [04/Jan/2015:05:24:57 +0000] \"GET /style2.css HTTP/1.1\" 200 4877 \"[http://www.semicomplete.com/blog/geekery/ssl-latency.html\](http://www.semicomplete.com/blog/geekery/ssl-latency.html\)" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.73.11 (KHTML, like Gecko) Version/7.0.1 Safari/537.73.11\"",
          "ident" => "-",
          "agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.73.11 (KHTML, like Gecko) Version/7.0.1 Safari/537.73.11\"",
           "beat" => {
         "version" => "6.5.4",
            "name" => "local",
        "hostname" => "local"
    },
           "auth" => "-",
       "[@version](http://twitter.com/version)" => "1",
           "host" => {
        "name" => "local"
    },
           "verb" => "GET",
          "input" => {
        "type" => "log"
    },
         "source" => "/filebeat-6.5.4-darwin-x86_64/logstash-tutorial.log"
}

如果我们看到了控制台中打印的消息,我们几乎可以保证消息已经被发送到 ElasticSearch 中。有两种方法可以检查这一点,用一些参数调用 ElasticSearch API 或者使用 Kibana。

我是基巴纳的超级粉丝,所以这是我们要走的路线。

启动基巴纳,前往探索区

在我们的管道配置中,更具体地说是 ElasticSearch 输出,我们指定要创建的索引是一个由元数据组成的模式,其中包括 Filebeat 版本和日期。我们使用这个索引模式从 ElasticSearch 中检索数据。

在这个例子中,我定义的索引名为filebeat-6 . 5 . 4–2019 . 01 . 20,因为这是由 Logstash 创建的索引。

接下来,我们配置时间过滤器字段。当我们希望按时间过滤数据时,会用到该字段。有些日志会有多个时间字段,所以我们必须指定它。

一旦执行了这些步骤,我们应该能够查看日志。如果我们回到 Discover 部分,一旦我们定义了索引,日志应该是可见的。

如果可以看到日志,就拍拍自己的背吧!做得好,很努力!如果你想的话,可以轻拍一下庆祝一下:)

所以在我结束之前,我想说一些很酷的与基巴纳相关的事情。

我们可以从 Kibana 的监控部分监控我们的 Logstash 管道。我们可以深入了解事件发生率,例如发出和收到的事件。我们还可以获得节点信息,比如 CPU 利用率和 JVM 指标。

最后但同样重要的是 Kibana 的日志部分。我想这是我目前最喜欢的基巴纳区。它允许您近乎实时地查看流日志,并回顾历史日志。

要查看运行中的日志部分,进入 Filebeat 目录并运行sudo rm data/registry,这将为我们的日志重置注册表。一旦完成了这些,我们可以再次开始 Filebeat up。

sudo ./filebeat -e -c filebeat.yml -d "publish" -strict.perms=false

如果你把运行 Filebeat 的终端放在装有 Kibana 的浏览器旁边,你会看到日志以近乎实时的方式流动,很酷吧?

如题,这是一篇基础文章。它指导你如何快速启动和工作,因此一定会有改进/改变,在所有方面都做得更好。

非常感谢一如既往地阅读我的文章,真的很感激。任何想法、评论或问题都可以给我发推特。

干杯👍🏻

https://twitter.com/danieljameskay

EDA 基础(带糖果)

原文:https://towardsdatascience.com/the-basics-of-eda-with-candy-83b2e8ad9e63?source=collection_archive---------6-----------------------

image: Adobe Stock/biotin

探索性数据分析——什么是探索性数据分析,我该如何做?

目标是将数据转化为信息,将信息转化为洞察力

  • 卡莉·菲奥莉娜,惠普公司前首席执行官

作为一名数据科学家,据说我们会把 80%左右的时间花在 EDA 上。因此,尽管看起来很乏味,但在开始有趣的事情之前掌握这个过程是个好主意。该过程包括清理、分类和检查特征相关性,以剔除噪声,并有希望获得一些关于哪些片段最有用的见解。

这个例子的数据集是来自科学创意季刊网站的 2017 年糖果等级。如果你想跟进,你可以在这里找到并下载 csv 。我在 Jupyter 笔记本里用的是 Python 3.7。

我在这里分享的一些步骤是个人喜好,你可以随意修改,但是,这些前几个步骤总是非常重要的。

导入:

  • pandas——数据分析库,几乎所有数据操作都需要它
  • numpy——对于线性代数函数来说,即使您并不期望需要它,也应该拥有它。
  • Matplotlib —用于绘图和图形的可视化库
  • Seaborn —实现更加可定制的数据可视化

读入您的数据:

使用 pandas pd.read_csv 函数,以字符串形式输入您的数据源,并将其保存为变量,该变量将成为您的数据帧的名称。很多人用 df ,我喜欢用一些更具描述性的东西,所以这次我会用 candy

接下来,您需要检查数据的前几行,以获得您将处理的数据的峰值。

candy.head( ) 是一个返回前 5 行数据的方法。如果你想要更多或更少,只需输入括号中的数字。例如,头(10)。

candy.shape 是一个属性,告诉你数据帧中的行数和列数。从上面可以看到, candy 有 2460 行 120 列。

在检查了数据字典后,我发现每一行都是被调查的个人。数据字典提供了关于数据集中提供什么信息的更多细节。如果可能的话,复习一下总是个好主意。

检查缺失值:

candy.isnull( ) 。这种方法有很多种。添加。sum() 到最后会给出每列的总 NaNs 和。mean( ) 将告诉您每一列中缺失值的百分比。我喜欢补充。sort _ values(ascending = False)此外,按照从缺失最多到最少的顺序显示列。

此时,您需要检查数据字典,确定丢失的数据是否意味着什么?还是只是未知?决定是否可以用删除丢失的单元格。dropna( ) 或者是否应该用来代替它们。菲尔娜()

下降列:

对于这个例子,我们可以看到['Unnamed: 113']和['Click Coordinates (x,y)']列没有信息,也没有用,所以我们可以使用。drop(columns =[' insert column names '],inplace=True )。在此之前,我使用了。value_counts(dropna=False) 查看包括 nan 在内的那些列中包含的值,并确认其中没有重要的内容。

数据字典没有说明调查者可以跳过任何让他们不舒服的问题,所以我们可以假设一些缺失的数据就是因为这个原因。大多数问题都是要求糖果评级,从快乐到中性到绝望。如果你从来没有吃过糖果,就没有盒子可以选择。因此,我们可以做出的另一个假设是,这些列中的 nan 属于这一类。在这种情况下,它们可以用“未知”或您选择的字符串来填充。这真的没关系,因为为了让评级对衡量或预测某件事更有用,我们最终需要将它们转换成数字。

检查数据类型:

在填 NaNs 之前,我通常使用。属性来查看每一列的数据类型,并寻找任何奇怪的东西。

正如所料,大多数列都是对象类型,这意味着字符串。

Q3 是年龄,应为整数。

Q12 是唯一的浮点类型。它有四个答案,并被自动分成虚拟列,其中 1.0 是“是”,NaN 是“否”。因此我们知道可以用 0.0 填充这些答案。

填写 NaNs:

一旦我弄清楚了所有的类型,我喜欢创建一个 for 循环,它将同时处理我所有丢失的值。我用 0 填充任何整数或浮点数列,用字符串' unknown '填充任何对象列。然后检查是否还有空值。

重命名列:

接下来,我想将列名修改为小写,并且不包含特殊字符。这通常使它们更容易阅读和理解。可以使用。columns 属性来检查列的当前名称。然后我用进行列表理解。lower( ).str.replace( ) 进行我想要的修改。这些名字需要更多的工作,但这只是让你知道如何开始。

如果有更少的列,并且您想完全重写名称,您可以使用 dictionary 方法。

最后,我开始使用。value_counts( ) 来更深入地挖掘和探索它们的用处。在这一部分,我可能会将评级改为数值,并将性别和外出等特征二进制化,如果这些特征对我的问题陈述似乎很重要的话。

在上面的剪辑中,我创建了一个地图,其中所有欢乐的细胞将变为 3,所有 MEH 细胞将变为 2,绝望变为 1。然后我用了。对 lambda 函数执行 applymap( ) 操作,该函数基本上循环遍历数据帧的单元格,如果它找到了映射中列出的值,它将使用指定的替换值替换它,否则如果它不在映射中,它将保持不变。

如果我只想看看 Q6,关于人们的糖果评级,可以设置这些行等于一个新的变量,如 candy_only

candy.describe( ) 将向我们显示描述性统计数据,如平均值、标准差和最小/最大值。

由于我们没有目标变量,也就是我们试图预测的东西,我将使用这些数据来计算出最受欢迎的 10 种糖果。

首先,我用找到了每一列的平均值。mean( ) ,然后我把值从大到小排序,只显示前 10 名。最后我用。plot(kind= "bar") 绘制条形图。此外,任何排在第一位的全尺寸糖果,人们最喜欢 Kit Kats,Reeses 和 cash!

photo: amazon

博弈论的基础

原文:https://towardsdatascience.com/the-basics-of-game-theory-db1964520cbe?source=collection_archive---------9-----------------------

常用术语和视觉布局介绍

Originally Published On https://www.setzeus.com/

现代博弈论诺依曼&纳什建立的应用数学分支,是研究智能、理性、决策者之间冲突&合作的数学模型。一个广泛应用于从经济学、政治学到计算机科学的工业&领域的工具——博弈论的基础对普通高中生来说惊人地成立。这些概念并不 太过 高级,但是潜在的知识绝对会有回报。理解博弈论的基本原理对于任何处于群体决策地位的人(提示:每个人)来说都是值得努力的。

上一次我们讨论了早期的现代化,这一次我们将回顾常用的术语,游戏图解的基础。

常用术语

大多数数学分支,尤其是应用数学分支,都需要它们的词汇——博弈论在这里也不例外。要理解示例,熟悉适当的语言至关重要。下面我们会找到基本词汇;这些术语不是按照字母顺序排列的,而是按照与整个主题的相关性递减的主观顺序排列的:

游戏— 两个或更多玩家之间的任何互动,其中每个玩家的收益都受到他们的决策&其他人做出的决策的影响。

玩家— 游戏中相互依赖的主体,可能包括个人、政府、公司等

动作— 玩家必须选择的严格定义的行为,玩家能做什么?输入投标?结束罢工?赌掷硬币?

回报 在一个价值体系中,映射到玩家行为的“价值”的具体、精确、增加或减少。

价值体系— 抽象&上下文相关,这是所有可能值的范围;从坐牢,到市场份额,到土地占用,什么都有。

零和——一个玩家的收益等于另一个玩家的损失的情况;整个游戏的财富或收益的净变化为零。

非零和— 基于博弈的结果,系统存在净 收益或损失 的情况;所有玩家的赢款&损失加起来不为零。

同时——玩家做决定&采取行动几乎同时;他们在做选择的时候不知道其他玩家的选择,比如石头剪子布。

顺序— 玩家做决定时&轮流采取行动,如大富翁或国际象棋。

非合作 —更常见的游戏类型,这是一种个体玩家之间严格竞争的游戏。

纳什均衡— 博弈的最优结果,其中没有玩家有动机偏离所选策略;假设其他参与者的策略保持不变,改变行动不会带来增量收益。

优势策略 — 不管其他玩家做什么,在所有策略中最有利的策略。

合作 —一种玩家可以结成联盟的游戏&合作应对外部可信威胁。

Shapely Value — 玩家的价值在所有可能的联盟中的平均边际贡献;用于合作/联盟游戏,它是每个玩家的平均预期边际贡献。

完整信息— 一种游戏,其中所有参与者都可以获得关于其他玩家的知识;玩家的收益函数、策略&“类型”是常识。

不完全信息— 一个游戏,玩家可能知道也可能不知道游戏类型、玩家行动、玩家类型、策略、收益的信息..

不完全信息— 玩家不知道其他玩家选择的动作的游戏;然而,其他的一切,玩家类型,策略,收益等等…都是常识。

菲尼托。上面的术语列表涵盖了我们可能会遇到的任何博弈论问题的基本要点。正如你将在下面学到的,除了这些文字描述,分析一款游戏的最好方法是通过可视化地描绘出来。

视觉布局

在博弈论中有两种主要的可视化游戏的方法:矩阵&树。总的来说,这两种模型都是合适的&应该会产生一些洞察力;然而,哪种模型最适合任何给定的场景取决于游戏类型及其规则(同时与连续,完全与不完全,等等)。

矩阵

博弈论最基本的工具是收益矩阵。通常,矩阵被用来描述双人同时进行的游戏。在下面的模板中可以看到,两个玩家的选择在我们矩阵的外部边界上相互垂直排列——一个横跨顶部(从左到右),&一个横跨左侧(从上到下)。里面是假设每个玩家采取了那个行动的预期收益。例如,对于一些非常简单的游戏,让我们假设有两个玩家(Alice & Bob)存在,每个玩家只能选择两个动作中的一个(因此总共有四个场景)。矩阵中的每个“场景”或方框包含两个数字,即特定场景的收益:

Originally Published On https://www.setzeus.com/

上面的例子是没有上下文的,但是仍然服务于演示博弈论矩阵的基本布局的目的。从粗体的外部标题可以明显看出,这个游戏是在爱丽丝和鲍勃之间进行的;此外,很明显他们每个人只有两个选择:“行动 1”或“行动 2”最后,矩阵中的有序对表示给定特定场景下两个玩家的收益(Alice 的收益是左/x 数字,Bob 的收益是右/Y 数字)。

让我们考虑一个更相关的游戏:石头剪刀布。一款全球知名的普通游戏,严格来说是一款双人同时非合作游戏。众所周知,玩家只有三种策略中的一种。此外,我们还从这三种策略中了解了收益&价值体系。我们可以用一个 3x3 的矩阵对这个游戏进行数学映射:

Originally Published On https://www.setzeus.com/

上面的例子应该更直观。沿着一行(Alice 的选择)和一列(Bob 的选择)走下去,两个人的收益就很清楚了。不过请注意,通过用矩阵表示游戏,我们只能表示玩家同时行动的情况——没有时间的概念。

博弈树是一个带有节点&边的有向图。节点代表玩家的位置或从游戏中退出/收益。通常情况下,玩家被分配到决策节点;一组决策节点,当在同一水平 x 轴上时,代表单个玩家在单个时间点的阵列选择 。另一方面, 边代表移动或动作, 由玩家/节点采取 。一个游戏的完整游戏树是从初始位置&开始的游戏树,包含从每个位置 所有 可能的移动。

有了树,我们基本上给表增加了一个时间维度,允许随时间的顺序游戏的最佳表示。游戏树的拓扑在两种可能的设置中有所不同,这取决于游戏是同时进行的还是顺序进行的。为了从有意义的比较中获得洞察力,我们将通过继续我们先前的石头剪子布的例子来回顾树:

Originally Published On https://www.setzeus.com/

请注意,Alice 是随机选择的顶部节点/原点,但是,如果我们简单地交换她和 Bob 的位置,整个图将保持不变。和上面的矩阵例子一样,这个图提供了相同的收益选项。

对于每一棵博弈树,只有一种方法用矩阵来表示;但是对于每个矩阵,有多种方法可以用博弈树来表示。考虑到时间因素,除非一个游戏真的很简单,博弈树通常是分析的首选工具。

结论

我们走吧!随着通用语言和视觉映射现在在我们的腰带之下,除了它的历史,我们自学的游戏理论知识正在稳步增长。我们已经发展了对游戏的看法,这很令人兴奋,因为它让我们能够以完全不同的视角看待日常场景。

虽然这一次我们专注于构建我们的游戏,但下一次,我们将最终进入实质——学习博弈论的真正回报:分析&得出优势策略。

最初发表于:

https://www.setzeus.com/

Python 列表索引和切片的基础

原文:https://towardsdatascience.com/the-basics-of-indexing-and-slicing-python-lists-2d12c90a94cf?source=collection_archive---------2-----------------------

初学者指南,由初学者编写

Photo by Igor Miske on Unsplash

几天前,我正准备向一群 Python 初学者演示索引和切片列表,我被一些看起来很基本的用例卡住了。所以,为了摆脱困境,我四处逛了逛,觉得值得分享一下我学到的东西。

访问列表中的条目(以及其他可条目中的条目,如元组和字符串)是 Python 程序员的一项基本技能,许多 Python 工具都遵循类似的索引和切片约定(例如numpy Arrayspandas DataFrames)。所以熟悉一下来龙去脉还是值得的。

定义和舞台设置

“索引”是指通过元素在可迭代对象中的位置来引用可迭代对象的元素。“切片”意味着根据索引从 iterable 中获取元素的子集。

打个比方,我最近被召集去做陪审员,他们给每个潜在的陪审员分配了一个号码。你可能会说我的陪审员号是我的索引。当他们说,“42 号陪审员;请站起来,”我知道他们在和我说话。当他们说,“37 号到 48 号陪审员,请在下午 3:30 回来报到,”那一大群人中的集体叹了口气,去吃午饭了。

让我们首先创建一个列表,我们可以使用列表理解来处理它:

my_list = [_ for _ in 'abcdefghi']
my_list['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

索引

为了检索列表中的元素,我们使用了索引操作符 ( []):

my_list[0]'a'

列表是“零索引”的,所以[0]返回列表中的第零个(最左边的),而[1]返回第一个(第零个右边的一个)。由于我们的列表中有 9 个元素([0][8]),尝试访问my_list[9]会抛出一个IndexError: list index out of range,因为它实际上是在尝试获取第 10 个元素,而实际上并没有。

Python 还允许使用负数从列表的结尾开始索引,其中[-1]返回最后一个元素。这非常有用,因为这意味着您不必通过编程来找出 iterable 的长度,以便处理它末尾的元素。my_list的索引和反向索引如下:

 0    1    2    3    4    5    6    7    8
  ↓    ↓    ↓    ↓    ↓    ↓    ↓    ↓    ↓
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
  ↑    ↑    ↑    ↑    ↑    ↑    ↑    ↑    ↑
 -9   -8   -7   -6   -5   -4   -3   -2   -1

限幅

一个是列表元素的子集。在列表的情况下,单个切片总是由连续的元素组成。切片符号采用以下形式

my_list[*start*:*stop*]

其中*start*是要包含的第一个元素的索引,*stop*是要在处停止但不包含在切片中的项目的索引。于是my_list[1:5]返回['b', 'c', 'd', 'e']:

 0    ***1    2    3    4    5***    6    7    8
  ×    **↓    ↓    ↓    ↓ **   ×    ×    ×    ×
['a', ***'b', 'c', 'd', 'e'*,** 'f', 'g', 'h', 'i']

将任一切片边界留空意味着从列表的末尾开始(或转到列表的末尾)。例如:

my_list[5:]['f', 'g', 'h', 'i'] my_list[:4]['a', 'b', 'c', 'd']

使用负索引器将设置相对于它们从列表的的位置的开始/停止界限,因此my_list[-5:-2]返回['e', 'f', 'g']:

['a', 'b', 'c', 'd', ***'e', 'f', 'g',*** 'h', 'i']
  ×    ×    ×    ×    **↑    ↑    ↑**    ×    ×
 -9   -8   -7   -6   ***-5   -4   -3   -2***   -1

注意,如果你尝试my_list[-2:-5],你会得到一个空列表。这是我犯的一个错误,但是事情是这样的:为了包含在切片中,一个元素必须在*start*边界的右边和*stop*边界的左边。因为-2已经在-5右侧,所以切片器在将任何值填充到切片中之前停止。

一个for循环的工作方式完全相同;下面的第一个循环没有输出,但第二个有输出:

for i in range(-2,-5):
    print(i)for i in range(-5,-2):
    print(i)-5
-4
-3

步进

切片器可以接受可选的第三个参数,该参数设置切片中包含元素的间隔。所以my_list[::2]返回['a', 'c', 'e', 'g', 'i']:

 ***0    1    2    3    4    5    6    7    8***  **↓**    ×¹ **↓**²×¹ **↓**²   ×¹ **↓**²   ×¹ **↓**²
[***'a',*** 'b', ***'c',*** 'd', ***'e',*** 'f', ***'g',*** 'h', ***'i'***]

并且my_list[1::2]返回['b', 'd', 'f', 'h']:

 0 ***1    2    3    4    5    6    7    8***  ×    **↓** ×¹ **↓**²×¹ **↓**²   ×¹ **↓**²   ×¹
['a', ***'b'***, 'c', ***'d'***, 'e', ***'f'***, 'g', ***'h'***, 'i']

负步长值反转切片器遍历原始列表的方向:

my_list[::-1]['i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a']

列表元素的索引位置不会改变,但是元素返回的顺序会改变。*start**stop*边界的意义也是相反的,所以*start*值应该在切片的最右边,而*stop*值应该在它的左边。所以my_list[5:3:-1]给了我们[‘f’, ‘e’]:

<----<----<----<----<----<----<----<----<--
  0    1    2    ***3    4    5***    6    7    8
  ×    ×    ×    × **↓    ↓**   ×    ×    ×
['a', 'b', 'c', 'd', ***'e', 'f'***, 'g', 'h', 'i']

同样,my_list[-2:-5:-1]给了我们['h', 'g', 'f']:

['a', 'b', 'c', 'd', 'e', ***'f', 'g', 'h',*** 'i']
  ×    ×    ×    ×    ×    **↑**    **↑**   ** ↑ **   ↑
 -9   -8   -7   -6   ***-5   -4   -3   -2***   -1
<----<----<----<----<----<----<----<----<--

my_list[-1:-8:-3]给了我们['i', 'f', 'c']:

['a', 'b', ***'c',*** 'd', 'e', ***'f',*** 'g', 'h', ***'i'***]
  ×    ×¹   **↑**³   ײ   ×¹   **↑**³   ײ  ×¹   ↑
 -9   ***-8   -7   -6   -5   -4   -3   -2   -1***
<----<----<----<----<----<----<----<----<--

我希望这能为您省去一些我在索引和切片工作中遇到的困惑,尤其是对于负步骤。

基础知识:支持向量机

原文:https://towardsdatascience.com/the-basics-support-vector-machines-219585f1a107?source=collection_archive---------27-----------------------

从头开始的数据科学

将线性方法应用于非线性边界

支持向量机是一种用于分类的机器学习模型,自 20 世纪 90 年代广泛引入以来,已被证明非常受欢迎。有些令人困惑的是,“支持向量机”和“支持向量分类器”这两个名称经常互换使用,指的是一些不同实现的算法,但在本质上,这些方法都在做同一种事情,即找到根据类别将数据分成离散区域的方法。事实证明它们非常强大。支持向量机模型的技术实现可能相当复杂,但是一些直觉应该是清楚的,不要在技术细节上陷入太多。

最简单的版本:最大间隔分类器

考虑一个二维的简单分类问题:

A simple classification question with two classes

我们可以直观地看到,橙色和蓝色这两个类别似乎占据了图形中不同的区域,橙色在左下方,蓝色在右上方。明智的首要任务是使我们对橙色和蓝色阶级各自的“区域”的理解正式化。一旦我们在它们之间有了一个清晰的边界,我们就可以根据一个新点的位置来快速预测它将属于哪一类。让我们从最简单的边界开始,一条直线。同样,从视觉上看,我们可以用两个类之间的一条线来分割图形,但是我们应该选择哪条线呢?考虑两种可能的选择:

Two possible boundary lines

上面的红线和黑线都将两个点群分开,但它们代表不同的决策边界。如果每条线代表不同的模型,则位于线之间的一些点将根据所使用的模型进行不同的分类。

The green point will be classified differently by each of the models represented here

我们应该使用哪个决策边界?一种策略可能是寻找尽可能远离训练数据点的决策边界。这里的概念是,如果决策边界线非常接近训练点,则新的边际案例更有可能越过决策边界,并在错误的一侧结束。所以我们要寻找一条线,给训练点尽可能宽的泊位。一种测量方法是查看“最小余量”,即直线和所有训练点中最近的点之间的距离。这是我们的数据,其中一条线和最近的点/边缘突出显示:

One possible line and its margin

线条周围突出显示部分的宽度代表我们的最小边距。理想情况下,我们希望这条线尽可能的粗,以找到一条给我们的点簇最大可能的泊位的线。有一个清晰的代数任务(找到具有最大可能最小边距的线)和一个我们可以遵循的漂亮的视觉解释。例如,这是新的一行:

Another option

这一次似乎给了我们更大的利润空间。我们可以同时绘制它们,以便更清楚地看到这一点:

Both lines together

这些例子是二维的,以使它们易于可视化,但同样的策略可以在任何数量的维度上使用。例如,如果有三个维度,你会寻找一个平面来分隔空间,在点和平面之间有尽可能多的空间。在更多的维度中,你会寻找一个分离的“超平面”,我们可能无法想象,但概念上不会更复杂。

显而易见,尽管在某些情况下可能是有用的,但这种性质的“最大最小间隔”分类器具有严重的缺点。首先,如果我们的集群没有像这个可能有点做作的例子中那样清晰地分开,会怎么样呢?在现实世界中,数据通常是嘈杂的,即使聚类看起来很明显,它们也可能在边缘重叠。我们如何处理像这样的数据:

Slightly overlapping clusters

下一步:支持向量分类器

允许我们继续使用易于描述的线性决策边界的一个简单修复方法是,使边界有点模糊,引入一种算法,允许一些点在确定的边界内,甚至在分界线的另一侧。因为在这种实现中,边缘不再严格,所以支持向量分类器有时被称为“软边缘”分类器。允许模型对训练数据中的点进行错误分类的程度由调整参数控制。回到我们的第一个例子,将这个调整参数的各种级别应用到一个软边界分类器说明了正在发生的事情。当不考虑错误分类点时,得到的模型看起来与我们的最大最小利润模型非常相似:

The first example with a SVC

决策边界毕竟还是一条线。本例中的关键区别在于,模型识别了三个最近点,而不是一个。这三个点是定义边缘和边界的“支持向量”。它们被称为“support ”,因为改变其中一个必然会改变模型找到的边距和边界。如果您让模型对落在边界内的点更加宽容,那么它所识别的边界将会增长,并且必然会包含更多的支持向量:

A soft margin classifier with an even softer margin

这种软边际模型允许我们处理不干净和有一点重叠的数据簇。例如,在我们之前的稍微重叠的示例中,这是两个组之间的合理线性边界:

Slightly overlapping datasets handled!

这极大地扩展了我们的边缘分类器的效用,尽管仍有失败的例子。特别是,一些决策边界可能不是线性的,我们的模型是否会对这些边界做出合理的反应还不清楚。例如,考虑以下几点:

Uh oh, non-linear bondaries

您可能很快就能看出这个示例中发生了什么,但是我们的软边界分类器很混乱,因为边界不是线性的,并且会产生一些无用的东西,如果不是完全无意义的话:

This soft margin classifier is useless!

不知何故,我们需要发挥非线性边界的作用。

解决方案:支持向量机

支持向量机通过引入“核函数”将我们到目前为止一直在处理的软间隔分类器向前推进了一步。在这种情况下,核函数将某组输入变量映射到更高维度的空间。有时你可能会看到这种被称为“核技巧”的函数的使用——技巧是有时不能被线性边界分开的点可以通过核函数映射到更高维度,其中变换的点可以被线性边界分开!

例如,不是简单地考虑 x-y 平面上的点,我们可以将它们映射到三维空间中,添加一个 z 轴,并将任何给定点的 z 坐标定义为 x 的平方加上 y 的平方。你可能会注意到这种变换与圆的代数公式之间的相似之处——事实上,这种变换可以让我们轻松地将距离原点较近或聚集在原点周围的点与距离较远的点分开,一旦这些点从二维空间映射到三维空间,就会有一个单一的线性平面穿过这些点。在实践中,支持向量机做的事情稍微复杂一点,因为它对特征向量的所有组合(即所有点)执行这种转换,但概念是相同的。

有几种常见的内核可以应用。例如,径向基函数 内核采用刚才描述的类似方法,处理特征向量之间的平方欧几里德距离。使用此内核,我们可以创建决策边界,将彼此靠近的点组合在一起,即使一个类的点聚集在另一个类的点内,如我们前面的示例所示:

The rbf kernel saves the day

多项式内核将输入向量及其组合的特征进行比较,以达到给定的程度,允许我们创建决策边界,更好地拥抱点簇之间的曲线。考虑我们的第一个完全线性的软边界解决方案,解决点簇重叠的情况:

A boring, straight decision boundary

对于这个解决方案,使用 3 次多项式核的支持向量机:

An attractive, curved boundary

使用这些核技巧,支持向量机模型可以非常有效地分类复杂的非线性边界。

贝叶斯大脑假说

原文:https://towardsdatascience.com/the-bayesian-brain-hypothesis-35b98847d331?source=collection_archive---------4-----------------------

我们的大脑是如何进化来预见未来的

如果你能看透时间的种子,并说出哪些谷粒会生长,哪些不会…
麦克白,威廉·莎士比亚

人生充满了不确定性,谁也说不清未来。根据布莱士·帕斯卡的说法,我们在一个巨大的球体中航行,永远在不确定性中漂流,被从一端驱动到另一端。没有人知道死亡什么时候会来,什么时候生活会给我们带来苦难,什么时候生活会给我们回报。

虽然我们都必须在生命中的某个时刻学习这一沉闷的课程,但我们仍然令人钦佩地成功地在一个充满不确定性的宇宙中获胜。我们盖房子,我们把钱存入银行账户,我们为退休基金和我们的孙辈存钱。我们塑造稳定的关系,建造不朽的丰碑。我们对正在发生的事情有一种控制感,这是我们应得的。

对于像我们这样的人来说,这是非常了不起的,我们是从进化的随机和混乱的幻想中诞生的。我们是如何从不确定性定义的未来中发展出一种确定感的能力的?

贝叶斯大脑假说 认为我们的行为背后有一个深藏的结构,其根源可以追溯到生命的本质。它指出,在某种程度上,大脑除了预测未来和实现这种期望的未来之外,几乎没有什么别的作用,大脑与生命系统的法则一致,总是与大自然为它们准备的惊喜进行艰苦的斗争。

Photo by Ramón Salinero on Unsplash

体内平衡的必要性

体内平衡是所有生命背后的根本原则。它源自拉丁语 homeo (相等)和 stasis (静止不动),由沃尔特·布雷德福·坎农于 1926 年创造。体内平衡象征着维持生命系统内的物理和化学过程,使生命系统保持完整,并阻止它们消失(我在关于生命起源的文章中对此做了更详细的介绍)。这是自我组织的原则,可以抵御自然的无序趋势。

Antonio Damasio 在他的书《事物的奇怪顺序》 中指出,这个术语具有误导性,因为体内平衡不仅仅意味着静止。生命是一个自我实现的原则,它不仅仅满足于在当下维持它的功能。如果你有两个相互竞争的有机体,其中一个满足于现有的生活,而另一个经过优化可以在未来的岁月里过得很好,哪一个将有更大的机会存活数百万甚至数十亿年?我们在当今世界发现的生命总是 含蓄地将自己推向遥远的未来 ,因为在过去,它进化出的特性会激励它继续将自己推向未来。

保持车轮滚动,保持呼吸,向前推进。

Priestess of Delphi, by John Collier [Public domain]

预测未来

人们总是试图预测和改变未来。在古代,算命是牧师和巫师的一项复杂技艺。这方面最著名的例子可能是德尔斐神谕,数百年来,希腊政治家和罗马皇帝都参考这一神谕。古代政治是一个充满不确定性的时代,我们不应该对人们希望减少不确定性的愿望过于武断。

但是从更现代的科学角度来看,我们已经认识到,在恍惚状态下吸入有毒气体和说谜语不太可能给我们任何关于世界运作的真正见解。为了减少对未来的不确定性,我们(以及我们的大脑)需要采取一种更普通的方法,试图根据我们对世界的已知尽可能好地预测未来。根据我对当今世界的观察,我可以期待明天会发生什么,我应该在什么意义上指导我的行动,以获得对我的生存最有利的结果?

贝叶斯定理

18 世纪虔诚的托马斯·贝叶斯提出了一个简洁的小定理,这个定理在他生前没有发表,但后来证明在许多领域都非常有用。这真的很简单,但这并不妨碍贝叶斯的名字成为现代认知科学中最热门的理论之一。

这里我们可以看到它的蓝色发光版本:

Bayes’ theorem. Credit to mattbuck (category) [CC BY-SA 2.0]

贝叶斯定理指出,给定 B 的概率等于给定 A 的 B 的概率乘以 A 的概率,再除以 B 的概率。

当我们已经知道其他相关事情发生的概率时,它给出了某些事情发生的概率。

你可能已经猜到了为什么这在预测未来时会派上用场。

应用贝叶斯定理的一个流行的例子是看天气,这是不确定性和对自然残酷的沮丧的永恒来源。

Photo by Elliott Engelmann on Unsplash

比方说,你去散步,但由于某种原因在干旱和无尽的沙漠中迷路了。你打算在公园里散步,所以你只带了一小瓶水喝。迷路三天后,你自然会很渴。你在早晨扫描天空寻找一片云,你瞧,在地平线上你看到一小片云。

下雨的概率有多大,你不死于脱水的概率有多大?

我们正在寻找概率 P(雨|云),因此对于给定你观察到云的情况下下雨的条件概率。我们需要:

  1. P(云|雨):如果某一天下雨,这一天是以天空中的云开始的吗?假设沙漠中 80%的雨天一开始都是多云天气。这意味着很有可能一开始就有云,以防那天下雨。
  2. 在某一天,沙漠中出现云的几率非常小:只有 10%。
  3. 下雨的可能性就更小了。沙漠里每隔一百天才会下雨,所以概率在 1%。

假设你观察到一朵云,那么下雨的总概率为:

P(雨|云)=P(云|雨)P(雨)/P(云)=0.80.01/0.10=0.08**

看到云之后,你可以说有大约 8%的可能性会下雨。小小的安慰,但总比没有好。

重要的是要注意,在计算你感兴趣的条件概率时,其他三个概率都是必不可少的。放弃一个会显著改变你想要的结果。

假阳性

贝叶斯定理帮助我们纠正假阳性,例如,当我们假设一个事件可以提供关于一个结果的信息,而这个结果本身是不太可能的。一个著名的例子是癌症测试(或任何其他罕见疾病)。**

假设只有 0.1%的人口患有某种癌症。你的医生告诉你一种新的、改进的癌症测试,如果病人真的患有癌症,这种测试可以在 90%的情况下检测出癌症。缺点是,当癌症并不真正存在时,它也在大约 9%的测量中检测到癌症。

你是一个天生焦虑的人,所以你想通过考试来缓解你的焦虑。你有一个积极的结果。你真的害怕了一秒钟,因为毕竟,你患癌症的几率是 90%,不是吗?

不,因为你可以快速应用贝叶斯定理计算出你患癌症的真实几率。请注意,在这种情况下,您需要划分出真阳性的概率和假阳性的几率:

P(癌|阳性结果)=P(阳性结果|癌)p(癌)/(p(阳性结果)p(癌)+p(假阳性)*p(未患癌))= 9.17%

所以,你不应该太担心(考虑到你一开始是出于焦虑而参加测试,这将是很困难的),因为患癌症的可能性很小,假阳性的几率比得到阳性结果并实际患有癌症的几率大约高十倍。****

关于独角兽的一个注记

This is very probably not a real unicorn. Photo by Andrea Tummons on Unsplash

因此,对于任何对预测未来感兴趣的人来说,很好地了解事件发生的先验概率是有帮助的。

为了判断一个事件(例如,看到云或阳性癌症测试)对预测另一个事件(例如,下雨或患癌症)的信息量有多大,当我们观察云或癌症测试时,我们需要对下雨或癌症的总体概率进行表示。

由于大脑在对感官收集的关于外部世界的信息进行分类时不断判断概率,你可能会开始猜测为什么它的运行方式可能有一些 贝叶斯

假设你看到一只四条腿的动物沿着地平线飞奔的模糊轮廓。看起来像有一个又长又尖的物体附着在动物的前额上。

你的大脑会自动跳到结论是独角兽吗?

如果你没有疯,可能不会,因为在给定你正在观察的形状的情况下,观察到独角兽的概率 P(独角兽|形状)必须由观察到独角兽的先验概率 P(独角兽)在我们的宇宙中很可能为零这一事实来加权。

世界的内部模型

如果大脑想要模拟世界的行为,特别是未来的行为,大脑需要有一个世界是什么样子的内部模型,以便了解世界可能会变成什么样子。

大脑需要能够在接收到关于世界状态的新信息(例如,通过接收新样本)后更新世界的内部模型。假设你经常在上班的路上看到独角兽。多久你会开始怀疑你关于没有独角兽的假设是否仍然成立?或者说,50 个癌症检测呈阳性的人中有 20 个实际上患有癌症。对于所有阳性结果中只有 9.17%意味着患者实际上患有癌症的估计,您有多大的信心?

以统计最优的方式基于新信息更新内部模型的概率分布称为 贝叶斯推理

我们经常观察到大脑在行为实验中进行这种推理,或者在将感官输入相互关联时进行这种推理:已经表明,在巴甫洛夫关联刺激实验中,不同刺激之间的相互信息得到了最佳解释(参见第 16 页此处的概述)。另一个很好的例子是布里顿等人 1992 年著名的视觉运动研究。al ,表明当试图根据对刺激的神经反应/放电率解码视觉运动的一致性时,猴脑设法接近贝叶斯最佳解码率。

原来,大脑以可预测的方式进行预测。

贝叶斯大脑假说

现在我们准备更深入地研究 贝叶斯大脑假说 实际需要什么。

贝叶斯大脑 存在于外部世界,并被赋予了这个外部世界的内在表征。这两者由所谓的 马尔科夫毯 相互隔开。

大脑试图根据世界的生成模型来推断其感觉的原因。为了成功地模拟外部世界,它必须能够以某种方式模拟外部世界正在发生的事情。用 卡尔·弗里斯顿 (此处摘自)的话说:

如果大脑正在对其感觉的原因进行推理,那么它必须有一个导致感觉输入的世界的
(隐藏的)状态之间的因果关系(联系)的模型。由此可见,
神经元连接编码(模拟)了共同产生感觉信息的因果连接。

这是理解 贝叶斯大脑假说 的第一个关键点。这是一个深刻的观点:大脑内部世界的内部模型表明,大脑中的 过程是物理世界中的 过程。为了成功预测未来,大脑需要在自己的硬件上运行对世界的模拟。这些过程需要遵循与外部世界相似的因果关系,在观察它的大脑中,它自己的世界变得活跃起来。

第二点涉及回贝叶斯推理:它需要大脑在某种意义上是最优的/优化的 ,就像我们对自然的期望一样。

正如我前面指出的,当对感知内容进行分类并在不确定性下做出决策时,贝叶斯大脑在近似贝叶斯最优水平上工作,这意味着它在推断世界的未来(隐藏)状态时,尽可能地考虑所有可用信息和所有概率约束。

你可以给被优化的量取几个名字,但是通常情况下,在深入统一的理论中,不同的观点优化不同的事物,最终得到相同的量。一种看待方式是作为 证据 ,这在信息论中等同于最大化感知数据和世界内部模型之间的

自由能

在我关于自由意志热力学的文章中,我更详细地研究了卡尔·弗里斯顿的主动推理理论。

自由能被最小化,以优化模型的证据或边际可能性,弗里斯顿将其等同于最小化被称为模型 的 惊喜的东西(因此最小化体验不符合你的世界模型的东西)。

该理论进一步在大脑 等生命系统的行为中融入了一个主动成分,让系统在世界中执行动作 。你不仅可以梦想未来,还可以积极地改变未来,改变世界,让你的期望成真。

主动推理被 AI 缩写并非巧合,因为 Karl Friston 在这里,他认为“在 5 到 10 年内,大多数机器学习将纳入自由能最小化”。

这就把我们带回了达玛西欧的 稳态批判:

生命系统不是一成不变的,它们在世界上的行为是为了最小化惊奇,并在不确定性塑造的未来中持续存在。

最小化自由能与熵相关,因为对惊喜的时间平均给了我们一个的度量。这具有深刻的物理后果,因为正如弗里斯顿所说:

这意味着试图最大化其
证据的贝叶斯大脑隐含地试图最小化其熵。换句话说,它
抵制热力学第二定律,并在面对
无序的自然趋势时,为自我组织提供了原则性的
解释。

因此,贝叶斯大脑假说 是一个理论的根本范畴。它将大脑的行为与 稳态命令 联系在一起,与生命在一个宁愿消散的世界中的生存斗争联系在一起。

我们如何观察贝叶斯大脑?

提出大范围理论是一回事。从大脑的行为方式中寻找证据是另一回事。如果大脑表现为贝叶斯大脑,我们需要进一步了解大脑实际上是如何实现贝叶斯推理的。

贝叶斯推理被认为发生在许多认知层面上,从运动控制到注意力和工作记忆。每一项认知任务都有自己的预测、内部模型和独特的时间尺度。新的研究表明,执行贝叶斯推理的结构可以在神经成像数据中观察到,并且“神经元活动的时间
序列与理论预测的计算顺序相匹配”

实现它的一个有希望的尝试被称为 预测编码 ,它做的正是贝叶斯大脑应该做的事情:它的算法通过改变它们预测的参数来为未来做准备,以便在再次面临相同情况时将惊讶降至最低。这方面的证据已经在所谓的 N400 效应的单词预测实验中被发现(参见这里的这里的这里的)

认知科学正在认识到,大脑不仅仅是一个被动接受世界信息并做出反应的探测器。它通过对世界现状和未来做出假设,以一种 自上而下 的方式不断塑造其对世界的愿景(这意味着高阶概念首先塑造了低阶感官数据的感知方式,如独角兽的例子中所述)。这使得研究人员采用了现实的奇妙概念,即 控制的幻觉 (更多信息见安尼尔·塞思的 Ted 演讲),例如,先证者在事先阅读了“kick”后,产生了听到“kick”而不是“pick”的幻觉,如本研究中的所示。

以可预测的方式幻想现实给了我们决定性的进化优势,这是我们希望在纷乱复杂的世界中找到结构时迫切需要的。

科学家们仍在激烈地争论该理论的有效性,以及大脑如何在功能层面上实际整合贝叶斯推理这一大问题。在我们做出任何明确的断言之前,还需要进一步的研究。但是我认为理论的美丽和我们目前所看到的证据可以让我们充满希望,我们正走在一条好的轨道上。

我们越来越接近于破解宇宙中最神秘的物体的秘密,这个物体允许我们观察世界并在其中导航,它使我们生老病死并希望有一个更好的未来(你可能已经有了我将如何结束这句话的内在表示):我们自己的贝叶斯大脑。

BEA 2019 共享任务:语法错误纠正的技术、调整和技巧

原文:https://towardsdatascience.com/the-bea-2019-shared-task-techniques-tweaks-and-tricks-for-grammatical-error-correction-9d697ef6a1d3?source=collection_archive---------32-----------------------

最近的 BEA 语法错误纠正共享任务共有 24 个团队参与,他们提出了许多有趣的解决问题的方法——其中许多都取得了令人印象深刻的结果!使用了各种各样的技术、调整和技巧,为了呈现一个更容易理解的概述,我列出了我的主要收获。

纵观提交的材料,有两个总体趋势很明显:

  1. 神经机器翻译方法占主导地位。以前基于规则、分类器和统计机器翻译的最先进的方法,现在已经远远落在后面了。
  2. 在大量人工生成的错误示例或弱监督数据(例如,来自维基百科修订历史)上训练系统已经成为标准做法。

在描述更详细的组件时,我将它们分为三个部分:

  1. 模型:模型的架构和解码技术
  2. 数据:用于训练模型的(人工)数据
  3. 训练:训练程序

模型

架构绝大多数提交的内容都基于神经机器翻译方法,其中三分之二使用 transformer 架构,而其余的则基于卷积序列到序列架构或两者的结合。比较两种架构时,袁等人发现变压器模型的性能增益非常大。
Choe 等人也利用了复制增强的变压器架构。这最初是由赵等人提出用于语法错误纠正的,他们通过引入一种允许复制输入标记的输出机制显示了改进。这是有意义的,因为每当纠错系统不纠正错误时,它只是简单地复制输入。

重新排序受限赛道的两个顶级系统也对 beam 搜索的输出句子进行重新排序。
Choe 等人注意到,他们的模型的许多修正是不自然或不正确的,他们通过使用预先训练的神经语言模型重新排序来改善这些修正。 Grundkiewicz 等人在重新排序时使用额外的从右到左神经语言模型作为特征——其动机是从右到左模型可以补充标准的从左到右解码。
其他方法使用错误检测模型进行重新排序:袁等人基于从错误检测系统导出的特征进行重新排序,而 Kaneko 等人在句子级错误检测任务上微调 BERT,并使用其预测作为重新排序的特征。随着系统被推向纠正更多错误,这两种方法的总体得分都有所提高,尤其是召回率。

过滤这种方法对于工业用例也很有趣,因为它可以显著减少处理时间,因为一般来说,大多数句子不包含错误。

迭代解码通过迭代解码,一个句子不断地通过翻译模型,直到模型输出不变的句子。这允许以增量而不是仅通过一遍来校正句子,从而使得模型能够生成更多的校正。 Náplava 等人看到了使用迭代解码的改进,但是它们以牺牲精度为代价提高了召回率。相反, Grundkiewicz 等人放弃迭代解码,因为他们认为只有在系统召回率低的情况下才有必要。

数据

一般来说,存在两种方法来生成错误的人工示例:

  1. 基于规则,使用从真实数据和混淆集收集的错误统计数据,混淆集由通常被错误混淆的单词组成
  2. 反向翻译,其中反向训练校正模型以将错误插入到正确的文本中

基于规则的生成受限领域的前两个贡献都使用了基于规则的方法。
Grundkiewicz 等人将他们的错误生成方法基于从拼写检查器 Aspell 中提取的混淆集,该拼写检查器基于词汇和语音相似性提出建议。在概率与开发集中的单词错误率相匹配的情况下,一个单词要么被删除,与其相邻单词交换,用其混淆集中的一个单词替换,要么插入一个随机单词。此外,为了处理拼写错误,通过在字符级别上使用上述相同的操作,将词汇噪声引入单词。
亚军 Choe 等人试图通过将真实错误中的 n-gram 模式插入到正确的文本中来制造真实的错误。他们还利用规则来创建特定的错误类型,如介词、名词数和动词错误。当将他们的错误生成方法与基于随机替换、删除、插入和重新排序的方法进行比较时,他们看到了明显的好处。然而,如果模型根据实际误差进行微调,差异就会变得均匀。

由于不能保证注入错误,只能简单转述句子,为了控制数据质量袁等过滤掉可能转述的人工句子对。这样,如果生成的句子不具有比从真实错误示例中学习到的阈值更高的降低的语言模型概率,则句子对被过滤。

培养

检查点平均 Náplava 等人通过使最终模型的权重为多个先前检查点的平均值,看到了性能的提高和方差的降低。对于他们的最终模型,他们最终平均了 8 个最新的检查点。

****加权最大似然估计由于语法纠错系统倾向于收敛到局部最优,其中模型通常简单地将输入不变地复制到输出, Grundkiewicz 等人Náplava 等人修改 MLE 损失函数,以给予应该改变的标记更高的权重。

****域适应提出了几种方法来处理不同域中错误类型和频率的差异。在一种方法中, Náplava 等人通过对共享测试集域的较小数据集进行过采样来生成他们的训练集。
作为过采样的替代方案, Choe 等人使用顺序迁移学习方法。这样,他们的模型在三个阶段的过程中被训练:1)去噪自动编码器 2)训练 3)微调。在每个阶段,模型都在一个逐渐变小的数据集上进行训练,该数据集更接近测试域。

****多任务学习他们的系统在错误检测方面表现非常好,表明辅助检测任务是有益的。

结论

BEA 2019 共享任务中系统令人印象深刻的表现表明,自上一个共享任务 CONLL14 以来的 5 年中,语法纠错领域取得了巨大的飞跃。特别是,通过将问题建模为低资源神经机器翻译任务,已经取得了很多成功。即使在这种相对狭窄的环境中,系统仍在朝着许多不同的方向发展,许多不同的技术正在被应用。展望未来,我列出的每一个组件都应该进一步探索,以开发一套最佳实践,作为工业系统和未来研究方向的基础。

原载于http://www . flachs . io**

圣杯人工智能项目的美妙之处——以及如何找到它们

原文:https://towardsdatascience.com/the-beauty-of-holy-grail-ai-projects-and-how-to-find-them-5dbbbadd7ae6?source=collection_archive---------20-----------------------

人工智能项目管理

关于下一个最佳人工智能星际飞船的排名和双倍下注的艺术。

W 面对充满人工智能(AI)项目想法的海洋,很难找到从哪里开始钓鱼的方法。公司越来越意识到人工智能的好处。在过去的六年里,私募股权部门在人工智能初创公司投资了超过500 亿美元。你应该从哪里开始你的人工智能之旅?你是如何对不同的 AI 项目进行排名的?根据你的业务的 AI 成熟度水平,你应该专注于哪些 AI 项目?

Photo by Vince Fleming on Unsplash

这篇文章解释了如何对不同的人工智能项目进行评估和排序。每个组织都有有限的资源,他们需要分配这些资源来最大化影响。根据你在人工智能成熟旅程中的位置,人工智能项目的影响和风险之间的权衡变得更加重要。这些见解是通过与保时捷股份公司、硅谷初创公司 Xcalar 的行业专家讨论以及我自己的经历得出的。

让我们继续读下去。🎳

使用影响-风险人工智能项目矩阵

评估人工智能项目的主要维度是影响和风险。影响定义了人工智能项目的价值,风险定义了项目失败的可能性。人工智能项目可以根据其估计的影响和风险水平分为四组。

低影响、低风险的人工智能项目属于“扎实起步”类别。这些项目可能有助于开始你的人工智能之旅,但一旦你的公司达到人工智能成熟度的高级水平,这些项目就不再相关了。

高影响力、低风险的人工智能项目是寻找的“圣杯”项目。这些项目都有可能成功,并对业务目标产生重大影响。如果你发现了这些项目,就牢牢抓住它们,集中精力让它们发挥作用。

The Holy Grail AI Projects everyone is looking for. Source: Wikimedia

高影响、高风险的人工智能项目被认为是“计算好的赌注”。这个项目是否会成功还不确定,但是如果你的天才工程师找到了让它工作的方法,这个项目保证会有回报。

最后,低影响、高风险的人工智能项目属于“不-不-从不”类别。始终避免这些项目。即使项目成功,对底线的影响也有限。

Photo by Lubo Minar on Unsplash

现在,你如何评估人工智能项目的影响和风险来对它们进行排序?下面几节将深入探讨这两个标准。

影响

如果一个人工智能项目影响了商业目标,那么它就是有意义的。每个公司都有目标,KPI,或称 OKRs ,以此来指导业务。一些公司甚至采用了成功的人工智能策略。人工智能项目应该支持人工智能策略,从而支持商业目标。

Photo by James Toose on Unsplash

所有产生的影响是相等的吗?

前微软研究员、现保时捷公司创新经理 Tobias Grosse-Puppendahl ,区分了人工智能提供的三类价值:业务、客户和知识价值。商业价值通过新产品或降低成本直接影响公司的财务状况。客户价值侧重于推动用户参与。知识价值使员工能够采用新技能或在未来做出更明智的决策(例如通过收集有价值的数据)。

根据您公司的情况,侧重于将影响与这三个方面联系起来。

你如何计算人工智能项目的潜在影响?

低影响力和高影响力人工智能项目之间的区别在于可寻址受众的规模和财务机会。您可以将影响定义为

影响力=潜在受众机会。*

潜在受众是指受变更影响的用户、员工或产品数量。机会解决财务或 KPI 数据的预期变化。这包括交付项目的成本。你可以通过将你的情况与竞争对手的结果或你自己的预测进行比较来估计机会。将这两个因素相乘,你就有了一个衡量影响的尺度。

Photo by Miguel Henriques on Unsplash

例如,让我们假设你有 1000 个用户,他们平均每月在你的网站上花费 10 美元。我们预计推荐系统将增加 5%的利润。作为对比,麦肯锡表示,推荐引擎已经为亚马逊创造了超过 35%的收入。由于我们不是亚马逊,5%的涨幅似乎是合理的。这相当于(1000 * 10 美元)* 0.05 =每月额外利润 500 美元。很高兴我们锁定了我们的业务基础!如果我们计算所有项目的影响,我们可以将它们分成高影响或低影响类别。

风险

风险是指在给定时间、成本和质量限制的情况下,项目不成功的可能性。项目的风险越大,失败的可能性就越大。

Photo by Loic Leray on Unsplash

什么因素定义了人工智能项目的风险?

每个人工智能项目都通过数据、算法和基础设施来满足人工智能的三位一体。如果数据不可用,算法是一个新的领域,并且你没有合适的基础设施,那么实现一个人工智能项目就变得非常困难。因此,它变得更加危险。

OpenAI 的 Josh Tobin全栈深度学习课程中指出,定义人工智能项目可行性的主要因素是数据可用性、准确性要求和问题的复杂性。一般来说,数据标注和精度要求往往是主要的成本因素(第 2 周,Min 29 )。需要的标记数据越多,精度要求越高,项目的成本就越高。制造自动驾驶汽车需要很高的精确度,因此非常昂贵。另一方面,创建一个基本的在线推荐器通常具有有限的数据标记和准确性要求,因此更便宜且风险更小。

Photo by Matthew Szlichta on Unsplash

前谷歌项目经理丽贝卡·叶(Rebecca Ye)现在是创业公司 XCalar 的联合创始人和首席运营官,她将与商业成果的联系作为每个人工智能项目的主要风险因素。丽贝卡看到许多大公司刚刚开始使用人工智能。为了进行可持续的投资和实施人工智能,来自业务部门的拉动至关重要。人工智能项目应该明白他们需要满足商业目标。

现在我们有了 AI 项目的风险因素列表,让我们标准化 AI 项目风险评估。

你可以用什么工具来定义人工智能项目的风险?

虽然人工智能项目的风险不像影响那样容易计算,但是人工智能项目画布可以作为评估风险的良好代理。AI 项目画布检查项目的价值主张、数据、客户和财务视角。因此,它回答了 Josh 和 Rebecca 在上面提到的主要因素。

你能在 AI 项目画布中回答的类别越多,你的 AI 项目的风险就越低。如果你有一个清晰的价值定义,数据随时可用,你知道如何将产品运送给你的客户,并且你关注项目财务,那么你就走上了成功之路。使用令人信服的回答类别的数量将项目分为高风险和低风险的 AI 项目。

作为最后一步,现在我们已经根据影响和风险对项目进行了排序,我们应该根据 AI 成熟度的水平来关注哪些项目?

根据你的人工智能成熟度水平下注

吴恩达,前谷歌和百度大脑负责人,现任 landing.ai 首席执行官,建议公司简单地从人工智能开始。在人工智能转型剧本中,从人工智能项目开始是第一个要点。在在线课程AI for everybody中,他进一步解释说,从人工智能开始比拥有人工智能战略更重要。我们想更进一步,建议在开始人工智能之前先看看人工智能项目的影响和风险。

通常,踏上人工智能成熟之旅的公司会发现自己处于三个成熟水平之一:初级、高级、专业。刚起步的公司没有可用的基础设施,没有对其数据能力的概述,并且只雇佣了最初的几名数据员工。先进的人工智能组织已经成功交付了第一批人工智能项目。专业的人工智能公司已经将人工智能确立为其主要竞争优势之一,并从有效的基础设施和高技能的工程师中受益。

例如,保时捷强调人工智能是其重点主题之一,以推动其 IT 能力的未来。

Tobias 强调了理解你的公司在人工智能成熟之旅中的位置的重要性。对他来说,当一家公司正在寻找创新的新方法来解决现有问题时,高影响、高风险的“计算赌注”人工智能项目尤其具有吸引力。创新的想法很少是低风险的,但对于一个人工智能成熟度高的公司来说是重要的。谷歌建议将你的核心/可行创新/登月项目的工作分成 70/20/10 份,以持续创新。

关键要点

在评估人工智能项目时,要考虑影响-风险矩阵。鉴于你在人工智能成熟之旅中的位置,专注于不同类别的人工智能项目。

  • 影响=潜在受众*机会
  • 风险最好通过人工智能项目画布来评估
  • 如果你是从人工智能开始,寻找低影响、低风险的“扎实起步”人工智能项目开始
  • 在你的第一次学习之后,专注于高影响力、低风险的“圣杯”人工智能项目来推动价值
  • 一旦你已经达到人工智能的成熟期,从高影响和高风险类别中分配一些资源到“计算好的赌注”人工智能项目上

这篇文章旨在给你一个评估不同人工智能项目的实践指南。这些方法已经被尝试和测试,并在今天的工业中被应用。如果你想了解更多商业和数据科学之间的联系,关注媒体LinkedInTwitter 上的我。

在 Python 中选择机器学习预测模型的数据科学家指南

原文:https://towardsdatascience.com/the-beginners-guide-to-selecting-machine-learning-predictive-models-in-python-f2eb594e4ddc?source=collection_archive---------6-----------------------

了解如何为您的 ML 项目选择最佳模型。

Photo by Franck V. on Unsplash

本文提供了 Python 中一些预测性机器学习模型的快速概述,并为针对数据科学问题选择正确的模型提供了指导。

近年来,随着机器计算能力的提高,预测建模经历了一场革命。我们现在能够在多个内核上以数 GHz 的速度运行数千个模型,使预测建模比以往任何时候都更高效、更经济。虚拟机,例如亚马逊网络服务(AWS)提供的虚拟机,为我们提供了实际上无限的定量能力(当然成本很高!).

然而,每个数据科学家面临的一个基本问题是:

哪种预测模型更适合手头的问题?

回答这个问题可以归结为每个机器学习问题中的一个基本问题:

你试图预测的目标是什么样子的?

如果你试图预测一个连续目标,那么你将需要一个回归模型

但是如果你试图预测一个离散目标,那么你将需要一个分类模型

Python 中的回归模型:

Regression Modeling — https://en.wikipedia.org/wiki/Regression_analysis

  • 线性回归:当您预测一个连续模型,并且您的目标在-∞和+∞(如温度)之间变化时,最佳模型是线性回归模型。根据您可能拥有的预测值(即特征)的数量,您可以使用简单线性回归(SLR)或多元线性回归(MLR)。这两者在 Python 中使用相同的包:sklearn.linear_model.LinearRegression() 关于这一点的文档可以在这里找到
  • 伽马回归:当对具有 0 到+∞分布的目标进行预测时,那么除了线性回归之外,具有Gamma Distribution的广义线性模型(GLM)可用于预测。关于 GLM 的详细信息可以在这里找到。

Python 中的分类模型

Python 提供了许多分类模型。在这一节中,我们回顾一下[scikit-learn](https://scikit-learn.org)库中一些广泛使用的模型。

  • 逻辑回归(LogReg): 该模型用于预测多类目标。与 K_Nearest Neighbors (kNN)不同,该模型在线性情况下工作良好。SciKit-Learn 在其线性模型库中提供了这个包:sklearn.linear_model.LogisticRegression() 关于这个的文档可以在这里找到
  • KNN(或 K 近邻)为非参数模型,其中 logistic 回归为参数模型。一般来说, KNN 比 LogReg 模型效率低,支持非线性解。该模型根据特定类的最近邻居数量(顾名思义)对目标进行分类。这里可以找到sklearn.neighbors.KNeighborsClassifer 的文档。需要注意的是,sklearn还提供了一个KNeighborsRegressor,本文未涉及。

分类问题的混淆矩阵

我的关于用 Python 评估机器学习分类问题:重要的 5+1 度量 的文章提供了分类性能度量的概述,以及这些模型的混淆矩阵混淆度量的定义。

Structure of a Binary Classification Confusion Matrix https://medium.com/@minaienick/evaluating-machine-learning-classification-problems-in-python-5-1-metrics-that-matter-792c6faddf5

高级分类器/回归器模型

Python 库提供了许多算法,如 SciKit-Learn、XGBoost 和……其中一些算法既提供了分类器又提供了回归器,还提供了许多用于定制的参数。

  • ****决策树:决策树提供可定制的模型,同时也是更加优化的模型的基础,如 RandomForestGradientBoosting文档可在此处找到。决策树是非参数监督学习,因此能够处理异常值和相关变量。但是,它们很容易过度适应训练数据集,用户应该小心这个问题。

Visualization of a Decision Tree — https://scikit-learn.org/stable/modules/tree.html

  • Bagging 模型(或集成): Bagging 分类器在原始数据集的随机子集上拟合基本分类器(例如决策树或任何其他分类器),然后聚合这些分类器以获得最终预测。这可以通过投票或平均来实现。更多关于 [sklearn.ensemble.BaggingClassifier](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.BaggingClassifier.html) 的细节可以在这里找到。

Bagging Approach — “Data Mining: Accuracy and Error Measures for Classification and Prediction” , Paola Galdi Roberto Tagliaferri

  • ****随机森林:随机森林模型类似于装袋模型,但有区别。根据 Sklearn 关于 [sklearn.ensemble.RandomForstClassifie](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html)r : 的文档,“随机森林是一种元估计器,它在数据集的各个子样本上拟合多个决策树分类器,并使用平均来提高预测精度和控制过拟合。子样本大小始终与原始输入样本大小相同,但样本是替换抽取的。这种类型的模型有许多优点,包括高学习速度、可扩展性、模型的非迭代性质(它总是收敛的)。该模型的另一个重要优点是,它可以处理不平衡的情况,并可以利用 bootstrapping 来处理这种情况。但是,该模型可能会占用大量内存,并且可能会过度适应定型数据集。本文很好地总结了这一模式。

General Scheme of a Random Forest Model — https://www.mql5.com/en/articles/3856

  • ****投票模型:投票模型可以将多个模型打包在一个模型下。Sklearn 文档称之为 “用于不适合估计器的软投票/多数规则分类器。” 在这个模型中,可以给每个投票模型分配一个权重,这样不合适的模型就会被打折扣。这类似于 bagging,但适用于不同的模型和不同的权重(Bagging 仅适用于一个基础模型,然后对预测值进行平均)。[sklearn.ensemble.VotingClassifier](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.VotingClassifier.html)有关于这款车型的更多细节。
  • ****Boosting 模型:在 Boosting 模型中,每棵树根据其准确性获得一个重要性权重。更精确的模型将具有更高的权重,因此对最终预测的贡献更大。高度不准确的模型将被负权重惩罚,这意味着它们的预测将在最终预测中被逆转。助推模型有多种,但值得注意的有:[sklearn.ensemble.GradientBoostingClassifier](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html)[sklearn.ensemble.AdaBoostingClassifier](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html)

Scikit-Learn 算法备忘单

Scikit-Learn 开发了一个流程图,用于根据样本的特性、特征(或预测值)和目标为机器学习问题选择正确的模型。此互动备忘单可在此处找到。

Scikit-learn Algorithm Cheat-Sheet (https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html)

最后的想法…

当谈到机器学习预测模型时,这篇文章几乎没有触及表面。为此目的已经开发了许多包(并且仍在增加),这将需要大量的时间来复习和学习。学习这些模型的最好方法是在实际项目中使用它们。我希望这篇文章可以作为为您的数据科学项目选择正确模型的指南,并帮助您完成数据科学之旅。

尼克·米奈, 博士( LinkedIn 简介 )是一位高级顾问和富有远见的数据科学家,代表了领导技能、世界级数据科学专业知识、商业敏锐度和领导组织变革能力的独特组合。他的使命是推进人工智能(AI)和机器学习在行业中的实践。

自然语言处理的开端

原文:https://towardsdatascience.com/the-beginning-of-natural-language-processing-74cce2545676?source=collection_archive---------33-----------------------

让我们都回到人类生活的早期阶段,早期人类用不同的手势相互交流,在一定程度上,今天我们在世界各地使用 7000 多种语言。对于早期人类来说,这是一个相当大的成就,这使得人类有别于世界上的其他生物,这就是沟通的艺术。

现在,我们通过一种被称为“自然语言处理”的新方法与计算机进行互动,将这种艺术推向了一个新的高度它与自然语言和计算机之间的交互有关。它是人工智能和计算语言学的主要组成部分之一。它提供了计算机和人类之间的无缝交互,并在机器学习的帮助下赋予计算机理解人类语言的能力。

NLP 的历史可以追溯到 1971 年,当时美国国防高级研究计划局(DARPA)将 NLP 用于语音的鲁棒自动转录(rat ),以执行与通过极度嘈杂和/或高度失真的通信信道接收的包含语音的信号相关的任务。

2011 年,苹果在 iPhone 中引入了 Siri,这为 NLP 的各种应用带来了突破。

如今,我们都知道聊天机器人在各种公司中有多重要,例如信使、公司网站、银行、客户服务等等。

因此,让我们借助 Python 编程语言,开始我们学习这项蓬勃发展的技术的旅程。

Python 和 NLTK 入门:

Python 是不同机器学习活动中使用最多的语言,其中一个主要原因是支持不同的第三方包。为了学习 NLP,我们需要首先安装“NLTK”,可以从http://www.nltk.org免费下载,并按照那里的说明下载您的平台所需的版本。

一旦安装了 NLTK,就可以按照下面的命令安装所需的数据

import nltk
nltk.download()

一旦你运行了命令,你将得到上面的窗口,在这里你可以从你想要安装的软件包列表中选择。一旦你安装了所有必要的软件包,我们就可以开始探索它们了。

标准自然语言处理工作流程

我假设您知道 CRISP-DM 模型,这是执行任何数据科学项目的典型行业标准。任何基于 NLP 的问题都可以通过包含一系列步骤的系统工作流来解决。下图描述了主要步骤。

我们通常从文本文档的语料库开始,并遵循文本争论和预处理、解析和基本探索性数据分析的标准流程。基于最初的见解,我们通常使用相关的特征工程技术来表示文本。根据手头的问题,我们要么专注于建立预测的监督模型,要么专注于无监督模型,后者通常更专注于模式挖掘和分组。最后,我们与相关利益相关者或客户一起评估模型和整体成功标准,并部署最终模型以供将来使用。

预处理

清理和预处理文本数据通常涉及多个步骤。我将强调自然语言处理(NLP)管道中大量使用的一些最重要的步骤,我经常在我的 NLP 项目中使用它们。

1)标记化

通过使用空格和标点符号分隔单词将文本分成小块的过程。

为了实现这一点,我们需要使用 nltk.word_tokenize()

代号:

string = ‘Virat Kohli is the best batsmen in the world’
tokens = nltk.word_tokenize(string)
tokens[‘Virat’, ‘Kohli’, ‘is’, ‘the’, ‘best’, ‘batsmen’, ‘in’, ‘the’, ‘world’]

上面的列表是我们的字符串的记号,也称为 Unigrams,我们还可以从这些记号中创建二元、三元、n 元,如下所示:

二元模型:

二元模型是由两个连续单词组成的记号。

代码:

tokens_bigrams = list(nltk.bigrams(tokens))
tokens_bigrams[(‘Virat’, ‘Kohli’),
(‘Kohli’, ‘is’),
(‘is’, ‘the’),
(‘the’, ‘best’),
(‘best’, ‘batsmen’),
(‘batsmen’, ‘in’),
(‘in’, ‘the’),
(‘the’, ‘world’)]

三元模型:

三元模型是由三个连续单词组成的记号。

代码:

tokens_trigrams = list(nltk.trigrams(tokens))
tokens_trigrams[(‘Virat’, ‘Kohli’, ‘is’),
(‘Kohli’, ‘is’, ‘the’),
(‘is’, ‘the’, ‘best’),
(‘the’, ‘best’, ‘batsmen’),
(‘best’, ‘batsmen’, ‘in’),
(‘batsmen’, ‘in’, ‘the’),
(‘in’, ‘the’, ‘world’)]

n 语法:

n 元语法是有 n 个连续单词的记号,我们可以在代码中指定。

代码:

tokens_ngrams = list(nltk.ngrams(tokens,4))
tokens_ngrams[(‘Virat’, ‘Kohli’, ‘is’, ‘the’),
(‘Kohli’, ‘is’, ‘the’, ‘best’),
(‘is’, ‘the’, ‘best’, ‘batsmen’),
(‘the’, ‘best’, ‘batsmen’, ‘in’),
(‘best’, ‘batsmen’, ‘in’, ‘the’),
(‘batsmen’, ‘in’, ‘the’, ‘world’)]

这些不同的记号化方法对你的 NLP 项目非常有帮助。

2)词干

要理解词干,你需要了解词干代表什么。词干也被称为单词的基本形式,我们可以通过在词干上附加词缀来创造新单词,这一过程称为词尾变化。考虑跳跃这个词。你可以给它加上词缀,组成新词,比如 JUMPS,JUMPED 和 JUMPING。在这种情况下,基本词 JUMP 是词干。

该图显示了词干是如何出现在所有词形变化中的,因为词干构成了词缀构成每个词形变化的基础。从一个词的词尾变化形式获得其基本形式的逆过程称为词干提取。词干分析帮助我们将单词标准化为词根或词根,而不管它们的词形变化,这有助于许多应用,如分类或聚类文本,甚至在信息检索中。现在让我们来看看流行的波特梗

代号:

def simple_stemmer(text):
    ps = nltk.porter.PorterStemmer()
    text = ' '.join([ps.stem(word) for word in text.split()])
    return text
simple_stemmer("My system keeps crashing his crashed yesterday, ours crashes daily")‘My system keep crash hi crash yesterday, our crash daili’

请注意,词干通常有一套固定的规则,因此,词根可能在词典上不正确。这意味着,词干单词可能在语义上不正确,并且可能不在字典中(从前面的输出中可以明显看出)。

  1. 词汇化

词汇化与词干化非常相似,我们去掉词缀来获得单词的基本形式。然而,在这种情况下,基本形式被称为词根,而不是词干。区别在于词根在词典中总是正确的(存在于词典中),但是词根可能不是这样。因此,词根,也称为引理,将始终存在于字典中。

代号:

from nltk.stem import WordNetLemmatizer
from nltk.stem import wordnetword_lem = WordNetLemmatizer()
word_lem.lemmatize("My system keeps crashing his crashed yesterday, ours crashes daily")'My system keeps crashing his crashed yesterday, ours crashes daily'

你可以看到单词的语义并没有受到影响,然而我们的文本仍然是标准化的。

请注意,词干化过程比词干化慢得多,因为当且仅当词条存在于词典中时,通过从单词中移除词缀来形成词根形式或词条还需要一个额外的步骤。

4)删除停用词

意义不大或没有意义的单词,尤其是当从文本中构造有意义的特征时,被称为停用词。如果你在语料库中做一个简单的术语或词频,这些通常是出现频率最高的词。通常,这些可以是冠词、连词、介词等等。停用词的一些例子是 a、an、the 等等。

代码:

from nltk.corpus import stopwords
stopword_list = set(stopwords.words('english'))

如果您想了解更多关于停用词的信息,可以查看上面代码中创建的停用词列表。基于你的 NLP 问题,你甚至可以在这个列表中添加更多的单词。

def remove_stopwords(text, is_lower_case=False):
    tokens = nltk.word_tokenize(text)
    tokens = [token.strip() for token in tokens]
    if is_lower_case:
        filtered_tokens = [token for token in tokens if token not in stopword_list]
    else:
        filtered_tokens = [token for token in tokens if token.lower() not in stopword_list]
    filtered_text = ' '.join(filtered_tokens)    
    return filtered_textremove_stopwords("The, and, if are stopwords, computer is not")‘, , stopwords , computer’

就这样,我们到了这篇文章的结尾。在我的下一篇文章中,我们将看到如何构建一个文本规格化器,它将在一个函数下为我们做所有需要的预处理。

本文使用的 Jupyter 笔记本的 Github 链接:https://github . com/sunil manu/Natural-Language-Processing-Series

谢谢

数据科学中开发运营技能的优势

原文:https://towardsdatascience.com/the-benefits-of-dev-ops-skills-in-data-science-fa0a30aade85?source=collection_archive---------37-----------------------

ev-Ops 是我热爱的一门学科。我对开发运营的热爱来自于我对 Linux 的热爱,我对这两者的热爱让我在数据科学和编程方面变得更加出色。这对于能够部署你自己的作品是非常有益的。此外,在许多情况下,能够 SSH 到服务器并实际使用它是至关重要的。

部署

开发操作技能是许多人使用 Heroku、Netlify 和类似的简单部署系统的唯一原因。这些服务的问题是它们昂贵且有限。这些服务也不是专有的,这意味着如果您的公司需要部署到他们的 VPS,而没有适当的技能和知识,那么您将不得不让其他人来部署您的终端和应用程序。

与使用共享主机服务相比,能够单独配置 NGINX 可以为您节省大量资金和麻烦。能够部署自己的应用程序不仅是一种解放,而且速度更快!部署你自己的 Flask 应用程序也将使你的团队的工作更容易。这是因为您可以在一个会话中建立并运行您的模型。

另一个很大的好处是尺寸和计算;虽然优化通常可以用来解决这些和类似的问题,但拒绝计算限制、计算定价以及最重要的存储限制也是很好的。当您使用 Gunicorn 3 和 NGINX 在 VPS 上部署您的模型时。如果你想改善你的部署,你可以在这里

通用编程

知道如何使用 Linux 就是知道如何使用服务器,知道如何使用 bash,能够无头操作电脑。所有这些技能被结合成一个,因为 Linux 是如此的通用,如此的被使用。

许多微型计算机项目也可能需要一些 Linux 知识。显然,Linux 是绝对必须的,尤其是对于 web 开发和部署。

对于数据科学来说,互联网对于这项工作的必要性经常被低估。数据科学实际上并不是拟合模型和建立巨大的神经网络,而是获得你做这些事情所需的数据。因为你首先需要数据来建立一个模型,所以非常清楚如何将数据传递给你自己是一个数据科学家必须具备的技能。

此外,bash 的强大功能可以极大地改变您的工作流程。使用 git 来检索存储库、提交和编辑文件是一件非常方便的事情。在没有 bash shell 的 Windows 中,开发人员经常会遇到需要 bash 终端却没有的问题。熟悉 bash 是一项您肯定不会后悔学习的技能。

部署端点和管道是数据科学难题的重要组成部分。虽然我通常更喜欢拟合模型和处理数据,但我很了解管道和事先获得良好数据结构的重要性。

Unix 系统管理技能可以使您的部署变得容易,有时可以将不可能变为可能。部署可能是一件痛苦的事情,有时它真的可以穿透一个非常大的模型;限制机器学习模型的大小和计算速度。这些技能会让工作变得轻而易举,而且肯定会让你的生活轻松很多。因为工作流程的增加,学习起来也很棒。能够将这些技能融入到你的工作流程中,不仅可以更快,而且实际上感觉更有效率。

基于 BERT 的 DeepPavlov 文本分类模型

原文:https://towardsdatascience.com/the-bert-based-text-classification-models-of-deeppavlov-a85892f14d61?source=collection_archive---------11-----------------------

DeepPavlov 是一个对话式人工智能框架,包含了构建聊天机器人所需的所有组件。DeepPavlov 是在开源机器学习框架 TensorFlowKeras 之上开发的。它免费且易于使用。本文描述了如何使用 DeepPavlov 的基于 BERT 的模型。

关于伯特

BERT(Transformers 的双向编码器表示)[1]的发布是自然语言处理(NLP)社区去年最激动人心的事件。BERT 是一种基于转换器的技术,用于预训练语言表示,它可以在各种 NLP 任务中产生最先进的结果。伯特论文被计算语言学协会北美分会评为年度最佳长篇论文。

Google Research 发布了几个预训练的 BERT 模型,包括多语言、中文和英文的 BERT。关于这些预训练模型的更多细节可以在这里找到。除了已发布的模型,在 DeepPavlov,我们还为俄语培训了基于 BERT 的模型(RuBERT)。

RuBERT 基于多语言 BERT,并在俄语维基百科和新闻数据上进行训练。我们将 BERT 集成到三个下游任务中:文本分类、标注、问题回答。因此,我们在所有这些任务上都取得了重大进展。基于 DeepPavlov BERT 的模型可以在这里找到。

BERT 预处理器

DeepPavlov NLP 管道在 config/faq 文件夹下的单独配置文件中定义。配置文件由四个主要部分组成:数据集 _ 读取器数据集 _ 迭代器链接器训练器。你可以在这里阅读更多关于配置文件的结构。

所有基于 BERT 的模型的公共元素是配置文件的链接器部分中的BERT _ 预处理器块。未处理的文本应该被传递给 bert_preprocessor 用于标记化成子标记,用它们的索引编码子标记,并创建标记和段掩码。如果将类处理为流水线中的独热标签,则应将 one_hot_labels 设置为 truevocab_file 参数定义了 BERT 词汇文件。

{
    "in": [ "x" ],    
    "class_name": "bert_preprocessor",
    "do_lower_case": false,
    "vocab_file": "{DOWNLOADS_PATH}/bert_models/multi_cased_L-12_H-768_A-12/vocab.txt",
    "out": [ "bert_features" ]
}

文本分类的 BERT

DeepPavlov 通过使用预训练的 BERT,为 NLP 中最受欢迎的任务之一——文本分类问题——提供了一个易于使用的解决方案。人们可以使用几个经过预先训练的英语、多语言和 RuBERT 模型。对于文本分类情况,对应于[CLS]令牌的最终隐藏状态(即,变换器输出)被用作分类任务的聚合序列表示。

让我们在情感分析问题上演示基于 DeepPavlov BERT 的文本分类模型。它包括确定作者对某一特定主题的态度。这可以通过应用文本分类来实现。在这种情况下,类别可以是阴性、中性和阳性。

首先,安装模型的所有需求。

python -m deeppavlov install rusentiment_bert

rusentiment _ bert 模型基于多语言环境的 bert,其最大序列长度( max_seq_length )等于 64。

您可以使用命令行与模型进行交互。

python -m deeppavlov interact rusentiment_bert -dx::I like this game>> [‘positive’]

或者,您可以通过 Python 代码与模型进行交互。

您可以在自己的数据上训练基于 BERT 的文本分类模型。为此,更改配置文件的 dataset_reader 中的 data_path 参数,以及分别定义训练集和测试集文件的****traintest 参数。数据文件应该是 csv 格式,由 class_sep 分隔(默认为 class_sep= ",)。然后以同样的方式训练模型:

python -m deeppavlov train <config_file>

你可以在这里阅读更多关于基于 BERT 的文本分类模型。

参考文献

  1. https://arxiv.org/abs/1810.04805

开始深度学习的最佳书籍

原文:https://towardsdatascience.com/the-best-books-for-getting-started-with-deep-learning-df15fc6da9d1?source=collection_archive---------37-----------------------

如果你想跟上深度学习,你应该读哪些书?考虑从这三个中的一个或多个开始!

虽然人工神经网络的想法最初是在 20 世纪 40 年代提出的,第一个感知器是在 1958 年建造的,但深度学习领域真正开始腾飞是在过去十年里,在成功将神经网络应用于计算机视觉、自然语言处理和许多其他常见的机器学习任务方面取得了实质性突破。

但是深度学习是一个庞大且快速增长的领域。提高速度的最好方法是什么?没有哪本书会包含该领域的所有最新技术——为了跟上那些你开始阅读学术论文所需要的技术。但是在你这么做之前,你必须先在这个领域打好基础才能跟上。这里有三本书将为你提供理解与深度学习相关的最新论文所需的背景。

伊恩·古德菲勒、约舒阿·本吉奥和亚伦·库维尔的《深度学习

这是一个全面的,但容易理解的领域介绍。亚马逊页面清楚地表明了这本书的影响力,两位著名的数据科学家 Geoff Hinton 和 Yann LeCun,甚至 Elon Musk 都发表了评论!这可能是关于深度学习的最著名的书,如果你真的想成为一名数据科学家,你真的应该花时间去吸收。

在提供一些背景的简短介绍之后,“深度学习”被分成三个部分。第 1 部分介绍了足够的数学知识来帮助您完成本书的其余部分——线性代数、概率、信息论、数值计算和机器学习基础知识。如果你根本没有这些主题的背景知识,你可能会想就每个主题挑选一些更深入的书籍来填补你理解中的任何空白,但每个领域都有一个很好的总结,其中有足够的信息来帮助你完成本书后面的深度学习内容。

第 2 部分是本书的核心,带您了解深度学习系统的常见元素。它始于“深度前馈网络”(有时称为多层感知器),这是所有深度学习系统的核心。然后介绍正则化(避免过度适应训练数据)、优化(有效训练网络的技术)、卷积网络(针对具有已知网格状结构的数据进行优化)以及使用递归和递归网络的序列建模(针对序列数据)。

第 3 部分然后介绍了深度学习研究的一些关键领域——从线性因子模型和自动编码器到蒙特卡罗方法和深度生成模型。

这不是一本轻量级的书,它可能很难读,因为它完全专注于理论(书中没有源代码——这是对该领域的概念性介绍)。也就是说,一旦你开始用手指敲击键盘,使用 Tensorflow 或 Pytorch 创建模型,这是开始理解你将要处理的关键主题的好方法。也有可以免费在线

Aurélien Géron 的“使用 Scikit-Learn 的动手机器学习& Tensorflow

这本书与古德费勒的大书大不相同。在短短的 500 多页中,Géron 介绍了经典的机器学习和深度学习。每一部分都以代码开始,后面是你需要理解的解释。

如果你有编程的背景,你绝对应该试试这本书。到第 77 页,除了提供机器学习过程的概述,你将已经从头到尾实现了你的第一个机器学习项目!您将体验到整个数据科学工作流程,从构建问题、清理和可视化数据,一直到选择和训练模型,然后使用网格搜索和集成方法微调模型。然后,您将了解分类、训练模型、支持向量机、决策树、其他集成方法,以及使用主成分分析进行维度缩减。

如果你主要对深度学习感兴趣,当你建立 TensorFlow 并创建你的第一个图表时,好东西从第 229 页开始。还有一种实用的、代码优先的方法,在代码周围散布足够的理论,这样你就知道发生了什么。它涵盖了深度学习的关键理论概念,包括卷积神经网络、递归神经网络、自动编码器,甚至简单地涉及了强化学习。同时,它还涵盖了关键的实际问题,如跨设备和服务器分布张量流处理(对于大多数非平凡数据集的及时训练是必不可少的)。

要知道还有一个第二版应该是 2019 年 10 月出来的。鉴于自该书两年前首次出版以来深度学习的变化速度,等待新版本可能是值得的。

Francois Chollet 的《用 Python 进行深度学习

这本书提供了一个机器学习领域的实践,浓缩的介绍,介于“深度学习”的权威和深度与“用 Scikit-Learn & Tensorflow 实践机器学习”的实用简洁之间

它从定义人工智能、机器学习和深度学习开始。从那里,它提供了机器学习的简史,展示了决策树等传统机器学习模型如何与神经网络相关联。它还使用小代码片段提供了足够的线性代数和微积分背景,为本书的其余部分做好准备。

从那里,它介绍了 Keras——一个用于快速构建神经网络的复杂框架,并使用该库来实现二元和多类分类器,然后使用标准波士顿房价数据集进行回归。

然后,它将向您介绍一些关键概念的概述,如数据预处理、特征工程/学习、过拟合和欠拟合以及机器学习问题的工作流。从那里,它贯穿了解决计算机视觉和自然语言处理问题的实际工作的例子,介绍了一些概念,如循环神经网络(RNN 的),甚至长期短期记忆(LSTM 的)。

如果你决定尽快构建复杂的模型,并且只愿意读一本书,假设你已经熟悉 Python 编程,这可能就是你一直在寻找的书。

选择你自己的冒险

如果您只是想获得一些关于机器学习的实践经验,“用 Scikit-Learn & Tensorflow 实践机器学习”是一个极好的起点。它会让你在短短 500 多页的篇幅内练习构建经典和深度学习解决方案。

如果你准备好了更深入的深度学习体验,“用 Python 进行深度学习”是理想的选择。通过使用 Keras 而不是像 TensorFlow 这样的低级框架,它允许您快速构建复杂的模型。因为它只专注于深度学习,所以与 Géron 更通用的指南相比,它向您介绍了更广泛的概念。

如果你认真理解深度学习,你应该花时间通过“深度学习”来工作。它会给你提供一个坚实的基础,然后你应该从另外两本书里挑一本开始应用这个理论。当然,每本书都有一些其他书没有的金块,所以如果你有时间和兴趣,为什么不读完这三本书呢?它会回报你在该领域理解的深度和广度上所付出的努力。

最初发表于【https://flatironschool.com】

马修斯相关系数是你从未听说过的最好的分类标准

原文:https://towardsdatascience.com/the-best-classification-metric-youve-never-heard-of-the-matthews-correlation-coefficient-3bf50a2f3e9a?source=collection_archive---------2-----------------------

恭喜你!你已经建立了一个二进制分类器——一个使用 128 个 GPU 及其专用发电站的花哨的神经网络,或者一个在你的旧 ThinkPad 上运行的健壮的逻辑回归模型。你设计了模型,输入了数据;现在终于到了衡量分类器性能的时候了。

不要误会:ROC 曲线是比较模型的最佳选择。然而,标量指标在机器学习社区中仍然很受欢迎,其中四个最常见的是准确度召回精确度F1 分数。标量度量在教科书、网络文章、在线课程中无处不在,它们是大多数数据科学家熟悉的度量。但是几周前,我偶然发现了另一个用于二进制分类的标量度量:马修斯相关系数(MCC)。在我的“发现”之后,我四处询问,惊讶地发现这个领域的许多人并不熟悉这个分类标准。作为一个重生的信徒,我是来传播福音的!

让我们从“著名的四个”指标的快速概述开始,包括讨论为什么它们有时不是非常有用,甚至完全误导。接下来,我将介绍另一个指标。

提醒一下,在二元分类法中,我们有两类:所谓的正类和负类。使用混淆矩阵来讨论分类度量是有用的,我们在为我们的二元分类器设置分类阈值之后对混淆矩阵进行计数。(不熟悉混淆矩阵?查看我的另一篇帖子。混淆矩阵有 4 个值,对应于真实类别和预测类别的 4 种组合。下面是一个典型的混淆矩阵,TP,FP,FN,TN 代表四种组合。

Confusion Matrix

让我们看一个玩具例子:我们的数据是宠物的图像,或者是一只狗(🐶),或者一只猫(🐱).我们的分类器在每张照片中检测到一只宠物,我们想测量它的性能。

这是我们的照片分类器的混淆矩阵。我们一共 24 张照片,18+2= 20 狗狗照片,3+1= 4 猫咪照片。

Dogs are “positive”

精确度、召回率和 F1 分数

再回顾一下,precision 是所有检测到的阳性中真正阳性的比例,或者简称为 TP/(TP+FP)。在我们的例子中,狗照片是积极的类别,18+3 张被归类为狗的照片中有 18 张实际上包含狗。因此,精度是 18/21=86%。召回是被正确分类的真阳性的数量(TP/(TP+FN))。从上面的矩阵很容易看出有 20 个真阳性,其中 18 个被成功检测到。因此,召回率为 18/(18+2),即 90%。

最后,F1 分数是精确度和召回率的调和平均值。这算起来有 88%。奇妙的分类器,对吧?沉住气。再看一下矩阵,特别是猫照片的分类。只有 1/4 的猫照片被成功检测到。而且,被归类为猫的 3 张照片中,有 2 张其实是狗。那么为什么 F1 的分数这么高呢?

精确度和召回率(以及 F1 分数,它是两者的函数)认为一个类,正面类,是我们感兴趣的类。他们只使用混淆矩阵中的三个值:TP、FP 和 FN。第四个值——TN——没有在这些指标中使用。您可以在 TN 单元格中输入任何值—0、100、无穷大—精度、召回率和 F1 值都不会改变。

作为练习,现在让我们翻转混淆矩阵。让我们认为“猫”是一个积极的类,也就是我们感兴趣的类。爱猫人士,欢喜!这是新的混淆矩阵。请记住,这是与之前的完全相同的分类器。

Cats are “positive”

快速计算显示,现在准确率为 33%,召回率为 25%,F1 得分为 29% —哎呀!我们的分类器在给猫分类方面很糟糕。让我们继续下去,看看整体的准确性——也许这将是我们的救赎。话说回来,也许不是。

准确(性)

准确度是被正确分类的样本的比例。让我们再次看看我们最初的混淆矩阵:

总共有(TP+FP)+(FN+TN)=20+4= 24 个样本,TP+TN= 19 被正确分类。因此,准确率达到了惊人的 79%。但是这是相当误导的,因为尽管 90%的狗被准确地分类,但是对猫来说只有 25%。如果你平均 90%和 25%,你会得到 57.5%的平均准确率,这比分类器的准确率 79%低得多。原因是什么?在我们的数据集中,狗的样本比猫的样本多得多。班级不平衡。

为了查看类别不平衡如何影响准确性,想象现在不是 4 张猫照片,而是我们有 100 组这 4 张照片,总共 400 张照片。由于我们使用相同的分类器,400 张照片中的 100 张将被正确分类,300 张将被错误分类。下面是相应的混淆矩阵:

So many cats!

快速计算表明,现在的准确度低得多(100+18)/(400+20)=28%,因为猫现在是多数类。新的类别比例也会影响精度(但不会影响召回率——检查!),因此 F1 的分数。

马修斯救援相关系数

到目前为止,我们已经看到了经典度量的一些问题:准确性对类别不平衡很敏感;精确度、召回率和 F1 分数是不对称的。那么该怎么办呢?如果对这两个类都感兴趣,可以将二进制分类问题视为具有两个类的多类问题,然后计算相应的多类度量:微观或宏观平均精度、召回率和 F1 分数。(要了解更多关于多级指标的信息,请查看我的多级指标简化版系列、第一部分第二部分;另外,请看我关于 kappa 分数的帖子,也被称为科恩的 kappa 系数

对于二进制分类,还有另一个(也可以说是更优雅的)解决方案:将真实类和预测类视为两个(二进制)变量,并计算它们的相关系数(以类似于计算任何两个变量之间的相关系数的方式)。真实值和预测值之间的相关性越高,预测就越好。这是应用于分类器时的φ系数 (φ),改名为马修斯相关系数 ( MCC) 。计算 MCC 不是火箭科学:

MCC 的一些好的性质可以容易地从这个公式中导出:当分类器是完美的(FP = FN = 0)时,MCC 的值是 1,表示完美的正相关。相反,当分类器总是误分类(TP = TN = 0)时,我们得到的值为-1,代表完美的负相关(在这种情况下,您可以简单地反转分类器的结果,以获得理想的分类器)。事实上,MCC 值总是在-1 和 1 之间,0 表示分类器不比一个公平硬币的随机投掷好。MCC 也是完全对称的,所以没有哪个类比另一个更重要;如果你转换正负,你仍然会得到相同的值。

MCC 考虑混淆矩阵中的所有四个值,并且高值(接近 1)意味着两个类别都被很好地预测,即使一个类别被不成比例地欠(或过)代表。

我们现在都准备好了!让我们为我们的原始分类器计算 MCC。这是混淆矩阵:

输入数字,我们发现:

哎哟!0.17 的相关性表示预测类和真实类是弱相关的。我们知道确切的原因。我们的分类器不擅长给猫分类。

最后,您不需要编写自己的 MCC 函数——它的已经包含在 scikit-learn 的中。下面是验证上述计算的代码片段:

就是这样。那是邮件。您现在拥有了另一个指标。明智地使用它!

希望你觉得这篇文章有趣、有用并且容易理解。

喊出蒂林娜 。正是由于他和他非常有用和优雅的 简单变形金刚 库,我接触到了这个度量。

最佳预测技术或如何根据时间序列数据进行预测

原文:https://towardsdatascience.com/the-best-forecast-techniques-or-how-to-predict-from-time-series-data-967221811981?source=collection_archive---------2-----------------------

时间序列预测在工业或商业的许多分支中有许多应用。它允许预测产品需求(从而优化生产和仓库存储),预测销售收入(调整公司开支)或预测股票价格的未来值。在本文中,我将尝试目前的基本方法来实现这一目标。我们将从描述最流行的模型开始,然后转移到模型评估,这表明了给定预测问题的最佳方法。

工具

有很多种软件可以用于时间序列预测——使用 Python、R、Matlab 和许多其他语言都可以轻松完成。在我们这里使用的 R 中,也有相当多的软件包使预测变得更简单,预测预言家,或者 xts ,这里仅举几个例子。包的完整列表及其描述可在时间序列 CRAN 任务视图中找到。

时间序列模型

在进入复杂的时间序列模型之前,我们将讨论一些简单的模型,它们构成了进一步预测的基础。如果一个复杂的方法不能提供更好的结果,那么使用它们是没有意义的。

  1. 平均值-预测值等于时间序列的平均值。
  2. Naive 预测值等于时间序列的最后一个值。
  3. 季节性简单预测-给定季节的预测值等于该季节前一个完整周期的值,例如,2019 年 1 月的预测值等于 2018 年 1 月的时间序列值。

图:航空公司月度乘客基线预测。

时间序列线性模型(TSLM)只是一个线性回归模型,它根据一些预测因素(最常见的是线性趋势和季节性)来预测所需的值:

yt =a1x1,t+a2x2,t+…+anxn,t+b+et,

其中 xi,t 是一些预测值, aib 是要估计的回归系数。两个最常用的预测指标是趋势和季节性。前者只是对数据的线性趋势进行建模,只有趋势预测值的模型可以写成:

yt = at +b+et。

季节性预测因子是虚拟变量,表示进行预测的时期(如月、季度)。

指数平滑是另一种预测时间序列的有用方法。基本思想是将时间序列的未来值预测为过去观测值的加权平均值,其中权重随时间呈指数下降-观测值越老,对预测的影响越小。该方法可以扩展到包括趋势(霍尔特的方法,又名双指数平滑)或趋势和季节性(霍尔特-温特斯方法)。在这些模型中,趋势和季节性系数也被计算为一些表达式的加权平均值。指数平滑法是预测时间序列的有效方法。基本思想是将时间序列的未来值预测为过去观测值的加权平均值,其中权重随时间呈指数下降:

yt = a yt-1+a(1-a)yt-2+a(1-a)2yt-3+…,

其中 a(0,1)是应该被估计的平滑参数。上述方法可以扩展到包括趋势(霍尔特的方法,又名双指数平滑)或趋势和季节性(霍尔特-温特斯的方法,又名三指数平滑)。在这些模型中,趋势和季节性系数也被计算为一些表达式的加权平均值。尽管这个想法很简单,但是公式更复杂,我们就不讨论技术细节了。感兴趣的读者可以参考 Hyndman 和 Athanasopoulos 的关于时间序列预测的书[1]。

(自回归综合移动平均)模型使用完全不同的方法。自回归( AR )部分考虑了先前值对预测值的影响:

yt=a1yt-1+a2yt-2+et,

而移动平均( MA )模拟噪声对未来值的影响。

yt=et+b1et-1+b2et-2,

其中 et 为随机噪声项。在上面的例子中,每个噪声项影响三个连续的 yt 值。实际上,这种噪声术语可能反映了一些意外事件,例如影响股票市场的政治家声明。

实际上,这种噪声术语可能反映了一些意外事件,例如影响股票市场的政治家声明。

AR 和 MA 模型可以简单地合并成 ARMA 模型,如下所示:

yt = et+b1et-1+b2et-2+a1yt-1+a2yt-2。

ARIMA 的集成部分对应的是 ARMA 模型如何拟合的技术问题。基本上,只有让它们符合平稳的时间序列才有意义。使非平稳数据平稳化的一种方法是从中减去滞后值(差值)。这就是 ARIMA 在拟合 ARMA 之前所做的——它对数据进行多次差分,直到得到足够平稳的数据。

图航空公司月度旅客预测。

评测

模型选择几乎是每个机器学习项目都会涉及到的问题。一种方法是将数据分成训练集和测试集,并在训练集上学习模型后在测试集上计算一些误差度量。然而,这个过程不同于机器学习中经常使用的随机训练测试分割。有了时间序列数据,我们不能简单地选择随机点,而是将一些分割点之前的所有观察值放入训练集,其余的放入测试集。这反映了我们的模型在现实中的应用——我们从历史数据中学习,然后预测未来。

另一种方法是使用时间序列交叉验证(也称为滚动预测起源过程)——我们创建许多具有不同分割点的训练测试分割,然后在每个分割上评估模型。

自然出现的问题是,我们应该使用什么样的指标来判断模型的表现。最受欢迎的是

  • 平均绝对误差,它表明我们的预测平均与真实值相差多少,
  • 平均绝对百分比误差,表示预测值与真实值相差的百分比。

结论

我们已经解释了时间序列预测的基础知识。显然,每个问题都有自己的微妙之处,需要特殊的步骤(例如适当的数据准备,处理缺失值的方式,或者定义满足某些业务条件的评估指标),因此不可能得出一个通用的方法。我们刚刚介绍了预测背后的核心思想。

[1] Hyndman,R. J .,& Athanasopoulos,G. (2018)。预测:原理与实践。OTexts。

保存熊猫数据的最佳格式

原文:https://towardsdatascience.com/the-best-format-to-save-pandas-data-414dca023e0d?source=collection_archive---------0-----------------------

将 pandas 数据帧序列化到持久存储的各种方法的比较

当从事数据分析项目时,我通常使用Jupyter笔记本和一个很棒的pandas库来处理和移动我的数据。对于中等大小的数据集,这是一个非常简单的过程,您可以将其存储为纯文本文件,而不会有太多的开销。

但是,当数据集中的观察值很多时,保存数据和将数据加载回内存的过程会变得更慢,现在每个内核的重新启动都会占用您的时间,迫使您等待数据重新加载。因此,最终,CSV 文件或任何其他纯文本格式都失去了吸引力。

我们可以做得更好。有大量的二进制格式来存储磁盘上的数据,其中许多是pandas支持的。我们如何知道哪一个更适合我们的目的?嗯,我们可以尝试其中的几个,比较一下!这就是我在这篇文章中决定做的:通过几种方法将pandas.DataFrame保存到磁盘上,看看哪种方法在 I/O 速度、消耗的内存和磁盘空间方面更好。在这篇文章中,我将展示我的小基准测试的结果

Photo by Patrick Lindenberg on Unsplash

要比较的格式

我们将考虑以下存储数据的格式。

  • 纯文本 CSV —数据科学家的老朋友
  • pickle——Python 序列化事物的方式
  • message pack——它像 JSON,但是又快又小
  • HD F5—一种旨在存储和组织大量数据的文件格式
  • 羽化 —一种快速、轻量且易于使用的二进制文件格式,用于存储数据帧
  • Parquet—Apache Hadoop 的柱状存储格式

当你做一些数据分析工作时,它们都被广泛使用(可能除了 MessagePack)并且经常遇到。

选择的指标

为了找到存储笔记本会话之间数据的最佳缓冲格式,我选择了以下指标进行比较。

  • size_mb —带有序列化数据帧的文件的大小(Mb)
  • save_time —将数据帧保存到磁盘上所需的时间
  • load_time —将之前转储的数据帧加载到内存中所需的时间
  • save_ram_delta_mb —数据帧保存过程中的最大内存消耗增长
  • load_ram_delta_mb —数据帧加载过程中的最大内存消耗增长

请注意,当我们使用高效压缩的二进制数据格式(如 Parquet)时,最后两个指标变得非常重要。它们可以帮助我们估计加载序列化数据所需的 RAM 数量,此外还有数据本身的大小。我们将在接下来的章节中更详细地讨论这个问题。

基准

我决定在测试中使用合成数据集,以便更好地控制序列化的数据结构和属性。此外,我在基准测试中使用了两种不同的方法:(a)将生成的分类变量保存为字符串,以及(b)在执行任何 I/O 之前,将它们转换为pandas.Categorical数据类型。

函数generate_dataset展示了我是如何在基准测试中生成数据集的。

CSV 文件保存和加载的性能作为基准。五个随机生成的百万次观察的数据集被转储到 CSV 中,并被读回到内存中以获得平均指标。每种二进制格式都在 20 个随机生成的具有相同行数的数据集上进行了测试。数据集由 15 个数值特征和 15 个分类特征组成。您可以在这个资源库中找到带有基准测试功能的完整源代码。

(a)作为字符串的分类特征

下图显示了每种数据格式的平均 I/O 时间。一个有趣的观察是hdf显示了比csv更慢的加载速度,而其他二进制格式表现明显更好。印象最深的两个是featherparquet

保存数据和从磁盘读取数据时的内存开销如何?下一张图片显示hdf再次表现不佳。果然,csv不需要太多额外的内存来保存/加载纯文本字符串,而featherparquet彼此非常接近。

最后,让我们看看文件大小。这次parquet显示了一个令人印象深刻的结果,考虑到这种格式是为了高效存储大量数据而开发的,这并不奇怪。

(b)转换的分类特征

在上一节中,我们没有尝试有效地存储我们的分类特征,而是使用普通字符串。我们来修正这个疏漏吧!这次我们使用专用的pandas.Categorical类型,而不是普通的字符串。

看看它现在和纯文本csv相比是什么样子!现在所有的二进制格式都显示了它们的真正威力。基线远远落后,所以让我们把它去掉,以便更清楚地看到各种二进制格式之间的差异。

featherpickle显示出最佳的 I/O 速度,而hdf仍然显示出明显的开销。

现在是时候比较数据流程加载期间的内存消耗了。下面的条形图显示了我们之前提到的关于拼花地板格式的一个重要事实。

只要占用磁盘上的一点空间,就需要额外的资源来将数据解压缩回数据帧。您可能无法将文件加载到内存中,即使它需要永久存储磁盘上的中等容量。

最后一幅图显示了这些格式的文件大小。所有格式都显示出良好的效果,除了hdf仍然比其他格式需要更多的空间。

结论

正如我们的小测试所显示的,似乎feather格式是存储 Jupyter 会话之间数据的理想选择。它显示出很高的 I/O 速度,不会占用太多的磁盘内存,并且在加载回 RAM 时不需要任何拆包。

当然,这种比较并不意味着您应该在每种可能的情况下都使用这种格式。例如,feather格式预计不会用作长期文件存储。此外,它没有考虑到所有可能的情况,当其他格式可以显示他们最好的。然而,对于本文开头所述的目的来说,这似乎是一个极好的选择。

你对 Python 语言感兴趣吗?离不开机器学习?看过网上的其他东西吗?

那么你可能会对我的博客 感兴趣,我的博客 讨论了各种编程话题,并提供了我感兴趣的教科书和指南的链接。

最佳免费数据科学电子书

原文:https://towardsdatascience.com/the-best-free-data-science-ebooks-b671691e5231?source=collection_archive---------1-----------------------

有些包括代码和练习

被困在付费墙后面?给我发个 tuit 到我会 dm 你我的好友链接。

这 25 本书集中的每一本书都是由数据科学领导者、导师、指导者推荐给我的,或者是我在某个特定项目上向他们寻求帮助。希望对你有帮助!

Python 是我的首选编程语言,这也是为什么大多数书籍都是基于 Python 的编程,但是如果你有其他语言的其他书籍的推荐,请在评论中分享它们,或者 给我发一条 tweet ,我会添加它们。

数学和统计学

  • 统计学习导论作者:Gareth James、Daniela Witten、Trevor Hastie 和 Robert Tibshirani。

* [## 统计学习导论

加雷思·詹姆斯、丹妮拉·威滕、特雷弗·哈斯蒂和罗伯特·蒂布拉尼家中的应用程序

faculty.marshall.usc.edu](http://faculty.marshall.usc.edu/gareth-james/ISL/)

描述:本书提供了统计学习方法的介绍。它面向非数学科学领域的高年级本科生、硕士生和博士生。这本书还包含一些 R labs,详细解释了如何在现实生活中实施各种方法,应该是数据科学家的宝贵资源。

  • 艾伦·b·唐尼的《T21》

[## 想想统计 2e

艾伦·b·唐尼。下载 PDF 格式的这本书。代码示例和解决方案可从这个 GitHub 资源库获得…

greenteapress.com](https://greenteapress.com/wp/think-stats-2e/?source=post_page-----2d4f32793a51----------------------)

描述:Think Stats 强调你可以用来探索真实数据集和回答有趣问题的简单技术。这本书介绍了一个使用美国国立卫生研究院数据的案例研究。鼓励读者使用真实数据集进行项目工作。

  • 加雷斯·詹姆斯、丹妮拉·威滕、特雷弗·哈斯蒂和罗伯特·蒂布拉尼的《统计学习的要素》

[## 统计学习的要素:数据挖掘、推理和预测。第二版。

编辑描述

web.stanford.edu](https://web.stanford.edu/~hastie/ElemStatLearn/)

描述:虽然这种方法是统计学的,但重点是概念而不是数学。给出了许多例子,大量使用了彩色图形。对于统计学家和任何对科学或工业中的数据挖掘感兴趣的人来说,它应该是一个有价值的资源。这本书的覆盖面很广,从监督学习(预测)到非监督学习。许多主题包括神经网络、支持向量机、分类树和 boosting——这是任何书籍中第一次全面讨论这一主题。

  • 艾伦·b·唐尼使贝叶斯统计变得简单

[## 想想贝叶斯

贝叶斯统计变得简单。阅读 HTML 中的思维贝叶斯。顺序思考…

greenteapress.com](https://greenteapress.com/wp/think-bayes/)

描述:大多数关于贝叶斯统计的书籍使用数学符号,并以数学概念如微积分的形式提出观点。这本书用 Python 代码代替数学,用离散逼近代替连续数学。结果,数学书上的积分变成了求和,大多数概率分布的运算都是简单的循环。

  • 概率编程&黑客的贝叶斯方法作者:Cam Davidson-Pilon

[## 黑客的贝叶斯方法

贝叶斯方法是推理的自然方法,但它隐藏在慢…

camdavidsonpilon.github.io](http://camdavidsonpilon.github.io/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers/)

描述:面向黑客的贝叶斯方法旨在从计算/理解第一,数学第二的角度介绍贝叶斯推理。当然,作为一本入门书,我们也只能到此为止:一本入门书。对于受过数学训练的人来说,他们可能会对这篇文章产生的好奇心和其他用数学分析设计的文章产生兴趣。对于数学背景较少的爱好者或对数学不感兴趣而只是简单地练习贝叶斯方法的人来说,这篇文章应该是足够的和有趣的。

  • 布拉德利·埃夫隆和特雷弗·哈斯蒂的《计算机时代的统计推断》

[## 计算机时代的统计推断:算法、证据和数据科学

21 世纪见证了统计方法在范围和影响上惊人的扩张…

web.stanford.edu](http://web.stanford.edu/~hastie/CASI/)

描述:这本书带领我们经历了 20 世纪 50 年代引入电子计算后的数据分析革命。从经典推理理论开始——贝叶斯、频率主义者、费雪主义者——个别章节讨论了一系列有影响的主题:生存分析、逻辑回归、经验贝叶斯、折叠刀和自助、随机森林、神经网络、马尔可夫链蒙特卡罗、模型选择后的推理,等等。这本书将方法论和算法与统计推断相结合,并以对统计学和数据科学的未来方向的推测结束。

分析

  • Jeffrey Leek 的《数据分析风格的要素》

[## 数据分析风格的要素

想要分析数据的人的指南。免费!数据分析既是科学,也是艺术。这本书是…

leanpub.com](https://leanpub.com/datastyle)

描述:这本书关注的是数据分析的细节,这些细节有时会被传统的统计学课程和教科书遗漏。这本书作为数据科学或数据分析的入门课程的伴侣是有用的。对于负责阅读和评论数据分析的人来说,它也是一个有用的参考工具。

数据挖掘

  • Ron Zacharsk 的《数据挖掘程序员指南》

[## 古老的数字艺术

第 1 章:简介 2:推荐系统 3:基于项目的过滤 4:分类 5:关于分类的更多内容…

guidetodatamining.com](http://guidetodatamining.com/)

描述:如果你是一个对学习一点数据挖掘感兴趣的程序员,你可能会对初学者实践指南感兴趣。这就是这本书所提供的。本指南遵循边做边学的方法。

  • 社交媒体挖掘剑桥大学出版社

[## 下载图书

《社交媒体挖掘》一书由剑桥大学出版社于 2014 年出版。请查看剑桥大学的网页…

dmml.asu.edu](http://dmml.asu.edu/smm/book/)

描述:社交媒体挖掘集成了社交媒体、社交网络分析和数据挖掘,为学生、从业者、研究人员和项目经理了解社交媒体挖掘的基础和潜力提供了一个方便和连贯的平台。它介绍了由社交媒体数据产生的独特问题,并提出了网络分析和数据挖掘的基本概念,新出现的问题和有效的算法。适合用于先进的本科和研究生开始课程以及专业短期课程,文本包含不同难度的练习,以提高理解,并有助于在社交媒体挖掘的各种场景中应用概念,原则和方法。

数据科学的非技术性介绍

  • 数据科学的艺术Roger d . Peng 和 Elizabeth Matsui

[## 数据科学的艺术

这本书描述了分析数据的过程。作者有丰富的经验,既管理数据分析师…

leanpub.com](https://leanpub.com/artofdatascience)

描述:这本书描述了分析数据的过程。作者在管理数据分析师和进行他们自己的数据分析方面都有丰富的经验,这本书是他们经验的精华,适用于数据科学的从业者和管理者。

  • 数据科学手册作者:卡尔、马克斯、亨利和威尔

[## 数据科学手册

查看数据科学手册!帕兰蒂尔优步顶尖数据科学家的采访汇编…

www.thedatasciencehandbook.com](https://www.thedatasciencehandbook.com/)

描述:《数据科学手册》汇集了对 25 位杰出数据科学家的深度采访,他们在其中分享了自己的见解、故事和建议。

  • Roger D. Peng 和 Hilary Parker 关于数据科学的对话

[## 数据科学对话

罗杰·彭和希拉里·帕克在 2015 年创办了“不那么标准偏差”播客,专门讨论…

leanpub.com](https://leanpub.com/conversationsondatascience)

描述:Roger Peng 和 Hilary Parker 在 2015 年创建了“不那么标准偏差”播客,该播客致力于讨论学术界和工业界数据科学家的背景故事和日常生活。这本书收集了他们关于数据科学以及它在现实世界中如何工作(有时不工作)的许多对话。

面向数据科学的 Python 编程

  • Ashwin Pajankar 和 Sushant Garg 的 Python 面向对象编程(图片不匹配,但链接正确)

[## 用 Python 进行面向对象编程

这本书是 Python 3 面向对象编程的简单而权威的指南。其他类似的书…

leanpub.com](https://leanpub.com/PythonOOP)

描述:这本书是 Python 3 面向对象编程的简单而权威的指南。其他类似类型的书籍利用复杂的写作风格和例子向读者介绍 Python 3 中的 OOP。然而,这本书用简单的语言来解释概念。它面向已经了解 Python 的中级学习者。

  • 用 Python 自动化枯燥的东西作者:Al Sweigart

[## 用 Python 自动化枯燥的东西

完全初学者实用编程。作者阿尔·斯威加特。如果你曾经花了几个小时重命名文件或…

automatetheboringstuff.com](https://automatetheboringstuff.com/)

描述:你将学习如何使用 Python 编写程序,在几分钟内完成手工需要几个小时才能完成的事情——不需要任何编程经验。一旦你掌握了编程的基础知识

  • 杰克·范德普拉斯的《Python 数据科学手册》

[## Python 数据科学手册

对于许多研究人员来说,Python 是一流的工具,这主要是因为它的库用于存储、操作和…

shop.oreilly.com](http://shop.oreilly.com/product/0636920034919.do)

描述:熟悉阅读和编写 Python 代码的工作科学家和数据处理人员会发现这份全面的案头参考非常适合处理日常问题:操纵、转换和清理数据;可视化不同类型的数据;并使用数据建立统计或机器学习模型。很简单,这是 Python 中科学计算的必备参考。

  • 学 Python,破 Python 作者斯科特·格兰特

[## 学 Python,破 Python

学习 Python,Break Python 是一个关于 Python 编程语言的实践性介绍,是为那些已经…

learnpythonbreakpython.com](https://learnpythonbreakpython.com/)

简介:学习 Python,突破 Python 从温和的编程入门开始。慢慢地,通过例子和练习,我们引入了更复杂的程序元素,并展示了它们可以用在哪里,以及我们如何破坏它们,从而达到了一个舒适的水平。通过以这种方式积累知识,我们希望给予你一定程度的舒适,让你在尝试新事物和冒险时感到舒适;简而言之,我们希望你能熟练编程。

  • Steven Bird、Ewan Klein 和 Edward Loper 的《Python 的自然语言处理》

[## NLTK 图书

Steven Bird、Ewan Klein 和 Edward Loper 这本书的 NLTK 版本针对 Python 3 和 NLTK 3 进行了更新。第一个…

www.nltk.org](https://www.nltk.org/book/)

描述:这本书提供了自然语言处理的简单介绍,该领域支持多种语言技术,从预测文本和电子邮件过滤到自动摘要和翻译。通过它,您将学习如何编写处理大量非结构化文本的 Python 程序。您将使用广泛的语言数据结构访问丰富的注释数据集,并且您将理解用于分析书面交流的内容和结构的主要算法。

  • 生产中的数据科学本·G·韦伯著

[## 生产中的数据科学

从初创公司到数万亿美元的公司,数据科学在帮助组织最大化…

leanpub.com](https://leanpub.com/ProductionDataScience)

描述:从初创公司到价值数万亿美元的公司,数据科学在帮助组织最大化其数据价值方面发挥着重要作用。本书面向希望在多个云环境中构建数据产品并培养应用数据科学技能的分析从业者。

  • 数据驱动主持人希拉里·梅森,DJ 帕蒂尔

[## 数据驱动

成功处理数据不仅仅是把 Hadoop 放在你的机房里,或者雇佣一些疯狂的物理学家…

www.oreilly.com](https://www.oreilly.com/library/view/data-driven/9781491925454/)

描述:谷歌、LinkedIn 和脸书如何使用他们的数据的例子,以及沃尔玛、UPS 和其他组织在大数据出现之前如何利用这一资源的例子。无论你如何处理,建立数据文化是 21 世纪成功的关键。

机器学习

  • 用 Scikit-Learn 和 TensorFlow
    进行机器实践学习

[## ageron/handson-ml

这个项目旨在教你 python 中机器学习的基础。它包含示例代码和…

github.com](https://github.com/ageron/handson-ml)

描述:作者 Aurélien Géron 通过使用具体的示例、最小化理论和两个生产就绪的 Python 框架——scikit-learn 和 tensor flow——帮助您直观地理解构建智能系统的概念和工具。您将学习一系列技术,从简单的线性回归开始,逐步发展到深度神经网络。

  • 理解机器学习:从理论到算法

https://www . CSE . huji . AC . il/~ shais/understanding machine learning/index . html

描述:这些包括学习的计算复杂性以及凸性和稳定性概念的讨论;重要的算法范例包括随机梯度下降、神经网络和结构化输出学习;以及新兴的理论概念,如 PAC-Bayes 方法和基于压缩的界限。

  • 强化学习:理查德·萨顿
    和安德鲁·巴尔托
    的介绍

[## 强化学习:导论

从亚马逊购买勘误表和说明完整的 Pdf 格式,没有利润代码解决方案-发送您的解决方案中的一章,获得…

incompleteideas.net](http://incompleteideas.net/book/the-book.html)

描述:在《强化学习》中,理查德·萨顿和安德鲁·巴尔托对该领域的关键思想和算法提供了清晰而简单的描述。这第二版已经被显著地扩展和更新,提出新的主题和更新其他主题的范围。

  • 深度学习麻省理工学院出版社出版

[## 深度学习

深度学习教材是一个资源,旨在帮助学生和从业人员进入机器领域…

www.deeplearningbook.org](http://www.deeplearningbook.org/)

描述:深度学习教材是一种资源,旨在帮助学生和从业者进入一般的机器学习领域,特别是深度学习领域。

  • 机器学习向往 by deeplearning.ai

[## 机器学习向往- deeplearning.ai

人工智能正在改变众多行业。来自吴恩达的免费电子书《机器学习向往》教你如何…

www.deeplearning.ai](https://www.deeplearning.ai/machine-learning-yearning/)

描述:人工智能正在改变无数的行业。来自吴恩达的免费电子书《机器学习向往》教你如何构建机器学习项目。这本书的重点不是教你 ML 算法,而是如何让 ML 算法工作。

数据可视化

  • 马尔科姆·麦克莱恩的《D3 技巧和诀窍》

[## D3 技巧和窍门 v3.x

超过 600 页的使用 d3.js 的提示和技巧,D3 . js 是领先的 web 数据可视化工具之一。这是……

leanpub.com](https://leanpub.com/D3-Tips-and-Tricks)

描述:超过 600 页的使用 d3.js 的提示和技巧,D3 . js 是领先的 web 数据可视化工具之一。它旨在让你开始并推动你前进。包括 50 多个可下载的代码示例。

有没有另一本电子书必须在这个列表中?在评论里分享给我我会补充的!*

学生和教育工作者最好的免费笔记软件!—视频

原文:https://towardsdatascience.com/the-best-free-note-taking-software-for-students-and-educators-video-ce8366d18b55?source=collection_archive---------15-----------------------

Notion for Educators Video

问题是

我经常回想起我读完本科时学习有多差;在不理解讲师所说的任何内容的情况下做笔记,并一遍又一遍地重写笔记,希望其中一些内容能被理解。

如今,笔记软件的进步极大地改善了学生记录和组织笔记的方式。然而,教育工作者仍然经常以“讲座内容到个人笔记”的静态格式提供内容。人们认为,理解和运用好的学习理念,剖析教育者提供的内容,是每个学生的个人责任。但是这是为什么,为什么教育工作者(总的来说)没有改变他们提供课程的媒介?

在与研究同事讨论过这个问题后,似乎有几个基本问题促使他做出改变:

  1. 向学生提供内容的网站是有限的(例如黑板),并且只能允许静态的。pdf 文件
  2. 学生的参与度很低,因此对教育工作者来说益处并不明显
  3. 它与作为大学课程基本组成部分的授课形式相一致

然而,我认为现在比以往任何时候都有机会更新向学生提供内容的格式基准。特别是依赖于代码/编程的课程,它们将从更具互动性的学习过程中受益。

概念总结

为此,我想介绍一下概念,这是一个笔记应用程序,它集成了许多功能,使其成为这些问题的强大解决方案。此外,个人计划现在对学生和教育工作者完全免费,而其他解决方案可能很难证明其成本合理或为商业团队设计。

简而言之,主要优势是:

  1. 用 LaTeX(数学)和代码块做笔记
  2. 任务和项目管理
  3. 知识库可以用表格建立,并可以在线参考
  4. 导出到。pdf 和。csv 文件
  5. 带通知的桌面和移动应用程序
  6. 每页上的讨论和评论
  7. 嵌入功能的综合列表

上面的演示视频更详细地展示了这些为学生构建内容的功能。这是对前一篇文章“ 数据科学研究项目的最佳笔记/任务管理应用 ”的直接跟进,该文章展示了如何将概念用于个人项目。

我还应该指出,我与概念的创造者没有任何关系,我只是对教育和新工具充满热情。

如果您想注册试用该应用程序,请使用下面的链接:

[## 为您的笔记、任务、维基和数据库提供一体化的工作空间——概念

注册时获得 10 美元的信用点数

www . opinion . so](https://www.notion.so/?r=d322470fd7fc4f61a29918c476cc9c81)

谢谢

英国货币

最周密的计划

原文:https://towardsdatascience.com/the-best-laid-plans-7eb3a22ffbc1?source=collection_archive---------21-----------------------

设计和数据可视化

想象也门的隐形战争

Commemorative stamp, Mutawakkilite Kingdom of Yemen, 1965

此片改编自我于 2019 年 6 月 20 日在微软反应堆伦敦举行的可视化数据会议上发表的一篇 演讲

我经历了一次奇怪的数据新闻之旅。事情大概是这样的——五年前,我被盒子包围着,结束了我作为 Embarq 的设计顾问的角色,Embarq 是班加罗尔的一个可持续交通和研究实验室。四年前,我在温莎城堡看女王私人收藏的波斯手稿——我暂时离开了设计行业,在库陶尔德攻读艺术史硕士学位,专攻波斯艺术。三年前,我住在一个手提箱里,开始了我在伦敦的第一份工作,在小型媒体基金会(Small Media Foundation)工作,这是一家与中东民间社会组织合作的媒体和研究实验室。两年前——更多的箱子,更多的手提箱,更多的移动——但现在我正在贝鲁特帮助组织一个 DATA4CHANGE 工作坊,为那些不熟悉 DATA4CHANGE 的人准备——data 4 change 是一个工作坊,它将设计师和开发者以及人权组织聚集在一起,发起宣传活动。最后,我们来到一年前,当时我正在完成也门和平项目和 DATA4CHANGE 的一个项目,致力于可视化也门的隐形战争 ,这是我们去年 12 月启动的项目。这样一来,我就可以直接进入项目,了解相关的过程,它是如何发展的,以及最终的结果

该项目的最初想法来自于 2016 年贝鲁特的 DATA4CHANGE 研讨会,我作为参与者参加了该研讨会。

Cover image

仅提供一些背景信息——2015 年,也门总统在一场政变中被推翻,自那以来,由沙特阿拉伯领导的国际联盟支持的政权与美国政府支持的北也门激进组织之间一直在进行内战。如果你真的想要所有的细节,你可以访问项目链接——正如我希望解释的那样,我们已经做了一些非常好的事情,使数据更容易访问。

我们使用了一个数据集,记录了也门的空袭数量以及目标地点的类型、地点和时间。

A screen grab of the data we were working with

我们在 2016 年研讨会期间使用的初始数据集记录了从 2015 年 3 月到 2016 年 8 月的空袭,这是整个国家近 18 个月的无休止空袭。最初,这个项目进展相当缓慢。在 2016 年的研讨会之后,我们在 2017 年底重启了该项目。该项目旨在与带来数据集的原始组织合作,创建一个互动故事,描绘也门三个主要城市的空袭地图和对居民的视频采访。

但是这个项目经历了许多实施过程。2018 年 3 月,在恢复该项目六个月后,我们的主要合作伙伴——一对来自也门的记者和电影制作人——由于个人原因不得不退出。这对他们来说是不幸的,对我们来说是令人沮丧的。这意味着要么取消项目。又来了。或者迅速找到一个新的合作伙伴,重新调整他们的时间表和目标,同时确保已经完成的工作没有浪费,同时仍然给他们足够的空间来发挥创造性的领导作用。没什么大不了的。

令人欣慰的是,离职的组织在电子邮件和半提及中留下了一些线索,让我们相当容易地找到了新的合作伙伴。

2018 年 9 月,我们与一家总部位于 DC 的倡导组织合作,该组织专门致力于也门事务和美也关系。这是幸运的一击!这确实意味着尽管整个项目的想法改变了。。。

与此同时,我经历了十几轮的数据更新、整理和清理。在早期,我在管理项目时努力跟上快速更新的数据集。

我们得到的第一个数据集记录了 2015 年 3 月至 2016 年 8 月的空袭。当我们在 2017 年底重新启动该项目时,数据集已经增长到 15846 行,并详细列出了从 2015 年 3 月到 2017 年 12 月的空袭,这是 28 个月的空袭数据。然后我们得到了另一个更新的版本,记录了截至 2018 年 3 月的空袭-这意味着我们正在处理 33 个月的空袭数据-这几乎是三年,你可以在那段时间开始并完成你的本科学位-可悲的是,冲突仍在继续。随着项目工作的进展,数据集再次更新,以包括截至 2018 年 8 月的记录——所以这又是八个月——这是一个实习!2018 年 12 月,当我们发布这个故事时,数据有 18714 行,记录了截至 2018 年 11 月 5 日的空袭。这意味着最终的故事比实时数据少了大约六周。

为了补充数据集,我和一些同事搜集了各省的地理空间坐标以及最近记录的人口。这意味着我们现在可以在地图上找到三年来的空袭数据。老实说,我们当时可能已经停止了……这本身就是一个令人信服的故事。但是我们没有。

然后我定位并添加了被轰炸的特定地点的卫星图像。

这是一个重要的视觉效果,提醒我们和用户,数据集中的数字是真实的人和真实的地方。

Sana’a International Airport

在从事这项工作并于 2018 年 9 月与也门和平项目合作的同时,他们告诉我们,他们希望在参众两院提交要求结束空袭行动或至少结束美国参与其中的立法之前,将此作为游说和告知 DC 代表、读者和关键决策者的工具。这些动议将在 11 月至 1 月间提出。我们很快就收到了行动号召和迫在眉睫的最后期限!

错误的开始和起伏确保了在这个阶段我没有这个项目的视觉形象,或者任何实质性的设计工作,更不用说精确的可视化了。

如果你还没有注意到的话,我努力成为事实上的数据集专家,管理项目,同时作为设计者并致力于数据可视化。作为一名设计师,我习惯以“你知道什么是很酷的尝试”开始,等待项目经理说“是的,让我们尝试一下,但是它是可扩展的吗,我们能在时间表内完成吗? “你为什么用那种字体”…我不得不与自己进行太多这样的对话,最终有点累了——所以如果你认为这篇文章可能是关于我展示一些超级酷的高科技可视化,我很抱歉给你带来了坏消息——主要是我抱怨这有多困难。

所以在这个阶段,我有一个选定的格式——一个长篇故事,我有一个干净和最新的数据集,我有一个行动呼吁,要求其读者写信给他们的当地代表,要求就立法采取行动,这显然是一个截止日期,但我仍然不完全相信我迄今为止尝试的数据可视化,以及它们是否符合我们决定的方向。

我最初摆弄原始图形——一个开源数据可视化框架——我们有一些很有潜力的有趣的输出。

Bee swarm graph

我用蜂群图绘制了按目标分类的空袭。我非常喜欢这个画面,以及如何用密集的点来表示空袭的数量。

然后,我用桑基图显示空袭次数多的省份,以及哪些地点成为目标。稍加努力,就能写出一个故事,但这不是最鼓舞人心的选择。

Sankey graph

我也在努力嵌入这些视觉化的东西,非常想念隐藏在桑基图的每一条线或蜜蜂群的每一个点下的额外信息。它也非常慢,数据集太重,对于这个平台来说不是一个可行的选择。另外,每次数据集添加新行时,我几乎不能更新它。

这时我想起了 Tableau——我几乎没用过它——我有点害怕用它!这是我第一次认真地使用 Tableau 这样的野兽,有一个陡峭的学习曲线。更糟糕的是,我有一个很紧的截止日期——在方向改变后,整个项目必须在 3 个月内启动并运行——必须在关键立法到达参议院之前完成。

我很快就爱上了 Tableau。对于我们需要用数据集实现的视觉效果来说,这是绝对完美的。不透明的界面成了我的朋友,不断登录以保存文件,当然我可以习惯这一点——我现在所要做的就是快速创建一个可视化,可能有助于游说参议员和众议员结束也门战争。没有压力。

我非常想试试我们收集的坐标数据。在最初努力将其与主数据集合并后…

也门有 21 个省,每个省至少有五种不同的拼法。慢慢地,但肯定地,我设法用正确的坐标排列好一切,并将数据集导入 Tableau。

现在我想要一张地图。因此,在导入数据后,摆弄一些设置,我想象的最基本的设置,并设法创建一个三年空袭数据的回放。颜色的强度是最近的……变成白色,圆圈的大小代表在那个特定位置的撞击次数。

Screen grab of the map with air strike data being played

然后,我尝试了一个更经典的时间线,其中每个点都是按目标类型分类的空袭次数,并用颜色编码。

看到它变得栩栩如生——能够与数据互动——真是太棒了,但每次我想起那个数据集是关于什么的,我都感到害怕。

然后,我用一个树状图来查看哪种类型的建筑或地区遭到了最多的空袭。确切地告诉我这一点是很好的,但是提供不充分的信息会占用很多空间。你还必须记住,许多空袭目标是未知的,当你在图表中看到未知的时候,兴趣就会减弱…但是未知目标的数量如此之多,你肯定不能忽视它们,这是一个很好的平衡…

按照叙述的方式,我们有理由创建一个网站,在那里可以快速访问大量数据——一个页面可以提供数据集的概览,同时还可以提供细节——这样的东西在与参议员、众议员和其他官员交谈时会很有用。我们真的需要能够快速有效地传达我们的信息——这就是我决定创建一个仪表板的原因。

这个仪表板可以连接到一个动态表,并不断更新-解决快速增长的数据集的问题。它可以快速地给人们提供具体的数字,比如目标、空袭次数以及这些年的进展。它还可以用来创作几十个故事,任何人都可以从这里开始寻找有关也门空袭的信息。

为了到达仪表板,我回到了时间线——第一个版本是正确的,但是我把它进一步分解了。

我创建了一个精细的时间表,其中每一天都是可见的,每个方块的大小代表当天空袭的次数,颜色表示类别的类型。

The granular timeline

我决定将仪表板嵌入到文章的末尾——如果有人正在阅读这个故事,他们可以从导航中选择它,或者如果他们没有失去兴趣,他们会自然得到它。如果它被用来游说特定的个人,那么即使是正确视图的屏幕截图也会有助于激起某人的兴趣。

在叙事本身,我想包括较小的咬大小的图形。这些视觉化很大程度上是两页的内容,我将它们提取出来并放入 excel,然后允许我进行两次视觉化。

第一份记录了美国出售的武器和装备的种类以及由此带来的经济收益。

这一画面很重要,它显示了也门冲突对美国经济有多么有利可图,这不仅仅是对联盟领导人天真的错误信任。

第二个互动图形更详细地显示了 2015 年至 2018 年对民用场所的空袭次数,显示了空袭异常激烈的时期。

有了主内容中的这两个迷你可视化,我可以返回到仪表板。

在仪表盘中,我添加了一个摘要数字,增加了一些选项,用户可以选择年份,按类别过滤,悬停并获得详细信息,在获得概览的同时突出显示特定事件,然后最后添加注释,虽然不是最优雅的,但足以添加更多背景信息,突出显示媒体报道的特定事件和时刻,或者关于也门冲突的关键决策是何时做出的。

一旦我们有了一个可用的仪表盘,我就制作了一个带有相关断点的移动和平板版本的可视化。

我们有一个可行的故事!!

这个故事是建立在速记的基础上的,一旦我设法获得足够的数据,视觉语言开始成形。

这个故事很大程度上是关于美国对也门的政策,非常详细地描述了视觉语言、图形、颜色、字体和照片…

就竞选以来形势的发展而言:2018 年 12 月,参议院通过了一项重要决议,限制美国对沙特联盟的支持——这项决议于今年 4 月在众议院获得通过,但不幸的是,也许可以预见的是,特朗普阻止了这项决议。

这将是一项正在进行的工作。尤其是在冲突持续的时候。

您可以在 tableau 网站这里查看仪表盘,在这里查看故事

如果有人想访问数据或工作簿,请随时联系!

数据科学研究项目的最佳笔记/任务管理器应用程序

原文:https://towardsdatascience.com/the-best-note-taking-task-manager-app-for-data-science-research-projects-ddc82afaa509?source=collection_archive---------6-----------------------

概念 起初看起来像任何其他笔记应用程序,但很快就变得很明显,其中的一些功能使它脱颖而出。

这是我发现的第一款将笔记、任务管理和项目规划以惊人的方式结合在一起的应用。最重要的是,没有任何功能被锁定在付费墙后面。我仍在学习使用所有的功能,但我想展示它是如何帮助我改进我的研究项目的。

Source: Verge

到目前为止我发现的最好的特性:

  • 支持 LaTeX 数学和代码单元格的 Markdown 注释
  • 可用于任务管理、会议日志和文件存档
  • 我见过的做这么多事情的最好的定价模型
  • 文献综述/参考表格的多种格式
  • 页面和内容可以链接,这是惊人的跟踪参考和来源!

只是要注意,我没有任何方式附属于该应用程序,只是有人对一些独特的功能感到兴奋。除了用文字展示之外,我还通过视频展示了这一点。我是第一次以这种方式展示,所以感谢任何反馈。 显示的模板可在此处公开获取。

关键特征

1.减价说明

不同于一些为作者创建的编辑器,笔记可以用 markdown 编写,这包括 LaTeX math 和 code 单元格。其他嵌入也可以包括谷歌地图,推文,Github 回购,视频和更多!

Markdown Page Demo

2.任务管理

检查表可用于跟踪项目中要完成的任务。我还利用了一个存档,其中保存了所有已完成的任务,以便在稍后召开回顾会议时,我可以轻松演示我完成的每项任务。

Task Management

Archiving Tasks

3.文献综述、参考文献和链接页面

concept 最好的特性之一是,我可以用它来跟踪我对一个项目的各种格式的所有引用。我总是发现一个简单的表格(例如使用 Excel)可能是有效的,但有时它有助于以董事会的方式查看它。

此外,我可以添加标签,用于跟踪论文的主题、提交的出版物和参考类型(如文章、书籍、链接等)。然后,这些标签可以用于过滤或排序,这可以更容易地找到我需要的特定部分的资源。

最后,通过给每个引用一个“引用标签”,我们可以在其他地方的文本中链接这些引用。这个链接是内嵌的,但也可以打开来显示参考的完整信息,包括我做的任何笔记。这可以用于我创建的任何内容,包括其他笔记、会议和文件。

Reference Table

Reference as Gallery View

Inline Reference with Page Link

这些仅仅是使 idea 脱颖而出的主要特性,但还有更多,我建议你亲自尝试一下。

希望对你有用!

谢谢

英国货币

更好的推荐系统的最佳工具

原文:https://towardsdatascience.com/the-best-tool-for-better-recommendations-systems-e57142b45f11?source=collection_archive---------25-----------------------

奇异值分解背后的直觉:一种基于简单英语主成分分析的工具,无需数学

介绍

在介绍推荐系统的前一篇文章中,我们看到这个工具在过去的一年中有了巨大的发展。成为维护网站或应用程序受众参与和使用其服务的工具。通常,推荐系统使用我们以前的活动为我们做出具体的推荐(这被称为基于内容的过滤)。现在,如果我们第一次访问一个电子商务,它对我们一无所知,那么它怎么能给我们推荐呢?最基本的解决方案是推荐最畅销的产品、最新发布的产品、经典产品,例如,如果我们谈论的是电影或书籍,或者我们甚至可以推荐给企业带来最大利润的产品。

然而,这种方法已经过时了,因为许多电子商务已经开始使用基于协同过滤的推荐系统。让我们记住它是如何工作的:假设我喜欢以下几本书:《盲人刺客》和《莫斯科的绅士》。我的朋友马蒂亚斯也喜欢《盲人刺客》和《莫斯科绅士》,但也喜欢《小龙虾歌唱的地方》。看来我们俩有相同的兴趣。所以你可能会肯定我也喜欢《小龙虾歌唱的地方》,尽管我没有读过。

此外,在协同过滤(CF)领域,我们可以实现用户-用户或项目-项目协同过滤。关于这两种技术的更多细节,它们背后的数学逻辑以及如何在机器学习中实现它们,可以在我以前的一篇文章中找到,但简而言之,下图总结了这两种工具:

  • 用户-用户 CF :这是我们之前例子的情况。因为马蒂亚斯和我都喜欢《盲人刺客》和《莫斯科绅士》,我们可以推断我也会喜欢马蒂亚斯读的第三本书:《小龙虾歌唱的地方》
  • Item-item CF :在这种情况下,算法会再次向我推荐《小龙虾歌唱的地方》,但只是因为马蒂亚斯、维多利亚和我,我们三个人都喜欢《盲刺客》,而《小龙虾歌唱的地方》是马蒂亚斯和维多利亚都喜欢的唯一一部电影,但我不喜欢。

协同过滤的问题是

开发一个基于用户-用户或项目-项目协同过滤的推荐系统是很棒的,并且肯定是为我们的用户提供更好的建议的第一步。然而,这两种工具都有其局限性,这也是事实。

如果要进行用户-用户 CF,考虑公司的用户数量和项目将非常重要。许多商业模式意味着拥有比商品多得多的用户,在大多数情况下,这些用户只会购买一些可用的产品。想想你自己:你买过多少亚马逊的产品?可能只是其中很小的一部分。现在想象成千上万像你一样的用户在一个用户和产品的矩阵中…这听起来像是很多空白,对吗?这就是所谓的数据稀疏性,对于推荐系统来说,这可能是一个严重的问题。正如《T2 网络技术和应用》一书所解释的:

数据稀疏可能导致两个用户之间的共同评价项目数量少或没有,导致相似性信息不可靠或不可用,进而导致推荐质量差。然而,这种分析过程往往没有经过实验验证。

在一个有 100 个客户和 100 种产品的企业中,评论或购买任何产品的客户的稀疏矩阵甚至可以是这样的:

想象一下,与每个用户向量一起工作来找到它们的相似性…并没有真正的帮助,对吗?

另一方面,使用项目-项目 CF 时,考虑业务的性质是很重要的。对于电子商务,选择这个选项可能是好的。事实上,亚马逊自己开发了一个使用项目-项目 CF 的推荐系统,声称它比用户-用户方法更快,并且它可以帮助人们找到他们感兴趣的产品。然而,对于一个娱乐平台,如网飞或 Spotify,它可能不是一个非常三叶草的选择,因为项目-项目 CF 往往会给出更明显的建议,它缺乏大胆的建议和预测。

在这种情况下,两种选择都有其局限性,一些更复杂的工具开始流行起来。在接下来的章节中,我们将会看到其中的一个。

奇异值分解

奇异值分解是使用主成分分析 (PCA)的一种方式,根据维基百科,这是一种非常复杂的统计程序,它使用正交变换将一组可能相关变量的观察值转换为一组称为主成分的线性不相关变量的值。这种变换的定义方式是,第一个主分量具有最大的可能方差(即,尽可能多地解释数据中的可变性),而每个后续分量在与前面分量正交的约束下又具有最大的可能方差。得到的向量(每个向量都是变量的线性组合,并且包含与原始数据相同数量的观察值)是不相关的正交基集。

PCA 背后的本质数学实际上非常复杂,不幸的是,这超出了本文的范围(也可能超出了我用简单英语解释的范围)。然而,如果前一段听起来像胡言乱语,不要惊慌。希望接下来的几行能让你更好地理解奇异值分解是如何工作的,即使你没有经历 PCA 的所有数学运算。

奇异值分解可以方便地处理稀疏性,不仅在处理推荐系统时,而且在任何使用充满缺失数据的大型矩阵的 ML 工具中,因为 PCA 可以将我们的原始数据集减少到一个更小的特征集,该特征集描述了我们数据中的方差。因此,奇异值分解将矩阵分解成如下三个分量:

通常,这种分解的 U 和 V 元素代表了人类已经学会与我们试图推荐的任何东西相关联的特征。例如,请允许我回到我们之前的书籍示例,让我们再添加几个标题:

用户的潜在特征

这个矩阵是 U,它描述了每个用户与我们创造的潜在特征的接近程度。例如,我们在用户评级矩阵中使用主成分分析来查找“用户类型”,我们可以翻转矩阵并运行主成分分析来查找典型书籍类型的简介,转置我们的原始矩阵,并获得如下结果:

项目中的潜在特征

应用主成分分析后得到的矩阵将会是 v,让我们回想一下:我们的主成分分析对书籍一无所知,但它可以对书籍进行分类。正如我们之前看到的,我们最初的用户和项目矩阵是潜在特征的 U 和 V 矩阵的结果。所以如果我们有 M 和 U,我们可以重建 R,用这种方式来填补我们没有的评级的空白。这被称为矩阵分解

当然,这一切还涉及到更多的概念。基础数学中的关键概念是特征向量和特征值。然而,即使对此一无所知,一旦我们有了 U 和 V,我们就可以预测任何用户-项目组合的评分,只需将 U 中对应的用户行与 V 中对应的项目列相乘即可。最漂亮和最令人兴奋的是,我们甚至不需要担心计算,因为当在 Python 中使用奇异值分解时,我们正在做的是一次找到我们之前看到的方程的所有组成部分。因此,SVM 正在做的是对用户和商品都应用主成分分析,并给我们矩阵,我们需要得到我们想要的评级。

显然,我们不能用缺失值做矩阵运算,对吗?因此,我们需要一个完整的表来使用主成分分析。一开始,人们只是开始用平均值或其他合理的值来填充缺失的单元格。然而,有一种更好的方法。假设以下场景:

一个典型的矩阵,由于缺乏审查而缺少值

知道维多利亚对“智人”的评级可以作为乘法的结果找到,我们的支持向量机算法将把这视为优化问题,当我们试图为那些不完整的行和列找到最佳可能值时,试图最小化误差。

所有这些的 Python 实现并不像它的解释听起来那么混乱。你可以使用 surprise 很容易地做到这一点,这是推荐系统的一个特定包。然而,你可以用它做很多事情,不幸的是,这篇文章已经离开了我,所以我将不得不把它留到另一个场合。

同时,如果你有兴趣看到所有这些的应用程序,请记住我的 GitHub 帐户有几个关于这些和其他东西的存储库。如果你愿意,欢迎在 GitHub 和 Medium 上关注我。另外,如果你想直接在你的邮箱里收到我的最新文章,只需 订阅我的简讯 😃

一如既往的感谢阅读!特别感谢我在整篇文章中使用的以下信息来源:

偏差-方差权衡:解释与演示

原文:https://towardsdatascience.com/the-bias-variance-trade-off-explanation-and-demo-8f462f8d6326?source=collection_archive---------9-----------------------

偏差-方差权衡是数据科学和机器学习领域中一个基本但重要的概念。通常,我们会遇到这样的陈述:“较简单的模型具有高偏差和低方差,而较复杂或复杂的模型具有低偏差和高方差”或“高偏差导致欠拟合,高方差导致过拟合”。但是偏差和方差实际上意味着什么,它们与模型的准确性和性能有什么关系?

在本文中,我将解释偏差和方差的直观和数学含义,展示偏差、方差和模型性能之间的数学关系,最后通过一个小示例演示改变模型复杂性对偏差和方差的影响。

开始时的假设

偏差和方差是统计学术语,可用于各种情况。然而,在本文中,它们将根据试图拟合/解释/估计一些未知数据分布的估计器来讨论。

在我们深入研究估计量的偏差和方差之前,让我们做如下假设

  1. 有一个数据发生器,Y = f(X) + ϵ,它产生数据(x,y),其中ϵ是添加的随机高斯噪声,以原点为中心,有一些标准偏差σ,即 E[ϵ] = 0,Var(ϵ) = σ。请注意,数据可以从生成器中重复采样,产生不同的样本集,如 Xᵢ、Yᵢ和 iᵗʰ迭代。
  2. 我们正在尝试使用一个估计器来估计(拟合曲线)我们从生成器获得的样本集。估计量通常是一类模型,如岭回归、决策树或支持向量回归等。一类模型可以表示为 g(X/θ),其中θ是参数。对于不同的θ值,我们在该特定类别的模型中得到不同的模型,并且我们尝试改变θ以找到最适合我们的样本集的模型。

偏差和方差的含义

估计值的偏差是其估计值和数据中真实值之间的“预期”差异。直观地说,它是估计量与估计量试图估计的实际数据点的“接近”(或远离)程度的度量。请注意,我使用了“预期”一词,这意味着我们正在仔细考虑这种差异,请记住,我们将无限次地进行这个模型训练实验。这些模型中的每一个都将在真实数据的不同样本集 Xᵢ、Yᵢ上训练,导致它们的参数采用不同的θ值,以试图最好地解释/拟合/估计该特定样本。

最终,对于某个测试点 xₒ,这个估计量 g(X)的偏差在数学上可以表示为

bias[g(xₒ)]=e[g(xₒ)]-f(xₒ)

它实际上是估计量在该点的期望值和在该点的真实值之差。

自然地,当一个不同的数据样本集被抛向它时,如果一个估计量没有摆动或改变太多,它将在一个测试点具有高偏差(因此总体上也在极限内)。当估计器没有足够的“能力”来充分拟合固有的数据生成函数时,通常会出现这种情况。因此,与更复杂的模型相比,更简单的模型具有更高的偏差。

保持这些想法,我们将在文章的后面再次回到它们。现在,这里有一个数字来帮助巩固他们。

Linear Regression fits for two different samples of size 8. Notice how curve has not changed too much although the sample sets are totally disjoint

估计值的方差是一个模型的估计值与估计值的“预期”值之间的平方差的“预期”值(在估计值的所有模型上)。太复杂,一次看不懂?让我们把那个句子分解一下..

假设我们使用不同的数据样本集来训练∞模型。然后在测试点 xₒ,所有这些模型的期望值就是 E[g(xₒ)].此外,对于所有模型中的任何一个模型,该模型在该点的估计是 g(xₒ).这两者的区别可以写成 g(xₒ)——e[g(xₒ)].方差是所有模型中该距离平方的期望值。因此,在测试点 xₒ,估计量的方差可以用数学方法表示为

var[g(xₒ)]=e[(g(xₒ)——e[g(xₒ)]

根据这个等式,我们可以说,当估计器在任何数据点“变化”或改变其估计值很多时,当它在数据的不同样本集上被训练时,估计器具有高方差。另一种说法是,估计器足够灵活/复杂,或者具有很高的“能力”来完美地拟合/解释/估计提供给它的训练样本集,因此它在其他点的值波动很大。

Support Vector Regressor fits for the same sample sets. Notice how the curve changed drastically in this case. SVR is a high capacity estimator compared to Linear Regression hence higher variance

请注意,这种对高方差含义的解释与具有高偏差的估计量的解释完全相反。这意味着估计量的偏差和方差是互补的,即偏差较大的估计量变化较小(方差较小),而方差较大的估计量偏差较小(因为偏差较大可以拟合/解释/估计数据点)

偏差-方差分解

在这一节中,我们将看到估计量的偏差和方差在数学上是如何相互关联的,以及如何与估计量的性能相关联的。我们首先将估算者在测试点的误差定义为真实值和估算者的估算值之间的“预期”平方差。

到目前为止,应该相当清楚的是,每当我们谈论期望值时,我们指的是对所有可能模型的期望,对来自数据生成器的所有可能数据样本进行单独训练。对于任何看不见的测试点 xₒ,我们有:-

err(xₒ)= e[(g(xₒ))| x =xₒ]

为了符号的简单,我将 f(xₒ和 g(xₒ分别称为 f 和 g,并跳过了 x 上的条件:-

err(xₒ)= e[(g(xₒ])]

= e[(f+ϵg)]

=e[ϵ]+e[(f g)]+2。埃[(g)ϵ)

=e[(ϵ0)]+e[(f e[g]+e[g]]+2。e[fϵ]2。E[gϵ]

=e[(ϵe[ϵ]]+e[(f e[g]+e[g]]+0 0

=var(ϵ)+e[(g e[g])]+e[(e[g]f)]+2。E[(g E[g])(E[g]f)]

= Var(ϵ) + Var(g) + Bias(g) + 2。{ E[g]E[gf]E[g]+E[gf]}

= σ + Var(g) + Bias(g)

  1. 因此,在未知数据样本 xₒ下估计器的误差(以及因此的精度)可以分解为数据中噪声的方差、偏差和估计器的方差。这意味着偏差和方差都是估计量的误差来源。
  2. 此外,在上一节中,我们已经看到,估计量的偏差和方差是互补的,即增加其中一个意味着减少另一个,反之亦然。

现在暂停一下,试着想一想这两个事实结合在一起对评估者意味着什么。

偏差-方差权衡

从偏差和方差的互补性质以及分解为偏差和方差的估计器误差来看,很明显,当涉及到估计器的性能时,在偏差和方差之间有一个折衷。

如果估计量具有非常高的偏差和低的方差,即当它根本不能适应样本集中的数据点时,它将具有高误差。在另一个极端,如果估计量具有非常高的方差和低的偏差,即当它非常好地适应样本集中的所有数据点(样本集是真实数据的不完整表示)时,估计量也将具有高误差,因此不能概括其他看不见的样本,并且最终不能概括真实数据集。

在偏差和方差之间取得平衡的估计器比那些生活在极端的估计器能够更好地最小化误差。虽然这超出了本文的范围,但是可以使用基本的微分学证明这一点。

Courtesy : The Elements of Statistical Learning by Jerome H. Friedman, Robert Tibshirani, and Trevor Hastie. Blue curves show the training errors on 100 samples of size 50. Red curves are the corresponding test set errors

这个数字来自 ESLR,它很好地解释了这种权衡。在这个例子中,100 个大小为 50 的样本集被用于训练 100 个相同类别的模型,每个模型的复杂度/容量从左到右增加。每条浅蓝色曲线都属于一个模型,并演示了模型的训练集误差如何随着模型复杂性的增加而变化。浅红色曲线上的每一点依次是通用测试集上的模型误差,随着模型复杂性的变化而追踪曲线。最后,较暗的曲线是各自的平均(趋向于极限中的期望值)训练和测试集误差。我们可以看到,在偏差和方差之间取得平衡的模型能够概括出最好的结果,并且比那些具有高偏差或高方差的模型表现得好得多。

演示

我放了一个小演示来展示我在这篇文章中谈到的所有内容。如果所有这些都有意义,并且你想自己尝试一下,那就看看下面吧!我比较了岭回归和 K-最近邻回归之间的偏差-方差权衡,K = 1。

请记住,KNN 回归器 K = 1 完全符合训练集,因此当训练集发生变化而岭回归器没有变化时,它会“变化”很多。

Demo comparing bias-variance between KNN and Ridge Regressors

我希望这篇文章很好地解释了这个概念,并且读起来很有趣!如果你有任何后续问题,请发表评论,我会尽力回答。

偏差-方差权衡

原文:https://towardsdatascience.com/the-bias-variance-tradeoff-8818f41e39e9?source=collection_archive---------3-----------------------

在这篇文章中,我们将解释偏差-方差权衡,这是机器学习中的一个基本概念,并展示它在实践中的意义。我们将表明,一个看不见的(测试)点的均方误差是两种竞争力量(偏差/方差)和问题本身固有噪声的结果。

动机

我们经常在机器学习教科书中看到下图描述了泛化(测试)错误及其与模型复杂性的联系。泛化(测试)误差,即看不见的数据中的误差,可以分解为偏倚误差(错误的模型假设产生的误差)、方差(对训练数据小波动的敏感性产生的误差)和不可约误差(问题本身固有的噪声)。

高偏差通常源于过于简化的模型假设,而高方差则源于过于复杂的假设。顾名思义,不可约误差与底层模型无关,而是与问题中的固有噪声有关。这种噪声可以表示来自数据质量的噪声(例如,数据收集或报告中的不准确性)、来自描述现实问题的真实函数的仅近似知识的噪声、来自潜在现象的非确定性行为的噪声,并且一般来说,是不能容易地定义的任何类型的噪声。当我们的模型遭受高偏差时,模型的平均响应远离真实值,我们称之为欠拟合。当我们的模型遭受高方差时,这通常是因为它无法在训练数据之外进行推广,我们称之为过度拟合。我们的目标是建立一个模型,实现偏差和方差之间的平衡,使这两种竞争力量的综合误差最小*。这是上图中的中间区域!

*通常,随着模型复杂性的增加,传统的机器算法(如回归算法、梯度提升树、支持向量机等)会遇到偏差-方差权衡的问题。然而,深度学习的最新进展质疑了只要有大量训练数据,模型复杂度就会增加的既定概念。

问题定义

让我们从定义一些关键概念开始。我们假设自变量 x 通过确定性或非确定性关系影响因变量 y 的值。我们说非确定性是因为 y 的值也会受到无法明确建模的噪声的影响。让我们通过函数 f 来表示 yx 的依赖关系,这实质上代表了 xy 之间真实的底层关系。在真实情况下,当然很难——如果不是不可能的话——知道这种关系,但是我们将假设 f 是固定的,即使它是未知的。在这种情况下, yx 和随机噪声的结果,由公式给出:

噪声由具有零均值和方差σϵ的随机变量ϵ建模。方差的大小代表了潜在现象的不确定性水平。我们的不确定性越大,σϵ的价值就越大。在数学上,ϵ具有以下特性:

现在,当我们试图对潜在的现实生活问题建模时,这实际上意味着我们试图找到一个函数 ,使得它尽可能接近真实的(但我们未知的)函数 f 。函数 在回归情况下可以采用系数的形式,在支持向量机(SVMs)的情况下可以采用支持向量和对偶系数的形式,并且它是从训练数据中学习的。生成训练数据的基础分布越接近生成测试(看不见的)数据的基础分布,由函数 表示的模型将越好地推广到看不见的数据。函数 通过最小化损失函数来学习,其目标是使训练数据的预测尽可能接近它们的观察值: y ≈ f̂(x)

M ean 平方误差(简称 MSE)是一个预测 f̂(x) 与其真值 y 的均方差。它被定义为:

偏差被定义为对于给定的不可见(测试)点 x 的预测平均值(在训练数据的不同实现上)与真实底层函数 f(x) 的差异。

让我们花一些时间来解释一下我们所说的“训练数据的不同实现”是什么意思。假设我们想要监控某个社区的家庭收入水平和房屋销售价格之间的关系。如果我们能够获得每家每户的数据,我们就能够训练出一个非常精确的模型。但是,由于获取数据可能成本高昂、耗时,或者受到隐私问题的影响,大多数时候我们无法获得底层人群的所有数据。一个实现意味着我们只能访问一部分底层数据作为我们的训练数据。这种认识可能不代表潜在人口(例如,如果我们只调查某个家庭有一定教育水平的房屋)或具有代表性(如果没有种族、教育、年龄或其他类型的偏见)。因此,当我们说期望𝔼[【f̂(x】**是针对训练数据的不同实现时,这可以被认为是我们有机会从基础总体中投票选出一个样本,在这个样本上训练我们的模型 ,计算 f̂(x) 并重复多次(每次使用不同的训练样本)。预测的平均值将代表𝔼[【f̂(x】**。在这里, f̂(x) 即使 x固定也是变化的,仅仅是因为 f̂依赖于训练数据。 所以, 对于训练数据的不同实现会有所不同。用更数学的术语来说, 是一个随机变量,受我们获取训练数据的随机性影响。

方差定义为 f̂(x) 与其期望值𝔼[f̂(x)在训练数据的不同实现上的均方偏差。**

将测试 MSE 与偏差、方差和不可约误差联系起来的公式为:

术语𝔼[𝔼[(yf̂(x)]]中的第一个期望是未知(测试)点的分布 x ,而第二个期望是训练数据和随机变量ϵ.的分布因为 依赖于训练数据,我们也可以说第二次期望已经超过了 f̂、 ϵ.如果我们把上面的公式写得更明确一点,那就是:

但是为了简单起见,我们将跳过期望标识符。右边的三项都是非负的,不可约误差不受模型选择的影响。这意味着测试 MSE 不能低于σϵ。我们现在将推导出给定测试点 x 的公式。因为它适用于给定的测试点 x,所以它适用于任何看不见的测试点的分布。

偏差-方差分解的证明

提醒一下,我们假设 x 是一个看不见的(测试)点, f 是潜在的真函数(规定了 xy 之间的关系),它是未知但固定的,ϵ代表问题中的固有噪声。测试 MSE,𝔼[(yf̂(x)]是对训练数据和随机变量ϵ : 的不同实现

(1)是因为 y = f(x) + ϵ,(2)是因为平方展开、期望的线性性质和随机变量ϵ的独立性 。记住,当两个随机变量独立时,它们乘积的期望等于它们期望的乘积。在 Eq 中。(3)我们看到测试 MSE 如何分解成不可约误差σϵ和𝔼[(f(x)f̂(x)】。现在让我们看看如何进一步分析后一项。

在 Eq 中。(4)我们通过𝔼[*【f̂(x】和等式中的加减。(5)我们展开正方形内的项。偏置𝔼[f̂(x)-f(x)只是一个常数,因为我们从𝔼[ f̂(x) 中减去 f(x) (一个常数),后者也是一个常数。因此,将期望应用于平方偏差,(𝔼[f̂(x)**f(x))没有任何效果。换句话说,𝔼[(𝔼[f̂(x)f(x))=(𝔼[f̂(x)f(x))。在 Eq 中。(6)我们能够把 f(x) −𝔼[ f̂(x) 拉出预期,因为正如我们提到的它只是一个常数。最后,由于期望的线性,(7)成立。因此,我们在(8)中看到,𝔼[(f(x)f̂(x)]是偏差和方差的平方和。当我们结合等式。(3)和(8),我们最后得到:***

这是针对给定的测试点 x 的,但是我们通常有一组测试点,这可以转换成我们在上一节中给出的公式。

(期望𝔼在右手边是测试数据的分布。)

在实践中显示偏差-方差权衡

在我们推导出偏差-方差分解公式之后,我们将展示它在实践中的意义。假设,规定 xy 之间关系的基础真函数 f 为:

并且噪声由具有零均值和标准偏差 1 的高斯模型(ϵ ~𝒩(0,1)来建模。提醒一下, y = f(x) + ϵ.如果我们从这个过程中随机产生 1000 个点,我们会得到下面的图。

蓝点代表( xy )对,红线是底层真函数 f(x) 。红点是我们要预测的看不见的(测试)点。我们看到 f 遵循非线性模式,因为在函数定义中增加了平方根和余弦。出于我们的目的,这 1,000 个点代表了整个潜在人群。下面是重现这个情节的代码。

我们将用不同复杂程度的多项式回归来模拟这个问题。提醒一下,在多项式回归中,我们试图拟合 xy 之间的非线性关系。

换句话说,我们试图用 f̂(x) 来近似 y ,如等式所示。(9).我们将不详细讨论如何学习模型参数 w₀、w₁、…、wd,因为这超出了本文的范围,但是让我们假设它们是通过最小化损失函数来评估的,该函数试图使f̂(x尽可能接近*y。***

现在,假设我们只能使用 20 个点(1000 个点中的 20 个)来训练我们的多项式回归模型,我们考虑四个不同的回归模型,一个具有度 d =1(简单直线),一个具有 d =2、 d =3 和 d =5。如果我们从潜在人群中随机抽取 20 个点,并重复这个实验 6 次,这就是我们可能得到的结果。

蓝点代表特定实现(实验)的 20 个训练数据点。红线是潜在的(我们未知的)真实函数 f ,其他线代表四种不同模型对训练数据的不同实现的拟合。绿色、紫色、青色、橙色点代表每个模型下测试(未显示)点 x 的预测f̂(x】。正如我们所看到的,复杂度较低的代码行差异较小。以 d =1(简单直线)为例。在不同的实验中,直线的斜率没有太大的变化。另一方面,更复杂的模型( d =5)对训练数据中的小波动更敏感。例如,看实验 1 和实验 6 之间的橙色线( d =5)的差异,以及这如何影响预测 f̂(x).这就是我们前面提到的方差问题。一个简单的模型对训练数据的变化非常稳健,但一个更复杂的模型则不然。另一方面,平均而言, f̂(x)f(x) 的偏差偏差对于更简单的模型来说更大,因为我们的假设不能代表潜在的真实关系 f 。以下是上述情节的代码。

现在,假设我们模拟* 10,000 个不同的实验,每次从底层人群中随机抽取 20 个点作为我们的训练数据。在每次实验中,我们都会学到与实验训练数据相关的不同的 f̂。如果对于一个给定的看不见的测试点 x,我们为每个实验评估 f̂(x) ,我们将为 f̂(x).收集 10,000 个值对于线性( d =1)和二次( d =2)回归模型,我们这样做。如果我们记录这 10,000 个值,我们会得到下面的图。 ( 注意,在代码和图中,测试点用 x_ 表示,训练数据用 x _train 表示。换句话说,尽管我们在本文中用 x 来表示测试点,但是在代码中,为了避免混淆,我们用变量x _test)*来表示。**

正如我们看到的,黑线代表的 f̂(x、 𝔼[ f̂(x) 的均值,对于线性回归模型来说比二次回归模型(紫色 hist)更远离真实 f(x) (红线)。这就是偏差,换句话说,当我们的模型假设过于简单时,与真实模型的偏差。另一方面, f̂(x、 var( f̂(x) )的方差在二次模型上比线性模型上更大,正如我们从底部(紫色)直方图的更大分布中看到的。这就是方差问题,换句话说, f̂(x) 对训练数据的小波动的依赖性较大。下面是再现直方图的代码。

现在让我们考虑 1000 个测试点,并计算平均测试 MSE(在这些点上)。我们还计算平均平方偏差(在这 1000 个测试点上)和平均方差。如果我们对五个模型这样做,从度数 d =0(水平线)一直到度数 d =4,我们得到下面的图。

如果我们把黄色(偏差的平方)、蓝色(方差)和红色(不可约误差)的线加在一起,我们得到绿色的线(测试误差)。这是我们熟悉的偏差-方差公式!

黑线代表训练 MSE,它随着模型复杂性而降低,因为更复杂的模型往往更适合训练数据。在这个特定的例子中,我们看到潜在问题的最佳模型是二次模型( d =2),因为它实现了最小的测试误差。上述情节的代码发布在下面。

如果你有兴趣了解更多关于偏差-方差的问题,这里有一个非常有用的吴恩达的教程。

结论

在本文中,我们提出了偏差-方差问题。我们继续进行数学推导,并举例说明偏差方差在实践中的真正含义。我们证明了模型选择必须与两种竞争力量作战:偏差和方差。一个好的模型应该在这两者之间取得平衡,但是由于不可约误差的存在,我们永远不可能达到零测试误差。我们的模型不应该过于简单,但也不应该过于复杂,这样它就可以很好地推广到以前看不到的数据。

大数据手册

原文:https://towardsdatascience.com/the-big-data-handbook-f953e1777244?source=collection_archive---------13-----------------------

你知道 Hadoop 是一只黄色的玩具大象吗?

了解有关 Hadoop 生态系统的所有信息

Photo by Joshua Sortino on Unsplash

作为一名经济和金融背景的学生,算法、数据结构、Big-O 甚至大数据对我来说都太陌生了。文件系统、吞吐量、容器化、守护进程等术语。在我的字典里几乎没有任何意义。

这是我向普通人解释大数据的尝试(在上下文中加入一些技术术语)。

什么是大数据?

大数据字面意思是大数据(换句话说,大量数据)。问题应该是,多大的数据才算大数据大数据?这个问题没有固定的答案,因为它取决于你问这个问题的时间。随着数据量的持续增长(指数级),今天被视为“大”的数据在 10 年后可能不再被视为“大”。然而今天,从业者通常将 1tb 或更大的数据归类为“大”数据。

除了纯粹的数据量之外,我们还必须考虑产生和消费的数据的速度准确性多样性。简而言之,数据正以如此快的速度(速度)从不同的来源和不同的结构(多样性)被创造出来,以至于我们不得不考虑数据的准确度和精确度(准确性)。

The Four V’s of Big Data (IBM Big Data Club)

为什么需要大数据?

从人类文明开始到 2003 年,总共有 5 艾字节的信息被创造出来,但是现在每两天就有这么多的信息被创造出来。 —谷歌执行董事长埃里克·施密特

信息时代的曙光始于搜索引擎的出现,社交媒体平台的创建进一步加速了这一进程。随着数据量的增加,我们想要分析的数据类型也在增加。来自传统类型的结构化数据(如 CRM 数据、POS 数据、系统日志、XML、JSON 等。)到非结构化数据(例如,社交媒体、图像、电子邮件、Web 数据、音频、视频等)。),企业显然需要能够捕获存储管理分析优化所有这些类型的数据。

谷歌是如何解决大数据问题的?

虽然这可能有点技术性,但我会尽量让它变得简单。

当互联网在 21 世纪初爆发时,谷歌面临着一个数据问题。需要处理的信息实在太多了,所有这些数据都存储在大型的集群(一组一起工作的计算机)。为了能够处理和分类万维网上的海量信息,谷歌的杰弗瑞·迪恩桑杰·格玛瓦特在 2004 年发表了他们的论文——“MapReduce:大型集群上的简化数据处理 ”,这是一个用于分析网站数据以进行搜索优化的框架。2005 年, Apache ,一个开源组织,在他们的“Nutch”项目中使用了 MapReduce ( 关于这个框架的细节在下面)这是一个高度可扩展和可伸缩的网络爬虫软件项目。

Doug Cutting (source: https://twitter.com/cutting/status/786058270150721540)

现在,你可能想知道这个术语 Hadoop 是怎么来的?2006 年,雅虎的员工道格·卡丁()离职。然后,设计了 Hadoop 并以他儿子的黄色玩具大象命名,最终在 2007 年作为开源的 Apache 项目发布。它很快成为一个顶级的 Apache 项目。如今,许多公司使用 Hadoop 进行大容量数据存储和处理,因为它能够以最小的数据移动(成本)高效地查询数据。更多的细节和优点将在下面列出。

大数据堆栈简介

Big Data Stack (source: Singapore Management University)

为什么有这么多组件?

在 Hadoop 生态系统中,有许多不同的层负责不同的组件,包括数据存储、集成、访问、资源管理、执行引擎以及运营和管理。

在我失去这一段以外的读者之前,让我提供一个栈试图完成的高级描述。

当大量数据分散在许多不同的计算机上时,从数据消费、存储、处理和分析的一切都不可避免地变得更加困难。然后为这些过程中的每一个创建工具,因为它们帮助摄取和处理数据,而一些工具协调这个复杂的过程,以便获得用户想要的结果。

警告: 下面包含了大量的技术术语!您可能希望简单地阅读每个组件的高级描述。

软件描述和功能

Apache Hadoop

一个开源软件框架,用于商用硬件集群上数据集的存储和大规模处理(又称分布式计算)。简单地说,Hadoop 是为那些有大量数据要存储和分析,但没有时间、技能或资源成为分布式系统专家来处理这些数据的人而创建的。

数据集成

为了将传入数据存储到数据存储层中,由于传入数据的类型(流或批处理数据)和传入数据的来源各不相同,因此通常需要一个数据集成工具。

阿帕奇水槽

Flume 是一个分布式的、可靠的、可用的服务,用于高效地收集、聚集和移动大量的日志数据。它有一个简单灵活的基于数据流的架构。

Flume Basic Architecture (Source: Singapore Management University)

Flume 服务于数据接收/集成层和服务器,将数据从源移动到目的地(通常是 HDFS/Hbase)。它解决了几个问题:

  • 分布式数据源
  • 改变数据结构
  • 源和目的地之间的阻抗不匹配(HDFS/Hbase)
  • 系统和服务器的规模不断扩大

Sqoop

SQL 到 Hadoop 的简称。顾名思义,Sqoop 旨在使用 Hadoop MapReduce 在关系数据库和 HDFS 之间传输批量数据。它的优势在于能够连接到许多流行的数据库和企业数据仓库(EDW)。

Sqoop Basic Architecture

Sqoop 与工作流协调器 Apache Oozie 集成,允许调度和自动化导入/导出任务。

阿帕奇卡夫卡

Kafka 是一个分布式流媒体平台,发布和订阅(通常被称为“发布/订阅”系统)大量的记录流(消息系统)。它通常用于构建实时数据管道,在系统和应用程序之间可靠地获取数据,还用于构建实时应用程序,对数据流进行转换或做出反应。

Kafka pub/sub messaging system

请注意,这与 Flume 不同,因为 Flume 只是接收日志数据流并将其存放到接收器中(即单一目的地)。另一方面,Kafka 能够在不同类型的 feed 之间轻松共享数据(即通过推拉模式分离生产者和消费者)。

数据存储和管理

在数据存储层,根据存储的数据类型(结构化/非结构化/半结构化数据)以及数据存储中文件的读/写频率,有不同的选项。

HDFS (Hadoop 分布式文件系统)

这是 Hadoop 的存储层,存储结构化数据。这一层还负责数据分发和数据复制。它解决了几个关键问题:

  1. 数据太大,无法存储在单台机器上 —使用多台机器协同工作来存储数据(分布式系统
  2. 数据增长过快且不稳定 —添加更多机器进行线性扩展并避免瓶颈(可扩展)
  3. 机器数量越多,故障概率越高 —冗余存储数据;数据分布在多个节点上(容错)
  4. 分布式系统的复杂性 —抽象复杂细节的高级 API(简单编码模型 )

Apache Hbase

基于 Apache Hadoop 构建的可水平扩展、低延迟、随机访问的数据存储。它利用 HDFS 的冗余,使其具有容错能力。它与 HDFS 的不同之处在于,它是一个 NoSQL 键值存储,使用列族。它本质上是一个存储地图的数据库。CPU 和内存密集型,偶尔有大量顺序 I/O 访问。

执行引擎

执行引擎的选择通常取决于您需要解决的问题,有些执行引擎只在它为之构建的用例中才是强大的。在这种情况下,创建 MapReduce 是为了处理大数据,并在集群中的数百或数千个节点之间进行扩展。另一方面,Spark 的优势在于它有一个统一的面向最终用户的 API,使得构建数据处理管道变得容易。

MapReduce

核心 Hadoop 处理引擎(在 Spark 推出之前)旨在利用并行性。它是由两个组件组成的框架— 1) Map 和 2) Reduce

Map 操作获取一组数据,并将其转换成另一组数据,其中各个元素被分解成元组(键/值对)。归约操作将来自映射(或洗牌)的输出作为输入,并将那些数据元组组合成更小的元组集。MapReduce 的优势在于,这两个操作都在每个节点上本地完成,并且跨节点传输的数据最少(低 I/O 成本)。

阿帕奇火花

Spark 的动机是基于 MapReduce 的局限性,它对于重复使用工作数据集的应用程序来说效率低下。出现问题的两个例子:

  1. 迭代、多阶段算法 —像梯度下降这样的机器学习算法将一个函数迭代地应用到同一个数据集,以优化一个参数,其中每次迭代都可以表示为一个 MapReduce 作业,因此每个作业都必须从磁盘重新加载数据,从而导致显著的性能损失
  2. 交互式数据挖掘工具 —类似地,像小猪蜂巢这样的工具被用来在数据集上运行特别的探索性查询。每个查询都会产生很大的延迟,因为它运行一个新的 MapReduce 作业并从磁盘读取数据(而不是一次加载,多次读取)

因此,Spark 的目标是允许内存数据共享,从而避免复制,同时保留弹性和容错的优势。这是通过使用弹性分布式数据集 (RDDs)通过分布式内存抽象实现的。rdd 允许以容错方式在大型集群上进行内存计算。

Spark Toolkit

Spark 的神奇之处在于,它是一个统一计算引擎,有一套大数据处理的库。这意味着通过一组一致的 API,Spark 可以用于支持广泛的数据分析任务,包括数据加载、运行 SQL 查询、机器学习和流计算。

数据分析

PigHive 之前,数据分析是用 MapReduce 术语(Java)完成的,这使得人们很难掌握那些必要的技能。像 joinfilter 等许多常见操作都需要自定义代码。Pig 和 Hive 是试图使数据分析民主化的两种早期解决方案。

Pig 是一个用于分析大型数据集的平台,有两个主要组件:

  1. pig Latin——一种用于分析大型数据集的高级编程语言
  2. Pig 引擎—解析、优化并自动执行 PigLatin 脚本,作为 Hadoop 集群上的一系列 MapReduce 作业

储备

Hive 最初是由脸书在 2007 年开发的,但现在是一个开源的 Apache 项目。

Hive 是一个管理和查询结构化数据的系统,构建在 Hadoop 之上。业务分析师更容易访问它,因为它有一种类似 SQL 的查询语言,称为 HiveQL(非常类似于 MySQL)。

在后台,hive 引擎将 Hive 查询转换为 Map Reduce 代码,然后发送给 Hadoop 执行。

Hive Query Flow

资源管理和协调

Apache Hadoop YARN(又一个资源谈判者)

它是一个资源管理框架,将编程模型从资源管理基础设施中分离出来,并将许多功能委托给每个应用程序的组件。这允许多种数据处理工作负载,如交互式 SQL、实时流、机器学习,甚至对存储在单个平台上的数据进行批处理。

动物园管理员

ZooKeeper 是一个集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务。⁴

结束语

我希望这对那些对这些不同的工具如何相互集成感到困惑的人有用。很高兴收到任何反馈!

支持我! —如果你喜欢我的内容并且没有订阅 Medium,请考虑支持我并通过我在这里的推荐链接订阅 ( 注意:你的一部分会员费将作为推荐费分摊给我)。

参考

  1. https://mindmajix . com/MapReduce/history-and-advantages-of-Hadoop-MapReduce-programming
  2. https://towards data science . com/a-brief-summary-of-Apache-Hadoop-a-solution-of-big-data-problem-and-hint-from-Google-95fd 63 b 83623
  3. https://flume.apache.org/
  4. https://zookeeper.apache.org/

未来十年最大的人工智能风险不是机器人起义

原文:https://towardsdatascience.com/the-biggest-ai-risk-of-the-next-decade-is-not-a-robot-uprising-efb9f6bf2d31?source=collection_archive---------18-----------------------

关于人工智能未来影响的大概括掩盖了我们今天面临的更紧迫的问题。

Finally, robotic beings rule the world — pictures of the Terminator and HAL are just played out at this point. (Flight of The Conchords, Robots)

过去十年,科技领域出现了许多有趣且令人印象深刻的发展(,但也不乏失败的例子)。人工智能的研究和开发在过去十年中有了巨大的增长,部分原因是大型数据集的可访问性和更强的计算能力促进了深度学习革命。随着人工智能的使用越来越普及,我们对未来十年有什么期待?

先前对“2020 年愿景”的技术预测相当不靠谱——从完全错误到尚未实现。人工智能的未来是最未知的领域之一,许多人工智能专家不愿意给出任何具体的预测。在 2016 年的一项调查中,67%的人工智能研究人员表示,人工超级智能是可能的,但只会在超过 25 年后出现。25%的人说这根本不可能。

虽然对人工智能的普遍担忧是基于消灭人类的超级智能机器人起义,但在不久的将来,我们有更紧迫的担忧。这被称为伟大的人工智能悖论——担心遥远的存在性人工智能风险实际上是误导,分散了对人工智能在未来十年可能引发的真正问题的注意力。这篇文章的想法是强调我们目前拥有的人工智能的潜在(错误)用途,以及它与人类终结超级智能的不同之处。然而,讽刺的是,这篇文章也可能是一长串历史上不可靠的人工智能预测的一部分…

过去十年的 AI…

过去的十年是人工智能研究非常激动人心的时期。2012 年见证了 AlexNet 的推出,这是一种深度卷积网络,在 ImageNet 竞赛(一种常用的评估自动图像分类的基准)中表现相当好。原始论文对谷歌学术的引用超过 53,000 次,可以被认为是深度学习革命的开始,这场革命启动了人工智能研究和应用的复兴。

专家预测,围棋的超人表现至少还需要 10 年时间。

这个深度学习跳板为许多进一步的人工智能应用打开了大门。DeepMind 开发了用于玩游戏的革命性模型,并在 2016 年实现了围棋超人类表现的里程碑,当时专家预测这至少还需要十年。自然语言处理在过去十年中也取得了重大进展,2018 年 BERT 的开发重新定义了该领域的艺术起点,让计算机能够更好地理解我们的语言和言语。

许多技术领域现在都在利用人工智能——自动驾驶汽车、语言翻译、手机——人工智能研究在过去十年中的重要性通过它在不同行业中的应用速度得到了证明。的确,AI 界有三位大佬获得了 2018 图灵奖(诺贝尔计算奖),可见过去十年 AI 研究的意义。

深度学习的概念其实是一个相当古老的想法;从 80 年代就有了。然而,只有当计算能力赶上来,并且我们拥有可以满足数据饥渴算法的大规模标记数据集时,它的真正利用才是可能的。虽然深度学习已经让我们做了许多令人印象深刻的事情,但我们仍然依赖于一个 30 年前的想法— 我们会不会开始发现深度学习的局限性,需要一些新的东西?

…以及未来十年的人工智能

那么,未来十年我们可以期待看到什么呢?有许多关于人工智能将如何影响 2020 年及以后的工业的预测,其中大部分是过去几年的研究,并以新的方式应用。我们已经看到增强了某些行业,随着数据变得越来越丰富,这种情况可能会继续下去。

我们目前的人工智能在某些领域明显缺乏,距离一般智能还有很长的路要走。

所有这些新的创新仍然处于狭义人工智能的领域;只能胜任一项特定任务的程序(你的下棋人工智能不会擅长在餐馆订桌,反之亦然)。即使其中一些可以被认为是专家人工智能,在人类或超人的水平上执行,他们仍然从根本上严重缺乏人工一般智能(AGI)。即使是围棋中令人印象深刻的壮举,一些被预测为至少 10 年后的事情,仍然停留在狭隘/专业的人工智能领域。

我们目前的狭义人工智能在某些领域严重不足。它们的样本效率非常低:在深度学习系统能够准确分类之前,必须向它展示很多很多的例子(相比之下,我们人类只能从少数例子中学习)。他们没有常识,无法理解我们认为理所当然的事情,尽管正在努力将常识理解嵌入我们当前的系统。深度学习系统也非常脆弱;他们操作环境的微小变化会导致灾难性的失败,甚至会被恶意攻击利用。

我们不需要太担心 AGI

既然 AGI 似乎离我们还有很长的路要走,我们应该为此担心吗?AI 可能受制于安国定律:

“我们往往会高估一项技术在短期内的效果,而低估其长期效果。”

人工智能在未来十年的预测影响可能被夸大了(特别是如果我们达到深度学习的极限),发展 AGI 的后果可能比我们甚至可以想象的更大。如果是这样的话,我们当然应该考虑如何安全地开发 AGI,但不能忽视我们当前的人工智能系统可能出现的越来越多的问题。用吴恩达的话说:

“在遥远的未来,可能会有一场机器人杀手的竞赛,但我今天不致力于不让人工智能变得邪恶,原因与我不担心火星上人口过剩的问题一样。”

围绕人工智能安全研究的必要性有不同的观点。马斯克的开放人工智能是基于安全 AGI 的发展,尽管他对人工智能的未来相当宿命论。这与布赖恩·考克斯的观点形成对比,他同意大多数人工智能专家的观点,认为 AGI 还有很长的路要走。关于 AGI 的未来影响及其存在风险的笼统概括的问题在于,它将注意力从我们今天面临的更紧迫的问题上转移开了。

这并不是说人工智能安全研究是一个毫无意义的研究领域。通过在正常人工智能研究的同时发展人工智能安全研究,我们可以确保当(如果)AGI 最终到来时,我们已经做好了准备。它甚至可能有助于提高我们人工智能系统的性能。对于那些对人工智能安全感兴趣的人来说,一个很好的资源是罗伯特·迈尔斯的 YouTube 频道。

AGI 作为一种生存风险的另一面是,它也提供了“生存的希望”——这可能是人类有史以来最好的事情。与核灾难等其他生存风险不同,AGI 对人类的毁灭伴随着乌托邦的诱惑。然而,我们离终结世界的人工智能场景还有一段路要走,但这并不意味着它在此期间不会有破坏性。

那么我们应该担心什么呢…

我们目前拥有的人工智能可能会出很多问题,即使不担心 AGI。虽然人工智能在未来十年将如何影响我们的社会和经济仍有很多不确定性,但它很可能会继续渗透到工业的大部分领域。以下是对未来十年人工智能使用的三点担忧。

1.对就业和平等的影响

人工智能对就业的影响是一个激烈辩论的话题。一些人大大夸大了人工智能自动化大量劳动力的能力,但其他人认为它将创造更多的工作岗位。人工智能的主要影响将是我们所做工作类型的转变——人工智能可以接管工作中的世俗元素,允许人类工人以互补的方式使用他们的创造力和技能,这些都超出了我们当前人工智能的范围。然而,这并不是没有自己的一套压力,仍然会造成破坏;人们将需要在工作中欣然接受更多技术,并接受重新培训,以便与新的人工智能同行一起工作。

也有人担心因人工智能的使用而加剧的平等问题。公司可以通过使用自动化系统代替人工来节省资金,这在短期内通过降低成本(并可能增加产量)给他们带来巨大的好处。这不仅扩大了经济不平等,也是一个坏的长期战略,因为消费者剩下的钱更少,无法使用这些公司提供的服务。需要采取措施确保人工智能提供的好处不被掌握权力的少数人所独享。

2.不道德和非法使用

虽然人工智能可以用在许多有用和有益的方面,但它也有可能被用于不道德和道德上有问题的用途。自主武器(和人工智能在军队中的广泛应用)是人工智能如何被用于一些人可能会反对的方式的一个主要例子。谷歌在项目 Maven(其与美国国防部签订的开发人工智能软件以分析无人机镜头的合同)上受到了很多反对。军事人工智能不一定是终结者式的杀手机器人;有许多方法可以应用它。随着人工智能的不断发展,我们将继续看到人工智能系统在军队中更广泛的使用和越来越强的能力。

I need your clothes, your boots, and your motorcycle. AI-powered DeepFakes are a powerful tool for video manipulation and spreading misinformation. (Ctrl Shift Face)

除了物理战争,人工智能还通过社交媒体和错误信息的传播进行不道德的使用。这十年最令人担忧的发展之一是 DeepFakes 的兴起,以及他们如何通过高科技伪造视频和声音来传播错误信息。虽然这项技术还不成熟,而且在仔细检查下仍然有可能发现假货,但随着时间的推移,假货只会越来越好。通过使用人工智能系统传播错误信息的潜在便利性和有效性可能会产生深远而极具破坏性的后果,其背后的技术仍然建立在深度学习的基础上,而无需跳到 AGI。

3.缺乏理解

随着人工智能系统得到更广泛的使用和持续的研究,人们希望我们能够很好地掌握这些系统如何学习和做出决定。不幸的是,今天大多数人工智能背后的深度学习方法从根本上来说是黑盒模型——我们很难窥视引擎盖下的情况,看看他们实际上在做什么。模型的复杂性(通常有数百万个参数)远远超出了人类的理解能力,系统本身也无法解释它们是如何做出决策的。这非常令人担忧,尤其是当这些系统部署在可能直接影响我们的环境中时,例如无人驾驶汽车或医疗应用。

“指标只是代表您真正关心的东西,不假思索地优化指标可能会导致意想不到的负面结果。”— 瑞秋·托马斯

我们不仅不确定我们当前的人工智能系统是如何做出决策的,它们有时还会学到错误的东西。使用度量标准来训练和评估人工智能系统往往会产生误导,这往往会追溯到人工智能系统缺乏常识的问题。例如,一个人工智能学会了一种在视频游戏中最大化分数的古怪而高效的方法,而没有真正赢得比赛。它完全优化了它被告知要做的事情,然而设计者实际上希望它赢得比赛。虽然这是一个微不足道、无关紧要的例子,但不需要太多的想象力就可以看出这在现实世界中会产生重大的负面影响。

…对此我们能做些什么?

好消息是,我们已经在研究当前和未来人工智能的潜在影响。像机器智能研究所和牛津人类未来研究所这样的组织正在研究人工智能将如何改变我们的未来(无论是好是坏)。人工智能技术的持续发展将需要克服当前的一些问题(缺乏可解释性,偏见问题等)。)并包括提高人工智能系统安全性的研究。

除了技术发展,未来十年还需要见多识广的政策制定者听取专家的建议,对人工智能进行监管。也有必要更好地告知公众关于人工智能的信息,并开始讨论人工智能可能将人类带向的未来方向。通过将我们的努力重新聚焦于短期人工智能影响,我们可以确保人工智能在未来十年的崛起尽可能有益。

丹妮莉丝·坦格利安的两个极端

原文:https://towardsdatascience.com/the-binary-extremes-of-daenerys-targaryen-1c89502de92d?source=collection_archive---------23-----------------------

(或者我应该说…“二进制极端”?)

“Louder Than Words ( concepts /studies )” by Ahmed Karam is licensed under CC BY-NC-ND 4.0

警告:包含 HBO 的权力的游戏的剧透。如果你不是最新的,不想让这个节目被剧透,现在就回头吧!

《权力的游戏》的倒数第二集(以下简称《GoT》)激起了激烈的辩论和讨论,这是有充分理由的。丹妮莉丝·坦格利安——战败者,解放者,赢得粉丝忠诚的女人提利昂琼恩·雪诺——向尖叫的平民降下龙火,其中许多是孩子,尽管这座城市已经投降。我们惊恐地看着龙之母将君临浇在火焰中。

丹妮莉丝展示的残暴让观众感到震惊。这是一个在其中一条龙吞食了一个孩子后,把她的龙拴起来的角色。她推迟了在维斯特洛的推进,因为她想首先结束弥林的奴隶制。而一旦维斯特洛,当她意识到白行者带来的威胁时,她再次搁置了自己的目标,选择帮助北方对抗死亡之军。这个富有同情心的人怎么能烧死成千上万的平民呢?

因为丹妮莉丝被她的正义观所驱使,因为她观点中的许多原则恰好符合我们现代的理解,所以我们很容易忘记她其他道德上有问题的行为。她也许有很强的同情心,但她也批准了对自己兄弟的处决。她把两个背叛她的朋友锁在金库里,让他们自生自灭。她用龙火判了塔利一家死刑,因为他们不肯下跪。我需要继续吗?

Fire and blood…. Photo by raquel raclette on Unsplash

对大多数 GoT 观众来说,这些例子和君临的人们有明显的区别。毕竟丹妮莉丝的哥哥是个虐待狂。她困在地下室的前朋友真的背叛了她。而且,直到倒数第二集,她对政敌使用龙火,而不是无辜的旁观者。

在观众眼中,卷入(政治或其他)的和无辜的之间的区别是至关重要的。一些人宣称丹妮莉丝对龙火的普遍使用是完全正当的。有些人谴责它在任何情况下都是原始和野蛮的。很少人,如果有的话,会想到丹妮莉丝会焚烧一座投降的城市,吓坏了的女人和孩子会被诅咒。

也许,随着《T2》的每一季《权力的游戏》的播出,你对丹妮莉丝·坦格利安的任何错误的怀疑都会慢慢被遗忘,或者至少被忽略。(对我来说当然是这样。)一方面,她是疯王的女儿;她看起来确实有点像 T4,对自己的王位“权利”过于执着。另一方面,观众信任的角色,像米桑代、乔拉、提利昂和琼恩,都崇拜她。我们推断,这些角色的默许无疑意味着她偶尔的严厉在 GoT 世界中不会被认为是不合时宜的。

“Daenerys Stormborn” by Marta Rodriguez is licensed under CC BY-NC-ND 4.0

现在我们知道了丹妮莉丝对君临做了什么,我们很容易回过头来看看她的行为为何让我们震惊。她过去的行为一直符合明显的区别不知何故涉及无辜;因此,很容易假设丹妮莉丝使用这种架构运作。然而,现在比以往任何时候都清楚的是,龙之母只是简单地把人归类为对她的或对她。****

她过去的每一个目标都反对她,或者干脆拒绝承认她王室主张的合法性。他们只是碰巧从来都不是无辜的旁观者。丹妮莉丝从来不需要将无辜的旁观者归类为“反对她的人”,因为在君临之前,无辜的人们一直都很崇拜她。

战斗开始时,坦格利安已经厌倦了瑟曦把市民当作人盾,她鄙视那些本该驱逐瑟曦的市民却接受了她的统治。对龙族女王来说,君临的无辜者是瑟曦暴政的同谋,因此他们“反对丹妮莉丝”,该死。

这种二元、还原的思维方式并不是丹妮莉丝·坦格利安独有的。许多其他《GoT》角色对道德和人类行为持有非黑即白的观点,最著名的是奈德·史塔克。但是,虽然丹妮莉丝的观点是基于问题“它们是给我的吗?”,奈德的问题是“我采取的行动是最正确、最可敬的吗?”****

有趣的是,内德为坚持他黑白分明的行为准则付出了最终的代价。当他选择打破自己的规则时,他也经历了最重要的性格决定时刻。澄清一下,奈德是被“国王”乔佛里处决的,如果他与蓝礼·拜拉席恩培提尔·贝里席合谋玷污了自己,那就不会发生这种事。他塑造性格的时刻发生在《GoT》开拍前几年,当时他向他垂死的妹妹莱安娜·史塔克承诺,他会认乔恩为自己的儿子。为了做到这一点,他不得不撒谎。

Heck yeah, House Stark! Photo by Guillaume Archambault on Unsplash

如果丹妮莉丝能够打破她所谓的“支持我或反对我”的二分法,她也许能够挽回自己。唉,城不能不烧,死不能复生。她毁灭性的选择可能把她逼到了一个无法逃脱的角落。

她最终会付出什么样的代价?

丹妮莉丝·坦格利安看待世界的扭曲范式可以很容易地用二叉树来表示,二叉树是计算机科学中的一种分层数据结构。如果你不熟悉计算机科学科目,没关系!二叉树很容易解释。

计算机科学由两类部分组成:节点** ( 你只需要知道节点保存数据)和 ( 把这些想成指针)。每个节点都可以指向(带 )另一个节点,这个节点就叫做它的子节点。(对于那个子节点,那么,原始节点就是它的父节点。)**

树中的第一个节点称为根节点,它没有任何其他节点的边指向它。不指向任何其他节点的节点,即没有边的节点,称为。根节点在树的顶端,其子节点在它的下面,所以要可视化一棵计算机科学树,只需想象一棵颠倒的生物树。

Imagine this tree, but flipped! Photo by Lionello DelPiccolo on Unsplash

每个节点都可以指向多个其他节点。这个特征(我喜欢称之为“多点--多点”)是树的最显著的特征,因为它意味着数据不是以单一的线性方式被访问的。因此,树是一种非线性数据结构。**

二叉树是树的一种。它具有与标准树相同的所有特征,只有一个规范:每个节点最多可以指向两个子节点。这个额外的约束使得二叉树对于像搜索* ( 在树中寻找你想要的数据)这样的编程方法非常有用。二叉树非常适合完成二分搜索法(使树成为二叉查找树)的任务,这比听起来要简单。它由以下步骤组成:***

  1. 检查根节点的数据。如果这是你想要的,太好了!如果没有,查看根节点的数据是大于还是小于您的目标。如果它比你的目标大,进行第二步。如果比你的目标少,就去第三步。**
  2. 转到左侧的子节点。(根节点的边被指定为;左边的边指向左边的子节点。)将这个左边的子节点视为新的根节点,并返回到步骤#1。****
  3. 转到右侧的子节点。将这个右边的子节点视为新的根节点,并返回到步骤#1。**

Photo by Micah Hallahan on Unsplash

当然,上面的步骤假设树的节点包含数字形式的数据。也可以将基于单词的数据(称为 字符串 )存储在树中。在这种情况下,排序将基于字母顺序,而不是数字升序。**

那么这些和丹妮莉丝有什么关系呢?! 大问题!首先,让我们把我们现在对树木的了解应用到人类的视角中。根节点是一个人潜在的引导问题,他们用它来建立对世界和周围人的感知。边缘不像二叉查找树的那样有左右指示符,而是每个都与那个问题的一个可能答案相关联。一条标记有清晰的、基于行动的答案的边将指向一个叶节点,它的数据就是这个人应该做出的决定性决定。标有“需要进一步调查”注释的边将指向另一个有另一个问题的节点,该节点有自己的边指向有答案或更多问题的其他节点。****

毫不夸张地说,丹妮莉丝不屈的“支持我或反对我”的心态最好被描述为一棵二叉树,它有三个总节点:带着她的问题的根节点,带着她可能的选择的两个子节点,以及带着引导这些选择的答案的关联**

“Game of Thrones Sigils” by Jig Ignacio is licensed under CC BY-NC-ND 4.0

根节点的数据提出了这样的问题,“这个人是无条件支持我的主张,还是他们威胁了我的王位继承权?****

一条代表答案,“他们无条件支持我的主张;他们是我的。“它指向接受和同情的决定性决定,丹妮莉丝在她的故事中多次展示了这两者。**

其他边缘边缘代表答案,“**他们威胁到我的王位;他们是我。”它指向了杀死他们(或者很可能,在丹妮莉丝看来,甚至在没有审判的情况下“处决”他们),很可能是用龙火。丹妮莉丝已经杀害了多名持不同政见者,显然她认为他们不值得她的怜悯和同情。

一个更成熟的树木模型不会如此黑白分明。它不会被限制为只有两种选择,只有两种可能的结果(因此不能用二叉树来表示)。更熟练的《权力的游戏》玩家(玛格丽·泰里尔奥莱娜·泰里尔培提尔·贝里席瓦里斯浮现在脑海中)最好用一个有很多很多节点的复杂树来表示。**

希望这篇博文能启发你对丹妮莉丝·坦格利安和/或树数据结构的理解!如果你对你所读的有任何想法或评论,请在下面与我分享。

参考资料和进一步阅读

区块链的可扩展性问题&类似 Visa 的交易速度竞赛

原文:https://towardsdatascience.com/the-blockchain-scalability-problem-the-race-for-visa-like-transaction-speed-5cce48f9d44?source=collection_archive---------0-----------------------

区块链系列的未来

是的,区块链有一个可扩展性问题。这就是问题所在,这就是人们正在解决的问题。

对可扩展解决方案的争夺是区块链的登月竞赛。比特币每秒处理 4.6 笔交易。Visa 平均每秒处理大约1700 笔交易(根据官方声称的每天超过 1.5 亿笔交易计算得出)。采用的可能性是存在的,但是目前受到可伸缩性的限制。

Tata Communications 在 2018 年发表的一项研究显示,在其调查中,44%的组织正在采用区块链,但也暗示了部署新技术带来的普遍问题。从架构层面来看,未解决的可伸缩性问题正在成为区块链采用和实际应用的瓶颈。

正如 Deloitte Insights 所说,“区块链的系统相对较慢。区块链缓慢的交易速度是依赖高性能遗留交易处理系统的企业的主要担忧。”世界在 2017 年和 2018 年尝到了可扩展性问题的滋味:比特币网络上严重的传输延迟和高昂的费用,以及臭名昭著的 Cryptokitties 应用程序,它使以太坊区块链网络(数千个分散的应用程序依赖的网络)拥塞。

如今的区块链扩展性到底有多差?

为了扩展区块链,通过降低哈希复杂度来增加块大小或减少块时间是不够的。无论采用哪种方法,在达到与 Visa 这样的企业竞争所需的交易量之前,扩展能力都会达到一个上限,Visa "平均每天处理 1.5 亿笔交易"或每秒约 1,736 笔交易(TPS)。

相比之下,比特币的交易速度要低得多。目前,块大小设置为 1MB (1,048,576 字节——尽管通过 SegWit,该大小可以扩展到理论上的 4MB ),并且平均事务大小为 380.04 字节(假设每个事务都是从一个钱包到 x 个其他钱包——因此批量事务将被计为一个事务。稍后我会更多地谈论批量交易以及我为什么这样标记它)并且似乎在上升。因此,目前一个比特币区块可以容纳的平均交易量计算如下:

目前比特币区块生成时间为 10 分钟;即每十分钟开采一个新的区块。十分钟(600 秒)内,基于之前的假设,比特币平均可以交易 2759.12 笔左右。换句话说,比特币区块链目前只能保证每秒 4.6 次交易。

增加块大小或减少块生成时间并不能解决问题:看看非 SegWit TPS

可扩展性问题与区块链的价值主张打包在一起;因此,不能简单地通过改变区块链中的参数来提高可伸缩性。

比特币社区可以调整两个变量来尝试增加 TPS。一个变量是块大小(B),目前硬编码为 1MB。理想情况下,应该增加 B 来增加 TPS。另一个变量是块生成时间(TB),它可以通过改变哈希难题的复杂性来调整。理想情况下,应该减少 TB 来增加 TPS。

Table 1: the different scenarios for increasing TPS will be examined in the section below. Only in S1 and S2 can the Bitcoin blockchain achieve Visa-like TPS, but both scenarios are impossible due to transaction propagation time, which will be discussed in this section as well.

场景 1 &场景 2

为了从 4.4 增长到 Visa 的 1736,比特币需要将其 TPS 扩大 377.5 倍。换句话说,B 需要从 1MB 增加到 377.5MB(表 1,s 1),或者 TB 需要从 10 分钟减少到 1.6 秒(表 1,S2)。第三种情况是两者都调整。由于第三个不可控因素,这三种情况中的任何一种都无法在区块链上实现:向比特币网络上的每个节点广播一个新块所需的中继时间(TR)。

目前,比特币网络中估计有 10,198 个节点。通过对等网络传输 1MB (1,048,576 字节)需要一些时间。卡尔斯鲁厄理工学院测量了比特币的块传播时间,2019 年 1 月 17 日报告的平均块传播时间为 13989.42 毫秒,即传播到 99%的网络大约需要 14 秒。TB 不能低于 TR (TR99)=14 的 99%,因为如果这样,那么在网络中的大多数块接收到旧块之前,将会产生新块。TB 越接近 TR99,分叉、孤立块和链重组以及(在极端情况下)双重开销攻击等安全漏洞就越多。

场景三

即使 TB = TR99 = 14,块大小为 1MB,比特币区块链也只能将其速度提高到 188 TPS(表 1,S3)。虽然这一规模代表着 TPS 增长了 188 倍,但与 TPS 签证每天 1,736 次的处理量相去甚远;此外,它增加了上述风险。另一个变量 B 可以重新调整,但不会影响 TR,这会影响 TR99,从而影响 TB 的下限。

场景四

例如,通过将 B 的大小增加一倍(从 1MB 增加到 2MB),网络上每个节点下载一个新块的时间 TR 也会增加—大约 2 倍;因此,在 2MB 时,TR99 = 28s,所以 TB 的下限也应该是 28s。通过将 B 增加任何因子,然后将 TR 增加相同的因子,净 TPS 将保持不变——在这种情况下,大约为 188 TPS(表 1,S4)。降低 TR 对 B 的影响的一个解决方案是增加比特币网络中所有节点的带宽。不幸的是,因为它是一个 P2P 网络,这个责任落在网络中每个对等体的肩上。

赛格维特的出现

2017 年,隔离见证(SegWit)在所有比特币节点生效。注意——我不会深入 SegWit 的所有细节,但如果你想了解它的历史及其在比特币现金硬分叉出现中的作用,请看看这篇文章:

[## 通往 SegWit 的漫长道路:比特币最大的协议升级如何成为现实

隔离证人(SegWit)已在比特币上激活。截至今天,比特币网络上所有支持 SegWit 的节点都是…

bitcoinmagazine.com](https://bitcoinmagazine.com/articles/long-road-segwit-how-bitcoins-biggest-protocol-upgrade-became-reality/)

顾名思义,它将每个事务的见证部分与实际的事务数据分离开来。它作为一个软分支出现,所以它的建立对现有的区块链网络和代码没有任何重大影响。由于见证交易的加权方式,新的支持 SegWit 的比特币块理论上可以增加到 4MB,而不改变比特币块的大小。

我说理论上是因为还有其他因素影响 SegWit 块的最终大小。事实上,如果你查看比特币区块链浏览器,你会发现(至少在这篇文章发表的时候)平均块大小仍然低于 1MB。

Source: https://www.blockchain.com/charts

但这并不是说块不能超过 1MB。在 2018 年初,我们见证了最大的(可能仍然是最大的)块大小之一,重量约为 2.1MB 。SegWit 的软分叉有助于在不改变核心代码的情况下改善块大小,但它仍然没有以可伸缩的方式改善 TPS。

当在工作验证共识下检查之前的四个场景时,我们看到,简单地增加块大小或降低挖掘复杂性只能让我们到此为止。由于事务传播时间的原因,即使是这两者的组合也会受到限制。试图挖掘比旧块传播速度更快的新块将导致一些相当大的安全问题。与此同时,SegWit 帮助缓解了一些 TPS 问题,但仍需要一个更具可扩展性的解决方案来实现类似 Visa 的 TPS。

似乎在区块链拼图中,将任何一个棋子移动到适当的位置来增加 TPS,都会将另一个棋子移出适当的位置;无论如何,有一些项目和初创公司正在努力实现将区块链的采用推向可扩展阶段所需的 TPS 答案。

解决可扩展性的现有和未来方法

在寻找可伸缩性问题的潜在答案时,会出现许多其他问题。例如,如果答案只适用于一个特定的区块链,那么它依赖于一个假设,即特定的区块链将是未来需要可伸缩性的那个;否则,这种努力就是不适当的或错误的。另一个考虑是要了解权衡可能是什么。目前,所有可用的解决方案都有局限性。

1.一次交易批量付款

优点:通过将多个事务放入一个事务中来减少事务记录的大小,允许每个块中有更多的事务,这可以在一定程度上提高 TPS。

缺点:不能批量处理多个钱包的交易;隐私风险

批量支付一直是比特币的一个特点(因此,比特币的分支包括 Digibyte、Dogecoin、比特币现金等。)通过 RPC 发送许多。交易所已经这样做了,当你试图在区块链浏览器上查找你的交易 ID 时,你就能看到。您最终可能会看到一个钱包发送给多个不同的钱包。这样的话,就是批量交易

这样做的好处是,将它放在一个事务中意味着 1)您只需支付一笔事务费,2)您不必为每个事务编写一个完整的事务,如我前面所述,大约 380 字节。事实上,在事务可能的 380 个字节中,只有 34 个字节可能是事务信息。

Only a small portion of a transaction record on the block actually talks about the transaction.

例如,如果我想一次发送十个事务,并且我将它们作为单独的事务发送,那么我将在一个块上占用 380 x 10 = 3,800 字节的空间。另一方面,如果我将事务一起批处理,块中的第一个事务将包含在 380 个字节中,接下来的 9 个事务每个都是 34 个字节;即 380+(34×9)= 686 字节,小了 5.5 倍。

If these transactions weren’t batched, then the size of this would be: 10 transactions x 380 bytes per transaction = 3,800 bytes

不过,它也有局限性;不同钱包的不同交易不能批量处理。换句话说,如果有 10 个人排队买咖啡,那 10 个人不可能把他们所有的交易放在一起,然后从星巴克送出。每个人都必须产生一个单独的交易。批量交易仅限于一对多,不能多对一。例如,在支付账单(电费、互联网费、电话费、网飞、Hulu、保险费等)时,批量交易会非常有用。)立刻。

此外,出于隐私考虑,您可能不想进行批量交易。正如 David A. Harding 在他关于比特币批量交易的文章中提到的,如果你要做工资单,批量交易中的一个隐私问题可能会出现——任何人都可以检查他们的交易,并查看其他员工发送了什么钱包。

2.比特币现金

优点:可以在一个块中存储比比特币更多的交易,这增加了有能力的 TPS

缺点:这只是一个临时解决方案,因为它的 TPS 仍然远远低于 Visa 平均每天 1700 次的全球 TPS。该解决方案也仅限于比特币现金,因此它不能成为其他区块链的解决方案。

如果您回头看看我之前提出的从理论上扩展 TPS 的场景,场景 1 可能听起来很熟悉。这是因为对它的尝试已经发生了——即 2017 年 8 月发生的比特币现金硬分叉。硬分叉的主要动机是将块大小从 1MB 非 SegWit 比特币块增加到 8MB(增加了 8 倍)。

但是在最好的情况下,这个解决方案仍然远远没有达到人们在可伸缩性方面所寻求的答案。

比特币现金是比特币的一个硬分支,旨在作为比特币的替代品,具有更快交易的附加值主张。它主要增加块大小(B);尽管与比特币相比,它的交易速度有所提高,但它仍然没有足够的 TPS 来参与全球交易领域的竞争。

3.闪电网络

优点:双方之间近乎即时的交易,没有任何费用

缺点:交易发生在链外,需要用户有一个闪电节点,并且仅限于基于比特币核心的区块链(如比特币现金、莱特币、Digibyte、Dogecoin)

对于本文来说,深入了解 Lightning 网络如何在粒度级别上工作的细节有点太详细了,但是有大量的资源以我认为容易理解的方式指导您。简而言之,闪电网络让你可以将比特币带出区块链,与另一方私下交易。例如,我可能计划下个月每天早上喝咖啡。我想用比特币交易,但我不想像一个不知道闪电网络是什么的呆子一样,站在咖啡柜台前等待我的大宗交易确认。

所以我做的是,我可以在闪电网络上创建一个所谓的支付通道。这种新的支付渠道不通过比特币区块链进行交易,而是将其视为一种储备。我存了,比如说 0.5 BTC,这是一笔储备金,然后我可以用它来支付我在闪电网络上联系到的任何人。

一旦我完成了,我回到区块链并告诉它,“嘿,我在一个月的过程中给星巴克 0.1 BTC 买咖啡,只要从我最初投入的余额中扣除它。”那么我还剩 0.4 BTC。当然,这是解释实际情况的一种非常简单的方式,所以如果您想了解 Lightning 网络的特性,一定要看看其他资源。

不幸的是,这是一个比特币专用的离线交易解决方案,可用于比特币和比特币分叉的区块链,如 Digibyte 和 Litecoin。闪电网络提供的优势是即时和零费用交易,这使得微交易以及购买咖啡的能力无需等待。

然而,在目前阶段,创建支付渠道需要的知识比普通比特币买家可能熟悉的知识多一点,而且它仍然需要用户闪电节点生命周期前后的链上交易。因此,闪电网络对于比特币和类似比特币的加密货币来说是一个很好的解决方案,但它只解决了链外问题。

4.EOS 和其他高性能区块链

优点:高理论可扩展性

缺点:中央集权会导致(历史上也曾导致)审查

高绩效区块链项目使用不同的共识机制。工作证明(PoW)最受欢迎的替代方法之一是股份证明(PoS)。最近的一个项目,EOS,使用了它所谓的委托利益证明(dPoS),这是 PoS 的一个修改版本。在 dpo 中,像你我这样的用户实际上并不是虚拟化采矿过程的一部分;相反,我们投票决定谁是。EO 使用授权 PoS(dpo)来申请多达 3,996 个 TP,但代价是集中化,这赋予了关键利益相关方比机构群体其他成员更多的权力。

EOS 只有 21 个节点(区块生产者),2018 年 6 月,那些区块生产者冻结了 7 个 EOS 账号。虽然冻结背后的理由可能是合理的,但它表明了一个组织对整个区块链的权力,以及他们执行这一权力的能力。

区块链社区需要可伸缩性,这是 EOS 受欢迎的原因,但代价是中央集权带来的审查和控制。关于其他可能损害 EOS 完整性的其他缺陷的列表,请看看这篇文章: EOS 不是区块链,而是一种美化的云计算服务(声明:该研究由 Consensys 资助,Consensys 的创始人是以太坊的联合创始人)。

5.bloXroute

优点:它是一个链上解决方案,不受区块链限制,因此它可能是所有区块链的可伸缩性的答案

缺点:它仍在开发中,建设/运营全球 CDN 是一项昂贵的壮举,在区块链领域尚未完成

在区块链特定的项目之外,初创公司开始出现,以更大的规模解决这个问题。到目前为止,我在这个领域看到的最有趣的项目之一是一家名为 bloXroute 的初创公司。上周,我在研究区块链领域时发现了这家公司。该公司背后的想法是将内容交付网络(CDN)移植到区块链网络上,以解决可扩展性问题。

什么是 CDN?

cdn 是今天提高网速的工具。这就是为什么当你打开下一个 YouTube 视频时,它不再需要向你显示加载微调器,让你等三分钟才能观看一分钟的视频。如果你以前从未经历过这些问题,你只是太年轻了,无法理解。

内容分发网络听起来复杂而奇特,虽然建立一个比你想象的更复杂,但想法很简单——将大容量内容放在靠近人群的计算机(称为服务器)上,这样,无论何时,比如说,曼哈顿的某人想要下载一段内容来观看,他们都不需要从加州圣克拉拉的某台计算机上下载;相反,在纽约附近的某个地方保存着一个更接近的版本。CDN 领域最大的公司是 Akamai 【纳斯达克股票代码:AKAM】,它是作为一个减少互联网上大文件延迟的解决方案而创建的。

出于同样的考虑,bloXroute 打算将 CDN 的概念作为区块链分布式网络(BDN)应用于区块链空间;毕竟,如果数据块的大小最终达到千兆字节,传输速度将成为一个问题。

bloXroute 计划于 2019 年在 Q1 试运行其 BDN。这项试验的结果将让我们更好地了解它在构建区块链全球网络方面的进展。此外,它还打算发行一种向股东支付股息的证券——BLXR。红利来自交易费,在 bloXroute 每区块链超过 100 TPS 后,将对每笔交易收取交易费。在我的后续文章中,我将更深入地研究 bloXroute。

后续步骤

在过去的几周里,我一直在阅读文章,与社区中的人们交谈,并试图尽可能多地了解区块链的可伸缩性问题,但这只是皮毛。在我的后续文章中,我将发布更多关于可伸缩性和可伸缩性解决方案的信息,以及我在这个领域看到的有趣的公司/项目。

有什么要补充的吗?我是不是想错了什么?请让我知道!

进一步阅读

读完这篇文章后,你可能会有比开始时更多的问题。这是有道理的——除非你准备好阅读一本书,否则我不可能详细讨论每一个话题。但是我在这篇文章中留下了我阅读的不同文章和论文的链接。如果你有时间并且希望你的问题得到解答,我强烈推荐你通读一遍。对于每个主题,他们比我讲得更详细。

让你开始机器学习的书

原文:https://towardsdatascience.com/the-book-to-really-start-you-on-machine-learning-47632059fd0e?source=collection_archive---------6-----------------------

让你的机器学习知识更上一层楼

Cover of the Book.

许多 ML 从业者经常被问到的一个问题是:“我能做些什么来开始真正建立机器学习项目和解决方案?”

外面有太多的信息——好的和坏的——以至于很难知道从哪里开始。此外,人们来自非常不同的背景,因此起点可能会有很大差异。例如,对我来说,我是通过观看计算机科学频道关于神经网络的理论视频进入 ML 世界的,随着我越来越感兴趣,我开始阅读关于该主题的文章、新闻和博客。

然而,通过这样做,我只对机器学习最肤浅的部分有了模糊的理解,我根本无法独自解决一个项目。了解到这一点,我决定参加一些负担得起的 Udemy 机器学习课程。诸如此类的课程很有帮助,因为它们丰富和提高了我的知识,还涵盖了不同算法和模型的一些 Python 实现。

尽管如此,这些课程并没有让我满足于 a 所知道的东西,我想更深入地了解每一次对话,了解算法的精髓,并了解如何自己构建一个端到端的机器学习项目。我希望能够有一个想法,建立或下载一个数据集,并执行它。

这就是我要讲的这本书的由来。

注意:这篇文章包含附属链接,这样你就可以轻松地购买任何一本书,而不需要额外付费,同时有助于创建更多像这样的帖子。

不久前我读了这本书,但是随着它的新版本的出版,我认为分享我对它的想法是个好主意。

Old edition of the Book.

本书是“ 用 Scikit 动手机器学习——学习&tensor flow。这是一本最初于 2017 年出版的书,但在我看来,每一个新的版本都已经成为通过实践学习机器学习的最佳深度资源之一的更好版本。

这本书是给谁的?

这本书 是为机器学习的初学者设计的,他们正在寻找一种实用的学习方法,通过构建项目并在特定的环境下研究不同的机器学习算法。完成整本书后,你应该准备好自己面对一个项目,并适应这个过程中的不同步骤。

尽管这是一本相当有创意的书,但它也将为中级机器学习从业者的工具箱添加一些工具。

这本书假设你有一定的 Python 编程经验,并且知道如何使用主要的科学库: Numpy、Pandas 和 Matplotlib

此外,如果你想最大限度地利用它,最好有一些基本的数学,代数和统计知识。除此之外,如果你愿意努力,你可以在很少或没有初步理解或机器学习的情况下轻松完成它。

一切都解释得非常清楚,有代码片段、注释和示例。

它包括什么?

正如我前面提到的,这是一本非常实用的书,第二章已经让你开始工作并编写项目代码。在此之前,它描述了机器学习是什么,不是什么,它的基本原理,以及它的主要应用和优势。

它展示了如何实现不同的机器学习算法,并涵盖了你所知道的关于它们的理论,而不必深入研究它,用数百万个复杂的方程来折磨你。最新版本由 19 章组成,分为两大块:

  • 第一部分、解释了分类、回归、降维和无监督学习技术的主要概念,以及传统的机器学习算法,如线性回归、逻辑回归、支持向量机、决策树或集成模型。
  • 第二部分,专注于使用 Tensorflow 和 Keras 的人工神经网络和深度学习。卷积神经网络和递归神经网络的解释,随着自动编码器,甚至有一章关于强化学习。

每一章都被进一步划分为一个更精细的结构,带我们一步一步地看完它,这本书还包含各种附录。

这些章节如下:

  • 第一部分 : 1。机器学习的前景,2。端到端机器学习项目,3。分类,4。训练模型,5。支持向量机,6。决策树,7。集成学习和随机森林,8。降维,9。无监督学习技术。
  • 第二部分 : 10。介绍人工神经网络与 Keras,11。训练深度神经网络,12。用 Tensorflow 定制模型和训练,13。用 Tensorflow 加载和预处理数据,14。使用卷积神经网络的深度计算机视觉,15。使用 RNNs 和 CNN 处理序列,16。使用 RNNs 和注意力的自然语言处理,17。使用自动编码器和 GANs 的表示学习和生成学习,18。强化学习,19。大规模训练和部署张量流模型。

正如我前面提到的,在每一章中,我们都会找到代码片段和旁注来补充解释,以及图形、图像和图表,在每一章的结尾都有一组问题和练习,这些问题和练习可以在其中一个附录中解决。

此外,一个非常有用的补充是在一个常见的机器学习项目中一步一步做什么的清单。

这本书怎么读?

每个人都是不同的,但对我来说,最有效的方法是一边在纸上读这本书,一边写笔记。与此同时,我会试着浏览代码,每次在这一章结束时,我会花时间回答问题和做小练习。如果我遇到困难或者不知道怎么做,我会重读这一章的某些部分或者在网上寻找信息。

这本书会对我产生什么影响?

如果你刚开始学习机器学习,这本书会把你所掌握的理论知识,进行相当程度的提升,然后在一些实际项目中运用。很多时候,我们无法测试我们对某事了解多少,直到我们试图把它付诸实践。通过阅读这本书,你将完全准备好从事你感兴趣的项目。

如果你已经了解机器学习,并参与过一些项目,这本书将总结你的理论知识,教你一些你可能忽略的实用技巧,并建议你如何以最佳方式构建你的项目。这是一本很棒的书,可以回答你日常工作中可能出现的具体问题。

下一步做什么?

在你读完这本书之后,我会鼓励你想出几个你想用机器学习做的项目,并把这本书放在身边,试着去执行它们。这将测试你在现实世界中的问题,让你面对机器学习项目的一些困难,并且你将建立一个解决问题的组合,这对你的学习和你未来成为机器学习工程师或数据科学家具有很高的价值。

Other Machine Learning books from my library

一旦你对处理这类项目感到舒适,如果你想更进一步,更接近专家,你可以尝试你用这本书做的同样的程序,但是用一个更高级的,像下面的一个:

或者,如果你对技术性较低的书籍感兴趣,并希望探索人工智能的好奇心、危险性和影响范围,你可以阅读以下书籍:

* [## 关于人工智能和机器学习的三本顶级书籍

三本令人难以置信的人工智能书籍,让你的思维开窍,思维活跃。

towardsdatascience.com](/three-top-books-about-artificial-intelligence-and-machine-learning-b48ff2fa3548)

此外,如果你想专攻机器学习的某个特定领域,你可以找一本关于这个主题的书,甚至是更专业的在线课程。

结束语

一如既往,我希望你喜欢这篇文章,并且我已经说服你去读这本书。

在这里您可以找到最新版本的链接:

如果你喜欢这篇文章,请在@ jaimezorno**Twitter 上关注我。还有,你可以看看我其他关于数据科学和机器学习的帖子 这里 。好好读!

有关机器学习和数据科学的更多资源,请查看以下资源库: 如何学习机器学习 !有关职业资源(工作、事件、技能测试),请访问AIgents.co——数据科学家职业社区&机器学习工程师

如果你想了解更多关于机器学习和人工智能的知识 请在 Medium 上关注我,敬请关注我的下一篇帖子!

在那之前,保重,享受人工智能!*

游戏中的大脑:电子游戏人工智能

原文:https://towardsdatascience.com/the-brains-in-games-video-game-ai-d0f601ccdf46?source=collection_archive---------8-----------------------

计算机如何思考:第五部分

到目前为止,我们探索的人工智能大多局限于转换和操纵数据的领域——进行预测、计算相似度和推导含义。计算能力的低成本,以及通过互联网大规模收集数据的能力,为以迄今为止不可能的方式部署这些算法创造了新的机会,而正是这些算法被在线平台用来挖掘用户的数据,以获取有价值的碎片,如数字页岩油。

但是还有另一种类型的人工智能,几乎与我们目前探索的完全无关。这种智力也许更普遍,当然也更明显,尽管它在很大程度上局限于大多数人生活中的一小部分。这就是电子游戏的人工智能。视频游戏采用算法来智能地响应玩家的输入。从《太空入侵者》中外星飞船的可预测模式,到《吃豆人》中反应灵敏得多的幽灵,最早的视频游戏使用数学过程来模仿有思维生物的行为。随着时间的推移,这些技术已经进化得非常复杂,产生了难以置信的复杂行为。就像我们之前看到的数据操作技术一样,它们的核心是一些令人惊讶的简单几何技巧。

在这篇文章中,我们将了解构成视频游戏功能的三类算法,它们是“转向”,控制简单的运动模式,“寻路”,在复杂环境中导航路径,以及“目标导向的行动规划”,这是制定更复杂行为的一种方式。

引导

“转向”是控制视频游戏中实体运动的一类算法的名称。每当计算机控制的角色移动时,它都会响应转向算法的指令,这是一系列的数学步骤,可以读取游戏的状态,计算每个元素的位置,并将其转换为向特定方向移动的指令。

为了帮助我们探索这些算法,我想向你们介绍一个我为此创造的小家伙。他没什么好看的,只是黑色背景上的一个红点,现在他根本不知道该怎么做。但是我们可以教他,并希望在这个过程中学到一些东西。

A close-up of our boy. He doesn’t do much right now.

第一个也是最基本的转向行为叫做“寻找”。没有目标,我们的男孩只是坐在一个地方。为了让他动起来,我们需要给他一些渴望的东西。首先,我们会给他灌输一种想要靠近鼠标指针的迫切愿望。这将让我们操纵他,看他如何改变方向。“seek”算法非常简单。男孩计算出到达目标的方向,并朝那个方向尽可能快地加速。

尽管他只不过是几行代码和屏幕上的一个红点,但一旦他活了过来,开始在屏幕上飞奔,我就不可能不去想象他身上一些不足的人格碎片。我的第一次迭代让这个男孩移动得太快,他的位置总是和鼠标指针完全匹配。这个版本的男孩没有任何个性——他只是鼠标指针的延伸,一个物体。但是一旦我让他慢下来,让他努力跟上指针,他就变得与众不同,一个有自己权利的人,一个我能感同身受的人。

男孩愉快地在屏幕上缩放,急切地追逐鼠标指针,并随着目标的移动而转向。但是当他达到目标时,奇怪的事情发生了。他跑过鼠标指针,然后像一只兴奋的小狗,在他的目标上来回跳舞。我们的“搜索”算法有问题。因为男孩总是朝着他的目标尽可能快地加速,当他到达目标时,他注定会超调。像一个反向的坦塔罗斯,他永远不能达到他的目标,只能超过它。要解决这个问题,我们必须给他多一个行为:“到达”。

“到达”几乎和“寻找”一样简单。男孩计算到目标的距离,如果距离很短,他就减小加速度。当他站在目标的正上方时,他的加速度减小到零。这让我们的男孩正好停在他的目标上。有了这两种行为,我们的小男孩高兴地跟着鼠标指针在屏幕上缩放,当他到达指针时,聪明地停下来。

I spent an unreasonable amount of time doing this

“寻求”的反义词是“逃离”,在许多方面甚至更简单。和以前一样,男孩计算着他的目标的方向,但是他没有朝目标加速,而是加速离开了。利用这种行为,我们快乐的小男孩变成了一个懦夫,从鼠标指针旁跑开,躲在一个角落里。只有当鼠标指针在他周围移动,并在另一个方向追逐他时,他才会离开这个藏身之处。

如果说我为那个追着鼠标指针跑的男孩感到高兴,那我就更被这个懦弱的版本迷住了。他可怜的恐惧,以及当他被困在角落里时,如果鼠标指针靠近他,他会颤抖的样子,唤起了我巨大的同情。理智上,我知道那个男孩只是一些代码行,一个响应一些输入参数确定一个角度的几何计算,并相应地在我的屏幕上移动一个点。但在情感上,不可能不把“逃离”算法的完全确定性输出解读为一种情感的表达。

这个男孩倾向于直接撞上障碍物,并坚持在那里直到他的目标移动,这是我们男孩行为中一个明显的缺陷。在开阔的地面上,他看起来很聪明,选择一条直接的路线到达目标。但是在他的路径上放一堵墙,他的寻找和逃离算法的简单性就变得显而易见了。他径直撞上了墙,并继续尽他最大的努力去推它,忘记了他对目标的缺乏进展。这可不行。为了帮助他,我们需要给他多一种行为,比我们到目前为止看到的更复杂一些。这就叫“忌”。

“避免”让我们的孩子转向以避开他路上的障碍,但要做到这一点,我们需要扩大孩子对周围世界的了解。到目前为止,他只知道关于这个世界的两个事实——他自己的位置和他的目标的位置。现在,我们需要他向前看,找出任何阻碍他前进的东西。这是用简单的几何图形完成的。我们在他的行进方向上画了一条线,距离由男孩移动的速度决定——他走得越快,他必须越早开始转弯以避开目标。如果我们画的线与一个障碍物相交,比如一堵墙,那么这个男孩知道他必须改变路线,否则就会相撞。他必须改变路线的方向是由与障碍物的投影交点决定的。我们在障碍物的中心和男孩预计会与障碍物碰撞的点之间画一条线。这条线,或者说“矢量”,正指向男孩必须急转弯以避开障碍物的确切方向。运用矢量数学,我们可以把这两条线加在一起,得到的矢量代表了我们孩子新的、修正过的路径,指引他安全地脱离危险。

有了这种新知识,我们的孩子可以在屏幕上飞奔,每当有障碍出现在他和他的目标之间,他就巧妙地绕过它。

Our boy is growing up!

在这套“驾驶”算法中还有最后一个行为,它处理的是根本没有目标的情况。让他自己的设备,没有目标逃跑或寻找,我们的男孩坐着不动。但是如果我们想让他有自己的,自我激励的运动呢?当他没有其他目标时,我们希望他自己蹒跚学步,没有特定的方向,而是或多或少随机地探索世界。这种行为被称为“徘徊”,是我们迄今为止见过的最复杂的算法。

“漫步”最简单的实现方式是让我们的孩子完全随机地选择每一步的方向,而不考虑他在哪里或去过哪里。但是这产生了一个不令人满意的结果。男孩战战兢兢地站在原地,朝任何方向都没有取得进展。这个男孩不再是一个在屏幕上跑来跑去的热切的年轻人,而是一个焦虑的残骸,在现场瑟瑟发抖。

另一种方法是让男孩随机选择一个目标,朝着这个目标前进,只有当他达到这个目标时才选择一个新的目标。这让男孩看起来更有目的,但还是不尽如人意。这个男孩会跑过屏幕的一半,然后掉头朝另一个方向跑去,就好像他刚刚发现自己忘记了什么。他跑向墙壁,虽然“躲避”行为阻止了他与墙壁相撞,但这让他的行为看起来很奇怪,像机器人一样。

创造一种令人信服的“漫步”行为出人意料地困难,而且选择更多地是由美学而不是数学来引导的。没有一个正确的选择,而是我们必须以我们的品味为导向——什么对我们来说是自然的?我选择的算法是让这个男孩沿着一条直线行进,但偶尔会稍微调整一下他的路线。结果是这个男孩愉快地四处游荡,不时地转来转去,忙着探索这个世界,有点像一只寻找食物的蚂蚁。

“寻找”、“逃离”和“徘徊”行为中的每一种都赋予了男孩独特的个性。当他寻找的时候,他热切而专注。当他逃跑时,他是胆怯和懦弱的。他流浪的时候,好奇而忙碌。如果我们给我们的孩子一些朋友,我们可以更清楚地看到这些性格。我们最初的男孩将继续追逐鼠标指针,使用“寻找”行为。他的第一个朋友我们称之为“懦弱的男孩”。利用“逃离”算法,他逃离任何靠近他的人——也许不是一个理想的朋友。我们将用下一个朋友“友好的男孩”来弥补这一点,他使用“寻找”来跟踪任何接近他的人。最后,我们将添加一个“忙碌的男孩”,他无视所有人,只是在屏幕上闲逛。

这四个小伙子都以特有的方式相互作用。我们最初的穿红衣服的男孩在鼠标指针后快速移动,把友好的黄色男孩拉在身后。如果这个热情的二人组靠近胆小的蓝衣男孩,他会冲进一个角落躲起来。与此同时,这个忙碌的男孩做着自己的事情,对这一切都浑然不觉,除非他碰巧徘徊在其他人的附近,在这种情况下,他的“避免”算法让他绕过他们。看着他们互相追逐,他们的个性更加明显,更难不把他们的动作想象成他们感情的表达,而不是简单的几何运算。当友好的男孩抓住懦弱的男孩,把他追到一个角落,忘记了他对同伴明显的厌恶,很难不同情懦弱的男孩,当友好的男孩在他身边蹦跳时,他在角落里发抖。

Poor yellow boy. Nobody wants to be his friend.

这些转向行为是游戏中更复杂的人工智能系统的构建模块,但它们几乎一点也不智能。它们远不如我们在前几章看到的最简单的算法复杂。但是令人着迷的是,虽然他们可能缺乏智力,但他们却拥有另一种更加无形的品质:个性。转向算法只不过是几何图形,但是当我看到我创造的小男孩跑来跑去的时候,我忍不住把动机和感觉归因于他。尽管我知道他的行为只不过是一些非常基本的代码行的输出,但我觉得肯定有更多的东西。他的个性不是这个男孩的品质,而是完全存在于我自己头脑中的东西。他变得不仅仅是他身体各部分的总和,他变成了一个人。但那个人只活在我的想象里。

为什么我很容易看出这个男孩有一些小的个性,而对于我们迄今为止看到的复杂得多的算法来说却不是这样?鼓励我同情这个男孩的品质是什么?这是“智力”,还是别的什么?当我看到更复杂的视频游戏智能系统时,我会回到这个问题。

寻路

我们的孩子很聪明!他可以在屏幕上缩放,追逐鼠标指针,甚至可以突然转向以避开挡路的障碍物。引导它运动的简单操纵算法产生了一种复杂的行为模式,给人一种“聪明”行为的错觉。但是有一个地方我们的孩子的简单大脑让他失望了。一堵直墙或另一个男孩在他的道路上并不会影响他——他只是转向一边,直到他清除了障碍。但是更复杂的形状——一个死胡同或者甚至一个深的角落——呈现出一个不可逾越的障碍。每当他不得不短暂地将从目标处移开以清除障碍时,这个男孩就完全被难住了。他被困在角落里,悲伤地用头撞墙,不知道如何前进。

为了帮助他,我们需要给他一些提前思考的方法——理解为了前进,他必须先向后看。我们要实现这个目标的方法叫做“寻路”。我们会给这个男孩一张假想的地图,让他画出一条通向目标的路线,避开中间的障碍物,并在他需要逃离死胡同时改变方向。

想象有一个看不见的网格覆盖在我们的孩子正在探索的世界上。这个网格由几十个节点组成,通过一根细线连接到它们的邻居。当这条线只穿过空白空间时,我们称之为网络中的“边”。但是当这条线被一个障碍物——一堵墙或者这个男孩的一个朋友——挡住时,我们就说这些节点是“不相连的”。结果是一种负空间版本的世界。在有开放空间的地方,网格是由节点和连接它们的边组成的规则网格。但是墙壁或其他障碍物会刺破网格,在网络中造成缺口。

这个格子是我们的孩子用来绘制路线的地图。男孩没有直接朝着自己的目标加速,而是更多的考虑。他找到网格中离自己最近的节点,以及离他的目标最近的节点。然后他计算出一条沿着网格边缘的路径,穿过所有的中间节点。在没有墙的地方,路径是通过那些直接在他和他的目标之间的节点的一条直线。但是在他前进的道路上有障碍的地方,网格的边缘不会跨越这些障碍。男孩的路径必须绕过网格中的这个缺口。有了这条路,男孩就能自信地找到自己的目标。他没有直接朝目标射击,而是朝着路径上的每个连续节点前进,确信因为有一条边连接着节点,所以在他的路上没有墙。

男孩如何通过节点和边构建路径是那些纯数学问题中的一个,对一组非常特定的人来说非常有趣,对其他人来说非常无聊,所以我在这里跳过这一点。可以说,这是一个经过充分探索的数学领域,可以以令人印象深刻的速度可靠地找到通过任意网格的或多或少的最优路径。这种令人印象深刻的速度意味着我们的男孩可以随着目标的移动重新计算他的路径,无缝地重新定向以绕过墙壁或完全改变方向,以准确无误地找到他的目标,无论它藏在哪里。即使遇到最险恶的迷宫,男孩也立即出发,从不拐错弯,毫不犹豫地穿过曲折的道路。

事实上,男孩解决迷宫的准确无误的技巧有一个有趣的,违反直觉的效果。以前,这个男孩对他的目标的热切追求,以及他轻率地走进角落和死胡同,有一种天真的魅力。他过于急切是可以理解的。现在,他毫不留情地追踪他的目标,毫不犹豫地避开路上的任何东西,消除了这种迷人的易错性。男孩拥有思想和欲望的幻想破灭了。我们有了一个不会思考的机器人,而不是一个渴望的男孩。讽刺的是,通过让这个男孩变得更聪明,我们让他看起来完全没有头脑。

问题是这个男孩已经被赋予了关于迷宫的完美知识,并且能够立刻准确无误地回忆起这些信息。我们不再能轻易地认同他的处境。为了让他的行为回到人类熟悉的领域,我们必须重新引入发现和错误的元素。这也需要我们增加大量的复杂性。

之前,这个男孩得到了一张迷宫地图——一个由节点和边组成的网络,显示出哪里有墙挡住了他的路。现在,我们给他一张白纸。他的节点和边的网络从完全连接开始,每个节点都有一条边连接到它的邻居。这个男孩相信任何地方都可以到达任何地方,直到他知道不是这样。这个学习过程由他记忆中的一系列已知的墙来控制。他知道的每一面墙都存放在那里。当男孩看到一堵新墙时,他会把它的尺寸存入记忆库,更新他对世界的理解。他在自己的世界地图上找到了与这面新墙相交的所有边,并从网格中剪掉了它们。然后,他重新计算他的目标路径。之前存在路径的地方,现在节点之间的边被移除,路径消失了。男孩必须找到一条新路线。当男孩在迷宫中移动时,他遇到了新的墙壁,并相应地更新了他的地图。当他发现他的路线尽头是一个死胡同时,他转身尝试另一条路。

Clever but a bit clumsy

当我们看着这个男孩用这种新算法穿越迷宫时,他又变得可爱了。他停下来,重新考虑,转身尝试新的方法。我们看着他转错弯,发现他的错误,然后回来尝试另一种方式。由于他的许多失误,他花了比以前长得多的时间来完成迷宫。但是,奇怪的是,他似乎更聪明,而不是更不聪明。他完成迷宫的速度较慢,但现在他真正地解决了一个难题,看着他,我们可以同情他。他从错误中学习,慢慢地成为穿越他所学的迷宫的专家。

我们的孩子现在相当老练了。他有记忆力,他可以看到周围世界的事情,他可以制定计划,并随着他对世界的理解的变化而更新计划。但是我们也发现了一些有趣的事情:让这个男孩看起来聪明的不是他的过程有多复杂,或者他在完成任务方面有多擅长。“智力”是不那么有形的东西。这是关于这个男孩的行为和人类行为有多相似。而是看着他,我们是否能看到自己。

面向目标的行动计划

我们就快搞定我们的孩子了。我们已经教他驾驶,所以他可以寻找或逃离一个目标,并避免沿途的障碍。我们教会了他寻路,这样他就能找到通往目标的路,即使这需要他走过一条复杂的道路。我们甚至给他一个基本的记忆——他可以记住他遇到的墙,并使用这些记忆更新他的计划以达到他的目标。但是所有这些追求目标的行为让人感觉有点目光短浅。我们的孩子在寻找银幕上的位置方面是一个世界级的天才,但是他不知道一旦他到了那里他要做什么。他有短期目标,但没有长期抱负。

让我们解决这个问题。让我们给我们的孩子一些制定计划的便利:“首先我要做这个,然后我要做那个”。我们会让他不仅在寻找目标方面更熟练,而且在解决实际的问题上更熟练。举例来说,这使得动作视频游戏中的警卫可以在一个区域巡逻,并攻击他们发现的任何入侵者。这就是《T4》中的幽灵和《模拟人生》中的角色之间的区别,前者遵循各自简单的套路在迷宫中追逐玩家,后者过着复杂的生活,遵循复杂的套路,只需要人类玩家最起码的指导。

有很多方法可以做到这一点,但我们要使用的方法是一种已经在许多流行的视频游戏中以某种形式使用的方法。它被称为“面向目标的行动规划”,它利用了一些我们已经了解过的相同的寻路算法。

想象你在一个锁着的房间里,你想出去。在房间里,你可以看到一把钥匙。在你的头脑中,你形成一个计划:去找钥匙,拿起钥匙,去开门,打开门,离开房间。这不是一个复杂的计划,但它相当重要。在你打开它之前,你不能打开门。除非你有钥匙,否则去开门是没有意义的。这些操作需要以特定的顺序执行才能成功。想象一个更复杂的场景:早上准备去上班。为了准时上班,穿好衣服,保持整洁,你需要采取一系列的行动。有些可以按任何顺序发生,有些有复杂的要求。要吃早餐,你需要去冰箱,拿出牛奶,去柜台,拿出一个碗,等等。要洗澡,你必须采取另外一系列的行动。但是你是先洗澡,还是先吃早餐,并不影响你最终工作的成功程度。面向目标的行动计划的关键在于,这些行动序列可以用我们用于寻路的相同的“节点和边”概念来表达。简单的锁定房间场景是一条直线路径。要到达“拾取密钥”,您必须通过“转到密钥”。要进入“解锁门”,您必须通过“拿起钥匙”和“进入门”。只有一种方法来排列顺序以达到最终目标。“准备工作”图要复杂得多。例如,“冰箱——柜台——碗——早餐”路径。但将这些联系起来是一个复杂的联系网络——事情可以以任何顺序发生——如果你愿意,你可以在洗澡时刷牙(尽管我觉得这是错误的)。你可以两只袜子都穿上,然后两只鞋子都穿上,或者完全完成一只脚的穿戴后再继续下一只(这在我看来也是错误的——就像一只脚短暂地过度穿戴)。

这一过长的题外话进入了我对早晨日常事务的看法,这是一种描述事物的复杂方式,在计算机的抽象语言中,可以通过两个相关联的概念来非常简单地表示:“状态”是关于世界的真实事物。你洗过澡了吗?你带牙刷了吗?“行动”是你能做的事情。“去洗澡”,“拿起你的牙刷”。行动有结果——它们改变世界的状态——它们也有要求——这些要求对于要采取的行动必须是真实的。在算法的语言中,状态是节点,动作是边——它们形成了一个“图形”,就像帮助我们的男孩导航迷宫的网格一样,但这一次是抽象概念的地图,而不是物理空间。为了制定一个计划,男孩通过这个状态和行动的网络计算出一条路径,直到他到达我们的“目标”状态。

这是我们的孩子已经知道如何做的事情!我们已经学习了寻路,以及构建表示物理路径的节点和边的网格。唯一的变化是在更抽象的状态领域中构建这个网格。为了帮助我们做到这一点,我们要给我们的孩子一份工作。像许多在这个世界上起步的年轻人一样,他的第一份工作将是在零售业。

首先我们要建立他的商店。我们将添加一些代表过道的墙,一个角落里的小房间代表储藏室,一个小盒子代表柜台。所有这些都是用和我们之前用来创建一个男孩可以导航的迷宫一样的概念创建的。男孩可以用完全相同的方式探索他的商店。目前,这个男孩只有一份工作,为顾客打扫卫生。像许多零售员工一样,这个男孩对于如何工作没有太多选择。他对世界的理解可以用一个非常简单的网络来表示:

每个圈是一个“状态”,圈与圈之间的线是“动作”。为了实现他的目标——达到“干净的混乱”状态,他必须采取“干净的混乱”行动。但他只有在“接近狼狈”的状态下才能采取那种行动。为了到达那里,他必须采取“去食堂”的行动,这只有在他处于“能看见食堂”的状态时才有可能。“目标导向的行动计划”所实现的是允许男孩通过这些状态和行动导航一条路径。他知道他必须采取适当行动的顺序。更重要的是,如果他在这些行动中被打断,他可以从他停止的地方继续。

实际情况是这样的:他漫无目的地四处游荡,直到发现一片狼藉,然后他开始一个简单的例行程序:去那片狼藉,清理干净。去食堂,男孩必须使用他的物理寻路和驾驶技能导航到正确的位置。为了清理,男孩可能会暂停一段时间。在更复杂的模拟中,我们可能会播放一个男孩疯狂拖地的动画。

多么苦差事啊!在这个阶段,男孩的行为并不比以前复杂多少。我们的孩子在浪费他的潜力!是他承担更大责任的时候了。他忠实地完成了一段时间的清洁工作后,让我们给他一个额外的任务。没有顾客就没有店铺功能,那就介绍一些吧。就像这个男孩一样,顾客有一系列他们可以采取的状态和行动——在商店里寻找一件商品,走向它,拿起它,把它拿到柜台,等待援助,为商品付款,然后离开商店。这个男孩得到了一组补充的状态和动作:如果一个顾客在柜台前,去柜台,把商品卖给他们。

现在他有两个优先事项。如果有顾客在柜台前等着,他就会去那里销售。如果车间里一片狼藉,他会跑去打扫干净。在这期间,他焦急地徘徊,寻找机会帮忙。由于底层决策架构的灵活性,我们能够非常容易地添加这样的新职责。每个状态和动作只是网格中的一个节点和一条边。给孩子设定新的目标就像确定哪些州需要实现目标一样简单。添加新动作就像描述它们的需求和结果一样简单。随着新的目标、行动和状态被添加到世界中,男孩可以通过这个行动网格无缝地绘制新的路径,通过组合一系列会导致实现所需状态的行动来找出如何实现他的新目标。

Our boy, hard at work

我们的男孩(忠实的红点)在商店里跑来跑去,寻找脏东西(绿点),他通过来回奔跑来清理它们。顾客(橙色点)从左上角进入商店,寻找商品(灰色点)。当他们找到它们时,他们把它们捡起来,带到柜台(右下角),在那里等待我们的男孩。当男孩看到他们时,他冲过去向他们推销商品,这时他们回到屏幕的左上角离开商店。

所有这些工作的结果是在我们的屏幕上,在男孩的商店里,一个复杂的互动之舞。顾客来来往往,忙着四处寻找他们需要的商品。男孩急切地追逐着商店地板上的食物,当他注意到顾客在等待时,他冲过去拿走他们的付款。尽管画面简陋,动作略显笨拙,但整个作品呈现出令人信服的生活场景。每个顾客都在按照自己简单的冲动行事,这个男孩并不比他更复杂,但是在一起互动时,我们观察到一个迷人的现象:涌现。“涌现”是指简单系统在大规模互动时产生复杂行为。由于目标设定行为,两个顾客为同一件商品相互竞争。男孩和顾客共享的“回避”转向导致他们在相遇时笨拙地绕着对方跳舞。最有趣的是,我们发现脏乱堆积在商店远离柜台的角落——男孩被拉回到柜台向顾客出售物品,然后才能走到远处的角落去打扫。这个男孩的行为变得难以预测。他的内部状态由几个不断变化的元素的位置决定,很难理解是什么决定了他的决策。我们的模拟,商店,足够简单,给定时间,我们可以根据控制男孩行为的简单算法来分解每个动作和反应,但是随着复杂性的增加,这样做变得越来越没用。几乎不可避免的是,用我们用来描述现实生活和人际交往的语言,根据男孩的欲望和偏好来解释他的行为开始变得很自然。“他把那位顾客推开,这样他就可以去收拾那些乱七八糟的东西”,“当一堵墙后面有一堆乱七八糟的东西时,他会感到困惑”。"直到那些顾客等了一会儿,他才看到他们"。“他懒得打扫整个商店”。

最近几篇文章关注的是人工智能的一个分支,这个分支与数据科学和机器学习的世界关系不大,这个领域最先进的研究都发生在那里。在许多方面,驱动视频游戏“机器人”的算法是微不足道的,与新兴的计算机智能领域没有太大的关联。但在另一种意义上,这些算法是与人类人工智能体验最相关的一些算法。与几乎任何其他类型的人工智能相比,视频游戏机器人处于人/计算机关系的最前沿——它们是同类中最“像人”的,尽管在数学上往往远没有那么复杂。这是来自这些算法的关键见解:它是关联性,而不是复杂性,它是同理心,而不是处理能力,它定义了我们认为什么是智能的,我们认为什么是“像我们一样”。

本系列上一篇文章《 电影数学:计算机如何理解文字 》,此处可用*。这篇文章的代码可以从我的 github,* 这里

这一系列的下一篇文章将于六月出版。

分支定界算法

原文:https://towardsdatascience.com/the-branch-and-bound-algorithm-a7ae4d227a69?source=collection_archive---------4-----------------------

Photo by Valeriy Andrushko on Unsplash

简单地说,这是优化中最常用的算法之一,是混合整数编程的支柱。

你们大多数人可能听说过混合整数编程,或者更一般的离散优化。在本文中,我们将讨论混合整数编程背后的驱动力算法,即分支定界算法。

首先,让我们一般地定义一个优化问题,这样我们就在同一页上了。优化问题可以非常简单地总结为一行:

在这个等式中,我们实际上是说,我们希望通过来自集合 X.x 来最小化函数 f (也称为成本函数)。集合 X 可能是所有实数的集合,可能是整数的集合……也可能是包含实数和整数的向量的集合(这是混合整数编程的大多数情况)。需要记住的一点是 X可行集。所以我们只需要关心这个集合中的解。

分支定界算法的思想很简单。给定 X 的某些子集,它找到成本函数 f 的边界。我们如何准确地得到这些子集?例如,如果我们的解向量 x 的某些成员是整数,并且我们知道这些成员在 0 和 2 之间。然后,我们将从第一个成员开始,探索向量的该维度的每个值的解决方案。这种搜索过程产生如下所示的树形结构(假设不同的整数解在 1 和 5 之间枚举):

可行集的不同子集包含在花括号中。从逻辑上讲,我们希望以最有效的方式搜索这棵树,在每个叶节点评估函数 f 可能会非常昂贵,并且可能涉及优化问题的连续变量。幸运的是,我们可以使用一些技巧来智能地限制父节点的成本,防止我们将它们一直扩展到叶节点,从而导致更有效的搜索策略。

分支定界算法依赖于优化中的边界原则,这只是一个用来描述非常直观的事物的花哨术语。想象可行集的子集, S1S2 。如果来自 S1 的解的上界低于 S2 的解的下界,那么显然不值得探究 S2 的解。这就是分支定界算法背后的全部魔力。从这一点开始,为了简洁起见,我将用 UB 表示上限,用 LB 表示下限,用 GUB 表示全局上限。现在是时候动手实践一下这个算法的具体例子了。

我们使用算法的方式如下。我们有一堆开放的节点,我们称之为开放。开放只是意味着它们还没有被完全探索。我们还跟踪全球上限 T21。在每一步中,我们从开集中取出一个节点并展开它,我们还评估它是否是叶节点。如果节点有子节点,我们查看子节点的 LBUB 。如果子节点的 LB 低于 GUB ,那么我们把它加到 OPEN 栈,如果高于全局 UB 那么就不值得探究了。此外,如果节点的 UB 低于全局 UB ,那么我们将全局 UB 更新为节点的 UB

让我们给上图一些上下限来说明这一点:

我们从一个无限的 GUB 开始。红色表示每个节点的成本,此外,为了简单起见,我们用一个数字(黑色)枚举树的每个节点。那么,应用分支定界会发生什么呢?首先, OPEN 栈将包含节点 1,因为它是根节点。我们从堆栈中弹出一个节点并展开它。我们现在看节点 2 和 3。我们看到节点 3 具有比当前 GUB 更低的 UB ,我们将 GUB 设置为 40 并将其添加到 OPEN 。节点 2 的 LB 仍然低于 GUB ,因此我们将其添加到 OPEN 堆栈中。我们再次从堆栈中弹出一个节点并查看子节点,现在我们查看节点 2 的子节点,我们看到节点 4 是一个叶节点,开销为 10。我们现在可以将 GUB 更新为 10 并进一步观察。节点 5 太贵了,所以没有提到。我们再次从堆栈中弹出一个节点(节点 3),但是我们看到节点 3 的 LB 高于当前的 GUB (10),因此我们不做任何事情。

在这一点上,算法完成,我们设法修剪所有的解决方案,将导致从节点 3。自然地,在实践具有数千个节点的分支和界限算法时,这个例子在这里说明了它的机制。神奇之处在于有效地导出解集的上下界,这本身就是一个完整的研究领域。

关于分支定界算法的一个更有用的事实是,它以更紧的界限递增地给出更好的解。这意味着,当算法提前终止时,有时也会给出有意义的解。这通常用于优化,以有意义的起点引导其他一些方法。这篇文章的要点是:

如果下限大于全局上限,那么在那里寻找解决方案是没有好处的!

我希望我能够对分支和绑定的机制有所了解。继续优化!

构建大规模、准确、新鲜的知识图谱

原文:https://towardsdatascience.com/the-building-a-large-scale-accurate-and-fresh-knowledge-graph-71ebd912210e?source=collection_archive---------9-----------------------

KDD 2018 知识图谱教程综述

Check out my other blogs here!

微软在 KDD 2018 上给出了一个关于知识图谱的精彩教程。如果你是机器学习工程师或者 NLP 工程师,我强烈推荐你看这个教程。它讨论了什么是知识图(KG),大规模的 KG 构建挑战,以及通过参考文献应对挑战的方法。

这篇文章是教程的总结。你可以在这里找到幻灯片

第一部分:导言

有几个衡量标准来评估知识质量,正确性,覆盖面,新鲜度,和使用

如何确保一个巨大的公斤的正确性,覆盖面,新鲜度是一个巨大的挑战。一个很常见的问题是有多个实体共享同一个名称,例如威尔·史密斯。如何将信息链接到正确的威尔·史密斯也是一个挑战(实体链接,EL)。

将原始数据转换成高质量的 KG 主要包括三个步骤:从结构化或非结构化数据源中提取数据,使用模式关联数据和关系,合并模式化的知识。

上图显示了与 KG 相关的积极研究和产品努力。KG 有很多研究方向。如果你想开始学习 KG,我建议从知识图构建开始,其中包括一些常见的自然语言处理技术,命名实体识别(NER),关系抽取(RE),端到端关系抽取。这些技术的目标是获得三元组数据。比如,(威尔·史密斯,职业,演员)是实体-属性-值三元数据。(威尔·史密斯,夫妇,贾达·萍克特·史密斯)是一个实体-关系-实体三元数据。

第二部分:在野外获取知识

这一部分列举了大量论文。我只是拿了一些。如果发现有什么感兴趣的,我推荐直接看教程。

我们可以从众多的数据源中获取知识,这些数据源主要包括两类,结构化数据源和非结构化数据源。结构化来源的数量是有限的,所以我们需要通过许多自然语言处理技术来提取知识,如 NER、RE 等。

在第二部分,幻灯片列出了许多从不同来源提取知识的论文。这些论文涉及从网络提取数据【基于规则、基于树、基于机器学习】从新闻和论坛从电子邮件&日历从社交媒体

为了增加覆盖面,还列出了一些与 NER、关系抽取、实体链接、知识库嵌入相关的论文。

也有一些关于验证知识的作品。

除上述内容外,还包含与远程监管(DS)和众包相关的人工干预论文。

第三部分:构建知识图谱

这部分介绍微软如何建立 Satori 图。整个过程主要有四个阶段。

阶段 1:数据接收

数据摄取,包括使用解析和标准化以统一的方式存储数据,并将提取的数据映射到 Microsoft 本体。

第二阶段:比赛&合并

该图显示了第二阶段(匹配和合并)的摄入流。

摄取流程中最大的问题是实体匹配,标识和发现引用相同现实世界实体的实例,以及数据质量挑战,丢失的数据可能是由人类信息提取技术或人类错误造成的。

为了检测匹配的实体,作者介绍了几种方法。您可以在幻灯片中找到每种方法的推荐白皮书。

第三阶段:知识提炼

这一阶段是在第二阶段之后消除相互冲突的事实和联系,主要包括错误检测和事实推断。

第四阶段:发布&服务

这个阶段是下面独立的第四部分。

第四部分:为世界服务知识

这部分主要讲的是如何为 QA 服务 KG。

主要有三个挑战,不同的语言、大的搜索空间和组合性。

有两种主要的方法,语义解析方法和信息提取方法。

查看我的其他帖子 中等 一个分类查看
GitHub:
bramble Xu LinkedIn:徐亮 博客:bramble Xu【T64

商业战略的基石

原文:https://towardsdatascience.com/the-building-blocks-of-business-strategy-b5ae5c8461c8?source=collection_archive---------33-----------------------

数据科学家做出更好商业决策的方法。

说史蒂夫·乔布斯是我们这个时代最伟大的创新者之一是一种保守的说法。乔布斯的传记作者沃尔特·伊萨克森说得好:

”他的传奇是一个夸张的创业神话:史蒂夫·乔布斯 1976 年在父母的车库里共同创立了苹果公司,1985 年被赶下台,1997 年又回来拯救濒临破产的苹果公司,到他 2011 年 10 月去世时,已经把它打造成了世界上最有价值的公司。一路走来,他帮助改造了七个行业:个人电脑、动画电影、音乐、手机、平板电脑、零售店和数字出版。因此,他与托马斯·爱迪生、亨利·福特和华特·迪士尼一样,属于美国伟大创新者的行列。"

关于乔布斯的事情是,他不只是创新产品和小工具,而是管理和业务。即使在学校里学习了金融和 MBA 课程,你也很难避开一些涉及苹果和皮克斯的案例研究。我敢肯定,我们都曾有过一个想成为他那样的经理。每个人都在寻找正确的公式:通过创新获得商业成功的关键。不幸的是,创新的努力往往看起来像是目光短浅的尝试,将想法扔向墙壁,看看什么能坚持下去。如果这些活动仅限于集思广益会议,那就好了。但是,如果所有这样的经理听到的只是乔布斯本人的一句话,这可能会让他们重新思考他们的方法:

“人们认为专注意味着对你必须专注的事情说是。但完全不是这个意思。这意味着对其他上百个好主意说不。你必须仔细挑选。实际上,我为我们没有做过的事情和我做过的事情一样感到自豪。创新就是对 1000 件事情说不。”

乔布斯与 1991 年电影《都市滑头》中的老牛仔卷毛没有什么不同,他给年轻得多的比利·克里斯托提供生活建议。“你知道生命的秘密是什么吗?…一件事。就一件事。”目瞪口呆的水晶想知道那是什么东西,但当他听到“那是你必须弄清楚的”时,他感到困惑和失望。

Jack Palance & Billy Crystal: City Slickers, 1991

那么,企业如何找出在战略上集中资源的地方呢?数据!

场景和目标

探索使用数据驱动业务决策和战略的最佳方式是使用一个具体的例子。在这种情况下,我们将使用 Northwind 数据库。Northwind Traders 是一家虚构的专业食品公司,在世界范围内销售其产品;数据库本身是由微软开发的,作为展示其 SQL Server 和 Access 产品功能的一种方式。在查看数据库结构之前,让我们快速定义一个业务问题。

作为一个在竞争激烈的市场中运营的成熟组织,Northwind 希望提高每笔交易的销售额。过去,该公司曾试图使用折扣,但结果喜忧参半。管理层还收到了提高产量的其他建议,其中包括:

  1. 为表现不佳的销售人员制定并实施培训计划。
  2. 在顾客已经倾向于购买更大数量的地区增加广告,从而把他们从竞争对手那里吸引过来。
  3. 增加倾向于销量更大的产品的广告。

这些都是可行的选择,那么管理层往哪个方向走呢?他们是否实施了所有策略,并观察哪些策略有效?他们是只选择一种策略,还是选择多种策略?这些策略能以某种方式结合起来吗?这些策略是如何实施的?答案很明确:42。

等等,那是什么?

那些读过银河系漫游指南的人会理解这个参考,但它有效地归结为:即使你有正确的答案,也没有任何意义,除非你问了正确的问题。那么,让我们看看数据驱动的方法如何引导我们找到正确的问题和正确的答案。

有四个领域存在战略选择:折扣、销售培训、区域活动和产品活动。此外,还有一个目标产出需要最大化:销量。这导致了四个需要回答的简单问题:

  1. 折扣对销量有统计意义上的显著影响吗?
  2. 某些员工产生的结果是否比其他人大得多?
  3. 某些地区的产品购买量是否明显高于世界其他地区?
  4. 是否有任何产品类别的销量明显高于其他类别?

请注意,这些问题并不直接旨在决定做什么,而是旨在理解可以直接控制(自变量)和只能间接控制的目标(目标变量)之间关系的本质。人们的期望是,一旦获得了更高层次的理解,适当的策略就会显现出来。更重要的是,问题本身的陈述方式使得回答这些问题需要什么信息变得容易。现在是时候抓取数据了。**

了解数据库

对于任何现代企业来说,维护一个包含客户、供应商、产品、库存和订单信息的历史数据库都是必不可少的。这些信息可以出于分析和战略开发之外的各种原因进行存储,这意味着可能有许多与此目的无关的无关信息。所以我们的目标是获取需要的信息,而忽略其他的。

下面是 Northwind 数据的实体关系图(ERD)的副本。ERD 本质上是一个数据地图:它显示了数据库中存在的信息,以及如果您想要提取特定的元素,如何从 A 点到 B 点。一开始看起来有点让人不知所措,但是在导航的背后发展出一种直觉是可能的。

让我们用更实际的术语来描述:目标是在每次交易的基础上最大化销售量。因此,需要的第一条信息是订单列表和每个订单销售的产品数量,这是有意义的。环顾四周,我们可以看到一个订单明细表,其中包括产品 ID、数量。数量将是我们的目标变量(我们希望最大化的东西)。您还会注意到, ProductID 的左侧有一个钥匙图标,这表示可以获得关于该产品的更多信息,从表格左侧伸出的线条指向左上角的 Products 表格。这很好,因为我们还想让产品类别弄清楚这是否会影响数量,并且 CategoryID 会导致一个单独的类别表。

这种相同的方法可以用于链接订单、订单,然后可以追溯到员工、客户区域。**

有了所需数据在数据库中的位置的直观表示,现在就可以将它提取到单个表或数据帧中。有许多工具可以做到这一点,但是在这个例子中,我们将看看如何在 Python 中使用 SQL 查询来执行。

提取数据

这一部分将会非常技术性,所以如果你正在寻找一个更概念性的概述,请随意跳到下一部分。

Python 和 R 通常是数据分析的首选语言,但它们存储信息的方式和目的与 SQLite 等大型数据库不同。因为 Northwind 数据库存储为 SQLite 数据库,所以需要一个对象关系映射器(ORM)。在这种情况下,由于我们使用的是 Python,SQLAlchemy 将成为 ORM 的选择,不仅可以连接到数据库,还可以从程序中运行适当的 SQL 查询。第一部分是实例化一个会话对象(它建立了允许与数据库通信的所有相关连接)并创建一个引擎(它只是向会话对象发送信息请求)。此外,还可以创建一个 inspector 对象,它可以提供关于数据库架构的信息。这将用于显示表名,以确保连接已正确建立,并验证表名是否与 ERD 匹配。在许多情况下,有些细微的变化会在代码中产生错误,所以这总是需要注意的。

*OUTPUT:
['Category', 'Customer', 'CustomerCustomerDemo', 'CustomerDemographic', 'Employee', 'EmployeeTerritory', 'Order', 'OrderDetail', 'Product', 'Region', 'Shipper', 'Supplier', 'Territory']*

如果对照图中的表名检查这些表名,将会观察到一些变化,因此所有的查询都应该相应地进行调整。另一个选项是显示每个表的列名和数据类型,以便稍后快速复查。下面的代码将打印结果,但是也可以修改代码,将其保存到不同视图的 dataframe 中。

*OUTPUT (FIRST TABLE ONLY):Table Name: Category

Name: Id
Type: INTEGER

Name: CategoryName
Type: VARCHAR(8000)

Name: Description
Type: VARCHAR(8000)
--------------------------*

因此,有了这些,运行适当的 SQL 查询并将其保存到数据帧的语法就简单得令人难以置信了:

*df = pd.read_sql_query('''SQL QUERY HERE''', engine)*

然而,查询本身可以根据您的选择简单或复杂。虽然可以对每条信息运行单独的查询,然后连接数据帧,但我们将一次性运行全部内容。

从这里可以看到,对于每个订单,都包含了相关的产品数量、员工、区域、类别和折扣级别。通过结合雇员姓名/id 进行一些检查和清理,并去掉一些无关的列,我们最终得到如下结果:

假设检验概述

因此,我们有四个问题,询问折扣、销售人员、地区和类别对购买数量的影响有多大。每个自变量的默认假设(零假设)是它和目标变量之间不存在关系,我们计算给定数据时两者之间不存在关系的概率。如果概率足够低,可以说我们有足够的信心,关系确实存在。一般的经验法则是使用 95%的置信水平,这对于本分析来说应该足够了。请记住,不同的场景可能保证不同的置信水平,例如在医疗设备测试中,5%的失败率是不可接受的。

将进行两种一般类型的测试:

  1. 方差分析(ANOVA):这将用来告诉我们是否有任何变量可以在一开始就被消除。
  2. 学生的 T-检验:对于通过 ANOVA 检验的每个变量,将进行该检验以确定是否任何变量子集对数量的影响程度与其他变量显著不同。(例如,5%的折扣比其他级别的折扣对数量的影响更大吗?)

因为我们关心的是偏离标准的情况(更高和更低的性能都很重要),所以所有的测试都是双尾测试。

方差分析

ANOVA 测试将允许我们一次检查所有变量的显著性水平,并且它将为这些变量中的每一个吐出一些数字。为此,最重要的是 p 值。如果我们希望 95%确信我们的变量对数量有统计上的显著影响,那么 p 值之和需要小于 5%(100%–95%),并且 p 值不能大于 1.25% (5% ÷ 4)。

Statsmodels 是一个 Python 库,它将为我们运行这个测试,p 值可以在结果的最右栏中找到。残差的最后一行也可以忽略。

*OUTPUT:**variable_name           sum_sq      df          F        PR(>F)** C(Employee)        8259.303411     8.0   3.010143  2.313174e-03
C(Region)         40031.874384     8.0  14.589809  6.642581e-21
C(CategoryName)     959.751343     7.0   0.399755  9.028854e-01
Discount           6925.520310     1.0  20.192314  7.392950e-06
Residual         704133.930739  2053.0        NaN           NaN*

查看最右栏中的结果 p 值,可以发现除了产品类别( CategoryName )之外,所有变量都具有统计学意义。也就是说,对于员工、折扣水平,拒绝与数量没有显著关系的零假设(默认假设)。剩下的唯一问题是哪个级别的折扣、哪个员工以及哪个地区与其他地区有显著差异。

t 检验

使用双尾 t 检验来比较总体均值之间的差异是一种相当简单的方法。与 ANOVA 检验一样,零假设是没有差异。通过检查均值的差异,并将其与数据的方差进行比较,我们可以确定这种差异是由随机机会引起的可能性有多大。这很容易做到。

*scipy.stats.ttest_ind(group1, group2)*

然而,这必须重复执行多次。对于每个地区(例如),我们想知道该地区与世界其他地区之间的数量差异是否具有统计学意义,小于 5%的 p 值表示置信度为 95%。此外,我们希望寻找表现最佳和表现最差的区域。这可以通过一些功能迭代来实现:

当然,这可以与显示图表和跟踪结果的额外代码相结合,但这是该过程的本质。

在比较员工时,采用了相同的方法,但是对于折扣级别,将每个折扣级别与完全不提供折扣的情况进行比较。区域和雇员数量与剩余人口进行比较,而折扣水平与对照组进行比较。

结果

在所有情况下,结果都是从均值和方差变化的角度来看的,采用传统的风险方法来衡量绩效。具体来说,人们的愿望不仅仅是增加数量,而是在一致的水平上这样做。最好的机会存在于平均数量增加的地方,但是数量水平的方差与总体的其余部分保持一致。当看一个具体的例子时,这将更有意义。

左边的图表比较了 10%折扣级别和无折扣级别的平均数量,右边的图表显示了 20%折扣级别的相同比较。没有折扣用红色表示。在这两种情况下,平均数量的增加是显著的,但是也观察到左边的蓝色曲线的形状更短更宽。这表明,虽然有效,但在 10%水平的结果不如在 20%水平的结果一致。理想情况下,我们希望找到蓝色图表保持与红色图表相同形状的结果,向右移动而不变宽。方差保持不变,但平均数量增加。在这种情况下,20%的折扣证明是最有效的。

让我们从数量上看一下最好和最差的地区:

西欧的采购量一直高于全球平均水平,采购率也略有不同。另一方面,东欧一直买得很少。当结果持续糟糕时,一致性不一定是件好事。这看起来是一个有增长空间的领域,折扣可能会带来很好的推动。

最后,让我们看看表现最好和最差的销售人员。

ID 为 King7 的员工绩效最高,而 Suyama6 的绩效最低。然而,考虑到这些个体代表了极端情况,与平均值的偏差非常小。很难断定销售培训会带来更好的业绩,除非可以证明整个团队表现不佳。

制定战略

那么,什么是正确的策略呢?之前,我们有一些问题,直觉的偏离可能会让你在黑暗中乱猜。管理层表示,折扣的结果好坏参半,我们可以看到原因:这取决于折扣的水平。但是,让我们看看每一个建议,并利用这项研究来作出决定。

  1. 员工培训:这可能会有所帮助,但与上述领域的机会相比,结果可能会乏善可陈。如果公司的表现远远落后于竞争对手,请外部人才来诊断问题,并展示重点培训的潜在领域。
  2. 地区焦点:最大的机会空间在东欧。增加那里的广告,并把折扣集中在这个地区而不是其他地区。
  3. 产品类别焦点:没有一个产品类别的销量明显高于另一个类别。促销特定产品的决策应基于其他因素(如库存水平或利润率)。
  4. 折扣:在 20%的水平上可以实现对数量的最大影响。

正如我们所看到的,如果我们对我们的数据提出正确的问题,并应用一个健壮的过程来回答这些问题,那么设计策略的过程就会大大简化。这个过程并不一定要在这里结束:在区域基础上对折扣的影响进行额外的检查可能会产生更简洁的建议,尽管还需要进行额外的检查(特别是关于共线性)以确保结果的有效性。

最后的想法

数据科学和统计学的使用曾经被认为是一种竞争优势,现在正迅速成为任何想要成功的企业的基本要求。随着越来越多的信息涌入市场,陆地将很快消失在地平线下,如果没有一个强大的导航器,一个组织是沉还是游的问题将变得无关紧要。

参考

Jupyter 笔记本和所有用于这个项目的资源都可以在 Github 上找到。

人工智能研究的碳足迹

原文:https://towardsdatascience.com/the-carbon-footprint-of-ai-research-812d9c974a5c?source=collection_archive---------20-----------------------

Photo by Lucas Benjamin on Unsplash

做好机器学习模型的成本是多少,做 AI 研究?让我们做一些粗略的信封计算。

面对现实吧,人工智能的研究是基于计算能力的。过去几年的大部分改进都重新使用了来自数学和机器学习的非常古老的思想,具有更强的计算能力。今天可用的计算能力是高效人工智能算法的驱动力,计算机视觉是从这一事实中受益匪浅的一个领域的主要例子。将一篇论文推向一个值得关注的会议的简单方法之一是采用一些著名的算法,并使模型更大,或数据更大,因此计算更大。这能让我们走多远?

所以,对于计算能力,我们显然需要能量。让我们先通过一点物理学来理解什么是能量。物理学中的能量定义为随时间施加的力,或者换句话说,牛顿-秒。能量的单位是焦耳【J】,定义为 1 秒内施加的 1 牛顿(力的单位)。现在,你们中的大多数人会理所当然地注意到,在计算机硬件产品、电费等方面没有焦耳的说法。对于电,我们有功率的度量单位,瓦特,实际上只有 J/s。因此,当你在电费账单上读到 X 千瓦时,这意味着你使用的能量,用焦耳表示,总计为 X100060*60 焦耳。所以当我们谈论 kWh 的时候,我们实际上还是在谈论焦耳,牛顿-秒!谢谢你,焦耳。

既然我们在能源方面达成了一致,我们可以开始查看“深度学习”PC 的能耗,或者至少是一个粗略的估计。不一定,但你可能希望有一个好的 CPU,如英特尔 i7,或者更多的内核。但是让我们坚持以英特尔 i7 作为一个主要的例子。在产品页面上,它说处理器消耗 95W 的功率。你可能会经常使用这个处理器,一天 24 小时都在训练一些神经网络,运行一些计算等等。那么运行这个处理器一整天的能源成本就是 24*95 = 2.28 千瓦时。

但是处理器对于深度学习来说还不够,我们需要更强大的东西,我们需要显卡。深度学习社区使用的最著名的型号之一 Nvidia 1080Ti 等显卡的能源成本是多少?在 Nvidia 页面上,它说 GPU 消耗的最大功率是 250 W。这大约是英特尔 CPU 的 2.5 倍。所以,再一次,让我们用一整天的千瓦时来计算,24*250 = 6 千瓦时,一个不错的整数。

Obviously, cryptocurrencies are not helping the energy conundrum either.

对于家用电脑来说,这些数字相当不错,但事实是真正的计算发生在数据中心。那么,数据中心可以有多大呢?我听说过数据中心有 5000 个 GPU,一天 24 小时运行的故事。一个拥有 5000 个 GPU 的数据中心最有可能拥有至少 8 倍的 CPU 内核(这是非常适度的)。大约是 10k 的英特尔 i7 处理器。那么,根据我们之前的数据,这样一个数据中心每天需要消耗多少能源呢?50006 kWh 用于 GPU,2.2810000 kWh 用于 CPU 内核,转换为 MWh,22.8 MWh + 30 MWh = 每天 52.8 MWh 兆瓦时。可怕的数量。

现在,我们知道每天的能量规模为兆瓦,这些数据中心用来处理数字的能量来自哪里。我不想打断你,但它大多不是来自风车。一个风车,当一切顺利的时候,每年可以产生不超过 600 万千瓦时的风,根据我发现的统计数据,即每年 4500 兆瓦时,除以 365 等于每天 12.32 兆瓦时。这些能量可以为 400 到 500 个家庭供电。但不是数据中心,我们将需要 5 个风力涡轮机来为一个集群/数据中心供电。请注意,在我的计算中,我没有考虑数据中心正常运行所需的冷却和其他硬件,这将显著增加功耗。

世界上有多少个数据中心?我找到的数字超过 50 万。回到我们的计算。为了给所有这些处理数据的数据中心供电,我们需要 250 万台风力涡轮机。美国是世界上最大的能源消耗国,拥有 56 000 台风力涡轮机,但也有 40%的数据中心。相比之下,德国有 29 000 人。尽管如此,这些数字看起来并不乐观,美国和德国加起来还不到 10 万。

当我想到这一点时,有多少“无用的”计算时间被浪费在不必要的实验上,只是为了推出下一篇论文,该论文对社区中已经存在的方法仅提供了边际改进。作为一个研究团体,我们应该更加意识到“快速研究”的后果。这就像快餐,也许开始时味道不错,但长期影响却很糟糕。

Photo by Andy Brunner on Unsplash

音频的心脏

原文:https://towardsdatascience.com/the-cardio-of-audio-cbe310d94b48?source=collection_archive---------28-----------------------

仔细检查数据科学中的音频数据

介绍

大多数数据科学、机器学习或深度学习课程都是从分析和处理数字数据开始,然后转向图像数据。关于如何分析和处理音频数据,很少有好的资源。所以今天我们就来谈谈音频数据,讨论提取音频特征的方法。

使用这份数据科学备忘单完成伟大的壮举

结构化与非结构化数据

结构化数据通常存在于 RDBMS 或数据库中,您可以轻松地搜索记录、查看数字并进行比较。例如,记录可以包含姓名、id、出生日期、薪水、地址等。数据以类似结构化表格的格式排列,使用起来很简单。

非结构化数据包括音频、文本、图像等。大约 80%的企业数据以非结构化格式存储。使用它们并不容易,因为我们不能直接使用存储在图像或音频文件中的数据。在本文中,我们将主要关注音频数据。

音频数据

人类的大脑不断地感知我们周围的声音。我们听到鸟儿啁啾,公路赛车,空气吹过,人们说话。我们有设备以各种格式存储所有这些数据,如 mp3、wav、WMA 等。现在,我们还能利用这些数据做些什么呢?

对于像这样的非结构化数据,深度学习技术是您的最佳选择。

首先,我们看看音频是什么样的。

音频以波的形式表示,其中波的振幅随时间而不同。

音频采样

了解采样非常重要,因为声音是连续的模拟信号,当我们将它们转换为由信号中的离散数据点组成的数字信号时。这个过程称为采样,采样的速率称为采样率。它以赫兹(Heartz)为单位。采样率为 48kHz 的音频意味着每秒钟采样 48,000 个数据点。采样时,会丢失一点信息。

准备好,做这些令人惊叹的数据科学项目

天秤座

LibROSA 是用于音乐和音频分析的流行 python 包。它具有创建音乐信息检索的构件。

要安装带有 pip 的软件包,您可以在终端中运行该命令。

**pip install librosa**

加载音频文件

我们将加载一段 23 秒的狗叫声音频文件。

**import librosa****data, sample_rate = librosa.load(“dog bark.wav”)**

librosa 的 load 方法获取音频文件的路径,并返回一个包含音频采样数据和采样率的元组。默认采样速率为 22050。您还可以在参数中指定自定义采样率。为了使用原始采样速率,我们使用 sr=None

**data, sample_rate = librosa.load(“dog bark.wav”, sr=None)**

让我们看看数据中有什么-

**print(data.shape, data)****print(sample_rate)**

输出:

(1049502,) [ 0.00019836 -0.00036621 0.00016785 …. 0.00099182 0.00161743 0.00135803]

44100

数据是一个有 1049502 个数据点的 numpy 数组。原始采样速率为 44100 Hz。降低采样速率会减少数据,我们可以更快地执行操作,但是降低太多也会导致一些信息丢失。

显示音频数据

Librosa 有一个显示模块,可以给你绘制数据图表

**import librosa.display****librosa.display.waveplot(data)**

输出:

这就是狗叫的样子。现在有了采样数据和采样率,我们可以从音频中提取特征。

为什么数据科学是一份理想的工作?

机器学习的特征提取

有各种方法和技术来提取音频特征。这些是-

时域特征

过零率- 如果您观察音频图像,我们会看到采样数据在-1 到 1 之间。过零率是这些符号的变化率,即从负值到正值的变化率。这在语音识别和音乐信息检索中被大量使用。

光谱特征

频谱质心- 它表示给定声音的“亮度”。它代表了光谱重心。假设你正试图在手指上平衡一支铅笔。所以,谱形心就是平衡时你的手指接触铅笔的频率。

频谱衰减- 频谱衰减是指低于预定百分比(roll_percent)的频率,单位为赫兹,librosa 库中默认为 85%。
该特征在从非浊音信号中确定浊音信号时是有用的。通过将 roll_percent 设置为 1 或 0,也有助于逼近最小或最大频率。

感知特征

MFCC——梅尔——频率倒谱系数—— 每个人的声音听起来都不一样,因为声音是经过我们的声道过滤的,包括舌头、牙齿等。形状决定了它的声音,通过准确地确定形状,我们可以识别它将发出的声音。MFCC 的工作是确定声道的形状,并将其表示为功率谱。

MFCCs 是音频和语音识别中最常用的功能。它们是在 1980 年推出的,从那以后一直是最先进的。

结论

互联网上存在大量的非结构化数据。分析非结构化数据并不是一件容易的事情,因为我们必须对数据执行大量转换来提取特征。音频可以具有 3 种不同类别的特征时域、频谱和感知特征。

征服你的数据科学梦想

朱庇特笔记本的案子

原文:https://towardsdatascience.com/the-case-against-the-jupyter-notebook-d4da17e97243?source=collection_archive---------13-----------------------

苹果 | 谷歌 | SPOTIFY | 其他 | 剪辑

乔尔·格鲁什在 TDS 播客上

🎧 Clip

编者按:这是迈向数据科学播客“攀登数据科学阶梯”系列的第一集,由 Jeremie Harris、Edouard Harris 和 Russell Pollari 主持。他们一起经营一家名为sharpes minds的数据科学导师创业公司。可以听下面的播客:

对于大多数数据科学家来说,jupyter 笔记本是一个主要工具:这是他们学习诀窍的地方,这是他们建立原型模型或探索数据的地方-基本上,这是他们所有数据科学工作的默认场所。

但是乔尔·格鲁斯不像大多数数据科学家:他是前对冲基金经理和前谷歌员工,也是《从零开始的数据科学》一书的作者。他目前在艾伦人工智能研究所(T21)担任研究工程师,并拥有一个非常活跃的推特账户。

哦,他认为你应该停止使用 Jupyter 笔记本。现在。

当你问他为什么时,他会给出许多理由,但有几个很突出:

  • 隐藏状态:假设你在笔记本的第一个单元格中定义了一个类似a = 1的变量。在后面的单元格中,你给它分配一个新值,比如说a = 3。只要你按照从上到下的顺序运行你的笔记本,这个结果是可以预测的。但是如果你不这样做——或者更糟的是,如果你运行a = 3单元并在以后删除它——很难或者不可能通过简单地检查笔记本来知道你的变量的真实状态。
  • 可复制性:要确保运行可重复的数据科学实验,最重要的事情之一就是编写健壮的模块化代码。Jupyter 笔记本含蓄地阻止了这一点,因为它们没有被设计成模块化的(笨拙的黑客确实允许你将一个笔记本导入另一个,但是它们,嗯,很笨拙)。此外,要重现另一个人的结果,您需要首先重现他们的代码运行的环境。普通笔记本并没有给你一个好的方法来做到这一点。
  • 不利于教学: Jupyter 笔记本让编写糟糕的教程变得非常容易——你知道,就是那种你漫不经心地按了一大堆“shift-enter”键,让你的电脑做一堆你实际上并不理解的事情?这导致了许多沮丧的学习者,甚至更糟的是,许多初学者认为他们了解如何编码,但实际上并不了解。

总的来说,Joel 对 Jupyter 笔记本的反对似乎很大程度上来自于他的哲学观点,即数据科学家应该遵循任何优秀软件工程师都会遵循的最佳实践。例如,Joel 强调了编写单元测试的重要性(即使对于数据科学代码来说也是如此),并且是使用类型注释的强烈支持者(如果你不熟悉类型注释,你应该在这里了解它)。

但即使是乔尔也认为 Jupyter 笔记本在数据科学中有一席之地:如果你正在研究一个熊猫数据框架来做一些基本的探索性数据分析,很难想到比可靠的 ol' Jupyter 笔记本更好的方式来即时制作有用的图表。

无论你站在朱庇特辩论的哪一边,都很难否认乔尔提出了一些令人信服的观点。我个人还没有关闭我的 Jupyter 内核,但我想我会在未来更频繁地启动我最喜欢的 IDE。

TDS 播客—剪辑

如果你在推特上,随时欢迎和我联系 @jeremiecharris

我们正在寻找能与我们的观众分享有价值的东西的客人。如果你碰巧知道谁是合适的人选,请在这里告诉我们:【publication@towardsdatascience.com】T4。

数据科学作为现代文科的案例

原文:https://towardsdatascience.com/the-case-for-data-science-as-the-modern-liberal-arts-803c9f1e125a?source=collection_archive---------12-----------------------

文科汇集了各个领域的见解和数据。这正是现代数据科学对我们的要求。

博雅教育由来已久。回到我们对自然现象的理解有限的时代,需要跨艺术、科学和人文学科的综合训练才能理解这个世界。随着我们开始更多地了解特定领域,我们需要更深入的专业知识来在该领域取得进展。

现代科学已经从文科教育中受益。这就是为什么数据科学应该被认为是现代文科。数据科学家所需的专业知识范围经常被批评为根本不存在的那种培训。然而,在现实中,文科已经为世界各地的年轻人提供了广泛的综合教育,现代数据科学是一种新形式的文科职业的出现。

成为数据科学家的要求

数据科学已经被广泛认为是 21 世纪最热门的工作之一。要做好你的工作,你需要成为计算机科学、统计学、数据工程、数据可视化、管理演示和说服性写作方面的专家。世界对所有的期望都感到慌张,主要是因为他们期待所有这些方面的“专业知识”。技术世界正在接受的是,当你有如此广泛的应用时,你最终不知道在哪里应用你的技能。类似地,当你面对大量的数据时,你必须系统地挑选所有的数据来理解它们。

几十年来,文科教育一直在教授广度和综合

当我开始在普吉特湾大学上大学的时候,我走进了一个小的文理学院,却一点也不明白这意味着什么。四年后,我上了历史、写作、生物、化学、数学、计算机科学和技术&社会课。我甚至参加了一个名为“寻找外星智慧”的课程。

剧透:它被称为“搜索”,因为我们还没有找到它。

文科的基本技能是阅读、综合和写作的能力。该死,说一个你可以到处应用的广泛技能。但是在训练如何磨练研究,筛选数千页的材料,然后建立一个有凝聚力和说服力的论点后,我开始变得很擅长。最终,我可以像讲述有机化学合成一样,轻松地讲述曼哈顿计划的文化规范。

文科及其与数据科学的关系

随着我们进一步进入数据驱动的科学,这个领域看起来越来越像文科。在过去,科学家们必须收集几乎所有的数据,才能做出“数据驱动”的决策。我们很大程度上是通过假设检验做到这一点的,就像我们在科学方法中做的一样。随着现代生活中数据的爆炸式增长,我们越来越需要探索已经存在的数据。

随着印刷机的出现,世界开始以书籍和文字的形式存储大量数据。为了理解所有这些,以及我们周围的自然世界,文科教授如何解释、综合和交流。

听起来熟悉吗?

每一天,我们都会写更多关于数据科学和有效沟通的交集。我们如何解释、综合和有效地交流我们通过数据争论、机器学习和人工智能方法发现的所有伟大的东西?

一个精心设计的文科学位是成为一名数据科学家的完美训练

我将冒险提出索赔。完美的数据科学学位应该看起来像英语学位,侧重于写作和阅读。它应该配有一个统计学/数学/计算机科学辅修专业和一个领域的第二个辅修专业,以提供领域知识(例如,生物学、化学、市场营销、物理学等)。

一旦学生掌握了有效写作的能力(代码或文章),他们就有能力讲故事。有效的数据科学取决于我们交流结果的能力。一旦你将构思和撰写故事的能力与领域专业知识结合起来,你就获得了引导数据驱动决策的强大能力。

作为现代文科的数据科学

世界需要更多的数据科学家。然而,我们目前对谁是优秀的数据科学家的定义过于狭隘。让我们邀请历史和英语专业的学生,作家,工匠,以及那些用自己的神经元网络在海量数据中筛选的人。(不要和神经网络混淆)。我们花费大量的时间和精力来培训工程师更有效地沟通。让我们花同样多的精力训练文科专业的学生如何写代码和推导算法。

我叫亚历山大·泰特斯,我有旅行癖。我经常陷入沉思,迷失在树林中,而且经常同时迷失在两者之中。我的人生使命是重新定义职业成功,将个人和职业追求都包括在内。你可以在 LinkedIn Twitter上找到我。

原载于 2019 年 8 月 11 日https://alexandertitus.com

用于将高级分析集成到决策支持软件中的 CED 设计框架

原文:https://towardsdatascience.com/the-ced-design-framework-for-integrating-advanced-analytics-into-decision-support-software-e6b34cc1be72?source=collection_archive---------46-----------------------

一个由三部分组成的 UX 框架,围绕信任、参与和不可或缺性来设计您的 ML/预测/说明性分析 UI。

随着您继续将界面和体验设计到越来越依赖于基于机器的分析和预测的分析工具中,设计中的挑战开始发生变化。以前,我们可能会处理信息架构,并将所有指标和统计数据组织到正确的位置和用户界面,以便进行眼球分析,通过预测和说明性分析,您的 UX 目标开始转变。

你们中的大多数人可能都在处理不完全是黑箱的分析服务和决策支持工具/产品。事实上,你们中的一些人可能正在处理相反的问题,例如黑盒的可解释性,或者让人们相信获得决策支持信息的“新方法”。我希望这个框架能够回答这个问题,“当我需要在我的软件/应用程序中以一种有用、可用、值得信赖和有价值的方式向用户展示预测性/规范性分析时,我应该如何去做?”

答案是一个名为 CED 的三部分设计框架,我看到它可以很好地帮助声明性分析变得有用和可用,而不会让用户过载,也不会完全依赖于用户无法看到/信任/理解的黑盒。我特别提到“声明性的”,因为这个框架是专门针对你的技术提供一些明确的声明、预测或意见的情况。你的产品/服务中可能混合了声明性和探索性分析,这是完全正常的。

什么是 CED UX 框架?

CED 代表结论,证据,数据。它类似于你可能知道的数据[DIKW]金字塔。

这是一个设计/UX 框架,旨在围绕高级分析建立客户信任,并提供一个基础“配方”,当您试图找出如何传达您的软件结论的价值和演示时,您可能会发现它很有用。我还发现,这对于为您的决策支持工具建立 UX/设计愿景非常有用:虽然它在技术上可能“遥不可及”,但它可能会启发您的团队如何迭代到更以人为中心的分析体验。

在我向您展示如何在您的产品中实现这一点之前,让我们认识到,您的分析可能是为了给人类做出的决策提供基于证据的支持而存在的。然而,尽管看起来合乎逻辑,你可能知道人类不一定这样做决定。你们中的许多人可能读过丹尼尔·卡内曼的书,思考快与慢,他在书中谈到了系统 1(快)和系统 2(慢)思考。你的客户通常使用前者做决定,直到你的分析给他们带来惊喜。系统 2 是关于这个分析思维的世界。这里的框架考虑到了这两个概念,为用户提供了一种先用系统 1 思维,必要时用系统 2 思维来体验您的服务的方式。

CED 在你的产品中是怎样实现的?

CED 在实现时,可能分布在多个步骤/屏幕/时间上,或者字面上可以是“一个屏幕”然而,这个细节在这个阶段并不重要。这里的目标是以一种自然的方式表达你的分析在工具/产品中的价值,当你的用户登录你的工具时,他们需要/想要做什么——不管在这个过程中可能需要多少“屏幕”。所以,你要做的是在必要时逐步披露更多的信息,而不一定要给用户带来负担(或整个体验)。

要做到这一点,首先要尝试用结论“引导”,用证据支持,如果必要的话,提供对数据的访问。这可能意味着向用户交付结论时会有一个小/短/简短的体验/UI。证据潜伏在“拐角处”,是你对分析的一些理由以及详细处方(如果相关的话)的陈述。这可能是一种“深入”的体验(“单击了解详情……”),但简而言之,这是解释结论中包括和不包括哪些因素的下一层内容/数据/词语/文本,以帮助客户理解得出结论的信心和成分。你也可以在这个阶段提供一个反馈机制。最后,杂草:数据。证据之下是原始的或可视化的数据,这些数据可能是也可能不是软件应用程序的 UI/UX 的一部分。这可以采用多种格式,如何在 UI 中表达这一点高度依赖于您的特定产品/服务/用例。

让我们在一个示例的上下文中分别看一下每个阶段。

CED 在一个示例场景中实现:

一家营销公司的营销经理希望更明智地使用广告预算。你正在设计一个功能/产品/服务来帮助他们用更少的手动工具时间和眼球分析来做到这一点。

假设:活动经理(我们的用户)正在脸书、谷歌和其他发布平台上为他们的客户开展多个广告活动。他们有 100 多种不同的创意(独立的广告设计)。活动经理的工作是微调客户的预算,并明智地使用它:他们需要决定哪些创意保持活跃,哪些编辑,哪些停用,他们应该花更多/更少预算的地点/受众,等等。现在,暂且不论这些领域中的许多云/技术参与者已经拥有各种工具来自动化其中一些步骤,让我们假设现在该用户只需查看活动统计数据来做出这些决策。您正在开发一种新产品或分析服务,通过声明性/说明性解决方案来帮助他们更有效地利用客户的预算,而不是强迫他们自己解释图表、表格和指标。你的数据/技术/模型应该帮助他们决定放弃、删除、修改或重新定位哪些广告。现在,你从脸书广告平台开始(MVP 思维模式,对吗?)并且您希望展示您迄今为止的技术投资的一些早期价值。因此,在第一次修订中,您只能提供创意方面的分析/见解,而不能提供定价方面的分析/见解。

就目前而言,无论是人工智能、机器学习模型、线性回归还是其他一些推动这些分析的技术,都无关紧要。摘下实施的帽子,戴上设计的帽子。你的目标是思考你希望这位竞选经理拥有的体验。

所以,我们把它放到 CED 框架里。

(C)结束语——UX 的开始

在设计阶段的早期,我喜欢和客户一起做的一个练习是让他们用句子的形式向我展示说明性分析的可能价值。如果产品/应用程序可以如此高度调整,只需在正确的时间给我发送一条包含正确信息的短信,它会产生什么样的见解?这是软件/算法得出的“结论”,或许还伴随着下一步该怎么做的药方。

精心设计的结论的特征:

  • 它可能根本不需要任何数据可视化。最好用简单的文本和单词来表达。
  • 它可以被体验为消息(推送、电子邮件、SMS、警报等)。),可能在特定的、知情的、有意义的时间发送。那是什么时候?你得研究用户才能知道。
  • 它提供了足够的内容来潜在地通知或激励行动——即使客户不会立即采取任何行动。
  • 如果系统可以将内容分类为异常/不寻常/意外,消息内容可以改变自身以提供稍微更多的强化,并承认人类可能会发现它“难以相信”的事实(还记得系统 1 和系统 2 的思维吗?)
  • 如果有必要,它会考虑时间:是否存在相关性窗口?过期?截止日期?
  • 这可能是为你的服务增加一些乐趣、幽默或其他“快乐”的地方/机会。
  • 它可能需要或受益于拥有一个专用的永久链接/地址,以便它可以被同事共享或参考,或被监控状态/有效性。
  • 它可能有一个采取行动的链接/启示(可能在另一个工具中)

因此,在我们的营销示例中,我们可能会产生一些类似于这些结论的想法。这些信息可以在用户界面上显示,也可以通过电子邮件发送:

  • 你在 XYZ 竞选中的大部分广告(31/54)可能应该被停用。预计他们的表现将继续落后于其余广告 2-3 倍,显示成本相同。(关掉这 31 个可能会为客户节省 2.3 万美元的无效支出,这可不是小钱)。[编辑广告][全面分析]
  • 无论创意中使用的图片是什么,XYZ 活动中的动词“购买”在您的创意标题中的点击量都超过了其他动词——1.5 倍。改变这一点可以将 CPA*从 3.45 美元降至 1.32 美元,如果全部预算都花掉,还会增加 412 次点击。你可以成为英雄![编辑广告][全面分析]
  • [Appname]预测使用此图像[IMAGE]的创意将胜过活动中的所有其他创意,并已暂停所有不使用此图像的广告。已经使用此图像创建了 10 个新创意供您审阅/批准。[点评建议][全面分析]

(*CPA =每次收购的成本)

你能看出这些信息是如何根据前面提到的结论设计的吗?它们提供了很少的“证据”,但是它们提供了一个行动的过程,并且在后一种情况下,实际上已经采取了一些行动(创建新的创意供用户批准)。每条消息还提供了一种快速的方法来进行全面的分析或采取合理的行动(在本例中,通常是编辑广告)。为什么我们要这样做?有可能用户最终会足够信任该消息,从而立即采取行动,而不需要每次都验证分析。他们也可能不会立即采取行动,但可能会重新查看警报/消息,并准备在未来的某个时间这样做,而不希望只是为了获得“行动”链接而不得不登录您的服务。当然,许多用户最初会想要探索证据(完整的分析链接),所以,接下来让我们来看看:

证据——提供信心和信任

(E)证据是经验的第二部分,从前面得出的结论(C)中获得。这个阶段和第三阶段,数据之间的界限有点模糊,但是大部分设计都是在“灰色区域”进行的。但是,这里也有一些关键特征:

  • 为结论提供数据选择和视觉支持的页面/屏幕或用户界面部分。它解释了为什么软件会产生结论,以及它是如何得出结论的。它直观地表达了软件发现的相关性。
  • 可能存在于永久或半永久的 URL/位置(可共享,但可能有内置的过期)
  • 如果你正在使用一个“可解释的人工智能”框架,这可能是你展示一些内容的地方
  • 本质上可能是交互式或报告式的(非交互式)
  • 为人类提供了一种方法,可以向系统(例如训练数据)或回路中的人类(您!),或者两者都有。(在蜜月期的早期和期间,征求反馈尤其重要)。
  • 可能陈述与用户潜在相关的尚未考虑的已知因素/特征/变量。(承认错误/差距以建立信任)。

在我们的营销活动管理场景中,这可能意味着 UX 的(证据)部分包括:

  • 某些广告/创意表现不佳的视觉证据(赢家和输家的表现指标,可能是创意样本上的小火花线)
  • 分析中不包括的因素列表(例如“没有查看过去 48 小时内创建的广告;没有考虑在移动设备上提供的创意(占所有印象的 32%);等等。)
  • “接受”推荐或采取下一步措施的启示(链接到广告用户界面,自动创建推荐的创意,暂停/停止表现不佳的人,等等。)
  • 模型中包含的一系列特性和置信度(“可解释的人工智能”),用简单的语言表达
  • 可能是在关闭某些模型特征的情况下运行模拟的方法(例如,“不要考虑我们在 Google 平台上运行的活动;仅限 LinkedIn 和脸书”)
  • 链接到深入研究详细数据(第 3 阶段)——这将在下一章介绍。

(D)ATA——UX 的最后阶段(希望是可选的!)

我们讨论了结论,这就引出了证据。您的客户 UX 设计工作的大部分应该花在前两个类别中为客户提供良好的价值和 UX,这样他们就不需要进入第三个阶段,即直接访问用于生成前两个阶段中呈现的信息的(D)数据。

如果客户经常深入到你的产品的第三阶段——(D)数据——那么这可能意味着你在前两个阶段需要改进。在这个框架中,目标不是对您的客户“隐藏”底层(D)数据。相反,我们希望将更多的繁重分析放在软件上,而不是放在客户身上。如果你看到客户经常深入,超过了(证据)阶段,那么你知道为什么吗?是因为:

  • 他们不信任分析(也许他们在过去吃过亏,或者产品还没有赢得他们的信任)?
  • 他们不理解这些信息,也不觉得它们有价值,认为他们必须自己拼凑起来?
  • (C)结论或(E)证据被认为是错误的、不完整的、不可信的或风险太高而不能相信其表面价值?
  • 他们需要向其他人(股东、老板等)证明。)?

理解这些“为什么”可以帮助您弄清楚如何围绕访问底层数据来设计体验。这意味着决定 UI 是否需要任何可视化、CSV 导出、可见表格、排序、过滤等。一般来说,我不会投入大量的时间和资源来设计你的 UI 的这一部分。因此,您可能希望更多地关注允许用户导出数据,以便在他们自己的工具(如 Excel 等)中进行探索。就 web UI 而言,这是一个利用现有 UI 框架的好地方,这些框架可能会为您提供一些组件,比如内置了排序和过滤功能的数据表。

关于导出并使这种体验尽可能有效的一件重要的事情是:考虑包括来自先前阶段的信息(先前的软件结论和证据)。他们可能会知道你的软件是如何得出这些结论的,而这反过来会让他们在将来信任和理解你的产品。

还值得注意的是,这里的风险水平可能足够低,以至于我们的客户(营销经理)根本不会花时间做任何眼球分析,可能已经“转移”到其他工作职责上了。他们手动分析非常复杂的数据所需的努力可能根本不值得,此外:这是他们购买您的服务的原因,对吗?!

无论如何,没有特定的领域知识和与客户交谈,很难为我们的活动管理用例提供特定的 UI 特性,因为我们不知道用户将在您的应用程序之外使用这些信息做什么。然而,我们可以集思广益,想出一些可能有用或激发你想象力的想法:

  • 按时间段、按对象(特定广告创意)、按活动、按提供商/来源下载原始数据。
  • 提供有关数据的元数据(时间戳、数据收集时间、数据源状态,例如它们是否是最新的)
  • 对你知道他们可能想做的数据提供一些额外的计算(例如,额外的工作表或下载,包括总和、平均值、最小值/最大值、偏差、组总数等。)—有效地在 Excel 中为他们节省了一些步骤
  • 如果相关且非专有,提供软件分析中使用的模型信息(如果适用)。请记住:这可能更多的是通过透明度来建立信任,而不是帮助他们理解或利用您的生态系统之外的模型。

CED UX 框架总结

没有为每个涉及为用户提供决策支持的分析产品提供神奇的设计子弹,但当你引入声明性(解释性)分析时,有一些方法可以围绕逐渐提供更多信息的体验来设计你的界面,只有在需要时。总的来说,记住用户的目标可能是使花费在你的工具上的时间尽可能的少(他们可能想要在尽可能少的时间里获得高价值)。因此,我们想花更多的时间给用户一个可信的、准确的、有用的结论,并确保电子证据的设计尽可能地强化这些结论。体验的第三阶段,手动(D)数据探索,是您可能希望花费最少资源的地方,但是我们不应该完全忘记它,因为有时这种透明性可能很重要。让您的客户研究会议和测试帮助您了解如何以及在哪里花费更多时间来获得正确的 UX。您对客户问题空间了解得越多,就越容易理解如何在您的 UI 中呈现信息,从而为您的客户提供出色的分析 UX。祝你好运!

照片由菲利普·帕多克/Flickr 提供。

https://designingforanalytics.com】最初发表于**。我叫 Brian T. O'Neill,我帮助产品管理和数据主管将分析和 ML 转变为不可或缺的数据产品和决策支持应用程序。关于如何创造更有用、可用、以人为中心的数据产品的每周见解,你可以加入我的见解邮件列表,并在 https://designingforanalytics.com/list 获得体验数据播客更新。* 联系我这里。*

中心极限定理及其含义

原文:https://towardsdatascience.com/the-central-limit-theorem-and-its-implications-4a7adac9d6de?source=collection_archive---------10-----------------------

Photo by Joel Filipe on Unsplash

深入研究数据科学中最重要的定理

中心极限定理…是我们所有机器学习研究者和实践者的母亲。我们每天都在利用它,然而我们并不欣赏它。为什么那些讨厌的神经网络会汇聚到各种东西上?图像、时间序列等。我们可以学到很多东西,这一切都归功于这一点,乍一看很简单,但当你深入研究时,这是一个相对重要的概念。我们来解剖一下!

那么什么是中心极限定理呢?中心极限定理是这样的,用统计学术语加密:

无论总体分布的形状如何,随着样本量的增大,样本均值的抽样分布趋于正态分布。

或许让我们用简单的英语表述一下(抱歉,统计学家):

如果你从任何分布中抽取一批数据并取每批数据的平均值。那么平均值的分布将类似于高斯分布。(取总和也一样)

我不知道这个定义是否更容易理解(对我来说是的)。但也许让我们通过一个例子让它变得更具体。让我们采用高斯分布以外的分布,例如伽马分布。伽马分布基本上是这样的:

虽然当我们从数据中取样时,数据看起来很明显,但是让我们把它具体化。当从伽马分布中采样数据时,当我们绘制直方图时,数据看起来像这样:

从逻辑上讲,它类似于我们采样的伽马分布的密度函数。现在,让我们做我们在中心极限定理中陈述的事情。例如,让我们从大小为 30 的伽马分布中抽取 2000 批数据,取它们的平均值,看看会发生什么。

惊喜惊喜,这其实看起来像正态(高斯)分布。那么,如果我们改变样本的批量大小呢?让我们尝试以非常小的批量进行采样,比如说 2:

从逻辑上讲,我们又回到了看起来更像伽马分布的地方。如果我们对样本使用很大的批量,比如说 1000 个,会发生什么?

我们又看起来更正常了!所以,这有点太棒了。现在,只是为了好玩,让我们采取均匀分布,以便完全信服。均匀分布直方图如下所示:

很吵吧?现在,让我们做与伽马分布相同的事情,取样本的平均值并绘制最终分布:

再一次,它看起来像一个高斯!希望,如果你到现在还不相信,这个能说服你。

但是现在我们知道了这个很酷的事实,它实际上是如何有用的呢?让我们来看一下机器学习。正态分布的好处是它只需要两个参数来建模,均值和标准差。有了这些,基于中心极限定理,我们可以描述任意复杂的概率分布,看起来一点也不像正态分布。这让我们可以作弊,说我们可以在统计推断中无处不在地使用正态分布,尽管潜在的分布看起来一点也不像。

正态分布也有一些很好的属性,这使它很有用。例如,只取密度的对数(也称为对数似然)简化了机器学习中的许多事情,并自然扩展到均方误差,这是一种常用于回归任务的损失函数。实际上,表明使用均方误差相当于执行最大似然估计是相对微不足道的。此外,如果应用 L2 正则化,你可以表明,这相当于最大的高斯先验的 Aposteriori 近似,也很平凡。

回到中心极限定理,思考一下深度学习和随机梯度下降。随机梯度下降是如何执行的?我们通常从我们的训练集中抽取一批样本,然后计算这些样本的损失的平均值或总和。那么这种损失将如何分配呢?中心极限定理告诉我们,如果批量足够大,损失估计的最终分布将是高斯分布!下一步,我们将讨论置信区间以及它们如何在统计推断中发挥作用。

置信区间

从更具统计学意义的角度来看,高斯分布用于使用置信区间进行假设检验,或者查看实验结果的统计显著性。那么什么是确切的置信区间呢?让我们直接举个例子。假设我们想要估计我们平均睡眠时间的平均值。为此,我们取 200 天,取睡眠时间的平均值。这被称为均值的点估计。现在我们问自己,均值估计的分布是什么样的?我们已经知道,由于中心极限定理,它看起来像一个高斯函数,但是我们还可以知道其他的东西。我们可以计算平均估计值的标准偏差,也称为标准误差。也就是说,它等于以下内容:

所以我们要看的是样本标准差除以样本大小的平方根。请注意,当样本量趋于无穷大时,均值估计的标准偏差趋于零。这完全说得通,因为这样我们就有了对无限样本均值的完美估计。现在,我们如何构建一个置信区间?一个置信区间总是和一个概率绑定在一起的,也就是说当我们说一个 95%的置信区间时,例如,我们的意思是这个区间内的值“活”在 95%的密度内。或者换句话说,对于给定的分布,我们有 95%的概率确信采样值将落在这个范围内。所以,基本上,我们的置信区间(95%)是这样的:

一般来说,为了构建一个 X%的置信区间,统计学家通常使用一种叫做 Z 分数的东西。我不会在这里介绍具体的计算方法。但它相当于计算 Z 得分(实际上是特定值的平均值的标准化偏差)并在 Z 表中搜索特定概率,请注意,此操作也适用于其他方向(计算给定置信区间的值)

现在我们有了平均估计,我们有了 X%的置信区间。此时要问的正确问题是,这个置信区间说明了真实均值的什么,或者换句话说,我们离真实均值估计值有多远?如果你认为真实的平均值在这个区间内,概率为 X%,那你就错了。正确的解释是,我们知道如果我们继续以这种方式采样,X%的区间将包含真实的平均值。

这篇文章从理论上来说并不全面,不足以公正地处理中心极限定理,但是希望它能让你对它的有用性有一个(简洁的)了解。我敢说,在任何时间点,当你做统计推断,机器学习或你想叫它什么的时候。用中心极限定理来思考问题是有用的。很难用直观的方式解释 CLT,谁知道呢,也许如果你对关于中心极限定理的帖子进行足够的采样,你可能会得到对其真正意义的有效估计!

雇用人工智能专业人员的挑战

原文:https://towardsdatascience.com/the-challenges-of-hiring-artificial-intelligence-professionals-fc691089bf41?source=collection_archive---------21-----------------------

Photo by Clem Onojeghuo on Unsplash

人力资源视角

前几天,我和我的经理边喝咖啡边聊天,话题转向了人工智能。在这个话题上,他评论说,“在人工智能领域,许多人只说不做”。虽然他说的总的来说是对的,但我觉得 AI 项目的成败是在 的招聘点上预先决定的。

富人越来越富,穷人越来越穷

在过去的几个月里,我一直在面试不同行业的不同公司的数据分析师,初级数据科学家或人工智能工程师职位。面试的时候,我注意到我面试的这些公司有很多不同之处。他们可以分为两类: AI 领先者AI 落后者

Source from Accenture: The Momentum Mindset [1]

还存在一种“富人越来越富,穷人越来越穷”的现象,原因很简单。

在我开始之前,我们需要区分两组人:

业余爱好者

这群人对数据科学有着浓厚的兴趣,要么 1)正在转行,要么 2)刚刚转行,要么 3)已经有两年的工作经验。

这群人想弄脏自己的手。越脏越好。他们的重点是尽快提高自己的技能。这包括 1)能够与志同道合的人一起工作,2)有机会在工作中每天学习,3)接触生产级代码和端到端 ML 管道。

专业人士

这群人有着多年的 AI 工作经验。他们知道如何构建和部署 ML 模型,在给定的时间表内计划和执行 ML 项目,并且知道建立一个成功的数据科学团队的来龙去脉。

在他们职业生涯的这个阶段,这些人正在挣大钱。他们很受欢迎,他们要么是人工智能顾问,要么是大数据科学团队的经理。

“富人越来越富,穷人越来越穷”现象就是这样产生的。

试图涉足人工智能的落后者会做以下任一事情:

  1. 雇用一名专业人员来启动一切与数据科学相关的工作 —这尤其困难,因为专业人员的数量比业余人员少得多。还有,这些专业人士在各自的公司已经是高薪了;挖走一个人来启动数据科学计划将是极其昂贵的(因为所涉及的工作是巨大的)
  2. 在每个团队中加入一名业余选手 —由于缓慢的学习曲线,这通常会导致个人无法获得足够的满足感。由于个人缺乏经验,ML 模型不能进入生产。

最终,专业人士过度工作并离开公司,而业余人士由于缺乏工作满足感而离开。

然而,一个人工智能领导者将已经拥有相关的基础设施来建立和部署人工智能模型。数据管道中的每个团队都清楚自己的职责,吸引人才不是问题。

这如何转化为招聘?

如果说吸引人才对落后的AI来说还不够难的话,吸引合适的人才就难上 100 倍了。

落后的人工智能常常意识不到自己的需求。它不知道应该在哪里或如何部署它的努力。这通常会导致工作描述包括人类历史上基本上每一种编程语言,以及你能想到的每一种机器学习和计算机科学术语。它看起来像这样:

  • 了解 Java、C++、C#、Python、SQL、Scala、PHP、Javascript、R、Tableau、Power BI、Azure、Spark、AWS、Hive、Pig、Matlab、Bash、Linux、Julia、Octave、SAS、Hadoop、Perl
  • 计算机科学、数学或其他定量领域的硕士或博士
  • 在预测建模、机器学习和高级分析方面拥有超过 8 年的学术/行业经验
  • 对高级统计和现代机器学习预测技术有扎实的理解和经验,如 GLMs、决策树、森林、增强集成、神经网络、深度学习等
  • 具有敏捷方法的经验(例如 Scrum、看板、开发/运营)
  • 了解 JanusGraph、Apache Ranger、Apache Atlas 和基于图形的解决方案
  • 优秀的沟通技巧,善于分析

是的,这个星球上基本上没有人。甚至连比尔·盖茨自己都不符合这个要求。

招聘人员缺乏相关知识

随着人工智能的持续繁荣,人才将继续短缺,因为需求超过了供应。技术招聘人员有可能解决公司的人才短缺问题,或者继续向采购公司扔出一张大网的候选人,希望有一个候选人奇迹般地通过筛选。

一个很适合的数据科学家不再是简历中匹配关键词如“ Python ”或“机器学习”的情况。数据生产管道包括数据工程师、数据分析师、数据科学家、AI 工程师、机器学习运营等。了解公司需要什么,知道这些角色之间的差异,将会区分优秀和平庸的技术招聘人员。

AI 落伍者是注定的吗?

不,但是对他们来说爬出这个沟会很困难。如果公司不知道他们需要什么来开始,请一位顾问。根据我的经验,从长远来看,内部开发通常会胜出。让太多不同的供应商参与解决方案只会产生依赖性和局限性。

落后的大公司由于专注于成本和流程自动化而变得特别顽固,正如由解决企业 ML 主要趋势的 Algorithmia 进行的调查所表明的那样。

Source from Algorithmia: 2020 state of enterprise ML 2020 [2]

从图表中可以看出,人工智能预算全面增加,但部署率(在生产中)仍保持在 45%的低水平[2]。在人工智能采用方面相当年轻的公司应该非常关注他们需要的人才和技能类型。请记住,Jupyter 笔记本模型在投入生产并产生商业价值之前没有任何意义

结束语

虽然我确实同意我的经理所说的,但我认为组织或团队最终效率低下或没有产出的原因归结于无效的领导。此外,组织越大,社交游手好闲的可能性就越大。在人工智能领域,我确实有一个天真的想法,因为我相信这个领域的个人有动力创造价值,因为他们看到了人工智能带来的价值。能够为这项工作雇用合适的人工智能专业人员只会变得更加困难,但希望随着时间的推移,事情会变得更好。

参考

[1]埃森哲:动量思维模式——https://www . Accenture . com/_ ACN media/pdf-73/Accenture-strategy-ai-Momentum-mind-exec-summary-POV . pdf
[2]algorithm ia:2020 年企业机器学习状态——链接此处

大数据平台的特征及其对数据探索的重要性

原文:https://towardsdatascience.com/the-characteristics-of-big-data-platforms-and-their-importance-for-data-exploration-650ec45cec14?source=collection_archive---------16-----------------------

引言:近十年来,指数级增长的数据已经成为知识的关键。传统系统无法及时处理如此大量的数据。大数据技术和平台不仅可以生成信息,还可以及时生成有意义的见解。不仅仅是数据量,还有结构化或非结构化数据的多样性以及数据增长的速度,使得传统系统无法处理海量数据。基于摄取、预处理和处理的速度,数据的处理可以是不同种类的:批处理、实时、流式和交互式。日益增长的处理海量数据的需求导致了许多大数据平台的兴起,如 Cloudera 的 Hadoop 发行版(CDH)、Hortonworks 数据平台(HDP)、AWS Elastic Map-Reduce(AWS-EMR)等等。这些开源技术的每一个版本,如 Apache Hadoop、Hive、HBase、Sqoop 等。是一个统一的产品,用户不必花费时间将这些元素组装成一个单一的功能组件。本文将进一步讨论 CDH、HDP 和 AWS-EMR 的架构,并对它们进行比较,还将讨论这些架构对于数据探索和直觉生成的重要性。

不同大数据平台的架构:

  1. Hortonworks 数据平台(HDP): HDP 是开源技术的组合,旨在简化大数据技术的采用。HDP 最新的 3.1 版本支持批处理服务、流处理服务、实时处理服务以及机器学习和深度学习框架。它使用 Apache Ranger、Apache Knox 和 Apache Atlas 来实现对数据的一致和安全的访问以及元数据的管理,并使用 Apache Ambari 来协调集群的供应、管理和监控。Yarn 为集群进行所有的资源协商。HDP 现在是一个混合数据平台,即分析脚本可以在云存储(AWS S3,Azure ADLS)以及 HDFS 存储系统上运行。HDP 还支持分布式 Tensorflow,使用它可以在分布式集群上运行深度学习脚本。HDP 还支持 Docker 容器或 native Yarn 容器中的第三方应用程序。
  2. 2.2。Cloudera 的 Hadoop 发行版(CDH): CDH 的愿景是为 Hadoop 和大数据带来分析查询和实时查询,这推动他们从事像 Impala、Kudu 这样的项目,这些项目后来被捐赠给了 Apache Software Foundation。Cloudera 根据数据的用途提出了不同的解决方案,即:数据仓库、数据科学、数据工程、运营数据库和混合云部署,根据客户的需求以不同的组合提供。CDH 也是一个混合数据平台。和 HDP 一样,CDH 也不支持 Jupyter IPython 笔记本。CDH 还支持 Apache Kite,它提供高级 API 和工具来在 Hadoop 集群中存储数据。
  3. 亚马逊 Web 服务—弹性映射还原(AWS-EMR): 亚马逊 Web 服务已经是一个企业的完整解决方案,他们提供完整的云解决方案(基础设施、平台、软件)。他们通过 EMR 提供大数据分析。EMR 不是一个混合数据平台,但在分析方面与 S3 紧密相连。EMR 提供了巨大的成本节约,因为我们可以专门配置为一个作业启动一个集群,并在作业结束时立即关闭它,或者根据我们自己的选择连续运行一个集群。我们还可以在作业运行时动态扩展集群。AWS EMR 集群还支持 TensorFlow 和 MxNet 深度学习框架。

不同大数据平台的数据探索:大数据探索基本上遵循两个著名架构中的一个,要么是 Lambda,要么是 Kappa。Lambda 包括批处理层、流处理层和服务层,而在 Kappa 架构中,批处理层被跳过,实时和连续处理都在单个流中完成。每个大数据平台针对不同的处理类型使用不同的工具。因此,为了比较三个大数据平台,我们将在处理场景中对它们进行比较:

  1. 批处理:三个平台都支持种类繁多的批处理工具,如 Apache Hadoop、Hive、Pig、Spark 其可用于批处理以及流处理。HDP 和 CDH 不支持 Flink,这是另一种混合处理工具,就像 Spark 一样,Flink 和 Presto 可与 AWS-EMR 一起使用,CDH 支持 Impala 作为批处理工具,提供非常快的吞吐量。
  2. 流处理:对于流处理,所有三个平台都支持 Spark 和 Kafka。此外,AWS-EMR 支持 Apache Flink,HDP 支持 Apache Storm。Storm 是第一个真正的流处理引擎,而 Flink 在其核心是另一个真正的流处理引擎,支持几乎所有流处理的高级功能,如事件时间处理、水印等,并提供低延迟和高吞吐量。
  3. 服务层或实时处理: Hbase 是所有平台的通用工具,当 CDH 支持 Kudu 时,它可以用来服务数据。HDP 支持 Druid,还有 Phoenix 和 Accumulo,AWS 提供 Hbase 和 Phoenix 来快速访问和查询数据。

结论:宇宙的数据分析启发了可以在生活的各个领域帮助人类的模式。Hadoop、Spark 等大数据技术。使得这种分析成为可能。大数据平台通过同时提供大数据技术,简化了大数据处理架构的实施:Lambda 和 Kappa。在比较 AWS-EMR、CDH 和 HDP 的架构时,我们注意到所有平台都带来了不同的技术融合,已经开始促进分布式深度学习框架,并且是独立完整的平台来执行任何类型的数据处理。

参考文献: 1。 Hortonworks 数据平台
2。[深入探讨基于 Hadoop 的大数据架构](https://www.researchgate.net/profile/Allae_Erraissi/publication/322686669_Digging_into_Hadoop-based_Big_Data_Architectures/links/5a68e1cea6fdcccd01a1943f/Digging-into-Hadoop-based -Big-Data-Architectures.pdf)
3。 Hortonworks 数据平台
4。 Cloudera 企业架构
5。亚马逊电子病历架构
6。德鲁伊 vs 库杜7。λ和κ
8。[Spark Streaming vs Flink vs Storm vs Kafka Streams vs Samza:选择您的流处理框架](https://medium.com/@chandanbaranwal/spark-streaming-vs-flink-vs-storm-vs-kafka-streams-vs -samza-choose-your-stream-processing-91ea3f04675b)

我希望你能发现这篇文章内容丰富且简单易学,如果你有任何疑问,请随时拨打 info.ankitp@gmail.com的电话联系我

用 R 探索电影中的彩色故事:ChromaR 包

原文:https://towardsdatascience.com/the-chromar-package-892b716ee2c9?source=collection_archive---------26-----------------------

关于如何生成电影框架线和许多其他彩色数据的实用见解

0.我们离开的地方

在这个多彩旅程的第一部分中,我们探索了一些从著名电影中摘取的有趣的半音阶例子 ,试图猜测导演们选择背后的原因,并通过 R 脚本挖掘可以做些什么。

[## 探索 R 电影中的彩色故事(上)

一次丰富多彩、数据驱动的电影色彩世界之旅

towardsdatascience.com](/exploring-chromatic-storytelling-with-r-part-1-8e9ddf8d4187)

在第二部分中,我们将讨论更多的技术细节,介绍 ChromaR 工具包,这是一个 R 包,允许我们渲染之前在第一部分(以及更多)中显示的所有彩色可视化。

1.设置好一切

安装 ChromaR

ChromaR 包托管在 GitHub 上,因此必须通过 Devtools 安装:

如果你想检查源代码,这里是 ChromaR Git 库:

[## 清晰度/色度

ChromaR 是一个实验性的 R 工具包,用于分析和探索电影或任何其他视频中的彩色故事…

github.com](https://github.com/detsutut/chroma)

数据

正如在第一部分中提到的,在 R 中检索视频源的张量分量有点棘手,因此必须以其他方式实现。
然而,ChromaR 公开了两个现成的数据库,您可以用于实践目的。

 R     G     B     lum   duration  RGB     title          frameId
1 95.43 84.02 76.22 86.58 7020      #5F544C Nausicaa o...  1
2 70.16 72.72 70.92 71.76 7470      #464846 Laputa Cas...  2
3 75.58 82.22 74.08 79.34 5185      #4B524A My Neighbo...  3
4 85.45 93.22 88.66 90.39 5595      #555D58 Porco Rosso    4
5 58.40 65.24 61.49 62.77 7995      #3A413D Princess M...  5
6 77.02 87.91 91.37 85.03 6180      #4D575B Kiki's Del...  6

如果你已经有了自己的 csv RGB 文件,可以通过 getFrames() 导入。

Hayao Miyazaki and (some of) his colorful creations [© Reel Anarchy]

2.得到我们的第一个框架

坚持使用宫崎骏的数据集让我们为娜乌西卡检索一个框架,我们电影列表的第一个条目。通过合并连续帧组(即平均 RGB 通道阵列)生成帧线。
使用组帧功能将帧分组,并指定时间窗口的宽度。根据此参数,生成的框架线可能清晰或模糊。对于大多数电影来说,5 秒的窗口通常是合适的,但是您可以使用 plotTimeWindows 功能对其进行可视化调整。

The algorithm suggests two different cutoffs: a soft one (sharp frameline, most of the color information is preserved) and a hard one (blurred frameline, defined by the time constant of the exponential decay)

…or you can simply pick up your favorite window size by visual inspection

3 到 20 秒之间的一切似乎都很好,所以让我们选择第一个建议的窗口大小。 plotFrameline 函数将负责渲染。

如果您想在同一情节中渲染多部电影,您可以将 groupframe 函数应用于列表中的每部电影,并将整个集合提供给 plotFrameline 函数。

3.摘要图块

对整个季节或电影系列的色度研究可以集中在许多不同的特征上。现在让我们来考虑一下那块名为 爱情、死亡&机器人 的小金子,出自网飞

“Three Robots”, one of the most loved episodes of Love, Death & Robots by Blow Studio (© Netflix)

广受好评的新网飞系列的每一集都是由不同的艺术家和工作室设计、导演和制作的。这种异质性清楚地反映在剧集的色彩选择中,可以使用 plotSummaryTiles 函数进行总结和比较。
例如,我们可以比较每一集的亮度来猜测哪一集是“最暗”的。
为了这样做,我们必须先拿到摘要。可以使用 getSummary 函数检索摘要。这些摘要必须输入到 plotSummaryTiles 函数中,指定我们感兴趣的特性。

Average Brightness value for each episode

结果显示《援助之手》是该剧最黑暗的一集。这不会让你感到惊讶,因为剧情完全是在空间设定的。银牌颁给了《超越阿奎拉裂谷》,如果你已经看过了,就不需要任何进一步的解释了。最精彩的一集(到目前为止)反而是《交替历史》和《当酸奶掌权的时候》:光明一面统治世界一次!

“Helping Hand” vs “When the Yogurt Took Over” (© Netflix)

通过简单地将模式参数从 lum 切换到 hs ,可以对饱和度和色调重复相同的过程。

Average Hue and Saturation values for each episode

不出所料,“马孜蓝”似乎是最冷的一集。在下一章,我们将用一组更具体的函数来更深入地研究它。

This frame from “Zima Blue” basically encapsulates the color palette of the whole episode (© Netflix)

4.温度、通道和圆圈

作为一个有着重大意义的简单故事,这一集展现了与其他集相比非常小的调色板,却没有失去一点色彩力量。当对帧进行分组时,可以简单地通过应用宽时间窗口(15 s)来检索整个剧集的调色板。

“Zima Blue” palette and keyframes (© Netflix)

正如所料,蓝色主导了这里的场景。通过温度功能检查色调,我们可以清楚地看到这种趋势,该功能测量每帧色调与纯红色的距离。除了两节,全集都是偏向蓝色/青色

Temperature comparison between “Zima Blue” (top) and “When the Yogurt Took Over” (bottom)

通过 plotChannel 函数检查色调通道趋势可以得出类似的结论,该函数除了通道图之外还返回导数趋势。与其他剧集相比,“马孜蓝”的导数在故事的相当大一部分几乎为零,这意味着在同一个场景内没有发生显著的色彩变化(这就是为什么我们有这么小的调色板)。

Hue channel trend and its derivative

毫无疑问,蓝色/青色是“马孜蓝”的主角。那其他几集呢?蓝真的代表性过高吗?让我们用 colorCircle 函数来比较一下,比如,这个系列的第五集《灵魂的吸盘》。该函数生成一个弦图,一个显示** 数据之间相互关系的图形化方法。每个帧围绕一个圆呈放射状排列,帧之间的颜色过渡绘制为连接源和端点的弧线。**

Chord diagram of “Zima Blue” (left) and “Sucker of Souls” (right)

在这里,我们可以清楚地看到两集之间的青色/天蓝色和橙色百分比有多么不同。这两种色调在色轮上截然相反,因此它们的表现对传达温暖或寒冷具有决定性作用。运行下面的脚本,我们可以生成这些奇特的情节。

结论

探索和分析电影中颜色的使用是很棒的,可能会带来意想不到的发现。这两个系列的文章仅仅触及了一个更加复杂的世界的表面,这个世界对于每一个对数据可视化感兴趣的数据科学家来说都是一个令人惊奇的体育馆。
在评论中留下你的想法和
查看** 第三部分 如果你也喜欢这个!**

请注意,chromaR 包仍然是一个测试版,必须进行许多改进,以使其 100%可操作。因此,请报告您遇到的任何错误或问题!

** [## 用 R 探索电影中的彩色故事:调色板提取

如何使用颜色量化理论和无监督机器学习从电影帧中提取调色板

towardsdatascience.com](/r-color-palette-extraction-3850b3f56152) [## Tommaso Buonocore -作者-走向数据科学| LinkedIn

查看世界上最大的职业社区 LinkedIn 上 Tommaso Buonocore 的个人资料。托马索列出了 5 项工作…

www.linkedin.com](https://www.linkedin.com/in/tbuonocore/)**

无家可归者的城市:洛杉矶街头的人道主义危机

原文:https://towardsdatascience.com/the-city-of-the-homeless-humanitarian-crisis-on-the-streets-of-los-angeles-1bdbef345e6c?source=collection_archive---------16-----------------------

Credit: Jon Doe Forty (https://flickr.com/photos/jondoeforty1/7477541122/in/album-72157630366754738/)

城中之城

这里的大多数人都会告诉你,天使之城是一座集多座城市于一身的城市。从韦斯特伍德到西亚当斯或从银湖到贫民窟,你会发现美国的缩影:140 个国家的美食、语言、文化和建筑,所有这些都来自同一个太阳,都来自洛杉矶。但是如果洛杉矶是许多城市中的一个,那并不意味着我们都生活在同一个洛杉矶。这一事实在大都市区发展最快的城市之一——无家可归者之城——最为突出。

按照加州的说法,无家可归者的城市不大不小。2019 年人口约 3.6 万,略大于比弗利山庄,略小于克莱尔蒙特。但是它正在经历人口激增:根据洛杉矶无家可归者服务机构的数据,洛杉矶无家可归者的数量在去年增长了 16%。作为一个参考,在洛杉矶 20 世纪 20 年代的人口激增期间,每年大约增长 8%。如果无家可归者的城市继续以这种速度增长,到 2021 年圣安娜到达时,超过 1%的洛杉矶人将无家可归。

Homeless population counts since 2015, as well as a projected value for 2020 based on simple linear regression. Source: LAHSA.

毫不夸张地说,这座无家可归者的城市正处于人道主义紧急状态。无家可归的人正在以创纪录的数量死去。LGBTQ+群体的成员和有色人种受到的影响更大,妇女也是如此——她们中的许多人已经无家可归,而不是继续与虐待她们的配偶生活在一起。但是也许没有一个统计数据能像这样概括这种情况的严重性:如果无家可归者的城市是它自己的国家,它将是地球上预期寿命最低的国家:

Source: CIA Factbook & USNews & World Report

关于谁露宿街头以及为什么帮助他们如此困难的主要说法是,无家可归的人都是吸毒者和/或严重的精神病患者。这种破坏性的叙述使无家可归的人失去人性,试图为无所作为辩护。但事实上这也是不正确的:根据最近的数据,无家可归者城市中大约 70%的人既没有严重的精神疾病,也没有物质滥用障碍。尽管**《洛杉矶时报》最近对这个数字提出了质疑,但他们是通过篡改数据的方式做到这一点的,这种方式违背了合理的科学实践,我曾在其他地方写过这方面的文章

那么,这些数字是从哪里来的?自 2015 年以来,经历“慢性”无家可归的人数没有太大变化。退伍军人或脑外伤患者的数量也没有增加。一些最大的变化来自两个群体:(1)逃离家庭暴力的人和(2)患有慢性疾病的人。

Proportion of homeless population belonging to specific demographic groups in 2015 versus 2019. Source: LAHSA

大量的人——主要是妇女——正在逃离暴力。显而易见的下一个问题是:最近家庭暴力/性暴力增加了吗?可惜,答案是肯定的。根据司法统计局加州司法部长办公室的数据,去年,洛杉矶县的强奸案发生率处于 1991 年以来的最高水平。在全国范围内,强奸、家庭暴力和亲密伴侣暴力的发生率在过去几年里都有所上升。这是为了将女性挤出稳定的住房。因为只有一小部分无家可归者的专用床位在女性收容所,一旦女性流落街头,她们的未来会迅速变得更加黑暗。

Source: LAHSA

除此之外,还有经济因素,比如越来越严重的经济适用房短缺。这造成了一种压力,大多数洛杉矶人都熟悉这种压力,这种压力由于 T2 越来越多地使用埃利斯法案驱逐租金受控制的租户而加剧。在医疗费用上涨和工资停滞的共同作用下,这种压力越来越迫使人们不是陷入贫困,而是无家可归。这里有一个数据来支持这种说法:63%的人口第一次无家可归。他们中的大多数已经在这个地区生活了很多年。这些都不是陌生人;这些是你在杂货店、学校和镇上看到的人。**

解决我们街道上的人道主义紧急情况有两种基本方法。一种方法是治标——换句话说,让无家可归的人回家。为了实现这一目标,该市正在努力将无家可归者安置在临时或永久性住房中。仅去年一年,就有近 22,000 人被安置在永久性住房中。这是一项英勇的成就,但显然还不够。展望未来,约有 1400 套公寓将在 2019 年至 2020 年间开放,总共约有 10,000 套正在筹备中。但这些数字不足以覆盖我们无家可归人口的逐年增长。

不幸的是,加快我们的建设承诺速度需要比许多城市政客所能忍受的更多的政治意愿:居民在他们的地区建造低收入或过渡性住房仍然非常不受欢迎,更不用说避难所了,原因包括认为这可能影响交通拥堵、房地产价值或当地安全。

解决我们的人道主义紧急情况的另一个方法是解决紧急情况的根源,这样人们就不会一开始就无家可归。我们不需要通过预测水晶球来理解这些根本原因。街上的人们已经告诉我们发生了什么:

他们在身体上和心理上都受到了如此严重的虐待,以至于他们认为自己在街上的机会更大。他们被房东和开发商赶出了自己的家园,他们正以创纪录的数量使用埃利斯法案将租户从租金控制的单元中驱逐出去。他们正被城市交通基础设施拖入经济困境,这些基础设施限制了他们获得经济和教育机会,使变得危险,除了汽车 之外的任何手段都难以出行。随着生活费用和生病费用的增加,而工资却没有相应提高,他们在挣扎着维持生计。2019 年,这个城市的最低工资收入者将需要每周工作 79 小时才能买得起中等价位的一居室公寓。

简而言之,这些力量可能会形成一种恶性反馈循环,在这种循环中,处于边缘地位本身就会成为进一步边缘化的力量。

我们需要标本兼治。这样做需要大量的公众支持,重新定位我们如何看待无家可归者,并拒绝接受一个允许其居民生活在痛苦中并集体死去的城市。我们需要优先考虑洛杉矶人的生活,如果我们选出的官员没有做到这一点,我们需要追究他们的责任。

对于我们每个人来说,这最终可能是一个个人问题:尽管我们可能会遮住眼睛,但我们中的许多人距离自己流落街头只有一次医疗急救。这就是我们将会发现的:一个去年有 918 人死在公园长椅和人行道上的城市。仅在过去的几个月里,这座城市就有几个无家可归的人被活活烧死。

洛杉矶是一座罕见而美丽的城市。为了这座城市的灵魂,我们必须承认我们正面临一场真正的人道主义危机。我们必须明白,虽然我们可能不是点燃火柴的人,但由于我们的不作为,我们正在让我们的城市燃烧。

每个强化学习研究者应该上的课

原文:https://towardsdatascience.com/the-class-every-reinforcement-learning-researcher-should-take-4a464bcd5586?source=collection_archive---------7-----------------------

什么训练狗可以教你关于 RL 的知识

我的团队刚刚花了一天时间和一些非常好的男孩和一些非常好的女孩在一起,都是以研究的名义。

One Very Good Girl, courtesy of Dallas Hamilton.

许多机器学习研究都声称从神经科学、心理学和儿童发展中获得灵感,宣扬希伯来人学习、好奇心驱动的探索或课程学习等概念,作为建筑设计或学习理论最新转折的理由——而且往往是一种后合理化。

这忽略了一个事实,即现代机器学习工具包既没有接近近似大脑神经生理学的基础,也没有甚至是小孩子的高水平意识或智力发展。

在对大脑神经结构的研究和对人类儿童的研究之间有一个有趣的中间地带,那就是观察动物的学习。关于简单生物体的实验已经写了很多,从霉菌昆虫蝙蝠。但这种研究通常仅限于“野外”学习,即环境以这种或那种方式施加压力,以引发特定的行为,而没有积极的教师干预。

然而,机器学习可以说更多的是设计一个更好的老师,而不是更好的学习者。

动物训练为这种情况增加了必要的附加层,动物思维能够引发非常复杂的行为,但受简单目标和动机(食物、游戏、友谊)的驱动,正在由具有数十年经验的人以有效、高效和可重复的方式引发正确的行为来塑造。与深度强化学习研究的相似之处很明显:与代理人交流奖励的渠道相对狭窄(主要是奖励和惩罚的变化范围),复杂和模糊的输入,有能力但有点不透明的学习者,对呈现给它的任何激励都有反应的诀窍,要学习的复杂行为。也是我们希望尽可能提高效率的“老师”,他们的复杂性和独创性只受他们的想象力或对最佳部署策略的理解的限制。不可否认,当我们假设一只狗得到一份款待时,它的功能反应近似于一个服从反向传播的神经网络时,这种类比就显得太牵强了。

我第一次接触动物学习是在阅读《正确的东西》中关于早期太空计划中使用的黑猩猩的可怕故事。这本书(尽管如此,仍不失为一部精彩的读物)提出了这样一个案例:鉴于动物所处的极端条件,再多的积极奖励也无法弥补它们所承受的压力,所有的学习都是由消极奖励驱动的,即附在它们脚上的电动脚踏板。哼。

我们参加的班级当然没有这些,到处都是快乐的、可爱的、精力充沛的狗,它们对学习非常兴奋。因为这是今天的第一课:寻求奖励的行为和学习的品味,虽然在某种程度上是与生俱来的,通常由狗的个性决定,但也是首先要培养和发展的。行为和结果之间的联系是可以建立和加强的,随后的学习也是建立在这个基础上的。这个基本的构建模块基于经典的巴甫洛夫反应:获取一些原始的东西,比如对食物的渴望,并将其与一个人可以操纵的简单线索联系起来,比如使用响片或“乖孩子”作为替代奖励。利用与预期回报相关的多巴胺冲动是在输入和预期结果之间建立紧密耦合的关键因素。

One Very Good Boy, courtesy of Michael Fraas.

对于机器学习科学家来说,有趣的是,找到比真实奖励更灵活的代理奖励的问题会反复出现,如何确保系统在真实奖励和这些代理之间保持联系通常是一个真正的问题。这种代理奖励的另一个值得注意的用途是创造负面奖励,这种奖励本质上不是负面的(比如痛苦或不安)——我会回到这些。我发现有趣的是,这一阶段训练的一个关键因素是,这种多巴胺反应有一个促进迁移学习的关键属性:它与奖励本身无关,它与对奖励的期望有关。这使得即使在没有真正奖励的情况下,也可以替换代理人。此外,一个直接的后果是多巴胺反应在回报最不确定的时候最强烈。培训师利用这一知识,通过使奖励高度随机来放大奖励的效果:有时高,有时低,有时完全没有(我敢说辍学?).让受训者猜测是一种有效的方法,可以让他们保持寻求“完美”的渴望,从而获得最大的回报。

一旦建立了学习的渴望,很大程度上是为了引出有趣的行为,要么是狡猾的(挠狗的鼻子以刺激它,把它的爪子放在它身上,并从最初的奖励中“代理”出来,把它变成一个“羞耻”的手势),要么是利用偶然的行为并奖励它们,就好像那些是最初的目标(后见之明经验回放有人吗?).这种行为启发的一个关键方面是,一旦达到行为中的关键步骤,就给予你的受训者奖励,随后用较少的奖励让他们保持足够的参与,直到他们完美地重复它。这种奖励舞蹈很微妙,一点也不直观,但真正有趣的是,你可以通过简单地扮演狗和训练员的角色来练习它(不需要款待,只需要像响片或哨子这样的信号)。角色扮演是迄今为止培训中最有趣、最有启发性的部分,试图用语言表达你制定的让你的队友执行复杂任务并获得简单二元奖励的策略是不公平的。我建议你亲自体验一下。这基本上是一场奖励塑造的游戏。奖励形成的坏名声是非常具体的任务,因此很难变成强化学习的通用策略,但这次经历让我真正想到,我最终开发的策略并不是真正具体的任务,如果有正确的词汇,可以提炼为非常通用的规则,只要设置允许奖励可以访问代理的状态以及世界。这也让我相信,报酬的形成应该是动态的,并且取决于代理人的历史,而我并没有看到这种情况普遍发生。

Alex Irpan and Dallas Hamilton shaping Jie Tan’s rewards.

培训的下一步是引入负面奖励。再说一次,“负面”体验只是代理的负面:一个产生嗡嗡电感的项圈被系在我们的手臂上,我们被告知认为它是“不好的”。同样,狗已经被训练通过一系列的练习将不满意与这种感觉联系起来,在这些练习中,只有在嗡嗡的感觉停止后才会给食物。负奖励的迷人之处在于,它们纯粹被培训师视为提高样本效率的一种方式,尽管他们当然不会以这种方式表达。引入负面奖励不会带来新的行为,只是通过缩小探索空间和抑制与手头任务无关的行为来加快学习。我们亲身经历了这一点:使用负面奖励来“引导”你的狗(或者,在我们的情况下,我们同事的代理狗)朝着正确的行为方向前进是非常诱人的,但我们很快发现,使用正面奖励和明智地修剪搜索空间,通过在代理偏离“有趣”的可能行动集时赶走它们,大部分引导是最好的。

或许从训狗中学到的东西还很多,而且大部分感觉就像那种只有亲身经历才能建立起来的直觉。对我来说,最直接的洞见是让我自己与奖励塑造相一致,并获得一些关于如何使它变得更加任务不可知的提示:也许这需要使塑造本身是动态的、有状态的,甚至可能是随机的。

对于一天的狗狗娱乐来说还不错。

气候危机&为什么数据不能成为新的石油

原文:https://towardsdatascience.com/the-climate-crisis-why-data-must-not-become-the-new-oil-32d2429b8657?source=collection_archive---------19-----------------------

Photo by @markusspiske

人工智能和数据存储的足迹

麻省大学阿姆赫斯特分校(Strubell et al .,2019)最近的一项研究表明,深度学习有一个可怕的碳足迹。作为一个例子,训练一个人工智能模型在其一生中可以排放五辆汽车那么多的碳。因此,我们有充分的理由高度批评应用人工智能的能量需求。

考虑到这一点,新的陆军情报和监视系统中的密集应用可能会耗尽我们星球的资源。美国陆军从私人公司 Palantir 购买了一套情报系统(Harris,2019);美国国防部 2020 年给 AI 拨款 10 亿美元(《突破防御》,2019);美国为人工智能制定的行业标准没有提到气候变化或碳(NIST,2019)。考虑到我们目前所处的气候危机,这不是一个好兆头。

虽然人工智能领域的技术可以应用于可再生能源解决方案(Kalogirou,2011;Jha 等人,2017 年)这是一个微薄的安慰。事实上,我们必须考虑大型技术公司的综合排放:亚马逊、苹果、微软、谷歌(Bernal & Hoggins,2019 年)以及其他公司。据估计,到 2025 年,数十亿台联网设备可能产生 3.5%的全球排放量,消耗 20%的电力(Vidal,2017)。

就这些大型科技公司目前的能源组合而言,你可能需要仔细考虑选择哪家公司。

你会选择哪个大型技术平台?

亚马逊-AWS

17%可再生,

24%的气体,

30%的煤,以及

26%核能。

微软

32%可再生能源

23%的气体,

31%的煤和

10%核能。

谷歌

56%可再生,

14%的气体,

15%的煤,以及

10%核能。

这些数字是根据绿色和平组织(Cook,2017)发布的一份报告得出的。一位著名的人工智能作家说:

人工智能行业经常被比作石油行业:一旦被开采和提炼,数据就像石油一样,可以成为非常有利可图的商品。现在,这个比喻似乎可以延伸得更远。就像化石燃料一样,深度学习的过程对环境有着巨大的影响。
-凯伦·郝,《麻省理工科技评论》(凯伦·郝,2019)

大型科技公司的抗议活动

数据是权力的问题,这并不新鲜(Bridle,2018;Susskind,2018)。然而,这越来越成为工人的责任问题。2018-2019 年的特点是科技公司发生了几次大规模抗议活动。在世界各地的不同谷歌办公室举行了反对性行为不端指控的示威活动(Weaver et al .,2018)。当时,谷歌全球 94,372 名全职和合同制员工中的 20,000 多人加入了 2018 年 11 月 1 日组织的这项联合活动(Statt,2018)。

2019 年,来自亚马逊、微软、Salesforce 和其他科技公司的员工抗议这些公司与移民和海关执法局(Sandler,2019)的合作。ICE 仍在与软件公司接洽,软件公司 Chef 的一名员工删除了自己的代码,以示对 ICE 的抗议。Chef 没有取消他们与 ICE 的合同,而是重新发布了代码(Finley,2019)。

此外,基于应用程序的员工还就劳工权利提出了抗议(Ongweso,2019;阿尔瓦,2019)。这对叫车科技巨头、建筑、医疗保健、卡车运输、清洁服务、美甲沙龙、成人娱乐、商业捕鱼和报纸来说变得越来越重要。州参议员玛丽亚·埃琳娜·杜拉佐在评论一项新法案时说:“让我们明确一点:为某人的劳动支付报酬不足没有什么创新性,”(Conger & Scheiber,2019)。基于应用的技术公司没有义务照顾他们的员工,这种情况可能会改变。

在这一点上,你可能会发现自己想知道为什么你会在一篇关于人工智能的文章中读到抗议。也许我想让你明白,在技术上存在问题,并不是每个人都同意它被处理的方式。例如,亚马逊拥有世界上最大的数据中心容量,但也是最大的排放者(美国绿色和平组织,2019 年;斯托勒,2019 年)

Amazon.com 公司是多元化的。按收入和市值衡量,它是最大的电子商务市场、人工智能助理提供商和云计算平台。亚马逊是目前全球营收最大的互联网公司(Amazon.com,2019)。与此同时,亚马逊在 2018 年排放了 4440 万吨二氧化碳(CBC,2019)。

由于人工智能需要大量的计算能力和存储,因此讨论亚马逊的活动至关重要。2019 年 8 月,公司没有实现零碳排放的计划,他们实现 100%可再生能源的目标也没有完成日期。有一项大型石油和天然气计划致力于帮助化石燃料公司加速和扩大石油和天然气开采。亚马逊在 2018 年向 68 名 100%投票反对气候立法的国会议员捐款(亚马逊员工促进气候正义,2019)。

亚马逊积极抗争或缺乏排放透明度(Bogle,2019;Roston 2019)并拥有许多空壳公司,因此很难追踪。研究人员正在努力减少服务器的碳足迹(Avgerinou 等人,2017 年;Berl 等人,2010 年;Buyya 等人,2010 年;Khosravi 等人,2013 年)。然而,如果我们从资源的角度来看,需要考虑的要多得多。

参考

阿尔瓦,E. (2019 年 9 月 22 日)。长期以来,Lyft 和优步一直虐待像我这样的司机。不再是了|伊丹·阿尔瓦。检索自https://www . the guardian . com/business/2019/sep/22/California-ab5-Uber-lyft-drivers

Amazon.com(2019 年 1 月 31 日)。amazon.com 宣布第四季度销售额增长 20%至 724 亿美元:Amazon.com 公司从检索 https://IR . about Amazon . com/news-releases/news-release-details/Amazon com-announced-第四季度销售额-200-724 亿美元

Amazon.com 宣布第四季度销售额增长 20%,达到 724 亿美元:Amazon.com 公司(2019 年 1 月 31 日)。检索自https://IR . about Amazon . com/news-releases/news-release-details/Amazon com-announceds-fourth-quarter-sales-20724 亿

Avgerinou,m .,Bertoldi,p .,和 Castellazzi,L. (2017 年)。欧洲数据中心能效行为准则下的数据中心能耗趋势。能量,10(10),1470。

北卡罗来纳州伯纳尔和北卡罗来纳州霍金斯(2019 年 5 月 3 日)。亚马逊、苹果和谷歌正在吞噬世界能源。他们对此做了什么?检索自https://www . telegraph . co . uk/technology/2019/05/03/Amazon-apple-Google-gobling-worlds-energy/

Berl,a .,Gelenbe,e .,Di Girolamo,m .,Giuliani,g .,De Meer,h .,Dang,M. Q .,& Pentikousis,K. (2010 年)。高能效云计算。计算机杂志,53(7),1045–1051。

Bogle,A. (2019 年 7 月 3 日)。亚马逊不想让你知道它的温室气体排放量,说这是“商业秘密”。检索自https://www . ABC . net . au/news/science/2019-07-04/Amazon-emissions-energy-data-Australia-transparency-questions/11268918

j . bridle(2018 年)。新黑暗时代:技术和未来的终结。Verso 书籍。

Buyya,r .,Beloglazov,a .,和 Abawajy,J. (2010 年)。云计算数据中心资源的节能管理:愿景、架构要素和开放挑战。arXiv 预印本 arXiv:1006.0308。

全血细胞计数。(2019 年 9 月 20 日)。杰夫·贝索斯做出气候承诺,在揭露亚马逊排放的碳相当于一个小国之后。从https://www.cbc.ca/news/business/amazon-climate-1.5291076取回

库克、李、蔡、孔、迪恩斯、约翰逊、约翰逊和贾尔迪姆(2017)。点击清洁:谁将赢得建设绿色互联网的竞赛?。绿色和平组织,华盛顿州,DC,5。

康格,k .,& Scheiber,N. (2019 年 9 月 11 日)。加州通过里程碑式的法案,重塑零工经济。检索自https://www . nytimes . com/2019/09/11/technology/California-gig-economy-bill . html

Couts,A. (2018 年 6 月 25 日)。Salesforce 员工敦促首席执行官“重新检查”海关和边境保护局的工作。检索自https://gizmodo . com/sales force-workers-urge-CEO-to-re-examine-work-with-cus-1827118343

芬利,K. (2019,9 月 20 日)。一个开发者删除了他的代码以抗议 ICE 使用它。检索自https://www . wired . com/story/developer-deletes-code-prompt-ice/

美国绿色和平组织。(2019 年 2 月 13 日)。点击清洁弗吉尼亚。检索自https://www . Greenpeace . org/USA/reports/click-clean-Virginia/

郝,k .(2019 . 7 . 23)。训练一个人工智能模型在它们的一生中可以排放五辆汽车的碳。检索自https://www . technology review . com/s/613630/training-a-single-ai-model-can-emit-as-due-cars-of-lifetime/

哈里斯,S. (2019 年 3 月 26 日)。Palantir 赢得建造陆军情报系统的竞争。检索自https://www . Washington post . com/world/national-security/palantir-wins-competition-to-build-army-intelligence-system/2019/03/26/c 6d 62 BF 0-3927-11e 9-aaae-69364 B2 ed 137 _ story . html

Jha,S. K .、Bilalovic,j .、Jha,a .、Patel,n .、和 Zhang,H. (2017)。人工智能的当前研究和未来范围。可再生和可持续能源评论,77,297–317。

Kalogirou,S. A. (2001 年)。人工神经网络在可再生能源系统中的应用:综述。可再生和可持续能源评论,5(4),373–401。

凯耶,L. (2011 年 7 月 1 日)。亚马逊顶住压力参与碳足迹披露项目。检索自https://www . the guardian . com/sustainable-business/Amazon-discover-data-climate-carbon-footprint

Khosravi,a .,Garg,S. K .,& Buyya,R. (2013 年 8 月)。分布式云数据中心中虚拟机的节能和碳高效放置。欧洲并行处理会议(第 317-328 页)。斯普林格,柏林,海德堡。

Kruppa,M. (2019 年 9 月 20 日)。Palantir 在新一轮融资中获得 260 亿美元的估值。检索自https://www . ft . com/content/0 db 6 f 058-dbef-11e 9-8f9b-77216 ebe1 f 17

米勒,R. (2019 年 9 月 20 日)。谷歌投资 33 亿美元在欧洲建设清洁数据中心。检索自https://TechCrunch . com/2019/09/20/Google-is-investing-3-3b-to-build-clean-data-centers-in-Europe/

NIST。(2019 年 8 月)。美国在人工智能领域的领导地位:联邦政府参与开发技术标准和相关工具的计划。

Ongweso,E. (2019 年 9 月 18 日)。1000 名抗议的优步司机导致纽约市交通瘫痪。检索自https://www . vice . com/en _ us/article/59 nyzk/1000-抗议-优步司机-带来-纽约市-交通瘫痪

皮查伊,S. (2019 年 9 月 20 日)。在欧洲释放数字机遇。检索自https://www . blog . Google/around-the-globe/Google-Europe/unleashing-digital-opportunities-Europe/

e .罗斯顿(2019 年 6 月 17 日)。亚马逊、埃克森美孚呼吁提高气候透明度。检索自https://www . Bloomberg . com/news/articles/2019-06-17/Amazon-Exxon Mobil-call-out-over-climate-transparency

桑德勒,R. (2019 年 7 月 29 日)。亚马逊、微软、Wayfair:员工发起内部抗议,反对使用 ICE 工作。检索自https://www . Forbes . com/sites/rachelsandler/2019/07/19/Amazon-sales force-way fair-employees-stage-internal-declarations-for-working-with-ice/# 72c 8936 d3e 94

新泽西州斯塔特(2018 年 11 月 3 日)。两万多名谷歌员工参加了昨天的大规模罢工。检索自https://www . the verge . com/2018/11/2/18057716/Google-walk out-2 万-employees-CEO-sundar-pichai-meeting

斯托勒,B. (2019 年 2 月 15 日)。为什么北弗吉尼亚数据中心市场比大多数人意识到的要大。检索自https://www . data center knowledge . com/Amazon/why-northern-Virginia-data-center-market-bigger-most-realize

斯特鲁贝尔,e .,加内什,a .,和麦卡勒姆,A. (2019)。自然语言处理中深度学习的能源和政策考虑。arXiv 预印本 arXiv:1906.02243。

Susskind,J. (2018 年)。未来政治:共同生活在一个被科技改变的世界。牛津大学出版社。

j .维达尔(2017 年 12 月 12 日)。到 2025 年,“数据海啸”可能会消耗全球五分之一的电力。检索自https://www . climatechangenews . com/2017/12/11/tsunami-data-consume-fifth-global-electricity-2025/

Weaver,m .,Hern,a .,Bekiempis,v .,Hepler,l .,& Fermoso,J. (2018 年 11 月 1 日)。谷歌罢工:不当性行为指控后的全球抗议。检索自https://www . the guardian . com/technology/2018/nov/01/Google-walk out-global-抗议-员工-性骚扰-丑闻

这是第 500 天的第 111 天。我目前第 101-200 天的重点主要是 Python 编程,但是,我决定发表我正在写的一本书中与气候危机有关的一节。如果你喜欢这篇文章,请给我一个答复,因为我确实想提高我的写作或发现新的研究,公司和项目。

云收购玩法

原文:https://towardsdatascience.com/the-cloud-acquisition-gameplay-9668bd0ea0a1?source=collection_archive---------26-----------------------

开发者们,是时候站出来前进了!

Image by Jonny Lindner from Pixabay

软件正在吞噬世界。随着软件开发领域发生的大量事情,是时候让软件驱动的公司承担起责任,在数字化转型的阶梯上前进了。DevOps 是当今的吸引力中心,每个公司都想拥抱它并向前发展。但是 DevOps 并不容易,传统公司有时会发现很难,而技术初创公司没有足够的资金来投资基础设施和所需的资源。

我们都同意云和 DevOps 与工具无关,但不知何故,当我们谈论当今的数字化转型时,工具成了焦点。今天的云公司正以这样或那样的方式影响着开发者的生活。就像 Jenkins 如何成为 DevOps 中 CI/CD 的实际工具一样,它有自己的社区,如果工具中有任何变化,开发者都会受到影响。

当采用新技术时,一些公司谨慎行事,而另一些公司则走出了他们的舒适区。并非所有公司都准备好接受云和 DevOps,但当他们这样做时,他们会保持对他们所相信的工具的信念和信任。最近的 DevOps 和云收购,如 Docker 被 Mirantis 收购,微软收购 GitHub,Travis CI 被 Idera 收购,都让开发者社区陷入混乱。

我们将在今天的文章中讨论这样的收购以及它们对开发者社区的影响。

云业务格局正在发生变化

云业务竞争更加激烈,每天都有更多的参与者涌现出来。客户有如此多的选择,但是评估合适的工具和技术变得越来越困难。随着人工智能、物联网、大数据等不断变化的技术进步,云公司的增长正成为一项挑战,而拥有所有能力的新公司给传统公司带来了困难。

近期云业务相关收购:

  • 微软收购 GitHub
  • 米兰蒂斯收购 Docker
  • IBM 收购 RedHat
  • Salesforce 收购 Mulesoft
  • VMware 收购 Pivotal 软件
  • SAP 收购 CallidusCloud
  • 思科收购双安

财富偏爱勇敢的人:微软

  • 微软在 20 笔交易中花费了超过 91 亿美元,并以 GitHub 的轰动交易结束。

来源演职员表:geek wire

  • 下图显示了微软迄今为止最大的几笔交易,

来源演职员表:geek wire

  • 今天,微软也在云战争中领先,击败了所有其他主要参与者,如亚马逊、SAP、IBM 和谷歌。

【cloudwars.co】来源演员表:

  • CB Insights 报道,微软已经收购了比亚马逊和谷歌更多的云初创公司,以丰富开发者社区。

来源演职员表: CB 洞见

所有的收购都不一样

这里要说的重要一点是,收购不一定意味着胜利。例如,尽管收购了如此多的技术公司,谷歌在云业务方面仍然落后于其竞争对手,如 AWS、微软和甲骨文。

来源演职员表: 华盛顿邮报

  • 有些时候,当特定工具看起来不再工作时,最好将其关闭,这就是 ThoughtWorks 的 Snap CI 所发生的情况。据 ThoughtWorks 称,他们未能通过 Snap CI 对目标市场产生影响。他们说他们将继续关注咨询和另一个持续交付的产品, Go CD 。现在,当品牌声誉面临风险时,放弃自己的产品/服务是一个明智的决定。用营销术语来说,这就是我们所说的产品自相残杀
  • 一个典型的收购失败的例子是,Idera 收购 Travis CI。希望你们都记得这一点,当 Idera 令人困惑地收购了软件行业著名的 CI 提供商之一 Travis CI 时,整个 DevOps 社区都疯了。Idera 本身由私人股本公司 TA Associates 拥有,除了获取尽可能多的利益并可能扼杀产品之外,别无他法。我在开发者社区看到了一些相关的文章/讨论。

下面一些有用的链接,

*[## Idera 收购 Travis CI 黑客新闻

我不认为特拉维斯在这方面,虽然在过去的几个月里,我开始看到循环 CI 徽章在这里弹出…

news.ycombinator.com](https://news.ycombinator.com/item?id=18978251)* * [## 注册会计师特拉维斯. CI。

Travis CI,持续集成(CI)工具,是我们每天、每小时甚至每分钟例行工作的一部分…

medium.com](https://medium.com/@dirk.avery/r-i-p-travis-ci-347753c73775)

由于这次收购,你知道接下来发生了什么,Idera 的所有者解雇了大部分工程师,包括一些高级管理人员。

  • Business Insider 报道称,在被 VMware 以 27 亿美元收购之前,Pivotal 正准备裁员,这引发了 Pivotal 员工的内部抗议,随后引发了公众抗议。根据该报告,员工开始传阅一封公开信,要求 VMware 和 Pivotal 领导层保留工作场所运营团队。
  • 最近的一次收购是 Sonatype 被私募股权公司 Vista Equity Partners 收购,就像 Travis CI 一样,收购后没有任何证据。从历史上看,一些私募股权公司的此类收购说明了一件事,产品/服务的质量,客户支持的水平,以及作为一个整体,公司在未来一年将不会是一样的。

此外,你可能已经看到这些私募股权公司在收购你的企业后会做什么,首先,他们会解雇现有的管理层,因为公司的目标发生了变化。然后,随着管理层的更替,整个战略业务方法也发生了变化;他们的目标是尽可能地摆脱现有的品牌和业务。

阅读下面这篇精彩的文章,

[## 私募股权公司收购你的公司后会做的 6 件事

它们不是你必须做的事情。在今天的市场上,如果你打算卖掉你的公司…

www.inc.com](https://www.inc.com/jim-schleckser/the-6-things-a-private-equity-firm-will-do-after-they-buy-your-business.html)

  • IBM 收购 RedHat 是一笔成功的交易;对他们来说,这次收购就像是试图控制一个企业的云生态系统的每一部分。这笔交易将使 IBM 进入混合云环境领域。在大多数专家看来,IBM 作为一家几十年来增长缓慢的公司,这是一个大胆而聪明的举动。关于为什么这是一个好的举措的详细解释可以在 YouTube 上找到, IBM +红帽:这次云收购是赢家吗?'
  • 从商业角度来看,CloudBees 收购 ElectricCloud 更有意义,这清楚地描绘了健康的协同效应。来自单一供应商的 CI/CD(持续集成&持续交付)在 DevOps 领域是一件好事。

CloudBees 在持续交付方面很有名,Jenkins automation platform 和 Electric Cloud 在应用程序发布自动化方面也很有名,所以这种协同作用非常明显,看起来很好。

  • Docker 被 Mirantis 收购对开发者社区影响很大。Docker 给了集装箱化的概念一个新的含义,这让他们在 Docker 周围有了一个很大的社区。但是 Docker 面临的问题是赚不到足够的钱,这使得他们的业务增长停滞不前,他们不得不退出。他们的下一个选择是继续前进,成为已经在 Kubernetes 空间做得很好的人的一部分。Mirantis 帮助公司轻松运行 Kubernetes 和 OpenStack,Docker 的加入无疑是云原生领域的一个增强。但它也得出结论,Docker 将不再是 Docker,它出售了 Docker Trusted Registry,因此像所有收购一样,战略业务目标将发生变化,这也可能影响一些微服务开发者。
  • 战略商业决策是通过 Docker Swarm 赚钱,但你知道接下来发生了什么。Kubernetes 接管并吃掉了几乎所有的市场份额,Docker 开始调整并推广 Kubernetes,然后, Docker 因为没有赚到足够的钱而陷入困境

Docker 的联合创始人所罗门·海克斯(Solomon Hykes)在推特上表示,这对 Docker 来说是一个困难的时期,这是一个好的举措。

来源演职员表: 所罗门·海克斯推文

谁受影响最大?

开发商!!!

组织中的开发人员要对围绕技术栈和工具发生的大多数决策负责,因为他们是使用它们来改善公司的人。最糟糕的是,一些软件驱动的公司在为公司选择技术或技术流程时甚至不考虑开发人员的投票,这就是事情开始错位的地方。那就是责备游戏开始的时候;公司开始责怪开发者,反之亦然。

当一个新的工具或平台进入市场时,它要么被社区很好地接受,要么被拒绝。举个例子,Docker Swarm 它产生了巨大的影响,因为 Docker 已经有了一个社区,这对 Docker Swarm 的采用产生了巨大的影响,直到社区看到了 Kubernetes。Docker Swarm 对需要更多工作负载和编排的大公司没有太大影响,因此很快,Kubernetes 取代了 Docker Swarm,成为事实上的容器编排工具。但与 Docker Swarm 相比,Kubernetes 有着陡峭的学习曲线和复杂的设置。

当像 Docker 这样的公司被收购时,非常熟悉该工具的社区会受到影响,因为开发人员将无法确定公司的未来。反过来,它会影响使用这些技术的公司。Docker Swarm 已经被大多数公司所取代,整个开发者社区都在学习并有兴趣知道如何有效地使用 Kubernetes。

因此,当收购与社区不一致时,开发者会受到影响。随着他(开发人员)很久以前熟悉的工具和平台最终落入不同的人手中,生产力和士气下降。

是向前跃进的时候了

是时候授权给开发者社区了,是时候承担责任了,站出来开发者需要采取行动😃

我们这里不是在谈论一些成功的收购;相反,我们谈论的是那些将对开发者社区产生不利影响的问题,就像 Travis CI 被 Idera 收购,Idera 本身由一家私募股权公司所有,以及类似的 Sonatype 收购。软件领域的任何人都可以很容易地猜测这是什么类型的收购,以及当这些被收购的公司被私募股权公司收购时,它们的未来会如何。如前所述,当这样的云公司被任何私募股权公司收购时,他们失去了所有的声誉,解雇了老员工,榨取了所有通过利用品牌剩下的钱。(例如:Travis CI)

无论如何,开发者社区应该发展并繁荣到新的高度。是时候让开发人员成为公司内部战略工程决策的一部分了,他们需要提出他们对整个公司长远利益的看法。

是时候采取行动了:)*

台湾的政治色彩

原文:https://towardsdatascience.com/the-colors-of-politics-in-taiwan-9b05cc2be0a8?source=collection_archive---------21-----------------------

两个主要政党之间的斗争

在亚洲国家中,台湾拥有最开放的公民空间。它被认为是一个进步的国家。台湾民众能够毫无畏惧地批评总统,台湾民众在 2016 年选出了他们的第一位女总统,台湾国会(立法院)在 5 月通过了同性婚姻法。然而,台湾的民主历史相对较短。

自 1948 年以来,台湾的政治主要由中国国民党控制。总统是该党的领袖。1996 年台湾人民第一次选举了台湾总统。从台湾人第一次投票选举总统到现在才 23 年。

在第一次总统选举后,另一个政党——民进党出现了。届时,台湾的政治分为蓝绿两种颜色。蓝色代表国民党,绿色代表民进党。国民党倾向中华人民共和国,而民进党不。

国立程池大学选举研究中心发布的电话调查数据揭示了 1992 年 6 月至 2019 年 6 月间台湾人的政党偏好。国民党和民进党一直主导着台湾的政治,但根据数据显示,他们都没有赢得超过 50%的政党支持。

下面的数据聚焦于国民党和民进党从 1992 年至今的兴衰。可视化不包括其他政党和持独立立场和无回应的人的数据。

Data analysis and visualization by Shing-Yun Chiang

可视化显示了国民党和民进党获得和失去支持的时间。

国民党主席李登辉

在李明博总统的第一任期,民进党只是合并,没有总统直选。国民党在台湾拥有稳定且较高的支持率并不令人意外。该图表还显示,在第一次总统直选后,支持民进党的比例稳步上升。

陈水扁总统,民进党

民进党的陈水扁当选代表了台湾的一个里程碑——他是自 1948 年以来第一位非国民党的总统。当国民党的支持率从 33.6%下降到 21.1%时,民进党赢得了选举。造成下降的因素之一是亲民党的出现,该党在 2000 年获得了 9.1%的支持率。亲民党和国民党持有政治立场。

民进党的喜好度在陈第一任期间稳定,第二任期间明显下降。民进党的一系列丑闻导致偏好转向国民党。民进党的失败也导致了才真旺姆在 2008 年的选举。

国民党才真旺姆九主席

调查显示,2008 年,国民党以 35.5%的支持率重新执政。到马第一届任期的最后一年,失业率达到 39.5%的峰值。马英九在 2012 年再次当选,但在第二届任期结束时,支持率下滑了 17.4 个百分点。

在马英九的第二个总统任期内,学生领导的“太阳花运动”于 2014 年爆发。活动人士占领了立法院,抗议《海峡两岸服务贸易协议》未经逐条审查就获得通过。这场学生运动并没有直接导致国民党支持率的下降,但却帮助民进党在第二年达到了最高的 31.2%的支持率。

民进党主席蔡英文

2015 年,选举前一年,政坛几个后起之秀组织了新力量党,吸引了民进党的人支持。然而,民进党仍然赢得了这场比赛。但该党在从劳工政策到同性婚姻立法缓慢实施等一系列问题上失去了支持。蔡英文当选后,民进党的支持率立即下降,而前几任总统在第一任期内的支持率保持稳定。

为了挽回支持率并赢得下一届任期的选举,民进党推动通过了蔡英文承诺的同性婚姻立法。民进党的支持率在 2019 年略有上升,但国民党正在迎头赶上。

随着最近香港的抗议活动,民进党可能会赢得更多人的支持。随着 2020 年 1 月的选举,民进党和韩国国民党之间的竞争目前似乎难分胜负。由于复杂的国际和国内事务,台湾是否会成为(政治上的)蓝岛或绿岛还不清楚。

组合效应对抗蝴蝶效应

原文:https://towardsdatascience.com/the-combo-effect-against-the-butterfly-effect-bf7dd7a507a0?source=collection_archive---------10-----------------------

人工智能促进能量存储,这将提高可再生能源生产的弹性和效率

Photo by Cassie Boca on Unsplash

在混沌理论中,蝴蝶效应是对初始条件的敏感依赖,其中一个状态(确定性非线性系统)的小变化会导致后面状态的大差异。截至今天,我们已经在地球上送来了成吨的“蝴蝶”,无论是我们发电或运输的二氧化碳排放,无论是在粗放(或过度)的农业生产面前正在消失的森林,还是从永久冻土中融化出来的甲烷或在海洋中分解的塑料“岛”。对于“非气候学家”来说,2 或 3 度可能看起来不大,但全球气温如此变化的影响将远远大于我们迄今所见。去年我们已经了解到,在气候变化加速到看起来像蝴蝶效应的所谓后期状态之前,我们还有大约十几年的时间。

无论你是否理解超强飓风、创纪录的炎热夏季和消失的冰川是不是气候变化的结果,你都不能反对清理地球,尤其是如果这样做有好处的话。

我们肯定需要找到方法来对抗这种“指数级”倍增效应。

组合效应

我们可以从游戏玩家的连击效果(圣歌、弥撒效果、暴风雪的炉石等)中得到启发。)或者吉他弹奏者确实知道并在许多环境中使用。比如《圣歌》中,“连击系统创造了一种动态的伤害敌人的方式。通过将某些能力相互结合使用,你可以创造一种组合攻击,对你的对手造成疯狂的伤害。”通过连续使用两种或两种以上的“异能”,每种异能的组合效果可以产生极大的增强效果。同样的“组合方法”也在吉他世界中使用,以产生特殊或疯狂的效果。

https://www.gamerevolution.com/guides/500475-best-anthem-combos-what-are-primers-detonators

我坚信科学技术的力量不仅可以理解,而且可以解决人类面临的最大挑战。这就是为什么我建议我们使用科学版的组合效应,将主要的解决方案结合起来,对形势做出强有力的反应。这里的挑战(我们可以说是我们的对手)是我们需要在短时间内“疯狂”减少的二氧化碳排放量。这不仅仅是一个温和的减少,这显然是一个加强或促进的效果。事实上,这不是唯一需要的解决方案。但在一个“指数级”对手面前,它真的可以成为一个高效的对手。

让我们专注于建设性的东西,以及如何利用人工智能和能量存储的组合效应来改善可再生能源(RE)的影响。因此,对已经超过“不太清洁”能源的可再生能源的投资是显而易见的,因为综合效应推动的可再生能源可能变得更加经济合理,也因为这可能成为对抗气候变化的主要倡导者之一。

可再生能源的强大基础

继 2019 年可再生能源行业展望之后,有“三个有利趋势支撑的强劲基本面”。这些趋势包括支持可再生能源增长的新兴政策、扩大投资者对该领域的兴趣,以及提高风能和太阳能对电网、资产所有者和客户价值的技术进步。或许最重要的是,大多数细分市场的强劲需求。公用事业表现出强劲的“自愿需求”(52%的公用事业规模的太阳能项目在开发中,73%的项目在 2018 年上半年宣布,而不是我们过去看到的政策命令推动的需求)。2017 年,仅新的太阳能项目就占了 157 千兆瓦,煤、天然气和核能的两倍多。2018 年,企业对可再生能源快速增长的需求在一定程度上推动了自愿需求。

落基山研究所的一项研究表明,他们通过各种采购途径(【http://ow.ly/XCrP50r1Ha3】T4)购买了近 6.5 千兆瓦(GW)的可再生能源。

拯救地球从未如此有利可图;这是该行业成熟的又一标志。因此,话题现在转向了人工智能和能量存储如何改善可再生能源。事实上,工具的组合,组合效应,可以带来实质性的改进。这就是为什么我们不仅需要一套工具,还需要有效地集成它。

人工智能提高能源效率

在之前的一篇文章中,我们已经看到了一些关于人工智能和能量存储(通过智能能量存储或 IES)可能提高能源效率的可能方式的暗示:https://towards data science . com/artificial-intelligence-in-a-no-choice-but-to-get-it-smart-Energy-industry-1bd 1396 a87 f 8。在处理来自数十或数百个传感器的数据后,许多工具可用于人工智能和能量存储,以提高建筑物的能源效率。通过物联网(IoT)和人工智能,建筑物的能效可以得到大幅提高。物联网本质上是智能设备、建筑和其他物品与电子设备的联网,实现数据的收集和交换。事实证明,正确使用物联网可以提高能效。“事物”可以是简单的传感器(例如房间中的温度传感器)、更复杂的传感器(例如电功率测量设备)、致动器(例如 HVAC 房间控制器、电机)或复杂的设备(例如工业断路器、提供家庭、建筑或工业自动化的 PLC)。

Photo by Zach Meaney on Unsplash

物联网应用的范围可能从简单的监控应用(如测量建筑物内的温度)到复杂的应用(如提供完整的校园能源自动化)。只有当它变得复杂时,人工智能才能产生重大影响。只有当电力负荷和峰值相当大时,能量存储才是重要资产。那么,与物联网融合的 AI 和储能对能效有什么影响呢?都是关于数据的。

没错,物联网——连接到互联网的设备以及它们之间的网络——已经带来了(并将继续带来)海量数据。越来越多的大量信息在系统内更快、更独立地流通,从而更容易优化资源。怎么会?生产工厂内持续的数据流能够持续监控能源消耗。此外,在物联网互联系统中,借助人工智能,识别任何问题并在过度浪费发生之前进行干预变得更加容易,借助储能,我们可以控制何时对负载变化做出反应。更不用说减少维护时间了。

在大型建筑和制造业中,物联网和能效之间的联系是成正比的,投资物联网解决方案和能效变得至关重要。事实上,智能工程与物联网的结合有望降低智能建筑的公共事业账单,或者通过在工业规模的问题发生之前(如太阳能发电场停工或风力涡轮机故障)进行预测来节省成本。

从更大的角度来看,人工智能可能是小型(设施规模)或大型(社区或地区规模)智能电网背后的大脑,它将接受数千或数百万传感器的输入,以实时决定将能源资源分配到哪里。节能算法的一个非常著名的例子涉及谷歌,它使用由 DeepMind 开发的人工智能来阻止其世界各地的数据中心过热。科技巨头将其数据中心的能源管理移交给人工智能,人工智能在 2016 年首次帮助降低冷却所有计算机服务器的能耗。

人工智能将改善可再生能源运营

风能和太阳能提供了特别丰富的数据集,算法可以咀嚼这些数据集,以提供对当前问题的见解,预测可能出现的问题,改善能量存储或确定下一个大型太阳能发电场的最佳布局。

先说一些低挂的果子,比如怎么样。举个例子, Raycatch ,特拉维夫 2015 年的初创公司(已经筹集了730 万美元)正在开发可以诊断问题和优化太阳能电站运营的算法。Raycatch 提供了一种“基于人工智能的诊断和优化解决方案”,它可以将太阳能发电厂产生的所有数据转化为日常的实时行动计划,而无需安装任何额外的硬件。它甚至会计算其建议改进的投资回报率,并根据预测模型分析实际性能。

Raycatch’s AI platform can analyze potential improvements and predict the ROI of solar energy plants. Credit: Raycatch

人工智能设计可再生能源系统

考虑到设计一个太阳能发电厂不仅仅是看太阳能电池板的数量和它们朝向我们巨大的恒星太阳的方向。据我们所知,今天的大部分设计工作仍然是手工完成的,由来自各种专业的不同工程师组成的队伍——结构、电气等。—通常需要几个月的时间来为大型商业项目制定最佳布局。为什么不让 AI 以更快更全面的方式来做呢?这是 2013 年成立的洛杉矶高科技初创企业背后的商业理念: HST Solar福布斯采访了这位联合创始人,了解更多细节。

人工智能平台在这里是如何开发的:在用户输入基本信息后,如站点位置和要安装的设备的详细信息,算法开始工作。该软件然后配置太阳能发电场拼图的每一块,下至每个太阳能电池板的特定方向和倾斜,以最大限度地增加能量,同时最大限度地减少强风等其他因素带来的问题。HST Solar 拥有这样一个平台,其专有软件可以在几个小时甚至几分钟内扫描任何潜在网站的数亿个可能的设计。目标是确定哪些设计将产生最高的投资回报和最低的太阳能发电成本。

https://cleantechnica.com/2017/03/13/hst-solar-promotes-cost-reductions-advanced-technology/

HST Solar 的人工智能可以识别大多数人工工程师经常忽略的设计。其分析可以使项目更有利可图,并有助于吸引投资者的资本。在新兴和发展中市场,这种方法可以确保私人和政府对太阳能的投资最大化。该公司声称,与那些即将失业的工程师设计的系统相比,人工智能设计的太阳能农场可以将生产可再生能源的成本降低 10%至 20%。使用这种人工智能平台等工具可以帮助太阳能行业从目前每年 70 多千兆瓦的新安装太阳能增加到 2030 年世界每年需要的 1000 千兆瓦的水平,以便以有意义的方式应对气候变化。

可再生能源的人工智能天气预报

可再生能源,尤其是太阳能和风能,显然依赖于天气。正确的设计和操作依赖于准确的预测,如果这是人工智能驱动的太阳能/风能和储能计算的一部分,那就更重要了。但是,除了获得天气预报,获得能源预报不是更好吗?这就是总部位于巴塞罗纳的西班牙初创企业 Nnergix 背后的理念,这家成立 6 年的公司已经筹集了约170 万美元的公开融资。Nnergix 所做的是使用天气数据技术和机器学习来进行能源预测。它最近推出了一款名为 Sentinel Weather 的产品,可以进行“天气分析”,并提供地球上任何地方的历史数据和天气预报。能源工程师将对该平台以 15 分钟的分辨率对单个工厂的太阳能和风能进行长达 18 小时的预测特别感兴趣。一周内每小时的电力预测是可能的。

用于可再生能源存储的人工智能

在可再生能源方面提到的另一个新兴趋势是从一开始就将太阳能和储能结合起来,这有助于为太阳能供应商和用户节省成本。太阳能项目可能成本高昂,尤其是考虑到政府对可再生能源投资补贴的波动性(甚至取消)。对冲价格波动的一种方法是有效储存能源,尤其是在低利率下,并在能源价格飙升时加以利用。 Stem 是一家夹在旧金山和硅谷之间的初创公司,它创建了一个名为 Athena 的人工智能平台,称它可以从包括太阳能在内的储能中获得最大价值。该公司成立于 2009 年,已经获得了 3.211 亿美元的巨额

Saving money with smart energy storage. Credit: Stem

该公司表示, Athena 可以“通过自动化、实时的能源优化,给予客户更大的能源决策控制权和灵活性”,从而让客户的太阳能投资“经得起未来考验”根据《另类能源》杂志的采访,雅典娜每秒钟吸收大量数据,从太阳能发电和负载行为到电费,甚至天气预报。然后,算法开始发挥作用,从能量存储中榨取价值,甚至创造出发电厂的虚拟网络,可以基于最有利的经济效益发送或存储电力。虽然该公司承认,增加太阳能存储可能会使系统成本增加 20%,但这些成本应该可以通过智能存储解决方案节省的 30%来抵消。

热电容量混合调节策略

利用这种联合/合作方法以及他们在车辆混合储能方面的工作, Smart Phases (DBA Novacab) 开发了混合热能和电能储存系统。

该系统的控制是基于使用模糊逻辑和组合前馈加反馈控制的预期调节策略,其可以同时处理电能和太阳能的存储和回收。人工智能需要充分发挥这种方法的潜力。它考虑了多种运行条件,如负载、外部空气温度,并优化了电加热的关闭和开启时段。无论何时出现波动或干扰,该组合策略都可以显著改善简单反馈控制的性能。电能储存(EES)和热能储存(TES)已被整合为一种混合方法,以优化能源效率和负载均衡。这种集成使得医院、数据中心、军事、制造工厂和其他关键热电需求侧管理等关键应用的运行得到显著改善和稳定。

Novacab 混合热能&电能储存系统最大限度地提高了电网设备的灵活性和整体性能。在建筑设置中,它可以提高性能和操作的可靠性。概括地说,对电网的影响也是巨大的:平滑负荷曲线和优化需求侧管理;提高能量分布的冗余度和可预测性。EESAT 会议之后,能源部桑迪亚实验室发表的一篇论文强调了混合系统的集成和组合成果,包括现场运行数据、电力使用效率、可靠性和性能。这种“预测性”方法不仅可以更好地利用储能,还可以更好地整合 EES 和 TES,以最大限度地提高运行灵活性和稳定性、运行性能改善、需求侧管理的可预测性和运行可靠性。

Smart Phases (DBA Novacab) new manufacturing facility for its Hyber Energy Storage technology. Credit: Novacab; N.B. For full disclosure, I want to outline that I’m personally involved in this, but I’m thrilled to talk about this other option since it is very relevant to the main topic of this article. Linkedin-Novacab-This plant will be equipped with hybrid energy storage

R&D 可再生能源协会

正如所讨论的,人工智能越来越多地参与设计可再生能源和能源存储系统,分析它们的性能,以及预测未来的生产和存储需求。一些公司从一开始就在研发阶段利用机器学习,这是我们在其他研究和人工智能领域看到的趋势。

总部位于硅谷的 SunPower 公司最近建造了一个新的太阳能研究设施。这个价值 2500 万美元的新工厂的关键工具之一是对光伏电池制造过程的质量控制。人工智能用于分析过程,不仅确保产品质量,还提供新的见解以随着时间的推移改进技术。顺便提一下,SunPower 正在拥抱各种新兴技术,包括使用无人机调查潜在的太阳能发电场,以创造更有效的设计。工程师也可能在那里使用机器学习。

SunPower’s new research facility employs AI to analyze and develop its solar cell technology. Credit: SunPower

最后,西雅图一家名为 Energsoft 的小型初创公司已经通过公开融资筹集了大约17 万美元,该公司使用人工智能为可再生能源客户制造更好的电池,特别是为电动汽车和公用事业公司。该公司的人工智能平台可以自动收集数据,并识别设计问题,如材料选择甚至制造过程。Energsoft 成立于去年,它表示自己的软件可以降低开发成本,缩短上市时间。

可再生能源部门的长期可行性需要经济可扩展性,这意味着能够建设比非可再生能源更高效、更廉价的巨大能源系统。因此,人工智能加速的 R&D 将被要求在对抗气候变化的斗争中保持步伐。

结论

回到我们最初的想法,我们可以充满冲动或能力用组合效果来做所有这些。人工智能、储能和可再生能源的巧妙结合,似乎是新兴技术与成熟行业——能源行业——的完美结合。

这就是为什么我建议使用“工程”版本的组合效应,将主要解决方案结合起来,对我们需要在短时间内“疯狂”减少的全球挑战(蝴蝶般激增的二氧化碳排放和未来的风暴)做出强有力的回应。

通过将人工智能、物联网、能量储存的能力相互结合使用,我们可以创造出一个“有动力”的组合,从而大大提高可再生能源的利用率。这样,我们将最大限度地增加应对人类最大挑战——气候变化的机会,并在此过程中为精明的利益相关者创造一点财富。

在我们开始生产廉价、无限的核聚变能源之前(那对于解决紧迫的气候变化问题来说就太晚了),我们需要找到节约资源的方法,让可再生能源系统的制造、安装和运行更加便宜、高效。人工智能驱动的 IES 解决方案在可再生能源供应链的许多方面的发展不仅使其更加便宜,还将使我们能够以新的清洁方式使用能源,例如大规模淡化水或为偏远或非常贫困的社区供电。这对所有人来说都意味着一个更光明的未来,如果不是太温暖的话。

Photo by The Roaming Platypus on Unsplash

这篇文章是 ing 的夏羽·比洛多的“人工智能和能量储存”系列文章的一部分。工程、哲学博士。你可以在这里找到另一篇文章:https://towards data science . com/artificial-intelligence-in-a-no-choice-but-to-get-it-smart-energy-industry-1bd 1396 a87 f 8

竞争心态:Kaggle 和现实生活中的数据科学如何产生分歧

原文:https://towardsdatascience.com/the-competition-mindset-where-kaggle-and-industry-diverge-66e0548a5f32?source=collection_archive---------18-----------------------

真实世界不是一场数据竞赛——这里有三个原因。

非常感谢 Kaggle 的 Rachael 和 Will 对本文的评论和建议。

TLDR: Kaggle 比赛对于机器学习教育来说非常棒。但它可能会对现实生活中的商业环境产生错误的预期。我讲述了行业环境中的数据科学不同于竞争对手的三个方面,以及将期望与数据科学工作的现实相结合是多么重要。

简介:竞争心态

Kaggle 是一个非常受欢迎的平台,非常适合有抱负的数据科学家学习应用机器学习的技能:预处理、流水线、算法优化。然而,我相信它也可以影响那些试图理解和学习现实世界数据科学的人。对于现实世界,我严格地说是指现实生活中的行业环境,其中数据科学被采用来满足业务目标。

许多求职者目前正试图进入数据科学领域。一些人通过 Kaggle 比赛来启动和引导他们新的 ML 旅程。鉴于这种趋势,我认为区分什么是 Kaggle 竞争,什么不是非常重要。虽然 Kaggle 有很大的教育益处,但我相信它也能培养我称之为的竞争心态。

竞争心态:(名词)Kaggle 竞赛中优先考虑的技术、目标和流程反映了典型商业环境中的心态。

这种心态的最大挑战是,Kaggle 竞赛中使用的数据科学和行业环境中实践的数据科学之间存在核心的根本差异(我称之为行业数据科学)。我将探讨为什么会出现这种情况的三个具体原因,以及我们如何为那些即将进入这一领域的人设定正确的期望。

我用 Kaggle 作为一个更短的术语,特指 Kaggle 竞赛 。Kaggle.com 提供其他服务,如提供数据集在线访谈、讲座等。这是我在本文中没有考虑的。我是旧金山的一名数据科学家,但我试图将我的观点推广到世界其他地方。

卡格尔的 3 个分歧

Kaggle 不是行业数据科学有三大原因:

  1. 目标 : Kaggle 和行业数据科学拥有完全不同的目标和宗旨。
  2. 技术 : Kaggle 竞赛优先考虑工业中不容易利用的技术。
  3. 数据 : Kaggle 为您提供数据;现实世界不会。

1.卡格尔的目标

你可能有一个主观的原因去参加一个游戏比赛(例如:提高技能)。但归根结底,Kaggle 竞赛最终只是一场竞赛。这就是为什么 H2O.ai 的首席决策科学家说:“在 Kaggle 上有一个特定的任务或目标:目标是获胜。”

卡格勒人通过比他们的竞争对手得分高而获胜。比顶级竞争对手的得分高出 0.0001%。由于这个原因,参与者非常关注指标,可以通过设计最佳模型来优化指标。

https://www.pinterest.com/pin/313633561524587800/

这个焦点就是分歧的开始。数据科学的基本目标不是指标或模型。听听 Scikit-learn 的核心开发者 Andreas Muller 的看法。在我们的独家 TDS 采访中,Andreas 告诉我:

“作为一名数据科学从业者,你的目标从来都不是准确性,也不是 ROC-AUC。这不是你申请的内容。你应该考虑在你的应用环境中取得一个特定的结果意味着什么。一旦你有了这个目标,你就可以定义指标,并尝试不同的方法来最大化这些指标。”

Andreas 阐明了指标不是数据科学的最终目标,而是服务于最终目标本身的工具。这是一个至关重要的区别,因为行业数据科学总是与业务环境联系在一起。因此,成为行业中的数据科学家意味着 A)为正确的业务成果定义相关指标,然后 B)在考虑业务环境的情况下优化这些指标。

这一优先原则也直接适用于建模过程。数据科学的目的不是设计最花哨、最复杂的 ML 算法。Patreon 数据科学主管 Maura Church 强调了这一观点。在我采访莫拉的时候,我问她:

你见过的数据科学申请者常见的陷阱有哪些?

例如:候选人可能会进入 Tensorflow 并学习 Keras 和深度学习,对于他们遇到的任何问题,他们都会说“哦,让我将 Tensorflow 应用于此”。这是一个需要避免的非常重要的陷阱。你将要面对的一些问题可能需要一个简单的 excel 电子表格。或者实际上解决问题的方法是让人们聚在一起讨论。因此,不考虑解决问题的正确方法是非常重要的陷阱。”

如果你有的竞争心态,我建议你听听莫拉关于马斯洛锤子的警示故事。请重新考虑一下,机器学习不是数据科学的最高优先级,而只是解决业务问题的众多工具之一。正如 Maura 所建议的,理解这种区别可能与你的职业成功直接相关。

此外,Maura 的观点论证了 Kaggle 工作流不是标准数据科学工作流的两个重要原因。首先,Kaggle 竞赛非常关注机器学习方法。在工业界,ML 只是数据科学家使用的一个可选工具。

第二,数据科学家很少得到现成的指标,尤其是在业务问题被明确定义之前。很多时候,数据科学家必须从头开始定义对业务成果有意义的正确指标。数据科学的分析部分尤其如此。

例子:有许多方法来定义概念,如流失、每月经常性收入(MRR)和用户/客户参与度,这些术语是许多企业密切跟踪的。如何定义这些术语取决于领域专业知识和对公司目标的谨慎理解。

https://medium.com/@fmoe/excel-for-data-science-a82247670d7a

2.卡格尔的工具

由于 Kaggle 和行业数据科学致力于不同的目标,所以他们使用不同的技术工具来实现这些目标。

Kagglers 经常依赖复杂的、多层的 ML 和深度学习方法来进行竞争。具体来说,他们使用堆叠/混合,因为这仍然是赢得 Kaggle 比赛的最成功的策略。H2O.ai 的首席决策科学家 Erin LeDell 在她的一次研讨会上阐述了这一点:

Erin:为什么有人想做【堆叠】?一个答案是,这基本上是目前赢得 Kaggle 的唯一方法。没错,有时候人不叠也能赢。但在很大程度上,这是人们获胜的方式。**

如果你看一下第一名和第二名的排名,小数点后第四位就是你要处理的差额。这就是你赢得卡格尔的方法。因此,如果您需要从数据中挤出所有的预测能力,堆叠是一个绝佳的机会。”

为什么这些 Kaggle-effective 技术不容易在工业中采用的一个主要原因是:模型的可解释性。在工业中,不仅模型的可解释性远比模型的复杂性重要,而且它们经常是相互对立的。

首先让我再次强调这一点:数据科学家的主要优先事项并不是真的“从你的数据中挤出所有的预测能力”。艾琳·莱德尔在接受 Kaggle 采访时也表达了同样的观点:“[Kaggle 竞赛中的表现] 并不总是与行业中的其他事情保持一致****

更重要的是,在 Kaggle 上构建复杂的模型会引发严重的模型可解释性问题。模型越花哨、越复杂,解释模型的内部工作就越有挑战性(又名:特征解释)。

所以你可能认为神经网络非常令人兴奋(确实如此),但它在许多商业环境中经常无法使用,因为很难解释它们。(随着 LIME、SHAP 价值观和其他人工智能解释工具的出现,视觉和语言模型取得了长足的进步,但巨大的工作还在前面)。

from The balance: Accuracy vs. Interpretability

理解这一障碍是新数据科学家的基础。你需要说服公司内部和外部的利益相关者相信你的模型正在做什么,以及为什么你的解决方案是重要的。

假设你在一家 B2B 公司工作,你的一个客户问你:“你的 ML 为什么对我们公司做这个预测?”

如果你告诉他们,“因为这是军情六处说的”,那是行不通的。你的客户会要求每一个详尽的逻辑解释,以平息他们对自动化决策的焦虑,特别是如果 ML 与他们的利润和收入直接相关。

内部利益相关者,比如产品和工程经理,也需要对你的算法的内部机制有(再)保证。这是整个数据工作流中很重要的一部分,但并不经常被提及。这就是我在采访 Guido Maretto 博士(Flyr 的数据科学家和前经济学教授)时询问这个问题的原因。他解释说,说服多个利益相关方的需求是他在公司面临的最大挑战:

因为如果没有你的解决方案的自我宣传,你就不会实施它,也不会对你公司的指标产生影响。这最终将与你的职业联系在一起。

*** [## 教授变身数据科学家:为什么 Guido Maretto 博士离开学术界开始创业

TDS 采访前教授(加州理工学院博士)为什么他离开了他的助理职位,以及如何加入行业后…

towardsdatascience.com](/professor-turned-data-scientist-why-dr-guido-maretto-left-academia-for-the-startup-life-da29102a8325)

请记住,通常是产品团队将您的功能整合到公司的产品中,而工程师将在编程方面实现这一点。***

3.卡格尔的数据

拼图的最后一块是数据。具体来说,Kaggle 和行业在收集数据的方式上存在分歧,这是定义业务问题后数据工作流的第一步。

简而言之,作为未来的数据科学家,你很少会得到现成的数据来轻松处理。与度量类似,您可能需要从头开始构建数据表。这样做需要仔细的过滤和明智的连接,以实现准确的数据检索。这需要 A)精通 SQL,B)对公司数据的专业知识。

你可以立即看到这个数据创建的过程与你在 Kaggle 比赛中所做的完全不同。在后一种情况下,数据以一种很好的 CSV 格式提供给你。你下载几个文件,使用 Pandas 功能将它们合并到共享 id 上,你就可以开始了。这个过程避免了在创建表的过程中面临的一些实际问题,例如:

  1. SQL 运行时/内存错误:使用临时表、自连接和其他方法有效地运行 SQL 查询,以防止在查询处理时间过长时出现内存错误。
  2. 目标标签创建:监督学习的目标标签并不总是预定义的。如果您正在构建一个客户流失模型,那么您为 ML 优化定义客户流失的方式可能与其他人定义客户流失的方式不同。
  3. 精确的数据分段:数据通常在分段的级别上提取,以针对/分析特定的(子)人群。正确的提取可能非常棘手,因为可能有多种方法来分割一个群体。

为了扩展第三点,假设要提取的细分市场是贵公司产品的新注册用户。为此,您可能需要考虑以下几点:

a) 免费试用(是在试用前还是试用后才算新用户?)

b) 海归(流失 3 个月后回来的是新用户吗?)

c) 交易类型(应一次性购买,无需经常性付款(礼品等)。)被认为是新签的?).

这些情况会阻碍您想要分析的目标子群体的完全分类。要解决这个问题,你需要我上面提到的:SQL 和公司数据方面的专业知识。

结论:Kaggle 和行业有重叠吗?

简短的回答是肯定的,但是要加一些星号。Kaggle 比赛中使用的数据管理和前/后处理过程也是我在自己的公司经常使用的步骤。这里或那里可能有其他相似之处,但它们不会掩盖目标、技术和数据收集方面的三个核心差异。

这对你这个有抱负的数据科学家来说意味着什么?

  1. 如果你想更好地理解应用机器学习技术,一定要练习 Kaggle。但是要警惕竞争心态。
  2. 了解这些差异可能是你获得第一份数据科学工作的关键。Kaggle 的瑞秋·塔特曼在 TDS 播客中强调了优先级的重要性。她认为“花在模型性能上的时间通常没有与利益相关者交谈或其他事情重要。”

如果你喜欢这篇文章,请关注我的媒体简介。一如既往,祝你好运!

*** [## Haebichan Jung —中等

阅读容格在媒介上的作品。“走向数据科学”的项目负责人| Recurly(旧金山)的数据科学家

medium.com](https://medium.com/@haebichan)***

数据清理和预处理完全初学者指南

原文:https://towardsdatascience.com/the-complete-beginners-guide-to-data-cleaning-and-preprocessing-2070b7d4c6d?source=collection_archive---------4-----------------------

如何在几分钟内为机器学习模型成功准备数据

数据预处理是建立工作机器学习模型的第一步(也可以说是最重要的一步)。很关键!

如果您的数据没有经过清理和预处理,那么您的模型就不起作用。

就这么简单。

数据预处理通常被认为是枯燥的部分。但这就是有准备和完全没有准备的区别。这就是看起来像专业人士和看起来很傻的区别。

有点像准备去度假。你可能不喜欢准备部分,但是提前确定细节可以让你免于一场噩梦般的旅行。

你必须去做,否则你就不能开始享受乐趣。

GIF via GIPHY

但是你是怎么做到的呢?

本教程将带你了解为任何机器学习模型准备任何数据集的基本知识。

进口第一!

我们希望从导入预处理数据所需的库开始。库实际上只是一个你可以使用的工具。你给库输入,库做它的工作,它给你你需要的输出。有很多可用的库,但是有三个是 Python 中的基本库。你几乎每次都会用到它们。使用 Python 时,三个最流行的库是 Numpy、Matplotlib 和 Pandas。 Numpy 是你需要的所有数学知识的图书馆。因为你的代码要在数学上运行,所以你要用这个。Matplotlib (特别是 Matplotlib.pyplot)是你想要制作图表的库。Pandas 是导入和管理数据集的最佳工具。熊猫和 Numpy 基本上是数据预处理必不可少的。

(如果你对这些都不熟悉,你可能想看看 NumPy 的终极初学者指南!)

[## NumPy 初学者终极指南

开始使用 NumPy 需要知道的一切

towardsdatascience.com](/the-ultimate-beginners-guide-to-numpy-f5a2f99aef54)

用一个快捷别名导入这些库是最有意义的,这样以后可以节省一点时间。这很简单,你可以这样做:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

现在,您可以通过键入以下内容来读取数据集

dataset = pd.read_csv('my_data.csv')

这告诉 Pandas (pd)读入您的数据集。这些是我为本教程整理的数据集的前几行:

现在我们有了数据集,但是我们需要创建一个因变量矩阵和一个自变量向量。您可以通过键入以下内容来创建因变量矩阵:

X = dataset.iloc[:, :-1].values

第一个冒号( : )意味着我们想要获取数据集中的所有行。 :-1 表示我们要抓取除最后一列之外的所有数据列。的。放在最后意味着我们要抓取所有的值。

现在我们需要一个因变量的向量,只包含最后一列的数据,所以我们可以键入

y = dataset.iloc[:, 3].values

请记住,当您查看数据集时,索引从 0 开始。如果你想计算列数,从 0 开始,而不是 1。 [:,3] 获得动物年龄价值栏。0 是动物栏,1 是年龄栏,2 是价值。如果你还没有习惯这个计数系统,你会习惯的!

如果我们有丢失的数据会怎么样?

这实际上一直都在发生。

GIF via GIPHY

我们可以删除丢失数据的行,但这真的不是最聪明的主意。这很容易引起问题。我们需要找到一个更好的主意!最常见的解决方案是取列的平均值来填充缺失的数据点。

使用 scikit-learn 的预处理模型中的 imputer 类可以很容易地做到这一点。如果你还不知道,scikit-learn 包含了惊人的机器学习模型,我强烈建议你去看看!)

当应用于机器学习时,您可能不习惯使用“方法、“”和“对象”这样的术语。没问题!

一个是我们想要构建的东西的模型。如果我们要搭建一个棚子,棚子的搭建方案就是上课。

一个对象是该类的一个实例。本例中的对象是我们按照施工计划搭建的棚子。同一个类可以有许多对象。这就像是说,你可以根据建筑计划建造很多棚子。

一个方法是一个我们可以在对象上使用的工具,或者一个应用于对象的函数,它接受一些输入并返回一些输出。这就像一个把手,当我们的小屋开始变得有点闷时,我们可以用它来打开窗户。

Photo by Roman Kraft on Unsplash

为了使用估算器,我们将运行类似这样的程序

from sklearn.preprocessing import Imputer
imputer = Imputer(missing_values = np.nan, strategy = ‘mean’, axis = 0)

Mean 是默认策略,所以您实际上不需要指定它,但是它在这里,所以您可以了解您想要包含什么信息。missing_values 的默认值是 nan。如果您的数据集有称为“NaN”的缺失值,您将坚持使用 np.nan。

现在,为了适应这个估算,我们键入

imputer = imputer.fit(X[:, 1:3])

我们只想将估算值拟合到缺少数据的列。第一个冒号意味着我们想要包含所有的行,而 1:3 意味着我们接受列索引 1 和 2。别担心。您很快就会习惯 Python 的计算方式!

现在我们想使用的方法将实际上取代丢失的数据。您可以通过键入

X[:, 1:3] = imputer.transform(X[:, 1:3])

用其他策略试试这个吧!您可能会发现,对于您的项目来说,用列的中间值填充缺失值更有意义。还是模式!像这样的决定看起来很小,但实际上却非常重要。

某样东西受欢迎并不一定就是正确的选择。数据点的平均值不一定是模型的最佳选择。

毕竟,几乎每个阅读这篇文章的人都有超过平均水平的手臂…

Photo by Matthew Henry on Unsplash

如果你有分类数据呢?

很棒的问题!你不能完全理解驼鹿的意思。我们能做什么?我们可以将分类值编码成数字!您需要从 sklearn.preprocessing 中获取标签编码器类。

从您想要对数据进行编码的一列开始,并调用标签编码器。然后将它放入您的数据中

from sklearn.preprocessing import LabelEncoder
labelencoder_X = LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[:, 0])

(还记得括号里的数字是怎么工作的吗?:表示我们想要处理所有的行,0 表示我们想要获取第一列。)

这就是用数字替换第一列中的分类变量的全部步骤。例如,不是驼鹿,而是“0”,不是“狗”,而是“2”,不是“猫”,而是“3”。

你看到潜在的问题了吗?

这种标注系统暗示了数据的等级值,这可能会影响您的模型。3 的值大于 0,但并不(一定……)大于驼鹿

Photo by Cel Lisboa on Unsplash

我们需要创建虚拟变量

我们可以为猫创建一个列,为驼鹿创建一个列,以此类推。然后,我们将在列中填入 1 和 0(认为 1 =是,0 =否)。这意味着,如果您在原始列中有,现在您将在驼鹿列中有 0,在狗列中有 0,在猫列中有 1。

听起来很复杂。输入一个热编码器!

导入编码器,然后指定列的索引

from sklearn.preprocessing import OneHotEncoder
onehotencoder = OneHotEncoder(categorical_features = [0])

现在稍微适应和改变一下

X = onehotencoder.fit_transform(X).toarray()

瞧啊。您的单个列已被原始列中的每个分类变量替换为一个列,并用 1 和 0 替换分类变量。

很可爱,对吧?

如果我们有像“yes”和“no”这样的分类变量,我们可以继续对我们的 y 列使用标签编码器

labelencoder_y = LabelEncoder()
y = labelencoder_y.fit_transform(y)

这将把 y 拟合并转换成一个编码变量,1 表示是,0 表示否。

列车测试分离

此时,您可以继续将数据分成训练集和测试集。我知道我已经在图像分类教程中说过了,但是请始终将您的数据分成训练和测试集,永远不要使用您的测试数据进行训练!你需要避免过度合身。(你可以把过度拟合想象成在没有理解信息的情况下,在一次考试前记忆超级具体的细节。当你记住细节的时候,你会在家里用你的抽认卡做得很好。然而,当你面对新的信息时,你会通不过任何真正的测试。)

现在,我们有一台需要学习的机器。它需要在数据上进行训练,并看看它对在单独数据上所学内容的理解程度。记忆训练集和学习不是一回事!您的模型在训练集上学习得越好,就越能预测测试集的结果。你永远不会想过度拟合你的模型。你真的想让它学会!

Photo by Janko Ferlič on Unsplash

首先,我们进口

from sklearn.model_selection import train_test_split

现在我们可以创建 X_train 和 X_test 以及 y_train 和 y_test 集合。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

将数据进行 80/20 分割是非常常见的,80%的数据用于培训,20%用于测试。这就是我们将 test_size 指定为 0.2 的原因。你可以按你需要的方式分割它。你不需要设置一个随机状态,但我喜欢这样做,这样我们就可以准确地重现我们的结果。

现在进行特征缩放。

什么是特征缩放?我们为什么需要它?

好吧,看看我们的数据。我们有一列动物年龄从 4-17 岁,动物价值从 48,000 美元到 83,000 美元不等。不仅“价值”栏由比“年龄”栏高得多的数字组成,而且变量也覆盖了更广泛的数据范围。这意味着欧几里德距离将被价值所支配,并将最终支配年龄数据。

如果欧几里德距离在你的特定机器学习模型中不起作用怎么办?缩放要素仍会使模型速度更快,因此在预处理数据时,您可能需要包括此步骤。

有许多方法可以进行特征缩放。它们都意味着我们把我们所有的特征放在同一个尺度上,所以没有一个被另一个所支配。

从导入开始(您必须习惯这一点)

from sklearn.preprocessing import StandardScaler

然后创建一个我们要缩放的对象,称之为标准缩放器

sc_X = StandardScaler()

现在,我们直接拟合和转换数据集。抓取对象并应用方法。

X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)

我们不需要让它适合我们的测试集,我们只需要一个转换。

sc_y = StandardScaler()
y_train = sc_y.fit_transform(y_train)

哑变量呢?需要对它们进行缩放吗?

嗯,有些人说是,有些人说不是。这是一个你有多想坚持你的解释的问题。让我们所有的数据保持相同的比例是件好事。但是,如果我们对数据进行缩放,我们就失去了轻松解释哪些观察值属于哪个变量的能力。

y 呢?如果你有一个像 0 和 1 这样的因变量,你真的不需要应用特征缩放。这是一个具有绝对相关值的分类问题。但是如果你有很大范围的特征值,那么是的!您确实想应用缩放器!

你做到了!

就是这样!

Photo by Roven Images on Unsplash

只需几行代码,您就已经完成了数据清理和预处理的基础工作!想看的话可以看这里的代码。

在这一步,你肯定会有很多想法需要考虑。您需要考虑如何准确地填充缺失的数据。考虑是否需要缩放要素以及如何缩放。虚拟变量还是没有?你会对你的数据进行编码吗?你会编码你的虚拟变量吗?这里有大量的细节需要考虑。

也就是说,你有这个!

现在出去把数据准备好!

和往常一样,如果你用这些信息做了什么很酷的事情,请在下面的回复中让人们知道,或者随时在 LinkedIn @annebonnerdata 上联系!

如果你喜欢这篇文章,你可能也会对我的其他文章感兴趣:

[## Git 和 GitHub 入门:完全初学者指南

Git 和 GitHub 基础知识,供好奇和完全困惑的人使用(加上最简单的方法来为您的第一次公开…

towardsdatascience.com](/getting-started-with-git-and-github-6fcd0f2d4ac6) [## 机器学习完全入门指南:简单线性回归四行代码!

一个清晰而全面的蓝图,绝对适合任何想要构建简单机器学习模型的人

towardsdatascience.com](/simple-linear-regression-in-four-lines-of-code-d690fe4dba84) [## Google Colab 入门

沮丧和困惑的基本教程

towardsdatascience.com](/getting-started-with-google-colab-f2fff97f594c) [## 如何用 GitHub 毫不费力地免费创建一个网站

GitHub Pages 入门:创建和发布免费作品集的快速简便指南…

towardsdatascience.com](/how-to-create-a-free-github-pages-website-53743d7524e1) [## 深度学习简介

新手、新手和新手的神经网络。

towardsdatascience.com](/intro-to-deep-learning-c025efd92535) [## WTF 是图像分类?

为好奇和困惑征服卷积神经网络

towardsdatascience.com](/wtf-is-image-classification-8e78a8235acb) [## 如何构建准确率高于 97%的图像分类器

清晰完整的成功蓝图

medium.freecodecamp.org](https://medium.freecodecamp.org/how-to-build-the-best-image-classifier-3c72010b3d55) [## 出色的模型部署初学者指南

一个清晰简单的路线图,让你的机器学习模型在互联网上,做一些很酷的事情

heartbeat.fritz.ai](https://heartbeat.fritz.ai/brilliant-beginners-guide-to-model-deployment-133e158f6717)

感谢阅读!

Python 分类完全指南

原文:https://towardsdatascience.com/the-complete-guide-to-classification-in-python-b0e34c92e455?source=collection_archive---------4-----------------------

深入探究逻辑回归、LDA 和 QDA 的内部工作原理,并在项目环境中实现每个算法。

介绍

本文可作为简单和复杂分类问题的参考。通过“简单”,我们指定一个二元分类问题,其中两个类别之间存在一个清晰的线性边界。更复杂的分类问题可能涉及两个以上的类别,或者边界是非线性的。

对于此类问题,逻辑回归线性判别分析 (LDA)和二次判别分析 (QDA)等技术是应用最广泛的算法。

在本文中,我们将首先解释回归和分类问题之间的区别。然后,我们将深入研究逻辑回归、LDA 和 QDA 的理论。最后,我们将使用真实数据集在 Python 中实现每个算法。

我希望这篇文章对你有用,并且你可以回头参考它!我们开始吧!

关于机器学习、深度学习和人工智能的实践视频教程,请查看我的 YouTube 频道

回归与分类问题

之前,我们看到线性回归假设响应变量是定量的。然而,在许多情况下,反应实际上是定性的,就像眼睛的颜色。这种类型的反应被称为分类反应。

分类是预测定性反应的过程。用于分类的方法通常预测定性变量的每个类别的概率,作为进行分类的基础。在某种程度上,它们的行为类似于回归方法。

通过分类,我们可以回答如下问题:

  • 一个人有一系列症状,这些症状可以归因于三种医学状况中的一种。哪一个?
  • 一笔交易是不是欺诈?

分类回答通常用词来表达。当然,我们不能用文字作为传统统计方法的输入数据。当我们实现算法的时候,我们会看到如何处理这个问题。

现在,让我们看看逻辑回归是如何工作的。

逻辑回归

当涉及到分类时,我们要确定一个观察值是否属于某一类的概率。因此,我们希望用 0 到 1 之间的值来表示概率。

接近 1 的概率意味着观察结果很可能属于该类别。

为了生成介于 0 和 1 之间的值,我们使用以下等式来表示概率:

Sigmoid function

上面的等式被定义为 sigmoid 函数。

画出这个方程,你会发现这个方程总是产生一个介于 0 和 1 之间的 S 形曲线。

Logistic regression curve

对上面的等式进行一些操作后,您会发现:

拿起两边的圆木

上面的等式被称为对数。可以看到,它在 X 是线性的。这里,如果系数是正的,那么 X 的增加将导致更高的概率。

估计系数

与线性回归一样,我们需要一种方法来估计系数。为此,我们最大化似然函数:

Likelihood function

这里的直觉是,我们希望系数使得预测的概率(在上面的等式中用撇号表示)尽可能接近观察到的状态。

与线性回归类似,我们使用 p 值来确定是否拒绝零假设。

Z 统计也被广泛使用。大的绝对 Z 统计量意味着零假设被拒绝。

请记住,零假设声明:特征和目标之间没有相关性。

多元逻辑回归

当然,逻辑回归可以很容易地扩展到容纳一个以上的预测因子:

Multiple logistic regression

请注意,使用多元逻辑回归可能会给出更好的结果,因为它可以考虑预测因素之间的相关性,这种现象被称为混淆。此外,很少仅有一个预测器就足以建立准确的预测模型。

线性判别分析

现在,我们明白了逻辑回归是如何工作的,但是像任何模型一样,它也存在一些缺陷:

  • 当类被很好地分开时,从逻辑回归估计的参数往往是不稳定的
  • 当数据集很小时,逻辑回归也是不稳定的
  • 最好不要预测两个以上的类

这就是线性判别分析(LDA)派上用场的地方。它比逻辑回归更稳定,广泛用于预测两个以上的类别。

LDA 的特殊性在于,它分别对每个响应类别中预测值的分布进行建模,然后使用贝叶斯定理来估计概率。

好吧,这有点难以理解。我们来分解一下。

贝叶斯分类定理

(抱歉,Medium 不支持数学方程。我尽了最大努力,尽可能的明确)。

假设我们想要将一个观察值分类到 K 类中的一个,其中 K 大于或等于 2。然后,让 pi-k 成为一个观察值关联到第类的总概率。然后,让 f_k(X) 表示 X 的密度函数,用于来自第 k 个类的观察。这意味着如果来自第第 k 个类的观测值具有 X = x 的概率,则 f_k(X) 是大的。然后,贝叶斯定理陈述:

Bayes’ theorem for classification

上面的等式可以简单地缩写为:

Abbreviated Bayes’ theorem for classification

希望这有一定的意义!

这里的挑战是估计密度函数。理论上,贝叶斯的分类错误率最低。因此,我们的分类器需要估计密度函数,以逼近贝叶斯分类器。

一个预测器的 LDA

假设我们只有一个预测值,并且密度函数是正态的。然后,您可以将密度函数表示为:

Normal distribution function

现在,我们要指定一个观察值 X = x ,对于这个观察值 P_k(X) 最大。如果你在 P_k(X) 中插入密度函数,取对数,你会发现你希望最大化:

Discriminant equation

上面的等式被称为判别式。如你所见,这是一个线性方程。因此得名:线性判别分析

现在,假设只有两个具有相等分布的类,您会发现:

Boundary equation

这是边界方程。下图显示了图示。

Boundary line to separate 2 classes using LDA

当然,这代表了一种理想的解决方案。事实上,我们无法精确计算边界线。

因此,LDA 利用以下近似:

  • 对于所有训练观察的平均值

Average of all training observations

  • 对于每类样本方差的加权平均值

Weighted average of sample variances for each class

其中 n 是观察次数。

重要的是要知道 LDA 假设每个类别的正态分布,特定类别的均值,以及共同方差

多个预测值的 LDA

现在扩展到多个预测值,我们必须假设 X 是从多元高斯分布中提取的,具有特定类别的均值向量和公共协方差矩阵。

相关和不相关高斯分布的示例如下所示。

Left: Uncorrelated normal distribution. Right: correlated normal distribution

现在,用向量符号表示判别方程,我们得到:

Discriminant equation with matrix notation

如你所见,等式保持不变。只是这一次,我们使用向量符号来容纳许多预测值。

如何评估模型的性能

对于分类,有时使用准确性来评估模型的性能是不相关的。

考虑分析一个高度不平衡的数据集。例如,您试图确定一项交易是否是欺诈性的,但您的数据集只有 0.5%包含欺诈性交易。然后,您可以预测没有任何交易是欺诈性的,并有 99.5%的准确率得分!当然,这是一种非常幼稚的方法,无助于检测欺诈交易。

那么我们用什么呢?

通常,我们用灵敏度特异性

灵敏度是真正的阳性率:正确识别的实际阳性的比例。

特异性是真阴性率:实际阴性被正确识别的比例。

让我们给出一些背景来更好地理解。使用欺诈检测问题,敏感度是被识别为欺诈的欺诈交易的比例。特异性是被识别为非欺诈的非欺诈交易的比例。

因此,在理想情况下,我们需要高灵敏度和高特异性,尽管这可能会因环境而异。例如,银行可能希望优先考虑较高的敏感性而不是特异性,以确保识别欺诈性交易。

ROC 曲线(接收器工作特性)可以很好地显示上述两种误差指标。分类器的总体性能由 ROC 曲线下的面积给出( AUC )。理想情况下,它应该紧挨着图形的左上角,并且面积接近 1。

Example of a ROC curve. The straight line is a base model

二次判别分析(QDA)

这里,我们保持与 LDA 相同的假设,但是现在,来自第类的每个观察值都有自己的协方差矩阵。

对于 QDA,判别式表示为:

Discriminant equation for QDA

毫无疑问,你会注意到这个方程现在是二次方程了。

但是,为什么选择 QDA 而不是 LDA?

对于大型数据集,QDA 是更好的选择,因为它倾向于具有更低的偏差和更高的方差。

另一方面,LDA 更适合于较小的数据集,它有较高的偏倚和较低的方差。

项目

太好了!既然我们已经深刻理解了逻辑回归、LDA 和 QDA 的工作原理,让我们应用每种算法来解决一个分类问题。

动机

蘑菇味道好极了!但是,仅在北美就有超过 10 000 种蘑菇,我们怎么知道哪些是可以食用的呢?

这是这个项目的目标。我们将构建一个分类器来确定某种蘑菇是可食用的还是有毒的。

我建议你抓住数据集并继续。如果您曾经被卡住,请随意查阅完整的笔记本

我们开始吧!

A GIF of a coding mushroom… What are the odds of finding that!

探索性数据分析

我们将使用的数据集包含具有 22 个特征的 8124 个蘑菇实例。其中,我们发现蘑菇的帽形、帽色、鳃色、面纱类型等。当然,它也告诉我们蘑菇是可食用的还是有毒的。

让我们导入一些库,这些库将帮助我们导入和操作数据。在您的笔记本中,运行以下代码:

数据科学项目的常见第一步是执行探索性数据分析 (EDA)。这一步通常包括了解更多您正在处理的数据。您可能想知道数据集的形状(有多少行和列)、空值的数量以及数据的可视化部分,以更好地理解要素和目标之间的相关性。

导入数据,并使用以下代码查看前五列:

将数据集放在项目目录中的 data 文件夹中总是很好的。此外,我们将文件路径存储在一个变量中,这样,如果路径发生变化,我们只需要改变变量分配。

运行此代码单元格后,您应该会看到前五行。您会注意到,每个特征都是分类的,并且用一个字母来定义某个值。当然,分类器不能接受字母作为输入,所以我们最终必须改变它。

现在,让我们看看我们的数据集是否不平衡。不平衡数据集是指一个类比另一个类多得多。理想情况下,在分类的上下文中,我们希望每个类的实例数量相等。否则,需要采用先进的采样方法,如少数过采样。

就我们的情况而言,我们想看看数据集中是否有同等数量的有毒和可食用蘑菇。我们可以这样绘制每个类别的频率:

你会得到下图:

Count of each class

太棒了。它看起来像一个相当平衡的数据集,有几乎相等数量的有毒和可食用的蘑菇。

现在,我想看看每个功能是如何影响目标的。为了做到这一点,对于每一个特征,我制作了一个由蘑菇类分隔的所有可能值的条形图。对所有 22 个特性手动操作是没有意义的,所以我们构建了这个助手函数:

色调会给有毒和可食用类一个颜色代码。数据参数将包含除蘑菇类之外的所有特征。运行下面的单元代码:

您应该会得到一个包含 22 个地块的列表。下面是一个输出示例:

Cap surface

花些时间浏览所有的情节。

现在,让我们看看是否有丢失的值。运行这段代码:

您应该看到每一列都有缺失值的数量。幸运的是,我们有一个没有缺失值的数据集。这很不常见,但我们不会抱怨。

为建模做准备

现在我们已经熟悉了数据,是时候为建模做准备了。如前所述,特性用字母来表示不同的可能值,但是我们需要将它们转换成数字。

为了实现这一点,我们将使用标签编码一键编码。

让我们首先在目标列上使用标签编码。运行以下代码:

您会注意到现在该列包含 1 和 0。

Result of label encoding the ‘class’ column

现在,有毒的用 1 表示,可食用的用 0 表示。现在,我们可以把我们的分类器想成“有毒与否”。毒蘑菇得 1(真),食用菌得 0(假)。

因此,标签编码会将分类特征转化为数字特征。但是,当有两个以上的可能值时,不建议使用标签编码。

为什么?

因为它会将每个值赋给 0、1 或 2。这是一个问题,因为“2”可能被认为是更重要的,并且可能由此得出错误的相关性。

为了避免这个问题,我们在其他特性上使用一键编码。为了理解它的作用,让我们考虑一下第一个入口点的帽形。你可以看到它的值为“x ”,代表一个凸帽形状。然而,在数据集中总共记录了六种不同的帽形状。如果我们对特征进行一次性编码,我们应该得到:

One-hot encoding the “cap-shape” feature

如您所见,帽子形状现在是一个矢量。1 表示数据集中条目的实际帽形状值,其余部分用 0 填充。还是那句话,你可以把 1 想成,把 0 想成假。**

一键编码的缺点是它向数据集引入了更多的列。在帽形的情况下,我们从一列到六列。对于非常大的数据集,这可能是一个问题,但是在我们的例子中,额外的列应该是可以管理的。

让我们继续对其余的功能进行一次性编码:

现在您应该可以看到:

One-hot encoded data set

你注意到我们从 23 列增加到 118 列。这是五倍的增长,但这个数字还不足以导致计算机内存问题。

既然我们的数据集只包含数字数据,我们就可以开始建模和预测了!

训练/测试分割

在深入建模和进行预测之前,我们需要将数据集分成训练集和测试集。这样,我们可以在训练集上训练算法,并在测试集上进行预测。这种方式的误差度量将更加相关,因为该算法将对以前没有见过的数据进行预测。

我们可以像这样轻松地分割数据集:

这里, y 就是单纯的目标(有毒或可食用)。那么, X 就是简单的所有特征的数据集。最后,我们使用 train_test_split 函数。 test_size 参数对应于将用于测试的数据集部分。通常,我们使用 20%。然后, random_state 参数用于再现性。它可以设置为任何数字,但它将确保每次代码运行时,数据集将被相同地分割。如果没有提供 random_state ,那么训练集和测试集将会不同,因为函数会随机分割它。

好了,我们正式准备好开始建模和预测了!

逻辑回归

我们将首先使用逻辑回归。在接下来的步骤中,我们将使用 ROC 曲线下的面积和混淆矩阵作为误差度量。

让我们先导入我们需要的所有内容:

然后,我们创建一个 LogisticRegression 对象的实例,并使模型适合训练集:

然后,我们预测蘑菇有毒的概率。记住,我们认为蘑菇有毒或无毒。

此外,必须提醒您,逻辑回归会返回一个概率。现在,让我们将阈值设置为 0.5,这样,如果概率大于 0.5,蘑菇将被分类为有毒。当然,如果概率小于阈值,蘑菇被分类为可食用。

这正是下面代码单元格中发生的情况:

注意,我们是在测试集上计算概率的。

现在,让我们看看混淆矩阵。这将显示真实阳性率、真实阴性率、假阳性率和假阴性率。

Example of a confusion matrix

我们像这样输出我们的混淆矩阵:

您应该得到:

太神奇了!我们的分类器是完美的!从上面的混淆矩阵中,你可以看到我们的假阳性和假阴性率是 0,这意味着所有的蘑菇都被正确地分类为有毒或可食用!

让我们打印 ROC 曲线下的面积。如你所知,对于一个完美的分类器,它应该等于 1。

的确,上面的代码块输出 1!我们可以制作自己的函数来可视化 ROC 曲线:

您应该会看到:

ROC curve

恭喜你!你用一个基本的逻辑回归模型建立了一个完美的分类器。

然而,为了获得更多的经验,让我们使用 ld a 和 QDA 建立一个分类器,看看我们是否得到类似的结果。

LDA 分类器

遵循逻辑回归概述的相同步骤:

如果您运行上面的代码,您应该看到我们再次获得了一个完美的分类器,其结果与使用逻辑回归的分类器相同。

QDA 分类器

现在,我们重复这个过程,但是使用 QDA:

同样,结果是一样的!

在本文中,您了解了用于分类的逻辑回归、LDA 和 QDA 的内部工作原理。

您还学习了如何用 Python 实现每个算法来解决分类问题。您经历了一个典型的分类工作流,其中必须对类进行编码,并且必须检查数据集是否不平衡。

我希望这篇文章对你有用。当你需要的时候,请随时查阅它!

干杯!

决策树完全指南

原文:https://towardsdatascience.com/the-complete-guide-to-decision-trees-17a874301448?source=collection_archive---------15-----------------------

决策树的完整介绍,如何使用它们进行回归和分类,以及如何在项目设置中实现算法

They are… don’t even try something else

基于树的方法可用于回归或分类。它们包括将预测空间分割成许多简单的区域。分割规则的集合可以总结为一棵树,因此被命名为决策树方法。

单个决策树往往不如线性回归逻辑回归LDA 等性能好。但是,通过引入 bagging、随机森林和 boosting,它可以显著提高预测的准确性,但会损失一些解释能力。

在这篇文章中,我们介绍了你需要知道的关于决策树、装袋、随机森林和 boosting 的一切。这将是一个漫长的阅读,但它将是值得的!

关于机器学习、深度学习和人工智能的实践视频教程,请查看我的 YouTube 频道

Just Bob Ross painting a tree

决策树的基础

回归树

在进入理论之前,我们需要一些基本的术语。

树是倒着画的。最后的区域被称为叶。树内发生分裂的点是一个区间节点。最后,连接节点的线段是分支

Decision tree schematic

要创建回归树,请执行以下操作:

  1. 将预测器空间划分为 J 个不同且不重叠的区域
  2. 对于落在一个区域中的每个观察值,预测该区域中响应值的平均值

每个区域被分割以最小化 RSS。为此,需要一种自顶向下的贪婪方法,也称为递归二进制分裂

为什么自上而下?

因为在第一次分裂之前,所有观测值都在单个区域中。

为什么是贪婪的方法?

因为最佳分割发生在特定步骤,而不是向前看并进行分割,这将导致对未来步骤的更好预测。

数学上,我们将这对半平面定义为:

并且我们寻求 js 来最小化:

但是,这可能会导致过度拟合。修剪树将产生一个更小的子树,我们可以用交叉验证来验证它。

Schematic of an unpruned tree

分类树

分类树与回归树非常相似。但是,我们不能使用响应的平均值,所以我们现在预测一个区域中最常出现的类。当然,RSS 不能作为评判标准。相反,每次分割都是为了最小化分类错误率

分类错误率只是不属于最常见类别的区域中训练观察值的分数。

Classification error rate

不幸的是,这对于植树来说不够灵敏。在实践中,还使用了另外两种方法。

还有基尼指数:

Gini index

这是对所有类别的总方差的度量。正如你所看到的,如果比例接近 0 或 1,基尼指数就会很小,所以它是一个很好的衡量节点纯度的指标。

类似的基本原理也适用于另一种叫做交叉熵的方法:

Cross-entropy

既然我们已经看到了基本决策树是如何工作的,那么让我们来看看如何提高它的性能!

装袋、随机成林、助推

制袋材料

我们知道 bootstrap 可以计算任何感兴趣的量的标准差。对于决策树来说,方差非常大。因此,通过 bootstrap aggregation 或 bagging ,我们可以减少方差并提高决策树的性能。

装袋包括从数据集中重复提取样本。这产生了 B 不同的引导训练集。然后,我们对所有自举训练集进行训练,以获得每个集的预测,并对这些预测进行平均。

数学上,平均预测是:

将此应用于决策树,这意味着我们可以构建大量具有高方差和低偏差的树。然后,我们可以对他们的预测进行平均,以减少方差,从而提高决策树的性能。

随机森林

随机森林通过一个小调整提供了对袋装树的改进,这个小调整就是去关联树。

像装袋一样,建立多个决策树。然而,在每次分割时,从所有 p 预测值中选择一个随机样本 m 预测值。分割只允许使用一个 m 预测值,通常:

换句话说,在每次分割时,不允许算法考虑大多数可用的预测值!

为什么?

假设数据集中有一个非常强的预测因子,以及其他中等强度的预测因子。然后在套袋树的采集中,他们都会在顶裂中使用这个强预测器。因此,所有装袋的树将非常相似,平均它们的预测不会减少方差,因为预测将高度相关。

随机森林通过强制每次分割只考虑预测子的子集来克服这个问题,这有效地消除了树的相关性

当然,如果 m 等于 p ,那么就跟装袋一样。通常情况下, p 的平方根给出了如下所示的最佳结果。

Classification error as a function of the number of trees. Each line represents the number of predictors available at each split.

助推

Boosting 的工作方式与 bagging 类似,但树是按顺序生长的:每棵树都使用来自先前生长的树的信息。

这意味着算法学习很慢。每棵树都适合模型的残差,而不是目标变量。因此,每棵树都很小,在表现不好的地方会慢慢改善预测。

升压有三个调整参数:

1.树的数量( B ):与套袋和随机森林不同,如果 B 太大,boosting 可能会溢出。使用交叉验证来选择正确的树的数量。

2.收缩参数( alpha ):控制 boosting 学习速率的小正数。它通常设置为 0.01 或 0.001。

3.每棵树的分裂数( d ):控制增强整体的复杂度。通常,单个拆分( d = 1)效果很好。它也被称为

Classification error as a function of the number of trees. Each line represents a different interaction depth.

正如你在上面看到的,交互深度为 1 似乎给出了最好的结果。

项目

现在,让我们应用我们所学的知识来预测乳腺癌。许多关于乳腺癌的数据集包含关于肿瘤的信息。然而,我很幸运地找到了一个数据集,其中包含了乳腺癌患者和非乳腺癌患者的常规血液检查信息。潜在地,如果我们能够准确地预测一个病人是否患有癌症,那么这个病人可以接受非常早期的治疗,甚至在肿瘤被发现之前!

当然,数据集和完整的笔记本都可以在这里获得,我强烈建议你也一起编码。

探索性数据分析

在开始 Jupyter 的工作之前,我们可以在这里获得关于数据集的信息

首先,您会注意到数据集非常小,只有 116 个实例。这带来了几个挑战,因为决策树可能会过度拟合数据,或者由于缺乏其他观察,我们的预测模型可能不是最好的。然而,这是一个很好的概念验证,可能证明通过简单的血液测试预测乳腺癌的真正潜力。

数据集仅包含以下十个属性:

1.年龄:患者的年龄(岁)

2.身体质量指数:体重指数(千克/米)

3.葡萄糖:血液中的葡萄糖浓度(毫克/分升)

4.胰岛素:血液中的胰岛素浓度(微单位/毫升)

5.HOMA:胰岛素抵抗的稳态模型评估(葡萄糖乘以胰岛素**

6.瘦素:能量消耗激素瘦素的浓度(ng/mL)

7.脂联素:脂联素的浓度——一种调节葡萄糖水平的蛋白质(微克/毫升)

8.抵抗素:抵抗素的浓度——脂肪组织分泌的一种蛋白质(ng/mL)

9.MCP . 1:MCP-1 的浓度——一种由于组织损伤或炎症而将单核细胞募集到炎症部位的蛋白质(pg/dL)

10.分类:健康对照(1)或患者(2)

现在我们知道了我们将使用什么,我们可以从导入我们常用的库开始:

然后,定义数据集的路径,让我们预览一下:

太好了!现在,因为这是一个分类问题,所以让我们看看这些类别是否平衡:

结果应该是:

如你所见,病人和健康对照的数量几乎相同。

现在,看看健康人和病人的每个特征的分布和密度会很有趣。为此,一个小提琴情节是理想的。它显示了单一地块中要素的密度和分布。让我们有九个小提琴情节:每个特征一个:

花点时间回顾一下所有的图,试着找出健康对照和患者之间的一些差异。

最后,让我们检查一下是否有丢失的值:

您应该看到没有一列缺少值!我们现在准备开始建模!

系统模型化

首先,我们需要将类编码为 0 和 1:

现在,0 代表健康对照,1 代表病人。

然后,我们将数据集分为训练集和测试集:

在编写模型之前,我们需要定义适当的误差度量。在这种情况下,由于这是一个分类问题,我们可以使用混淆矩阵并使用分类误差。让我们编写一个帮助函数来绘制混淆矩阵:

厉害!现在,让我们实现一个决策树。

决策图表

使用 scikit-learn ,决策树很容易实现:

您应该得到以下混淆矩阵:

如您所见,它错误地分类了三个实例。因此,我们来看看套袋、助推或随机森林是否能提高树的性能。

制袋材料

为了实现带有 bagging 的决策树,我们编写以下代码:

你会得到下面的混淆矩阵:

太神奇了!该模型对测试集中的所有实例进行了正确分类!为了得到更多的练习,让我们也实现一个随机森林分类器并使用 boosting。

随机森林分类器

这里,对于随机森林分类器,我们指定我们想要的树的数量。让我们用 100:

你会得到这个混乱矩阵:

在这里,虽然只有一个实例被错误分类,但是模型实际上说一个病人是健康的,而实际上这个人患有癌症!这是非常不理想的情况。

助推

最后,对于升压:

我们得到了以下结果:

同样,只有一个实例被错误分类。

结论

这篇文章涵盖了很多!您学习了基于树的方法的基本理论,您学习了我们如何提高它们的性能,并且我们在项目设置中实现了每个算法。

我希望这篇文章对您有用,并且您将在未来的项目中使用它。

决策树完全指南

原文:https://towardsdatascience.com/the-complete-guide-to-decision-trees-28a4e3c7be14?source=collection_archive---------0-----------------------

关于机器学习中的顶级算法,你需要知道的一切

Photo by Helena Hertz on Unsplash

一开始,学习机器学习(ML)可能会令人生畏。像“梯度下降”、“潜在狄利克雷分配”或“卷积层”这样的术语会吓到很多人。但是也有友好的方式进入这个领域,我认为从决策树开始是一个明智的决定。

决策树可能是最有用的监督学习算法之一。与无监督学习(没有输出变量来指导学习过程,数据由算法探索以找到模式)相反,在监督学习中,你的现有数据已经被标记,你知道你想要在你获得的新数据中预测哪种行为。这是自动驾驶汽车用来识别行人和物体的算法类型,或者是组织用来估计客户终身价值和客户流失率的算法类型。

在某种程度上,监督学习就像跟着老师学习,然后将知识应用到新数据中。

DTs 是 ML 算法,它基于一个描述性特征将数据集逐步分成更小的数据组,直到它们达到足够小的集合,可以用某个标签来描述。他们要求你有被标记的数据(用一个或多个标签标记,像植物图片中的植物名称),所以他们试图根据这些知识标记新的数据。

DTs 算法完美地解决了分类问题(机器将数据分类到类别中,如电子邮件是否是垃圾邮件)和回归问题(机器预测值,如房地产价格)。当因变量为连续变量或定量变量时,使用回归树(例如,如果我们想要估计客户拖欠贷款的概率),当因变量为分类变量或定性变量时,使用分类树(例如,如果我们想要估计一个人的血型)。

DTs 的重要性依赖于它们在现实世界中有很多应用的事实。作为 ML 中最常用的算法之一,它们被应用于几个行业中的不同功能:

由于各种原因,DTs 非常受欢迎,因为它们的可解释性可能是它们最重要的优势。它们可以很快被训练出来,而且很容易理解,这为它们打开了通向远远超越科学壁垒的新领域的可能性。如今,DTs 在商业环境中非常流行,其使用也扩展到了民用领域,其中一些应用引起了极大的关注。

芝麻信用公司(隶属于阿里巴巴的一家公司)使用 DTs 和其他算法来构建一个社会评估系统,考虑了各种因素,如支付账单和其他在线活动的准时性。在中国,一个好的“芝麻分”的好处包括在交友网站上更高的知名度,以及在你需要看医生时不用排队。事实上,在中国政府宣布将把所谓的社会信用体系应用于航班和火车,并在一年内禁止有不良行为的人乘坐此类交通工具后,人们担心该体系最终会产生一个庞大的“ML 支持的老大哥”。

基础知识

在电影 Bandersnatch (来自网飞的独立黑镜剧集)中,观众可以互动地选择不同的叙事路径,到达不同的故事线和结局。在电影讲故事的背后隐藏着一系列复杂的决定,让观众以一种选择自己的冒险模式移动,为此网飞必须找到一种方法,在以简单的方式呈现每个场景的同时加载多个版本。实际上,网飞制片人所做的是将电影分段,并为观众设置不同的分支点,从而得出不同的结果。换句话说,这就像建造一台 DT 一样。

DTs 由节点、分支和叶子组成。每个节点代表一个属性(或特征),每个分支代表一个规则(或决策),每个叶子代表一个结果。树的深度由层数定义,不包括根节点。

In this example, a DT of 2 levels.

DTs 对数据应用自上而下的方法,因此给定一个数据集,它们试图对它们之间相似的观察值进行分组和标记,并寻找最佳规则来拆分它们之间不相似的观察值,直到它们达到一定程度的相似性。

他们使用分层拆分过程,在每一层,他们尝试将数据拆分成两个或更多组,以便属于同一组的数据彼此最相似(同质性),而组之间尽可能不同(异质性)。

分割可以是二进制(将每个节点分割成最多两个子组,并尝试找到最佳分割),或多路(将每个节点分割成多个子组,使用与现有不同值一样多的分割)。在实践中,通常会看到带有二进制拆分的 DTs,但是知道多路拆分有一些优点是很重要的。多路分割耗尽了一个名义属性中的所有信息,这意味着一个属性很少在从根到叶的任何路径中出现一次以上,这使得 DTs 更容易理解。事实上,分割数据的最佳方式可能是为给定的要素找到一组间隔,然后根据这些间隔将数据分割成几个组。

On the left hand side, a DT with binary splitting, as opposed to a DT with multiway splitting on the right.

在二维术语中(仅使用 2 个变量),DTs 将数据领域划分为一组矩形,并在每个矩形中建立一个模型。它们简单而强大,对于数据科学家来说是一个很好的工具。

Right figure shows the partition of the bidimensional data space produced by the DT on the left (binary split). In practice, however, DTs use numerous variables (usually more than 2).

DT 中的每个节点都充当某个条件的测试用例,从该节点开始的每个分支都对应于该测试用例的一个可能的答案。

修剪那棵树

随着 DTs 中拆分数量的增加,它们的复杂性也会增加。一般来说,简单的 DTs 比超级复杂的 DTs 更受欢迎,因为它们更容易理解,并且不太可能陷入过度拟合。

过度拟合指的是一种模型,它对训练数据(它用来学习的数据)学习得如此之好,以至于它在推广到新的(看不见的)数据时遇到了问题。

换句话说,模型学习训练数据中的细节和噪声(数据集中不相关的信息或随机性),以至于对模型在新数据上的性能产生负面影响。这意味着训练数据中的噪声或随机波动被模型拾取并学习为概念。

While the black line fits the data well, the green line is overfitting

在这种情况下,您的模型可以很好地处理您预先提供的数据,但是当您将相同的模型暴露给新数据时,它就会崩溃。它无法重复其高度细致的表演。

那么,如何避免 DTs 中的过拟合呢?您需要排除非常适合数据的分支。您需要一个能够归纳新数据并很好地处理新数据的 DT,即使这可能意味着失去训练数据的精度。避免像鹦鹉学舌一样学习和重复特定细节的 DT 模型总是更好,并尝试开发一种具有能力和灵活性的模型,以便在您提供给它的新数据上有体面的性能。

修剪是一种用于处理过度拟合的技术,它通过删除树中几乎没有预测或分类能力的部分来减小 DTs 的大小。

这一过程的目的是通过减少过拟合的影响和去除可能基于噪声或错误数据的 DT 部分来降低复杂性和获得更好的精度。在 DTs 上执行修剪有两种不同的策略:

  • 预修剪:当信息变得不可靠时,停止生长 DT 分支。
  • 后期剪枝:当您获取一个完全成长的 DT,然后仅当它导致更好的模型性能时才删除叶节点。这样,当无法进一步改进时,您就可以停止删除节点。

Example of an unpruned DT, as taken from DataCamp

总之,正确分类或预测训练数据的每个示例的大 DT 可能不如不完全适合所有训练数据的较小 DT 好。

主要 DTs 算法

现在您可能会问自己:DTs 如何知道选择哪些特性以及如何拆分数据?为了理解这一点,我们需要了解一些细节。

所有的 DTs 基本上执行相同的任务:它们检查数据集的所有属性,通过将数据分成子组来找到可能给出最佳结果的属性。他们通过将子组分成越来越小的单元来递归地执行这个任务,直到树完成(由特定标准停止)。

进行拆分的决策会严重影响树的准确性和性能,对于该决策,DTs 可以使用不同的算法,这些算法在树的可能结构(例如,每个节点的拆分数量)、如何执行拆分的标准以及何时停止拆分方面有所不同。

那么,我们如何定义拆分哪些属性,何时拆分以及如何拆分呢?要回答这个问题,我们必须回顾一下主要的 DTs 算法:

CHAID

卡方自动交互检测(CHAID)是最古老的 DT 算法方法之一,它产生适合分类和回归任务的多路DT(分裂可以有两个以上的分支)。在构建分类树(因变量本质上是分类的)时,CHAID 依靠卡方独立性测试来确定每一步的最佳分割。卡方检验检查两个变量之间是否存在关系,并应用于 DT 的每个阶段,以确保每个分支与响应变量的统计显著预测值显著相关。

换句话说,它选择与因变量相互作用最强的自变量。

此外,就因变量而言,如果每个预测值的类别彼此之间没有显著差异,则将它们合并。在回归树(因变量是连续的)的情况下,CHAID 依靠 F 检验(而不是卡方检验)来计算两个总体均值之间的差异。如果 f 检验显著,则创建一个新分区(子节点)(这意味着该分区在统计上不同于父节点)。另一方面,如果目标平均值之间的 f 检验结果不显著,则类别被合并到单个节点中。

CHAID 不会替换丢失的值,并将它们作为一个单独的类来处理,如果合适的话,该类可以与另一个类合并。它还产生了倾向于更宽而不是更深的 DTs(多路特性),这可能是不切实际的短,并且很难与真实的业务条件相关联。此外,它没有修剪功能。

虽然不是最强大的(在检测最小可能的差异方面)或最快的 DT 算法,但 CHAID 易于管理,灵活,非常有用。

你可以在这个链接中找到 CHAID 和 R 的实现

手推车

CART 是一种 DT 算法,根据因变量(或目标变量)是分类变量还是数值变量,分别生成二进制 分类回归树。它以原始形式处理数据(不需要预处理),并且可以在同一个 DT 的不同部分多次使用相同的变量,这可以揭示变量集之间复杂的相互依赖关系。

分类树的情况下,CART 算法使用一种称为基尼杂质的度量来创建分类任务的决策点。 Gini 杂质给出了分裂有多精细的概念(节点“纯度”的度量),通过分裂产生的两个组中类的混合程度。当所有的观察值都属于同一个标签时,就有了一个完美的分类,基尼不纯值为 0(最小值)。另一方面,当所有观察值在不同标签中平均分布时,我们面临最坏情况的分裂结果和 0.5(最大值)的基尼杂质值。

On the left-hand side, a high Gini Impurity value leads to a poor splitting performance. On the right-hand side, a low Gini Impurity value performs a nearly perfect splitting

回归树的情况下,CART 算法寻找最小化最小平方偏差(LSD) 的分割,在所有可能的选项中选择最小化结果的分割。 LSD (有时被称为“方差减少”)度量最小化观察值和预测值之间的平方距离(或偏差)的总和。预测值和观察值之间的差异称为“残差”,这意味着 LSD 选择参数估计值,以使残差平方和最小。

LSD 非常适合度量数据,与其他算法相比,它能够正确捕获更多有关分割质量的信息。

CART 算法背后的思想是产生一系列的 DTs,每个 DTs 都是“最优树”的候选者。通过测试(使用 DT 以前从未见过的新数据)或执行交叉验证(将数据集分成“k”个折叠,并在每个折叠上执行测试)来评估每棵树的性能,从而确定最佳树。

购物车不使用内部绩效评估进行树选择。相反,DTs 的性能总是通过测试或交叉验证来衡量,只有在评估完成后才进行树的选择。

ID3

迭代二分法 3 (ID3)是一种 DT 算法,主要用于产生分类树。由于在原始数据中构建回归树还没有被证明是如此有效,ID3 主要用于分类任务(尽管一些技术如构建数值区间可以提高其在回归树上的性能)。

ID3 分割数据属性(二分法)以找到最主要的特征,以自顶向下的方法迭代地执行这个过程以选择 DT 节点。

对于分割过程,ID3 使用信息增益度量来选择对分类最有用的属性。信息增益是从信息论中提取的一个概念,指的是一组数据中随机性水平的降低:基本上它衡量的是一个特征给我们提供了多少关于一个类的“信息”。ID3 将总是试图最大化这个度量,这意味着具有最高信息增益的属性将首先分裂。

信息增益与的概念直接相关,熵是对数据中不确定性或随机性的度量。熵值范围从 0(当所有成员属于同一类或样本完全同质时)到 1(当存在完全随机性或不可预测性,或样本被平分时)。

你可以这样想:如果你想做一次无偏的抛硬币,有完全随机性或者熵值为 1(“正面”和“反面”一样,概率各为 0.5)。另一方面,如果你掷一枚硬币,例如一枚两面都有“反面”的硬币,事件中的随机性被消除,熵值为 0(得到“反面”的概率将跳到 1,正面”的概率将降到 0)。

In this graph you can see the relationship between Entropy and the probability of different coin tosses. At the highest level of Entropy, the probability of getting “tails” is equal to the one of getting “heads” (0.5 each), and we face complete uncertainty. Entropy is directly linked to the probability of an event. Example taken from The Null Pointer Exception

这很重要,因为信息增益是熵的减少,并且产生最大信息增益的属性被选择用于 DT 节点。

但是 ID3 也有一些缺点:它不能处理数值属性,也不能处理缺失值,这可能会带来严重的限制。

C4.5

C4.5 是 ID3 的继任者,代表了几个方面的改进。C4.5 可以处理连续数据和分类数据,适合生成回归分类树。此外,它可以通过忽略包含不存在数据的实例来处理缺失值。

与 ID3(使用信息增益作为分裂标准)不同,C4.5 使用增益比进行分裂过程。增益比是对信息增益概念的修改,通过在选择属性时考虑分支的数量和大小,减少了具有大量分支的 DTs 的偏差。由于信息增益显示出对具有许多结果的属性的不公平偏好,增益比通过考虑每个分割的内在信息来纠正这种趋势(它基本上通过使用分割信息值来“标准化”信息增益)。这样,具有最大增益比的属性被选择作为分割属性

此外,C4.5 包括一项名为 windowing 的技术,该技术最初是为了克服早期计算机的内存限制而开发的。开窗意味着算法随机选择训练数据的子集(称为“窗口”),并根据该选择构建 DT。这个 DT 然后被用于分类剩余的训练数据,并且如果它执行了正确的分类,DT 就完成了。否则,所有错误分类的数据点都被添加到窗口中,并且循环重复,直到训练集中的每个实例都被当前 DT 正确分类。由于随机化的使用,这种技术通常导致比标准过程产生的 DTs 更准确的 DTs,因为它捕获了所有“罕见”的实例以及足够多的“普通”病例。

C4.5 的另一个能力是它可以修剪 DTs。

C4.5 的剪枝方法基于估计每个内部节点的错误率,并且如果叶的估计错误较低,则用叶节点替换它。简而言之,如果算法估计如果删除一个节点的“子节点”并且该节点成为叶节点,DT 将更准确,那么 C4.5 将删除这些子节点。

该算法的最新版本被称为 C5.0,它是在专有许可下发布的,对 C4.5 进行了一些改进,如:

  • 速度提升: C5.0 明显快于 C4.5(快了几个数量级)。
  • 内存使用: C5.0 比 C4.5 更有内存效率。
  • 可变误分类成本:在 C4.5 中,所有的错误都被同等对待,但在实际应用中,一些分类错误比其他分类错误更严重。C5.0 允许为每个预测/实际类对定义单独的成本。
  • 更小的决策树: C5.0 得到的结果与 C4.5 相似,但 DTs 要小得多。
  • 其他数据类型: C5.0 可以处理日期、时间,并允许将值标注为“不适用”。
  • Winnowing: C5.0 可以在构造分类器之前自动对属性进行 Winnowing,丢弃那些可能没有帮助或者看起来不相关的属性。

你可以在这里找到 C4.5 和 C5.0 的比较

树的阴暗面

当然,DTs 有很多优点。由于其简单性以及易于理解和实施的事实,它们被广泛用于大量行业中的不同解决方案。但是你也需要意识到它的缺点。

DTs 倾向于在他们的训练数据上过度拟合,如果之前显示给他们的数据与之后显示给他们的数据不匹配,他们就会表现不佳。

他们还受到高方差的影响,这意味着数据中的一个小变化会导致一组非常不同的分裂,使解释变得有些复杂。它们遭受固有的不稳定性,因为由于它们的等级性质,顶部分裂中的误差的影响向下传播到下面的所有分裂。

在分类树中,错误分类观察的后果在某些类中比其他类更严重。例如,当一个人实际上会心脏病发作时,预测他/她不会心脏病发作可能比反之更糟糕。这个问题在像 C5.0 这样的算法中得到缓解,但在其他算法中仍然是一个严重的问题。

如果一些类支配其他类,DTs 也可以创建偏向树。这是不平衡数据集中的一个问题(数据集中的不同类具有不同的观察值),在这种情况下,建议在构建 DT 之前平衡 de 数据集。

在回归树的情况下,DTs 只能在他们基于之前看到的数据创建的值的范围内进行预测,这意味着他们对他们可以产生的值有边界

在每一级,DTs 寻找可能的最佳分割,以便优化相应的分割标准。

但是 DTs 分裂算法不能看到远远超出它们正在操作的当前级别(它们是【贪婪】),这意味着它们在每一步都寻找局部最优而不是全局最优。

DTs 算法根据一些分裂标准一次生长一个节点的树,并且不实现任何回溯技术。

群众的力量

但是好消息是:有不同的策略来克服这些缺点。集成方法将几个 DTs 结合起来,以提高单个 DTs 的性能,并且是克服已经描述的问题的重要资源。这个想法是使用相同的学习算法训练多个模型,以获得更好的结果。

大概执行集合 DTs 的两个最常见的技术是打包助推

当目标是减少 DT 的方差时,使用 Bagging (或 Bootstrap Aggregation)。方差与 DTs 非常不稳定的事实有关,因为数据的微小变化可能会导致生成完全不同的树。因此,Bagging 的想法是通过并行创建随机数据子集(来自训练数据)来解决这个问题,其中任何观察都有相同的概率出现在新的子集数据中。接下来,子集数据的每个集合用于训练 DTs,产生不同 DTs 的集合。最后,使用这些不同 DTs 的所有预测的平均值,这产生了比单个 DTs 更健壮的性能。随机森林是 Bagging 的扩展,它需要额外的一步:除了获取数据的随机子集,它还需要随机选择特征,而不是使用所有特征来增长 DTs。

Boosting 是另一种创建预测值集合以减少 DT 方差的技术,但采用了不同的方法。它使用一种顺序方法来拟合连续的 DTS,并且在每一步都试图减少来自先前树的错误。使用增强技术,每个分类器都根据数据进行训练,并考虑到先前分类器的成功。在每个训练步骤之后,权重基于之前的表现被重新分配。通过这种方式,错误分类的数据会增加其权重以强调最困难的情况,以便后续的 DTs 在训练阶段关注它们并提高其准确性。与 Bagging 不同,在 Boosting 中,观察值是加权的,因此它们中的一些将更频繁地参与新的数据子集。作为该过程的结果,整个集合的组合提高了 DTs 的性能。

在 Boosting 中,有几种替代方法可以确定在训练和分类步骤中使用的权重(例如,Gradient Boost、XGBoost、AdaBoost 等)。

你可以在这里找到这两种技术的异同点

对这些话题感兴趣?在 LinkedinTwitter 上关注我

Python 线性回归完全指南

原文:https://towardsdatascience.com/the-complete-guide-to-linear-regression-in-python-3d3f8f06bf8?source=collection_archive---------0-----------------------

从理论到实践,学习线性回归的基本原理,并编写代码在数据集上实现它。

介绍

本文试图成为您在理解和执行线性回归时需要的参考。虽然算法很简单,但只有少数人真正理解其中的基本原理。

首先,我们将深入挖掘线性回归理论,以了解其内部工作原理。然后,我们将在 Python 中实现该算法来建模一个业务问题。

我希望这篇文章能找到你的书签!现在,让我们开始吧!

关于机器学习、深度学习和人工智能的实践视频教程,请查看我的 YouTube 频道

该理论

How you’ll feel studying linear regression

线性回归可能是统计学习最简单的方法。对于更高级的方法来说,这是一个很好的起点,事实上,许多新奇的统计学习技术可以被视为线性回归的扩展。因此,在进入更复杂的方法之前,理解这个简单的模型将建立一个良好的基础。

线性回归很好地回答了以下问题:

  • 两个变量之间有关系吗?
  • 关系有多牢固?
  • 哪个变量的贡献最大?
  • 我们能多精确地估计每个变量的影响?
  • 我们能多精确地预测目标?
  • 关系是线性的吗?(咄)
  • 有交互作用吗?

估计系数

假设我们只有一个变量和一个目标。然后,线性回归表示为:

Equation for a linear model with 1 variable and 1 target

在上面的等式中,β是系数。这些系数是我们用模型进行预测所需要的。

那么我们如何找到这些参数呢?

为了找到参数,我们需要最小化最小平方误差平方和。当然,线性模型并不完美,它不会准确预测所有数据,这意味着实际值和预测值之间存在差异。误差很容易通过下式计算:

Subtract the prediction from the true value

但是为什么误差是平方的呢?

我们平方误差,因为预测可以高于或低于真实值,分别导致负的或正的差异。如果我们不对误差进行平方,误差的总和可能会因为负差异而减少,而不是因为模型非常适合。

此外,平方误差不利于较大的差异,因此最小化平方误差“保证”更好的模型。

让我们来看一个图表,以便更好地理解。

Linear fit to a data set

在上图中,红点是真实数据,蓝线是线性模型。灰色线条表示预测值和真实值之间的误差。因此,蓝线是使灰线的平方长度之和最小的线。

经过一些对本文来说过于繁琐的数学计算后,您最终可以用下面的等式来估计系数:

其中 x 条y 条代表平均值。

估计系数的相关性

现在你有了系数,你如何知道它们是否与预测你的目标相关?

最好的方法是找到 p 值。**p 值用于量化统计显著性;它允许判断是否要拒绝零假设。

无效假设?

对于任何建模任务,假设在特征和目标之间有某种关联。因此,零假设是相反的:在特征和目标之间没有相关性

因此,找到每个系数的 p 值将会知道该变量对于预测目标是否具有统计显著性。根据一般经验,如果 p 值小于0.05:变量和目标之间有很强的关系。

评估模型的准确性

通过寻找变量的 p 值,您发现您的变量具有统计显著性。太好了!

现在,你怎么知道你的线性模型是好的呢?

为了进行评估,我们通常使用 RSE(剩余标准误差)和 R 统计量。

RSE formula

R² formula

第一个误差指标很容易理解:残差越低,模型就越符合数据(在这种情况下,数据越接近线性关系)。

至于 R 度量,它测量目标中可以用特征 X 解释的可变性比例。所以假设线性关系,如果特征 X 能解释(预测)目标,那么比例高,R 值会接近 1。如果相反,R 值则更接近于 0。

多元线性回归理论

在现实生活中,永远不会有单一的特征来预测目标。那么,我们一次对一个特征进行线性回归吗?当然不是。我们简单地执行多元线性回归。

该方程非常类似于简单的线性回归;简单地将预测值的数量和它们相应的系数相加:

Multiple linear regression equation. p is the number of predictors

评估预测值的相关性

以前,在简单的线性回归中,我们通过寻找特征的 p 值来评估特征的相关性。

在多元线性回归的情况下,我们使用另一个指标:F 统计量。

F-statistic formula. n is the number of data points and p is the number of predictors

这里,F 统计量是针对整个模型计算的,而 p 值是针对每个预测值的。如果有强关系,那么 F 会远大于 1。否则,它将近似等于 1。

如何使比 1 足够大?

这个很难回答。通常,如果有大量的数据点,F 可能略大于 1,表明有很强的关系。对于小数据集,F 值必须远大于 1,以表明强相关关系。

为什么我们不能在这种情况下使用 p 值

由于我们正在拟合许多预测值,因此我们需要考虑有许多特征的情况( p 很大)。对于非常大量的预测值,总有大约 5%的预测值偶然具有非常小的 p 值 甚至 ,尽管它们在统计上不显著。因此,我们使用 F 统计量来避免将不重要的预测因子视为重要的预测因子。

评估模型的准确性

就像简单的线性回归一样,R 可以用于多元线性回归。但是,要知道添加更多的预测值总是会增加 R 值,因为模型必然会更好地拟合训练数据。

然而,这并不意味着它将在测试数据上表现良好(对未知数据点进行预测)。

添加交互

一个线性模型中有多个预测因子意味着一些预测因子可能会对其他预测因子产生影响。

例如,你想预测一个人的工资,知道她的年龄和上学的年数。当然,一个人越老,他在学校度过的时间就越多。那么我们如何对这种互动效应建模呢?

考虑这个非常简单的例子,有两个预测值:

Interaction effect in multiple linear regression

如你所见,我们简单地将两个预测因子相乘,并关联一个新的系数。简化公式,我们现在看到系数受另一个特征的值的影响。

作为一般规则,如果我们包括交互模型,我们应该包括特征的个体效应,即使它的 p 值不显著。这就是所谓的等级原则。这背后的基本原理是,如果两个预测者相互作用,那么包括他们各自的贡献将对模型产生很小的影响。

好吧!现在我们知道了它是如何工作的,让我们让它工作吧!我们将通过 Python 中的简单和多元线性回归来工作,我将展示如何在这两种情况下评估参数和整体模型的质量。

你可以在这里抓取代码和数据

我强烈建议您在自己的 Jupyter 笔记本中遵循并重新创建这些步骤,以充分利用本教程。

我们开始吧!

We all code like this, right?

介绍

数据集包含关于花费在广告上的钱及其产生的销售额的信息。钱花在了电视、广播和报纸广告上。

目标是使用线性回归来了解广告支出如何影响销售。

导入库

使用 Python 的优势在于,我们可以访问许多库,这些库允许我们快速读取数据、绘制数据并执行线性回归。

我喜欢在笔记本顶部导入所有必要的库,以保持一切井然有序。导入以下内容:

import pandas as pd
import numpy as npimport matplotlib.pyplot as pltfrom sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_scoreimport statsmodels.api as sm

读取数据

假设您下载了数据集,将它放在项目文件夹内的一个data目录中。然后,像这样读取数据:

data = pd.read_csv("data/Advertising.csv")

为了查看数据的样子,我们执行以下操作:

data.head()

你应该看看这个:

如您所见,列Unnamed: 0是多余的。因此,我们删除它。

data.drop(['Unnamed: 0'], axis=1)

好了,我们的数据是干净的,可以进行线性回归了!

简单线性回归

系统模型化

对于简单的线性回归,我们只考虑电视广告对销售的影响。在开始建模之前,让我们看一下数据是什么样子的。

我们使用matplotlib,一个流行的 Python 绘图库来制作散点图。

plt.figure(figsize=(16, 8))
plt.scatter(
    data['TV'],
    data['sales'],
    c='black'
)
plt.xlabel("Money spent on TV ads ($)")
plt.ylabel("Sales ($)")
plt.show()

运行这个代码单元,您应该会看到这个图形:

Scatter plot of money spent on TV ads and sales

正如你所看到的,在电视广告上的花费和销售额之间有着明显的关系。

让我们看看如何生成该数据的线性近似值。

X = data['TV'].values.reshape(-1,1)
y = data['sales'].values.reshape(-1,1)reg = LinearRegression()
reg.fit(X, y)print("The linear model is: Y = {:.5} + {:.5}X".format(reg.intercept_[0], reg.coef_[0][0]))

就这样?

是啊!对数据集拟合一条直线并查看方程的参数就是这么简单。在这种情况下,我们有

Simple linear regression equation

让我们想象一下这条线是如何拟合数据的。

predictions = reg.predict(X)plt.figure(figsize=(16, 8))
plt.scatter(
    data['TV'],
    data['sales'],
    c='black'
)
plt.plot(
    data['TV'],
    predictions,
    c='blue',
    linewidth=2
)
plt.xlabel("Money spent on TV ads ($)")
plt.ylabel("Sales ($)")
plt.show()

现在,你看:

Linear fit

从上图来看,似乎一个简单的线性回归可以解释电视广告支出和销售额的总体影响。

评估模型的相关性

现在,如果你还记得这篇文章中的内容,为了看看这个模型是否好,我们需要看看每个系数的 R 值和 p 值

我们是这样做的:

*X = data['TV']
y = data['sales']X2 = sm.add_constant(X)
est = sm.OLS(y, X2)
est2 = est.fit()
print(est2.summary())*

这给了你这个可爱的输出:

R² and p-value

查看这两个系数,我们有一个非常低的 p 值(尽管它可能不完全是 0)。这意味着这些系数和目标(销售额)之间有很强的相关性。

然后,看 R 值,我们有 0.612。因此,大约 60%的销售变化可以用花在电视广告上的金额来解释。这没问题,但肯定不是我们能准确预测销售的最好方法。当然,在报纸和广播广告上的花费肯定会对销售产生一定的影响。

让我们看看多元线性回归是否会表现得更好。

多元线性回归

系统模型化

就像简单的线性回归一样,我们将定义我们的特性和目标变量,并使用 scikit-learn 库来执行线性回归。

*Xs = data.drop(['sales', 'Unnamed: 0'], axis=1)
y = data['sales'].reshape(-1,1)reg = LinearRegression()
reg.fit(Xs, y)print("The linear model is: Y = {:.5} + {:.5}*TV + {:.5}*radio + {:.5}*newspaper".format(reg.intercept_[0], reg.coef_[0][0], reg.coef_[0][1], reg.coef_[0][2]))*

仅此而已!从这个代码单元,我们得到下面的等式:

Multiple linear regression equation

当然,我们无法想象所有三种媒体对销售的影响,因为它总共有四个维度。

请注意,报纸的系数是负的,但也相当小。与我们的模型相关吗?让我们通过计算每个系数的 F 统计量、R 值和 p 值来看看。

评估模型的相关性

正如您所料,这里的过程与我们在简单线性回归中所做的非常相似。

*X = np.column_stack((data['TV'], data['radio'], data['newspaper']))
y = data['sales']X2 = sm.add_constant(X)
est = sm.OLS(y, X2)
est2 = est.fit()
print(est2.summary())*

您会得到以下结果:

R², p-value and F-statistic

可以看到,R 远高于简单线性回归,其值为 0.897

还有,F 统计量是 570.3 。这比 1 大得多,而且由于我们的数据集相当小(只有 200 个数据点),它表明广告支出和销售之间有很强的关系。

最后,因为我们只有三个预测值,所以我们可以考虑它们的 p 值来确定它们是否与模型相关。当然,您会注意到第三个系数(报纸的系数)有一个很大的 p 值。因此,报纸上的广告支出在统计上并不显著。移除那个预测因子会稍微降低 R 值,但我们可能会做出更好的预测。

你真棒🤘。祝贺你坚持到最后,你现在是线性回归的大师了!

如上所述,这可能不是性能最好的算法,但对理解线性回归很重要,因为它是更复杂的统计学习方法的基础。

我希望你有时间会回头参考这篇文章。

干杯!

Python 中重采样方法和正则化的完整指南

原文:https://towardsdatascience.com/the-complete-guide-to-resampling-methods-and-regularization-in-python-5037f4f8ae23?source=collection_archive---------16-----------------------

了解重采样方法和正则化如何改进模型,并在项目设置中应用这些方法。

Please, use resampling methods

重采样和正则化是两个重要的步骤,可以显著提高模型的性能和对模型的信心。

在本文中,交叉验证将被广泛讨论,因为它是最流行的重采样方法。然后,将介绍岭回归和 lasso 作为线性模型的正则化方法。之后,将在项目设置中应用重采样和正则化。

我希望这篇文章能作为你未来某个项目的参考,并能成为你的书签。

我们开始吧!

关于机器学习、深度学习和人工智能的实践视频教程,请查看我的 YouTube 频道

重采样的重要性

重采样方法是现代统计学中不可缺少的工具。它们涉及重复地从训练集中抽取样本,并在每个样本上重新拟合感兴趣的模型,以便获得关于拟合模型的附加信息。这使我们能够获得更多的信息,而这些信息是仅拟合一次模型所无法获得的。

通常,数据科学项目的目标是使用训练数据创建模型,并让它对新数据进行预测。因此,重采样方法允许我们在不收集新数据的情况下,观察模型在未经训练的数据上的表现。

交叉验证

交叉验证( CV )用于估计与模型相关的测试误差,以评估其性能或选择适当的灵活性水平。评估一个模型的性能通常被定义为模型评估,而模型选择用于选择灵活性的级别。这个术语广泛用于数据科学领域。

现在,有不同的方法来执行交叉验证。让我们逐一探索。

验证集方法

这是最基本的方法。它只是将数据集随机分为两部分:一个训练集和一个验证集排除集。该模型适合训练集,并且该适合的模型用于对验证集进行预测。

Validation set schematic

上面是验证集方法的示意图。你在一个数据集中有 n 个观察值,它被随机分成两部分。蓝色一侧代表训练集,橙色一侧是验证集。数字只是代表行数。

当然,这种简单的方法也有一些缺点。

首先,验证测试错误率是高度可变的,这取决于训练和验证集中的观察值。

第二,只有一小部分观察值用于拟合模型。然而,我们知道统计方法在数据较少的情况下往往表现较差。

MSE for the validation set approach

在上面的左侧,您可以看到验证集方法仅应用一次时的 MSE。在右边,这个过程重复了 10 次。如你所见,MSE 变化很大。

这显示了使用验证集方法时 MSE 的显著可变性。

当然,有一些方法可以解决这些缺点。

留一交叉验证

留一交叉验证( LOOCV )是比验证集方法更好的选择。不是将数据集分成两个子集,而是只使用一个观察值进行验证,其余的用于拟合模型。

LOOCV schematic

以上是 LOOCV 的示意图。如您所见,只有一个观察用于验证,其余的用于训练。然后,该过程重复多次。

多次运行后,误差估计为:

LOOCV estimated error

这仅仅是每次运行的误差的平均值。

这种方法要好得多,因为它的偏差要小得多,因为更多的观察数据被用来拟合模型。在训练/验证集分割中没有随机性。因此,我们降低了 MSE 的可变性,如下所示。

MSE of LOOCV

k 倍交叉验证

这种方法包括将一组观察值随机分成大小大致相同的 k 组或。第一个折叠被视为验证集,模型适合其余的折叠。然后重复该过程 k 次,其中不同的组被视为验证集。

k-fold cross-validation schematic

因此,你意识到 LOOCV 是一个特殊的 k 重交叉验证案例,其中 k等于观察总数 n 。但是,通常将 k 设置为等于 5 或 10。

尽管 LOOCV 对于大型数据集来说是计算密集型的,但是 k-fold 更通用,可以用于任何模型。此外,它通常比 LOOCV 给出更准确的测试误差估计。因此,要评估和验证您的模型,k 倍交叉验证方法是最佳选择。

既然我们知道了交叉验证是如何工作的,以及它如何提高我们对模型性能的信心,那么让我们看看如何通过正则化来改进模型本身。

正规化

正则化方法有效地防止了过度拟合。当模型在训练集上表现良好,但在验证集上表现不佳时,就会发生过度拟合。

我们已经看到,线性模型,如线性回归和推而广之的逻辑回归,使用最小二乘法来估计参数。

现在,我们探索如何通过用其他拟合过程代替最小二乘拟合来改进线性模型。这些方法将产生更好的预测精度和模型可解释性。

但是为什么呢?为什么要用其他拟合方式?

最小二乘拟合在大多数情况下是可行的,但也有失败的情况。

例如,如果您的观察值数量 n 大于预测值数量 p ,那么最小二乘估计将具有较低的方差,并且表现良好。另一方面,当 p 大于 n (预测值多于观测值)时,方差为无穷大,该方法无法使用!

此外,多元线性回归往往会增加与响应实际不相关的变量。这给模型增加了不必要的复杂性。如果有一种方法可以自动执行特征选择,比如只包含最相关的变量,那就太好了。

为了实现这一点,我们引入了岭回归套索。这是两种常见的正则化方法,也称为收缩方法

收缩方法

将估计的系数向 0 收缩可以显著提高拟合度并减少系数的方差。在这里,我们探讨岭回归套索

里脊回归

传统的线性拟合涉及最小化 RSS(残差平方和)。在岭回归中,添加了一个新参数,现在参数将最小化:

其中λ调谐参数。使用交叉验证找到该参数,因为它必须最小化测试误差。因此,使用范围λ来拟合模型,并且最小化测试误差的λ是最佳值。

这里,岭回归将包括模型中所有的 p 预测值。因此,这是一种提高模型拟合度的好方法,但它不会执行变量选择。

套索

与岭回归类似,套索将最小化:

注意,我们使用参数β的绝对值,而不是它的平方值。此外,还存在相同的调谐参数。

然而,如果λ足够大,一些系数将有效地为 0!因此,lasso 还可以执行变量选择,使模型更容易解释。

项目

太好了!我们知道正则化和重采样是如何工作的。现在,让我们在项目设置中应用这些技术。

打开 Jupyter 笔记本,获取数据集。如果你遇到困难,还可以使用解决方案笔记本

我们开始吧!

导入库

像任何项目一样,我们导入常用的库来帮助我们执行基本的数据操作和绘图。

现在,我们可以开始探索性的数据分析了。

探索性数据分析

我们从导入数据集开始,查看前五行:

您应该看到:

请注意,未命名:0 列是无用的。让我们把它拿出来。

现在,我们的数据集看起来像这样:

如你所见,我们只有三种广告媒体,而销售额是我们的目标变量。

让我们通过绘制散点图来看看每个变量是如何影响销售的。首先,我们构建一个辅助函数来绘制散点图:

现在,我们可以为每个特征生成三个不同的图。

您会得到以下结果:

Sales with respect to money spend on TV ads

Sales with respect to money spent on radio ads

Sales with respect to money spent on newspaper ads

正如你所看到的,电视和广播广告似乎是销售的良好预测,而销售和报纸广告之间似乎没有相关性。

幸运的是,我们的数据集不需要进一步处理,所以我们准备好马上开始建模了!

系统模型化

多元线性回归—最小二乘拟合

在浏览之前,让我们先看看代码是什么样子的。

首先,我们导入 LinearRegressioncross_val_score 对象。第一个对象将允许我们拟合一个线性模型,而第二个对象将执行 k-fold 交叉验证。

然后,我们定义我们的特征和目标变量。

cross_val_score 将返回每个交叉验证步骤的 MSE 数组。在我们的例子中,我们有五个。所以我们取 MSE 的平均值,打印出来。您应该得到-3.0729 的负 MSE。

现在,我们来看看岭回归和套索哪个会更好。

里脊回归

对于岭回归,我们引入 GridSearchCV 。这将允许我们使用一系列不同的正则化参数自动执行 5 重交叉验证,以便找到α的最佳值。

代码如下所示:

然后,我们可以通过以下公式找到最佳参数和最佳 MSE:

您应该看到 alpha 的最佳值是 20,MSE 为负-3.07267。这是对基本多元线性回归的一点改进。

套索

对于 lasso,我们遵循与岭回归非常相似的过程:

在这种情况下, alpha 的最优值为 1,负的 MSE 为-3.0414,这是三个模型中最好的分数!

就是这样!现在,您已经了解了重采样和正则化如何极大地改进您的模型,并且知道了如何在项目设置中实现这两种方法。

我希望这篇文章对你有用,并且你可以参考它。

干杯!

开始数据科学和人工智能之旅的完整指南。

原文:https://towardsdatascience.com/the-complete-guide-to-start-your-datascience-ai-journey-c3d867215934?source=collection_archive---------8-----------------------

人工智能和数据科学已经是每个人都应该发展的技能。根据本指南,我们将快速浏览一个教程,向您展示如何开始这一技术之旅(学习和应用技能的平台、在您的计算机上安装、有用的软件)。在本文结束时,你将能够运行你的第一个机器学习程序!这个指南是为非专业人士设计的,所以不用担心!😃

你现在已经准备好开始你的数据科学&人工智能之旅。欢迎登机!

让自己为数据科学做好准备

软技能

教员自学

数据科学/人工智能/机器学习/深度学习,所有这些领域目前都在定义中。所以首先要学习的是永远积极学习的能力
对某事没有把握?寻找监督算法的定义?你程序中的一个错误?Googleit(或者使用其他任何搜索引擎作为 Qwant 或者 Ecosia )!小心你的消息来源,因为人工智能是一个新的领域,你可能会看到许多不同的,有时是矛盾的信息。在这里,没有人有关于定义或知识的绝对真理。搜索、互动和构建你自己的想法!这也是我推荐向协作平台学习的原因。在人工智能等热门话题上,协作平台是一个很好的信息来源,因为你可以浏览讨论主题,识别人物,并能够质疑任何答案或询问更多细节。如果你有问题或疑问,你可以确定在你之前已经有人在某个网站上问过了。你可能已经能够帮助别人了,所以不要犹豫,贡献自己的力量吧:

当你在机器学习方面更高级一点的时候你的主要参考资料将会是来自图书馆的文档,例如来自 scikit-learn hereTensorflowPytorch 的文档。

硬技能

数学和统计知识

机器学习、数据科学和人工智能需要很强的数学和统计知识。以下是您开始了解数据科学必须经历的知识领域(请不要犹豫,用一些其他领域来补充列表) :

资源:

面向数据科学的 Python

Python 是一种用于很多事情的语言(网站、游戏、应用程序、后端、数据库管理……)。要将 Python 用于数据科学,您需要:

  • 理解语言的共同逻辑
  • 学习如何使用

数据科学中最常见的图书馆是什么?
Pandas 用于数据操作,seaborn/matplotlib 用于数据可视化,numpy 用于数学操作,sklearn 用于算法使用,keras、pytorch 和 tensorflow 用于更高级的使用(例如像神经网络)。

资源:

数据科学课程

一旦你掌握了所有这些数学和代码知识,是时候让进入数据科学领域了。你需要学习新的技能。数据科学家应该能够全面了解下面列出的所有技能。但是取决于你想专攻什么,只有少数应该掌握。

  • 数据库管理:从不同种类的源(SQL、非 SQL、结构化、非结构化、集群、文件……)访问不同种类的数据。
  • 数据结构:轻松操作和准备您的数据,包括特性工程。
  • 数据可视化:通过可视化而不是阅读来理解你的数据。
  • 算法:没有比尝试所有可用的算法更糟糕的了,选择一个看起来“更好”的算法,这是浪费时间。每个训练有素的数据科学家都应该知道机器学习的 commons 算法是如何工作的。根据这些知识,数据科学家将能够从数据分析中选择算法。
  • 评估:结合数据可视化和度量知识,数据科学家必须知道一个模型是否工作良好。
  • 可解释性:我们得解开【黑匣子】的神话。**机器学习的可解释性(带有一些库,如 ShapLime )帮助我们理解数据科学解决方案如何工作
  • ****网络和基础设施安全知识:不要保存、运行或部署可能对组织或您的私人笔记本电脑造成危险的解决方案。

资源:

  • 斯坦福大学的机器学习
  • 哈佛大学的数据科学:机器学习

学以致用!

也许我最喜欢的学习方法是通过应用即时技能来直接学习。)。你会遇到许多人谈论机器学习、数据科学、分析或人工智能,却从未接触过一行代码,我认为这是不相关的。就像 Google 说的学习数据科学:把手弄脏!

两个流行的平台将帮助您(真正地)发展您的数据科学编码技能:

  • Kaggle :最受欢迎的数据科学平台,拥有一个令人敬畏的社区,可以互相学习。本指南结束后,你将能够在 Kaggle 上运行一个机器学习项目!😃
  • 这个平台真的很有用,不是从竞赛中学习,而是从针对不同水平的不同挑战的专业课程中学习,去看看吧!

机器学习基础

算法?模特?这种常见的区别必须在进一步研究之前完成。
机器学习是由算法组成的,像随机森林或者著名的 XGBoost。目前,世界各地的一些天才正在开发越来越复杂的算法。感谢开源库,你不需要编写代码,只需要知道如何使用它们!;)
一个模型是更一般的东西,一个模型由几个步骤(包括算法)组成,帮助你解决一个特定的问题。

机器学习项目(我在这里包括深度学习)可以有不同的类型:

  1. ****分类(即离散值):这类问题的目标是预测一个事件、物体、人的“类别”… 例如,如果你想预测一部手机使用哪个品牌、性能、材料、国家等。
  2. 回归**(即连续值):这类问题的目标是预测一个特定值。例如如果你想预测一部手机的价格。

在机器学习的这两个常见问题中,有三种方法:

  • ****监督:在监督学习中,你有两种不同的列。要素列是您将从中学习预测标注列的列(大多数情况下,您必须预测一个标注列)。例如,根据六月前几个月的过去价格预测下一个六月的电话价格(以及更多其他细节,例如竞争对手、电话当前版本的材料……)
  • ****无监督:无监督学习更棘手,你有很多特征,你得想办法对一些事件或值进行分类。例如,预测一部新手机在六月份的价格,但是因为这是一部新手机,所以你没有任何过去的数据。你将不得不使用你拥有的其他数据来找到一个价格,例如来自其他手机的数据,这些数据将与我们的新手机最匹配。
  • ****强化:在强化学习的大部分时间里,你没有任何数据,你只有一些你想最大化/最小化的指标。使用不同的方法,如遗传算法,你将能够执行自动任务。例如,寻找材料的完美组合,以最大限度地提高新手机的利润。

云还是本地?

一旦你为数据科学做好准备,让我们使用一台机器,它将成为你在这个人工智能旅程中的盟友。

开始数据科学每个人的第一个问题是:我的笔记本电脑中有足够的电力来建造和创造一个终结者吗?

嗯…好问题!第一步是了解你的计算机的资源。之后就看你想做什么样的任务了。如果你想做深度学习,通过从成千上万的图像中训练自己的神经网络,你需要有一台高水平的计算机(至少有一个 Nvidia GPU 1080 和 32Go 的 RAM)。但是等等……呆在这里!
目前大多数笔记本电脑都可以用来自数据库的数据运行基本的机器学习问题(。csv)大约有 100,000 行。如果你要处理更多的数据和更复杂的数据(如图像或声音),你需要升级你的笔记本电脑。从我的角度来看,一台机器学习笔记本电脑应该至少有 16Go 的内存和 8 个处理器内核,你可以少一些,但会花更多的时间…

如果您在有限的时间内需要更多的资源,您可以使用云解决方案,这对于初学者来说可能更难处理,因为它们需要一些高级配置。不要犹豫,访问流行的机器学习云解决方案提供商,如谷歌云平台亚马逊网络服务微软 Azur

因为这个指南是为初学者准备的,我们会把所有需要的东西直接安装到你的电脑上。

让你的计算机数据科学做好准备

末端的

也许初学者看到的第一个最奇怪的东西。你会找到几个词来定义这个黑色窗口:shell / bash / cmd / prompt,姑且称之为终端吧。
该终端允许您访问您计算机的每个文件夹和配置,信不信由您,当您掌握它时,它比鼠标导航器还快!在每台计算机的鼠标控制器民主化之前,一切都是使用几个终端“命令”来访问的。

U nix?Windows?MacOS?Linux?关于终点站都是一样的吗?

Unix 是 OSX 的核心系统,也是 Linux 的灵感来源,这意味着所有的命令都是一样的。 Macbook 和 Linux 用户,你已经全部设置好了,跳到下一节!
对于 Windows 用户来说在这里停留的时间稍微长一点:-) 。从 Windows 10 开始,Windows 允许用户在终端上安装 unix 命令,
对许多开发者来说是一个巨大的成功
你可以用几种方法在 windows 上安装 unix 终端,我们将在下面看到(Git 部分)我使用的最简单的,但是这里有一个教程可以让你用 windows 安装 Unix 命令行的过程:https://goo.gl/kYm1XC

终端怎么用?简单的导航演示

  • 在您的机器上安装了 unix 命令之后,打开一个搜索栏。
  • 在你的终端输入pwdpwd让你看到你在哪个文件夹里。
  • 键入ls列出可见的文件夹和文件。并键入ls --all列出包含隐藏文件的每个文件(它们为什么被隐藏?为了简化导航,默认情况下您不会看到所有文件和文件夹。大多数时候隐藏文件是一些你不需要接触的配置文件,但是现在有了你的终端,一切都是可访问的,棒极了不是吗?)
  • 选择一个文件夹并键入cd THE_NAME_OF_THE_FOLDER_HERE
  • 再次键入pwd,你应该会看到你刚刚跳转到这个文件夹中,恭喜你完成了你的第一个终端导航
  • 看一下 Unix 的完整命令集(键入man COMMAND以手动输入命令)
  • 不要犹豫,用它来感受更舒适和享受!

现在你掌握了终端,让我们安装所有我们需要的东西,开始玩人工智能!

蟒蛇和蟒蛇

是的,都是关于蛇的,但不用担心你会没事的,让我们成为耍蛇人吧;).

Anaconda 是一个框架,它以一种简单的方式在你的系统中安装你的计算机所需的所有基本的东西(库、模块、包、语言)。

图书馆?模块?包裹?语言?

  • 这里我们将使用 Python 作为“代码语言”。但是你有其他几种语言可以用来编码。语言的选择取决于你想做什么(javascript 用于 web 开发,SQL 用于数据库访问,Java 用于应用开发,Swift 用于 iOS 应用……)。Python 是最著名的语言之一,因为它以简单易懂的逻辑成为人类可读的语言。
  • 正如您所料,已经用 Python 编写了几个编程功能。为了不再开发其他人可能已经开发的功能,共享代码的一种常见方式是使用库(即模块、包……)和开源代码。获得所有这些开源代码的最著名的平台是 GitHub,后面会看到如何安装和使用,不用担心。Anaconda 已经安装了下面列出的开始数据科学所需的所有基本库。

让我们安装蟒蛇。跳转到他们的网站此处下载安装程序并遵循安装流程(适用于所有平台— Windows / macOS / Linux):

我推荐使用 Python 3.7 版本,因为所有库都停止支持 Python 2.7。在这个最新版本中,所有的库并没有全部设置好,但是不要犹豫去谷歌你可能遇到的任何困难。

作为参考,一旦 Python 安装到您的计算机上,您将真正经常使用命令pippip是一个从终端使用的库系统管理。

安装 Anaconda 后,您将能够使用conda而不是pip命令行。
我强烈推荐你使用
环境来管理你所有的项目,看看这里的。在一个环境中,你可以选择你想要的 python 版本,以及你想要使用的库和版本。但是您可以稍后再回来,届时您将有更多的时间来练习数据科学和编码。

Git 和开源

让我们开始深入一点吧!Git 是一个很棒的管理和共享代码的系统。正如你可能做的那样,除非有时数百人在同一个项目上工作,你不能通过 USB 手动合并你的所有代码,或者更糟的是通过电子邮件传输。Git 带来了代码管理或版本控制系统。

要在您的机器上安装 Git,请根据您的系统(MacOs、Linux、Windows)在这里下载安装程序。这里的是在你的机器上安装 git 的教程。

还记得如何在 windows 上管理 Unix 命令吗?
Windows 用户请按照下面几行来获取 Unix 命令!

  • 打开安装程序
  • 信息>点击下一步
  • 选择组件>单击下一步
  • 选择 Git 使用的默认编辑器>默认使用 Nano 编辑器
  • 调整你的路径环境:停!选择“从命令提示符使用 Git 和可选的 Unix 工具”****

  • 选择 HTTPS 传输后端>使用 OpenSSL 库
  • 配置行尾转换>检出 Windows 样式,提交 Unix 样式的行尾
  • 配置终端模拟器以用于 Git Bash: STOP!选择“使用 windows 的默认控制台窗口”****

  • 配置额外选项>启用文件系统缓存和启用 Git 凭证管理器
  • 安装并欢迎在这个惊人的新世界数十亿行代码!

快速指南这里允许你安装 Git 并理解它如何使用你新的终端命令行技能;) :

Git 平台( wut? ) 存储库是 Git 世界中的一个项目 😃。其中一些平台: BitbucketGitLabCodeBaseAssembla
最著名的平台是 Github
第一步:继续 Github
创建一个账户**,供日常使用
顺便说一下

你现在能够访问数十亿行代码,其中一些来自顶级科技公司,如谷歌,这将简化你进入数据科学的第一步。不要犹豫,穿过平台,发现来自脸书的密集姿势项目。

别忘了我们都使用开源项目。请不要犹豫与社区分享你的代码贡献给开源项目,成千上万的项目在等着你!代码是分享知识的绝佳工具,先分享后思考赚钱对每个人来说都更有利可图,让我们遵循这种心态

Jupyter & IDE,笔记本和脚本

。巴拉圭

作为。docx 是 Word Office,。xlsx for Excel,。图像的 png。py 是 Python 脚本的扩展。

为了访问和管理一个 Python 脚本,你有几个软件具有不同的复杂程度和不同的特性,其中大部分被称为集成开发环境 side。让我们来介绍其中的四种,但同样不要犹豫,尝试在互联网上搜索一些其他的,找到最适合你的一种:

一旦 Python 安装在你的电脑上,要运行一个*.py*脚本,你只需要在你的终端上输入包含你的脚本的文件夹:*python my_awesome_script.py*

。ipynb

。ipynb 是笔记本的扩展。最著名的笔记本跑垒员是【Jupyter】。****

笔记本?剧本?

它们对数据科学项目都很有用。这是一张来自最著名的数据科学平台 Kaggle 的图片,它向你解释了其中的区别。当你开始一个新项目(命名为内核)时,你必须在脚本或笔记本之间做出选择。

在全球范围内,笔记本用于数据探索/分析,并逐步多次运行模型和行,而无需回到代码执行的开始。但是由于您必须启动一个本地服务器,所以它比脚本慢,可伸缩性差。

为了在终端中安装笔记本,我们将安装 jupyter lab:

  • conda : conda install -c conda-forge jupyterlab
  • pip : pip install jupyterlab

这里的是完整的网站文档,但凭借你新的 git 技能,你也可以访问 Github repo !😃

安装完成后,你可以用命令行运行 Jupyter Lab:jupyter lab

让我们应用所有这些新东西!

你的第一个机器学习项目

是时候实践所有这些新知识了。这最后一部分包含一个教程,通过所需的所有步骤运行您的第一个机器学习项目:

  • 初始化一个项目
  • 任务理解**:我们将使用著名的泰坦尼克号数据集来完成对什么样的人可能幸存的分析。特别是,我们要求您应用机器学习的工具来预测哪些乘客在悲剧中幸存下来。(感谢 Kaggle 挑战这里)
  • 数据探索/分析

  • 数据可视化

  • 特色工程

  • 建模

  • 预测

初始化项目

我做了一个项目,可以帮助你开始这个旅程。我们要用这个 github 回购
我强烈推荐你分叉项目,以便能够修改它,随心所欲地玩它。叉子是什么?跳转到这个支持 Github 的网站这里

  • 打开终端
  • 导航到所需的位置并克隆存储库,您可以使用 repo 的直接 url(https://github.com/anisayari/your_first_machine_learning_project.git)),但是我建议您使用分叉的 URL,看起来应该是:[https://github.com/YOURUSERNAME/your_first_machine_learning_project.git](https://github.com/YOURUSERNAME/your_first_machine_learning_project.git)
C:\Users\AAyari> cd Desktop
C:\Users\AAyari> git clone [https://github.com/anisayari/your_first_machine_learning_project](https://github.com/anisayari/your_first_machine_learning_project).git
Cloning into 'your_first_machine_learning_project'...
remote: Enumerating objects: 22, done.
remote: Counting objects: 100% (22/22), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 22 (delta 4), reused 11 (delta 0), pack-reused 0
Unpacking objects: 100% (22/22), done.
  • 导航到该文件并启动 jupyter lab 查看笔记本:
C:\Users\AAyari> cd your_first_machine_learning_project
C:\Users\AAyari\Desktop\your_first_machine_learning_project> cd my_first_machine_learning_project
C:\Users\AAyari\Desktop\your_first_machine_learning_project\my_first_machine_learning_project> jupyter lab
[I 11:11:57.121 LabApp] The Jupyter Notebook is running at:
  • 太好了!我们的 Jupyter 实验室正在运行,您现在可以访问您的笔记本了。Jupyter 实验室应该已经在新的浏览器标签中打开,点击文件my_first_machine_learning_program_notebook.ipynb
    浏览器窗口应该如下图所示:

  • 好好享受这个笔记本吧!这是很好的评论,不要犹豫,通过这些线,并试图重现和改善他们。
  • 你应该已经注意到my_first_machine_learning_program.py是内核的脚本版本。试着运行一下,看看有什么不同!你会更好的理解笔记本和剧本的区别。要运行此脚本:
C:\Users\AAyari\Desktop\your_first_machine_learning_project\my_first_machine_learning_project> python my_first_machine_learning_program.py
  • 想用在 Kaggle 上?这款笔记本在 kaggle 这里有售,不要犹豫,把它“分叉”并运行它,在 kaggle 上提交你的第一个机器学习程序!

结论

现在,您应该能够:

  • 知道你需要发展哪些技能和知识,以及去哪里学习
  • 理解数据科学中使用的基本词汇(如笔记本、监督、模型……)
  • 获得在笔记本电脑上运行和管理 python 代码所需的所有基本软件

最后但并非最不重要的,你应该能够对你的同事说你运行了你的第一个机器学习程序!再次祝贺并感谢您阅读本指南。

数据科学和人工智能领域是令人兴奋的知识领域,保持好奇心,在互联网上探索更多。

欢迎来到你的数据科学/人工智能之旅。

支持向量机完全指南(SVM)

原文:https://towardsdatascience.com/the-complete-guide-to-support-vector-machine-svm-f1a820d8af0b?source=collection_archive---------5-----------------------

理解其内部工作原理,并在四种不同的场景中实现支持向量机

What would we do without sklearn?

介绍

我们已经看到了如何使用逻辑回归、LDA决策树处理分类问题。现在,又引入了另一个分类工具:支持向量机

支持向量机是一种称为最大间隔分类器的分类器的推广。最大间隔分类器很简单,但它不能应用于大多数数据集,因为类必须由线性边界分隔。

这就是为什么支持向量分类器被引入作为最大间隔分类器的扩展,其可以应用于更广泛的情况。

最后,支持向量机只是支持向量分类器的进一步扩展,以适应非线性类边界。

它可用于二元或多元分类。

解释支持向量机的理论非常专业。希望这篇文章能让你更容易理解支持向量机的工作原理。

一旦理论涵盖,你将在四个不同的场景中实现算法!

没有别的事了,让我们开始吧。

关于机器学习、深度学习和人工智能的实践视频教程,请查看我的 YouTube 频道

There are no SVM gifs.. so I had to settle for a ‘machine’ gif

最大间隔分类器

这种方法依赖于使用超平面来分离类。

什么是超平面?

p 维空间中,超平面是维数为 p-1 的平坦仿射子空间。视觉上,在 2D 空间中,超平面将是一条线,而在 3D 空间中,它将是一个平面。

数学上,超平面简单地说就是:

General hyperplane equation

如果 X 满足上式,则该点位于平面上。否则,它必须在平面的一侧,如下图所示。

The line represents a hyperplane in a 2D space. Points that satisfy the equation above will lie on the line, while others are on one side of the plane.

一般来说,如果可以使用超平面完美地分离数据,那么就有无限数量的超平面,因为它们可以向上或向下移动,或者稍微旋转,而不会接触到观察结果。

这就是为什么我们使用最大间隔超平面最佳分离超平面的原因,最佳分离超平面是离观察值最远的分离超平面。我们从给定超平面的每个训练观察计算垂直距离。这就是所谓的余量。因此,最优分离超平面是具有最大余量的超平面。

Example of a maximal margin hyperplane

正如你在上面看到的,有三个点与超平面等距。这些观察结果被称为支持向量,因为如果它们的位置移动,超平面也会移动。有趣的是,这意味着超平面仅依赖于支持向量,而不依赖于任何其他观察。

如果不存在分离平面呢?

Overlapping classes where no separating hyperplane exists

在这种情况下,没有最大间隔分类器。我们使用一个支持向量分类器,该分类器可以使用一个被称为支持向量分类器的软余量几乎分离类别。然而,进一步讨论这种方法变得非常技术性,因为它不是最理想的方法,我们现在将跳过这个主题。

支持向量机(SVM)

支持向量机是支持向量分类器的扩展,通过使用内核来扩大特征空间。核方法只是一种有效的计算方法,用于适应类之间的非线性边界。

在不涉及技术细节的情况下,核是量化两个观察的相似性的函数。内核可以是任何程度的。使用度大于 1 的核导致更灵活的决策边界,如下所示。

Example of classification with SVM

为了更好地理解内核的选择如何影响 SVM 算法,让我们在四个不同的场景中实现它。

项目

这个项目分为四个小项目。

第一部分将展示如何使用线性核执行分类,以及正则化参数 C 如何影响得到的超平面

然后,第二部分将展示如何使用高斯核生成非线性超平面。

第三部分模拟重叠类,我们将使用交叉验证来找到 SVM 的最佳参数。

最后,我们使用 SVM 执行了一个非常简单的垃圾邮件分类器。

以上练习摘自吴恩达在 Coursera 上的免费课程。我简单用 Python 解决,导师不推荐。尽管如此,我还是向所有初学者强烈推荐这门课程。

一如既往,笔记本和数据在这里可用

迷你项目 1——线性核 SVM

在我们开始之前,让我们导入一些有用的库:

注意,我们在这里导入了 loadmat ,因为我们的数据是矩阵形式的。

然后,我们将数据集的路径存储在不同的变量中:

最后,我们将构建一个函数来帮助我们快速绘制每个数据集:

完美!

现在,在这一部分,我们将使用线性核实现一个支持向量机,我们将看到正则化参数如何影响超平面。

首先,让我们加载并可视化数据:

您应该会看到:

注意上图左侧的异常值。让我们看看正则化参数在存在异常值时将如何影响超平面。

上面的代码块简单地将 SVM 拟合到数据中,我们使用预测来绘制超平面。注意,我们使用正则化参数 1。结果应该如下所示:

Hyperplane with C=1

如你所见,超平面忽略了异常值。因此,较低正则化参数将被更好地概括。测试误差通常会高于交叉验证误差。

现在,让我们增加正则化参数:

你会得到:

Hyperplane with C=100

现在,异常值在超平面的右侧,但这也意味着我们过度拟合。最终,这个边界在未观察到的数据上表现不好。

迷你项目 2——高斯核 SVM

现在,我们知道为了适应非线性边界,我们需要改变核函数。在这个练习中,我们将使用一个高斯核

首先,让我们绘制我们的数据:

您应该会看到:

在实现 SVM 之前,您应该知道高斯核表示为:

Gaussian kernel function

注意,有一个参数 sigma 决定了当它们相距较远时,相似性度量多快变为零。

因此,我们用以下代码实现它:

你应该得到下面的超平面:

Non-linear hyperplane with a Gaussian kernel

太神奇了!超平面不是一个完美的边界,但它在分类大多数数据方面做得很好。我建议你尝试不同的 sigma 值,看看它是如何影响超平面的。

迷你项目 3——交叉验证的 SVM

交叉验证对于从我们的模型中选择最佳性能的最佳调整参数至关重要。让我们看看如何将它应用到支持向量机中。

当然,让我们看看这个练习的数据是什么样的:

你会得到:

注意我们有重叠的类。当然,我们的超平面不会尽善尽美,但我们将使用交叉验证来确保它是我们能得到的最好结果:

从上面的代码单元中,您应该得到最佳正则化参数是 1,并且 sigma 应该是 0.1。使用这些值,我们可以生成超平面:

并获得:

Hyperplane with C=1 and sigma=0.1

迷你项目 4—SVM 垃圾邮件分类

最后,我们用 SVM 训练了一个垃圾邮件分类器。在这种情况下,我们将使用线性核。此外,我们有单独的数据集用于训练和测试,这将使我们的分析更容易一些。

你可以看到,我们得到的训练准确率为 99.825%,而测试准确率为 98.9%!

就是这样!您学习了支持向量机的内部工作原理,并在四个不同的迷你项目中实现了该算法,以了解核的选择如何影响该算法,以及如何使用交叉验证。

我希望这篇文章对您有所帮助,并且希望您在想要实现 SVM 的任何时候都能回来阅读这篇文章。

干杯!

时间序列分析和预测完全指南

原文:https://towardsdatascience.com/the-complete-guide-to-time-series-analysis-and-forecasting-70d476bfe775?source=collection_archive---------0-----------------------

理解移动平均,指数平滑,平稳性,自相关,SARIMA,并在两个项目中应用这些技术。

无论我们希望预测金融市场或电力消费的趋势,时间都是我们的模型中必须考虑的重要因素。例如,预测在一天中的什么时间将会出现用电高峰是令人感兴趣的,例如调整电力的价格或产量。

输入时间序列。时间序列就是按时间顺序排列的一系列数据点。在时间序列中,时间通常是独立变量,目标通常是对未来做出预测。

然而,在处理时间序列时,还有其他方面的因素在起作用。

难道是静止不动

有没有季节性

目标变量是否自相关

在这篇文章中,我将介绍时间序列的不同特征,以及我们如何对它们建模以获得准确的(尽可能多的)预测。

在 Python 课程的应用时间序列分析中,超越基础并应用高级模型,如 SARIMAX、VARMAX、CNN、LSTM、ResNet、自回归 LSTM!

Predicting the future is hard.

自相关

非正式地说,自相关是观测值之间的相似性,是它们之间的时滞的函数。

Example of an autocorrelation plot

上面是一个自相关图的例子。仔细观察,您会发现第一个值和第 24 个值具有很高的自相关性。同样,第 12 次和第 36 次观察高度相关。这意味着我们会在每 24 个时间单位找到一个非常相似的值。

注意这个图看起来像正弦函数。这是对季节性、的暗示,你可以通过在上面的图中找到时间段来找到它的值,这将给出 24 小时。

季节性

季节性指周期性波动。例如,用电量白天高,晚上低,或者圣诞节期间在线销售增加,然后再次放缓。

Example of seasonality

从上面可以看出,有明显的日季节性。每一天,你都会在傍晚看到一个高峰,而最低点则是每天的开始和结束。

请记住,如果自相关图呈正弦曲线形状,季节性也可以从自相关图中得出。简单地看周期,它给出了季节的长度。

平稳性

平稳性是时间序列的重要特征。如果一个时间序列的统计特性不随时间变化,则称该时间序列是平稳的。换句话说,它有常数均值和方差,协方差与时间无关。

Example of a stationary process

再看同样的图,我们看到上面的过程是静止的。平均值和方差不随时间变化。

通常,股票价格不是一个稳定的过程,因为我们可能会看到一个增长的趋势,或者它的波动性可能会随着时间的推移而增加(意味着方差在变化)。

理想情况下,我们希望有一个平稳的时间序列来建模。当然,并不是所有的都是静止的,但是我们可以做不同的变换使它们静止。

如何测试一个过程是否是稳定的

你可能已经注意到了上述的标题。这是我们用来确定时间序列是否平稳的统计测试。

在不深入 Dickey-Fuller 检验的技术细节的情况下,它检验了单位根存在的零假设。

如果是,那么p>0,过程不是静止的。

否则, p = 0,零假设被拒绝,过程被认为是平稳的。

例如,下面的过程不是静止的。请注意,平均值在整个时间内并不恒定。

Example of a non-stationary process

建模时间序列

为了进行预测,有许多方法可以对时间序列进行建模。在这里,我将介绍:

  • 移动平均数
  • 指数平滑法
  • ARIMA

移动平均数

移动平均模型可能是时间序列建模中最简单的方法。该模型简单地说明了下一个观察值是所有过去观察值的平均值。

虽然简单,但这个模型可能会出奇的好,它代表了一个好的起点。

否则,移动平均线可用于识别数据中有趣的趋势。我们可以定义一个窗口来应用移动平均模型平滑时间序列,并突出显示不同的趋势。

Example of a moving average on a 24h window

在上图中,我们将移动平均模型应用于 24 小时窗口。绿线平滑了时间序列,我们可以看到 24 小时内有两个峰值。

当然,窗口越长,趋势就越平稳。下面是一个小窗口的移动平均线的例子。

Example of a moving average on a 12h window

指数平滑法

指数平滑使用与移动平均类似的逻辑,但是这一次,不同的递减权重被分配给每个观察值。换句话说,随着我们离现在越来越远,观察的重要性就越来越小。

数学上,指数平滑表示为:

Exponential smoothing expression

这里, alpha 是一个平滑因子,取值在 0 和 1 之间。它决定了先前观察的重量减少的速度。

Example of exponential smoothing

从上面的图中,深蓝色线表示使用平滑因子 0.3 对时间序列进行指数平滑,而橙色线使用平滑因子 0.05。

可以看到,平滑因子越小,时间序列就越平滑。这是有意义的,因为当平滑因子接近 0 时,我们就接近移动平均模型。

双指数平滑

当时间序列中存在趋势时,使用双指数平滑。在这种情况下,我们使用这种技术,它只是指数平滑的两次递归使用。

数学上:

Double exponential smoothing expression

这里, beta趋势平滑因子,取 0 到 1 之间的值。

下面,你可以看到αβ的不同值如何影响时间序列的形状。

Example of double exponential smoothing

三指数平滑

该方法通过添加一个季节性平滑因子,扩展了双指数平滑。当然,如果您注意到时间序列中的季节性,这是很有用的。

数学上,三重指数平滑表示为:

Triple exponential smoothing expression

其中 gamma 是季节平滑因子,而 L 是季节长度。

季节性自回归积分移动平均模型

SARIMA 实际上是简单模型的组合,以形成一个复杂的模型,该模型可以模拟具有非平稳属性和季节性的时间序列。

首先,我们有自回归模型 AR(p) 。这基本上是时间序列自身的回归。这里,我们假设当前值依赖于它以前的值,有一些滞后。它采用代表最大滞后的参数 p 。为了找到它,我们查看部分自相关图,并确定大多数滞后不显著之后的滞后。

在下面的示例中, p 将为 4。

Example of a partial autocorrelation plot

然后,我们添加移动平均线模型 MA(q) 。这需要一个参数 q ,该参数代表最大滞后,在该最大滞后之后,其他滞后在自相关图上不显著。

下面, q 会是 4。

Example of an autocorrelation plot

之后,我们加上的积分顺序 I(d) 。参数 d 代表使系列稳定所需的差值数量。

最后,我们添加最后一个组件:季节性 S(P,D,Q,s) ,其中 s 就是季节的长度。此外,该组件需要参数 PQ ,它们与 pq 相同,但用于季节性组件。最后, D 是季节积分的顺序,代表从序列中去除季节性所需的差异数。

综合所有这些,我们得到了 SARIMA(p,D,q)(P,D,Q,s) 模型。

主要要点是:在使用 SARIMA 建模之前,我们必须对时间序列进行转换,以消除季节性和任何非平稳行为。

那是一大堆让我们难以理解的理论!让我们在第一个项目中应用上面讨论的技术。

我们会试着预测一家特定公司的股价。现在,预测股票价格几乎是不可能的。然而,这仍然是一个有趣的练习,也是练习我们所学知识的好方法。

项目 1 —预测股票价格

我们将使用新德国基金(GF)的历史股价来尝试预测未来五个交易日的收盘价。

你可以在这里抓取数据集和笔记本

和往常一样,我强烈推荐你跟着编码!启动你的笔记本,我们走吧!

You will definitely not get rich trying to predict the stock market

导入数据

首先,我们导入一些对我们的分析有帮助的库。此外,我们定义了平均百分比误差(MAPE) ,因为这将是我们的误差度量。

然后,我们导入数据集,对前十个条目进行排序,您应该得到:

First 10 entries of the dataset

正如你所看到的,我们有几个条目是关于一只不同于新德国基金的股票。此外,我们有一个关于当天信息的条目,但我们只想要当天结束时(EOD)的信息。

清理数据

首先,我们删除不需要的条目。

然后,我们删除不需要的列,因为我们只想关注股票的收盘价。

如果预览数据集,您应该会看到:

Clean dataset

厉害!我们准备好进行探索性数据分析了!

探索性数据分析

我们绘制了数据集整个时间段的收盘价。

您应该得到:

Closing price of the New Germany Fund (GF)

很明显,你看到这不是一个平稳的过程,很难判断是否存在某种季节性

移动平均数

让我们使用移动平均线模型来平滑我们的时间序列。为此,我们将使用一个助手函数,该函数将在指定的时间窗口运行移动平均模型,并绘制出结果平滑曲线:

使用 5 天的时间窗,我们得到:

Smoothed curve by the previous trading week

如你所见,我们几乎看不到趋势,因为它太接近实际曲线了。让我们看看上个月和上个季度的平滑结果。

Smoothed by the previous month (30 days)

Smoothed by the previous quarter (90 days)

现在趋势更容易发现了。注意 30 天和 90 天的趋势是如何在最后显示出下降曲线的。这可能意味着股票可能会在接下来的几天下跌。

指数平滑法

现在,让我们使用指数平滑来看看它是否能拾取一个更好的趋势。

这里,我们使用 0.05 和 0.3 作为平滑因子的值。随意尝试其他值,看看结果如何。

Exponential smoothing

正如你所看到的,0.05 的 alpha 值平滑了曲线,同时拾取了大部分向上和向下的趋势。

现在,让我们使用双指数平滑。

双指数平滑

你会得到:

Double exponential smoothing

同样,尝试不同的 alphabeta 组合来获得更好看的曲线。

系统模型化

如前所述,我们必须把我们的系列变成一个平稳的过程,以便对它建模。因此,让我们应用 Dickey-Fuller 检验来看看它是否是一个平稳过程:

您应该看到:

通过 Dickey-Fuller 检验,时间序列无疑是非平稳的。还有,看自相关图,看到很高,似乎没有明显的季节性。

因此,为了去掉高自相关性,并使过程平稳,我们取第一个差(代码块中的第 23 行)。我们简单地从滞后一天的时间序列中减去时间序列,我们得到:

厉害!我们的系列现在是固定的,我们可以开始建模!

萨里玛

现在,对于 SARIMA,我们首先定义一些参数和其他参数的值范围,以生成 P,Q,D,P,Q,D,s 的所有可能组合的列表。

现在,在上面的代码单元中,我们有 625 种不同的组合!我们将尝试每种组合,并用每种组合来训练 SARIMA,以找到最佳表现模式。这可能需要一段时间,具体取决于您计算机的处理能力。

完成后,我们会打印出最佳模型的摘要,您应该会看到:

厉害!我们最终预测未来五个交易日的收盘价,并评估模型的 MAPE。

在这种情况下,我们有 0.79%的 MAPE,这非常好!

将预测价格与实际数据进行比较

现在,为了将我们的预测与实际数据进行比较,我们从雅虎财经获取财务数据,并创建一个数据框架。

然后,我们画一个图,看看我们离实际收盘价有多远:

Comparison of predicted and actual closing prices

看来我们的预测有点偏差。事实上,预测价格基本持平,这意味着我们的模型可能表现不佳。

同样,这不是因为我们的程序,而是因为预测股票价格基本上是不可能的。

从第一个项目中,我们学习了在使用 SARIMA 建模之前使时间序列平稳的整个过程。这是一个漫长而乏味的过程,需要大量的手工调整。

现在,让我们介绍脸书的先知。这是一个 Python 和 r 版本的预测工具。该工具允许专家和非专家以最少的努力做出高质量的预测。

让我们看看如何在第二个项目中使用它!

项目 2 —用 Prophet 预测空气质量

标题说明了一切:我们将使用 Prophet 来帮助我们预测空气质量!

完整的笔记本和数据集可在这里找到。

我们来做一些预测吧!

Prophecy cat!

导入数据

和往常一样,我们从导入一些有用的库开始。然后,我们打印出前五行:

First five entries of the dataset

如您所见,数据集包含不同气体浓度的信息。他们每天每小时都被记录下来。你可以在这里找到所有特征的描述

如果您进一步研究数据集,您会注意到有很多值-200 的实例。当然,负浓度是没有意义的,所以我们需要在建模前清理数据。

因此,我们需要清理数据。

数据清理和特征工程

这里,我们首先解析日期列,将其转换为“日期”。

然后,我们将所有的测量值转换成浮点数。

之后,我们通过取每个测量值的平均值来汇总每天的数据。

在这一点上,我们仍然有一些我们需要摆脱。因此,我们删除超过 8 个 NaN 的列。这样,我们就可以删除包含 NaN 值的行,而不会丢失太多数据。

最后,我们按周汇总数据,因为这将给出一个更平滑的趋势来分析。

我们可以画出每种化学物质的趋势。在这里,我们展示了氮氧化物。

NOx concentration

氮氧化物是非常有害的,因为它们反应形成烟雾和酸雨,并且是细颗粒和地面臭氧形成的原因。这些对健康有不良影响,所以氮氧化物的浓度是空气质量的一个关键特征。

系统模型化

我们将只关注 NOx 浓度的建模。因此,我们删除所有其他不相关的列。

然后,我们进口先知。

Prophet 要求将日期列命名为 ds ,将特性列命名为 y ,因此我们进行了适当的修改。

此时,我们的数据看起来像这样:

然后,我们定义一个训练集。为此,我们将拿出最后 30 个条目进行预测和验证。

之后,我们简单地初始化 Prophet,将模型与数据进行拟合,并进行预测!

您应该看到以下内容:

这里, yhat 代表预测, yhat_loweryhat_upper 分别代表预测的下限和上限。

Prophet 允许您轻松绘制预测图,我们得到:

NOx concentration forecast

可以看到,Prophet 只是简单的用了一条直线向下的线来预测未来 NOx 的浓度。

然后,我们检查时间序列是否有任何有趣的特征,例如季节性:

在这里,Prophet 只确定了一个没有季节性的下降趋势。

通过计算其平均绝对百分比误差(MAPE)和平均绝对误差(MAE)来评估模型的性能,我们看到 MAPE 为 13.86%,MAE 为 109.32,还不算太差!请记住,我们根本没有微调模型。

最后,我们绘制了预测的上限和下限:

Forecast of the average weekly NOx concentration

恭喜你坚持到最后!这是一篇很长但内容丰富的文章。您学习了如何对时间序列进行稳健分析和建模,并在两个不同的项目中应用了您的知识。

我希望这篇文章对你有用,我希望你能回头参考它。

要了解时间序列分析的最新技术,请查看本课程:

干杯!

参考:非常感谢这篇文章对时间序列分析的精彩介绍!

无监督学习完全指南

原文:https://towardsdatascience.com/the-complete-guide-to-unsupervised-learning-ecf8b676f2af?source=collection_archive---------14-----------------------

理解主成分分析(PCA)和聚类方法,并在两个小型项目中实现每个算法

介绍

无监督学习是一组统计工具,用于只有一组特征而没有目标的场景。因此,我们无法做出预测,因为对每个观察结果都没有相关的反应。相反,我们感兴趣的是找到一种有趣的方式来可视化数据,或者发现类似观察的子群。

无监督学习往往更具挑战性,因为分析没有明确的目标,而且往往是主观的。此外,很难评估获得的结果是否良好,因为没有公认的机制来执行交叉验证或验证独立数据集上的结果,因为我们不知道真实的答案。

本指南将重点介绍两种技术:主成分分析聚类。我们将探索每一个是如何在数学上工作的,并且我们将在两个迷你项目中实现它们。

我们开始吧!

对于机器学习、深度学习和人工智能的实践视频教程,请查看我的 YouTube 频道

Unsupervised parties are dangerous!

主成分分析

PCA 是指计算主成分并用于更好地理解数据的过程。PCA 也可以用于可视化。

什么是主成分?

假设您想要可视化一组 p 特征上的 n 观测值,作为探索性数据分析的一部分。我们可以一次检查两个特征的 2D 散点图,但如果有很多预测因素,就会很快失控。

使用 PCA,我们可以找到包含尽可能多的变化的数据集的低维表示。因此,我们只得到最有趣的特征,因为它们是方差的主要来源。

主成分是怎么找到的?

第一个主成分是具有最大方差的特征的归一化线性组合:

First principal component equation

符号φ被称为载荷。负载必须最大化:

这就是全部了!

聚类方法

聚类是指在数据集中查找子组或聚类的一系列技术。这有助于我们将观察结果划分为不同的组,以便每个组包含彼此相似的观察结果。例如,在乳腺癌的情况下,组可以代表肿瘤等级。它在市场细分的营销中也非常有用,以便确定更容易接受某种产品的人群。

聚类方法有很多,但我们将重点介绍 k-means 聚类层次聚类。在 K 均值聚类中,我们希望将数据划分成预先指定数量的 K 个聚类。另一方面,对于层次聚类,我们不知道我们需要多少个聚类。相反,我们想要一个树状图,它允许我们查看每个可能的聚类数所获得的所有聚类。

k 均值聚类

这种方法简单地将观察结果分成 K 个集群。它假设:

1.每个观察值属于 K 个聚类中的至少一个

2.集群不重叠

此外,每个集群内的变化被最小化。

How observations were clustered depending on the number of specified clusters

这是通过最小化一个聚类内每个观察值之间的平方欧几里德距离之和来实现的:

Optimization function for k-mean clustering

为了最小化,我们遵循以下算法:

1.从 1 到 K 之间随机分配一个数字给每个观察值。这些用作观测的初始聚类分配。

2.迭代直到集群分配停止变化:

2.a .对于每个 K 簇,计算簇质心。第簇质心是第簇中观测值的 p 特征均值的向量

2.b .将每个观察值分配给质心最近(最短欧几里得距离)的聚类

请注意,上面的算法将找到一个局部最小值。因此,所获得的结果将取决于初始随机聚类分配。因此,多次运行该算法非常重要。

分层聚类

k-means 聚类的一个潜在缺点是它需要人工输入来指定聚类的数量。另一方面,层次聚类不需要聚类的初始数量。

最常见的层次聚类类型是自底向上聚集聚类。这指的是这样一个事实,即从叶子开始生成一个树状图,并将簇组合到树干。

Examples of dendrograms

算法其实很简单。它首先定义每对观察值之间的不相似性度量,比如欧几里德距离。然后,首先假设每个观察值属于它自己的集群。然后将两个最相似的聚类融合,这样就有了 n-1 个聚类。之后,融合另外两个相似的簇,产生 n-2 簇。该过程反复重复,直到所有的观察结果都是单个聚类的一部分。

虽然简单,但有些事情没有解决。如何定义聚类之间的相异度?这是通过联动的概念实现的。下表总结了四种最常见的链接类型:

The four most common types of linkage

完全连锁、平均连锁和质心连锁是最常见的连锁类型,因为单个连锁往往会产生不平衡的树状图。注意,生成的树状图很大程度上取决于所用的连锁类型。

Effect of linkage on the final dendrogram

此外,选择合适的相异度也很关键。欧几里德距离被广泛讨论,但也有基于相关性的距离。如果两个特征高度相关,则认为它们是相似的,这意味着它们具有相似的轮廓。

Observation 1 and 2 are highly correlated, since they have similar profiles

例如,假设一家在线零售商对基于购物者过去的购物历史对他们进行聚类感兴趣。目标是识别相似购物者的子群,这样他们就可以看到可能引起他们兴趣的广告。使用欧几里德距离,那么总体上很少购买商品的购物者将被聚集在一起,这可能不是理想的。另一方面,使用基于相关性的距离,具有类似偏好(他们购买了商品 A 和 B,但没有购买商品 C 和 D)的购物者将被聚集在一起,即使他们购买了不同数量的商品。

然而,在所有情况下,一旦层次聚类完成,我们仍然需要人工输入来确定要使用的最终聚类数。

现在您已经了解了 PCA 和聚类方法的工作原理,让我们在一个小型项目环境中实现它们。

项目

这个项目将被分为两个迷你项目。在第一个例子中,我们将使用 k-means 聚类对图像执行颜色量化

然后,在第二个迷你项目中,我们将使用主成分分析来降低数据集的维度,允许我们用 2D 图来可视化它。

在这里你可以得到你需要的一切。

旋转你的 Jupyter 笔记本,我们走吧!

初始设置

在开始任何实现之前,我们将导入一些在以后会变得方便的库:

与之前的教程不同,我们不会导入数据集。相反,我们将使用由 scikit-learn 库提供的数据。

迷你项目 1 —使用 k 均值聚类的颜色量化

快速,颜色量化是一种技术,以减少在图像中使用的不同颜色的数量。这对于在保持图像完整性的同时压缩图像尤其有用。

首先,我们导入以下库:

注意,我们导入了一个名为 load_sample_image 的样本数据集。这仅仅包含两个图像。我们将使用其中一个来执行颜色量化。

因此,让我们展示一下我们将在本练习中使用的图像:

您应该会看到:

Original image

现在,对于颜色量化,必须遵循不同的步骤。

首先,我们需要将图像转换成 2D 矩阵进行处理:

然后,我们训练我们的模型来聚合颜色,以便在图像中有 64 种不同的颜色:

然后,我们构建一个辅助函数来帮助我们用指定颜色的数量重建图像:

最后,我们现在可以看到只有 64 种颜色的图像,以及它与原始图像的对比:

Original image with 96 615 colors

Reconstructed image with 64 colors

当然,我们可以看到一些差异,但总体而言,图像的完整性是守恒的!一定要探索不同数量的集群!例如,如果指定 10 种颜色,将会得到以下结果:

Reconstructed image with 10 colors

迷你项目 2 —使用主成分分析进行降维

在本练习中,我们将使用主成分分析来降低数据集的维度,以便我们可以轻松地将其可视化。

因此,让我们从 scikit-learn 导入虹膜数据集:

现在,我们将计算前两个主成分,并查看每个主成分可以解释的方差比例:

从上面的代码块中,您应该看到第一个主成分包含 92%的方差,而第二个主成分占 5%的方差。因此,这意味着仅两个特征就足以解释数据集中 97%的方差!

现在,我们可以利用它轻松绘制二维数据:

你会得到:

正如你所看到的,主成分分析有助于减少数据集的维数,允许我们绘制它,并可视化每个类别是如何分开的。

就是这样!您现在了解了最流行的无监督学习技术是如何工作的,以及如何实现它们。

再次请记住,无监督学习是困难的,因为没有错误度量来评估算法的表现如何。此外,在进行监督学习之前,这些技术通常用于探索性数据分析。

我希望这篇文章对你有用,并能找到你的书签!

继续努力!

这些练习是在 scikit-learn 网站上提供的示例。我只是试图用更多的细节来解释它们。

完整的动手机器学习速成班

原文:https://towardsdatascience.com/the-complete-hands-on-machine-learning-crash-course-59e43c8cee52?source=collection_archive---------7-----------------------

从线性回归到无监督学习,本指南涵盖了你开始学习机器所需要知道的一切。每个主题都包括理论和实践练习!

目录

  1. 线性回归—理论
  2. 线性回归—练习
  3. 逻辑回归—理论
  4. 线性判别分析(LDA) —理论
  5. 二次判别分析(QDA)—理论
  6. 逻辑回归、LDA 和 QDA —实践
  7. 重采样—理论
  8. 正则化理论
  9. 重采样和正则化—练习
  10. 决策树—理论
  11. 决策树—实践
  12. 支持向量机(SVM)—理论
  13. 支持向量机(SVM) —实践
  14. 无监督学习——理论
  15. 无监督学习—实践
  16. 时间序列分析—理论
  17. 时间序列分析—练习
  18. 来源

关于机器学习、深度学习和人工智能的实践视频教程,请查看我的 YouTube 频道

线性回归理论

线性回归可能是统计学习最简单的方法。对于更高级的方法来说,这是一个很好的起点,事实上,许多新奇的统计学习技术可以被视为线性回归的扩展。因此,在进入更复杂的方法之前,理解这个简单的模型将建立一个良好的基础。

线性回归很好地回答了以下问题:

  • 两个变量之间有关系吗?
  • 关系有多牢固?
  • 哪个变量的贡献最大?
  • 我们能多精确地估计每个变量的影响?
  • 我们能多精确地预测目标?
  • 关系是线性的吗?(咄)
  • 有交互作用吗?

估计系数

假设我们只有一个变量和一个目标。然后,线性回归表示为:

Equation for a linear model with 1 variable and 1 target

在上式中,β是系数。这些系数是我们用模型进行预测所需要的。

那么我们如何找到这些参数呢?

为了找到参数,我们需要最小化最小平方误差平方和。当然,线性模型并不完美,它不会准确预测所有数据,这意味着实际值和预测值之间存在差异。误差很容易通过下式计算:

Subtract the prediction from the true value

但是为什么误差是平方的呢?

我们平方误差,因为预测可以高于或低于真实值,分别导致负的或正的差异。如果我们不对误差进行平方,误差的总和可能会因为负差异而减少,而不是因为模型非常适合。

此外,平方误差不利于较大的差异,因此最小化平方误差“保证”更好的模型。

让我们来看一个图表,以便更好地理解。

Linear fit to a data set

在上图中,红点是真实数据,蓝线是线性模型。灰色线条表示预测值和真实值之间的误差。因此,蓝线是使灰线的平方长度之和最小的线。

经过一些对本文来说过于繁琐的数学计算后,您最终可以用下面的等式来估计系数:

其中 x 条y 条代表平均值。

估计系数的相关性

现在你有了系数,你如何知道它们是否与预测你的目标相关?

最好的方法是找到 p 值。**p 值用于量化统计显著性;它允许判断是否要拒绝零假设。

无效假设?

对于任何建模任务,假设在特征和目标之间存在某种相关性。因此,零假设是相反的:在特征和目标之间没有相关性

因此,找到每个系数的 p 值将会知道该变量对于预测目标是否具有统计显著性。根据一般经验,如果 p 值小于0.05:变量和目标之间有很强的关系。

评估模型的准确性

通过找到变量的 p 值,您发现您的变量具有统计显著性。太好了!

现在,你怎么知道你的线性模型是好的呢?

为了进行评估,我们通常使用 RSE(剩余标准误差)和 R 统计量。

RSE formula

R² formula

第一个误差指标很容易理解:残差越低,模型就越符合数据(在这种情况下,数据越接近线性关系)。

至于 R 度量,它测量目标中可以用特征 X 解释的可变性比例。所以假设线性关系,如果特征 X 能解释(预测)目标,那么比例高,R 值会接近 1。如果相反,R 值则更接近于 0。

多元线性回归理论

在现实生活中,永远不会有单一的特征来预测目标。那么,我们一次对一个特征进行线性回归吗?当然不是。我们简单地执行多元线性回归。

该方程非常类似于简单的线性回归;简单地将预测值的数量和它们相应的系数相加:

Multiple linear regression equation. p is the number of predictors

评估预测值的相关性

以前,在简单的线性回归中,我们通过寻找特征的 p 值来评估特征的相关性。

在多元线性回归的情况下,我们使用另一个指标:F 统计量。

F-statistic formula. n is the number of data points and p is the number of predictors

在这里,F 统计量是为整个模型计算的,而 p 值是特定于每个预测值的。如果有强关系,那么 F 会远大于 1。否则,它将近似等于 1。

如何使大于 比 1 足够大?

这个很难回答。通常,如果有大量的数据点,F 可能略大于 1,表明有很强的关系。对于小数据集,F 值必须远大于 1,以表明强相关关系。

为什么我们不能在这种情况下使用 p 值

由于我们正在拟合许多预测值,因此我们需要考虑有许多特征的情况( p 很大)。对于非常大量的预测值,总会有大约 5%的预测值偶然具有非常小的 p 值 甚至 ,尽管它们在统计上不显著。因此,我们使用 F 统计量来避免将不重要的预测因子视为重要的预测因子。

评估模型的准确性

就像简单的线性回归一样,R 可以用于多元线性回归。但是,要知道添加更多的预测值总是会增加 R 值,因为模型必然会更好地拟合训练数据。

然而,这并不意味着它将在测试数据上表现良好(对未知数据点进行预测)。

添加交互

一个线性模型中有多个预测因子意味着一些预测因子可能会对其他预测因子产生影响。

例如,你想预测一个人的工资,知道她的年龄和上学的年数。当然,一个人越老,他在学校度过的时间就越多。那么我们如何对这种互动效应建模呢?

考虑这个非常简单的例子,有两个预测值:

Interaction effect in multiple linear regression

如你所见,我们简单地将两个预测因子相乘,并关联一个新的系数。简化公式,我们现在看到系数受另一个特征的值的影响。

一般来说,如果我们包括交互模型,我们应该包括特征的个体效应,即使它的 p 值不显著。这就是所谓的等级原则。这背后的基本原理是,如果两个预测者相互作用,那么包括他们各自的贡献将对模型产生很小的影响。

线性回归—实践

好吧!现在我们知道了它是如何工作的,让我们让它工作吧!我们将通过 Python 中的简单和多元线性回归来工作,我将展示如何在这两种情况下评估参数和整体模型的质量。

你可以在这里获取代码和数据。

我强烈建议您在自己的 Jupyter 笔记本中遵循并重新创建这些步骤,以充分利用本教程。

数据集包含关于花费在广告上的钱及其产生的销售额的信息。钱花在了电视、广播和报纸广告上。

目标是使用线性回归来了解广告支出如何影响销售。

导入库

使用 Python 的优势在于,我们可以访问许多库,这些库允许我们快速读取数据、绘制数据并执行线性回归。

我喜欢在笔记本顶部导入所有必要的库,以保持一切井然有序。导入以下内容:

import pandas as pd
import numpy as npimport matplotlib.pyplot as pltfrom sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_scoreimport statsmodels.api as sm

读取数据

假设您下载了数据集,将它放在项目文件夹内的一个data目录中。然后,像这样读取数据:

data = pd.read_csv("data/Advertising.csv")

为了查看数据的样子,我们执行以下操作:

data.head()

你应该看看这个:

如您所见,列Unnamed: 0是多余的。因此,我们删除它。

data.drop(['Unnamed: 0'], axis=1)

好了,我们的数据是干净的,可以进行线性回归了!

简单线性回归

对于简单线性回归,我们只考虑电视广告对销售的影响。在开始建模之前,让我们看一下数据是什么样子的。

我们使用matplotlib,一个流行的 Python 绘图库来制作散点图。

plt.figure(figsize=(16, 8))
plt.scatter(
    data['TV'],
    data['sales'],
    c='black'
)
plt.xlabel("Money spent on TV ads ($)")
plt.ylabel("Sales ($)")
plt.show()

运行这个代码单元,您应该会看到这个图形:

Scatter plot of money spent on TV ads and sales

正如你所看到的,在电视广告上的花费和销售额之间有着明显的关系。

让我们看看如何生成该数据的线性近似值。

X = data['TV'].values.reshape(-1,1)
y = data['sales'].values.reshape(-1,1)reg = LinearRegression()
reg.fit(X, y)print("The linear model is: Y = {:.5} + {:.5}X".format(reg.intercept_[0], reg.coef_[0][0]))

就这样?

是啊!对数据集拟合一条直线并查看方程的参数就是这么简单。在这种情况下,我们有

Simple linear regression equation

让我们想象一下这条线是如何拟合数据的。

predictions = reg.predict(X)plt.figure(figsize=(16, 8))
plt.scatter(
    data['TV'],
    data['sales'],
    c='black'
)
plt.plot(
    data['TV'],
    predictions,
    c='blue',
    linewidth=2
)
plt.xlabel("Money spent on TV ads ($)")
plt.ylabel("Sales ($)")
plt.show()

现在,你看:

Linear fit

从上图来看,似乎一个简单的线性回归可以解释电视广告支出和销售额的总体影响。

评估模型的相关性

现在,如果你还记得这篇文章,为了看看这个模型是否好,我们需要看看每个系数的 R 值和 p 值

我们是这样做的:

X = data['TV']
y = data['sales']X2 = sm.add_constant(X)
est = sm.OLS(y, X2)
est2 = est.fit()
print(est2.summary())

这给了你这个可爱的输出:

R² and p-value

查看这两个系数,我们有一个非常低的 p 值(尽管它可能不完全是 0)。这意味着这些系数和目标(销售额)之间有很强的相关性。

然后,看 R 值,我们有 0.612。因此,大约 60%的销售变化可以用花在电视广告上的金额来解释。这没问题,但肯定不是我们能准确预测销售的最好方法。当然,在报纸和广播广告上的花费肯定会对销售产生一定的影响。

让我们看看多元线性回归是否会表现得更好。

多元线性回归

就像简单的线性回归一样,我们将定义我们的特性和目标变量,并使用 scikit-learn 库来执行线性回归。

Xs = data.drop(['sales', 'Unnamed: 0'], axis=1)
y = data['sales'].reshape(-1,1)reg = LinearRegression()
reg.fit(Xs, y)print("The linear model is: Y = {:.5} + {:.5}*TV + {:.5}*radio + {:.5}*newspaper".format(reg.intercept_[0], reg.coef_[0][0], reg.coef_[0][1], reg.coef_[0][2]))

仅此而已!从这个代码单元,我们得到下面的等式:

Multiple linear regression equation

当然,我们无法想象所有三种媒体对销售的影响,因为它总共有四个维度。

请注意,报纸的系数是负的,但也相当小。与我们的模型相关吗?让我们通过计算每个系数的 F 统计量、R 值和 p 值来看看。

评估模型的相关性

正如您所料,这里的过程与我们在简单线性回归中所做的非常相似。

X = np.column_stack((data['TV'], data['radio'], data['newspaper']))
y = data['sales']X2 = sm.add_constant(X)
est = sm.OLS(y, X2)
est2 = est.fit()
print(est2.summary())

您会得到以下结果:

R², p-value and F-statistic

可以看到,R 远高于简单线性回归的 R,其值为 0.897

此外,F 统计值为 570.3 。这比 1 大得多,而且由于我们的数据集相当小(只有 200 个数据点),它表明广告支出和销售之间有很强的关系。

最后,因为我们只有三个预测值,所以我们可以考虑它们的 p 值来确定它们是否与模型相关。当然,你会注意到第三个系数(报纸的系数)有一个很大的 p 值。因此,报纸上的广告支出在统计上并不显著。移除那个预测因子会稍微降低 R 值,但我们可能会做出更好的预测。

逻辑回归理论

回归与分类问题

之前,我们看到线性回归假设响应变量是定量的。然而,在许多情况下,反应实际上是定性的,就像眼睛的颜色。这种类型的反应被称为绝对的。

分类是预测定性反应的过程。用于分类的方法通常预测定性变量的每个类别的概率,作为进行分类的基础。在某种程度上,它们的行为类似于回归方法。

通过分类,我们可以回答如下问题:

  • 一个人有一系列症状,这些症状可以归因于三种医学状况中的一种。哪一个?
  • 一笔交易是不是欺诈?

分类回答通常用词来表达。当然,我们不能用文字作为传统统计方法的输入数据。当我们实现算法的时候,我们会看到如何处理这个问题。

现在,让我们看看逻辑回归是如何工作的。

逻辑回归

当涉及到分类时,我们要确定一个观察值是否属于某一类的概率。因此,我们希望用 0 到 1 之间的值来表示概率。

接近 1 的概率意味着观测结果很可能属于那一类。

为了生成介于 0 和 1 之间的值,我们使用以下等式来表示概率:

Sigmoid function

上面的等式被定义为 sigmoid 函数。

画出这个方程,你会发现这个方程总是产生一个介于 0 和 1 之间的 S 形曲线。

Logistic regression curve

对上面的等式进行一些操作后,您会发现:

在两侧取圆木

上面的等式被称为 logit 。可以看到,在 X 中是线性的。这里,如果系数是正的,那么 X 的增加将导致更高的概率。

估计系数

与线性回归一样,我们需要一种方法来估计系数。为此,我们最大化似然函数:

Likelihood function

这里的直觉是,我们希望系数使得预测的概率(在上面的等式中用撇号表示)尽可能接近观察到的状态。

与线性回归类似,我们使用 p 值来确定是否拒绝零假设。

Z 统计数据也被广泛使用。大的绝对 Z 统计量意味着零假设被拒绝。

请记住,零假设声明:特征和目标之间没有相关性。

多元逻辑回归

当然,逻辑回归可以很容易地扩展到容纳一个以上的预测因子:

Multiple logistic regression

请注意,使用多元逻辑回归可能会给出更好的结果,因为它可以考虑预测因素之间的相关性,这种现象被称为混杂。此外,很少仅有一个预测器就足以建立准确的预测模型。

线性判别分析(LDA) —理论

现在,我们明白了逻辑回归是如何工作的,但是像任何模型一样,它也存在一些缺陷:

  • 当类被很好地分开时,从逻辑回归估计的参数往往是不稳定的
  • 当数据集很小时,逻辑回归也是不稳定的
  • 最好不要预测两个以上的类

这就是线性判别分析(LDA)派上用场的地方。它比逻辑回归更稳定,广泛用于预测两个以上的类别。

LDA 的特殊性在于,它分别对每个响应类别中预测值的分布进行建模,然后使用贝叶斯定理来估计概率。

好吧,这有点难以理解。我们来分解一下。

贝叶斯分类定理

(抱歉,Medium 不支持数学方程。我尽了最大努力,尽可能的明确)。

假设我们想要将一个观察结果分类到 K 类中的一个,其中 K 大于或等于 2。然后,让 pi-k 成为一个观察值关联到第类的总概率。然后,让 f_k(X) 表示 X 的密度函数,用于来自第 k 个类的观察。这意味着如果来自第 k 个类的观测值具有 X = x 的概率,那么 f_k(X) 是大的。然后,贝叶斯定理陈述:

Bayes’ theorem for classification

上面的等式可以简单地缩写为:

Abbreviated Bayes’ theorem for classification

希望这有一定的意义!

这里的挑战是估计密度函数。理论上,贝叶斯的分类错误率最低。因此,我们的分类器需要估计密度函数,以逼近贝叶斯分类器。

一个预测器的 LDA

假设我们只有一个预测值,并且密度函数是正态的。然后,您可以将密度函数表示为:

Normal distribution function

现在,我们要指定一个观察值 X = x ,对于该观察值 P_k(X) 最大。如果你在 P_k(X) 中插入密度函数,取对数,你会发现你希望最大化:

Discriminant equation

上面的等式称为判别式。如你所见,这是一个线性方程。因此得名:线性判别分析

现在,假设只有两个具有相等分布的类,您会发现:

Boundary equation

这是边界方程。下图显示了图示。

Boundary line to separate 2 classes using LDA

当然,这代表了一种理想的解决方案。事实上,我们无法精确计算边界线。

因此,LDA 利用以下近似:

  • 对于所有训练观察的平均值

Average of all training observations

  • 对于每类样本方差的加权平均值

Weighted average of sample variances for each class

其中 n 是观察次数。

重要的是要知道,LDA 为每个类别假设了一个正态分布,一个特定类别均值,以及一个共同方差

多个预测值的 LDA

现在扩展到多个预测值,我们必须假设 X 来自多元高斯分布,具有特定类别的均值向量和公共协方差矩阵。

相关和不相关高斯分布的示例如下所示。

Left: Uncorrelated normal distribution. Right: correlated normal distribution

现在,用向量符号表示判别方程,我们得到:

Discriminant equation with matrix notation

如你所见,等式保持不变。只是这一次,我们使用向量符号来容纳许多预测值。

如何评估模型的性能

对于分类,有时使用准确性来评估模型的性能是不相关的。

考虑分析一个高度不平衡的数据集。例如,您试图确定一项交易是否是欺诈性的,但您的数据集只有 0.5%包含欺诈性交易。然后,您可以预测没有任何交易是欺诈性的,并有 99.5%的准确率得分!当然,这是一种非常幼稚的方法,无助于检测欺诈交易。

那么我们用什么呢?

通常,我们用灵敏度特异性

灵敏度是真正的阳性率:被正确识别的实际阳性的比例。

特异性是真阴性率:实际阴性被正确识别的比例。

让我们给出一些背景来更好地理解。使用欺诈检测问题,敏感度是被识别为欺诈的欺诈交易的比例。特异性是被识别为非欺诈的非欺诈交易的比例。

因此,在理想情况下,我们需要高灵敏度和高特异性,尽管这可能会因环境而异。例如,银行可能希望优先考虑较高的敏感性而不是特异性,以确保识别欺诈性交易。

ROC 曲线(接收器工作特性)可以很好地显示上述两种误差指标。分类器的总体性能由 ROC 曲线下的面积给出( AUC )。理想情况下,它应该紧挨着图形的左上角,并且面积接近 1。

Example of a ROC curve. The straight line is a base model

二次判别分析(QDA)——理论

这里,我们保持与 LDA 相同的假设,但是现在,来自第类的每个观察值都有自己的协方差矩阵。

对于 QDA,判别式表示为:

Discriminant equation for QDA

毫无疑问,你会注意到这个方程现在是二次方程了。

但是,为什么选择 QDA 而不是 LDA?

对于大型数据集,QDA 是更好的选择,因为它倾向于具有更低的偏差和更高的方差。

另一方面,LDA 更适合于较小的数据集,它有较高的偏倚和较低的方差。

逻辑回归、线性判别分析和 QDA——实践

太好了!既然我们已经深刻理解了逻辑回归、LDA 和 QDA 的工作原理,让我们应用每种算法来解决一个分类问题。

动机

蘑菇味道好极了!但是,仅在北美就有超过 10 000 种蘑菇,我们怎么知道哪些是可以食用的呢?

这是这个项目的目标。我们将构建一个分类器来确定某种蘑菇是可食用的还是有毒的。

我建议你拿起数据集跟着做。如果你被卡住了,请随时查阅完整笔记本

我们开始吧!

探索性数据分析

我们将使用的数据集包含 8124 个蘑菇实例,有 22 个特征。其中,我们发现了蘑菇的帽形、帽色、鳃色、面纱类型等。当然,它也告诉我们蘑菇是可食用的还是有毒的。

让我们导入一些库,它们将帮助我们导入数据并操作它。在您的笔记本中,运行以下代码:

数据科学项目通常的第一步是执行探索性数据分析 (EDA)。这一步通常包括了解更多关于您正在处理的数据的信息。您可能想知道数据集的形状(有多少行和列)、空值的数量,并可视化部分数据以更好地理解特征和目标之间的相关性。

导入数据并查看前五列,代码如下:

将数据集放在项目目录下的数据文件夹中总是好的。此外,我们将文件路径存储在一个变量中,这样,如果路径发生变化,我们只需更改变量赋值。

运行此代码单元后,您应该会看到前五行。您会注意到每个特性都是分类的,并且用一个字母来定义某个值。当然,分类器不能接受字母作为输入,所以我们最终必须改变它。

现在,让我们看看我们的数据集是否不平衡。一个不平衡的数据集是指一个类比另一个类出现得多。理想情况下,在分类的上下文中,我们希望每个类的实例数量相等。否则,我们将需要实现先进的采样方法,如少数过采样。

在我们的例子中,我们想看看数据集中有毒和可食用蘑菇的数量是否相等。我们可以像这样画出每一类的频率:

你会得到下面的图表:

厉害!这看起来像是一个相当平衡的数据集,有毒和可食用蘑菇的数量几乎相等。

现在,我想看看每个特征如何影响目标。为了做到这一点,对于每个特性,我绘制了一个由蘑菇类分隔的所有可能值的条形图。为所有 22 个特性手动执行没有意义,因此我们构建了这个帮助器函数:

色调会给有毒和可食用类一个颜色代码。数据参数将包含除蘑菇类之外的所有特征。运行下面的单元代码:

您应该会得到一个包含 22 个地块的列表。下面是一个输出示例:

花些时间浏览所有的情节。

现在,让我们看看是否有丢失的值。运行这段代码:

您应该看到每一列都有缺失值的数量。幸运的是,我们有一个没有缺失值的数据集。这很不常见,但我们不会抱怨。

为建模做准备

现在我们已经熟悉了数据,是时候为建模做准备了。如前所述,特性用字母来表示不同的可能值,但是我们需要将它们转换成数字。

为此,我们将使用标签编码一键编码。

让我们首先在目标列上使用标签编码。运行以下代码:

您会注意到现在该列包含 1 和 0。

Result of label encoding the ‘class’ column

现在,有毒的用 1 表示,可食用的用 0 表示。现在,我们可以把我们的分类器想成“有毒与否”。毒蘑菇得 1(真),食用菌得 0(假)。

因此,标签编码会将分类特征转化为数字特征。但是,当有两个以上的可能值时,不建议使用标签编码。

为什么?

因为它会将每个值赋给 0、1 或 2。这是一个问题,因为“2”可能被认为是更重要的,并且可能由此得出错误的相关性。

为了避免这个问题,我们在其他特性上使用一键编码。为了理解它的作用,让我们考虑一下第一个入口点的帽形。你可以看到它的值为“x ”,代表凸帽形状。然而,在数据集中总共记录了六种不同的帽形状。如果我们对特征进行一次性编码,我们应该得到:

One-hot encoding the “cap-shape” feature

如您所见,帽子形状现在是一个矢量。1 表示数据集中条目的实际帽形状值,其余部分用 0 填充。同样,你可以认为 1 代表,0 代表假。**

一键编码的缺点是它向数据集引入了更多的列。在帽形的情况下,我们从一列到六列。对于非常大的数据集,这可能是一个问题,但是在我们的例子中,额外的列应该是可以管理的。

让我们继续对其余的功能进行一次性编码:

现在您应该可以看到:

One-hot encoded data set

你注意到我们从 23 列增加到 118 列。这是五倍的增长,但这个数字还不足以导致计算机内存问题。

既然我们的数据集只包含数字数据,我们就可以开始建模和预测了!

训练/测试分割

在深入建模和进行预测之前,我们需要将数据集分成训练集和测试集。这样,我们可以在训练集上训练算法,并在测试集上进行预测。这种方式的误差度量将更加相关,因为该算法将对以前没有见过的数据进行预测。

我们可以像这样轻松地分割数据集:

在这里, y 仅仅是目标(有毒或可食用)。那么, X 就是简单的数据集的所有特征。最后,我们使用 train_test_split 函数。 test_size 参数对应于将用于测试的数据集部分。通常,我们使用 20%。然后, random_state 参数用于再现性。它可以设置为任何数字,但它将确保每次代码运行时,数据集将被相同地分割。如果没有提供 random_state ,那么训练集和测试集将会不同,因为函数会随机分割它。

好了,我们正式准备好开始建模和预测了!

逻辑回归

我们将首先使用逻辑回归。在接下来的步骤中,我们将使用 ROC 曲线下的面积和混淆矩阵作为误差度量。

让我们先导入我们需要的所有内容:

然后,我们创建一个 LogisticRegression 对象的实例,并使模型适合训练集:

然后,我们预测蘑菇有毒的概率。记住,我们认为蘑菇有毒或无毒。

此外,必须提醒您,逻辑回归会返回一个概率。现在,让我们将阈值设置为 0.5,这样,如果概率大于 0.5,蘑菇将被分类为有毒。当然,如果概率小于阈值,蘑菇被分类为可食用。

这正是下面代码单元格中发生的情况:

注意,我们是在测试集上计算概率的。

现在,让我们看看混淆矩阵。这将显示真实阳性率、真实阴性率、假阳性率和假阴性率。

Example of a confusion matrix

我们像这样输出我们的混淆矩阵:

您应该得到:

太神奇了!我们的分类器是完美的!从上面的混淆矩阵中,你可以看到我们的假阳性和假阴性率是 0,这意味着所有的蘑菇都被正确地分类为有毒或可食用!

让我们打印 ROC 曲线下的面积。如你所知,对于一个完美的分类器,它应该等于 1。

的确,上面的代码块输出 1!我们可以制作自己的函数来可视化 ROC 曲线:

您应该会看到:

ROC curve

恭喜你!你用一个基本的逻辑回归模型建立了一个完美的分类器。

然而,为了获得更多的经验,让我们使用 ld a 和 QDA 建立一个分类器,看看我们是否得到类似的结果。

LDA 分类器

遵循逻辑回归概述的相同步骤:

如果您运行上面的代码,您应该看到我们再次获得了一个完美的分类器,其结果与使用逻辑回归的分类器相同。

QDA 分类器

现在,我们重复这个过程,但是使用 QDA:

同样,结果是一样的!

重采样—理论

重采样和正则化是两个重要的步骤,可以显著提高模型的性能和对模型的信心。

在本文中,交叉验证将被广泛讨论,因为它是最流行的重采样方法。然后,将介绍岭回归和 lasso 作为线性模型的正则化方法。之后,将在项目设置中应用重采样和正则化。

我希望这篇文章能作为你未来某个项目的参考,并能成为你的书签。

我们开始吧!

重采样的重要性

重采样方法是现代统计学中不可缺少的工具。它们涉及重复地从训练集中抽取样本,并在每个样本上重新拟合感兴趣的模型,以便获得关于拟合模型的附加信息。这使我们能够获得更多的信息,而这些信息是仅拟合一次模型所无法获得的。

通常,数据科学项目的目标是使用训练数据创建模型,并让它对新数据进行预测。因此,重采样方法允许我们在不收集新数据的情况下,观察模型在未经训练的数据上的表现。

交叉验证

交叉验证( CV )用于估计与模型相关的测试误差,以评估其性能或选择适当的灵活性水平。评估一个模型的性能通常被定义为模型评估,而模型选择用于选择灵活性的级别。这个术语广泛用于数据科学领域。

现在,有不同的方法来执行交叉验证。让我们逐一探索。

验证集方法

这是最基本的方法。它只是简单地将数据集随机分成两部分:一个训练集和一个验证集保留集。该模型适合训练集,并且该适合的模型用于对验证集进行预测。

Validation set schematic

上面是验证集方法的示意图。在一个数据集中有 n 个观察值,它被随机分成两部分。蓝色一侧代表训练集,橙色一侧是验证集。数字只是代表行数。

当然,这种简单的方法也有一些缺点。

首先,验证测试错误率是高度可变的,这取决于训练和验证集中的观察值。

第二,只有一小部分观察值用于拟合模型。然而,我们知道统计方法在数据较少的情况下往往表现较差。

MSE for the validation set approach

在上面的左侧,您可以看到验证集方法仅应用一次时的 MSE。在右边,这个过程重复了 10 次。如你所见,MSE 变化很大。

这显示了使用验证集方法时 MSE 的显著可变性。

当然,有一些方法可以解决这些缺点。

留一交叉验证

留一交叉验证( LOOCV )是比验证集方法更好的选择。不是将数据集分成两个子集,而是只使用一个观察值进行验证,其余的用于拟合模型。

LOOCV schematic

以上是 LOOCV 的示意图。如您所见,只有一个观察用于验证,其余的用于训练。然后,该过程重复多次。

多次运行后,误差估计为:

LOOCV estimated error

这仅仅是每次运行的误差的平均值。

这种方法要好得多,因为它的偏差要小得多,因为更多的观察数据被用来拟合模型。在训练/验证集分割中没有随机性。因此,我们降低了 MSE 的可变性,如下所示。

MSE of LOOCV

k 倍交叉验证

这种方法包括将一组观察值随机分成大约相等大小的 k 组或折叠。第一个折叠被视为验证集,模型适合其余的折叠。然后重复该过程 k 次,其中不同的组被视为验证集。

k-fold cross-validation schematic

因此,你意识到 LOOCV 是一个特殊的 k 重交叉验证案例,其中 k 等于观察总数 n(T21)。但是,通常将 k 设置为等于 5 或 10。

尽管 LOOCV 对于大型数据集来说是计算密集型的,但是 k-fold 更通用,可以用于任何模型。此外,它通常比 LOOCV 给出更准确的测试误差估计。因此,要评估和验证您的模型,k 倍交叉验证方法是最佳选择。

既然我们知道了交叉验证是如何工作的,以及它如何提高我们对模型性能的信心,那么让我们看看如何通过正则化来改进模型本身。

正则化理论

正则化方法有效地防止了过度拟合。当模型在训练集上表现良好,但在验证集上表现不佳时,就会发生过度拟合。

我们已经看到,线性模型,如线性回归和推而广之的逻辑回归,使用最小二乘法来估计参数。

现在,我们探索如何通过用其他拟合过程代替最小二乘拟合来改进线性模型。这些方法将产生更好的预测精度和模型可解释性。

但是为什么呢?为什么要用其他拟合方式?

最小二乘拟合在大多数情况下是可行的,但也有失败的情况。

例如,如果您的观察值数量 n 大于预测值数量 p ,那么最小二乘估计将具有较低的方差,并且表现良好。另一方面,当 p 大于 n (预测值多于观测值)时,方差为无穷大,该方法无法使用!

此外,多元线性回归往往会增加与响应实际不相关的变量。这给模型增加了不必要的复杂性。如果有一种方法可以自动执行特征选择,比如只包含最相关的变量,那就太好了。

为了实现这一点,我们引入了岭回归套索。这是两种常见的正则化方法,也称为收缩方法

收缩方法

将估计的系数向 0 收缩可以显著提高拟合度并减少系数的方差。在这里,我们探讨岭回归套索

里脊回归

传统的线性拟合涉及最小化 RSS(残差平方和)。在岭回归中,添加了一个新参数,现在参数将最小化:

其中λ调谐参数。使用交叉验证找到该参数,因为它必须最小化测试误差。因此,λ的范围用于拟合模型,并且使测试误差最小化的λ是最佳值。

这里,岭回归将包括模型中所有的 p 预测值。因此,这是一种提高模型拟合度的好方法,但它不会执行变量选择。

套索

与岭回归类似,套索将最小化:

注意,我们使用参数β的绝对值,而不是它的平方值。此外,还存在相同的调谐参数。

然而,如果λ足够大,一些系数将有效地为 0!因此,lasso 还可以执行变量选择,使模型更容易解释。

重采样和正则化-实践

我们知道正则化和重采样是如何工作的。现在,让我们在项目设置中应用这些技术。

打开 Jupyter 笔记本,获取数据集。如果你遇到困难,也可以使用解决方案笔记本

导入库

像任何项目一样,我们导入常用的库来帮助我们执行基本的数据操作和绘图。

现在,我们可以开始探索性的数据分析了。

探索性数据分析

我们从导入数据集开始,查看前五行:

您应该看到:

注意未命名:0* 列是无用的。让我们把它拿出来。*

现在,我们的数据集看起来像这样:

如你所见,我们只有三种广告媒体,而销售额是我们的目标变量。

让我们通过绘制散点图来看看每个变量是如何影响销售的。首先,我们构建一个辅助函数来绘制散点图:

现在,我们可以为每个特征生成三个不同的图。

您会得到以下结果:

Sales with respect to money spend on TV ads

Sales with respect to money spent on radio ads

Sales with respect to money spent on newspaper ads

正如你所看到的,电视和广播广告似乎是销售的良好预测工具,而销售和报纸广告之间似乎没有相关性。

幸运的是,我们的数据集不需要进一步处理,所以我们准备好马上开始建模了!

多元线性回归—最小二乘拟合

在浏览之前,让我们先看看代码是什么样子的。

首先,我们导入 LinearRegressioncross_val_score 对象。第一个对象将允许我们拟合一个线性模型,而第二个对象将执行 k-fold 交叉验证。

然后,我们定义我们的特征和目标变量。

cross_val_score 将为每个交叉验证步骤返回一个 MSE 数组。在我们的例子中,我们有五个。所以我们取 MSE 的平均值,打印出来。您应该得到-3.0729 的负 MSE。

现在,我们来看看岭回归和套索哪个会更好。

里脊回归

对于岭回归,我们引入 GridSearchCV 。这将允许我们使用一系列不同的正则化参数自动执行 5 重交叉验证,以便找到α的最佳值。

代码如下所示:

然后,我们可以通过以下公式找到最佳参数和最佳 MSE:

您应该看到 alpha 的最佳值是 20,MSE 为负-3.07267。这是对基本多元线性回归的一点改进。

套索

对于 lasso,我们遵循与岭回归非常相似的过程:

在这种情况下, alpha 的最优值为 1,负的 MSE 为-3.0414,这是三个模型的最好成绩!

决策树——理论

基于树的方法可用于回归或分类。它们包括将预测空间分割成许多简单的区域。分割规则集可以总结为一棵树,因此被命名为决策树方法。

单个决策树往往不如线性回归逻辑回归LDA 等性能好。但是,通过引入 bagging、随机森林和 boosting,它可以显著提高预测的准确性,但会损失一些解释能力。

回归树

在进入理论之前,我们需要一些基本的术语。

树是倒着画的。最后的区域被称为叶。树内发生分裂的点是区间节点。最后,连接节点的线段是分支

Decision tree schematic

要创建回归树,请执行以下操作:

  1. 将预测空间划分为 J 个不同且不重叠的区域
  2. 对于落在一个区域中的每个观察值,预测该区域中响应值的平均值

每个区域被分割以最小化 RSS。为此,需要一种自顶向下的贪婪方法,也称为递归二进制分裂

为什么自上而下?

因为在第一次分裂之前,所有观测值都在单个区域中。

为什么是贪婪的方法?

因为最佳分割发生在特定步骤,而不是向前看并进行分割,这将导致对未来步骤的更好预测。

数学上,我们将这对半平面定义为:

并且我们寻求 js 最小化:

但是,这可能会导致过度拟合。修剪树将产生一个更小的子树,我们可以用交叉验证来验证它。

Schematic of an unpruned tree

分类树

分类树与回归树非常相似。但是,我们不能使用响应的平均值,所以我们现在预测一个区域中最常出现的类。当然,RSS 不能作为评判标准。相反,每次分割都是为了最小化分类错误率

分类错误率只是不属于最常见类别的区域中训练观察值的分数。

Classification error rate

不幸的是,这对于植树来说不够灵敏。在实践中,还使用了另外两种方法。

还有基尼指数:

Gini index

这是对所有类别的总方差的度量。如你所见,如果比例接近 0 或 1,基尼指数会很小,所以它是一个很好的衡量节点纯度的指标。

类似的基本原理适用于另一种称为交叉熵的方法:

Cross-entropy

既然我们已经看到了基本决策树是如何工作的,那么让我们来看看如何提高它的性能!

制袋材料

我们知道 bootstrap 可以计算任何感兴趣的量的标准差。对于决策树来说,方差非常大。因此,通过 bootstrap 聚合或 bagging ,我们可以减少方差并提高决策树的性能。

装袋包括从数据集中重复提取样本。这产生了 B 不同的引导训练集。然后,我们对所有自举训练集进行训练,以获得每个集的预测,并对这些预测进行平均。

数学上,平均预测是:

将此应用于决策树,这意味着我们可以构建大量具有高方差和低偏差的树。然后,我们可以对他们的预测进行平均,以减少方差,从而提高决策树的性能。

随机森林

随机森林通过一个小调整提供了对袋装树的改进,这个小调整解除了树木之间的关联。

像装袋一样,建立多个决策树。然而,在每次分割时,从所有的 p 预测值中选择一个随机样本 m 预测值。分割只允许使用一个 m 预测器,通常:

换句话说,在每次分割时,不允许算法考虑大多数可用的预测值!

为什么?

假设数据集中有一个非常强的预测因子,以及其他中等强度的预测因子。然后在套袋树的采集中,他们都会在顶裂中使用这个强预测器。因此,所有装袋的树将非常相似,平均它们的预测不会减少方差,因为预测将高度相关。

随机森林通过强制每次分割只考虑有效地去相关树的预测子集合来克服这个问题。

当然,如果 m 等于 p ,那么就跟装袋一样。通常情况下, p 的平方根给出的结果最好,如下图所示。

Classification error as a function of the number of trees. Each line represents the number of predictors available at each split.

助推

Boosting 的工作方式与 bagging 类似,但树是按顺序生长的:每棵树都使用来自先前生长的树的信息。

这意味着算法慢慢地学习。每棵树都适合模型的残差,而不是目标变量。因此,每棵树都很小,在表现不好的地方会慢慢改善预测。**

升压有三个调整参数:

1.树的数量( B ):与套袋和随机森林不同,如果 B 太大,boosting 可能会溢出。使用交叉验证来选择正确的树的数量。

2.收缩参数( alpha ):控制 boosting 学习速率的小正数。它通常设置为 0.01 或 0.001。

3.每棵树的分裂数( d ):它控制增强整体的复杂度。通常,单个拆分( d = 1)效果很好。它也被称为。****

Classification error as a function of the number of trees. Each line represents a different interaction depth.

正如你在上面看到的,交互深度为 1 似乎给出了最好的结果。

决策树—实践

现在,让我们应用我们所学的知识来预测乳腺癌。许多关于乳腺癌的数据集包含关于肿瘤的信息。然而,我很幸运地找到了一个数据集,其中包含了乳腺癌患者和非乳腺癌患者的常规血液检查信息。潜在地,如果我们能够准确地预测一个病人是否患有癌症,那么这个病人可以接受非常早期的治疗,甚至在肿瘤被发现之前!

当然,数据集和完整的笔记本都可以在这里获得,我强烈建议你也一起编码。

探索性数据分析

在开始 Jupyter 的工作之前,我们可以在这里获得关于数据集的信息。

首先,您会注意到数据集非常小,只有 116 个实例。这带来了几个挑战,因为决策树可能会过度拟合数据,或者由于缺乏其他观察,我们的预测模型可能不是最好的。然而,这是一个很好的概念验证,可能证明通过简单的血液测试预测乳腺癌的真正潜力。

数据集仅包含以下十个属性:

1.年龄:患者的年龄(岁)

2.身体质量指数:体重指数(千克/米)

3.葡萄糖:血液中的葡萄糖浓度(毫克/分升)

4.胰岛素:血液中的胰岛素浓度(微单位/毫升)

5.HOMA:胰岛素抵抗的稳态模型评估(葡萄糖乘以胰岛素

6.瘦素:能量消耗激素瘦素的浓度(ng/mL)

7.脂联素:脂联素的浓度——一种调节葡萄糖水平的蛋白质(微克/毫升)

8.抵抗素:抵抗素的浓度——脂肪组织分泌的一种蛋白质(ng/mL)

9.MCP . 1:MCP-1 的浓度——一种由于组织损伤或炎症而将单核细胞募集到炎症部位的蛋白质(pg/dL)

10.分类:健康对照(1)或患者(2)

现在我们知道了我们将使用什么,我们可以从导入我们常用的库开始:

然后,定义数据集的路径,让我们预览一下:

太好了!现在,因为这是一个分类问题,所以让我们看看这些类别是否平衡:

结果应该是:

如你所见,病人和健康对照的数量几乎相同。

现在,看看健康人和病人的每个特征的分布和密度会很有趣。为此,一个小提琴情节是理想的。它显示了单一地块中要素的密度和分布。让我们有九个小提琴情节:每个特征一个:

花点时间回顾一下所有的图,试着找出健康对照和患者之间的一些差异。

最后,让我们检查一下是否有丢失的值:

您应该看到没有一列缺少值!我们现在准备开始建模!

系统模型化

首先,我们需要将类编码为 0 和 1:

现在,0 代表健康对照,1 代表病人。

然后,我们将数据集分为训练集和测试集:

在编写模型之前,我们需要定义适当的误差度量。在这种情况下,由于这是一个分类问题,我们可以使用混淆矩阵并使用分类误差。让我们编写一个帮助函数来绘制混淆矩阵:

厉害!现在,让我们实现一个决策树。

决策图表

使用 scikit-learn ,决策树很容易实现:

您应该得到以下混淆矩阵:

****

如您所见,它错误地分类了三个实例。因此,我们来看看套袋、助推或随机森林是否能提高树的性能。

制袋材料

为了实现带有 bagging 的决策树,我们编写以下代码:

你会得到下面的混淆矩阵:

太神奇了!该模型对测试集中的所有实例进行了正确分类!为了得到更多的练习,让我们也实现一个随机森林分类器并使用 boosting。

随机森林分类器

这里,对于随机森林分类器,我们指定我们想要的树的数量。让我们用 100:

****

你会得到这个混乱矩阵:

在这里,虽然只有一个实例被错误分类,但是模型实际上说一个病人是健康的,而实际上这个人患有癌症!这是非常不理想的情况。

助推

最后,对于升压:

我们得到了以下结果:

同样,只有一个实例被错误分类。

支持向量机(SVM)——理论

我们已经看到了如何使用逻辑回归、LDA决策树处理分类问题。现在,又引入了另一个分类工具:支持向量机

支持向量机是一种称为最大间隔分类器的分类器的推广。最大间隔分类器很简单,但它不能应用于大多数数据集,因为类必须由线性边界分隔。

这就是为什么支持向量分类器被引入作为最大间隔分类器的扩展,其可以应用于更广泛的情况。

最后,支持向量机只是支持向量分类器的进一步扩展,以适应非线性类边界。

它可用于二元或多元分类。

解释支持向量机的理论非常专业。希望这篇文章能让你更容易理解支持向量机是如何工作的。

最大间隔分类器

这种方法依赖于使用超平面来分离类。

什么是超平面?

p 维空间中,超平面是维数为 p-1 的平坦仿射子空间。视觉上,在 2D 空间中,超平面将是一条线,而在 3D 空间中,它将是一个平面。

数学上,超平面简单地说就是:

General hyperplane equation

如果 X 满足上式,则该点位于平面上。否则,它必须在平面的一侧,如下图所示。

The line represents a hyperplane in a 2D space. Points that satisfy the equation above will lie on the line, while others are on one side of the plane.

一般来说,如果可以使用超平面完美地分离数据,那么就有无限数量的超平面,因为它们可以向上或向下移动,或者稍微旋转,而不会接触到观察结果。

这就是为什么我们使用最大间隔超平面最佳分离超平面的原因,最佳分离超平面是离观察值最远的分离超平面。我们从给定超平面的每个训练观察计算垂直距离。这就是所谓的余量。因此,最优分离超平面是具有最大余量的超平面。

Example of a maximal margin hyperplane

正如你在上面看到的,有三个点与超平面等距。这些观察结果被称为支持向量,因为如果它们的位置移动,超平面也会移动。有趣的是,这意味着超平面仅依赖于支持向量,而不依赖于任何其他观察。

如果不存在分离平面呢?

Overlapping classes where no separating hyperplane exists

在这种情况下,没有最大间隔分类器。我们使用一个支持向量分类器,该分类器使用一个被称为支持向量分类器的软余量几乎分离类别。然而,进一步讨论这种方法变得非常技术性,因为它不是最理想的方法,我们现在将跳过这个主题。

支持向量机(SVM)

支持向量机是支持向量分类器的扩展,通过使用内核来扩大特征空间。核方法只是一种有效的计算方法,用于适应类之间的非线性边界。

在不涉及技术细节的情况下,核是量化两个观察的相似性的函数。内核可以是任何程度的。使用度大于 1 的核导致更灵活的决策边界,如下所示。

Example of classification with SVM

为了更好地理解内核的选择如何影响 SVM 算法,让我们在四个不同的场景中实现它。

支持向量机(SVM)-实践

这个项目分为四个小项目。

第一部分将展示如何使用线性核执行分类,以及正则化参数 C 如何影响得到的超平面

然后,第二部分将展示如何使用高斯核生成一个非线性超平面。

第三部分模拟重叠类,我们将使用交叉验证来找到 SVM 的最佳参数。

最后,我们使用 SVM 执行了一个非常简单的垃圾邮件分类器。

以上练习摘自吴恩达在 Coursera 上的免费课程。我简单用 Python 解决,导师不推荐。尽管如此,我还是向所有初学者强烈推荐这门课程。

一如既往,笔记本和资料在这里可用

迷你项目 1——线性核 SVM

在我们开始之前,让我们导入一些有用的库:

注意,我们在这里导入了 loadmat ,因为我们的数据是矩阵形式的。

然后,我们将数据集的路径存储在不同的变量中:

最后,我们将构建一个函数来帮助我们快速绘制每个数据集:

完美!

现在,在这一部分,我们将使用线性核实现一个支持向量机,我们将看到正则化参数如何影响超平面。

首先,让我们加载并可视化数据:

您应该会看到:

****注意上图左侧的异常值。让我们看看正则化参数在存在异常值时将如何影响超平面。

上面的代码块简单地将 SVM 拟合到数据中,我们使用预测来绘制超平面。注意,我们使用正则化参数 1。结果应该如下所示:

Hyperplane with C=1

如你所见,超平面忽略了异常值。因此,较低正则化参数将被更好地概括。测试误差通常会高于交叉验证误差。

现在,让我们增加正则化参数:

你会得到:

Hyperplane with C=100

现在,异常值在超平面的右侧,但这也意味着我们过度拟合了。最终,这个边界在未观察到的数据上表现不好。

迷你项目 2——高斯核 SVM

现在,我们知道为了适应非线性边界,我们需要改变核函数。在这个练习中,我们将使用一个高斯内核。

首先,让我们绘制我们的数据:

您应该会看到:

在实现 SVM 之前,您应该知道高斯核表示为:

Gaussian kernel function

注意,有一个参数 sigma 决定了当它们相距较远时,相似性度量多快变为零。

因此,我们用以下代码实现它:

你应该得到下面的超平面:

Non-linear hyperplane with a Gaussian kernel

太神奇了!超平面不是一个完美的边界,但它在分类大多数数据方面做得很好。我建议你尝试不同的 sigma 值,看看它是如何影响超平面的。

迷你项目 3——交叉验证的 SVM

交叉验证对于从我们的模型中选择最佳性能的最佳调整参数至关重要。让我们看看如何将它应用到支持向量机中。

当然,让我们看看这个练习的数据是什么样的:

你会得到:

注意我们有重叠的类。当然,我们的超平面不会尽善尽美,但我们将使用交叉验证来确保它是我们能得到的最好结果:

从上面的代码单元中,您应该得到最佳正则化参数是 1,并且 sigma 应该是 0.1。使用这些值,我们可以生成超平面:

并获得:

Hyperplane with C=1 and sigma=0.1

迷你项目 4—SVM 垃圾邮件分类

最后,我们用 SVM 训练了一个垃圾邮件分类器。在这种情况下,我们将使用线性核。此外,我们有单独的数据集用于训练和测试,这将使我们的分析更容易一些。

你可以看到,我们得到的训练准确率为 99.825%,而测试准确率为 98.9%!

无监督学习——理论

无监督学习是一组统计工具,用于只有一组特征而没有目标的场景。因此,我们无法做出预测,因为对每个观察结果都没有相关的反应。相反,我们感兴趣的是找到一种有趣的方式来可视化数据,或者发现类似观察的子群。

无监督学习往往更具挑战性,因为分析没有明确的目标,而且往往是主观的。此外,很难评估获得的结果是否良好,因为没有公认的机制来执行交叉验证或验证独立数据集上的结果,因为我们不知道真实的答案。

本指南将重点介绍两种技术:主成分分析聚类

主成分分析

PCA 是指计算主成分并用于更好地理解数据的过程。PCA 也可以用于可视化。

什么是主成分?

假设您想要可视化一组 p 特征上的 n 观测值,作为探索性数据分析的一部分。我们可以一次检查两个特征的 2D 散点图,但如果有很多预测因素,就会很快失控。

使用 PCA,我们可以找到包含尽可能多的变化的数据集的低维表示。因此,我们只获得最感兴趣的特征,因为它们是方差的主要来源。

主成分是怎么找到的?

第一个主成分是具有最大方差的特征的归一化线性组合:

First principal component equation

符号φ被称为载荷。负载必须最大化:

这就是全部了!

聚类方法

聚类是指在数据集中查找子组或聚类的一系列技术。这有助于我们将观察结果划分为不同的组,以便每个组包含彼此相似的观察结果。例如,在乳腺癌的情况下,组可以代表肿瘤等级。它在市场细分的营销中也非常有用,以便确定更容易接受某种产品的人群。

聚类方法有很多,但我们将重点介绍 k-means 聚类层次聚类。在 K 均值聚类中,我们希望将数据划分成预先指定数量的 K 个聚类。另一方面,对于层次聚类,我们不知道我们需要多少个聚类。相反,我们想要一个树状图,它允许我们查看每个可能的聚类数所获得的所有聚类。

k 均值聚类

这种方法简单地将观察结果分成 K 个集群。它假设:

1.每个观察值属于 K 个聚类中的至少一个

2.集群不重叠

此外,每个集群内的变化被最小化。

How observations were clustered depending on the number of specified clusters

这是通过最小化一个聚类内每个观察值之间的平方欧几里德距离之和来实现的:

Optimization function for k-mean clustering

为了最小化,我们遵循以下算法:

1.从 1 到 K 之间随机分配一个数字给每个观察值。这些用作观测的初始聚类分配。

2.迭代直到集群分配停止变化:

2.a .对于每个 K 簇,计算簇质心。第簇质心是第簇中观测值的 p 特征均值的向量

2.b .将每个观察值分配给质心最近(最短欧几里得距离)的聚类

请注意,上面的算法将找到一个局部最小值。因此,所获得的结果将取决于初始随机聚类分配。因此,多次运行该算法非常重要。

分层聚类

k-means 聚类的一个潜在缺点是它需要人工输入来指定聚类的数量。另一方面,层次聚类不需要聚类的初始数量。

最常见的层次聚类类型是自底向上聚集聚类。这指的是这样一个事实,即从叶子开始生成一个树状图,并将簇组合到树干。

Examples of dendrograms

算法其实很简单。它从定义每对观察值之间的不相似性度量开始,比如欧几里德距离。然后,首先假设每个观察值属于它自己的集群。然后将两个最相似的聚类融合,这样就有了 n-1 个聚类。之后,融合另外两个相似的簇,产生 n-2 簇。该过程反复重复,直到所有的观察结果都是单个聚类的一部分。

虽然简单,但有些事情没有解决。如何定义聚类之间的相异度?这是通过联动的概念实现的。下表总结了四种最常见的链接类型:

The four most common types of linkage

完全连锁、平均连锁和质心连锁是最常见的连锁类型,因为单个连锁往往会产生不平衡的树状图。注意,生成的树状图很大程度上取决于所用的连锁类型。

****

Effect of linkage on the final dendrogram

此外,选择合适的相异度也很关键。欧几里德距离被广泛讨论,但也有基于相关性的距离。如果两个特征高度相关,则认为它们是相似的,这意味着它们具有相似的轮廓。

Observation 1 and 2 are highly correlated, since they have similar profiles

例如,假设一家在线零售商对基于购物者过去的购物历史对他们进行聚类感兴趣。目标是识别相似购物者的子群,这样他们就可以看到可能引起他们兴趣的广告。使用欧几里德距离,那么总体上很少购买商品的购物者将被聚集在一起,这可能不是理想的。另一方面,使用基于相关性的距离,具有类似偏好(他们购买了商品 A 和 B,但没有购买商品 C 和 D)的购物者将被聚集在一起,即使他们购买了不同数量的商品。**

然而,在所有情况下,一旦层次聚类完成,我们仍然需要人工输入来确定要使用的最终聚类数。

现在您已经了解了 PCA 和聚类方法的工作原理,让我们在一个小型项目环境中实现它们。

无监督学习—实践

这部分将分为两个迷你项目。在第一个例子中,我们将使用 k-means 聚类对图像执行颜色量化

然后,在第二个迷你项目中,我们将使用主成分分析来降低数据集的维度,允许我们用 2D 图来可视化它。

在这里你可以得到你需要的一切。

旋转你的 Jupyter 笔记本,我们走吧!

初始设置

在开始任何实现之前,我们将导入一些在以后会变得方便的库:

与之前的教程不同,我们不会导入数据集。相反,我们将使用由 scikit-learn 库提供的数据。

迷你项目 1 —使用 k 均值聚类的颜色量化

快速,颜色量化是一种技术,以减少在图像中使用的不同颜色的数量。这对于在保持图像完整性的同时压缩图像尤其有用。

首先,我们导入以下库:

注意,我们导入了一个名为 load_sample_image 的样本数据集。这仅仅包含两个图像。我们将使用其中一个来执行颜色量化。

因此,让我们展示一下我们将在本练习中使用的图像:

您应该会看到:

Original image

现在,对于颜色量化,必须遵循不同的步骤。

首先,我们需要将图像转换成 2D 矩阵进行处理:

然后,我们训练我们的模型来聚合颜色,以便在图像中有 64 种不同的颜色:

然后,我们构建一个辅助函数来帮助我们用指定颜色的数量重建图像:

最后,我们现在可以看到只有 64 种颜色的图像,以及它与原始图像的对比:

Original image with 96 615 colors

Reconstructed image with 64 colors

当然,我们可以看到一些差异,但总体而言,图像的完整性是守恒的!一定要探索不同数量的集群!例如,如果指定 10 种颜色,将会得到以下结果:

Reconstructed image with 10 colors

迷你项目 2 —使用主成分分析进行降维

在本练习中,我们将使用主成分分析来降低数据集的维度,以便我们可以轻松地将其可视化。

因此,让我们从 scikit-learn 导入虹膜数据集:

现在,我们将计算前两个主成分,并查看每个主成分可以解释的方差比例:

从上面的代码块中,您应该看到第一个主成分包含 92%的方差,而第二个主成分占 5%的方差。因此,这意味着仅两个特征就足以解释数据集中 97%的方差!

现在,我们可以利用它轻松绘制二维数据:

你会得到:

正如你所看到的,主成分分析有助于减少数据集的维数,允许我们绘制它,并可视化每个类别是如何分开的。

时间序列分析—理论

无论我们希望预测金融市场或电力消费的趋势,时间都是我们的模型中必须考虑的重要因素。例如,预测在一天中的什么时间将会出现用电高峰是令人感兴趣的,例如调整电力的价格或产量。

进入时间序列。时间序列就是按时间顺序排列的一系列数据点。在时间序列中,时间通常是独立变量,目标通常是对未来做出预测。

然而,在处理时间序列时,还有其他方面的因素在起作用。

静止的吗?

有没有季节性

目标变量是否与自相关?

自相关

非正式地说,自相关是观测值之间的相似性,是它们之间的时滞的函数。

Example of an autocorrelation plot

上面是一个自相关图的例子。仔细观察,您会发现第一个值和第 24 个值具有很高的自相关性。同样,第 12 次和第 36 次观察高度相关。这意味着我们会在每 24 个时间单位找到一个非常相似的值。

注意这个图看起来像正弦函数。这是对季节性、的暗示,你可以通过在上面的图中找到时间段来找到它的值,这将给出 24 小时。

季节性

****季节性指周期性波动。例如,用电量白天高,晚上低,或者圣诞节期间在线销售增加,然后再次放缓。

Example of seasonality

从上面可以看出,有明显的日季节性。每一天,你都会在傍晚看到一个高峰,而最低点则是每天的开始和结束。

请记住,如果自相关图呈正弦曲线形状,季节性也可以从自相关图中得出。简单地看周期,它给出了季节的长度。

平稳性

****平稳性是时间序列的重要特征。如果一个时间序列的统计特性不随时间变化,则称该时间序列是平稳的。换句话说,它有常数均值和方差,协方差与时间无关。

Example of a stationary process

再看同样的图,我们看到上面的过程是静止的。平均值和方差不随时间变化。

通常,股票价格不是一个稳定的过程,因为我们可能会看到一个增长的趋势,或者它的波动性可能会随着时间的推移而增加(意味着方差在变化)。

理想情况下,我们希望有一个平稳的时间序列来建模。当然,并不是所有的都是静止的,但是我们可以做不同的变换使它们静止。

如何测试一个过程是否是稳定的

你可能已经注意到了上面这个图的标题。这是我们用来确定时间序列是否平稳的统计测试。

在不深入 Dickey-Fuller 检验的技术细节的情况下,它检验了单位根存在的零假设。

如果是,那么p>0,过程不是静止的。

否则, p = 0,零假设被拒绝,过程被认为是平稳的。

例如,下面的过程不是静止的。请注意,平均值在整个时间内并不恒定。

Example of a non-stationary process

建模时间序列

为了进行预测,有许多方法可以对时间序列进行建模。在这里,我将介绍:

  • 移动平均数
  • 指数平滑法
  • ARIMA

移动平均数

移动平均模型可能是时间序列建模中最简单的方法。该模型简单地说明了下一个观察值是所有过去观察值的平均值。

虽然简单,但这个模型可能会出奇的好,它代表了一个好的起点。

否则,移动平均线可用于识别数据中有趣的趋势。我们可以定义一个窗口来应用移动平均模型平滑时间序列,并突出显示不同的趋势。

Example of a moving average on a 24h window

在上图中,我们将移动平均模型应用于 24 小时窗口。绿线平滑了时间序列,我们可以看到 24 小时内有两个峰值。

当然,窗口越长,趋势就越平稳。下面是一个小窗口的移动平均线的例子。

Example of a moving average on a 12h window

指数平滑法

指数平滑使用与移动平均类似的逻辑,但是这一次,不同的递减权重被分配给每个观察值。换句话说,随着我们离现在越来越远,观察的重要性就越来越小。

数学上,指数平滑表示为:

Exponential smoothing expression

这里,α是取值在 0 和 1 之间的平滑因子。它决定了先前观察到的重量减少的速度。

Example of exponential smoothing

从上面的图中,深蓝色线表示使用平滑因子 0.3 对时间序列进行指数平滑,而橙色线使用平滑因子 0.05。

可以看到,平滑因子越小,时间序列就越平滑。这是有意义的,因为当平滑因子接近 0 时,我们就接近移动平均模型。

双指数平滑

当时间序列中存在趋势时,使用双指数平滑。在这种情况下,我们使用这种技术,它只是指数平滑的两次递归使用。

数学上:

Double exponential smoothing expression

这里, beta趋势平滑因子,取 0 到 1 之间的值。

下面,您可以看到 alphabeta 的不同值如何影响时间序列的形状。

Example of double exponential smoothing

三指数平滑

该方法通过添加季节性平滑因子扩展了双指数平滑。当然,如果您注意到时间序列中的季节性,这是很有用的。

数学上,三重指数平滑表示为:

Triple exponential smoothing expression

其中伽玛是季节平滑因子,而 L 是季节的长度。

季节性自回归积分移动平均模型

SARIMA 实际上是简单模型的组合,以形成一个复杂的模型,该模型可以模拟具有非平稳属性和季节性的时间序列。

首先,我们有自回归模型 AR(p)** 。这基本上是时间序列自身的回归。这里,我们假设当前值依赖于它以前的值,有一些滞后。它采用一个代表最大滞后的参数 p 。为了找到它,我们查看部分自相关图,并确定大多数滞后不显著之后的滞后。**

在下面的例子中, p 应该是 4。

Example of a partial autocorrelation plot

然后,我们添加移动平均线模型 MA(q)** 。这需要一个参数 q ,该参数代表最大滞后,在该最大滞后之后,其他滞后在自相关图上不显著。**

下面, q 会是 4。

Example of an autocorrelation plot

之后,我们加上的积分顺序** I(d) 。参数 d 代表使序列稳定所需的差值数量。**

最后,我们添加最后一个组件:季节性 S(P,D,Q,s)** ,其中 s 就是季节的长度。此外,该组件需要参数 PQ ,它们与 pq 相同,但针对季节性组件。最后, D 是季节积分的顺序,代表从序列中去除季节性所需的差异数。**

综合所有这些,我们得到了萨里玛(P,D,q)(P,D,Q,s)** 模型。**

主要要点是:在使用 SARIMA 建模之前,我们必须对时间序列进行转换,以消除季节性和任何非平稳行为。

时间序列分析—实践

我们会试着预测一家特定公司的股价。现在,预测股票价格几乎是不可能的。然而,这仍然是一个有趣的练习,也是练习我们所学知识的好方法。

我们将使用新德国基金(GF)的历史股价来尝试预测未来五个交易日的收盘价。

你可以在这里抓取数据集和笔记本

和往常一样,我强烈推荐你跟着编码!启动你的笔记本,我们走吧!

导入数据

首先,我们导入一些对我们的分析有帮助的库。此外,我们定义了平均百分比误差(MAPE)** ,因为这将是我们的误差度量。**

首先,我们导入一些对我们的分析有帮助的库。此外,我们定义了平均百分比误差(MAPE)** ,因为这将是我们的误差度量。**

然后,我们导入数据集,对前十个条目进行排序,您应该会得到

First 10 entries of the dataset

正如你所看到的,我们有几个条目是关于一只不同于新德国基金的股票。此外,我们有一个关于当天信息的条目,但我们只想要当天结束时(EOD)的信息。

清理数据

首先,我们删除不需要的条目。

然后,我们删除不需要的列,因为我们只想关注股票的收盘价。

如果预览数据集,您应该会看到:

Clean dataset

厉害!我们准备好进行探索性数据分析了!

探索性数据分析

我们绘制了数据集整个时间段的收盘价。

您应该得到:

Closing price of the New Germany Fund (GF)

显然,你看到这不是一个平稳的过程,很难判断是否存在某种季节性

移动平均数

让我们使用移动平均模型来平滑我们的时间序列。为此,我们将使用一个助手函数,该函数将在指定的时间窗口运行移动平均模型,并绘制出平滑的结果曲线:

使用 5 天的时间窗,我们得到:

Smoothed curve by the previous trading week

如你所见,我们几乎看不到趋势,因为它太接近实际曲线了。让我们看看上个月和上个季度的平滑结果。

Smoothed by the previous month (30 days)

Smoothed by the previous quarter (90 days)

现在趋势更容易发现了。注意 30 天和 90 天的趋势是如何在最后显示出下降曲线的。这可能意味着股票可能会在接下来的几天下跌。

指数平滑法

现在,让我们使用指数平滑来看看它是否能获得更好的趋势。

这里,我们使用 0.05 和 0.3 作为平滑因子的值。随意尝试其他值,看看结果如何。

Exponential smoothing

正如你所看到的,0.05 的 alpha 值平滑了曲线,同时拾取了大部分向上和向下的趋势。

现在,让我们使用双指数平滑。****

双指数平滑

你会得到:

Double exponential smoothing

同样,尝试不同的 alphabeta 组合来获得更好看的曲线。

系统模型化

如前所述,我们必须把我们的系列变成一个平稳的过程,以便对它建模。因此,让我们应用 Dickey-Fuller 检验来看看它是否是一个平稳过程:

您应该看到:

通过 Dickey-Fuller 检验,时间序列无疑是非平稳的。还有,看自相关图,看到很高,似乎没有明显的季节性。

因此,为了去掉高自相关性,并使过程平稳,我们取第一个差(代码块中的第 23 行)。我们简单地从滞后一天的时间序列中减去时间序列,我们得到:

厉害!我们的系列现在是固定的,我们可以开始建模!

萨里玛

现在,对于 SARIMA,我们首先定义一些参数和其他参数的值范围,以生成 P,Q,D,P,Q,D,s 的所有可能组合的列表。

现在,在上面的代码单元中,我们有 625 种不同的组合!我们将尝试每种组合,并用每种组合来训练 SARIMA,以找到最佳表现模式。这可能需要一段时间,具体取决于您计算机的处理能力。

完成后,我们会打印出最佳模型的摘要,您应该会看到:

厉害!我们最终预测未来五个交易日的收盘价,并评估模型的 MAPE。

在这种情况下,我们有 0.79%的 MAPE,这非常好!

将预测价格与实际数据进行比较

现在,为了将我们的预测与实际数据进行比较,我们从雅虎财经获取财务数据,并创建一个数据框架。

然后,我们画一个图,看看我们离实际收盘价有多远:

Comparison of predicted and actual closing prices

看来我们的预测有点偏差。事实上,预测价格基本持平,这意味着我们的模型可能表现不佳。

同样,这不是因为我们的程序,而是因为预测股票价格基本上是不可能的

来源

  1. 统计学习介绍 —加雷斯·詹姆士
  2. 机器学习 —吴恩达
  3. 开放机器学习课程:时间序列 —德米特里·谢尔盖耶夫
posted @ 2024-10-13 15:24  绝不原创的飞龙  阅读(387)  评论(0)    收藏  举报