我目前正在使用c#开发规范化PMML-Model执行器。
这些PMML规范化模型如下所示:
<TransformationDictionary>
<DerivedField displayName="BU01" name="BU01*" optype="continuous" dataType="double">
<Extension name="summary" extender="KNIME" value="Min/Max (0.0, 1) normalization on 17 column(s)"/>
<NormContinuous field="BU01">
<LinearNorm orig="0.0" norm="-0.6148417019560395"/>
<LinearNorm orig="1.0" norm="-0.6140350877192982"/>
</NormContinuous>
</DerivedField>
(...)
我确实知道理论上使用min-max规范化是如何工作的
z_i = (x_i - min(x)) / (max(x) - min(x))
将数据集归一化为0-1范围,显然不难逆转此方程。
因此要执行规范化和非规范化,我必须以某种方式将此orig规范值转换为最小,最大值。但是我无法弄清楚这些orig / norm值是如何计算的以及它们与min / max的关系。
所以我要问的是,是否有人知道将orig / norm转换为min / max并返回的方程。还是有人能够解释如何直接使用orig / norm值对我的字段进行规范化/非规范化?
编辑:好像我没有清楚说明问题到底是什么一样,所以这是另一种方法:
我尝试使用Min-Max normalization method(又称{},将数据集的属性 归一化到0-1的范围内。 {1}})。使用数据分析工具Knime可以执行此操作,并导出“缩放” 作为PMML模型。 (示例就是上面提供的XML)
使用这些规范化的属性,我训练了我的MLP模型。现在,如果将我的MLP模型导出为PMML,则在计算预测时必须输入归一化值并获得归一化输出。 (计算MLP网络已经可以了)
在Knime无法为我执行此规范化的部署方案中,我想使用我的规范化模型。如前所述,我确实了解Feature Scaling
的理论,并且可以轻松地计算出归一化/归一化(如果我提供了属性的min和max )。问题在于,PMML还有另一个“符号”用于保存此最小-最大信息,该信息以某种方式位于Feature Scaling
和orig
值内。
因此,我最终要寻找的是一种将orig / norm转换为min / max或如何将min / max信息“编码”为orig / norm值的方法。
[为什么首先进行这种“编码”似乎是因为计算速度原因(在我的场景中这并不重要),并且更容易编码除0-1以外的范围的最小/最大规范化信息。] < / p>
举个例子:
假设我想将[0、1、2、4、8]的数组标准化为0-1的范围。显然答案是[{,0.125,0.25,0.5,1],由norm
计算得出,最小值= 0,最大值= 8。但是现在,如果我看一下PMML标准化模型:
Feature Scaling
[1,2,4,8]-> [0,0.333,0.667,1] 使用:
<TransformationDictionary>
<DerivedField displayName="column1" name="column1*" optype="continuous" dataType="double">
<Extension name="summary" extender="KNIME" value="Min/Max (0.0, 1) normalization on 1 column(s)"/>
<NormContinuous field="column1">
<LinearNorm orig="0.0" norm="0.0"/>
<LinearNorm orig="1.0" norm="0.125"/>
</NormContinuous>
</DerivedField>
</TransformationDictionary>
那么我应该如何用orig / norm进行缩放或从这些值计算min / max?
答案 0 :(得分:0)
我要说的话取决于(min, max)
的意思。
我将假设min等于总值的0.5%的值低于最大值,max等于总值的0.5%的值高于值。
如果我们对此表示同意,则对称正态分布的平均值约为mean ~ (max+min)/2
。 (您称平均值为原点。)
六个标准偏差包含正态分布的99%,因此标准偏差约为sigma ~ (max-min)/6
。
归一化的z = (x - mean)/sigma
的{{3}}。
有了这些值,您就可以回到非正规分布。
答案 1 :(得分:0)
找到了答案。在仔细阅读了Documentation(这使imo变得极为混乱)之后,我遇到了这句话:
LinearNorm元素的序列定义了逐步线性插值函数的点序列。该序列必须至少包含两个元素。在NormContinous中,必须按orig的升序严格对LinearNorm元素进行排序。
基本上解释了这一切。通过使用仅2个点的逐步插值来完成PMML中的归一化。所以实际上只是一个简单的转换函数。
在归一化为0-1的情况下,两个点将始终位于x1=0
和x2=1
(原始值)处,会变得更加容易。因此,它们的y 轴截距始终为orig = 0 norm-value 。就函数的斜率而言,通过slope = (y2-y1)/(x2-x1) = (y2-y1)/(1-0) = y2-y1
来计算也很容易,f(x) = ax + b = (y2-y1)x + y1 = (norm(orig=1)-norm(orig=0) * x + norm(orig=0)
只是两个范数。
因此,要获得始终为多项式一年级的插值函数,我们只需计算:
x = (f(x) - norm(orig=0)) / (norm(orig=1)-norm(orig=0))
用于标准化。
现在我们可以计算逆数:
{{1}}用于去规范化
希望这可以帮助每个有一天还会遇到实施自己的PMML执行器引擎的麻烦并陷入这一话题的人。