如何将DataFrame分类编码映射回原始数据并实现原始值预测?
分类编码映射与原始数据直接预测实现方案
一、保存编码映射关系
训练阶段需留存各特征列的编码器,以及目标列Size的编码-原始类别映射,确保后续能完成原始数据到编码的转换、预测结果到原始类别的还原。
1. 编码特征与目标列
以LabelEncoder为例(多列批量处理可用OrdinalEncoder),示例代码:
import pandas as pd from sklearn.preprocessing import LabelEncoder from sklearn.ensemble import AdaBoostClassifier # 示例DataFrame df = pd.DataFrame({ 'Year': ['2020', '2021', '2022'], 'Airport': ['Yes', 'No', 'Yes'], 'Casino': ['No', 'Yes', 'No'], 'Stadium': ['Yes', 'Yes', 'No'], 'Size': ['Small', 'Large', 'Medium'] }) # 为每个特征列创建并保存编码器 feature_encoders = {} for col in ['Year', 'Airport', 'Casino', 'Stadium']: le = LabelEncoder() df[col] = le.fit_transform(df[col]) feature_encoders[col] = le # 处理目标列Size,生成编码到原始类别的映射 size_le = LabelEncoder() df['Size'] = size_le.fit_transform(df['Size']) size_code_to_label = {code: label for code, label in enumerate(size_le.classes_)}
2. 训练AdaBoost模型
X = df[['Year', 'Airport', 'Casino', 'Stadium']] y = df['Size'] adaboost_model = AdaBoostClassifier() adaboost_model.fit(X, y)
二、编写原始数据预测函数
实现一个函数,接收原始格式的输入数据,自动完成编码转换、模型预测、结果还原三步:
def predict_raw_size(raw_input): # 支持两种输入格式:按列顺序的列表,或带列名的字典 encoded_features = [] feature_cols = ['Year', 'Airport', 'Casino', 'Stadium'] if isinstance(raw_input, dict): for col in feature_cols: # 将原始值转换为模型所需编码 encoded_val = feature_encoders[col].transform([raw_input[col]])[0] encoded_features.append(encoded_val) else: # 列表输入需严格匹配feature_cols的顺序 for idx, col in enumerate(feature_cols): encoded_val = feature_encoders[col].transform([raw_input[idx]])[0] encoded_features.append(encoded_val) # 预测编码并转回原始类别 predicted_code = adaboost_model.predict([encoded_features])[0] return size_code_to_label[predicted_code] # 测试调用 print(predict_raw_size(['2022', 'Yes', 'No', 'No'])) # 输出: Medium print(predict_raw_size({'Year':'2021', 'Airport':'No', 'Casino':'Yes', 'Stadium':'Yes'})) # 输出: Large
三、额外建议
- 若使用
OneHotEncoder处理特征,逻辑一致:保存编码器,预测时用其将原始数据转换为独热编码格式即可。 - 为避免输入值不在训练集范围内导致报错,可在函数中添加异常捕获:
try: encoded_val = feature_encoders[col].transform([raw_input[col]])[0] except ValueError: raise ValueError(f"输入值 {raw_input[col]} 不在列 {col} 的训练数据范围内")
- 训练完成后,可将模型、编码器、映射关系打包保存,方便后续复用:
import pickle # 保存 with open('size_prediction_model.pkl', 'wb') as f: pickle.dump((adaboost_model, feature_encoders, size_code_to_label), f) # 加载 with open('size_prediction_model.pkl', 'rb') as f: adaboost_model, feature_encoders, size_code_to_label = pickle.load(f)
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

