TowardsDataScience-博客中文翻译-2016-2018-二百三十二-

110 阅读1小时+

TowardsDataScience 博客中文翻译 2016~2018(二百三十二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

预处理大型数据集:50 万多个实例的在线零售数据

原文:towardsdatascience.com/preprocessi…

几个月前,我有机会参与一个拥有超过 500,00 0 行的庞大数据集的项目!老实说,这是我第一次不得不处理数量惊人的数据,但我认为玩它并探索新的数据挖掘技术会很有趣。在这篇文章中,我将解释我是如何处理这个问题的,并最终得到了一个干净的、便于使用的数据集。还提供了 R 代码。

正在讨论的数据集在 UCI 机器学习库这里可用。这是一个交易数据集,包含 2010 年 1 月 12 日和 2011 年 9 月 12 日之间英国注册的无店铺在线零售的所有交易。该公司主要销售独特的全场合礼品;这家公司的许多客户都是批发商。属性信息可以在提供的链接中找到。我的最终目标是对这些数据进行购物篮分析,并找出关联规则。然而,第一步是清理数据。

我将数据集保存为一个. csv 文件,并简要查看了所有行。我意识到,由于维度问题,我可能无法注意到最重要的模式和细节。然而,我注意到一些单元格是空的,那些是丢失的值。为了方便起见,它们被重新编码为 NA。我还发现了丢失的值在哪里,以及有多少。

dataset = read.csv("OnlineRetail.csv", na.strings = c("","NA"))attach(dataset)#checking if there any missing values, where are they missing, and how many of them are missingany(is.na(dataset))[1] **TRUE**apply(dataset, 2, function(x) any(is.na(x)))InvoiceNo StockCode Description Quantity InvoiceDate UnitPrice CustomerID Country**FALSE** **FALSE** **TRUE** **FALSE** **FALSE** **FALSE** **TRUE** **FALSE**sum(is.na(CustomerID))[1] 135080sum(is.na(Description))[1] 1454

InvoiceNo 为整数类型;但是,最好是字符类型,这样我们就可以应用字符串函数。在 InvoiceNoDescription 中的 trim 功能都删除了前导和尾随空格。

dataset$InvoiceNo = as.character(InvoiceNo)
trim = function (x) gsub("^\\s+|\\s+$", "", x)
dataset$InvoiceNo = trim(InvoiceNo)
dataset$Description = trim(as.character(Description))

以 C 开头的发票号码实际上是取消的,所以我们可能想去掉它们。我引入了一个名为 is_C 的函数,它检查一个字符串是否以 C 开头。我们对原始数据进行子集化,得到 dataset2 (没有取消)和 dataset3 (没有空的项目描述)。我们可以看到原始数据集有 541 909 个观察值,现在我们在数据集 3 中有 531 167 个观察值。我们刚刚剔除了将近 10 000 个无用的观察值。

is_C = function (x) startsWith(x,"C")
dataset2 = dataset[which(!is_C(dataset$InvoiceNo)),] #subsetting
dataset3 = subset(dataset2,!is.na(dataset2$Description)) #subsetting

接下来,我又看了一遍这些行,发现许多项目描述没有任何意义。例如,我看到了像“?”这样的符号以及损坏、砸碎、丢失等词语。扔掉这些不需要的东西是个好主意。我想出了一系列有趣的流行语:

buzzwords = c("WRONG","LOST", "CRUSHED", "SMASHED", "DAMAGED", "FOUND", "THROWN", "MISSING", "AWAY", "\\?", "CHECK", "POSTAGE", "MANUAL", "CHARGES", "AMAZON", "FEE", "FAULT", "SALES", "ADJUST", "COUNTED", "LABEL", "INCORRECT", "SOLD", "BROKEN", "BARCODE", "CRACKED", "RETURNED", "MAILOUT", "DELIVERY", "MIX UP", "MOULDY", "PUT ASIDE", "ERROR", "DESTROYED", "RUSTY")

如果任何项目包含这些单词中的一个,它将被删除。以下功能是不合需要的测试一个项目是否“不合需要”。

library(stringr)   #function str_detectisUndesirable = function(x){c = **FALSE**   #assume that the string is undesirable (FALSE), and perhaps switch to desirable (TRUE)for (i **in** 1:(length(buzzwords))){
  c = c || ifelse(str_detect(toupper(x),buzzwords[i]),**TRUE**,**FALSE**)
}#now we know whether or not the string is undesirablereturn(c)}

现在我们可以子集化 dataset3 使得数量大于 0(否则没有意义),项目名称为“合意”。我们得到数据集 4 ,最后得到数据集 5InvoiceDate 被转换为 POSIXct 对象,订单的确切时间被排除。描述列被分解。

dataset4 = subset(dataset3, dataset3$Quantity > 0)dataset5 = dataset4[which(!isUndesirable2(as.character(dataset4$Description))),]Time = format(as.POSIXct(strptime(dataset5$InvoiceDate,"%Y-%m-%d %H:%M",tz="")) ,format = "%H:%M:%S")dataset5$InvoiceDate = as.Date(dataset5$InvoiceDate)
dataset5$Description = as.factor(dataset5$Description)

就是这样!现在我们有了包含 530 653 个观察值的数据集 5 ,准备用于购物篮分析。请注意,该数据集在 CustomerID 列中仍然有缺失值。然而,这无关紧要,我们为什么要关心客户的 ID 呢?发票号对于发现关联规则和进一步分析更为重要。然而,如果我们想在另一个分析中使用这个数据,我们可以用不同的方式对它进行预处理。

完整的 R 代码,请访问我的 GitHub 简介。

使用 sklearn 进行预处理:完整而全面的指南

原文:towardsdatascience.com/preprocessi…

对于有抱负的数据科学家来说,有时可能很难在预处理技术的森林中找到出路。 Sklearn 它的预处理库形成了一个坚实的基础,指导您完成数据科学管道中的这项重要任务。虽然 Sklearn 有相当可靠的文档,但它经常忽略不同概念之间的流线和直觉。

本文旨在成为一个关于使用 sklearn v0.20.0 进行预处理的完整指南。它包含了 sklearn 中可用的所有实用函数和 transformer 类,并补充了其他常用库中的一些有用函数。最重要的是,文章是按照一个逻辑顺序来组织的,这个逻辑顺序代表了执行所讨论的转换的顺序。

将处理以下主题:

  • 缺少值
  • 多项式特征
  • 分类特征
  • 数字特征
  • 自定义转换
  • 特征缩放
  • 正常化

注意,第三步和第四步可以互换执行,因为这些转换应该彼此独立地执行。

缺少值

处理缺失值是一项重要的预处理任务,如果处理不当,可能会严重影响模型的质量。在处理缺失值时,应该提出几个问题:

我是否有缺失的值?它们在数据中是如何表达的?我应该扣留缺失值的样本吗?或者我应该换掉它们?如果是,应该用哪些值替换?

在开始处理缺失值之前,重要的是识别缺失值并知道它们被哪个值替代。通过将元数据信息与探索性分析相结合,您应该能够发现这一点。

一旦您对丢失的数据有了更多的了解,您就必须决定是否要保留带有丢失数据的条目。根据 Chris Albon ( 机器学习与 Python 食谱)的说法,这个决定应该部分取决于随机缺失值的程度

如果它们是完全随机的,它们不会给出任何额外的信息,可以省略。另一方面,如果它们不是随机的,值丢失的事实本身就是信息,可以表示为额外的二进制特征。

还要记住,因为缺少一个值而删除整个观察可能是一个糟糕的决定,会导致信息丢失。就像保留一整行缺失值,因为它有一个有意义的缺失值,这可能不是您的最佳选择。

让我们使用 sklearn 的 MissingIndicator 通过一些编码示例来实现这个理论。为了给我们的代码赋予一些意义,我们将创建一个非常小的数据集,包含三个特性和五个样本。数据包含明显的缺失值,表示为非数字999

import numpy as np
import pandas as pdX = pd.DataFrame(
    np.array([5,7,8, np.NaN, np.NaN, np.NaN, -5,
              0,25,999,1,-1, np.NaN, 0, np.NaN])\
              .reshape((5,3)))X.columns = ['f1', 'f2', 'f3'] #feature 1, feature 2, feature 3

Data set with three features and five samples

快速浏览一下数据,这样您就知道丢失的值在哪里。使用 pandas 的 dropna 函数,可以从数据中删除包含大量无意义缺失值的行或列。让我们来看看最重要的参数:

  • : 0 为行,1 为列
  • tresh :非 NaN 的不删除一行或一列的数目
  • 就地:更新框架

我们通过删除所有只有缺少值的行( =0)来更新数据集。注意,在这种情况下,除了将 tresh 设置为 1,您还可以将 how 参数设置为*‘all’*。结果,我们的第二个样本被丢弃,因为它只包含丢失的值。请注意,为了方便起见,我们重置了索引并删除了旧的索引列。

X.dropna(axis=0, thresh=1, inplace=True)X.reset_index(inplace=True)X.drop(['index'], axis=1, inplace=True)

让我们创建一些额外的布尔特征,告诉我们样本是否缺少某个特征的值。首先从 sklearn.impute 导入 MissingIndicator (注意需要版本 0.20.0 )(用'conda update sci kit-learn'更新)。

不幸的是,缺失指示器不支持多种类型的缺失值(参见 Stackoverflow 上的这个问题)。因此,我们必须将数据帧中的 999 值转换为 NaN 值。接下来,我们创建、拟合并转换一个 MissingIndicator 对象,该对象将检测数据中的所有 NaN 的

从这个指示符,我们可以创建一个新的数据帧,用布尔值表示一个实例是否缺少某个特性的值。但是为什么我们只有两个新专栏,而我们有三个原始功能?删除第二个样本后, f2 不再有缺失值。如果缺失指示器没有检测到特征中的任何缺失值,它不会从该特征创建一个新特征。

我们稍后会将这个新特性添加到我们的原始数据中,现在我们可以将它们存储在指示器变量中。

from sklearn.impute import MissingIndicatorX.replace({999.0 : np.NaN}, inplace=True)indicator = MissingIndicator(missing_values=np.NaN)indicator = indicator.fit_transform(X)indicator = pd.DataFrame(indicator, columns=['m1', 'm3'])

在决定保留(一些)缺失值并创建缺失值指示器后,下一个问题是是否应该替换缺失值。当缺失值被表示为而不是数字 ( np)时,大多数学习算法表现不佳。NaN )并且需要某种形式的缺失值插补。要知道有些库和算法,比如 XGBoost可以处理缺失值,通过学习自动估算这些值。

输入值

为了用通用策略填充缺失值,sklearn 提供了一个简单估算器。四个主要策略是均值最频繁中值常量(不要忘记设置填充值参数 ) 。在下面的例子中,我们用特征的平均值估算数据框架 X 的缺失值。

from sklearn.impute import SimpleImputerimp = SimpleImputer(missing_values=np.nan, strategy='mean')imp.fit_transform(X)

注意,返回的值被放入一个 Numpy 数组,我们丢失了所有的元信息。由于所有这些策略都可以在 pandas 中模仿,我们将使用 pandas fillna 方法来估算缺失值。对于表示的‘T28’,我们可以使用下面的代码。这个 pandas 实现还提供了向前填充( ffill )或向后填充(bfil)的选项,这在处理时间序列时非常方便。

X.fillna(X.mean(), inplace=True)

其他常用的估算缺失数据的方法是用 k 近邻 (KNN) 算法对数据进行聚类,或者使用各种插值方法对值进行插值。这两种技术都没有在 sklearn 的预处理库中实现,这里就不讨论了。

多项式特征

创建多项式要素是一种简单而常用的要素工程方法,它通过组合要素来增加数字输入数据的复杂性。

当我们想要包含特征和目标之间存在非线性关系的概念时,通常会创建多项式特征**。它们主要用于增加几乎没有特征的线性模型的复杂性,或者当我们怀疑一个特征的效果依赖于另一个特征时。**

在处理缺失值之前,您需要决定是否要使用多项式要素。例如,如果您将所有缺少的值替换为 0,则使用此功能的所有叉积都将为 0。此外,如果不替换丢失的值( NaN ),创建多项式特征将在 fit_transform 阶段产生值错误,因为输入应该是有限的。

在这方面,用中值或平均值代替缺失值似乎是一个合理的选择。由于我对此并不完全确定,也找不到任何一致的信息,我在数据科学 StackExchange 上问了这个问题。

Sklearn 提供了一个多项式特征类来从头创建多项式特征。次数参数决定多项式的最大次数。例如,当设置为 2 且 X=x1,x2 时,创建的特征将为 1,x1,x2,x1,x1x2 和 x2。 interaction_only 参数让函数知道我们只需要交互特性,即 1、x1、x2 和 x1x2。

这里,我们创建了三次多项式特征,也是唯一的交互特征。结果我们得到四个新特征: f1.f2f1.f3f2.f3f1.f2.f3 。请注意,我们的原始特征也包含在输出中,并且我们会切掉新特征,以便稍后添加到我们的数据中。

from sklearn.preprocessing import PolynomialFeaturespoly = PolynomialFeatures(degree=3, interaction_only=True)polynomials = pd.DataFrame(poly\
                           .fit_transform(X), 
                           columns=['0','1','2','3',                                     'p1', 'p2', 'p3', 'p4'])\
                                        [['p1', 'p2', 'p3', 'p4']]

正如任何其他形式的特征工程一样,在进行任何特征缩放之前,创建多项式特征是很重要的。

现在,让我们用 pandas concat 方法将新的缺失指标特征和多项式特征连接到我们的数据中。

X = pd.concat([X, indicator, polynomials], axis=1)

Dataframe with original features (f), missing value indicators (m) and polynomial features (p)

分类特征

分类数据的筛选是数据预处理过程中的另一个重要过程。不幸的是, sklearn 的机器学习库不支持处理分类数据。即使对于基于树的模型,也有必要将分类特征转换成数字表示

在开始转换数据之前,确定您正在处理的要素是否是有序的(相对于名义的)非常重要。有序特征最好描述为具有自然有序类别的特征,类别之间的距离未知

一旦你知道你正在处理什么类型的分类数据,你就可以选择一个合适的转换工具。在 sklearn 中,将有一个用于序数数据的 OrdinalEncoder ,以及一个用于名义数据的 OneHotEncoder

让我们考虑一个简单的例子来演示这两个类是如何工作的。创建一个具有五个条目和三个特征的数据框架:性别血型教育程度

X = pd.DataFrame(
    np.array(['M', 'O-', 'medium',
             'M', 'O-', 'high',
              'F', 'O+', 'high',
              'F', 'AB', 'low',
              'F', 'B+', np.NaN])
              .reshape((5,3)))X.columns = ['sex', 'blood_type', 'edu_level']

查看数据框架,您应该注意到教育水平是唯一的顺序特征(可以排序,类别之间的距离未知)。我们将从用 OrdinalEncoder 类编码这个特性开始。导入该类并创建一个新实例。然后通过将该特征拟合并转换到编码器来更新教育水平特征。结果应该如下所示。

from sklearn.preprocessing import OrdinalEncoderencoder = OrdinalEncoder()X.edu_level = encoder.fit_transform(X.edu_level.values.reshape(-1, 1))

注意这里我们有一个相当烦人的问题:我们丢失的值被编码成一个单独的类(3.0) 。仔细阅读文档可以发现,这个问题还没有解决方案。一个好的迹象是, sklearn 开发者正在讨论实现一个合适的解决方案的可能性。

另一个问题是我们的数据顺序没有得到尊重。幸运的是,这可以通过将特性的唯一值的有序列表传递给类别参数来解决。

encoder = OrdinalEncoder(categories=['low', 'medium', 'high'])

要解决第一个问题,我们必须求助于熊猫。因式分解方法提供了一种替代方法,可以处理缺失值并尊重我们的值的顺序。第一步是将特征转换为有序熊猫分类。传递一个类别列表(包括缺失值的类别)并将有序参数设置为

cat = pd.Categorical(X.edu_level, 
                     categories=['missing', 'low', 
                                 'medium', 'high'], 
                     ordered=True)

缺失类别替换缺失值。

cat.fillna('missing')

然后,将分类参数设置为分类进行因式分解,并将输出分配给教育水平特征。

labels, unique = pd.factorize(cat, sort=True)X.edu_level = labels

这一次的结果更令人满意,因为数据是数值型的,仍然是有序的,缺失值被替换为 0。请注意,用最小值替换缺失值可能并不总是最佳选择。其他选项是将其放在最常见的类别中,或者在特征分类时将其放在中间值的类别中

现在让我们转向另外两个,名义特征。请记住,我们不能用数字来代替这些特征,因为这意味着这些特征是有顺序的,这在性别或血型的情况下是不正确的。

最流行的标称特征编码方式是一次热编码。本质上,具有 n 个类别的每个分类特征被转换成 n 个二元特征

让我们看一下我们的例子,把事情弄清楚。首先导入 OneHotEncoder 类,并创建一个新实例,将输出数据类型设置为 integer。这不会改变我们的数据将如何被解释,但会提高我们输出的可读性。

然后,拟合并转换我们的两个名义范畴。这个转换的输出将是一个稀疏矩阵,这意味着我们必须将矩阵转换成一个数组()。toarray() )才能将其倒入数据帧中。当初始化一个新的类实例时,可以通过将稀疏参数设置为来省略这个步骤。分配列名,输出就可以添加到其他数据中了( edu_level 特性)。

from sklearn.preprocessing import OneHotEncoderonehot = OneHotEncoder(dtype=np.int, sparse=True)nominals = pd.DataFrame(
    onehot.fit_transform(X[['sex', 'blood_type']])\
    .toarray(),
    columns=['F', 'M', 'AB', 'B+','O+', 'O-'])nominals['edu_level'] = X.edu_level 

将输出(名词)与我们的原始数据进行比较,以确保一切都以正确的方式进行。

Encoded data versus original data

因为我们的数据中没有丢失值,所以说明如何用onehotencode处理丢失值是很重要的。丢失的值可以很容易地作为一个额外的特性来处理。注意,要做到这一点,您需要首先用一个任意值替换丢失的值(例如,‘missing’)如果您另一方面想忽略丢失的值并创建一个全为零的实例( False ),您只需将 OneHotEncoderhandle _ unknown参数设置为 ignore

数字特征

就像分类数据可以被编码一样,数字特征可以被“解码”成分类特征。最常见的两种方法是离散化二值化

[数]离散化

离散化,也称为量化或宁滨,将连续特征分成预先指定数量的类别(箱),从而使数据离散。

离散化的主要目标之一是显著地减少连续属性的离散区间的数量。因此,为什么这种转换可以提高基于树的模型的性能。

Sklearn 提供了一个 KBinsDiscretizer 类来处理这个问题。您唯一需要指定的是每个特征的面元数量(n _ 面元)以及如何对这些面元进行编码(序数一个热点一个热点密集)。可选的策略参数可以设置为三个值:

  • 统一,其中每个特征中的所有箱具有相同的宽度。
  • *分位数(*默认),其中每个特征中的所有条柱具有相同的点数。
  • k 均值,其中每个箱中的所有值都具有相同的 1D k 均值聚类的最近中心。

小心选择策略参数很重要。例如,使用统一策略对异常值非常敏感,会使您最终得到只有几个数据点的条柱,即异常值。

让我们转向我们的例子来进行一些澄清。导入 KBinsDiscretizer 类并创建一个新实例,该实例具有三个 bin、序号编码和统一策略(所有 bin 都具有相同的宽度)。然后,拟合并转换我们所有原始的、缺失的指标和多项式数据。

from sklearn.preprocessing import KBinsDiscretizerdisc = KBinsDiscretizer(n_bins=3, encode='uniform', 
                        strategy='uniform')disc.fit_transform(X)

如果输出对您没有意义,调用离散化器(圆盘)上的 bin_edges_ 属性,看看这些面元是如何划分的。然后尝试另一种策略,并查看面元边缘如何相应地变化。

Discretized output

二值化

