将分类数据从用户输入映射到其实际编码值以进行预测

问题描述

我的数据集的一部分看起来像这样(我的实际数据中还有许多其他处理器类型)

df.head(4)
 Processor Task Difficulty Time
  i3        34    3         6
  i7        34    3         4
  i3        50    1         6
  i5        25    2         5

我创建了一个回归模型来预测 TimeType,TaskDifficulty 作为输入时。

我先做了 label encoding 来更改 Processor,这是绝对的。

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Processor'] = le.fit_transform(df['Processor'])


df.head(4)
 Processor Task Difficulty Time
  12        34    3         6
  8         34    3         4
  12        50    1         6
  2         25    2         5

这是我的回归模型

from sklearn.ensemble import RandomForestRegressor
rf_model = RandomForestRegressor(random_state = 1)
rf_model.fit(features,target)

我想为输入 Time 预测 "i5",20,1

如何对 "i5" 进行标签编码以将其映射到与我的编码数据帧(其中 i5 被编码为 2)相同的值?

我试过了

rf_model.predict([[le.fit_transform('i5'),1]])

然而,当 i5 输入为 2 时,我得到的输出预测与实际值不同,

rf_model.predict([[2,1)]])

解决方法

你可以试试这个

print(le.fit_transform(['i5']))
# [2]
,

它不起作用,因为您使用的是 fit_transform。这会重新分配类别,而不是使用现有编码,因此如果您执行 le.transform,它应该可以工作。例如,类似于您的数据:

np.random.seed(111)
df = pd.DataFrame({'Processor':np.random.choice(['i3','i5','i7'],50),'Task':np.random.randint(25,50,'Difficulty':np.random.randint(1,4,'Time':np.random.randint(1,7,50)})

我们制作目标和特征,然后拟合:

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
features = df.iloc[:,:3]
features['Processor'] = le.fit_transform(features['Processor'])
target = df['Time']

from sklearn.ensemble import RandomForestRegressor
rf_model = RandomForestRegressor(random_state = 1)
rf_model.fit(features,target)

'i5' 将是 1:

le.classes_
array(['i3',dtype=object)

检查预测:

rf_model.predict([[le.transform(['i5']),20,1]])

array([3.975])

还有:

rf_model.predict([[1,1]])

array([3.975])