Python中分类模型自变量为分类变量时如何传入测试数据预测
单条分类测试样本预测实现方法
你现有代码存在两个会直接导致预测失效甚至运行报错的问题,需要先修正再做预测:
- 所有特征列复用同一个
LabelEncoder实例反复调用fit_transform,每次fit都会覆盖之前的编码映射,最终编码器只保留了最后一列windy的编码规则,其余三列的映射关系完全丢失,无法用来转换新样本 - 标签列
play是yes/no的字符串分类值,未做编码直接输入模型,且选择的LinearRegression是回归模型,不适合当前二分类任务,输出结果无法直接对应分类标签
第一步:修正训练阶段代码
给每个特征列、标签列单独初始化独立的编码器,保存训练时拟合好的编码映射,同时替换为适配分类任务的模型:
import pandas as pd import numpy as np from sklearn import preprocessing, model_selection from sklearn.linear_model import LogisticRegression w = pd.read_csv("/content/drive/MyDrive/weather.csv") # 按顺序定义特征列名 feature_cols = ['outlook', 'temperature', 'humidity', 'windy'] # 用字典存储每个特征列对应的训练好的编码器 feature_encoders = {} for col in feature_cols: enc = preprocessing.LabelEncoder() w[col] = enc.fit_transform(w[col]) feature_encoders[col] = enc # 单独给标签列训练编码器,方便后续把预测结果转回原始文本标签 target_encoder = preprocessing.LabelEncoder() w['play'] = target_encoder.fit_transform(w['play']) x = w[feature_cols].values y = w['play'].values X_train, X_test, Y_train, Y_test = model_selection.train_test_split( x, y, test_size=0.1, random_state=42 ) # 分类任务替换为逻辑回归模型 model = LogisticRegression() model.fit(X_train, Y_train)
第二步:转换单条样本并预测
针对形如[sunny, hot, high, false]的单条样本,严格按照训练时的特征顺序,复用之前保存的编码器做转换,绝对不能在预测阶段重新调用fit类方法,否则编码映射会和训练时不一致,导致预测结果完全无效:
# 原始单条样本,顺序必须和feature_cols一一对应 raw_single_sample = ['sunny', 'hot', 'high', 'false'] # 逐列用对应编码器转换原始值 encoded_sample = [] for col, raw_val in zip(feature_cols, raw_single_sample): # 注意:这里只能调用transform,不能用fit_transform encoded_val = feature_encoders[col].transform([raw_val])[0] encoded_sample.append(encoded_val) # 转成模型要求的二维输入格式(单样本形状必须为(1, 特征数)) input_data = np.array(encoded_sample).reshape(1, -1) # 得到数值型预测结果 pred_num = model.predict(input_data) # 转回原始的yes/no分类标签 pred_result = target_encoder.inverse_transform(pred_num)[0] print(pred_result)
补充说明:对于
outlook这类没有大小顺序的无序分类特征,更推荐使用OneHotEncoder做独热编码,避免LabelEncoder给类别强加的数值顺序(比如sunny=2、overcast=0、rainy=1会让模型默认类别间存在数值大小关系)干扰模型效果。
内容的提问来源于stack exchange,提问作者CR28哦不对,是CR28,改下最后一行:
内容的提问来源于stack exchange,提问作者CR28
相关产品推荐
相关产品推荐

