标签: feature-engineering

为什么不应该使用 sklearn LabelEncoder 来编码输入数据?

sklearn.LabelEncoder的文档

这个转换器应该用于编码目标值,即 y,而不是输入 X。

为什么是这样?

我只发布了这个建议在实践中被忽略的一个例子,尽管似乎还有更多。 https://www.kaggle.com/matleonard/feature-generation包含

#(ks is the input data)

# Label encoding
cat_features = ['category', 'currency', 'country']
encoder = LabelEncoder()
encoded = ks[cat_features].apply(encoder.fit_transform)
Run Code Online (Sandbox Code Playgroud)

python sklearn-pandas feature-engineering

9
推荐指数
1
解决办法
632
查看次数

分类特征相关

我的数据中有一些连续的分类特征。对类别特征进行热编码以找到其与其他连续生物与标签的相关性是一个好主意还是绝对坏主意?

machine-learning pandas categorical-data feature-engineering

8
推荐指数
1
解决办法
6983
查看次数

PySpark中的慢速功能工程

我正在尝试使用pyspark进行数据准备,其中涉及其他步骤,例如字符串索引,一种热编码和分位数离散化。我的数据框有很多列(1000列,其中包括500个间隔列,250个分类和250个二进制),位于100万行。

我的观察是,某些数据转换比其他数据转换要慢得多。如下摘要所示,某些步骤甚至可持续3个小时左右,而其他步骤仅需几分钟

