Как тренировать модель с функциями, выбранными SelectKBest? - PullRequest
2 голосов
/ 16 апреля 2020

Я использую SelectKBest() в классе Pipeline() Склеарна, чтобы уменьшить количество функций с 30 до 5 лучших функций. Когда я подгоняю классификатор, я получаю разные результаты теста, как и ожидалось, с выбором функции. Однако я обнаружил в своем коде ошибку, которая, похоже, не вызывает реальной ошибки во время выполнения.

Когда я позвонил predict(), я понял, что ему все еще вводят все 30 функций, как будто выбор функции не происходит. Хотя я только обучил модель на 5 лучших функциях. Разумеется, что дать 30 функций SVM, чтобы предсказать класс, вы получите sh, если он обучен только 5 лучшим функциям?

В моей функции train_model(df) мой код выглядит следующим образом:

def train_model(df):
    x,y = balance_dataset(df)
    X_train, X_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 0)

    feature_selection = SelectKBest()

    pipe = Pipeline([('sc', preprocessing.MinMaxScaler()),
                    ('feature_selection', feature_selection),
                    ('SVM', svm.SVC(decision_function_shape = 'ovr', kernel = 'poly'))])

    candidate_parameters = [{'SVM__C': [0.01, 0.1, 1], 'SVM__gamma': [0.01, 0.1, 1], 'feature_selection__k': [5]}]

    clf = GridSearchCV(estimator = pipe, param_grid = candidate_parameters, cv = 5, n_jobs = -1)
    clf.fit(X_train, y_train )

    return clf 

Однако именно тогда происходит, когда я звоню trade():

def trade(df):
    clf = train_model(df) 

    for index, row in trading_set.iterrows(): 

        features = row[:-3] #features is now an array of 30 features, even though model is only trained on 5

        if trade_balance > 0:
            trades[index] = trade_balance
            if clf.predict(features) == 1: #So this should crash and give an input Shape error, but it doesn't
            #Rest of code unneccesary#

Итак, мой вопрос: откуда мне знать, что модель действительно обучается только 5 лучшим возможностям?

1 Ответ

2 голосов
/ 16 апреля 2020

Ваш код верен, и нет никаких причин, по которым он должен выдавать какую-либо ошибку. Вы путаетесь между объектом конвейера и самой моделью, которая является только одним блоком конвейера.

В вашем примере конвейер использует 30 функций, масштабирует их, выбирает 5 лучших, а затем обучает SVM. на эти 5 лучших функций. Итак, ваш SVM был обучен 5 лучшим функциям, но вам все равно нужно передать все 30 функций в ваш конвейер, потому что ваш конвейер ожидает поступления данных в том же формате, что и во время обучения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...