PySpark 中的 RobustScaler
RobustScaler in PySpark
我想使用 RobustScaler 来预处理数据。在 sklearn 中可以在
中找到它
sklearn.preprocessing.RobustScaler
。但是,我正在使用 pyspark,所以我尝试使用以下方式导入它:
from pyspark.ml.feature import RobustScaler
但是,我收到以下错误:
ImportError: cannot import name 'RobustScaler' from 'pyspark.ml.feature'
正如 pault 指出的那样,RobustScaler 仅在 pyspark 3 中实现。我正在尝试将其实现为:
class PySpark_RobustScaler(Pipeline):
def __init__(self):
pass
def fit(self, df):
return self
def transform(self, df):
self._df = df
for col_name in self._df.columns:
q1, q2, q3 = self._df.approxQuantile(col_name, [0.25, 0.5, 0.75], 0.00)
self._df = self._df.withColumn(col_name, 2.0*(sf.col(col_name)-q2)/(q3-q1))
return self._df
arr = np.array(
[[ 1., -2., 2.],
[ -2., 1., 3.],
[ 4., 1., -2.]]
)
rdd1 = sc.parallelize(arr)
rdd2 = rdd1.map(lambda x: [int(i) for i in x])
df_sprk = rdd2.toDF(["A", "B", "C"])
df_pd = pd.DataFrame(arr, columns=list('ABC'))
PySpark_RobustScaler().fit(df_sprk).transform(df_sprk).show()
print(RobustScaler().fit(df_pd).transform(df_pd))
但是我发现要获得与 sklearn 相同的结果,我必须将结果乘以 2。此外,我担心如果列中有许多接近零的值,则四分位数范围 q3-q1 可能会变成太小会让结果发散,产生空值。
有人对如何改进它有什么建议吗?
此功能已在 recent pyspark 版本中发布。
我想使用 RobustScaler 来预处理数据。在 sklearn 中可以在
中找到它sklearn.preprocessing.RobustScaler
。但是,我正在使用 pyspark,所以我尝试使用以下方式导入它:
from pyspark.ml.feature import RobustScaler
但是,我收到以下错误:
ImportError: cannot import name 'RobustScaler' from 'pyspark.ml.feature'
正如 pault 指出的那样,RobustScaler 仅在 pyspark 3 中实现。我正在尝试将其实现为:
class PySpark_RobustScaler(Pipeline):
def __init__(self):
pass
def fit(self, df):
return self
def transform(self, df):
self._df = df
for col_name in self._df.columns:
q1, q2, q3 = self._df.approxQuantile(col_name, [0.25, 0.5, 0.75], 0.00)
self._df = self._df.withColumn(col_name, 2.0*(sf.col(col_name)-q2)/(q3-q1))
return self._df
arr = np.array(
[[ 1., -2., 2.],
[ -2., 1., 3.],
[ 4., 1., -2.]]
)
rdd1 = sc.parallelize(arr)
rdd2 = rdd1.map(lambda x: [int(i) for i in x])
df_sprk = rdd2.toDF(["A", "B", "C"])
df_pd = pd.DataFrame(arr, columns=list('ABC'))
PySpark_RobustScaler().fit(df_sprk).transform(df_sprk).show()
print(RobustScaler().fit(df_pd).transform(df_pd))
但是我发现要获得与 sklearn 相同的结果,我必须将结果乘以 2。此外,我担心如果列中有许多接近零的值,则四分位数范围 q3-q1 可能会变成太小会让结果发散,产生空值。
有人对如何改进它有什么建议吗?
此功能已在 recent pyspark 版本中发布。