тестировать модель машинного обучения с категориальной переменной в python - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть такой набор данных

enter image description here

Как вы можете видеть, есть одна категориальная переменная, которая является состоянием

позжеЯ кодирую категориальную переменную

enter image description here

Если я хочу проверить свою модель с конкретными данными, я делаю что-то вроде

print(regressor.predict([[1,0,1000,2000,3000]]))

, Которыйработает отлично .Но что я хочу сделать, так это то, что во время тестирования я хочу напрямую ввести название города, например New York или Florida

Как этого добиться?

Ответы [ 5 ]

0 голосов
/ 27 сентября 2018

Как уже упоминалось ранее, любая модель принимает только цифры в качестве входных данных.По этой причине обычно мы создаем функцию предварительной обработки, которая может быть применена одновременно как к поездам, так и к тестовым наборам.

В этом случае вам необходимо определить функцию, которая преобразует входной вектор в числовой вектор, которыйможет быть дополнительно введено в вашу модель машинного обучения:

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() для достижения того, чего хотите.

0 голосов
/ 27 сентября 2018

Вы можете использовать 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]]))
0 голосов
/ 27 сентября 2018

, поскольку модель ML вводит только числа, необходимо выполнить кодирование даже для набора тестовых данных, а затем передать его в модель.

0 голосов
/ 27 сентября 2018

Это совсем не элегантно, но вы можете просто написать 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")
0 голосов
/ 27 сентября 2018

Модель машинного обучения может работать только с числовыми данными.Это причина, почему вы должны были закодировать свои «состояния».Есть несколько способов добиться того, что вы говорите: а) Используйте функцию для возврата закодированного значения «состояния», в то время как вы можете ввести что-то вроде

print(regressor.predict([[1,0,1000,func("New York"),3000]]))

б) Использовать неявное кодирование, которое создает столькостолбцы для каждой категориальной переменной неявно.

...