特征二值化是对数字特征进行阈值处理以获得布尔值的过程。或者换句话说,基于阈值给每个样本分配一个布尔值()。注意,二进制化是二进制离散化的极端形式。

总的来说,二值化作为一种特征工程技术是有用的,用于创建新的特征来表示有意义的东西。就像上面提到的缺失指示器用来标记有意义的缺失值。

sklearn 中的二进制化器类以非常直观的方式实现二进制化。您需要指定的唯一参数是阈值复制。所有低于或等于阈值的值被替换为 0,高于阈值的值被替换为 1。如果复印设置为,则执行原位二值化,否则进行复印。

考虑我们示例中的特征 3 ( f3 ),让我们创建一个额外的二元特征,对于正值使用,对于负值使用。导入二进制化器类,创建一个阈值设置为零的新实例,并复制到 True 。然后,将二进制化器安装并转换到*特征 3。*输出是一个带有布尔值的新数组。

from sklearn.preprocessing import Binarizerbinarizer = Binarizer(threshold=0, copy=True)binarizer.fit_transform(X.f3.values.reshape(-1, 1))

定制变压器

如果您想将现有的函数转换成转换器,以帮助数据清理或处理,您可以使用 FunctionTransformer 从任意函数实现转换器。如果你正在使用 sklearn 中的管道,这个类可能会很有用,但是可以很容易地通过将 lambda 函数应用到你想要转换的特征来替换(如下所示)。

from sklearn.preprocessing import FunctionTransformertransformer = FunctionTransformer(np.log1p, validate=True)transformer.fit_transform(X.f2.values.reshape(-1, 1)) #same outputX.f2.apply(lambda x : np.log1p(x)) #same output

特征缩放

预处理管道中的下一个逻辑步骤是缩放我们的特征。在应用任何缩放变换之前,将你的数据分成一个训练集和一个测试集是非常重要的。如果您之前就开始缩放,您的训练(和测试)数据可能会围绕一个平均值(见下文)进行缩放,而这个平均值实际上并不是训练或测试数据的平均值,从而忽略了您最初缩放的全部原因。

标准化

标准化是一种转换,通过移除每个特征的平均值来集中数据,然后通过将(非恒定)特征除以它们的标准偏差来缩放数据。标准化数据后,平均值为零,标准偏差为一。

标准化可以极大地提高模型的性能。例如,学习算法的目标函数中使用的许多元素(如支持向量机的 RBF 核或线性模型的 l1 和 l2 正则化子)假设所有特征都以零为中心,并且具有相同顺序的方差。如果某个特征的方差比其他特征的方差大几个数量级,那么它可能会主导目标函数,使估计器无法像预期的那样正确地从其他特征中学习。

根据你的需求和数据,sklearn 提供了一堆定标器:标准定标器最小最大定标器最大最小定标器鲁棒定标器

标准缩放器

Sklearn 它的主定标器 StandardScaler 使用一个严格的标准化定义来标准化数据。它通过使用以下公式纯粹地将数据居中,其中 u 是平均值, s 是标准偏差。

x _ scaled =(x-u)/s

让我们看看我们的例子,看看这在实践中。在我们开始编码之前,我们应该记住我们的第四个实例的值是缺失的,我们用平均值代替了它。如果我们在上面的公式中输入平均值,标准化后的结果应该为零。我们来测试一下。

导入 StandardScaler 类并创建一个新实例。请注意,对于稀疏矩阵,您可以将 with_mean 参数设置为 False 以避免数值集中在零附近。然后,将定标器安装并转换至特征 3

from sklearn.preprocessing import StandardScalerscaler = StandardScaler()scaler.fit_transform(X.f3.values.reshape(-1, 1))

不出所料,第四个实例的值为零。

Ouput of standard scaling feature 3

最小最大缩放器

最小最大缩放器通过将每个特征缩放到给定范围来变换特征。该范围可以通过指定特征范围参数来设置(默认为 (0,1) )。此缩放器更适合非高斯分布或标准偏差非常小的情况。然而,它对异常值很敏感,所以如果数据中有异常值,你可能需要考虑另一个缩放器。

x _ scaled =(x-min(x))/(max(x)-min(x))

导入和使用最小最大缩放器的工作方式与标准缩放器完全相同——就像下面所有的缩放器一样。唯一的区别在于启动新实例时的参数。

这里我们将特征 3 ( f3 )缩放到-3 和 3 之间的比例。正如所料,我们的最大值( 25 )被转换为 3,最小值(- 1 )被转换为-3。所有其他值在这些值之间线性缩放。

from sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler(feature_range=(-3,3))scaler.fit_transform(X.f3.values.reshape(-1, 1))

Feature 3 before and after applying the MinMaxScaler

MaxAbs 定标器

maxabscaler的工作方式与 MinMaxScaler 非常相似,但会根据绝对最大值自动将数据缩放至 [-1,1] 范围。该缩放器用于已经以零为中心的数据或稀疏数据。它不会移动/居中数据,因此不会破坏任何稀疏性。

x_scaled = x / max(abs(x))

让我们再次使用maxabscaler特性 3 进行转换,并将输出与原始数据进行比较。

from sklearn.preprocessing import MaxAbsScalerscaler = MaxAbsScaler()scaler.fit_transform(X.f3.values.reshape(-1, 1))

Feature 3 before and after applying the MaxAbsScaler

鲁棒定标器

如果您的数据包含许多异常值**,使用数据的平均值和标准偏差进行缩放可能不会很好。在这些情况下,您可以使用鲁棒定标器移除中间值,并根据分位数范围缩放数据。文档中没有规定鲁棒定标器的确切公式。如果你想要完整的细节,你可以随时查看源代码。**

默认情况下,缩放器使用四分位数范围(IQR),即第一个四分位数和第三个四分位数之间的范围。当启动鲁棒定标器的新实例时,可以通过指定 quantile_range 参数来手动设置分位数范围。这里,我们使用从 10%90% 的分位数范围来变换特征 3

from sklearn.preprocessing import RobustScalerrobust = RobustScaler(quantile_range = (0.1,0.9))robust.fit_transform(X.f3.values.reshape(-1, 1))

正常化

归一化是指将单个样本缩放至单位范数的过程。基本上,当算法根据数据点之间形成的加权关系进行预测时,您需要对数据进行规范化。将输入缩放到单位规范是文本分类或聚类的常见操作。

缩放(例如标准化)和规格化之间的一个关键区别是规格化是一个行操作**,而缩放是一个列操作。**

虽然有许多其他方法来归一化数据,但是 sklearn 提供了三个范数(与单个值进行比较的值): l1l2max 。创建规格化器类的新实例时,可以在规格化参数下指定所需的规格化。

下面,可用范数的公式将在 Python 代码中讨论和实现——结果是数据集 X 中每个样本的分母列表。

马克斯

最大值范数使用绝对最大值,对样本的作用与最大值缩放器对特征的作用相同。

x_normalized = x / max(x)

norm_max = 
list(**max**(list(abs(i) for i in X.iloc[r])) for r in range(len(X)))

l1 '

l1 范数使用所有值的总和作为,因此给予所有参数相等的惩罚,加强稀疏性。

X _ 规格化= x / sum(X)

norm_l1 = 
list(**sum**(list(abs(i) for i in X.iloc[r])) for r in range(len(X)))

l2 '

l2 范数使用所有平方值之和的平方根。这创建了平滑和旋转不变性。一些模型,如 PCA,假设旋转不变性,因此 l2 将执行得更好。

X _ normalized = X/sqrt(sum((I * * 2)for I in X))

norm_l2 = 
list(math.sqrt(sum(list((i**2) for i in X.iloc[r]))) 
 for r in range(len(X)))

——请随时在评论中或私信中告诉我任何不一致或错误。—

来源