步骤(执行时间):

  • 所有间隔变量的Log10转换(00:02:22)
  • 数据帧的随机数据分区(00:02:48)
  • 分位数的分位数离散化和向量组合(02:31:37
  • 一种针对分类的热编码和向量组合(03:13:51
  • 二进制文件的字符串索引和向量组装(03:17:34

似乎执行效果最差的步骤是字符串索引,一种热编码,分位数离散化或向量汇编。

您能否建议我应该检查或调整Spark配置或代码中的哪些内容以显着提高这些步骤的性能?

我使用了Pyspark.ml.feature中的上述功能工程步骤方法QuantileDiscretizer,VectorAssembler,OneHotEncoder,StringIndexer。我确定数据已完全上传到群集内存(persist(StorageLevel.MEMORY_ONLY))中。

我的集群包含7个节点(每个4核和16GB RAM)。Spark版本是2.2。使用Pyspark。

应用的Spark配置:

  • spark.serializer = org.apache.spark.serializer.KryoSerializer
  • spark.kryo.unsafe = true
  • spark.rdd.compress = false
  • 大师=纱线
  • 部署模式=集群
  • spark.driver.cores = 4
  • 驱动程序内存= 4G
  • num-executors = 6
  • 执行器内存= 10G
  • 执行者核心数= 4
  • spark.yarn.maxAppAttempts = 1
  • spark.sql.cbo.enabled = true
  • spark.sql.constraintPropagation.enabled = false

apache-spark pyspark apache-spark-ml feature-engineering

7
推荐指数
0
解决办法
441
查看次数

如何处理传统机器学习中的字符串特征数组?

问题

假设我们有一个如下所示的数据框:

age  job         friends                                    label
23   'engineer'  ['World of Warcraft', 'Netflix', '9gag']   1
35   'manager'   NULL                                       0
...
Run Code Online (Sandbox Code Playgroud)

如果我们有兴趣训练一个使用年龄工作朋友作为特征来预测标签的分类器,我们将如何将这些特征转换为可以输入模型的数值数组?

  • 年龄非常简单,因为它已经是数字了。
  • 作业可以被散列/索引,因为它是一个分类变量。
  • Friends 是一个分类变量列表。我将如何表示此功能?

方法:

散列列表的每个元素。使用示例数据帧,让我们假设我们的哈希函数具有以下映射:

NULL                -> 0
engineer            -> 42069
World of Warcraft   -> 9001
Netflix             -> 14
9gag                -> 9
manager             -> 250
 
Run Code Online (Sandbox Code Playgroud)

让我们进一步假设朋友的最大长度为 5。任何较短的都会在右侧填充零。如果好友大小大于 5,则选择前 5 个元素。

方法一:散列和堆栈

特征转换后的数据框如下所示:

feature                             label
[23, 42069, 9001, 14, 9, 0, 0]      1
[35, 250,   0,    0,  0, 0, 0]      0
Run Code Online (Sandbox Code Playgroud)

限制 …

machine-learning feature-extraction deep-learning feature-engineering

6
推荐指数
1
解决办法
699
查看次数

如何处理Spark中最新的随机林中的分类功能?

在随机森林的Mllib版本中,可以用参数指定具有名义特征(数字但仍为分类变量)categoricalFeaturesInfo 的列ML随机森林有什么用?在用户指南中,有一个使用VectorIndexer 的示例该示例也可以转换vector中的分类特征,但是它写为“自动识别分类特征并对其进行索引”

在关于同一问题的其他讨论中,我发现在随机森林中无论如何数字索引都被视为连续特征,建议进行一次热编码以避免这种情况,在这种算法的情况下似乎没有意义,并且特别是考虑到上述官方示例!

我还注意到,当分类列中有很多类别(> 1000)时,一旦用StringIndexer对其进行了索引,随机森林算法就会要求我设置MaxBin参数,该参数应该与连续功能一起使用。这是否意味着如官方示例中所指定的那样,将要将超过箱数的特征视为连续特征,因此对于我的分类列,StringIndexer是可以的,还是意味着整个具有数字标称特征的列都将是假设变量是连续的,进行分类?

random-forest apache-spark apache-spark-ml apache-spark-mllib feature-engineering

5
推荐指数
1
解决办法
954
查看次数

随机森林中的循环序数特征

如何为随机森林算法准备循环序数特征,例如一天中的时间或一周中的一天?

仅用午夜后的分钟来编码时间,23:55 和 00:05 之间的信息差异将非常大,尽管只有 10 分钟的差异。

我在这里找到了一个解决方案,其中使用午夜后秒数特征的余弦和正弦将时间特征分为两个特征。但这适合随机森林吗?使用随机森林时,无法确定每次分割都会出现所有特征。通常,决策时有一半的时间会缺少信息。

期待您的想法!

machine-learning random-forest feature-engineering

5
推荐指数
1
解决办法
1102
查看次数

将整数分布在多行中,除以常数除以它的次数

我有一个数据框

       Date      repair     
 <date>           <dbl>        
 2018-07-01        4420    
 2018-07-02          NA   
 2018-07-03          NA
 2018-07-04          NA
 2018-07-05          NA
Run Code Online (Sandbox Code Playgroud)

其中4420是时间,以分钟为单位。我试图得到这个:

       Date      repair     
 <date>           <dbl>        
 2018-07-01        1440    
 2018-07-02        1440   
 2018-07-03        1440
 2018-07-04         100
 2018-07-05          NA
Run Code Online (Sandbox Code Playgroud)

一天中有1440分钟-剩下100分钟。我做到了循环。能否以更优雅的方式实现?

r dplyr tidyverse feature-engineering

5
推荐指数
1
解决办法
73
查看次数

在机器学习中使用 CNN 将图像特征和数字特征结合在一起的最佳方法是什么?

我在这里有这个问题:例如,如果有必要使用图像数据和一些数字数据来预测疾病,那么特征将是这样的:

  1. 特点一:疾病形象。形状:(批量大小、宽度、高度)
  2. 特征 2:有关患者的数字数据(年龄、身高、性别、国家/地区、工资...),形状:(batch_size,number_of_numeric_features)

模型的输出应该是0/1,0是健康的,1是生病的。

我知道一种方法是使用平面特征作为形状:(width*height+number_of_numeric_feature) 在这种情况下,CNN 在图像分类中的优势将不会被利用。(前馈网络)

所以我的问题是:是否有使用 CNN 结合图像特征和数字特征的最佳解决方案?在 CNN 功能的一个通道中添加数字特征作为图像像素会有帮助吗?在这种情况下,数字特征作为像素的位置距离没有任何意义,因为它们与两个像素的距离没有关系。

machine-learning conv-neural-network feature-engineering

5
推荐指数
1
解决办法
1446
查看次数

对具有离散、连续和分类变量的数据集执行值估计的最佳方法是什么?

就性能和准确性而言,解决此回归问题的最佳方法是什么?在这种情况下,特征重要性会有帮助吗?我该如何处理如此大范围的数据?

请注意,我不是这方面的专家,所以我可能有关于为什么事情/方法不起作用的错误信息或理论。


数据:每个项目都有一个id和各种属性。大多数物品具有相同的属性,但是有一些特殊物品具有物品特定的属性。一个例子看起来像这样:

item = {
  "item_id": "AMETHYST_SWORD",
  "tier_upgrades": 1,  # (0-1)
  "damage_upgrades": 15,  # (0-15)
     ...
  "stat_upgrades": 5  # (0-5)
}
Run Code Online (Sandbox Code Playgroud)

任何属性与该项目的值之间都是线性关系;如果属性的级别增加,则其值也增加,反之亦然。然而,1级升级不一定是2级升级价值的1/2;每个级别增加的附加值是不同的。每次升级的价值在物品之间并不是恒定的,没有升级的物品的价格也不是恒定的。所有属性的上限都为某个整数,但并非所有属性都恒定。

随着物品获得更高级别的升级,它们也更有可能进行其他高级升级,这就是为什么价格在升级级别 10+ 时开始出现更陡峭的原因。

线性关系

收集的数据:我收集了有关这些物品的价格以及这些升级的各种不同组合的大量数据。请注意,每次升级永远不会有每种组合,这就是为什么我必须对这个问题进行某种预测。

就经济和定价而言,无法从商店直接购买的高等级、低掉落几率的物品将根据纯粹的需求/供应来定价。然而,需要一定成本来解锁/购买的中间层物品通常会比获取成本稍高一些。

有些升级是二进制的(范围从 0 到 1)。如下所示,几乎所有点都tier_upgrades == 0与 的下半部分重叠tier_upgrades == 1,我认为这可能会导致任何类型的回归出现问题。

tier_upgrades 与价格,显示重叠数据


到目前为止所做的尝试:我尝试过线性回归、K 最近邻搜索,并尝试制定自定义算法(更多内容见下文)。


回归:它有效,但误差很大。由于我正在处理的数据的性质,许多特征不是 1 就是 0 和/或有很多重叠。据我了解,这会在模型中产生大量噪声并降低其准确性。我也不确定它扩展到多个项目的效果如何,因为每个项目的价值都是相互独立的。除此之外,从理论上讲,回归应该有效,因为不同的属性会线性影响项目的价值。

from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn import linear_model

x = df.drop("id", axis=1).drop("adj_price", axis=1)
y = df.drop("id", axis=1)["adj_price"]

x_train, x_test, y_train, y_test …
Run Code Online (Sandbox Code Playgroud)

python statistics regression prediction feature-engineering

5
推荐指数
1
解决办法
593
查看次数

Vertex AI 特征存储与 BigQuery

我试图找出使用 GCP Vertex AI 特征存储和将预处理特征保存到 BigQuery 并在需要时加载之间的主要区别。

我仍然不明白为什么选择第一个选项,而不是第二个选项,后者似乎更容易且更容易访问。

有什么充分的理由在 Vertex AI 中使用特征存储,而不是以 BigQuery 表格式存储特征?

google-bigquery google-cloud-platform feature-engineering google-cloud-vertex-ai

5
推荐指数
1
解决办法
1190
查看次数