2015-07-02 2 views
1

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

from sklearn.ensemble import RandomForestClassifier 
from sklearn.multiclass import OneVsRestClassifier 
from sklearn.grid_search import GridSearchCV 

parameters = { 
    "estimator__n_estimators": [5, 50, 200], 
    "estimator__max_depth" : [None, 10,20], 
    "estimator__min_samples_split" : [2, 5, 10], 
} 
model_to_tune = OneVsRestClassifier(RandomForestClassifier(random_state=0,class_weight='auto')) 
model_tuned = GridSearchCV(model_to_tune, param_grid=params, scoring='f1',n_jobs=2) 
print model_tuned.best_params_ 
{'estimator__min_samples_split': 10, 'estimator__max_depth': None, 'estimator__n_estimators': 200} 

Эти параметры, которые дают лучшие f1 балла с учетом всех меток. Я хочу найти параметры отдельно для каждой метки. Есть ли встроенная функция, которая может это сделать?

+0

Multi-label подчеркивает «взаимно включительно», так что наблюдение может быть членом нескольких классов одновременно. Если вы хотите подготовить отдельные классификаторы для каждого ярлыка, то для этого конкретного классификатора каждое наблюдение может быть только членом ОДНОГО класса (один-vs-the-rest), который является «взаимоисключающим». Ваш желаемый подход, по-видимому, противоречит вашим фактическим наблюдениям с несколькими метками, и я не думаю, что для этого в scikit-learn существует реализация. –

+2

@JianxunLi Привет, мне интересно, является ли то, что делает OneVsRestClassifier, просто бинарная релевантность в многозадачной литературе. Если это так, не считая взаимодействия между ярлыками, действительно, это главный недостаток использования бинарной релевантности, поэтому он должен быть таким же, когда вы тренируете отдельные классификаторы «вручную» по сравнению с использованием «OneVsRestClassifier». – Francis

ответ

1

Это не сложно сделать, хотя он не встроен, и я не уверен, что понимаю, почему вы захотите.

Просто предварительно обрабатывать ваши данные, как так:.

for a_class in list_of_unique_classes: 
    y_this_class = (y_all_class==a_class) 
    model_to_tune = RandomForestClassifier(random_state=0,class_weight='auto') 
    model_tuned = GridSearchCV(model_to_tune, param_grid=params, scoring='f1',n_jobs=2) 
    model_tuned.fit(X, y_this_class) 

    # Save the best parameters for this class 

(Кроме того, остерегайтесь f1 счет, это не делает хорошую работу по описанию характеристик классификатора для перекошенных наборов данных Вы хотите использовать РПЦ кривые и/или informedness).

+0

Я попытался использовать информацию для выбора модели. Но когда я применил модели на тестовых данных, для некоторых классов модель предсказала все наблюдения как 1, в то время как на самом деле класс имеет только около 5% от 1 с. Я не сталкивался с этим при использовании оценки f1. Почему это произойдет? –

Смежные вопросы