我的标准化关闭了吗?

数据挖掘 分类 预处理 正常化
2022-03-04 14:53:24

所以我有一个DataFrame由客户在交易所的订单数据组成的。

我有一列Dollars是客户以不同货币对进行的所有交易的美元价值。我想在这些数据上训练一个分类器,所以我正在规范化Dollar列以使值进入相同的范围,但我认为规范化的值看起来很……奇怪。这是我的 DataFrame 的片段:

Dollars   | Normalized dollars
181447.50 | 9.10975e-06
281885.00 | 1.41523e-05
290786.00 | 1.45992e-05
70923.00  | 3.56076e-06
1121169.54| 5.62894e-05

这些值看起来很小

我用过sklearn.preprocessing.normalize这个。

值得一提的是,最低Dollars值是0.06,而最大的是5,605,847,772.52,我认为这是解释,但我期待的是 0-1 范围,但我最大的归一化值是0.157作为一般规则,我是否应该对数据集进行更多过滤以去除极端异常值?

更新:将以 10 为底的对数应用于美元会产生一些更易于管理的结果,尽管标准化值仍然相当小。ScaledDollars是使用sklearn.StandardScaleron的结果Log10Dollars

Dollars   | Normalized dollars| Log10Dollars | LogNorm   | ScaledDollars
181447.50 | 9.10975e-06       | 5.258751     | 0.00384193| -0.761916
281885.00 | 1.41523e-05       | 5.450072     | 0.00398171| -0.573336
290786.00 | 1.45992e-05       | 5.463573     | 0.00399157| -0.560028
70923.00  | 3.56076e-06       | 4.850787     | 0.00354388| -1.16404
2个回答

您应该使用缩放而不是标准化。通过对列进行标准化,您可以得到norm1,而您有兴趣使标准偏差为 1 的预期值 0。使用规范,您拥有的样本越多,样本就会变得越小。请改用 scikit-learn StandardScaler。尽管如此,对于这些巨大的数字,您仍然会得到奇怪的结果(尽管其中大多数会因这种偏差而为负)。可能的替代方法是首先对您的美元使用对数转换,然后对其进行缩放。从概念上讲,您通常会查看美元之间的相对值,10 和 20 美元之间的差异类似于对数转换将捕获的 10,000 和 20,000 之间的差异。

获得如此小的值并不奇怪,因为您的所有值在减去5,605,847,772.460.06

如何进行对数标准化?显然,像这里解释的那样在财务数据上使用它并不少见

编辑(为了回答的完整性)

在取每个值的对数后,如果您希望您的值位于 0-1之间,您可能需要使用MinMaxScaler()而不是 scikit-learn 的 L2 范数。

如果在 Normalization/Scaling 之后的元素“表示为“ ”,那么,xiLog10Dollarsxi¯

  • 使用 sklearn 中的 L2 范数:xi¯=xii=1nxi2
  • 使用MinMaxScaler()xi¯=ximin(x)max(x)min(x)

第二个表示会给你xi¯[0,1]