Sklearn GridSearchCV, class_weight не работает по неизвестной причине :(

Пытаюсь запустить class_weight . Я знаю, что остальная часть кода работает, только class_weight выдает ошибку:

    parameters_to_tune = ['min_samples_split':[2,4,6,10,15,25], 'min_samples_leaf':[1,2,4,10],'max_depth':[None,4,10,15],
                                             ^
SyntaxError: invalid syntax

Вот мой код

clf1 = tree.DecisionTreeClassifier()
 parameters_to_tune = ['min_samples_split':[2,4,6,10,15,25], 'min_samples_leaf':[1,2,4,10],'max_depth':[None,4,10,15],
 'splitter' : ('best','random'),'max_features':[None,2,4,6,8,10,12,14],'class_weight':{1:10}]
clf=grid_search.GridSearchCV(clf1,parameters_to_tune)
clf.fit(features,labels)
print clf.best_params_

Кто-нибудь замечает ошибку, которую я делаю?


person hmmmbob    schedule 05.08.2015    source источник
comment
Можете ли вы привести пример того, как выглядят ваши функции и метки?   -  person yangjie    schedule 05.08.2015
comment
функции - это в основном массив чисел (поплавков), где метки (не знаю, называете ли вы это также массивом или просто вектором) [0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 1,0, 0,0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0.....   -  person hmmmbob    schedule 05.08.2015
comment
parameters_to_tune должен быть словарем или списком словарей. Ваш первоначальный синтаксис правильный. Вам нужно только изменить пару ключ-значение class_weight в dict. (Извините, я не видел ваших обновлений только сейчас, но вам лучше сохранить исходный пост и добавить свои обновления, иначе люди не узнают исходный вопрос.)   -  person yangjie    schedule 06.08.2015
comment
И ваш class_weight должен быть списком dict, вы снова сделали ошибку...   -  person yangjie    schedule 06.08.2015


Ответы (2)


Я предполагаю, что вы хотите выполнить поиск в сетке по разным class_weight для класса "зарплата".

Значение class_weight должно быть списком:

'class_weight':[{'salary':1}, {'salary':2}, {'salary':4}, {'salary':6}, {'salary':10}]

И вы можете упростить его с пониманием списка:

'class_weight':[{'salary': w} for w in [1, 2, 4, 6, 10]]

Первая проблема заключается в том, что значения параметров в dict parameters_to_tune должны быть списком, а вы передали dict. Это можно исправить, передав вместо этого список словарей в качестве значения class_weight, и каждый словарь содержит набор class_weight для DecisionTreeClassifier.

Но более серьезная проблема заключается в том, что class_weight — это веса, связанные с классами, а в вашем случае «зарплата» — это название функции. Вы не можете назначать веса функциям. Сначала я неправильно понял ваше намерение, но теперь я не понимаю, чего вы хотите.

Форма class_weight — это {class_label: weight}, если вы действительно хотите установить class_weight в вашем случае, class_label должны быть такими значениями, как 0,0, 1,0 и т. д., а синтаксис будет выглядеть так:

'class_weight':[{0: w} for w in [1, 2, 4, 6, 10]]

Если вес класса велик, классификатор с большей вероятностью предскажет, что данные принадлежат этому классу. Один типичный случай использования class_weight — это несбалансированные данные.

Вот пример, хотя классификатором является SVM.

Обновлять:

Полный parameters_to_tune должен выглядеть так:

parameters_to_tune = {'min_samples_split': [2, 4, 6, 10, 15, 25],
                      'min_samples_leaf': [1, 2, 4, 10],
                      'max_depth': [None, 4, 10, 15],
                      'splitter' : ('best', 'random'),
                      'max_features':[None, 2, 4, 6, 8, 10, 12, 14],
                      'class_weight':[{0: w} for w in [1, 2, 4, 6, 10]]}
person yangjie    schedule 05.08.2015
comment
Спасибо, и это выглядит очень красиво, но, к сожалению, когда я пробовал оба, я всегда ошибался: ValueError: Неверный параметр class_weight для оценщика DecisionTreeClassifier - person hmmmbob; 05.08.2015
comment
DecisionTreeClassifier не имеет class_weight до версии scikit-learn 0.16. И вполне вероятно, что вы не обновились с 0,15 до 0,16 должным образом, учитывая новую ошибку. (См. stackoverflow.com/questions/29596237/) - person yangjie; 05.08.2015
comment
Большое спасибо . это должно быть что-то вроде этого. Сейчас я использовал оболочку, чтобы установить его с помощью conda install.... К сожалению, он становится все более и более загадочным pastebin.com/SuQVbuBu :( хочу сдаться - person hmmmbob; 05.08.2015
comment
Я только что сделал это и получил ту же ошибку, что и раньше :( - person hmmmbob; 05.08.2015
comment
Спасибо за ваше обновление, теперь я полностью запутался :( Я думал, что class_weight может дать мне такие факторы, как взвешивать различные функции в моем классификаторе, иначе я вообще не понимаю его цель :( Не могли бы вы попытаться дать мне пример, где вес подходит, если он не для функций? - person hmmmbob; 05.08.2015
comment
обновил мой первый по вашей информации, синтаксическая ошибка? - person hmmmbob; 05.08.2015

Ссылка ниже посвящена использованию различных значений class_weight. Просто Ctrl+F "class_weight" в соответствующем разделе. Он использует GridSearchCV, чтобы найти лучший class_weight для различных целей оптимизации.

Оптимизация классификатора с использованием различных показателей оценки

person Layla    schedule 08.04.2018