使用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)
核心问题定位
- AI平台模型配置错误:代码中使用
set_ai_platform_model调用Google Cloud AI Platform上的托管模型,但本地训练的XGBoost模型并未部署到该平台,导致Wit无法获取预测结果,进而无输出。 - 预测函数逻辑错误:
adjust_prediction函数的输入逻辑不符合Wit要求,该函数应接收模型预测结果而非直接传入y_test_predict变量,格式不兼容导致无法生成可视化。 - 环境冗余操作: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
相关产品推荐
相关产品推荐

