#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_
, он содержит метку для каждого класса.