如何解决PySpark中GBTClassifier绘制ROC曲线的summary属性报错?
解决GBTClassifier绘制ROC曲线时的AttributeError问题
你遇到的AttributeError: 'PipelineModel' object has no attribute 'summary'是因为PipelineModel本身没有summary属性——这个属性是LogisticRegressionModel这类单一分类模型才有的,而你用Pipeline封装了整个预处理和建模流程,返回的是PipelineModel,自然调用不了summary。
要给GBTClassifier绘制ROC曲线,我们需要先通过Pipeline生成预测结果,再用Spark的BinaryClassificationMetrics计算ROC的FPR(假阳性率)和TPR(真阳性率)数据,最后用Matplotlib绘图。下面是修正后的完整流程:
步骤1:保留原有的模型训练代码
你的predictions函数逻辑没问题,继续用它训练PipelineModel:
gbt_model = predictions(train_df = train_df, target_col = 'income')
步骤2:对测试集生成预测结果
用训练好的PipelineModel对测试集进行预测,得到包含概率和标签的结果:
# 生成测试集预测结果,包含probability(概率列)和label(标签列) predictions_df = gbt_model.transform(test_df)
步骤3:用BinaryClassificationMetrics计算ROC数据
Spark的BinaryClassificationMetrics需要输入(score, label)格式的RDD,其中score是正类的概率值,label是索引后的目标标签:
from pyspark.mllib.evaluation import BinaryClassificationMetrics # 提取正类概率(probability[1]表示第二个类别,即索引后的正类)和标签,转换为RDD score_and_label = predictions_df.select("probability", "label").rdd.map(lambda row: (row.probability[1], row.label)) # 初始化指标对象 metrics = BinaryClassificationMetrics(score_and_label) # 获取ROC曲线的所有点(FPR和TPR) roc_points = metrics.roc().collect()
步骤4:转换数据并绘制ROC曲线
把ROC数据转换成Pandas DataFrame,方便用Matplotlib绘图:
import pandas as pd import matplotlib.pyplot as plt # 转换为Pandas DataFrame roc_df = pd.DataFrame(roc_points, columns=["FPR", "TPR"]) # 绘制ROC曲线 plt.figure(figsize=(5,5)) plt.plot([0, 1], [0, 1], 'r--', label='Random Guess') plt.plot(roc_df["FPR"], roc_df["TPR"], label='GBT Classifier') plt.xlabel('False Positive Rate (FPR)') plt.ylabel('True Positive Rate (TPR)') plt.title('ROC Curve for GBT Classifier') plt.legend() plt.show()
额外说明
如果需要单独查看GBT模型的细节(比如特征重要性),可以从PipelineModel中提取出训练好的GBT模型:
gbt_trained = gbt_model.stages[-1] # 打印特征重要性 print(gbt_trained.featureImportances)
内容的提问来源于stack exchange,提问作者Gun
相关产品推荐
相关产品推荐

