У меня есть набор данных, подобный этому
Как вы видите, есть одна категориальная переменная, которая является государственной
позже я кодирую категориальную переменную
Если я хочу проверить свою модель с конкретными данными, я делаю что-то вроде этого
print(regressor.predict([[1,0,1000,2000,3000]]))
Что хорошо работает. Но то, что я хочу сделать, во время тестирования я прямо хочу ввести название города, например, New York
или Florida
Как я могу это достичь?
Модель машинного обучения может работать только с числовыми данными. Именно по этой причине вам пришлось кодировать ваши "состояния". Существует несколько способов добиться того, что вы говорите: a) Используйте функцию, чтобы вернуть закодированное значение "состояния", в то время как вы можете ввести что-то вроде
print(regressor.predict([[1,0,1000,func("New York"),3000]]))
b) Использовать неявное кодирование, которое неявно создает столько столбцов для каждой категориальной переменной.
Как уже упоминалось ранее, любая модель принимает только числа в качестве входных данных. По этой причине, как правило, мы создаем функцию предварительной обработки, которая может быть применена одновременно к набору поездов и тестов.
В этом случае вам необходимо определить функцию, которая преобразует входной вектор в числовой вектор, который может быть дополнительно добавлен в модель машинного обучения:
Inputs -> Preprocessing -> Model
Эта предварительная обработка должна быть такой же, как то, что вы использовали для обучения, чтобы достичь желаемых результатов.
Обычно, когда вы создаете модель, ваша полная "Модель" может фактически быть оберткой вокруг используемой модели. Например:
class MyModel():
def __init__(self,):
# Inputs and other variables like hyperparameters
self.model = Model() # Initialise a model of your choice
def preprocess(self, list_to_preprocess):
# Preprocess this list
def train(self, train_set):
X_train, y_train = preprocess(X_train)
self.model.fit(X_train, y_train)
def predict(self, test_set):
# If X_test is a vector, reshape and then preprocess
X_test, y_test = preprocess(test_set)
pred = self.model.predict(X_test)
# Evaluate using pred and y_test
Итак, чтобы предсказать, что вы используете функцию MyModel.predict()
а не Model.predict()
чтобы достичь того, чего хотите.
Вы можете использовать scikit-Learn LabelEncoder для преобразования и обратного преобразования категориального значения.
то есть)
>>> from sklearn import preprocessing
>>> le = preprocessing.LabelEncoder()
>>> le.fit(["New York", "Florida", "US", "Florida", "New York"])
LabelEncoder()
>>> le.transform(["New York", "Florida", "US", "Florida", "New York"])
array([0, 0, 1, 2]...)
>>> le.inverse_transform([0])
"New York"
Вы можете назвать свою функцию, как показано ниже.
print(regressor.predict([[1,0,1000,le.transform(["New York"])[0],3000]]))
так как модель ML вводит только числа, вам нужно сделать кодирование даже для тестового набора данных, а затем передать его модели.
Это совсем не изящно, но вы можете просто написать, if... elif
инструкция if... elif
зависимости от ввода, например:
a = input("Please enter the state: ")
if a = "New York":
print(regressor.predict([[1,0,1000,2000,3000]]))
elif a = "Florida":
print(regressor.predict([[0,1,1000,2000,3000]]))
else:
print("Invalid state selected")
LabelEncoder
используется специально только для этикеток. Не рекомендуется использовать его для этой цели. Я бы посоветовал использовать вместо этогоsklearn.preprocessing.OneHotEncoder
.