Я экспериментировал с 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))