Несбалансированный набор данных - как оптимизировать гиперпарамы с помощью поиска по сетке? - PullRequest
1 голос
/ 28 января 2020

Я хотел бы оптимизировать гиперпараметры C и Гамма SV C, используя поиск по сетке для несбалансированного набора данных. До сих пор я использовал class_weights ='balanced 'и выбирал лучшие гиперпараметры на основе среднего значения f1. Однако набор данных очень несбалансированный, т.е. если я выбрал GridSearchCV с cv = 10, то некоторые классы меньшинства не будут представлены в данных проверки. Я думаю об использовании SMOTE, но вижу здесь проблему в том, что мне нужно было бы установить k_neighbors = 1, потому что в некоторых классах меньшинства часто есть только 1-2 выборки. У кого-нибудь есть совет, как оптимизировать гиперпараметры в этом случае? Есть ли альтернативы?

Большое спасибо за каждый намек

1 Ответ

1 голос
/ 28 января 2020

Я хотел бы оптимизировать гиперпараметры C и гамму SV C, используя поиск по сетке для несбалансированного набора данных. У кого-нибудь есть совет, как оптимизировать гиперпараметры в этом случае?

Вы можете использовать функцию GridSearchCV (), выполняя что-то вроде:

from sklearn.model_selection import GridSearchCV 


param_grid = {'C': [0.1, 5, 50, 100],  
              'gamma': [1, 0.5, 0.1, 0.01]}  

model = GridSearchCV(SVC(), param_grid, refit = True) 

model.fit(X_train, y_train)

Вы можете использовать RandomizedSearchCV , чтобы изучить дополнительные параметры.

Я думаю об использовании SMOTE, но вижу здесь проблему в том, что мне нужно установить k_neighbors = 1

Вы пробовали ADASYN ?

Есть ли альтернативы?

Когда я действительно теряюсь, я пробую «последний ресурс». Это инструмент под названием tpot .

Просто сделайте пример, подобный этому:

tpot = TPOTClassifier(generations=5, population_size=50, scoring='roc_auc', verbosity=2, random_state=42)
tpot.fit(X_train, y_train)
print(tpot.score(X_test, y_test))
tpot.export('tpot_results.py')

Он выведет код sklearn, с алгоритмом и конвейером, в этом случае tpot_results.py будет:

tpot_data = pd.read_csv('PATH/TO/DATA/FILE', sep='COLUMN_SEPARATOR', dtype=np.float64)
features = tpot_data.drop('target', axis=1)
training_features, testing_features, training_target, testing_target = \
            train_test_split(features, tpot_data['target'], random_state=42)

# Average CV score on the training set was: 0.9826086956521738
exported_pipeline = make_pipeline(
    Normalizer(norm="l2"),
    KNeighborsClassifier(n_neighbors=5, p=2, weights="distance")
)
# Fix random state for all the steps in exported pipeline
set_param_recursive(exported_pipeline.steps, 'random_state', 42)

exported_pipeline.fit(training_features, training_target)
results = exported_pipeline.predict(testing_features)

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

...