单纯比较准确率或AUC等总体性能指标,理解模型为何如此运行通常很重要。机器学习实用性的一项要点是,用合成数据训练的模型是否学习到与用相应真实数据训练的模型相似的底层模式和特征关联。如果合成数据导致模型依赖完全不同的特征,或赋予非常不同的权重,那么即使总体性能指标看起来可以接受,其实际用处也可能有限。评估特征重要性一致性有助于我们衡量这种对齐程度。特征重要性量化了每个输入特征对模型预测的贡献。常用方法包括:置换重要性: 衡量当单个特征的值被随机打乱时,模型得分的下降程度。系数幅度: 对于线性模型(如线性回归或逻辑回归),系数的绝对值可以表示特征重要性。基于树的重要性: 随机森林或梯度提升树等模型提供基于不纯度(例如,基尼重要性)或基于分裂的重要性度量。SHAP(Shapley加性解释)值: 一种博弈论方法,提供一致且局部准确的特征归因。我们的目的不是重新解释这些方法,而是运用它们的输出来比较在真实数据和合成数据上训练的模型。其核心思路遵循“训练-合成-测试-真实”(TSTR)原则,但除了仅评估真实测试集上的预测,我们还会分析学习到的特征重要性。比较重要性排名和幅度最直接的方法包含以下步骤:训练模型R: 在真实训练数据集上训练一个选定的机器学习模型(例如,随机森林、梯度提升、逻辑回归)。计算重要性R: 使用选定的方法(例如,置换重要性)计算模型R的特征重要性。训练模型S: 在合成训练数据集上训练相同类型的模型,最好使用相同的超参数。计算重要性S: 使用与步骤2相同的方法计算模型S的特征重要性。比较: 分析重要性R和重要性S之间的相似性。可以采用几种比较技术:排名相关性: 计算基于特征重要性得分的特征排名之间的相关性。斯皮尔曼等级相关系数(Spearman's Rho)或肯德尔等级相关系数(Kendall's Tau)是合适的度量标准。较高的排名相关性(接近1)表明两个模型对特征的优先级排序相似。 $$ \rho = 1 - \frac{6 \sum d_i^2}{n(n^2 - 1)} $$斯皮尔曼等级相关系数公式,式中$d_i$是特征$i$在两个模型中排名之间的差异,$n$是特征数量。值比较(散点图): 创建一个散点图,其中每个点代表一个特征。x坐标是它在模型R中的重要性,y坐标是它在模型S中的重要性。靠近$y=x$线的特征表明重要性幅度一致性良好。{"layout": {"title": "特征重要性比较(真实数据 vs. 合成数据)", "xaxis": {"title": "重要性(真实数据训练的模型)"}, "yaxis": {"title": "重要性(合成数据训练的模型)"}, "shapes": [{"type": "line", "x0": 0, "y0": 0, "x1": 1, "y1": 1, "line": {"color": "#adb5bd", "width": 2, "dash": "dash"}}], "showlegend": false}, "data": [{"x": [0.8, 0.6, 0.5, 0.3, 0.1, 0.05], "y": [0.75, 0.65, 0.4, 0.4, 0.15, 0.08], "mode": "markers", "type": "scatter", "name": "特征", "marker": {"color": "#228be6", "size": 10}}]}散点图比较了在真实数据上训练的模型与在合成数据上训练的模型之间的特征重要性得分。靠近虚线对角线的点表示重要性一致。Top-K 重叠: 确定模型R和模型S中Top-K最重要特征的集合。计算这些集合交集的大小(例如,使用Jaccard指数)。这侧重于最具影响力的特征是否得到保留。实现考量在进行这种比较时,一致性很重要。模型选择: 对真实数据和合成数据使用完全相同的模型类别(例如,sklearn.ensemble.RandomForestClassifier)。超参数: 理想情况下,使用相同的超参数。如果超参数针对真实数据和合成数据分别调整(如下一节所述),请注意这种差异也可能影响特征重要性。使用真实数据调整和合成数据调整的参数在两个模型上运行比较可能会提供更多信息。重要性方法: 对两个模型应用相同的特征重要性计算方法(例如,sklearn.inspection.permutation_importance使用相同的设置)。平均: 特征重要性估计可能存在方差。可以考虑在不同随机种子或跨交叉验证折叠的多次运行中计算重要性,并比较平均重要性。以下是一个简化的Python代码片段,使用scikit-learn的置换重要性和SciPy进行排名相关性计算:import numpy as np from sklearn.ensemble import RandomForestClassifier from sklearn.inspection import permutation_importance from scipy.stats import spearmanr from sklearn.model_selection import train_test_split # 假设 X_real, y_real, X_synth 已预加载 # 拆分真实数据以训练模型R X_real_train, X_real_test, y_real_train, y_real_test = train_test_split( X_real, y_real, test_size=0.3, random_state=42 ) # 1 & 2: 在真实数据上训练,获取重要性R model_r = RandomForestClassifier(n_estimators=100, random_state=42) model_r.fit(X_real_train, y_real_train) perm_importance_r = permutation_importance( model_r, X_real_test, y_real_test, n_repeats=10, random_state=42, n_jobs=-1 ) importance_r = perm_importance_r.importances_mean # 3 & 4: 在合成数据上训练,获取重要性S # 假设 X_synth 具有与 X_real 相同的特征 # 注意:我们使用*相同*的真实测试集以保持评估一致性 model_s = RandomForestClassifier(n_estimators=100, random_state=42) # 相同模型,相同超参数 model_s.fit(X_synth, y_real_train) # 在合成数据上拟合 perm_importance_s = permutation_importance( model_s, X_real_test, y_real_test, n_repeats=10, random_state=42, n_jobs=-1 ) importance_s = perm_importance_s.importances_mean # 5: 比较 # 排名相关性 spearman_corr, p_value = spearmanr(importance_r, importance_s) print(f"斯皮尔曼排名相关性:{spearman_corr:.3f}") # Top-K 重叠 (例如,K=5) k = 5 top_k_indices_r = np.argsort(importance_r)[-k:] top_k_indices_s = np.argsort(importance_s)[-k:] overlap = len(set(top_k_indices_r) & set(top_k_indices_s)) print(f"Top-{k} 特征重叠:{overlap}/{k}") # (散点图的可视化代码将放在此处)解释一致性结果高一致性: 高排名相关性和顶部特征的显著重叠表明合成数据生成过程成功捕获了与预测任务相关的特征关联。在此类合成数据上训练的模型,在特征使用方面,很可能与在真实数据上训练的模型表现相似。低一致性: 较差的相关性或少量重叠表明可能存在问题。合成数据可能遗漏了重要的关联,引入了虚假相关性,或过度简化了数据结构。在此类数据上训练的模型可能会获得合理的总体分数(如TSTR衡量),但在产生洞察或理解底层数据生成过程方面可能不可靠。评估特征重要性一致性,比单独查看性能指标,能提供更深入的实用性评估层面。这有助于建立信心,即合成数据不仅能够进行准确预测,而且还反映了原始数据中显著的特征和关联。然而,请记住,特征重要性方法有其自身的假设和局限性,因此将这些一致性结果视为有价值的相对比较,而不是关于特征相关性的绝对真理。