Streamlit加载XGBClassifier预测报Unicode-3 is not supported错如何解决
错误产生原因
该报错与模型加载方式无关,pkl反序列化、json加载模型的两种逻辑本身没有问题,故障点在传入clf.predict()的输入参数feat_list:
你所用的1.6.0版本XGBoost底层数据解析接口,不支持直接识别原生Python列表中存储的Unicode格式字符串。即使开启enable_categorical=True参数,该版本XGBoost也仅支持两类输入:一是全数值类型的数组/矩阵,二是pandas结构中提前声明为category类型的分类特征,直接传入包含原生字符串的列表时,底层解析碰到不支持的Unicode类型就会抛出该错误。
修复方案
- 不要直接传入存储了字符串值的原生Python列表给预测接口,优先将输入特征转换为列顺序、列名与训练阶段完全一致的pandas DataFrame:
转换完成后,将所有分类特征列的类型强制设置为category,不得保留string/object类型的列,参考实现:import pandas as pd # 列名、列顺序必须和模型训练时的特征输入完全对齐 feat_df = pd.DataFrame( [feat_list], columns=["col1", "col2", "col3"] # 替换为训练时实际使用的特征名、按训练顺序排列 ) # 将所有分类特征列转换为category类型 cat_columns = ["cat_col1", "cat_col2"] # 替换为实际的分类特征列名 for col in cat_columns: feat_df[col] = feat_df[col].astype("category") # 传入模型预测 predict_result = clf.predict(feat_df) - 如果不使用pandas作为输入载体,需要提前对所有字符串格式的分类特征做标签编码,把所有特征值转换为整数/浮点数类型,再构造成numpy数组传入预测接口,确保输入结构中不存在任何字符串类型的值。
- 做一致性校验:训练阶段如果对分类特征做了自定义编码,预测阶段必须复用完全相同的编码规则,禁止出现训练时用整数编码、预测时传入原始字符串的不匹配问题。
内容的提问来源于stack exchange,提问作者Amey
相关产品推荐
相关产品推荐

