如何按训练集dummy变量规则转换新数据集用于logistic regression模型验证
新样本分箱转dummy变量解决方案
核心原则:新样本必须复用训练集的分箱规则,不能对新样本单独执行qcut,否则会出现分位数偏移,导致dummy变量和模型训练时的输入维度、含义不匹配。
1 训练阶段提前保存分箱参数
你在训练集执行qcut时,要同步把分箱的边界值保存下来,不要只保留转换后的分类结果:
import pandas as pd import joblib # 训练集原始数据为train_df # 湿度分3箱,同时返回分箱边界 train_df['Air_Humidity_bin'], humidity_bins = pd.qcut( train_df['Air_Humidity'], q=3, labels=[1,2,3], retbins=True ) # 温度分2箱,同时返回分箱边界 train_df['Air_Temperature_bin'], temp_bins = pd.qcut( train_df['Air_Temperature'], q=2, labels=[1,2], retbins=True ) # 把分箱边界持久化存储,后续预测阶段直接调用 joblib.dump( {'humidity_bins': humidity_bins, 'temp_bins': temp_bins}, 'train_bin_edges.pkl' ) # 后续正常生成dummy变量、训练模型即可,训练好的模型也建议同步持久化存储
2 新样本转换流程
拿到新样本后,先加载训练阶段保存的分箱边界,用cut而非qcut执行分箱,之后生成dummy变量并对齐列顺序即可:
# 加载预存的分箱边界 bin_edges = joblib.load('train_bin_edges.pkl') humidity_bins = bin_edges['humidity_bins'] temp_bins = bin_edges['temp_bins'] # 假设新样本数据为new_df,需包含Air_Humidity、Air_Temperature两个原始字段 # 按训练集边界分箱,include_lowest=True保证最小值能被划入第一箱 new_df['Air_Humidity_bin'] = pd.cut( new_df['Air_Humidity'], bins=humidity_bins, labels=[1,2,3], include_lowest=True, duplicates='drop' ) new_df['Air_Temperature_bin'] = pd.cut( new_df['Air_Temperature'], bins=temp_bins, labels=[1,2], include_lowest=True, duplicates='drop' ) # 生成dummy变量 new_dummy = pd.get_dummies( new_df, columns=['Air_Humidity_bin', 'Air_Temperature_bin'], prefix=['Air_Humidity', 'Air_Temperature'] ) # 对齐训练阶段的dummy列顺序,缺失列补0,保证模型输入维度一致 train_dummy_columns = [ 'Air_Humidity_1', 'Air_Humidity_2', 'Air_Humidity_3', 'Air_Temperature_1', 'Air_Temperature_2' ] new_dummy = new_dummy.reindex(columns=train_dummy_columns, fill_value=0) # 此时new_dummy即可直接输入已训练好的模型完成预测
注意事项
- 如果新样本的数值超出训练集的分箱边界(比如训练集湿度最高为67,新样本出现75),可以自定义规则将超出值划入最近的分箱,避免出现空值。
- 列对齐步骤不可省略,避免新样本因未覆盖某类分箱值,导致dummy列缺失、模型报错。
内容的提问来源于stack exchange,提问作者rv181990
相关产品推荐
相关产品推荐

