You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用What-if Tool无可视化输出且无报错的技术求助

What-if Tool无可视化输出问题排查与解决

问题现象

按照What-if Tool官方指南操作自有数据集时,执行创建WitWidget的代码后无任何可视化界面输出,也未收到错误提示。

用户原始代码

import sys
python_version = sys.version_info[0]

# If you're running on Colab, you'll need to install the What-if Tool package and authenticate on the TF instance
def pip_install(module):
    if python_version == '2':
        !pip install {module} --quiet
    else:
        !pip3 install {module} --quiet

try:
    import google.colab
    IN_COLAB = True
except:
    IN_COLAB = False

if IN_COLAB:
    pip_install('witwidget')

    from google.colab import auth
    auth.authenticate_user()

pip install witwidget
!jupyter nbextension install --py --symlink --sys-prefix witwidget
!jupyter nbextension enable --py --sys-prefix witwidget

import pandas as pd
import numpy as np
import witwidget

from witwidget.notebook.visualization import WitWidget, WitConfigBuilder
# Dataset used
import dalex as dx
import pandas as pd
data = dx.datasets.load_german()
data
# Transformation
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
data['sex'] = le.fit_transform(data['sex'])
data['housing'] = le.fit_transform(data['housing'])
data['saving_accounts'] = le.fit_transform(data['saving_accounts'])
data['checking_account'] = le.fit_transform(data['checking_account'])
data['purpose'] = le.fit_transform(data['purpose'])
data

# Split Train and Test set 
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
X = data.drop(["risk"],axis=1) # axis: {0 or ‘index’, 1 or ‘columns’}, default 0
y = data["risk"]

X_train, X_test, y_train, y_test = train_test_split(X,y,train_size=0.8, test_size=0.2, random_state=0)
print("Data sucessfully loaded!")

# Model Prediction
import xgboost
model = xgboost.XGBClassifier().fit(X_train, y_train)
y_test_predict = model.predict(X_test)
y_test_predict

# Transform into arrays
X_test = X_test.to_numpy()
y_test = y_test.to_numpy()

# Combine the features and labels into one array for the What if Tool
test_examples = np.hstack((X_test,y_test.reshape(-1,1)))

def adjust_prediction(y_test_predict):
  return [1 - y_test_predict, y_test_predict]

config_builder = (WitConfigBuilder(test_examples.tolist(), data.columns.tolist() + ['risk'])
  .set_ai_platform_model('fairdetect', 'testset1', 'v1', adjust_prediction=adjust_prediction)
  .set_target_feature('risk')
  .set_label_vocab([0, 1]))
WitWidget(config_builder, height=1000)

核心问题定位

  1. AI平台模型配置错误:代码中使用set_ai_platform_model调用Google Cloud AI Platform上的托管模型,但本地训练的XGBoost模型并未部署到该平台,导致Wit无法获取预测结果,进而无输出。
  2. 预测函数逻辑错误:adjust_prediction函数的输入逻辑不符合Wit要求,该函数应接收模型预测结果而非直接传入y_test_predict变量,格式不兼容导致无法生成可视化。
  3. 环境冗余操作:Colab环境下重复执行pip install和jupyter扩展安装命令,可能引发环境冲突;且Colab无需手动配置nbextension,witwidget会自动完成环境适配。

修正后的可运行代码

import sys
python_version = sys.version_info[0]

# Colab环境专属配置
def pip_install(module):
    if python_version == 2:
        !pip install {module} --quiet
    else:
        !pip3 install {module} --quiet

try:
    import google.colab
    IN_COLAB = True
except:
    IN_COLAB = False

if IN_COLAB:
    pip_install('witwidget')
    from google.colab import auth
    auth.authenticate_user()

# 导入依赖库
import pandas as pd
import numpy as np
import witwidget
from witwidget.notebook.visualization import WitWidget, WitConfigBuilder
import dalex as dx
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
import xgboost

# 加载并预处理数据集
data = dx.datasets.load_german()
le = preprocessing.LabelEncoder()
# 批量编码分类特征
for col in ['sex', 'housing', 'saving_accounts', 'checking_account', 'purpose']:
    data[col] = le.fit_transform(data[col])

# 拆分训练集与测试集
X = data.drop(["risk"], axis=1)
y = data["risk"]
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, test_size=0.2, random_state=0)
print("数据加载成功!")

# 训练XGBoost模型
model = xgboost.XGBClassifier().fit(X_train, y_train)

# 准备WIT输入数据:特征数组 + 真实标签
test_examples = np.hstack((X_test.to_numpy(), y_test.to_numpy().reshape(-1,1)))

# 定义符合WIT要求的预测函数:接收特征数组,返回类别概率
def custom_predict(features):
    # 将特征数组转为DataFrame,匹配模型训练时的输入格式
    feature_df = pd.DataFrame(features, columns=X.columns)
    # 获取模型预测概率(XGBoost默认返回[负类概率, 正类概率])
    predict_probs = model.predict_proba(feature_df)
    return predict_probs.tolist()

# 配置WIT参数
config_builder = (WitConfigBuilder(test_examples.tolist(), data.columns.tolist())
  .set_custom_predict_fn(custom_predict)  # 使用本地模型的预测函数
  .set_target_feature('risk')
  .set_label_vocab(['good', 'bad']))  # 与原数据集risk标签对应,若已编码为0/1则改为[0,1]

# 生成可视化界面
WitWidget(config_builder, height=1000)

关键修正说明

  • 替换模型调用方式:用set_custom_predict_fn替代set_ai_platform_model,直接调用本地训练的模型进行预测,无需依赖云平台。
  • 修正预测函数逻辑:custom_predict函数接收WIT传入的特征数组,转为DataFrame后调用模型的predict_proba方法返回概率值,完全符合WIT的输入输出要求。
  • 清理冗余操作:移除Colab环境下不必要的扩展安装命令,避免环境冲突。
  • 匹配标签词汇表:set_label_vocab使用原数据集的真实标签值,确保与数据集中的risk字段完全对应。

内容的提问来源于stack exchange,提问作者Student Guess

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:18:25