Сопоставление категориальных данных из пользовательского ввода с их фактическим закодированным значением для прогнозирования

#python #scikit-learn #regression #categorical-data #label-encoding

#python #scikit-learn #регрессия #категориальные данные #label-encoding

Вопрос:

Часть моего набора данных выглядит следующим образом (в моих фактических данных есть много других типов процессоров)

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

Я создал регрессионную модель для прогнозирования Time , когда Type, Task Difficulty они задаются в качестве входных данных.

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'),20,1]])
 

Однако я получил прогноз вывода, отличный от фактического значения, когда i5 вводится как 2,

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

Комментарии:

1. почему вы используете LabelEncoder вместо OneHotEncoder или LableBinarizer.

Ответ №1:

Это не работает, потому что вы используете 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,50),
                  'Difficulty':np.random.randint(1,4,50),
                  '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', 'i5', 'i7'], dtype=object)
 

Проверка прогнозов:

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

array([3.975])
 

И:

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

array([3.975])
 

Ответ №2:

Вы можете попробовать так

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

Комментарии:

1. Я не знаю, почему это не работает для меня, я попробовал print(le.fit_transform([‘i5’])) и print(le.fit_transform([‘i7’])) оба дали мне один и тот же результат, а именно. # [0]

2. проверьте свои классы меток le.classes_ , он содержит метку для каждого класса.