AutoGL 特征工程

我们提供了一系列的节点和图的特征工程方法。您可以挑选需要的特征工程方法,并在一个特性工程管道中编写。

快速开始

# 1. 选择一个数据集.
from autogl.datasets import build_dataset_from_name
data = build_dataset_from_name('cora')

# 2. 选择特征工程方法
from autogl.module.feature._base_feature_engineer._base_feature_engineer import _ComposedFeatureEngineer
from autogl.module.feature import EigenFeatureGenerator
from autogl.module.feature import NetLSD

# 可以通过以下方式将多个特征工程方法组合起来
fe = _ComposedFeatureEngineer([
    EigenFeatureGenerator(size=32),
    NetLSD()
])

# 3.拟合变换数据
fe.fit(data)
data1=fe.transform(data,inplace=False)

特征工程方法

现在支持3种类型的特征工程方法, 分别是 generators, selectors , graph. 你可以像在 快速开始 部分一样引入对应的模块,或者可以直接在Config或者Solver中传入需要的方法名称。

  1. generators
  1. selectors
  1. graph

NetLSD 是一种图特征生成方法。

一系列Networkx中的图特征生成方法被集成到库中, 若想了解详情,请查阅NetworkX的相关文档。 (NxLargeCliqueSize, NxAverageClusteringApproximate, NxDegreeAssortativityCoefficient, NxDegreePearsonCorrelationCoefficient, NxHasBridge ,``NxGraphCliqueNumber``, NxGraphNumberOfCliques, NxTransitivity, NxAverageClustering, NxIsConnected, NxNumberConnectedComponents, NxIsDistanceRegular, NxLocalEfficiency, NxGlobalEfficiency, NxIsEulerian)

特征工程类型根据变化特征的方法进行分类。 generators 生成新特征并拼接或覆盖原始的特征。 而 selectors 选择原始特征中有用的部分。 前两种可以节点或者边的层级使用(更改节点或边的特征), 而 graph 关注图级别的特征工程(在图特征上进行修改)。 如果您需要进一步开发使用,可以通过继承其中一种基础类进行修改;或者可以直接继承更加底层的``BaseFeature``类。

构建您自己的特征工程方法

您可以继承其中一种特征工程基础类 BaseFeatureGenerator``或 ``BaseFeatureSelector 进行修改, 重载方法 extract_xx_features。对于图层级特征工程,可以参考 _NetworkXGraphFeatureEngineer 的实现。

# 例子:创建节点ID独热编码特征
import autogl
import torch
from autogl.module.feature._generators._basic import BaseFeatureGenerator

class OneHotFeatureGenerator(BaseFeatureGenerator):
    # 设置 overrider_features 为False , 则将原始特征拼接起来; 否则直接覆盖原始特征。
    def __init__(self, override_features: bool = False):
        super(BaseFeatureGenerator, self).__init__(override_features)

    def _extract_nodes_feature(self, data: autogl.data.Data) -> torch.Tensor:
        num_nodes: int = (
            data.x.size(0)
            if data.x is not None and isinstance(data.x, torch.Tensor)
            else (data.edge_index.max().item() + 1)
        )
        return torch.eye(num_nodes)