** [## 4.3.预处理数据-sci kit-学习 0.20.1 文档

例如,学习算法的目标函数中使用的许多元素(如支持向量机的 RBF 核…

scikit-learn.org](scikit-learn.org/stable/modu…) [## 规范化数据-人工智能系列的第一部分

与 nave en(Skcript 的 AI Dev)合著。在机器学习中,更多的时候是不对数据应用算法…

swaathi.com](swaathi.com/2017/04/29/…) [## 人工智能神经网络常见问题,第 2 部分,共 7 部分:学习部分——我是否应该标准化/规范化/重新调整

人工智能神经网络常见问题,第 2 部分,共 7 部分:学习部分——我是否应该标准化/规范化/重新调整

人工智能神经网络常见问题,第 2 部分,共 7 部分:学习部分——我应该标准化/规范化/重标 thewww.faqs.org 吗](www.faqs.org/faqs/ai-faq…) [## 使用 Python 的机器学习食谱

量化数据是对某些东西的度量——无论是班级规模、月销售额还是学生成绩。自然的方式…

www.oreilly.com](www.oreilly.com/library/vie…) [## 如何使用 Scikit-Learn 为 Python 中的机器学习准备数据

许多机器学习算法会对你的数据做出假设。在…中准备数据通常是一个非常好的主意

machinelearningmastery.com](machinelearningmastery.com/prepare-dat…) [## 标准化还是常态化?Python 中的示例

一个常见的误解是,什么是标准化数据以及何时标准化数据与标准化日期之间的区别。

medium.com](medium.com/@rrfd/stand…) [## 使用 scikit-learn 扩展功能

在这篇文章中,我们探索了 scikit-learn 中实现的 3 种特征缩放方法:标准缩放器假设…

benalexkeen.com](benalexkeen.com/feature-sca…)**

用数据保护我们更好的立法者

原文:towardsdatascience.com/preserving-…

你有最喜欢的国会议员吗?在一个支持率非常低的机构中,人们倾向于喜欢他们当地的联邦立法代表。我的情况也不例外;我也开始钦佩我在当地的代表,Ileana Ros-Lehtinen。

除了地区问题,她在拉丁美洲问题上的立法记录给我留下了特别深刻的印象。作为第一位当选国会议员的拉美裔女性,她对外交政策产生了兴趣,并加入了美国众议院外交事务委员会。她作为被卡斯特罗驱逐出古巴的古巴人的背景影响了她的问题观点,但这从未妨碍她在支持拉丁美洲的和平与民主方面有着完美的记录。作为一名哥伦比亚人,我注意到她在 90 年代末帮助控制国家的努力。后来,在国会山工作时,我目睹了她争取国会支持反对委内瑞拉萌芽中的查韦斯/马杜罗独裁政权。类似的行动发现在联邦记录尼加拉瓜,厄瓜多尔等。

众议员 Ros-Lehtinen 将在国会本届会议后退休。作为一个国家,我们将非常怀念她在政治舞台上充满激情的声音和合群的个性。更重要的是,这留下了一个问题:她的追随者会如何看待她的遗产。在这篇文章中,我将利用数据科学为维护她的理想贡献我的一粒沙子。

This is retiring member Ileana Ros-Lehtinen. She has an even happier aura in person.

该项目旨在预测一名长期任职的国会议员退休后将如何投票表决未来的立法。通过使用她在过去 4 届国会会议期间在委员会中发起的法案,我将创建一个预测模型,该模型将输出一个逻辑答案,即在给定文本的情况下,众议员 Ros-Lehtinen 是否会对法案进行投票。

为了利用文本作为特征,我对账单文本执行了计数矢量化以提取特征。这一过程需要做出许多关键决策,例如对计数矢量化结果进行词汇化时丢失的上下文,以及除 NLTK 的“英语”集合中的标准之外的停用词的选择。在适当的时候,我们将法案中的标准语言和法案文本中更具程序性的语言纳入到停用字词阈值中。

计数矢量化的结果数据框将使用 XGBoost 和 Logislitc 回归进行建模,目的是在信号太弱时使用增强方法。

数据字典和清理

这些数据主要是从他们现在已经废弃的(至少是数据部门)阳光基金会美国政府出版办公室ProPublica 收集的。

我从阳光基金会刮出了一份从 2009 年到现在提交给美国众议院外交事务委员会(委员会)的所有法案的清单。在 scrape 中,我保留了几个有助于识别账单的变量,包括计数矢量化的潜在目标,比如账单标题和昵称。

使用账单标识信息,我构建了第二个 scraper,它将迭代第一个 scraper 以获取账单信息,从而从 GPO 下载账单文本。

最后,我使用来自阳光基金会的委员会特定法案的信息来解析 ProPublica 的法案记录。从那里我收集了众议员 Ileana Ros-Lehtinen 赞助或共同赞助的条目。我选择了赞助而不是投票,因为赞助比投票更常见,因为少量的提案会得到投票的考虑。这也表明了个人对拟议立法的语言和内容的更多承诺。

获取必要的数据后,接下来的步骤是为计数矢量化做准备。该法案的文本有很多格式,以纠正空白,并选择该法案的最有用和独特的部分。在运行计数矢量器之前,数据被分离出来,只包含文本和 Ros-Lehtinen 的投票记录。

此时,我执行了一次训练、测试分割,并继续进行数据的计数矢量化。

下图只是字数统计;我分享是因为我觉得很有趣,最常见的话基本上是告诉国务卿该做什么。

Keeping SoS busy

特征和模型选择

鉴于项目的范围和我收集的数据,我选择了以下特征来构建模型。

主要特征是应用于账单文本语料库的词汇化计数 Verctorization 的结果。所使用的案文正文被删除了法案的序言(包括提案国和共同提案国,以及将法案提交委员会的程序),以及诸如符号和章节编号等非文字部分。除了计数矢量化之外,我还使用虚拟变量来表示条目是哪种法规(HR、HRES、S 等。).

当然,回应变量是众议员罗斯-莱蒂宁的一个衡量标准。然而,考虑到提交给委员会的法案和正在进行表决的法案之间的交集非常少,我不得不使用一个不同的参数。为此,我选择提案或共同提案一项法案。因此,响应类的数量上升到数据的大约 15%。使用这个标准还可以防止我错过以语音投票形式出现的数据点。口头投票在普遍认可的立法中很常见,反对党有义务要求投赞成票和反对票,以便将这些投票立场纳入联邦登记册。

为了解决班级失衡问题,我所做的最积极的决定是增加我的积极回应,以匹配我的消极回应。我通过替换重采样和设置参数来实现这一点,这样每个类平均分为 2150 个条目。在使用这个数据集构建模型之后,我将恢复到最初的数据集,并在模型中运行它。基于此的报告将是我的模型评分的一部分。

A reminded of how, and in which order, to deal with highly unbalanced classes, courtesy of the one and only Chris Albon. If his website is not among your most visited, make it a thing.

有了我的数据和响应变量,我建立了几个分类模型,看看哪种算法最能突出我的响应变量。

结果

即使有模型和矢量器组合的排列数,模型也难以获得高于 60%的 AUC 分数。使用计数矢量器、TFIDF 矢量器以及 KNeighbors、逻辑回归、Bernoulli 朴素贝叶斯、多项式朴素贝叶斯、XGBoost 和 Random Forest 模型,我寻找可能的最佳评分模型。准确性总是很高,但是根据混淆矩阵和 AUC 评分,模型不断将结果偏向非常低的阳性预测数。

经过上述的上采样后,我的模型的结果得到了改善。当我在 upsampled-made 模型中传递原始数据时,我发现**精确度和计算效率的最佳平衡是对 TF-IDF 矢量化文本运行逻辑回归。**XGBoost 模型的结果也显示了类似于逻辑回归的前景,但不足以证明其缓慢的表现。

所选逻辑回归模型的最终交叉验证准确度和 AUC 度量为 82%准确度和. 69% AUC。我感到矛盾,因为这略低于我所声明的达到. 70 AUC 分数的目标,但精度远远高于我的原始目标,我觉得概念证明已经实现,并需要使用更合适的自然语言处理工具进行进一步开发。

A model feature importance; for those who are curious about which terms mattered most.

估价

在投票行为并不总是被记录的议会系统中,预测投票行为的任务是棘手的。此外,立法通常由工作人员以历史悠久的方式构建,因此减少了文本矢量器在预测投票成员的感受或风格方面的影响。然而,我确实相信,在对文本的分析中,有足够的信号表明他们将支持什么样的立法。

在具体参考我的结果和评估我的实验时,我对我的目标变量中的积极响应的低召回值感到担忧。该模型对比尔赞助回忆的得分为 0.45,这确实给我的结果和断言蒙上了一层阴影,但我相信其他 NLP 工具将有助于纠正这一错误。

Final results of my original data when applied to the models made with upsampled dataset. The model was a logistic regression with a TF-IDF vectorization.

随后的分析将加深对基于立法文本的投票行为的理解,该分析将运行无监督学习算法,例如 LDA。将这个项目的模型和 LDA 部署为一个集成系统是不可能的,但它将深化主题专业知识,并为未来的模型开发提供见解。

最后的想法

我将继续致力于这个项目,以更好地预测投票/赞助行为。我还有本届国会会议的剩余时间来进一步测试这个模型;更确切地说是拉丁美洲的钞票,这也是这个项目最初的预期。我还将制作一个针对具体问题划分的法案子集,看看我的模型在某些子集上是否更好。

从文本分析的角度看媒体吹风会:川普总统与中国习主席的会晤

原文:towardsdatascience.com/press-brief…

特朗普总统和中国总理 Xi 上周在美国的会晤是全世界关注和报道的最重要事件之一。会后,白宫博客发布了秘书们关于这次会议的简报,可以在这个公共领域找到。

首先,当你阅读时,我觉得新闻发布会是一个相当长的内容,因为峰会的复杂性和重要性。其次,一些关键的含义可能隐藏到普通人的眼睛和头脑才能理解。所以,这里有一个基于文本分析的方法,我用它来从简报中理解会议的重要性。

进场:

我首先将新闻简报的内容(不包括问题)分成三个部分,这三个部分可以提供过去、现在和未来的线索。然后,我查看具体的上下文,如找到重要的单词、语言风格、情感等,以获得更好的理解。

在这篇文章中,我将只涉及我观察到的现在和未来的相关方面。整个发现和观察对我来说花了大约 30 分钟,使用了我在公司建立的技术框架,并基于我从经验中使用的特定技术。

文本分析

文本发现到现在的语境

*正如在座各位所知,今天显然是一个完美的天气,这对夫妇来说是一个很好的机会,可以真正了解彼此,享受,一起用餐,并就重要问题开展工作。 *当然,我们在这里有代表,他们也能够为我们未来的许多工作建立重要的关系。我想我真正想让你了解的是,两位领导人之间的气氛和化学反应是积极的。 *因此,我认为我们所有人都对本次峰会的成果感到非常满意,因为它为未来奠定了非常有建设性的基调。 *双方注意到了朝鲜武器计划威胁的紧迫性,重申了 *我认为,从他们的角度来看,他们都认为朝鲜核能力的发展已经到了非常严重的阶段。但是为了实现这一点,朝鲜的姿态必须改变,才有对话或讨论的基础。

文本发现到未来语境

*我会先说总统非常高兴在 Mar-a-Lago 主持这两天。正如在座的各位所知,今天显然是一个完美的天气,这对总统和他们的妻子来说是一个很好的机会,可以真正了解彼此,享受,一起用餐,并就重要问题开展工作。 *我可以告诉你,交流是非常坦率的。两国总统回顾了双边关系的现状,并指出共同努力取得有益于两国公民的积极成果的重要性。 *总统强调了采取具体措施为美国工人创造公平竞争环境的必要性,反复强调了互惠市场准入的必要性。 *没有讨论过解决这个问题的一揽子安排。他们讨论了给两国带来的挑战,但是我们有一个真正的承诺,那就是共同努力,看看这个问题是否能以和平的方式解决。 *但为了实现这一目标,朝鲜必须改变姿态,才有对话或讨论的基础。 *川普向习主席表示,他欢迎习主席和中国关于我们可以采取的其他行动的任何想法,我们很高兴与他们合作,但我们知道这对他们造成了独特的问题和挑战,如果这是我们无法协调的事情,我们将准备好规划我们自己的道路。他们致力于朝鲜半岛无核化,并致力于全面执行联合国安理会决议。

接下来,参照会议的当前语境,让我们看看动作动词、语境词、语言风格、情绪和情感

动作动词(现在&未来语境)

  • 现在动作动词单词**‘Have’指向朝鲜(对象)的武器和姿势的拥有,单词‘Think’**指向表达对峰会的看法或印象。所以,从主观上来说,这表明当前峰会的背景与朝鲜有关,反映了对峰会/其目标的看法。
  • 接下来,与将来动作动词相关的语境词指向 【变化】 朝鲜现在的姿态中预期的方面、**【解决】朝鲜问题。为美国工人创造一个' '平等' '的竞争环境, 【采取】 基于双方想法的行动,以及【产生】**共同努力的积极成果..

所以现在到未来的语境从**‘思考’的世界转移到‘表演’**

在当前和未来方面发现的重要术语:

下面显示了我应用算法从过去和未来时态文本内容中发现重要术语而生成的单词云。单词的大小表示在上下文中与其他单词的相对重要性。

  • 目前的背景表明了朝鲜姿态的重要性,以及通过此次会议解决除峰会环境问题之外的其他问题的大好机会。
  • 未来的背景很有趣。它指出,与中国合作的经济、市场方面/增长与通过联合国安理会决议实现朝鲜半岛无核化同等重要。

简报的语言风格和情感基调

  1. 当前上下文

语言风格:理性(83%)和自信(90%) **情感基调:**喜悦(58%)、厌恶(50%)显著 *语言的这种高度逻辑推理和确定性取向,表明简报中的事实和确信的可能性较高。然后,积极和消极情绪的存在都有快乐的阴影,以及对与朝鲜方面有关的东西的厌恶和反感。快乐是拥抱机会,厌恶是摆脱或驱逐武器场景。

2。未来背景

语言风格:理性(64%)。肯定的或试探性的感觉——:不存在 **情绪基调:**喜悦(59%)、悲伤(53%)是显著的 *逻辑推理表明陈述中的分析取向,而不是含糊或猜测的工作类陈述。那么积极情绪和消极情绪的存在就有快乐和悲伤的阴影。(具有相反极性的情感)。快乐意味着通过联合关系活动实现或获得利益的机会,而悲伤则是需要“做出改变”才能变得快乐的方面的指示器。悲伤是一种长期的情绪,而愤怒或厌恶则有短期的倾向。因此,这种情绪为可能必须做出的重大改变/行动提供了线索,以实现长期目标(参考上面的词语云:互惠市场行动、双边关系、遵守安全理事会决议)

摘要

文本分析有助于为这样的新闻简报文档带来不同的视角,并获得更好的见解。关于内容的分析,

  • 从简报中发现的当前背景为峰会有关两国合作和朝鲜问题的**“思考/焦点”**方面提供了线索。
  • 发现的未来背景为与市场/经济增长相关的**【行动要点】**提供线索,期望改变朝鲜半岛的安全局势,并致力于双边关系。

更新:4 月 11 日- 今天看到这条新闻很有趣中国将派遣 15 万军队应对可能出现的情况。

声明: 此处提及的观点均为本人观点。 本文使用的数据来自公共领域的可用信息。但对其准确性、完整性、及时性或正确性不做任何明示或暗示的陈述或保证。我不对任何错误或不准确负责,不管是什么原因造成的。(读者)。

用 Python 假装了解 NBA

原文:towardsdatascience.com/pretending-…

如何在不剥夺睡眠的情况下跟踪每年 1300 场 NBA 比赛?在NBA . papiotis . info查看结果,如果你对背景故事感到好奇,请继续阅读。

我从来都不是一个喜欢运动的人。正如大多数认识我的人可能猜到的那样,我更喜欢坐在电脑前,试图解决一些(自己造成的)编程难题,或者玩视频游戏。事实上,我作为一个“体育迷”的第一次经历是关注 DOTA2 电子竞技,也就是说,看人们玩电子游戏比我玩得好得多。

The Greek Freak casually flying over a 1.98m man.

然而,在 2018 年初,我的注意力被篮球神童扬尼斯·阿德托昆博(又名希腊怪胎)所吸引。对于那些不了解他的人来说,詹尼斯是一名尼日利亚血统的希腊篮球运动员,23 岁的他正在 NBA 掀起巨大的涟漪。詹尼斯在雅典艰难的条件下(轻松地说)成长,进入 NBA,并以其令人难以置信的运动能力成为联盟中最好的球员之一,不断给球迷和分析师带来惊喜,这真的激励我去了解更多关于他的进步。

当然,这意味着我必须了解 NBA 是如何运作的,更重要的是,找到一种方法来跟踪每个赛季大约 1300 场比赛。让我们暂时记住这个数字: 1300。火柴。这还没有考虑到这样一个事实,对于生活在西欧的人来说,大多数比赛都在 02:00 到 04:00 之间开始——这不是一个理想的场景,除非你是一个失眠症患者。

所以,我找到了一个新的标题:一个简单、容易理解的 NBA 比赛摘要,人们可以简单地浏览一下,并立即感受到比赛的进展。

外面有什么

在深入研究原型制作之前,我想先了解一下已经可用的东西——还有什么比直接找到来源更好的方法呢:NBA 自己的统计页面

Thanks NBA, I totally understand all of these.

现在,让我澄清一下:我很感谢 NBA 统计页面。它本质上是一个开放的海量数据存储库,任何人都可以通过各种方式进行咨询,以获得关于这个季节的深入信息。但是你知道 NBA 的统计页面有什么不好吗?

新人。

NBA 统计页面充斥着带有神秘缩写名称的统计数据,对于新人来说,这根本不是一个了解昨晚比赛的好地方。甚至每场比赛的盒子分数(结果总结)也向你显示了最终分数,每个季度末的分数,然后是一系列我的 NBA 新手大脑无法处理的数字和字母。

Me trying to understand the stats page for a single match.

当然,最后的分数可以告诉你谁赢了,但是每天有 5-10 场比赛,那只是一个数字。它不会告诉你这场比赛是否有趣到足以让你去看视频集锦或者看完整场比赛;它没有传达很酷的故事情节,比如一个队在整场比赛落后后在最后一分钟获胜。

浏览了一下,我发现了一些更好的选择,如爆米花机的 GameFlow 或 basketball-reference.com 的。这些更受欢迎,传达了游戏进展的感觉,但仍然充满了我无法理解的统计数据,在我看来,有点刺眼。

Popcorn Machine’s GameFlow: much better, but still too ‘stats-y’ for my taste.

因此,基于我自己的需求和对当前产品的想法,我开始为我想做的东西确定一些要求:

  • **简单。**没有统计数据,没有深入的信息。反正我是不会理解的(至少在那一点上不会)!如果有人想找到详细的统计数据,已经有很多很好的选择。
  • 目测。只要看一眼摘要就能知道比赛中发生了什么。此外,最终结果应该是光滑和悦目的,因为这个想法是每天检查多个摘要。
  • 互动。由于把可视化做得太简单,我冒了让它变得肤浅和无趣的风险。交互性可以让我为用户增加一些额外的奖励,而不用一开始就把它推到他们面前。

我做了什么

最终结果可在 nba.papiotis.info 获得。它看起来是这样的:

Example visualization for a match. The difference in score is plotted as a line along time, with markers for each successful shot. The color of the line and markers change according to which team is ahead at any given moment.

你可以从日历中选择一个日期,下拉菜单会列出该日期的所有 NBA 比赛**。选择一个匹配项会在下面显示出来。为了方便起见,当您第一次打开页面时,会自动选择最近的匹配项,这样就可以很容易地快速查看最新的匹配项,如果您想赶上进度,还可以返回旧的匹配项。**

可视化本身是一条线代表两队之间的比分差异,每一次成功射门都有标记。我决定使用分数差,因为这样很容易看出谁领先,以及领先多少。这样,一条在整场比赛中始终高于零的线显示了一场一边倒的比赛,主队在整场比赛中占据主导地位;相反,一条不断在零附近振荡的线表明比赛很接近,两队都没有取得绝对领先。为了避免混淆图的哪一侧对应于哪支球队,每支球队的标志都显示在图的右侧。

An eventful first period in the Timberwolves vs. Pacers match from 22/10/2018.

线和标记的颜色会随着时间的推移而变化,这取决于哪支球队领先,通过查看可视化标题,您可以快速看出哪种颜色对应于哪支球队——在左侧的示例中,明尼苏达森林狼队主场迎战印第安纳步行者队。看看这条线的颜色是如何渐变的,从蓝色(森林狼领先),到绿色(比分扳平),最后是黄色(步行者领先)。

如前所述,你可以看到圆形标记,表示每一个成功的拍摄。将鼠标悬停在这些标记上方会给出每个事件的简短描述,如下图所示:

Details about each successful shot are revealed by hovering over with the mouse.

悬停文本为您提供有关当前比分的信息,以及由 NBA API 自动生成的简短文本描述,例如:

格兰特 24 英尺 3 分跳投(8 分)(威斯布鲁克东部时间 4 分)

这告诉我们的是,三分跳投 距离 24 英尺远 把他的 总得分提高到了 8 。他是由助攻 的,包括这个传球在内,到目前为止在比赛中已经给了 4 次助攻 。**

简短的描述有助于快速获得所有必要的信息,而不必像上面的解释性句子那样阅读完整的句子,但它有点枯燥。来点赏心悦目的东西让事情变得更愉快怎么样?

到目前为止,您可能已经注意到,虽然所有的乐谱标记都是圆形的,但其中一些标记填充了颜色,而另一些标记是空的。这是因为点击满标记显示该特定镜头的视频高亮**!**

Clicking on a marker shows a video highlight, as well as a more-human readable description of that play.

**不幸的是,NBA 不会为每一个镜头提供精彩镜头,但平均来说,大约 60%的镜头都伴随着视频精彩镜头。此外,我还解析了短格式的文本描述,并将其转换为更容易阅读的句子,例如: X 在 y 的帮助下完成了转身跳投。这样您可以两全其美:悬停时的快速编码描述,以及点击时对该事件的更丰富的描述。

仅此而已!比赛每小时自动更新一次,当前可用的可视化比赛可以追溯到 2017-2018 赛季初。

我很乐意看到这对其他人有用,所以去 nba.papiotis.info/的[开始你的 NBA 吧!](nba.papiotis.info/)

可以添加一些很酷的额外功能

虽然快速赶上 NBA 比赛的基本目的已经包含在上面了,但是我不能停止想一些额外的东西&我可能会添加的新功能。以下是我目前为止的一些想法:

  1. 自动集锦卷 因为我已经有了一个及时订购的视频集锦列表,所以很容易添加一个“显示所有集锦”按钮,一个接一个地播放它们,以创建一个即兴的比赛集锦卷。
  2. 按关键词过滤事件 如果我能输入“Antetokounmpo dunk”或“Curry 3PT”就能看到詹尼斯扣篮或斯蒂芬·库里投进三分的所有瞬间,岂不是很酷?
  3. **分享比赛和/或集锦 有时我想分享一场特定的比赛,因为可视化真实地传达了它是如何来回的。或者,浏览视频集锦,看到一些只是很脏,需要分享的东西。我可以分享视频文件本身的链接,但是如果在 URL 栏中有一个显示页面当前状态的代码(比如/m = match id&h = highlight id)就更酷了,它可以立即被复制和分享。

当然,在我实际实现这些之前,它们都是科幻小说——也就是娱乐性的!所以,请在下面的评论中提出你想要的任何建议(或者给我发电子邮件),我们可以一起构思出最酷的 NBA 视觉化东西(但不保证会实现)。

**感谢阅读,

笔记

  1. 在美国体育运动中,传统上客场球队的名字排在第一位,主场球队的名字排在第二位,而在欧洲体育运动中,通常情况正好相反。在意识到这个小怪癖之前,我就开始以欧洲风格开发一切东西,并决定保持这种方式。
  2. 和大多数体育联赛一样,每支球队的特点是多达三种颜色**(主场、客场、替补);为了创造一个漂亮、突出的配色方案,我用 CIE94 公式为客队选择与主队主色最不一样的颜色。**

额外阅读:实现细节

还在读书?酷毙了。这里有一些关于技术部分的细节,以防你好奇。

我毫不怀疑,从一开始,这需要一个基于浏览器的原型。基于不断更新的在线数据的交互式可视化几乎注定要存在于浏览器中;智能手机应用程序是一个不错的选择,但这意味着一些样板文件和部署问题,我并不急于接受。另外,我想在大屏幕上欣赏这个。

现在,有很多开发环境可以开发基于浏览器的软件,但是 Python 几年来一直是我的个人爱好(对 @chaosct 大声喊出来,因为它把我推向了那个方向)。Python 使得在 Jupyter 笔记本中立即开始原型化和尝试不同的东西变得很容易,并且将原型的好的部分转移到部署就绪的解决方案中从来都不是一件痛苦的事情。几乎所有的东西都有记录良好且持续支持的库,还有一个很棒的开发者社区,他们乐于以可重用的方式分享他们的创作。

在用 Matplotlib 的交互模式和散景进行了一些快速研究和测试后,我最终决定使用 plot.ly 来创建可视化效果。大量的文档、示例及其绝对令人惊叹的姐妹框架 Dash 意味着我可以在一个生产就绪的 web 框架内创建强大的交互式可视化,该框架与我的所有其他 Python 代码配合良好,可以抓取、清理和检索匹配数据。

这就把我们带到了下一点:获取数据。NBA 提供了一个 RESTful API,包含每场比赛的统计数据,虽然数据丰富,但几乎没有文档。事实上,现存的少量文档是由与 NBA 无关的其他开发者提供的。我很幸运地发现了 nba_py,一个整洁的 NBA stats API 的小 python 包装器,它为 API 端点提供了一点文档,并与 Pandas 集成,这使得清理和组织数据变得轻而易举。

最大的挑战之一是 NBA 统计 API 在收集了几场比赛的数据后封锁了我的 IP 。NBA 禁止 IP 的方式是简单地让请求无限期挂起,这比得到 403 错误或类似的错误更令人讨厌——这样我就知道我被 IP 阻止了,而不是花大量时间调试,最终发现 NBA 对我冷淡。

除了在家里屏蔽我的个人 IP(没错,我自己不能访问 stats.nba.com),NBA stats API 还会自动屏蔽来自 AWS 或 GCP 等已知提供商的任何 IP。这是一个大问题——我应该在哪里主持这个东西,这样 NBA 就不会阻止它了?如果我把它放在某个地方,只刮了几根火柴就被屏蔽了呢?

最后,我用 Python 编写了一个代理旋转器,这样每个发送到 NBA stats API 的请求都来自不同的 IP。为了避免再次被封锁,我不会透露太多关于具体细节的信息,但如果你很好奇,可以在这里查看这类事情的演练:https://www . screphero . com/how-to-rotate-proxy-and-IP-addresses-using-python-3/

整个 shebang 托管在 Python Anywhere 上,使用起来超级简单,总体来说是一次非常愉快的体验。这项服务很便宜,设置只花了我 10 分钟,在少数情况下,我需要一些客户支持,他们反应很快,很友好。100%推荐!

这大概是对技术栈的总结。如果你对体育数据可视化感兴趣,我推荐 Perin 等人的这篇优秀的综述。

防止深度神经网络过拟合

原文:towardsdatascience.com/preventing-…

神经网络的秘密第二部分

Source

由于拥有大量的参数(数千个,有时甚至数百万个),神经网络有很大的自由度,可以适应各种复杂的数据集。这种独特的能力使他们能够接管许多在“传统”机器学习时代难以取得任何进展的领域,如图像识别、物体检测或自然语言处理。然而,有时他们最大的优势变成了潜在的弱点。对我们模型的学习过程缺乏控制可能会导致过度拟合的情况,当我们的神经网络与训练集如此接近,以至于很难对新数据进行归纳和预测。理解这个问题的根源和防止它发生的方法,是成功设计神经网络的关键。

**注:**本文是“神经网络的奥秘”系列的第二部分,如果你还没有机会,请阅读的开篇文章。在我的 GitHub 上可以找到用于创建本文中使用的可视化效果的源代码。

你怎么知道你的神经网络过度拟合?

培训、开发和测试设备

在实践中,检测我们的模型是否过度拟合是困难的。我们训练过的模型已经投入生产,然后我们开始意识到有问题,这种情况并不罕见。事实上,只有面对新的数据,你才能确保一切正常运行。然而,在训练过程中,我们应该尽可能地再现真实情况。**出于这个原因,将我们的数据集分成三个部分是一个很好的做法——训练集、开发集(也称为交叉验证或保留)和测试集。**我们的模型通过只看到第一部分来学习。Hold-out 用于跟踪我们的进度,并得出优化模型的结论。同时,我们在训练过程的最后使用测试集来评估我们的模型的性能。使用全新的数据可以让我们对我们的算法有多好有一个公正的看法。

Figure 1. Recommended method of dividing the data set.

确保您的交叉验证和测试集来自相同的分布,以及它们准确地反映了我们期望在未来收到的数据,这一点非常重要。只有这样,我们才能确信我们在学习过程中做出的决策会让我们更接近更好的解决方案。我知道你在想什么…“我应该如何划分我的数据集?”直到最近,最常推荐的拆分之一是 60/20/20,但在大数据时代,当我们的数据集可以计算数百万个条目时,那些固定的比例不再合适。简而言之,一切都取决于我们所处理的数据集的大小。如果我们有数百万个条目可供我们使用,那么将它们以 98/1/1 的比例划分可能会更好。我们的开发和测试集应该足够大,以使我们对模型的性能充满信心。根据数据集大小划分数据集的推荐方法如图 1 所示。

偏差和方差

T 感谢我们对数据的适当准备,我们给了自己评估模型性能的工具。然而,在我们开始得出任何结论之前,我们应该熟悉两个新概念——偏差和方差。为了让我们更好地理解这个有些多么复杂的问题,我们将用一个简单的例子,希望能让我们发展出一种有价值的直觉。我们的数据集由位于二维空间的两类点组成,如图 2 所示。

Figure 2. Visualization of the data set.

由于这是一个简单的演示,这次我们将跳过测试集,只使用训练集和交叉验证集。接下来,我们将准备三个模型:第一个是简单的线性回归,另外两个是由几个紧密连接的层构建的神经网络。如下图 3 所示。我们可以看到使用这些模型定义的分类界限。右上角的第一个模型非常简单,因此具有较高的偏向性,即它无法找到特征和结果之间的所有重要联系。这是可以理解的-我们的数据集有很多噪音,因此简单的线性回归不能有效地处理它。神经网络的表现要好得多,但第一个(显示在左下角)与数据拟合得太过紧密,这使得它在坚持集上的表现明显更差。这意味着它具有很高的方差——它符合噪声,而不符合预期输出。在上一个模型中,这种不良影响通过使用规范化得到了缓解。

Figure 3. Classification boundaries created by: top right corner — linear regression; bottom left corner — neural network; bottom right corner — neural network with regularisation

我知道,我知道……我举的例子很简单——我们只有两个特性,任何时候我们都可以创建一个图表,直观地检查我们模型的行为。当我们在多维空间中操作,数据集包含,比如说,几十个特征,该怎么办?**然后,我们比较使用训练集和交叉验证集计算的误差值。**当然,我们应该追求的最佳情况是这两个集合的低错误率。主要问题是定义什么是低错误率——在某些情况下,它可以是 1%,而在其他情况下,它可以高达 10%或更多。在训练神经网络时,建立一个基准来比较我们模型的性能是很有帮助的。这通常是人类执行这项任务的效率水平。然后,我们试图确保我们的算法在训练期间具有接近我们参考水平的误差。如果我们已经实现了这个目标,但是当我们在坚持集上验证它时,错误率显著增加,这可能意味着我们过度拟合(高方差)。另一方面,如果我们的模型在训练集和交叉验证上表现不佳,它可能太弱,有很高的偏差。当然,这个问题要复杂得多,范围也很广,可以作为单独一篇文章的主题,但是这些基本信息应该足以理解下面的分析。

防止过度拟合的方法

介绍

T 当我们的神经网络具有高方差时,这里有许多方法可以帮助我们。其中的一些,比如获取更多的数据,是相当通用的,每次都能很好的工作。其他的,比如正规化,需要很多技巧和经验。对我们的神经网络施加太多的限制可能会损害它有效学习的能力。现在让我们来看看一些最流行的减少过度拟合的方法,并讨论它们起作用的原因。

L1 和 L2 正规化

O 当我们需要减少过度拟合时,我们应该尝试的第一个方法是规范化。它涉及到在损失函数中增加一个额外的元素,这惩罚了我们的模型过于复杂,或者简单地说,在权重矩阵中使用了过高的值。这样我们试图限制它的灵活性,但也鼓励它基于多种特性构建解决方案。这种方法的两个流行版本是 L1 最小绝对偏差(LAD)和 L2 最小平方误差(LS)。下面给出了描述这些正则化的方程。

在大多数情况下,使用 L1 是更可取的,因为它将不太重要的特征的权重值降低到零,通常从计算中完全消除它们。在某种程度上,它是自动选择特性的内置机制。此外,L2 在含有大量异常值的数据集上表现不佳。值平方的使用导致模型以更受欢迎的示例为代价最小化离群值的影响。

现在让我们看看我们在偏差和方差的例子中使用的两个神经网络。其中一个,正如我前面提到的,我使用正则化来消除过度拟合。我发现这是一个有趣的想法,在三维空间中可视化权重矩阵,并比较正则化和非正则化模型之间获得的结果。我还使用正则化对许多模型进行了模拟,改变了 λ 值,以验证其对权重矩阵中包含的值的影响。(老实说,我这么做也是因为我觉得它看起来超级酷,我不想让你睡着。)矩阵行和列索引对应于水平轴值,权重被解释为垂直坐标。

Figure 4. Visualization of weighing matrix for models without and with regularization.

λ因子及其影响

在之前提到的 L1 和 L2 两个版本的正则化公式中,我引入了超参数λ——也称为**正则化率。**在选择其值时,我们试图在模型的简单性和使其适合训练数据之间找到平衡点。增加 λ 值也会增加正则化效果。在图 4 中。我们可以立即注意到,没有调节的模型和具有非常低的 λ 系数值的模型所获得的平面是非常“湍流”的。有许多具有重要值的峰值。在应用具有较高超参数值的 L2 正则化之后,图形变平。最后,我们可以看到,将 lambda 值设置为 0.1 或 1 左右会导致模型中权重值的急剧下降。我鼓励您检查用于创建这些可视化的源代码。

拒绝传统社会的人

另一种非常流行的神经网络正则化方法是放弃。这个想法其实很简单——我们神经网络的每一个单元(除了属于输出层的单元)都被赋予了在计算中被暂时忽略的概率 p 。超参数 p 被称为辍学率,通常其默认值被设置为 0.5。然后,在每次迭代中,我们根据分配的概率随机选择我们丢弃的神经元。结果,每次我们用一个更小的神经网络工作。下面的可视化显示了一个神经网络遭受辍学的例子。我们可以看到在每次迭代中,第二层和第四层的随机神经元是如何被去激活的。

Figure 5: Visualization of a dropout.

这种方法的有效性是相当令人惊讶和违反直觉的。毕竟,在现实世界中,如果工厂的经理每天随机挑选员工并让他们回家,工厂的生产率就不会提高。让我们从单个神经元的角度来看这个问题。由于在每次迭代中,任何输入值都可能被随机消除,神经元试图平衡风险,而不是偏向任何特征。结果,权重矩阵中的值变得更加均匀分布。该模型希望避免这样的情况,即它提出的解决方案不再有意义,因为它不再有来自非活动特性的信息。

提前停止

下图显示了在学习过程的后续迭代中,在测试和交叉验证集上计算的准确度值的变化。我们马上看到,我们最终得到的模型并不是我们可能创造的最好的。老实说,这比我们经历了 150 个时代还要糟糕得多。为什么不在模型开始过拟合之前中断学习过程?这一观察启发了一种流行的过拟合减少方法,即早期停止。

Figure 6. Change of accuracy values in subsequent epochs during neural network learning.

在实践中,每隔几个迭代就对我们的模型进行采样,并检查它与我们的验证集的工作情况,这是非常方便的。每一个比之前所有模型表现更好的模型都会被保存。我们还设置了一个限制,即没有进展被记录的最大迭代次数。超过该值时,学习停止。尽管早期停止可以显著提高我们模型的性能,但在实践中,它的应用会使我们模型的优化过程变得非常复杂。简直很难和其他常规技术结合。

结论

认识到我们的神经网络过度拟合的能力以及我们可以用来防止这种情况发生的解决方案的知识是最基本的。然而,这些都是非常广泛的主题,不可能在一篇文章中描述得足够详细。因此,我的目标是提供基本的直觉,让人们了解诸如正规化或辍学这样的把戏实际上是如何运作的。这些话题对我来说很难理解,我希望我帮助你解决了它们。如果你喜欢这篇文章,请在 TwitterMedium 上关注我,并在 GitHubKaggle 上查看我正在进行的其他项目。保持好奇!

防止机器学习偏差

原文:towardsdatascience.com/preventing-…

机器学习算法越来越多地用于围绕评估员工绩效和流动率、识别和防止累犯以及评估工作适用性做出决策。这些算法的规模很小,有时在充满高质量研究和工具的环境中开发起来也很小。不幸的是,这些算法没有阻止和自动化的一件事是,如何以一种不会导致偏见和负面自我强化循环的方式来构建你的数据和训练管道。这篇文章将涵盖使用偏差感知而不是盲目方法忠实消除算法偏差的解决方案。

Photo by moren hsu on Unsplash

为什么防止偏见很重要

来自算法的预测通常不会在真空中使用。相反,它们被用来驱动决策和优化某些结果。如果你处理的数据有一些固有的偏差,模型不仅会学习这些偏差,而且最终会放大它们。有了有偏见的数据,模型的结果将以自我实现的预言而告终,这在许多情况下会导致灾难性的后果。我不认为我能对人工智能中的道德话题给出足够的报道,因为我想提供更多实用的解决方案,告诉人们如何设计他们的训练管道,使其对偏见更加鲁棒。相反,我强烈推荐阅读来自 fast.ai 的 Rachel Thomas 的人工智能伦理资源,以获得关于该主题的更详细的讨论。

盲算法

从算法中移除偏差的最常见方法是显式移除与偏差相关的变量。例如,如果您想预测某个职位应该雇用谁,您可以包括相关的输入,如申请人拥有的技能和经验,并排除不相关的信息,如性别、种族和年龄。这种方法的问题在于它不起作用。您想要包含的一些变量会受到潜在输入的影响。换句话说,你不能一边说“让我们把种族从模型中排除”一边又包括另外二十个有助于编码某人种族的变量。我将提供两个像这样盲目的方法失败的例子。

亚马逊招聘

最近路透社报道亚马逊一直在试图开发一种工具来自动化简历筛选和招聘。这个项目不得不被取消,因为它显示出对女性的严重偏见。我相当肯定,从事该模型工作的工程师没有使用任何明确的变量来识别某人的性别。尽管如此,要消除该模型识别与性别相关的其他潜在变量的能力,并且不歧视简历中包含“女子象棋俱乐部队长”的求职申请,是一项挑战。换句话说,如果数据有偏差(在这种情况下很有可能出现这种情况),当给定一组大而全面的特征时,模型会找到一种方法来对该信息进行编码。

预测累犯

两年前,Pro Publica 为提供了一个很好的分析软件,用于预测累犯率。他们发现,嵌入该软件的模型在非裔美国人中的假阳性率比白人高得多。开发该软件的公司指出,他们用来评估一个人再犯风险的 137 个问题中没有一个将种族作为输入。尽管如此,如果你看一下问卷,不需要太多的洞察力就能注意到一些主题可能与种族相关,并在判断申请人的风险时鼓励偏见。例如,当你问某人他们的父母是否在成长过程中被分开,你是在间接地编码他们的种族。al,2015,来理解不同种族的离婚率有多么惊人的不同。这又是一个盲目的方法不起作用的例子,因为没有考虑到潜在的变量。

偏差感知算法

我建议我们反其道而行之,而不是去除与有偏见的结果直接相关的变量。换句话说,为了知道你的数据中存在多少偏差,你需要让你的模型正确地测量它,然后减去偏差对结果的影响。我将通过一个人为的模拟来检验这种技术的有效性。

我们的模拟数据将包含以下特征:性别(我们将关注大多数性别:男性和女性)、经验年限和职业(我们将关注两种职业,软件工程和咨询)。我们的目标是预测给定这些特征的人我们应该支付多少薪水。

我们的数据将具有以下关系:

  • 总的来说,工作年限和薪水之间有明显的正相关关系
  • 相对于做软件工程师来说,做顾问会让你赚更多的钱
  • 身为男性会比身为女性赚更多的钱
  • 我们要考虑几个关键的相互作用。在咨询行业,男性和女性的起薪相同,但男性的工资增长高于女性。换句话说,对于每一年的工作经验(或每一次晋升),男性的工资预期会增加
  • 在软件工程领域,女性从低端起步,然后必须经历一段时间的追赶

你可以在下面找到上面描述的所有关系。

请注意,我们有目的地创建一个“看起来”真实的场景,并描述不同层次的交互,因为我想展示偏见意识方法在推广到具有数百个变量和多层复杂性的问题时的优势。

为了消除数据中偏见的影响,我们需要建立一个忠实代表性别偏见的模型。在下面的代码中,我们有一个非常简单的训练管道来完成这个任务。

下面你可以在测试集上找到模型预测。正如你所看到的,这个模型概括得非常好,并且设法捕捉到了数据中所有的主要影响和相互作用。

接下来,我将提取特定于预测的相互作用,以消除它们的影响。在这种情况下,我使用的是 XGBoost ,它已经实现了Shapley Additive explain方法,这是一种在单个预测级别提取特征贡献的一致、快速和确定的方法。这个方法在其他流行的 boosting 库中已经可用,比如 CatBoost 和 LightGBM。如果你的预测中不存在决定论的问题,你也可以使用时间,或者如果你使用其他类型的算法,如 L1 或 L2 线性回归导数,从手工编码的交互中提取权重。

“交互”对象将包含一个 numpy 形状数组(n_samples,n_features + 1,n_features + 1),其中包括所有主要效果、交互和截距。下面是测试集中第一次观察时该数组的样子:

Note that the numbers look small because the outcome was log-transformed before training.

接下来,我们简单地取消所有由性别变量驱动的影响。

然后,我们可以计算我们的预测,并绘制它们。我们可以立即看到,任何偏见的迹象都被完全消除了,该模型忠实地捕捉到了由多年的就业和职业道路所驱动的变化。

感知偏差的建模方法可以应用于其他类型的输入数据:文本、图像、声音。如果您使用依赖于实体嵌入的 NLP 模型,您可以显式地编码更敏感的概念,并跟踪与这些概念相关的嵌入如何与其他嵌入交互。请注意,谷歌似乎也使用了类似的方法。

结论

我想从一开始就指出,毫无疑问,这种方法会导致验证数据的模型性能下降。在我们设计的例子中,对于编码偏差的预测,RMSPE 是 12%,对于去除性别因素的预测,是 14%。尽管如此,在许多情况下,这种性能下降是可以接受的,也是受到鼓励的。毕竟,你的模型的目的不仅仅是做出好的预测,而且还能让你找到利用杠杆的方法,比如修改你网站上的用户行为,或者在诊断疾病时防止有害的事情发生。因此,如果你想建立一个不受数据偏见影响的模型,让模型首先测量偏见的数量,然后将所有偏见因素重置为零是不会错的。

价格弹性:首先是数据理解和数据探索!

原文:towardsdatascience.com/price-elast…

在我之前的一篇文章中,我描述了如何使用最常用的指标和图表来评估回归。我举了一个关于价格弹性建模的实验为例,在用残差图分析模型后,发现测试数据集在 9 月 1 日之后出现了问题:

fig. 1 — The calendar_date variable vs residuals plot shows that something strange happens after the 1st of September (by the author)

本文将展示 R 中用于更好的数据探索的工具,展示为高性能预测建模准备数据的好方法。这也是试图解释之前出现的问题的唯一方法。

如果你想从数据集开始而不使用上面建议的实验,你可以在这里得到它们

千万不要照原样把所有的都放进锅里

打开Azure Machine Learning Studio中的价格弹性实验,我们可以看到,在三个不同数据集之间的连接之后,在所有数据转移到建模阶段之前,只有很少的基本数据转换:

fig.2 — Join and Transformation phases in the price elasticity experiment (by the author)

看起来数据还没有被很好的分析和理解,因为这个实验只是为了演示。但是,一般来说,对预测模型中使用的数据有信心是很重要的,因为,正如 Techopedia 在其“数据预处理”一节中所说:

真实世界的数据通常是不完整的不一致的,和/或在某些行为或趋势中缺少,并且很可能包含许多错误

一般来说,几乎所有信息系统的问题都是“垃圾进,垃圾出”。如前所述,由于数据集可能包含大量潜在陷阱,在机器学习实验的任何建模阶段之前,必须应用详细的数据探索

数据背后是什么

用作实验起点的三个数据集来自一家汉堡咖啡馆进入中国微软大楼的交易。成本压力使得有必要重新审视超额价格。对微软来说,了解商店对汉堡的需求对价格上涨的反应是很重要的。换句话说,为了知道价格可以提高多少,了解商店里汉堡的*(需求)价格弹性*是很重要的。事实上,价格弹性是一种产品的价格影响其需求的程度。

fig. 3 — Price elasticity of demand (by the author)

从上图可以清楚的看到,如果价格定在 3.000 美元,卖出的产品是 400 万;相反,如果价格增加到 4.000 美元,售出的产品只有 200 万。

根据其斜率,需求曲线可以是弹性非弹性

fig. 4 — Elastic and inelastic demand curve

在左图中的弹性需求下,如果价格从 50 便士增加到 60 便士,大量物品的数量减少(这对于卖方是最坏的情况,对于买方是最好的情况);相反,如果需求是无弹性的,如右图所示,将价格提高 40%将导致数量的小幅减少(在这种情况下,卖方可以在价格上做文章,因为买方需要该商品)。

fig. 5 — Buyer behavior in case of a good that follows an inelastic demand and that undergoes an increase in price (from bit.ly/3OtlIZo)

现在,回归只有两个变量价格数量的需求曲线非常简单。当涉及到更多的变量时,它就变得更加复杂了(比如和其他产品一起卖汉堡)。由于机器学习,我们将收集所有需要的信息,以了解在不导致收入大幅下降的情况下价格可以提高多少。

数据探索拯救世界

要做的第一件事是努力让最好地理解数据。这是通过使用一些特定的统计工具来探索它而获得的。

全面的数据探索指南超出了本文的范围。一个非常好的由分析 Vidhya 可以在这里找到。从本指南中,我们可以了解获得合理数据感受的步骤:

  1. 变量识别
  2. 单变量分析
  3. 双变量分析
  4. 缺失值处理
  5. 异常值处理
  6. 变量变换
  7. 变量/特征创建

让我们从第一步开始。

变量识别

有三组数据需要分析。让我们看看每一个中包含的变量。

“咖啡馆-交易-商店 1”数据集

组成这个数据集的变量可以直接在 Azure Machine Learning Studio 中进行分析(从数据集的输出 pin 中单击“Visualize”),它们就是下图中显示的那些变量。

fig. 6 — Variables in the “Cafè — Transaction — Store 1” data set (by the author)

每一行都是一个聚合事务,它对 SELL_ID 标识的特定产品在特定一天的销售量进行求和。假设那天那个产品的价格不会变化。

详细来说:

  • STORE :分类变量,在本例中只包含标识商店 1 的值“1”
  • CALENDAR_DATE :日期/时间变量,时间总是设置为上午 00:00
  • 价格:数字变量,与 SELL_ID 标识的产品价格相关联
  • QUANTITY :一个数字变量,与销售的产品数量相关联,由 SELL_ID 标识
  • SELL_ID :分类变量,所售产品的标识符
  • SELL_CATEGORY :分类变量,所售产品的类别

“咖啡馆——出售元数据”数据集

这是这个数据集的变量。

fig. 7 — Variables in the “Cafè — Sell Meta Data” data set (by the author)

详细来说:

  • SELL_ID :与之前数据集中显示的已售出产品的标识符相同
  • SELL_CATEGORY :上一个数据集中显示的已销售产品的同一类别。看图现在很清楚,类别“0”标识单个产品;类别“2”标识组合
  • ITEM_ID :分类变量,产品中包含的项目的标识符
  • ITEM_NAME :分类变量,标识项目的名称

正如上图中突出显示的,同一个 SELL_ID 的多个实例与不同的 ITEM _ IDs 相对应,这使我们认为 SELL_ID 是产品的标识符,可以是单个项目,也可以是项目的组合*。例如,SELL_ID = 2053 的组合是由汉堡、可乐和咖啡组成的。SELL_ID 为 1070、3028、3055 和 3067 的产品是单一商品。*

“日期信息”数据集

这个数据集包含带有一些外部数据的日历信息。

fig. 8 — Variables in the “DateInfo” data set (by the author)

详细来说:

  • CALENDAR_DATE :日期/时间变量,表示日历的日期
  • :数字型变量,表示对应 CALENDAR_DATE 的年份
  • 假日:分类变量,表示对应的 CALENDAR_DATE 是否为假日
  • IS_WEEKEND :分类变量,表示对应的 CALENDAR_DATE 是否为周末
  • IS_SCHOOLBREAK :分类变量,表示对应的 CALENDAR_DATE 是否为学校放假
  • AVERAGE_TEMPERATURE :数值型变量,表示对应 CALENDAR_DATE 日的平均华氏温度
  • IS_OUTDOOR :分类变量,我不知道它的意思。它可能是一个标志,指示温度是在室外测得的(值 1)还是在建筑物内测得的(值 0),因为它是外部数据信息的一部分,并且接近 AVERAGE_TEMPERATURE 变量

将所有数据集连接在一起

其中一些变量可以被操纵,然后作为一个独特的数据集加入,用作我们机器学习实验的来源。这里要执行的操作:

fig. 9 — Operations to perform in order to have a unique data set (by the author)

因为事务数据包含 SELL_ID 变量作为引用,所以我需要将 SELL_ID 产品的所有元数据信息放在一行中,以便与它连接。因此,我们必须将数据集从长格式转换为宽格式。这可以通过旋转“销售元数据”信息来获得。

fig. 10 — Pivoting of a data set from a long format to a wide one (by the author)

这个任务在下面简单(并且相当神秘)的 R 代码片段中实现,进入图 9 中的执行 R 脚本模块:

关于此功能的任何细节,请参考此链接。真诚地说,我更喜欢用整洁的方式来做同样的转换,只是稍微多了一点罗嗦,但是可以理解:

在“通过 SELL_ID 加入”模块中,有一些变量需要过滤掉。

fig. 11 — Variables to filter out from the first Join Data module (by the author)

变量 STORE 和 BURGER 是零方差预测器(它们的值总是 1),所以它们不会带来任何有意义的信号。然后,由于数据集模块中的选择列,这些变量被删除。SELL_ID 变量是一个产品标识符,一个标识交易中售出的产品的标签。因为它是一个 ID,所以很容易想到将其从数据集中删除,但是我们保留它,因为它可能对将价格和数量与售出的产品相关联很重要。来自事务的 SELL_CATEGORY 变量也被保留下来(在最初的实验中,这个变量被过滤掉了)。输出如下所示:**

fig. 12 — Variables kept after the Select Columns in Dataset module (by the author)

然后,所有关于日期和外部因素的信息通过 CALENDAR_DATE 变量连接到“Join by SELL_ID”数据集,最终结果如下:

fig. 13 — Final data set after the Join Phase (by the author)

生成的数据集可以 CSV 格式在此处下载。如果您没有 Azure Machine Learning Studio 帐户,可以使用该文件进行以下分析。

单变量分析

一旦我们准备好了输入数据集,就必须探究其中的每一个变量。根据变量的性质,需要不同的统计方法(集中趋势、离差度量)和图表来完成这项工作。最后,对于数据科学家来说,这项工作总是重复的。既然我们不喜欢猴子工作*,微软的一个伟大的开源工具来拯救我们: 交互式数据探索性分析和报告 ( IDEAR ) 。该工具提供了三个版本,分别适用于以下平台:*

  • 微软机器学习 R 服务器
  • 计算机编程语言
  • 稀有

在这篇文章中,我使用的是 R 的版本。特别是,我将它与 RStudio 中的 R 3.4.3 一起使用(到目前为止,IDEAR 在 R ≥3.5.0 上有一些问题)。关于如何安装和使用它的完整说明在这里

首先,我们需要以 CSV 格式导出连接的数据集。这要归功于转换为 CSV* 模块:*

fig. 14 — Export the joined data set to CSV (by the author)

然后,根据指令中提到的 IDEAR 约定,有必要编写一个包含 CSV 文件中变量的元数据信息的 yaml 文件。 yaml 文件的内容如下:

打开 Run-IDEAR 后。R 文件并执行后,会提示一个对话框要求点击确定继续(有时会出现对话框图标,但对话框本身仍隐藏在后台;点击图标即可)。然后打开刚刚在打开对话框中创建的 yaml 文件,游戏就完成了:一个神奇闪亮的应用程序会出现,上面有我们需要的所有统计数据。

fig. 15 — IDEAR Data Quality Report (by the author)

由于我们已经在 yaml 文件中将 CALENDAR_DATE 变量定义为日期/时间,IDEAR 已经自动生成了其他日期/时间组件(年、月、周、日、星期日),并在它们的名称后添加了“ autogen_ < var > ”后缀。这些新变量将帮助我们在多变量分析中获得更好的洞察力。

在“数据总结”部分(包含变量、变量类型和值的信息)之后,是“深入研究每个变量”部分,我们可以在这里进行单变量分析。

分析目标变量

首先,“每个变量的更详细的统计数据”小节让我们快速浏览每个变量的一些基本统计数据。

然后“可视化目标变量”小节包含四个图,帮助理解目标变量(在我们的例子中是数量)的行为。

fig. 16 — Behavior of target variable (by the author)

由于分布的右偏性,数量变量似乎是双峰的(在密度图中有两个主要的隆起),并且对于高值(查看箱线图)几乎没有异常值。

分析数字变量

由于“可视化数字变量”小节,可以研究所有的数字变量:价格、数量(刚刚分析的)和平均温度。

fig. 17 — Behavior of the PRICE variable (by the author)

价格变量似乎也是双峰的,只是有点向右倾斜。箱线图显示没有异常值。

平均温度也是双峰的。这一次,分布有点左倾

fig. 18 — Behavior of the AVERAGE_TEMPERATURE variable (by the author)

稍后,我们将对这些变量进行一些转换,以便尽可能地调整它们的偏斜度,试图在不消除异常值的情况下减轻它们的影响。

分析分类变量

感谢“可视化分类变量”小节,我们也可以探索分类变量。CALENDAR_DATE 中自动生成的变量也是分类变量。例如,有趣的是看到交易数量在一年的最后一个季度下降。

fig. 19 — Exploration of the CALENDAR_DATE_autogen-month variable (by the author)

查看 SELL_ID 分类变量,我们有以下图表:

fig. 20 — Exploration of the SELL_ID variable (by the author)

只卖四种产品(单个汉堡,1070;汉堡+可乐套餐,2051;汉堡+柠檬水套餐,2052;汉堡+可乐+咖啡组合,2053)。奇怪的是,所有这些产品的销售数量完全相同。可能是交易的数据集已经衍生出一个更完整的数据集。

多变量分析

当探索两个变量的相互作用时,事情变得有趣了。

等级变量

首先,IDEAR 为我们提供了“等级变量”小节,这有助于理解哪些变量与所选变量的关联最强。不同的度量标准分别用于分类变量和数值变量。

选择 6 作为与数量相关的顶级分类变量的数量后,结果如下:

fig. 21 — Strength of association between variables in the data set (by the author)

x 轴上的变量标签被截断了一点。为了清楚起见,接下来是排序为最强相关的第一个的数字和分类变量的列表。

数值变量

  1. 价格
  2. 温度

分类变量

  1. 出售标识
  2. 销售 _ 类别
  3. 柠檬汁
  4. 焦炭
  5. 日历日期自动生成日
  6. 是周末

有趣的是注意到 SELL_ID 和 SELL_CATEGORY 变量的强度,它们意外地没有包括在原始实验的训练数据集中。此外,星期几(从 1 到 7)与目标变量之间的关联是一个意想不到的发现。

两个分类变量之间的相互作用

IDEAR 使用马赛克图来比较两个分类变量。乍一看,对于不了解一些统计概念的人来说,这可能有点令人困惑。例如,下面是变量 SELL_CATEGORY 和 COKE 的镶嵌图:

fig. 22 — Mosaic plot for SELL_CATEGORY vs COKE (by the author)

由于这个图,我们可以说组合产品(SELL_CATEGORY = 2)几乎总是包含可乐(COKE = 1)。事实上,不含可乐(可乐= 0)的组合产品(SELL_CATEGORY = 2)与它们之间独立的情况(红色)相比,较少出现在交易中。与此同时,可以肯定地说,单一产品(SELL_CATEGORY = 0)不含可乐。

关于如何绘制镶嵌图的更详细的解释,请参考本帖

两个数值变量之间的相互作用

比较两个数值变量最常用的图是散点图*。比较 IDEAR 中的价格和数量变量很有意思:*

fig. 23 — Scatter plot for PRICE vs QUANTITY (by the author)

有两条线可以帮助您查看变量之间的任何关系:红色的简单回归模型线(线性模型, lm ),以及蓝色的 局部加权散点图平滑 (LOWESS)线。前者是一种参数方法来拟合曲线(您预先假设数据符合某种类型的分布),而后者是一种非参数策略,试图找到最佳拟合曲线,而不假设数据必须符合某种分布形状。

图上显示的相关值是两个变量之间的皮尔逊相关

对于等于或大于 14 美元的价格,数量似乎有不同的表现。可能有另一个变量使这种情况发生。我们稍后会对此进行调查。

如果我们想研究价格和数量相对于平均温度的行为,我们会发现没有特别的关联:

fig. 24 — Scatter plot for AVERAGE_TEMPERATURE vs PRICE (by the author)

fig. 25 — Scatter plot for AVERAGE_TEMPERATURE vs QUANTITY (by the author)

数值变量之间的相关性

IDEAR 中的这一部分允许根据 Pearson、Kendall 和 Spearman 计算两个数值变量之间的相关性。可以为绘图选择几种配置(顺序、形状、布局)。

与标准皮尔逊相关相比,肯德尔的τ 对极端观测值和非线性更加稳健。让我们看看 AVERAGE_TEMPERATURE 变量是否以非线性方式与其他数值变量相关联:

fig. 26 — Kendall’s correlation for numeric variables (by the author)

平均气温和价格之间出现了意想不到的小联系。有数量的可以忽略不计。

数字变量和分类变量之间的相互作用

IDEAR 通过箱线图可视化数字和分类变量之间的关联。这是检查数值变量的分布在分类变量的不同级别是否有显著差异的常用方法。同时,检验了零假设*,即数值变量在分类变量的不同级别上具有相同的平均值。进行两个变量之间的单向方差分析( ANOVA )。在 ANOVA 测试中由 F 值返回的 p 值帮助我们接受(箱线图的平均值具有相同的值)或拒绝(箱线图的平均值具有不同的值)零假设。*

例如,让我们检查价格变量分布是否在 SELL_ID 变量(销售产品标识符)的不同级别有所不同:

fig. 27 — Interaction between PRICE and SELL_ID (by the author)

从上图中可以清楚地看到,单个汉堡(SELL_ID = 1070)决定了价格的净增长(零假设被拒绝)。出现了一些值得关注的异常值。

数量分布也随着 SELL_ID 级别的不同而显著变化:

fig. 28 — Interaction between QUANTITY and SELL_ID (by the author)

从上图可以看出,汉堡+可乐组合产品(SELL_ID = 2051)出现了一些明显的异常值。

当分析 SELL_CATEGORY 和 COKE 变量与价格的关系时,发现了其他有趣的异常值:

fig. 29 — Interaction between PRICE and SELL_ID (by the author)

fig. 30 — Interaction between PRICE and COKE (by the author)

缺失值处理

我们的数据集很幸运:我们没有缺失值,正如您在 IDEAR 的“检查数据质量”部分看到的,选择了所有 18 个变量进行分析:

fig. 31 — Missing values analysis (by the author)

这个情节是对 r 中 levelplot() 的巧妙运用,作为类似的例子,看看这个链接

异常值处理

从单变量分析中我们发现,单个变量没有如此明显的异常值。在多变量分析中,当比较数值变量和分类变量时,情况会发生变化。

从图 27 中,我们看到有单个汉堡(SELL_ID = 1070)以低于 14 美元出售的交易。让我们更深入地了解这个案例。您会在代码中找到注释。

我们很幸运地发现了一个数据问题,只是检查异常值。移除错误的交易行我们也移除了之前显示的所有极端异常值。所以,我们刚刚一石多鸟!

变量变换

有时变量分布中的异常值并不是错误的度量,它们可能是变量本身固有的性质,尤其是当变量偏斜时。从分布中删除这些值会删除对成功预测建模有用的信息。因此,最好转换变量以减轻偏斜度,尝试使其分布更接近正态分布。减少非正态性通常也会减少非线性,即使变换后的分布不完全正态,它通常也是对称的。

当分布是右偏的时,通常使用 对数变换。但是如果是左倾呢?幸运的是,有一种转换非正态分布的通用方法:Box-Cox 转换。它将仅应用于价格和数量,因为 AVERAGE_TEMPERATURE 已经是对称的(对其进行 Box-Cox 变换不会改变其分布,因为它不能在正常情况下进行变换)。

var_distribution 函数为我们提供了四个图,与“可视化数字变量”部分中的 IDEAR 用法相同(只需按“导出”将代码导入price-elasticity-joined . log . r文件,并声明为 YAML 文件)。

boxcox_transf 函数返回一个列表,其中包含转换后的数据和由 Box-Cox 转换计算出的 lambda 值。

下面是原始价格变量和 Box-Cox 转换变量(T-PRICE)的曲线图。

fig. 32 — Distribution plots for PRICE and transformed PRICE (T-PRICE) (by the author)

如您所见,转换后的密度图显示出更加对称的曲线,转换后的 Q-Q 图更接近法线。用于转换价格变量的 lambda 值为-1.1。

这是数量变量的相同曲线。

fig. 33 — Distribution plots for QUANTITY and transformed PRICE (T-QUANTITY) (by the author)

用于转换数量变量的λ值为-0.1。在这种情况下,正如您从 T-QUANTITY 箱线图中看到的,由于转换,异常值已经消失,而没有被移除。

变量创建

这是数据科学项目中最具创造性的阶段,也被称为特性工程*。三言两语(来自这篇博文):*

这是使用数据的领域知识来创建使机器学习算法工作的特征的过程。如果特征工程做得正确,它可以通过从原始数据中创建有助于促进机器学习过程的特征来提高机器学习算法的预测能力。特征工程是一门艺术。

新的日期/时间变量

特征工程的第一个例子是从一个日期变量创建多个变量。正如我们在本文开头看到的,IDEAR 会自动为我们进行这种转换,以便更好地分析我们的数据集。

提取一个新的变量来表示从我们在数据集中找到的第一天开始的天数也是很有用的。通常,日期/时间变量是循环的(例如,月份数从 1 到 12;天数从 1 到 31)。机器学习算法不会考虑变量的周期性。因此,表示时间流逝的天数计数器是一个很好的添加变量,因为它可以帮助算法捕捉自活动开始以来的任何销售增长。

这里是从 CALENDAR_DATE 变量中提取这些变量的 R 代码(它是由 read_csv 函数在日期列中自动解析的)。

新分类变量

让我们来看看这个情节:

fig. 34 — Interaction between QUANTITY and HOLIDAY (by the author)

似乎在工作日(HOLIDAY = "NULL ")的销售量要比节假日期间大得多。因此,一个名为 IS_HOLIDAY 的新虚拟变量(1,如果事务发生在节假日;否则为 0)可能有助于机器学习算法以更好的方式执行。

还有一些 factor 列必须转换成 one-hot 编码变量 (如您所见,我们的数据集中已经有了其中的一些:咖啡、柠檬水、…)。独热编码变量(或虚拟变量)是数值变量,因为它们代表存在(1)或不存在(0)的特征。在我们的分析中,它们经常被转换成分类变量,以便于图形化表示。在 R 中,由于使用了 model.matix 函数,可以实现一键编码变量。

(在这里你可以找到原因“-1”)

新的数值变量

在组合产品中有一个商品数量的变量可能是决定价格变化的一个重要特征。因此,就在“长格式到宽格式”执行脚本模块之后,您可以在图 2 中看到,数据集是图 10 中的数据集。这里可以添加变量 NO_ITEMS,定义如下:

清理数据后的进一步分析

假期分析

在删除假日列之前,如前面代码中所述,检查每个假日在我们每年的数据集中是如何表示的是很有趣的。怎么做呢? 海盗团 前来救援。在使用这个图之前,为了更好的可视化表示,我们将添加一个新变量(HOLIDAY_ABBR ),每个假日都有缩写标签。

fig. 35 — Pirateplot for QUANTITY versus SELL_ID and YEAR (by the author)

如你所见,某一年缺少一些假期:

  • **2015 年中秋节不见了
  • **2015 年国庆节不见了
  • 2012 年、2013 年和 2014 年没有二战庆典(第二次世界大战结束)

很容易证明 2015 年没有前两个假期是合理的。我们在数据集中登记的交易的最大日期是 2015 年 9 月 10 日。所以这些假期比最大日期晚。

在 2015 年之前的几年里,二战庆祝活动不见了。由于数据集是由微软中国的一家汉堡店的交易产生的,我在网上搜索了一下,发现了这个帖子。似乎中国决定从 2015 年开始庆祝二战的结束。因此,2015 年之前的年份缺乏的原因得到了解释。

SELL_ID 对需求曲线的影响

我们想知道汉堡的销售是否遵循线性需求。在图 23 中,我们假设有另一个变量打破了数量和价格之间的线性关系。让我们深入分析来回答这个问题。

要考虑的第三个变量是 SELL_ID(一个分类变量)。假设不同的产品以不同的价格和数量出售是合理的。从图 23 中可以明显看出,价格为 14 美元或更高的产品会出现不同的行为。让我们考虑一个新变量 IS_PRICE_HIGH,如果价格为 14 美元或更多,则设置为 1,否则为 0。因此,现在我们需要绘制一个数字变量(数量)和两个分类变量(SELL_ID 和 IS_PRICE_HIGH)。海盗团会再次帮助我们。

fig. 36 — Pirateplot for QUANTITY versus SELL_ID and IS_PRICE_HIGH (by the author)

查看该图,只有 SELL_ID 1070 出现在 IS_PRICE_HIGH 区域中,对应于等于或大于$14 的价格,并且平均值周围的推断带不重叠,这似乎证实了由 SELL_ID 标识的每个产品都以 9%置信度的平均数量销售,并且高价格标识特定的 SELL_ID。

如果我们绘制每个 SELL_ID 的价格分布图,每个 SELL_ID 的价格也非常不同。

fig. 37 — Pirateplot for PRICE versus SELL_ID (by the author)

SELL _ IDs 2052 和 2053 的平均置信水平是重叠的,所以它们在价格上很难区分。

让我们看看每个 SELL_ID 的需求曲线是如何表现的。

fig. 38 — Scatter plots between PRICE and QUANTITY for each SELL_ID value (by the author)

看起来我们实际上可以用线性回归来塑造需求曲线。

结论

在没有首先仔细分析输入数据集的情况下,面对一个机器学习问题是完全错误的。数据必须得到真正的理解和恰当的“处理”,这样它才能显示所有的洞察力。只有在完全理解数据之后,数据科学家才能转换和创建新的变量,这些变量对于机器学习算法的良好运行非常有用。

在这篇文章中,我们加深了对汉堡咖啡馆交易数据集的了解。在下一篇文章中,我们将应用这些知识在 Azure Machine Learning Studio 中实现一个新的机器学习模型,我们将检查:

  • 这些表现比上一篇中的表现要好
  • 残差图相对于 CALENDAR_DATE(参见本文的前言)中出现的问题在应用于数据集的转换后是否得到解决

云定价

原文:towardsdatascience.com/pricing-on-…

Photo by C Dustin on Unsplash

1.介绍

云计算是在线提供计算资源作为服务的重要实践。此外,根据牛津在线词典的定义,它是*“使用互联网上托管的远程服务器网络来存储、管理和处理数据的实践,而不是本地服务器或个人计算机”* [18]。

云上提供多种类型的服务:基础设施即服务(IaaS)、平台即服务(PaaS)、软件即服务(IaaS)、存储即服务(STaaS)、安全即服务(SECaaS)、测试环境即服务(TEaaS)等等。

云计算提供商的目标是最大化其收入,而客户的目标是以可接受的价格获得良好的服务质量。因此,满足双方需要一个最优的定价方法。

本报告主要基于以下研究论文:

  • “云计算中的定价方案:综述”,2017 年出版 [1]
  • 《云计算中的定价方案:概述》,2016 年出版 [3]
  • 《云计算定价模式:调查》,2013 年出版[2]

我将尝试对所有列出的定价模型给出一个更全面的观点,比较它们,并显示每个模型的一些优点和缺点。此外,我将简要讨论这三篇论文的内容,并给出建议。

2.云定价

当谈论云定价时,需要考虑许多因素,首先是服务提供商的目标是实现利润最大化,而客户正在寻求更低价格、更高质量的服务。其次,在云上销售服务竞争非常激烈,因为有大量的提供商在销售相同的服务。此外,价格还受到以下因素的影响:

  • 租赁期,可视为供应商和客户之间的合同时间。
  • 资源的初始成本
  • 折旧率,意味着这些资源被使用了多少次
  • 服务质量
  • 资源的年龄
  • 维护费用

3.定价模型

云上使用的定价模型有很多,从变化周期的角度可以分为两大类:固定的和动态的。

3.1.固定定价模型

固定定价模型也称为静态定价模型,因为价格长期稳定。云上最著名的服务提供商如 Google、Amazon Web Services、Oracle、Azure 等都使用固定的定价模式。

固定价格使用户意识到做生意和消耗资源的成本。然而,另一方面,这种定价方式对顾客来说是不公平的,因为他们可能会多付或少付他们的需求。另外,它不受需求的影响。

有许多固定的定价方式,如“按使用付费”、订阅、价目表……在这一部分,我将简要介绍这些定价模式:

3.1.1.按使用付费模式

在这种模式下,用户只需为他们使用的东西付费。顾客根据他在特定服务上花费的时间或数量付费。如表 1 和表 2 所示的亚马逊网络服务(AWS) [13]、Salesforce [19]使用这种模型。

Table 1 — Amazon S3 storage pricing

Table 2 — Salesforce Cloud pricing

3.1.2.签署

在这种模式下,用户需要定期付费,以在线服务的形式访问软件,从而从服务中获利。客户订购使用预先选择固定和长期服务单位组合,通常是每月和每年。

Dropbox[16]——如表 3 所示——使用这种模型。

Table 3 — Dropbox pricing

3.1.3.混合物

该模型是按使用付费和订阅定价模型的组合,在该模型中,所有服务价格都使用订阅模型来设置,但是当超过使用限制时,则使用按使用付费定价。

谷歌应用引擎[12]使用这个模型,如表 4 所示。

Table 4 — Google app engine pricing

3.1.4.为资源付费

在这种模式中,客户为使用的资源付费。微软 Azure 在基础设施即服务定价中使用该模型,如表 5 所示[14]。

Table 5 — Windows Azure IaaS pricing

3.1.5.价格表

在这个模型中,服务提供商在一个表格/列表中列出所有价格及其详细信息。此外,它可以作为文档(PDF)下载。Oracle [15]使用了这个模型,如图 1 所示。

Figure 1 — Oracle products price Lists

3.2.动态定价

动态定价模型也称为实时定价,这些模型非常灵活,它们可以被认为是一个函数的结果,该函数将成本、时间和其他参数(如位置、用户感知价值等)作为参数。

在动态定价中,只要有请求,就根据定价机制计算价格。与固定价格相比,反映实时供需关系的动态定价代表了一种更有前途的收费策略,可以更好地利用用户支付潜力,从而为云提供商带来更大的利润收益。

例如,亚马逊每 10 分钟改变一次价格,百思买和沃尔玛每个月改变价格超过 50000 次。

有许多动态定价模型,如:

  • 以成本为基础的模式,将利润与成本水平相结合。
  • 基于价值,考虑用户感知价值的基础
  • 基于竞争,考虑竞争对手的服务价格
  • 以客户为基础,考虑客户愿意支付的价格。
  • 基于位置,根据客户位置设定价格。

3.3.固定定价与动态定价

在表 6 中,列出了固定定价和动态定价的主要区别[1]。

Table 6 — Fixed pricing VS dynamic pricing

3.4.几种定价模型的比较

在表 7 中,列出了所有定价模型及其优缺点[1]。

Table 7 — Pricing Models Comparison

4.讨论和结论

我们正在总结的三篇论文讨论了动态定价,它们将使收入最大化,并且对客户和提供商更加公平。然而,客户无法预测动态定价模型,而且大多数情况下,客户无法接受动态定价模型,尤其是在谈到云计算服务时。为此,云服务提供商不使用动态定价;亚马逊、全球速卖通、沃尔玛等在线零售商使用它们。

然而,有许多供应商正在使用带有一些动态性的固定价格;可以称之为混合定价。因此,价格在很长一段时间内是静态的,但它会受到资源成本以外的其他参数的影响,如位置、客户、竞争和其他因素。

如图 2、3、4 所示,微软认证价格是固定的,但随着地点或客户类型的变化而变化[17]。

Figure 2 — MCSA exam price in Lebanon on December 2017

Figure 3 — MCSA exam price in United States on December 2017

Figure 4 — MCSA exam price will decrease for students

但是,在这种混合方法中,固定定价的主要缺点仍然存在,因此客户可能会多付或少付资源的费用。为此,我们建议在分析每个定价模型中使用的参数的基础上设计预测分析模型,以帮助客户更好地了解价格变化。

此外,即使找到了预测分析模型,有一点我们不能忘记的是,服务提供商是选择定价模型的人,因此所使用的定价模型总是偏向服务提供商。这增加了建立国际定价标准的需要,以便在顾客的权利和销售者的目标之间进行协调。

5.参考

  • [1] A Soni 和 M Hasan,“云计算中的定价方案:综述”,《国际高级计算机研究杂志》,第 7 卷,2017 年 2 月 20 日
  • [2]M . Al-Roomi、S . Al-Ebrahim、S . Buqrais 和 I Ahmad,“云计算定价模型:调查”,《国际网格和分布式计算杂志》第 6 卷,2013 年 6 月 5 日
  • [3]A . Mazrekaj 和 I Shabani 和 B Sejdiu,“云计算中的定价方案:概述”,《国际高级计算机科学与应用杂志》,第 7 卷,2016 年
  • [4] C. D. Patel 和 A. J. Shah,数据中心规划、开发和运营的成本模型,惠普技术报告-HPL-2005–107(r . 1),2005 年。
  • [5] Pal,r .和 Hui,p,《云服务市场的经济模型:定价和容量规划》。理论计算机科学 496,113–124,七月。2013.
  • [6]王文伟,张平,T. Lan 和 V. Aggarwal,具有单个作业截止期的数据中心净利润优化,Proc .信息会议。科学与系统 2012。
  • [7] C. S. Yeoa,S. Venugopalb,X. Chua 和 R. Buyyaa,公用计算服务的自主计量定价,下一代计算机系统。,第 26 卷,第 8 期,2010 年。
  • [8] M .马西亚斯和 j .吉塔特,云计算市场定价的基因模型,Proc .第 26 届交响乐。应用计算,2011 年。
  • [9] H. Li,J. Liu 和 G. Tang,云计算资源的定价算法,Proc .里面的网络计算与信息会议。安全,2011 年。
  • [10] B. Sharma,R. K. Thulasiram,P. Thulasiraman,S. K. Garg 和 R. Buyya,《云计算商品定价:一种新的金融经济模型》, Proc .IEEE/ACM Int。症状。关于集群、云和网格计算,2012 年。
  • [11]卢米先生。Al-Ebrahim,S. Buqrais 和 I. Ahmad,《云计算定价模型:调查》,《国际网格和分布式计算杂志》第 6 卷第 5 期,第 93–106 页,2013 年。
  • [12]谷歌应用引擎,cloud.google.com/appengine/,最近一次访问是在 2015 年 11 月 12 日。
  • [13]aws.amazon.com/,[亚马逊网络服务](aws.amazon.com/,)最近一次访问时间为 2015 年 10 月 12 日。
  • [14]微软 Azure 网站,https://Azure . Microsoft . com/en-us/pricing/details/cloud-services/,最后访问时间:2017 年 12 月 5 日
  • [15]甲骨文公司网站,http://www . Oracle . com/us/corporate/pricing/price-lists/index . html,最后访问时间:2017 年 12 月 5 日
  • [16] Dropbox 网站,www.dropbox.com/business/pr…,最近访问时间:2017 年 12 月 5 日
  • [17]微软网站,https://www . Microsoft . com/en-us/learning/mcsa-windows-server-2016-certification . aspx,最后访问时间:2017 年 12 月 5 日
  • [18]牛津在线词典
  • [19]销售团队网站,www.salesforec.com,最近访问时间:2015 年 10 月 12 日

主成分分析-简介

原文:towardsdatascience.com/principal-c…

可变缩减技术

变数太多?你应该使用所有可能的变量来生成模型吗?

为了处理“维数灾难”并避免高维空间中的过拟合等问题,使用了主成分分析等方法。

PCA 是一种通过从大量数据中提取重要变量来减少数据中变量数量的方法。它减少了数据的维度,目的是保留尽可能多的信息。换句话说,这种方法将高度相关的变量组合在一起,形成一个较小数量的人工变量集,称为“主成分”,它解释了数据中的大多数差异。

让我们深入了解 PCA 是如何在幕后实现的。

开始 通过从每个数据点中减去平均值来标准化预测值。对预测值进行归一化非常重要,因为原始预测值可能处于不同的等级,并且可能对方差产生显著影响。结果如表 2 所示,平均值为零。

Normalized Data

接下来,计算数据的协方差矩阵,该矩阵将测量两个预测器如何一起移动。它是在两个预测值之间测量的,但如果您有三维数据(x,x1,x2),则测量 x x1,x x2,x1 x2 之间的协方差。供参考的协方差公式为:

在我们的例子中,协方差矩阵如下所示:

Covariance Matrix

现在,计算上述矩阵的特征值和特征向量。这有助于发现数据中的潜在模式。在我们的例子中,它大约是:

Eigen Value and Vector

我们快到了:)。执行重定向。为了将数据转换成新的轴,将原始数据乘以特征向量,这表示新轴的方向。请注意,您可以选择省略较小的特征向量,或者两者都使用。此外,根据哪一组占了 95%或更多差异,决定保留多少组特性。

