在 featuretools 中,如何自定义 2 列的基元?

in featuretools, How to Custom Primitives of 2 columns?

我创建了如下所示的自定义基元。

class Correlate(TransformPrimitive):
name = 'correlate'
input_types = [Numeric,Numeric]
return_type = Numeric
commutative = True
compatibility = [Library.PANDAS, Library.DASK, Library.KOALAS]

def get_function(self):
    def correlate(column1,column2):
        return np.correlate(column1,column2,"same")
    
    return correlate

然后我检查了下面的计算以防万一。

np.correlate(feature_matrix["alcohol"], feature_matrix["chlorides"],mode="same")

但是上面的函数结果和下面的函数结果是不同的。

你知道为什么不一样吗?

如果我的代码基本错误,请指正。

感谢提问!您可以创建一个带有固定参数的自定义基元,以使用 TransformPrimitive 作为基础 class 来计算这种相关性。我将通过使用此数据的示例。

import pandas as pd

data = [
    [0.40168819, 0.0857946],
    [0.06268886, 0.27811651],
    [0.16931269, 0.96509497],
    [0.15123022, 0.80546244],
    [0.58610794, 0.56928692],
]

df = pd.DataFrame(data=data, columns=list('ab'))
df.reset_index(inplace=True)
df
index         a         b
    0  0.401688  0.085795
    1  0.062689  0.278117
    2  0.169313  0.965095
    3  0.151230  0.805462
    4  0.586108  0.569287

函数np.correlate是参数mode=same时的变换,所以以TransformPrimitive为基数定义自定义图元class.

from featuretools.primitives import TransformPrimitive
from featuretools.variable_types import Numeric
import numpy as np


class Correlate(TransformPrimitive):
    name = 'correlate'
    input_types = [Numeric, Numeric]
    return_type = Numeric

    def get_function(self):
        def correlate(a, b):
            return np.correlate(a, b, mode='same')

        return correlate

DFS 调用需要将数据结构化为 EntitySet,然后您可以使用自定义原语。

import featuretools as ft

es = ft.EntitySet()

es.entity_from_dataframe(
    entity_id='data',
    dataframe=df,
    index='index',
)

fm, fd = ft.dfs(
    entityset=es,
    target_entity='data',
    trans_primitives=[Correlate],
    max_depth=1,
)

fm[['CORRELATE(a, b)']]
       CORRELATE(a, b)
index                 
0             0.534548
1             0.394685
2             0.670774
3             0.670506
4             0.622236

你应该在特征矩阵和 np.correlate 之间得到相同的值。

actual = fm['CORRELATE(a, b)'].values
expected = np.correlate(df['a'], df['b'], mode='same')
np.testing.assert_array_equal(actual, expected)

您可以在链接页面中了解有关定义 simple custom primitives and advanced custom primitives 的更多信息。如果您觉得这有帮助,请告诉我。