【问题标题】:PySpark MLLib: Convert numerical to categoricalPySpark MLLib:将数值转换为分类
【发布时间】:2020-04-16 03:45:18
【问题描述】:

我从一个数据仓库获得了一个数据框,它有一些基于日期的功能,例如

  • a) 像 2011 年或 2012 年这样的年份在一列中,
  • b) 另一列中的月份编号,如 1 到 12,
  • c) weekdayNum 就像一列中的 1 到 7 和
  • d) 其他列中的一些其他派生列,例如 IsSunday 或 IsMonday(表示为 0 或 1)。
  • e) 具有其他一些数字特征等,例如房屋售价。
The types of all these are IntegerType()

问题 1:要训练模型,我应该将这些与日期相关的列转换为分类吗?

问题 2:如何在 PySpark MLLib 中执行此操作?将数据类型转换为 StringType() 就足够了吗?所以我的意思是如果monthnum为1,那么我可以使用以下代码转换为“1”吗? ML 算法会将其视为分类吗?

或者有更好的方法吗?

from pyspark.sql.types import StringType

df = df.witColumn("MonthNum", df["MonthNum"].cast(StringType()))

非常感谢您的帮助。

【问题讨论】:

  • 不需要类型转换,使用 VectorAssemeber + VectorIndexer (set maxCategories) 应该足以完成您的任务。 spark.apache.org/docs/latest/api/python/…
  • 非常感谢 jxc。
  • @jxc:关于 VectorIndexer 的一个问题。假设我有 35 个特征,其中只有 20 个是分类特征 - 如何使用 VectorIndexer 指定这 20 个?
  • 这里是你需要指定maxCategories的地方:如果n_ii'th分类列(共20个)中不同值的数量,你可以设置@987654327 @,然后具有较少不同值的列将自动转换为名义特征。但是,如果某些数值特征的不同值比 maxCategories 少,则单独处理它们。
  • 谢谢@jxc。这太棒了。您能否阐明如何分别处理数字特征?我需要创建带有特征的向量,那么如何将它们分开并将它们放在向量中

标签: python dataframe apache-spark pyspark


【解决方案1】:

除了前面的答案之外,如果您希望将日期的序数性质考虑到模型中,那么您可以尝试将日期转换为 unix 时间戳。唯一的问题是您需要日期而不是数据中的周数。您可以使用简单的 udf 进行转换。如果您可以直接获得日期,那就太好了。 获得数据后,您可以执行以下操作:

df_new = df.withColumn("date_info",concat_ws("-",col('date'),col('month'),col('year')))

df_timestamp = df_new.withColumn("time_stamp",unix_timestamp(col('date_info'),format='dd-MM-yyyy'))

现在,除了这个时间戳,您还可以对其他连续特征进行矢量组合。在您进行训练之前对所有特征进行归一化也会很好。您可以检查 pyspark.ml.feature.MinMaxScaler()

【讨论】:

  • 谢谢@Raghu。我没有将 Date 添加到组合中,但肯定是 monthNum 和 weekdayNum。所以(如果我理解正确并且)如果我在这些列上扩展你的逻辑,你是说这些列应该保持为整数以获得它们的序数性质吗?还是将它们转换为 StringType 以使它们成为 Categorical 并且类别值将处理它们如何影响结果的内在性质更好?
  • 我的意思是,如果我将 1 转换为“Jan”或“1”——那么 1 月份的任何年度房价销售可能仍会被纳入结果——是否将其保持为 1(作为整数) 让它变得更好,并且通过保持它的序数性质会有任何额外的收益吗?
  • 我的意思是将您的日期信息转换为 unix 时间戳。检查此链接:unixtimestamp.com
  • 我的意思是将您的日期信息转换为 unix 时间戳。检查此链接:unixtimestamp.com 因此,您的 rdata 中的每一天都将转换为数值。例如,20/01/2020 是 1579478400,21/01/2020 是 1579564800。这就是您可能需要日期或一些默认值的原因。通过这种方式,您正在翻译数据中日期的增加性质,然后这将被考虑到您的模型中。但是,如果您希望模型按类别学习,例如 1 月份的销售额或 CW 中的销售额,那么转换为类别会更好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
相关资源
最近更新 更多