**最后,**从上述步骤中计算出的分数可被绘制出来,并输入预测模型。绘图让我们感觉到两个变量有多接近/高度相关。我们没有使用原始数据来绘制 X 和 Y 轴(这并不能告诉我们点与点之间的关系),而是绘制转换后的数据(使用特征向量),这些数据可以发现模式并显示点之间的关系。

尾注:很容易将 PCA因子分析混淆,但这两种方法在概念上是有区别的。我将在下一篇文章中详细介绍因子分析以及它与 PCA 的不同之处..敬请关注。

Tensorflow 中带交互代码的主成分分析网络

原文:towardsdatascience.com/principal-c…

GIF from this website

主成分分析池层的自然延伸将是在该层之外制作一个完整的神经网络。我想知道这是否可能,以及它在 MNIST 数据上的表现是好是坏。

主成分分析池层

Image from this website

对于不熟悉 PCAP 的人,请先阅读这篇博客。基本思想是合并层,如最大或平均合并操作执行维数减少,不仅节省计算能力,而且作为正则化。 PCA 是一种降维技术,将相关变量转换成一组线性不相关变量的值,称为主成分。我们可以利用这个操作来做与最大/平均池类似的工作。

由大多数池层组成的网络

Image from this website

现在我知道你在想什么了,在执行分类的时候有一个只由池层组成的网络是没有意义的。你是完全正确的!它没有!但我只是想试着玩玩。

