【问题标题】:How can I get automatical features with dfs, using featuretools, when I have only one dataframe?当我只有一个数据框时,如何使用特征工具通过 dfs 获得自动特征?
【发布时间】:2023-01-05 17:18:03
【问题描述】:

我试图弄清楚 Featuretools 是如何工作的,我正在 Kaggle 上的房价数据集上测试它。因为数据集很大,我在这里只使用其中的一组。

数据框是:

train=pd.DataFrame({
'Id': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}, 
'MSSubClass': {0: 60, 1: 20, 2: 60, 3: 70, 4: 60}, 
'MSZoning': {0: 'RL', 1: 'RL', 2: 'RL', 3: 'RL', 4: 'RL'}, 
'LotFrontage': {0: 65.0, 1: 80.0, 2: 68.0, 3: 60.0, 4: 84.0}, 
'LotArea': {0: 8450, 1: 9600, 2: 11250, 3: 9550, 4: 14260}
})

我设置了数据框属性:

dataframes = {'train': (train, 'Id')}

然后调用dfs方法:

train_feature_matrix, train_feature_names = ft.dfs(dataframes=dataframes, target_dataframe_name='train', max_depth=10, agg_primitives=["mean", "sum", "mode"])

我收到以下警告:

UnusedPrimitiveWarning:在 DFS 期间未使用某些指定的原语: agg_primitives:['平均','模式','总和'] 这可能是由于使用的 max_depth 值太小,没有设置有趣的值,或者它可能表明在数据中找不到原语的兼容列。如果 DFS 调用包含上面列表中某个原语的多个实例,则不会使用它们中的任何一个。 warnings.warn(warning_msg, UnusedPrimitiveWarning)

train_feature_matrix 与原始的 train 数据框完全一样。

起初,我说这是因为我的数据框很小,无法提取任何有用的信息。但是我对整个数据框(80 列和 1460 行)得到了相同的行为。

我在 Featuretools 页面上看到的每个示例都有 2 个以上的数据框,但我只有一个。

你能在这里阐明一下吗?我究竟做错了什么?

【问题讨论】:

    标签: python pandas feature-extraction featuretools


    【解决方案1】:

    聚合基元不能在具有单个 DataFrame 的 EntitySet 上创建特征。

    这是因为当您在 EntitySet 中的 DataFrame 之间存在父子关系时,它们执行的聚合发生在一对多关系上。关于基元的 Featuretools 指南有一个部分解释了差异 here。对于您的数据,这可能看起来像一个子 DataFrame,上面有一个非唯一的 house_id 列。然后,在你的train DataFrame 上运行 dfs 会为每个 Id 聚合所需的信息,每次使用它出现在子 DataFrame 中。

    要使用单个 DataFrame 自动生成特征,您应该使用转换特征。可以在here 找到可用的 Transform Primitives。

    【讨论】:

      【解决方案2】:

      如果你只有一个数据,“headjack”库比 featuretools 更适合你的情况。在这个库中,特征工程函数是由数据集组成的,从技术上讲,该库提供了一个嵌入空间来交换表格数据集中多域的特征,我们可以应用来自泰坦尼克域的特征来改进房屋定价任务。

      它是一个开放的社区,因此您可以自己创建许多新的特征工程功能,也可以应用其他人在公共特征模型池中制作的功能。它现在有一百多个特征模型。

      例如,

      from headjackai.headjackai_hub import headjackai_hub 
      
      # headjaack experiment 
                                                                       
      #host setting
      hj_hub = headjackai_hub('http://www.headjackai.com:9000')
      
      #account login
      hj_hub.login(username='jimliu_stackoverflow', pwd='jimliu_stackoverflow')
      
      pool_list = hj_hub.knowledgepool_check(True)
      score_list = []
      task_list = []
      
      # try each feature model
      for source in pool_list:
          hj_X = hj_hub.knowledge_transform(data=X, 
                                        target_domain='boston_comparsion', 
                                        source_domain=source,
                                        label='')    
      
          N_SPLITS = 5
          strat_kf = KFold(n_splits=N_SPLITS, shuffle=True, random_state=8888)
          tr_scores = np.empty(N_SPLITS)
          scores = np.empty(N_SPLITS)
      
          try:
              # cv-5, lgbm, mae
              for idx, (train_idx, test_idx) in enumerate(strat_kf.split(X, y)):
                      X_train, X_test = hj_X.iloc[train_idx], hj_X.iloc[test_idx]
                      y_train, y_test = y[train_idx], y[test_idx]
      
                      cb_clf = lgbm.LGBMRegressor()
      
                      cb_clf.fit(X_train,y_train)
      
                      preds = cb_clf.predict(X_test)
                      loss = mean_absolute_error(y_test, preds)
                      scores[idx] = loss
      
                      preds = cb_clf.predict(X_train)
                      loss = mean_absolute_error(y_train, preds)
      
                      tr_scores[idx] = loss
      
              print("-----------------",source,"-----------------")
              print(f"mean score: {tr_scores.mean():.5f}")
              print(f"mean score: {scores.mean():.5f}")
              score_list.append(scores.mean())
              task_list.append(source)
          
          except:
              pass
      
      
      arg_index = score_list.index(min(score_list))
      print(task_list[arg_index], min(score_list))
      # ames-house 2.1316169625933044
      

      code reference

      在上面的代码示例中,我们在波士顿定价任务上尝试了每个特征模型,并选择了最好的一个作为我们的特征工程函数。

      在这个库中,你可以获得许多自动特征生成,即使是单个数据集。

      【讨论】:

        猜你喜欢
        • 2020-08-02
        • 2021-11-09
        • 2022-10-07
        • 2022-10-05
        • 2019-05-16
        • 2021-03-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-15
        相关资源
        最近更新 更多