来自管道模型的 pyspark 模型解释

Posted

技术标签:

【中文标题】来自管道模型的 pyspark 模型解释【英文标题】:pyspark Model interpretation from pipeline model 【发布时间】:2016-08-29 13:13:44 【问题描述】:

我正在使用 Pipeline 模块在 pyspark 中实现 DecisionTreeClassifier,因为我有几个特征工程步骤要在我的数据集上执行。 该代码类似于 Spark 文档中的示例:

from pyspark import SparkContext, SQLContext
from pyspark.ml import Pipeline
from pyspark.ml.classification import DecisionTreeClassifier
from pyspark.ml.feature import StringIndexer, VectorIndexer
from pyspark.ml.evaluation import MulticlassClassificationEvaluator

# Load the data stored in LIBSVM format as a DataFrame.
data = sqlContext.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt")

# Index labels, adding metadata to the label column.
# Fit on whole dataset to include all labels in index.
labelIndexer = StringIndexer(inputCol="label", outputCol="indexedLabel").fit(data)
# Automatically identify categorical features, and index them.
# We specify maxCategories so features with > 4 distinct values are treated as continuous.
featureIndexer =\
    VectorIndexer(inputCol="features", outputCol="indexedFeatures", maxCategories=4).fit(data)

# Split the data into training and test sets (30% held out for testing)
(trainingData, testData) = data.randomSplit([0.7, 0.3])

# Train a DecisionTree model.
dt = DecisionTreeClassifier(labelCol="indexedLabel", featuresCol="indexedFeatures")

# Chain indexers and tree in a Pipeline
pipeline = Pipeline(stages=[labelIndexer, featureIndexer, dt])

# Train model.  This also runs the indexers.
model = pipeline.fit(trainingData)

# Make predictions.
predictions = model.transform(testData)

# Select example rows to display.
predictions.select("prediction", "indexedLabel", "features").show(5)

# Select (prediction, true label) and compute test error
evaluator = MulticlassClassificationEvaluator(
    labelCol="indexedLabel", predictionCol="prediction", metricName="precision")
accuracy = evaluator.evaluate(predictions)
print("Test Error = %g " % (1.0 - accuracy))

treeModel = model.stages[2]
# summary only
print(treeModel)

问题是我如何对此进行模型解释?管道模型对象没有类似于 DecisionTree.trainClassifier 类中的方法的 toDebugString() 方法 而且我不能在我的管道中使用 DecisionTree.trainClassifier,因为 trainclassifier() 将训练数据作为参数。

而管道在 fit() 方法中接受训练数据作为参数,在测试数据上接受 transform()

有没有办法使用管道并仍然执行模型解释和查找属性重要性?

【问题讨论】:

【参考方案1】:

是的,我在 pyspark 中的几乎所有模型解释中都使用了以下方法。下面的行使用您的代码摘录中的命名约定。

dtm = model.stages[-1] # you estimator is the last stage in the pipeline
# hence the DecisionTreeClassifierModel will be the last transformer in the PipelineModel object 
dtm.explainParams()

现在您可以访问 DecisionTreeClassifierModel 的所有方法。所有可用的方法和属性都可以在here 中找到。代码未在您的示例上进行测试。

【讨论】:

请注意,以类似但更复杂的方式,也可以从 CrossValidatorModel 的最佳模型中提取估计器的模型。

以上是关于来自管道模型的 pyspark 模型解释的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pyspark 从结构化流数据帧构建 Spark ML 管道模型

用 PySpark ML 构建机器学习模型

PySpark 将模型预测与未转换的数据对齐:最佳实践

如何将 sklearn 管道转换为 pyspark 管道?

如何将从逻辑回归模型获得的系数映射到pyspark中的特征名称

在 pandas 数据帧上应用 Pyspark 管道