数据集/网络架构

蓝色矩形 → PCAP 或最大池层 绿色矩形 →卷积层增加通道尺寸+ 全局平均池操作

网络本身非常简单,只有四个池层和一个卷积层来增加信道大小。然而,为了使尺寸匹配,我们将把每个图像下采样为 16*16 的尺寸。因此张量的形状是…

【批量,16,16,1】→【批量,8,8,1】→【批量,4,4,1】→ 【批量,2,2,1】→【批量,1,1,1】→【批量,1,1,10】→ 【批量,10】

并且我们可以像任何其他网络一样使用软最大层来执行分类。

结果:主成分网络

如上所述,训练准确率停滞在 18 %,这是可怕的 LOL。但我怀疑网络从一开始就没有足够的学习能力,这是它能做到的最好的。然而,我想看看每个 PCAP 层如何转换图像。

Generated Image when input is 7

Generated Image when input is 2

Generated Image when input is 1

左上图 →原始输入 右上图 →第一层后 左下图 →第二层后 右下图 →第四层后

我们可以观察到的一个明显的模式是亮度的变化。例如,如果左上像素在第二层中是白色的,则该像素在下一层中将变为黑色。目前,我不能 100%确定为什么会发生这种情况,但随着更多的研究,我希望知道确切的原因。

