首页 > 解决方案 > 如何使用 pickle 和 pandas udf 解决 XGBoost 模型部署 python 的数据类型错误?

问题描述

我创建了一个 pandas udf() ,它拆分数据集,拟合 XGBoost 模型,使用 pickle 保存它并返回一个带有保存模型的 df 作为字符串列。问题是当我调用 pandas udf() 时。它给出了“不支持的数据类型”错误。但是,当我在没有 pandas udf() 框架的情况下运行代码时,它会成功运行。有人对此有任何想法吗?

@pandas_udf(schema,PandasUDFType.GROUPED_MAP) def pickle_model(df1):

X = df1.iloc[:,1:50] 
Y= df1.iloc[:,50] 
seed = 7 
test_size = 0.30 

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)

model = XGBClassifier(max_depth=3,...) 

eval_set = [(X_train, y_train), (X_test, y_test)] 

model.fit(X_train, y_train, early_stopping_rounds=8,...) 

model_str = pickle.dumps(model)

model_saved = pd.DataFrame([model_str],columns = ['model_str'])
return model_saved 

pickled_model = df2.groupby('id').apply(pickle_model) pickled_model.collect()

org.apache.spark.SparkException:作业因阶段失败而中止:阶段 691.0 中的任务 0 失败 4 次,最近一次失败:阶段 691.0 中丢失任务 0.3(TID 38146、10.139.64.9、执行程序 40):java.lang。 UnsupportedOperationException:不支持的数据类型:struct<type:tinyint,size:int,indices:array<int>,values:array<double>>

标签: pickle

解决方案


对于转储模型泡菜文件使用

model_str = str(pickle.dumps(model),'latin1')

并且在加载回使用时

pickle.loads(bytes(model_str,'latin1'))

推荐阅读