我正在尝试在PySpark中运行线性回归,我想创建一个包含汇总统计信息的表,例如我的数据集中每列的系数,P值和t值.但是,为了训练线性回归模型,我必须使用Spark创建一个特征向量VectorAssembler,现在对于每一行我都有一个特征向量和目标列.当我尝试访问Spark的内置回归摘要统计信息时,它们会为每个统计信息提供一个非常原始的数字列表,并且无法知道哪个属性对应于哪个值,这很难通过手动计算出来大量的列.如何将这些值映射回列名?
例如,我的当前输出是这样的:
系数:[ - 187.807832407,-187.058926726,85.1716641376,10595.3352802,-127.258892837,-39.2827730493,-1206.47228704,33.7078197705,99.9956812528]
P值:[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.18589731365614548,0.275173571416679,0.0]
t统计量:[ - 23.348593508995318,-44.72813283953004,19.836508234714472,144.49248881747755,-16.547272230754242,-9.560681351483941,-19.563547400189073,1.3232383890822680,1.0912415361190977,20.383256127350474]
系数标准误差:[8.043646497811427,4.182131353367049,4.293682291754585,73.32793120907755,7.690626652102948,4.108783841348964,61.669402913526625,25.481445101737247,91.63478289909655,609.7007361468519]
除非我知道它们对应哪个属性,否则这些数字毫无意义.但在我看来,DataFrame我只有一个名为"features"的列,其中包含稀疏向量行.
当我有一个热编码特征时,这是一个更大的问题,因为如果我有一个长度为n的编码变量,我会得到n个相应的系数/ p值/ t值等.
python machine-learning apache-spark pyspark apache-spark-ml
我正在对具有一个分类自变量的数据使用GLM(在Spark 2.0中使用ML)运行模型。我使用StringIndexer和将该列转换为伪变量OneHotEncoder,然后使用VectorAssembler将其与连续的独立变量组合成稀疏向量的列。
如果我的列名continuous以及categorical其中,所述第一浮体是一列,第二个是表示字符串的列(在这种情况下,8)不同的类别:
string_indexer = StringIndexer(inputCol='categorical',
outputCol='categorical_index')
encoder = OneHotEncoder(inputCol ='categorical_index',
outputCol='categorical_vector')
assembler = VectorAssembler(inputCols=['continuous', 'categorical_vector'],
outputCol='indep_vars')
pipeline = Pipeline(stages=string_indexer+encoder+assembler)
model = pipeline.fit(df)
df = model.transform(df)
Run Code Online (Sandbox Code Playgroud)
至此一切正常,我运行模型:
glm = GeneralizedLinearRegression(family='gaussian',
link='identity',
labelCol='dep_var',
featuresCol='indep_vars')
model = glm.fit(df)
model.params
Run Code Online (Sandbox Code Playgroud)
哪个输出:
DenseVector([8440.0573,3729.449,4388.9042,2879.1802,4613.7646,5163.3233,5186.6189,5513.1392])
很好,因为我可以验证这些系数(通过其他来源)本质上是正确的。但是,我还没有找到一种将这些系数链接到原始列名的好方法,这是我需要做的(我为SO简化了此模型;涉及更多)。
列名称和系数之间的关系被StringIndexer和打破OneHotEncoder。我发现了一种相当慢的方法:
df[['categorical', 'categorical_index']].distinct()
Run Code Online (Sandbox Code Playgroud)
这给了我一个较小的数据框,将字符串名称与数字名称相关联,我认为我可以将其与稀疏向量中的键相关联?但是,当您考虑数据规模时,这非常笨拙且缓慢。
有一个更好的方法吗?