结果:最大共享网络

如上所述,当我们用 max pooling 操作替换所有 PCAP 层时,我们可以观察到训练图像的精度停滞在 14%左右,这证实了网络从一开始就没有足够的学习能力。

Generated Image when input is 7

Generated Image when input is 2

Generated Image when input is 1

左上图像 →原始输入 右上图像 →第一层后 左下图像 →第二层后 右下图像 →第四层后

与 PCAP 相反,使用最大池,我们可以清楚地观察到具有最高亮度的像素移动到下一层。这是意料之中的,因为这就是最大池的作用。

交互代码

对于 Google Colab,你需要一个 Google 帐户来查看代码,而且你不能在 Google Colab 中运行只读脚本,所以在你的操场上复制一份。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!

要使用 PCAP 访问网络,请点击这里。 要使用最大池访问网络,请单击此处

最后的话

我从一开始就没有对这个网络抱太大希望,但我希望在训练/测试图像上至少有 30%的准确率。

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你希望看到我所有写作的列表,请在这里查看我的网站。

同时,在我的 twitter 上关注我这里,访问我的网站,或者我的 Youtube 频道了解更多内容。我还实现了广残网,请点击这里查看博文 t。

参考

  1. 50000 有 28 个因子。(2018).Factornumber.com。检索于 2018 年 6 月 3 日,来自factornumber.com/?page=50000
  2. 终端?,H. (2018)。如何在终端中重命名文件?。问 Ubuntu。检索于 2018 年 6 月 3 日,来自https://askubuntu . com/questions/280768/how-to-rename-a-file-in-terminal
  3. 中学 _y,H. (2018)。用 Seaborn + Pandas 带 secondary_y. Stack 溢出出图时如何去掉网格线?检索于 2018 年 6 月 3 日,来自https://stack overflow . com/questions/26868304/how-to-ride-of-grid-lines-when-plotting-with-seaborn-pandas-with-secondary
  4. [复本],H. (2018)。如何在 Matplotlib (python)中隐藏轴和网格线?堆栈溢出。检索于 2018 年 6 月 3 日,来自https://stack overflow . com/questions/45148704/how-to-hide-axes-and-gridlines-in-matplotlib-python
  5. MNIST 手写数字数据库,Yann LeCun,Corinna Cortes 和 Chris Burges。(2018).Yann.lecun.com。检索于 2018 年 6 月 3 日,来自yann.lecun.com/exdb/mnist/
  6. TensorFlow?,W. (2018)。TensorFlow 中最大汇集 2D 层的输出张量是什么?。堆栈溢出。检索于 2018 年 6 月 3 日,来自https://stack overflow . com/questions/43453712/what-is-output-tensor-of-max-pooling-2d-layer-in-tensor flow
  7. 主成分分析。(2018).En.wikipedia.org。检索于 2018 年 6 月 3 日,来自en.wikipedia.org/wiki/Princi…
  8. 桑托斯大学(2018)。混合层人工智能。Leonardo araujosantos . git books . io . 2018 年 6 月 3 日检索,来自https://Leonardo araujosantos . git books . io/artificial-intelligence/content/pooling _ layer . html
  9. [ ICLR 2015 ]追求简单:具有交互码的全卷积网。(2018).走向数据科学。检索于 2018 年 6 月 3 日,来自https://towards data science . com/iclr-2015-力争简单-所有卷积-网络-交互-代码-手册-b4976e206760

Tensorflow 中的主成分分析池与交互代码[PCAP]

原文:towardsdatascience.com/principal-c…

其思想很简单,卷积神经网络中的最大/平均池操作用于降低输入的维数。虽然引入了更复杂的池操作,如 Max-Avg (Mix) Pooling 操作,但我想知道我们是否可以用主成分分析(PCA) 做同样的事情。

PCA 概述及简单教程

上面的论文在解释什么是 PCA 方面做了大量的工作,并且给出了使用哪种数学的简单例子。这将是一个好主意,先浏览 pdf 文件,然后再继续阅读。

PCA /单值分解

Image from this website

红框 →我们将如何在 Tensorflow 中执行 PCA

这篇博文很好地解释了我们如何使用单值分解来执行 PCA。谢天谢地 Tensorflow 已经有了 tf.svd() 操作来执行单值分解。

Video from this website

我个人不得不观看/阅读额外的材料来具体理解什么是单值分解,并且我已经链接了我在上面观看的视频。(这个 Quora 帖子和这个 medium 帖子也是一个很好的阅读来源。)

(愚蠢的)主成分分析池背后的想法

Image from this video

红框 →原矩阵 蓝框 →左奇异向量 紫框 →奇异值(对角矩阵) 绿框 →右奇异向量

我试图尽可能简单地理解难懂的概念,所以这里是我的简单(非常愚蠢的)SVD 版本。假设我们有一个蛋糕叫做 A,谢天谢地这个蛋糕 A 只由两种成分组成。牛奶 M 和糖 s 所以 A = M + S。

然而,这里的诀窍是知道我们制作原始蛋糕 A 所需的牛奶和糖的确切组合。假设我们需要 30 升牛奶和 50 毫克糖来正确制作蛋糕 A,这意味着我们也需要在某个地方获得该信息。

这样做的好处是,我们不必随身携带蛋糕(这需要大量的存储空间),我们可以简单地携带牛奶、糖和说明书(告诉我们需要多少比例的牛奶和糖),作为一种更紧凑的形式。这是我对奇异值分解的理解,从这里我们可以转到主成分分析。

