Выбор функции резко снижает точность

Я экспериментировал с Pyswarms, в частности, с diskte.binaryPSO для выполнения выбора функций, поскольку это метод оптимизации, который помогает выполнять выбор подмножества функций для повышения производительности классификатора. (https://pyswarms.readthedocs.io/en/development/examples/feature_subset_selection.html) ‹- ссылка на pyswarms.

Мой набор данных основан на текстовых данных с соответствующей меткой (обозначенной цифрами 1 и 0). После предварительной обработки я включил в текстовые данные countvectorizer и tfidftransformer.

Однако простой классификатор машинного обучения с использованием sklearn предсказывает гораздо более высокую точность по сравнению с включением pyswarms. Независимо от того, какой набор данных я использую, методы предварительной обработки и функции, которые я добавляю при включении diskte.binary, поэтому моя точность, точность и отзыв ниже, чем при простой классификации машинного обучения с использованием SKlearn.

Мой код прилагается ниже, любая помощь по ситуации приветствуется:

# Create an instance of the classifier
classifier = LogisticRegression()
# Define objective function


# Define objective function
def f_per_particle(m, alpha):

    total_features = training_data.shape[1]
    # Get the subset of the features from the binary mask
    if np.count_nonzero(m) == 0:
        X_subset = training_data
    else:
        X_subset = training_data[:,m==1]
    # Perform classification and store performance in P
    classifier.fit(X_subset, y_train)
    P = (classifier.predict(X_subset) == y_train).mean()
    # Compute for the objective function
    j = (alpha * (1.0 - P)
        + (1.0 - alpha) * (1 - (X_subset.shape[1] / total_features)))

    return j

def f(x, alpha=0.88):
    """Higher-level method to do classification in the
    whole swarm.

    Inputs
    ------
    x: numpy.ndarray of shape (n_particles, dimensions)
        The swarm that will perform the search

    Returns
    -------
    numpy.ndarray of shape (n_particles, )
        The computed loss for each particle
    """
    n_particles = x.shape[0]
    j = [f_per_particle(x[i], alpha) for i in range(n_particles)]
    return np.array(j)


options = {'c1':0.5, 'c2': 0.5,'w':0.9,'k': 10,'p':2}
# Call instance of PSO
dimensions = training_data.shape[1] # dimensions should be the number of features
optimizer = ps.discrete.BinaryPSO(n_particles=10, dimensions=dimensions, options=options)

# Perform optimization
cost, pos = optimizer.optimize(f, iters=10)

print('selected features = ' + str(sum((pos == 1)*1)) + '/' + str(len(pos)))
classifier.fit(training_data, y_train)
print('accuracy before FS = ' + str(accuracy_score(y_test, classifier.predict(testing_data), normalize = True)*100))
X_subset = training_data[:,pos==1]
classifier.fit(X_subset, y_train)
print('accuracy after FS = ' + str(accuracy_score(y_test, classifier.predict(testing_data[:,pos==1]), normalize = True)*100))

person andrew    schedule 23.01.2021    source источник
comment
Я не являюсь экспертом по алгоритмам, которые использует pyswarm, но могу сказать вам, что не обязательно, чтобы алгоритм выбора функций давал лучшие результаты, они также дают плохие результаты. Это полностью зависит от набора данных. Если выбор функций вам не подходит, используйте все функции или попробуйте другой алгоритм.   -  person Chandan Malla    schedule 23.01.2021
comment
Я это полностью понимаю. Честно говоря, я пробовал разные наборы данных, а также использовал разные методы классификации для повышения точности с помощью pyswarms. Я также посмотрел на определенные коды github, которые включают pyswarms в наборы данных, не основанные на тексте, и это в значительной степени повысило их точность. Следовательно, мне было интересно, может я что-то делаю не так, поскольку при работе с текстовыми данными   -  person andrew    schedule 23.01.2021


Ответы (1)


Поскольку выбор функций не дает лучшей производительности, я бы рекомендовал использовать все функции модели машинного обучения и посмотреть влияние каждой функции. Вы можете найти https://shap.readthedocs.io/en/latest/index.html%5BSHAP%5D%5B1%5D, чтобы быть полезным для объяснения вывода, а затем проанализировать значение каждой функции для этой цели.

person SHAISTA SULTANA    schedule 25.01.2021