看起来,吡火花ML没有一个内置的排列特征重要性方法。因此,我希望对此进行编码,为此,我必须对dataframe中的每一列进行单独的洗牌。我发现this资源是实现这一目标的一种方式。然而,对于一个大型的数据帧来说,它的计算量似乎非常大。有更好的办法吗?
例如,下面是一个示例,说明我如何在简单的pyspark df中洗牌列df。然后,我将在df上使用a混搭计算模型性能。接下来,我将做同样的事情来洗牌b,然后计算模型性能,等等.有更好的办法吗?
import pandas as pd
from pyspark.sql.functions import row_number, lit
# Create Pandas DF
df = pd.DataFrame({
'a': [1,5,4,3,5,7],
'b': ['a','b','a','c','d','b'],
'c': [400, 200, 150, 300, 174, 225]
})
# Convert to PySpark
df = spark.createDataFrame(df)
# Create 'index' column to join
window = Window().orderBy(lit('A'))
df = df.withColumn('index', row_number().over(window))
# Shuffle just column 'a' in a new dataframe and add 'index'
df_a = df.select('a').withColumn('rand', rand(seed=83)).orderBy('rand')\
.drop('rand')\
.withColumnRenamed('a', 'a2')\
.withColumn('index', row_number().over(window))
# Replace 'a' in df with the shuffled 'a' from df_a
df = df.join(df_a, on=['index']).drop('a').withColumnRenamed('a2', 'a').show()
+-----+---+---+---+
|index| b| c| a|
+-----+---+---+---+
| 1| a|400| 5|
| 2| b|200| 1|
| 3| d|174| 5|
| 4| c|300| 3|
| 5| b|225| 4|
| 6| a|150| 7|
+-----+---+---+---+发布于 2022-01-05 10:02:40
星火数据格式是无序的,因此这些类型的转换总是很昂贵的。
你可能想要考虑转换成熊猫做洗牌部分,然后再转换回火种:
import numpy as np
pdf = df.toPandas()
pdf["a"] = np.random.permutation(pdf["a"].values)
pdf["b"] = np.random.permutation(pdf["b"].values)
df1 = spark.createDataFrame(pdf)
df1.show()
#+---+---+---+
#| a| b| c|
#+---+---+---+
#| 3| b|400|
#| 4| a|200|
#| 5| d|150|
#| 5| c|300|
#| 1| b|174|
#| 7| a|225|
#+---+---+---+https://stackoverflow.com/questions/70586543
复制相似问题