Image from this [website](http://Li, E. (2018). PCA With Tensorflow. Abracadabra. Retrieved 25 May 2018, from ewanlee.github.io/2018/01/17/…)

如上面在 PCA 中所看到的,我们丢弃右奇异向量并修改奇异值矩阵的维数,以便降低维数。我们可以利用这一点,使我们的 PCA 充当池操作。

例如,假设我们有一批 881 的张量格式的 200 幅图像,我们可以将它写成(200,8,8,1)。但我们已经知道,我们可以对图像进行矢量化,将张量整形为(200,881) = (200,64)。现在,如果我们执行 PCA 以将维度从 64 降低到 16,我们可以将其重塑回 3D 图像,使张量变成(200,4,4,1)。因此得到的张量具有与执行平均汇集操作相同的维数。

奇异矩阵的指数加权移动平均值/α,β

红框→ 在训练期间更新移动奇异矩阵(sigma ),但是在测试期间,我们将使用移动平均 sigma 值来执行维度缩减。

我们需要注意的一个小细节是奇异矩阵的指数加权移动平均。就像我们执行批量标准化一样,我们在训练期间跟踪平均值和标准差的权重。在测试期间,我们不使用数据的平均值/标准值,而是使用移动平均值。

因为我们希望模型的预测只依赖于测试阶段的给定测试数据。因此,我们将使用奇异矩阵的移动加权平均值,而不是使用测试数据中的奇异矩阵。(如果有人想了解更多关于批量标准化的信息,请点击这里。)

Original Image from the paper

如上所述,在批量标准化中,我们将标准化数据乘以α,并添加β项。我将遵循这个想法,也给我们的 PCAP 层一些能力来取消 PCA 操作,如下所示。

红框 →将α和β项添加到整形后的 PCA 中

网络架构

黑盒 →卷积层 黄盒 →卷积+批量归一化 绿盒 →平均池层 红盒 →主成分分析池层 粉盒 →全局平均池和 Softmax

我们将要使用的基本网络是全卷积网络,如上所示(浅蓝色方框),整个网络主要分为三个不同的部分。

结果

左图 →随时间变化的训练精度/随时间变化的成本 右图 →随时间变化的测试精度/随时间变化的成本

令人惊讶的是,该模型正在学习如何使用 PCA 池层对 MNIST 图像进行分类。尽管我们需要注意这样一个事实,它几乎没有达到 50%的准确率。(都在测试/训练图像上)。

第 21 个纪元后的最终精度为 53%。

交互代码

对于 Google Colab,你需要一个 Google 帐户来查看代码,而且你不能在 Google Colab 中运行只读脚本,所以在你的操场上复制一份。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!同样为了透明,我在训练期间上传了所有的日志。

要访问代码以及培训日志,请点击此处。

最后的话

最终结果非常有趣,因为该模型实际上能够学习如何对 MNIST 图像进行分类。我很高兴地知道,在网络中插入更复杂的操作(如 PCA)是可能的。(带端到端培训)最后,顺便提一下,如果有人有兴趣学习更多关于线性代数的知识,请观看下面的视频系列。( 3Blue1Brown 是一个产出高质量内容的土豆/数学家)

Video From this website

如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你希望看到我所有写作的列表,请在这里查看我的网站。

同时,在我的 twitter 上关注我这里,访问我的网站,或者我的 Youtube 频道了解更多内容。我还实现了广残网,请点击这里查看博文 t。

参考

  1. 李,E. (2018)。张量流 PCA。胡言乱语。检索于 2018 年 5 月 25 日,来自ewanlee.github.io/2018/01/17/…
  2. tf.set_random_seed | TensorFlow。(2018).张量流。检索于 2018 年 5 月 25 日,来自https://www . tensor flow . org/API _ docs/python/TF/set _ random _ seed
  3. Iris 数据集-sci kit-学习 0.19.1 文档。(2018).Scikit-learn.org。检索于 2018 年 5 月 25 日,来自http://sci kit-learn . org/stable/auto _ examples/datasets/plot _ iris _ dataset . html
  4. tf.cumsum | TensorFlow。(2018).张量流。检索于 2018 年 5 月 25 日,来自www.tensorflow.org/api_docs/py…
  5. 输入,T. (2018)。Tensorflow:使用 tf.slice 拆分输入。堆栈溢出。检索于 2018 年 5 月 25 日,来自https://stack overflow . com/questions/39054414/tensor flow-using-TF-slice-to-split-the-input
  6. 李,c,,p .,,涂,Z. (2015)。卷积神经网络中的一般化池函数:混合、门控和树。Arxiv.org。检索于 2018 年 5 月 26 日,来自arxiv.org/abs/1509.08…
  7. 主成分分析。(2018).En.wikipedia.org。检索于 2018 年 5 月 26 日,来自en.wikipedia.org/wiki/Princi…
  8. (2018).cs . otago . AC . NZ . 2018 年 5 月 26 日检索,来自http://www . cs . otago . AC . NZ/cosc 453/student _ tutorials/principal _ components . pdf
  9. 李,E. (2018)。张量流 PCA。胡言乱语。检索于 2018 年 5 月 25 日,来自ewanlee.github.io/2018/01/17/…
  10. 奇异值分解。(2018).En.wikipedia.org。检索于 2018 年 5 月 26 日,来自 en.wikipedia.org/wiki/Singul…
  11. tf.svd |张量流。(2018).张量流。检索于 2018 年 5 月 26 日,来自 www.tensorflow.org/api_docs/py…
  12. 线性代数预习精华。(2018).YouTube。检索于 2018 年 5 月 26 日,来自www.youtube.com/watch?v=kjB…
  13. [在线]可从以下网址获取:https://www . quora . com/What-is-an-intuitive-explain-of-singular-value-decomposition-SVD【2018 年 5 月 26 日获取】。
  14. 对 Tensorflow 中使用交互式代码进行批处理规范化有了更深入的理解。(2018).中等。检索于 2018 年 5 月 26 日,来自https://medium . com/@ SeoJaeDuk/deeper-understanding-of-batch-normalization-with-interactive-code-in-tensor flow-manual-back-1d50d 6903 d35
  15. [在线]可从以下网址获取:https://www . quora . com/What-is-an-intuitive-explain-of-singular-value-decomposition-SVD【2018 年 5 月 26 日获取】。
  16. 奇异值分解教程:应用,例子,练习。(2017).统计和机器人。检索于 2018 年 5 月 26 日,来自https://blog . statsbot . co/singular-value-decomposition-tutorial-52c 695315254
  17. (2018).Arxiv.org。检索于 2018 年 5 月 26 日,来自arxiv.org/pdf/1502.03…
  18. [ ICLR 2015 ]追求简单:具有交互码的全卷积网。(2018).走向数据科学。检索于 2018 年 5 月 26 日,来自https://towards data science . com/iclr-2015-努力简化-所有卷积网-交互式代码-手册-b4976e206760

主成分分析:你的教程和代码

原文:towardsdatascience.com/principal-c…

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

你的数据是你的机器学习模型的生命燃料。总是有许多 ML 技术可供选择并应用于特定的问题,但是没有大量的好数据,你不会走得很远。在机器学习应用程序中,数据通常是大多数性能提升背后的驱动因素。

有时这些数据可能很复杂。你拥有太多,以至于理解它的全部含义以及哪些部分是真正重要的可能很有挑战性。简而言之,降维是一种帮助我们从宏观层面更好地理解数据的技术。它减少了数据集的特征数量,这样我们只剩下最重要的部分。

主成分分析(PCA)是一种简单而强大的降维技术。通过它,我们可以直接减少特征变量的数量,从而缩小重要特征的范围并节省计算量。从高层次来看,PCA 有三个主要步骤:

(1)计算数据的协方差矩阵

(2)计算该协方差矩阵的特征值和向量

(3)使用特征值和向量只选择最重要的特征向量,然后将数据转换到这些向量上以减少维数!

整个过程如上图所示,其中我们的数据已经从 1000 个点的三维空间转换到 100 个点的二维空间。这在计算上节省了 10 倍!

(1)计算协方差矩阵

PCA 产生一个特征子空间,该特征子空间使沿着特征向量的方差最大化。因此,为了适当地测量这些特征向量的方差,它们必须被适当地平衡。为了实现这一点,我们首先归一化我们的数据,使其具有零均值和单位方差,这样在我们的计算中每个特征将被同等地加权。假设我们的数据集叫做 X :

两个变量的协方差衡量它们的“相关”程度。如果两个变量有一个正的协方差,那么当一个变量增加时,另一个也增加;对于负协方差,特征变量的值将在相反的方向上变化。协方差矩阵只是一个数组,其中每个值基于矩阵中的 x-y 位置指定两个特征变量之间的协方差。公式是:

其中顶部有线的 x 是 x 的每个特征的平均值向量。请注意,当我们将转置矩阵乘以原始矩阵时,我们最终会将每个数据点的每个特征相乘!在 numpy 代码中,它看起来像这样:

(2)计算特征值和向量

我们的协方差矩阵的本征向量(主分量)表示新特征空间的向量方向,本征值表示这些向量的幅度。因为我们在看我们的协方差矩阵*,特征值量化每个向量的贡献方差。*

如果一个特征向量具有一个相应的高量值的特征值,这意味着我们的数据在特征空间中沿着该向量具有高方差。因此,这个向量包含了我们数据的大量信息,因为沿着这个向量的任何移动都会导致很大的“差异”。另一方面,具有小特征值的向量具有低方差,因此当沿着该向量移动时,我们的数据不会变化很大。因为当沿着特定的特征向量移动时没有什么变化,即改变该特征向量的值不会对我们的数据产生很大影响,所以我们可以说该特征不是很重要,并且我们可以移除它。

这就是 PCA 中特征值和向量的全部本质。找出在表示我们的数据时最重要的向量,并丢弃其余的。在 numpy 中,计算我们的协方差矩阵的特征向量和值是一个简单的一行程序。之后,我们将根据特征值对特征向量进行降序排序。

(3)到新向量的投影

在这一点上,我们有一个特征向量列表,根据它们的特征值按照对数据集的“重要性”排序。现在我们要做的是选择我们需要的最重要的特征向量,并丢弃其余的。我们可以通过查看向量的解释的方差百分比来以一种聪明的方式做到这一点。这个百分比量化了有多少信息(方差)可以归因于总的 100%中的每个主成分。

我们举个例子来说明。假设我们有一个数据集,它最初有 10 个特征向量。计算协方差矩阵后,我们发现特征值为:

[12, 10, 8, 7, 5, 1, 0.1, 0.03, 0.005, 0.0009]

这个数组的总和= 43.1359。但是第一个6值代表:

42 / 43.1359 =总数的 99.68%!这意味着我们的前 5 个特征向量有效地保存了关于我们数据集的 99.68%的方差信息*。因此,我们可以丢弃最后 4 个特征向量,因为它们只包含 0.32%的信息,这对于节省 40%的计算来说是值得的牺牲!*

因此,我们可以简单地定义一个阈值,根据该阈值我们可以决定是保留还是丢弃每个特征向量。在下面的代码中,我们简单地根据所选的 97%的阈值来计算我们想要保留的特征向量的数量。

最后一步是将我们的数据实际投影到我们决定保留的向量上。我们通过构建一个投影矩阵来做到这一点:这只是一个矩阵的花哨词,我们将乘以它来将我们的数据投影到新的向量上。为了创建它,我们简单地连接所有我们决定保留的特征向量。我们的最后一步是简单地取原始数据和投影矩阵之间的点积。

瞧啊。尺寸缩小!

喜欢学习?

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

人工智能和机器学习原理

原文:towardsdatascience.com/principles-…

自从我在谷歌工作以来,人工智能一直吸引着我,从检测谷歌云上的欺诈到预测 YouTube Red 上的用户保留率。为了拓宽我的专业经验,我加入了百度风投,成为其第一个夏季投资助理,与才华横溢的创始人一起创建人工智能创业公司。

现在在宾夕法尼亚大学沃顿商学院,我正在寻找机会结识有着有趣的人工智能相关想法的人,并了解人工智能生态系统内的最新创新。在商学院的头两个月,我联系到了尼古拉斯·林德,他是沃顿商学院二年级的 MBA 学生,在 IBM Watson 实习,担任数据科学家。我们立即意识到我们对人工智能的共同热情,为我们的同学制作了一份关于人工智能和机器学习(ML)的午餐和学习。

利用以下资料,我们试图:

  • 定义人工智能并描述其在商业中的应用
  • 解码“深度学习”和“认知计算”等流行语
  • 强调 AI / ML 中使用的分析技术和最佳实践
  • 最终,培养未来的人工智能领导者

午餐学习很受欢迎。当它变得明显,这是手头的话题,而不是吸引了大量观众的免费比萨饼,我惊讶于兴趣的程度。令人欣慰的是,听到同学们有兴趣了解更多关于该技术及其在解决日常业务挑战方面的实际应用。尼克和我现在正在建立一个基础,使这些研讨会成为一项持续的努力,以便工程、设计和宾夕法尼亚大学各学院的更多人能够从中受益。

沃顿商学院注重量化的严谨性,这已经让我觉得它非常适合我。在未来的两年里,我期待着与志同道合的人接触,无论是在课堂上还是在课堂外,与同龄人分享我关于 AI 的知识,并反过来向他们学习。通过共同努力扩大宾夕法尼亚大学在这一新领域的影响力和声誉,我相信我们都能成长为下一代领导者,在人工智能时代推动公司前进。

我很想听听你的想法。如果你觉得这篇文章或这些资料有用,请把它们推荐给你的朋友和同事!

确定数据科学工作的优先顺序

原文:towardsdatascience.com/prioritizin…

在你能做的许多事情中做出选择

作为一名试图支持一个组织的数据科学家,您必须不断地决定您应该从事什么任务。您可能正在管理各种任务,例如:

  • 直接来自利益相关者的任务,比如为明天的大型会议制作一段时间内的销售图表,
  • 你个人认为具有长期效益的想法,比如制作一个 CLV 模型来预测高价值客户,以及
  • 来自其他业务部门的模糊任务,比如帮助确定为什么某个地区的客户保持率似乎下降了。

很难平衡什么是最重要的事情,什么可以放在次要位置,尤其是当你有很多人要求你分析的时候。通常,人们认为对他们非常重要的工作对整个企业来说可能并不重要。与提出数据科学请求的人相比,你通常是一名资历较浅的员工,这使得直截了当地说不变得更加复杂,即使你不容易做到这一点。所有这些创造了一个环境,在这个环境中,你做什么的决定会极大地影响业务,但你也会在选择什么方面受到限制。

这是我个人在职业生涯中纠结过的话题。当公司里的人带着关于数据的问题来找我时,我几乎总是想回答他们,不让他们失望。通常我认为这些请求很有趣!然而,试图满足每一个要求是不可持续的,因为对答案的要求是无止境的。此外,用数据回答一个问题通常会引出新的问题,因此满足请求通常会产生额外的工作,而不是减少剩余的工作量。

我逐渐意识到,在考虑进行可能的分析时,我首先要回答两个问题:

  1. 知道这个分析结果对公司有实质性影响吗?而且,
  2. 这项创新工作是否为企业带来了新的东西?

对这两个问题的回答产生了四种截然不同的工作类型:

我们都希望我们正在做的事情(创新且有影响力)😊

理想的项目是既创新又改变业务的项目。一个示例项目是创建一个客户流失模型,为赢回客户的营销工作提供动力。这是那种首先让人们进入数据科学的工作。不幸的是,没有多少项目属于这一类——只是很难找到你能真正改变一个企业的开创性地方。如果你发现一个属于这一类的项目,尽你所能让它启动。

提供证据(不创新,但有影响力)🙂

这些项目并不创新,但却改变了业务,所以从定义上来说,做这些工作是有价值的。这通常意味着为每个人都怀疑是真的事情提供证据——这不是特别创新,但会有所帮助。例如,企业中的人可能会怀疑特定人群的客户不太可能再次光顾。没有证据证明这些预感是正确的,人们就不愿意尝试解决营销问题。如果你能做一些分析表明假设是正确的,你就能帮助企业找到解决方案。这不是迷人的工作,向人们展示他们已经认为是真实的东西不是特别令人惊叹,但它仍然是有用的。如果你得到这样的工作,试着去做。

象牙塔(创新但没有影响力)🤨

这是创新的工作,但对业务没有用处,这可能是一笔巨大的沉没成本。这些项目通常来自数据科学团队内部,当人们对基于方法论上有趣的事物的建模或分析的新领域有想法时。一个示例项目是尝试使用机器学习来细分客户,而不知道您将使用这些细分做什么。如果没有一个来自数据团队之外的对项目有用的人,那么工作可能不会有任何进展。作为一名数据科学家,很容易感觉到一旦你完成了这个项目,人们就会发现它的用处。在实践中,如果你不能立即看到项目的用途,那么业务人员可能也不能。不要被困在这些项目中,因为他们会让数据科学家看起来好像没有贡献。

报告(既无创新也无影响力)😴

不能改变任何事情并且没有创新的工作通常会被报道。这是为人们提供数字和 KPI,以便他们可以监控业务,确保一切顺利运行。有时,企业会有很好的流程来审查报告并找出机会所在。其他时候,这些报告会定期创建,但从来不会被查看。进行报告的最佳情况是,您可以设置一个自动化流程,以便在每次需要新报告时快速生成报告。最糟糕的情况是,每次您需要更新它时,这都是一个繁重的手动过程,这会拖累您的整体工作能力。作为一名数据科学家,你越能避免这成为你的工作就越好。

因此,尽可能优先考虑那些影响公司并具有创新性的项目(我们都希望自己正在做的工作)。否则,尝试做一些不创新但有用的工作,向人们提供证据,以帮助推动业务向前发展。确保你远离象牙塔,不做与业务无关的有趣工作,避免只做报告。祝你好运!

如果你想要大量的方法来帮助你在数据科学领域发展职业生涯,可以看看我和 Emily Robinson 写的书: 在数据科学领域建立职业生涯 。我们将带您了解成为数据科学家所需的技能,找到您的第一份工作,然后晋升到高级职位。

概率图形模型—简介

原文:towardsdatascience.com/probabilist…

概率图形模型或 PGM 是用于创建复杂现实世界场景概率 模型,并以紧凑图形表示来表示它们的框架。这个定义本身是非常抽象的,涉及到许多需要自己空间的术语,所以让我们一个一个地来看这些术语。

M odel 模型是我们想要分析的真实世界场景或问题的声明性表示。当我说声明性时,它意味着它不是派生的,而是由领域专家使用其对问题的领域知识或通过使用来自历史数据集的静态学习算法来声明或定义的,然后使用任何数学工具如图形或甚至简单地由方程来表示。 为 ex 在线性回归

Where Y is the outcome we want to predict given the feature vector X that affects the output. So here we assume (model) Y as a linear function of the input X which is parameterised by Theta.

为什么我们需要对问题建模?因为两个主要原因 1。它允许我们将非结构化的现实世界问题转化为结构化的数学表示 2。它允许我们将问题(模型表示)与其解决方案(算法)隔离,这意味着一旦我们有了问题的数学模型,我们就可以应用任何算法来解决它,例如,对于上述模型,我们可以使用梯度下降或任何其他方法来解决它,模型不会改变。

因为不确定性,我们通常感兴趣解决的问题的性质或者我们想要进行的查询的类型都是概率性的。造成这种情况的原因有很多。例如,对问题的不完全了解、有噪声的观察结果或对问题有贡献但不能/没有包括在模型中的一些属性。

在上面的例子中,我们使用了模型的数学表示,但是在现实世界中,情况是复杂的,经常涉及大量的变量。很多时候,图形表示帮助我们更好地可视化,然后我们使用图论来减少所有参与变量的相关组合的数量,以更紧凑地表示高维度概率分布模型。

我将使用一些与概率和统计相关的基本术语和概念来讨论 PDMs。那些在单独的帖子 【基础概率论与统计】 中有涉及。

如果模型能帮助我们理解现实世界的现象,让我们对世界在特定条件下的行为做出有用的预测,那么它通常是有用的。我们经常想在模型上做的那种查询本质上是预测当其他事情已经发生/观察到时可能会发生什么。为了回答这样的问题,我们需要考虑世界状态的所有组成部分(随机变量),并以某种方式表示它们。我们已经学过“联合分布”,我们代表一个事件的所有可能结果。因此,这意味着我们有工具来表示我们的模型,它可以覆盖所有可能的场景,这就是“联合概率分布表”(暂时仅限于离散随机变量)。那我们为什么要讨论 PGM? 问题是,即使对于一个简单的模型,变量 n 的数量也可能在 100 个的范围内,如果每个变量都能获得平均 d 值,则联合分布表的大小可能非常大。因此,表格可能不是表示复杂模型的可行方法,尽管从概念上讲它们是足够的,但是计算限制不允许它们。我们需要一些其他的表示方法,因为图形的稀疏性,它似乎是一个很好的选择。使用图来表示这种概率模型有许多优点。

  1. 即使涉及到大量的随机变量,它们也不一定都是相互依赖的。如果两个随机变量是独立的,我们不需要考虑它们在连接分布表中的所有组合,这意味着理想情况下表中的行数会更少。图论具有表示这种依赖性和独立性固有能力。
  2. 从某种意义上说,图形表示是灵活的,人们不需要获得关于世界的所有知识来建立模型。一个人可以从他对世界的理解开始,建立一个模型,它会根据它所拥有的知识来行动。当一个人获得更多的知识时,他可以将同样的知识递增地应用于模型(添加/更新节点、边),并且模型将基于新的信息产生改进的结果。
  3. 因为图是标准数学结构,所以它不仅允许对概率分布进行编码,而且为预测查询的查询模型提供了非常清晰的接口。

由于 PGM 基于图论,它们可以分为两类,即有向图无向图。有一个 PGM 家族使用有向图是贝叶斯网络,另一个使用无向图是马尔可夫网络。尽管它们都来源于图论,但它们的直觉有很多不同,并且都需要自己的空间,我将在单独的帖子中讨论它们。

深度学习背景下的概率统计解释

原文:towardsdatascience.com/probability…

让你快速起床的实用方法

Photo by Josh Appel on Unsplash

本文面向希望获得概率统计知识的深度学习初学者,也可供从业者参考。

在我的上一篇文章中,我用自上而下的方法写了关于深度学习的线性代数的概念(文章的链接)(如果你对线性代数没有足够的了解,请先阅读)。这里使用了同样的自顶向下的方法。首先提供用例的描述,然后是概念。

所有示例代码都使用 python 和 numpy。公式以图像的形式提供,以便重复使用。

目录:

  • 介绍
  • 概率基础
  • 集中趋势和可变性的度量
  • 离散概率分布,二项式分布
  • 连续概率分布、均匀分布和正态分布
  • 模型精度测量工具
  • 随机过程和马尔可夫链
  • 概率规划
  • 外部资源

简介:

概率是量化不确定事物的科学。大多数机器学习和深度学习系统利用大量数据来学习数据中的模式。每当数据被用于一个系统而不是唯一的逻辑时,不确定性就会增加,而每当不确定性增加时,概率就变得相关了。

通过将概率引入深度学习系统,我们将常识引入系统。否则,该系统将会非常脆弱,将不会有用。在深度学习中,使用了几种模型,如贝叶斯模型、概率图形模型、隐马尔可夫模型。它们完全依赖于概率概念。

真实世界的数据是混乱的。由于深度学习系统利用真实世界的数据,它们需要一种工具来处理混乱。

使用简单且不确定的系统总是比使用复杂但确定且脆弱的系统更实际。

这里介绍的概率和统计的版本是实际科目的高度简化版本。两者都是非常庞大和独立的研究课题。但是这里写的概念对于一个深度学习的追求者来说已经足够了。在本文的最后,我留下了一些关于这些主题的资源的链接。

概率基础:

如果你开始深度学习,导师提供给你的第一个例子(可能)是 MNIST 手写数字识别任务。这就像深度学习的 hello 世界。

mnist dataset

任务是对手写数字进行分类并标记。正如我前面提到的,你为完成这项任务而创建的机器学习系统是不准确或不确定的。这些图像是 28*28 像素的图像。例如,考虑以下用于此任务的神经网络。

输入图层是输入图像大小的展平矢量(28*28=784)。它被传递到一个层,在该层中,输入向量与权重相乘,并与偏差向量相加。这一层有 10 个神经元。这是暗示有 10 位数。然后他们通过一个 softmax 激活功能。

在这个步骤之后,它们不输出精确的数字,而是输出长度为 10 的向量,其中每个元素是每个数字的概率值。

我们使用 argmax 来获取输出向量中具有最高值的概率的索引。(哪个是预测)

说到这里,我们将再次详细讨论 softmax。这里的要点是,为了理解这个神经网络,我们必须理解一些概率的基础知识。

向量y=【y0,y1,y2,y3,y4,y5,y6,y7,y8,y9】

这里面概率在哪里?

样本空间 : 实验中所有可能值的集合。(在上面的例子中,输入可以来自一组图像,因此它是输入的样本空间,类似地,输出预测可以取从数字 0 到 9 的任何值,因此这些数字是输出预测的样本空间。)

随机变量 : **可以随机取样本空间不同值的变量。**在上面的神经网络中,输入向量 x 是一个随机变量,输出‘预测’是一个随机变量,神经网络的权重也是一个随机变量(因为它们是用概率分布随机初始化的。)

概率分布:概率分布是对随机变量在样本空间中取不同值的可能性的描述。在神经网络中,权重由概率分布初始化。输出向量 y 遵循 softmax 分布,soft max 分布也是显示 X 取不同数字值的概率的概率分布。(通常,softmax 提供分类值的概率)

在这个例子中,概率分布 y 是离散的(具有 10 个离散值。)而在其他一些情况下,它可能是连续的(样本空间也是连续的)。在离散分布中,概率分布由 P(x= x ) 表示的概率质量函数(pmf)提供。在上例中,softmax 函数是随机变量 x 的 pmf。

如果你看到输出向量 y = [0.03,0.5,0.07,0.04,0.06,0.05,0.05,0.06,0.04,0.1]的某个实例

这有什么特别的?如果仔细观察,它们的总和都是 1.0,argmax 显示索引 1 的最大值为 0.5,表明该值应该是 1。

这种累加到 1.0 的性质叫做归一化。此外,这些值必须介于 0 和 1 之间。不可能的事件用 0 表示,确定的事件用 1 表示。

同样的条件也适用于连续变量。(一会儿就知道了。)

3 个基本定义:

在任何概率书或课程中,你总是在一开始就学习这三个基础知识。它们是条件概率、边际概率和联合概率。

联合概率 : 两个事件同时发生的概率是多少。用 P(y=y,x=x)或 P(y 和 x) 表示。例子:同时看到太阳和月亮的概率非常低。

条件概率 : 假设另一个事件 x 已经发生,某个事件 y 发生的概率是多少。用 P(y = y | x =x) 表示。既然另一个事件 x 已经发生,它的概率不可能为零。例:吃完后喝水的概率很高。

边际概率 : 随机变量超集的一个子集的概率是多少。例如:人留长发的概率是男人留长发的概率和女人留长发的概率之和。(此处长发随机变量保持不变,性别随机变量改变。)

贝叶斯定理:它描述了一个事件发生的概率,这个概率是基于与该事件相关的其他事件的先验知识。

贝叶斯定理利用了概率中的信念概念。“我有 40%的把握这个事件会发生”并不等同于“骰子有 16%的几率显示 6”。前者利用信念,被称为贝叶斯概率,而后者依赖于以前的数据,被称为频率主义概率。 阅读更多

贝叶斯定理还被用于一种最简单的机器学习算法,称为朴素贝叶斯算法。见 sklearn 文档。

集中趋势和变化的测量:

平均值:平均值是数据的算术平均值。数字文件

import numpy as np
a = np.array([[1,2,3,4,5,6]])
np.mean(a,axis=0)

中位数:数据的中间值。数字文件

np.median(a,axis=0)

模式:数据的频繁出现值。科学文件。

import numpy as np
from scipy import statsstats.mode(a)

期望值:某个变量 X 关于某个分布 P(X= x )是从 P 中抽取 x 时 X 的平均值

期望值等于数据集的统计平均值。看为什么

方差:数据相对于平均值的可变性的度量。

import numpy as np
a = np.array([[1,2,3,4,5,6]])np.var(a)

对于随机变量,方差由下式给出:

这个公式和上面的公式意思一样。数字文档。

标准差:是方差的平方根。数字文档。

import numpy as np
np.std(a)

还有一些其他的变量度量,如范围和四分位间距。看这里

共方差:显示两个变量如何线性相关。Numpy 输出协方差矩阵,其中 Cij 表示 xi 和 xj 之间的协方差。数字文件

np.cov(a)

概率分布:

正如我在开始提到的,神经网络的几个组成部分是随机变量。随机变量的值来自概率分布。在许多情况下,我们只使用某些类型的概率分布。有些是,

**二项分布:**二项随机变量是一个随机实验的 n 次试验的成功次数。当随机变量只能有两种结果(成功和失败)时,称随机变量 x 遵循二项分布。自然,二项分布是针对离散随机变量的。 numpy 文档。

import numpy as npn=10 # number of trialsp=0.5 # probability of success
s=1000 # size
np.random.binomial(n,p,s)

连续分布:这些是为连续随机变量定义的。在连续分布中,我们用 p(x)表示的概率密度函数(pdf)来描述分布。

他们的积分等于 1。

如果你对微积分不太熟悉看这里

均匀分布:这是最简单的连续分布形式,样本空间中的每个元素都是等概率数字文档

import numpy as np
np.random.uniform(low=1, high=10,size=100)

正态分布:“从混沌中有序”

这是所有发行版中最重要的。也称为高斯分布。在缺乏关于实数分布形式的先验知识的情况下,正态分布是一个很好的选择,因为它具有高熵,并且中心极限定理表明几个独立随机变量的和是正态分布的数量单据

import numpy as np
mu = 0
sigma = 1
np.random.normal(mu,sigma,size=100)

在一个正态分布中,如果均值为 0,标准差为 1,则称为标准正态分布。

the famous bell curve

在机器学习中,你经常会遇到‘规范化’和‘标准化’这两个词。我们上面所做的获得标准正态分布的过程称为标准化,而将数据集值的范围限制在 0.0 到 1.0 之间的过程称为归一化。然而,这些术语经常互换。

from sklearn.preprocessing import StandardScaler
import numpy as npdata = np.array([1,2,3,4,5])
scaler = StandardScaler()
scaler.fit_transform(data)

在这个阶段,我们遇到了几个公式和定义。如果你把这些都背下来,那是非常有用的。(或者以此文作为参考!)还有其他重要的分布,如指数分布和泊松分布。参考此处快速浏览。

Softmax 分布:在本文开头,我提到了关于 Softmax。这是一种概率分布。它最适合用于表示 N 类分类分布中的 1 类。也是深度学习中最常用的分布。区分起来很方便。

def softmax(x):
    e_x = np.exp(x - np.max(x))
    return e_x / e_x.sum(axis=0)##the np.max(x) is used just for numerical stability.it is Not ##formula

模型精度测量工具:

为了衡量深度学习模型的性能,我们使用几个概念。了解这些概念非常重要。它们被称为度量。在上面的 MNIST 神经网络中,如果神经网络正确地预测了 100 幅输入图像中的 95 幅,那么它的准确度被认为是 95%,以此类推。(这部分用 sklearn python 库举例。)

你可以直观地理解准确性,但理论是,它是在总的获得结果中正确结果的命题。

准确性是一个非常简单的衡量标准,有时可能会提供错误的见解。在某些情况下,更高的准确性并不意味着我们的模型工作正常。为了澄清这一点,首先看下面的定义,

  • 真阳性(TP): 正例数,如此标注。
  • 假阳性(FP): 阴性样本数,标注为阳性。
  • 真否定(TN): 否定例数,如此标注。
  • 假阴性(FN): 阳性例数,标为阴性。
Accuracy = (TP + TN)/(TP + FP + TN + FN)

混淆矩阵:包含 TP、FP、TN、FN 值的矩阵。

confusion matrix

from sklearn.metrics import confusion_matrix
y_true = [2, 0, 2, 2, 0, 1]
y_pred = [0, 0, 2, 2, 0, 2]
confusion_matrix(y_true, y_pred)

现在,想象一个二进制分类器,输出 1 或 0。如果一切正常,模型没有偏差,它就表示实际的准确性。但是,如果我们调整模型,使其始终为 0(或始终为 1)(现在模型的预测能力为零)。但是我们仍然会得到很高的精度!考虑一下桌子。

 Classified positive  Classified negative 
Positive class         0 (TP)            25 (FN)
Negative class         0 (FP)           125 (TN)

这个表很明显模型很差(因为所有的正类例子都分类错误)但是准确率 83%!!

**精度和召回率:**所以我们选择另外两个指标——精度和召回率。

精度告诉你有多少选择的对象是正确的

回忆告诉你选择了多少正确的对象。

在上面的例子中,精确度和召回率都是 0.0,这表明模型非常差。

F1 得分:是精度和召回率的调和平均值。

**F1 分 0 代表最差,1 代表最好。**利用这一点,我们可以解决准确性度量的混乱行为。

Sklearn 有一个 classification_report 函数,您可以调用它来获得 precision、recall 和 f1 分数。

**>>> from** **sklearn.metrics** **import** classification_report
**>>>** y_true = [0, 1, 2, 2, 2]
**>>>** y_pred = [0, 0, 2, 2, 1]
**>>>** target_names = ['class 0', 'class 1', 'class 2']
**>>>** print(classification_report(y_true, y_pred, target_names=target_names))
              precision    recall  f1-score   support

     class 0       0.50      1.00      0.67         1
     class 1       0.00      0.00      0.00         1
     class 2       1.00      0.67      0.80         3

   micro avg       0.60      0.60      0.60         5
   macro avg       0.50      0.56      0.49         5
weighted avg       0.70      0.60      0.61         5

平均绝对误差:原始值与预测值之差的平均值。

均方误差:原始值和预测值之差的平方的平均值。

**from** **sklearn.metrics** **import** mean_squared_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mean_squared_error(y_true, y_pred)

均方误差被广泛使用,因为它更容易计算梯度。

接收机工作特性(ROC) 曲线:ROC 曲线是一个图,显示了分类模型的性能,如我们的数字识别器示例。它有两个参数——真阳性率(TPR)和假阳性率(FPR)。 TPR 和 recall 一样,也叫灵敏度。FPR 也是 1-特异性。

将这两者相对于彼此进行绘图,以获得下图(通过改变分类阈值并再次重复预测结果,获得绘图的几个值。).该 ROC 曲线下的面积是准确度的量度。

曲线下面积(AUC)的解释:当 AUC=1.0 时,模型最佳。当 AUC=0.5 时,模型最差。但是,如果 AUC=0.0,那么模型将重复结果。(就像把 1 归类为 0,把 0 归类为 1 一样)。

**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])
roc_auc_score(y_true, y_scores)

