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

Python分类变量预测NET_AMT报错:无法将字符串转为浮点数

解决决策树回归预测时字符串输入的编码问题

核心问题原因

你训练模型时用了One-Hot编码处理分类变量,但直接传入原始字符串时,模型无法识别这些未编码的特征,所以抛出字符串转float的错误——模型只认编码后的数值型特征矩阵。

解决步骤

1. 保存训练时用的编码器+模型管道

训练阶段必须把预处理编码逻辑和模型绑定保存,不能只存模型。示例代码:

import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
import joblib

# 假设训练数据为df_train,包含特征列和NET_AMT标签列
categorical_cols = ['DEPARTMENT_NAME', 'Store_Type', 'MonthInCalendar']

# 构建预处理+模型的完整管道
preprocessor = ColumnTransformer(
    transformers=[
        ('cat_encode', OneHotEncoder(sparse_output=False, drop='first'), categorical_cols)
    ],
    remainder='passthrough'
)

model_pipeline = Pipeline([
    ('preprocess', preprocessor),
    ('regressor', DecisionTreeRegressor())
])

# 训练管道
model_pipeline.fit(df_train.drop('NET_AMT', axis=1), df_train['NET_AMT'])

# 保存整个管道
joblib.dump(model_pipeline, 'sales_pred_pipeline.pkl')

2. 用保存的管道处理新输入并预测

新输入的字符串必须通过同一个管道预处理,不能直接喂给模型。示例代码:

# 加载保存的管道
loaded_pipeline = joblib.load('sales_pred_pipeline.pkl')

# 构造符合格式的输入DataFrame(列名必须和训练集一致)
new_input = pd.DataFrame({
    'DEPARTMENT_NAME': ['Beef'],
    'Store_Type': ['Warehouse'],
    'MonthInCalendar': ['22-Dec']
})

# 直接预测
predicted_sales = loaded_pipeline.predict(new_input)
print(predicted_sales)

关于Label Encoding无效的说明

Label Encoding会给分类标签分配整数,但如果训练时的编码器没保存,或者新输入的标签在训练集里没出现过,一样会报错。用Pipeline绑定编码和模型是最稳妥的方式,能保证预处理逻辑完全和训练阶段一致。

关键注意事项

  • 新输入的特征列名必须和训练数据的列名完全匹配,不能增减或改名。
  • 训练时用的OneHotEncoder参数(比如drop='first')会被管道保留,不用手动重复处理。
  • 绝对不要单独保存模型,必须保存包含预处理步骤的完整管道,否则每次预测都要手动复刻编码逻辑,极易出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:30:01