Разве мультикласс Scikit-Learn Random Forest class_weight больше не принимает список dict? - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь сделать мультиклассовую классификацию для 3 классов. Классы несбалансированы, так что у меня есть данные 2000 для класса 0, 2000 для класса 1 и 4000 для класса 2. В документации говорится, что я должен использовать список dict для этого, например: [{0: 1, 1: 1}, {0: 1, 1: 1}, {0: 1, 1: 2}], но я получаю ошибку.

Я использую Python 3.6.9 в Jupyter Notebook и версию 0.21.3 sci-kit-learn, которая гласит для class_weights:

Обратите внимание, что для многопоточных (включая многолинейные) веса должны бытьопределяется для каждого класса каждого столбца в своем собственном dict. Например, для классификации с четырьмя классами для нескольких меток веса должны быть [{0: 1, 1: 1}, {0: 1, 1: 5}, {0: 1, 1: 1}, {0: 1, 1: 1}] вместо [{1:1}, {2:5}, {3:1}, {4:1}].

Я использую GridSearchCV с kfold = StratifiedKFold(10, shuffle=True, random_state=0), чтобы всегда получать одинаковое перемешивание данных.

Я также попробовал один диктовку, как {0: 1, 1: 1, 1: 2}. Это работает, но в то время как я получаю 99% точности данных тренинга, я всегда получаю класс 2 для тестовых данных. Я также пробовал class_weight = 'сбалансированный', тот же результат, что и выше.


grid_param = {
    'n_estimators': [300, 500, 800, 1000],
    'max_features': [3, 5, 'auto'],
    'criterion': ['gini', 'entropy']
}

rf_clf = GridSearchCV(RandomForestClassifier(random_state=0, 
                      class_weight=[{0: 1, 1: 1}, {0: 1, 1: 1}, {0: 1, 1: 2}]), 
                      grid_param, 
                      scoring='accuracy', 
                      cv=kfold, 
                      n_jobs=-1)

rf_clf.fit(rescaled_train_features, train_labels) # this throws the Error

Где rescaled_train_features - это функции, извлеченные из примерно 8000 изображений, а train_labels - этометки (0, 1 и 2 в зависимости от класса). Я проверяю, какие функции лучше всего представляют изображения, поэтому я использую hu_moments, haralick-функции, цветную гистограмму и сёрфинг с сочетанием друг с другом. Но это весь код, который я использую для классификации случайных лесов

Ошибка, которую я получаю для списка ячеек, который я использую выше

ValueError: class_weight должен быть dict, 'сбалансированный',или Нет, получил: [{0: 1, 1: 1}, {0: 1, 1: 1}, {0: 1, 1: 2}].

...