更多信息:看这里这里

使用梯形规则计算 AUC(sk learn 使用此规则 ): 看这里

随机过程、马尔可夫链和图形模型;

随机过程是由一些值索引的随机变量的集合。直观上,随机过程或随机过程是一种现象的数学模型,这种现象对于观察者来说是以不可预测的方式进行的。下一个事件的结果是不依赖于当前事件的结果。例如,一系列的硬币投掷。

如果随机过程中随机变量被索引的索引集来自一个离散的自然数,则该过程称为离散时间随机过程或随机序列。如果指标集位于实数线上,则该过程为连续时间随机过程。如果指标集位于笛卡儿平面或某些更高维的欧几里得平面,那么这个过程就称为随机场

随机过程是概率中非常有趣的一部分。它们被用来模拟与时间相关的事物,如天气预报、股票市场、自然现象等。有几个随机过程。这里我们重点关注马尔可夫链。想要更详细的资料,请参考维基百科。

马尔可夫链:

马尔可夫链是一个概率自动机。它有状态。它描述了一系列事件,其中从一个状态转移到另一个状态的概率仅取决于前一个事件这里是对马尔可夫链的极好的直观解释。

这是描述天气状况的马尔可夫链。这些值代表从一种状态转换到另一种状态的概率。

马尔可夫链用于简单的系统,如下一个单词预测、语言生成、声音生成和许多其他系统。

称为隐马尔可夫模型的马尔可夫链的扩展用于语音识别系统。

我已经停止了随机过程,并计划写一篇关于它们的文章,因为这个概念太长了。

概率规划:

一种新的编程范式已经发展成为概率编程。这些语言或库有助于模拟贝叶斯风格的机器学习。这是一个令人兴奋的研究领域,受到人工智能社区和软件工程社区的支持。这些语言很容易支持概率函数和模型,如高斯模型、马尔可夫模型等。

优步去年创建了一个这样的用于编写概率程序的库,名为 pyro ,它以 pytorch (一个深度学习库)作为后端来支持 python。

pyro library logo

如果你喜欢这篇关于深度学习的概率和统计的文章,请为这篇文章鼓掌。这里提供的内容是面向深度学习初学者的,也可以作为深度学习从业者的参考资料。但是对于初学者来说,我还会推荐几个其他很棒的外部资源来巩固他们在有趣的概率领域的知识。( 虽然你通过这篇文章获得的知识已经足够进行深度学习 )

外部资源:

关于深度学习和机器学习的超赞免费课程: fast.ai

微积分的直观解释: 3blue1brown

深度学习最佳书籍:深度学习书籍

随机过程:谢尔登·m·罗斯

统计学:拉里·乏色曼的《T2 统计大全》

概率论:威廉·费勒

数据科学的概率与统计第一部分

原文:towardsdatascience.com/probability…

概率和统计构成了数据科学的基础。概率论对做预测很有帮助。估计和预测是数据科学的重要组成部分。借助统计方法,我们作出估计,以便进一步分析。因此,统计方法在很大程度上依赖于概率论。所有的概率和统计都依赖于数据。

数据

数据是我们收集的关于某事或事实的信息(观察结果)和收集在一起用于参考或分析的统计数据。

数据——已经转化为计算机可以处理的形式的事实(数字、文字、测量、观察等)的集合

为什么数据很重要?

  • 通过识别两个变量之间可能存在的关系,帮助了解更多关于数据的信息。
  • 有助于预测未来或根据以前的数据趋势进行预测。
  • 有助于确定数据之间可能存在的模式。
  • 通过发现数据中的异常,帮助发现欺诈。

如今数据很重要,因为我们可以从中推断出重要的信息。现在让我们深入研究数据是如何分类的。数据可以有两种类型:分类数据和数字数据。例如,在一家银行,我们的地区、职业类别、性别遵循分类数据,因为数据在固定的某个值内,而余额、信用评分、年龄、任期月份遵循数值连续分布,因为数据可以遵循无限范围的值。

注:分类数据可以通过条形图、饼图、帕累托图可视化。数字数据可以通过柱状图、线图、散点图来可视化

描述统计学

描述性统计是对信息集合的特征进行定量描述或总结的汇总统计。它帮助我们更好地了解我们的数据。它用于描述数据的特征。

数据的测量水平

定性和定量数据与上述分类和数值数据非常相似。

名义:这个级别的数据使用名称、标签或质量进行分类。例如:品牌名称,邮政编码,性别。

序数:本级数据可以按顺序排列或排名,可以比较。例如:成绩、明星评论、比赛名次、日期

Interval :该级别的数据可以按其在一个数值范围内的情况进行排序,并且可以计算出数据点之间有意义的差异。例:摄氏温度,出生年份

比率:此级别的数据类似于区间级别,但增加了固有零的属性。可以对这些数据点进行数学计算。身高,年龄,体重

看看这个:数据| Mahrita Harahap

总体或样本数据

在进行任何数据分析之前,我们应该确定我们正在处理的数据是总体数据还是样本数据。

**人群:**所有物品(N)的集合,它包括我们研究的每一个单元。这是很难定义和衡量的特点,如平均,模式被称为参数。

**样本:**总体(n)的子集,它只包括少数几个总体单位。它是随机选择的,特性的测量称为统计。

例如,假设您想知道电影订阅服务的订阅者的平均收入(参数)。我们随机抽取 1000 个用户样本,并确定他们的平均 income(x̄是 34,500 美元(统计)。我们的结论是,人口平均收入(μ)也可能接近 34,500 美元。

在看数据分布之前。让我们来看看数据的度量。

集中趋势测量

集中趋势的度量是试图通过识别一组数据中的中心位置来描述该组数据的单个值。因此,集中趋势的度量有时被称为集中位置的度量。它们也被归类为汇总统计。

平均值:平均值等于数据集中所有值的总和除以数据集中值的个数,即计算出的平均值。易受异常值的影响当添加异常值时,会出现偏差,即偏离典型的中心值。

中值:中值是按数量级排列的数据集的中间值。中位数是平均值的更好替代,因为它受数据异常值和偏斜度的影响较小。中间值比典型的中心值更接近。

如果值的总数是奇数,则

如果值的总数是偶数

**模式:**模式是数据集中最常出现的值。因此,模式有时会认为模式是最受欢迎的选项。

例如,在包含{13,35,54,54,55,56 57,67,85,89,96}个值的数据集中。平均值为 60.09。中位数是 56。众数是 54。

不对称的度量

**偏斜度:**偏斜度是统计分布中的不对称,其中曲线出现扭曲或向左或向右偏斜。偏斜度表示数据是否集中在一侧。

Source: Pearson Mode Skewness: Definition and Formulas

**正偏度:**正偏度是当均值>中位数>时的模式。离群值向右倾斜,即尾部向右倾斜。

**负偏度:**负偏度是当均值<中位数<众数。离群值向左倾斜,即尾部向左倾斜。

偏斜度很重要,因为它告诉我们数据分布在哪里。

2003 年的全球收入分配是高度右倾的。我们可以看到,2003 年的平均值为 3,451 美元(绿色),高于中位数 1,090 美元。这表明全球收入分配不均。大多数个人收入低于 2,000 美元,收入高于 14,000 美元的人数较少,因此出现了偏态。但根据预测,收入不平等似乎在 2035 年会随着时间的推移而减少。

可变性(离差)的测量

集中趋势的度量给出了代表整体值的单个值;然而,中心趋势不能完全描述观察结果。离差的度量有助于我们研究项目的可变性,即数据的分布。

记住:总体数据有 N 个数据点,样本数据有(n-1)个数据点。(n-1)称为贝塞尔校正,用于减少偏差。

范围:一个数据的最大值和最小值之差,称为分布的范围。范围不考虑一个系列的所有值,即它只考虑极端项目,中间项目不被认为是重要的。例如:对于{13,33,45,67,70},范围是 57,即(70–13)。

**方差:**方差衡量每个点到平均值的距离平方和,即平均值周围的离差。

方差是所有平方偏差的平均值。

注意:值和方差的单位不相等,因此我们使用另一个可变性度量。

**标准差:**由于方差受单位差影响,所以使用标准差。方差的平方根就是标准差。它说明了数据在数据集平均值附近的集中程度。

例如:{3,5,6,9,10}是数据集中的值。

变异系数(CV): 又称相对标准差。它是标准偏差与数据集平均值的比率。

标准差是单个数据集的可变性。而变异系数可用于比较两个数据集。

从上面的例子可以看出,CV 是一样的。两种方法都很精确。所以这是完美的比较。

四分位数的度量

考虑到每个数据点,四分位数更容易理解。

查看我之前的帖子——在箱线图部分,我已经详细阐述了四分位数。

关系的度量

关系的度量用于找出两个变量之间的比较。

**协方差:**协方差是对两个变量的可变性之间关系的度量,即它度量变量的变化程度,当一个变量发生变化时,另一个变量是否会发生相同/相似的变化。

协方差没有给出关于两个变量之间关系的有效信息,因为它没有被归一化。

**相关性:**相关性让我们更好地理解协方差。它是归一化协方差。相关性告诉我们变量之间的相关程度。它也被称为皮尔逊相关系数。

相关值的范围从-1 到 1。-1 表示负相关,即一个独立变量增加,另一个因变量减少。1 表示正相关,即一个独立变量增加,另一个因变量增加。0 表示变量相互独立。

举个例子,

相关性 0.889 告诉我们身高和体重有正相关关系。很明显,随着一个人身高的增加,体重也会增加。

注:相关并不意味着因果关系对于一些奇怪的相关为虚假相关。

结论

在本文中,我们学习了描述性统计,它通过理解数据集中的关键特征来帮助我们更好地了解我们的数据。