我正在用 Gradio 构建我的第一个界面,我遇到了一个问题。我用于训练我的 XGB 分类器的数据包含 NaN 值,我想在 Gradio 接口中启用 NaN 输入的可能性。至于现在我已经尝试将默认字段值设置为 NaN,但它不起作用。
接口代码: Ferr = gr.Number(label="Ferrytyna [ug/l]", value=float("NaN"))
错误信息: ValueError:数据的 DataFrame.dtypes 必须是 int、float、bool 或 category。当提供分类类型时,实验 DMatrix 参数
enable_categorical
必须设置为 True
。无效列:ferrytyna_krew_ug_l:对象
有人知道如何解决这个问题吗? 谢谢
您看到的错误消息表明 XGBoost 在将输入数据转换为 DataFrame 时无法处理输入数据中的 NaN 值。
一种解决方案是在将输入数据传递给 XGBoost 分类器之前对其进行预处理以处理 NaN 值。一种方法是用默认值替换 NaN 值,例如列的平均值或中值。
这是一个示例,说明如何使用 pandas 预处理输入数据以处理 NaN 值:
import pandas as pd
import gradio as gr
import xgboost as xgb
# Load your data into a pandas DataFrame
data = pd.read_csv('my_data.csv')
# Preprocess the data to handle NaN values
data = data.fillna(data.mean())
# Train your XGBoost classifier on the preprocessed data
X = data.drop('target', axis=1)
y = data['target']
model = xgb.XGBClassifier()
model.fit(X, y)
# Define your Gradio interface
def predict(ferrytyna):
# preprocess input data to handle NaN values
ferrytyna = ferrytyna if not pd.isna(ferrytyna) else data['ferrytyna_krew_ug_l'].mean()
# make predictions using the pre-trained model
prediction = model.predict([[ferrytyna]])
return prediction[0]
iface = gr.Interface(fn=predict, inputs="number", outputs="label")
iface.launch()
在此示例中,我们将输入数据加载到 pandas DataFrame 中,并使用
fillna()
方法对其进行预处理,以将 NaN 值替换为列的平均值。然后,我们在预处理数据上训练 XGBoost 分类器。
在
predict()
函数中,我们使用pd.isna()
和data.mean()
预处理输入值ferrytyna以处理NaN值。然后我们使用预先训练的模型进行预测。
最后,我们定义 Gradio 接口,将
inputs
参数设置为 "number"
以接受数字输入,并将 outputs
参数设置为 "label"
以输出分类标签。我们使用launch()
方法启动界面。
使用此代码,Gradio 接口将接受
ferrytyna
输入的 NaN 值,并在使用 XGBoost 模型进行预测之前使用列的平均值对其进行预处理。