Как правильно выбрать объекты для классификации? - PullRequest
0 голосов
/ 18 февраля 2020

Я хотел бы выбрать оптимальное подмножество объектов для классификации. Есть несколько способов сделать это, но я не уверен, является ли какой-либо из них «правильным методом».

Я разделил проблему на два этапа. На первом этапе я хотел бы получить список функций, упорядоченных по их важности для классификации. На втором шаге я хотел бы выбрать оптимальное подмножество этих функций.

Я использую XGBClassifier для обучения sci-kit, и у меня есть несколько функций, некоторые из которых занимают только один столбец кадра данных (например, Темп функции), а некоторые занимают гораздо больше столбцов, в некоторых случаях около тысячи (например, функциональная мельспектрограмма).

ШАГ ПЕРВЫЙ: Попытка получить список функций, упорядоченных по важности для классификации.

Ранее я оптимизировал XGBClassifier для всех функций, и если я запускаю его для всех функций, а затем использую sklearns feature_importances_, чтобы получить список функций, упорядоченных по важности, он возвращает весовые коэффициенты для каждого столбца кадра данных. Кажется бессмысленным, что я бы сохранил только некоторые столбцы объекта, который имеет несколько из них, потому что столбцы (значения) этого объекта коррелированы. По этой причине я попробовал

Подход 1: суммирование весов всех столбцов каждого объекта:

melspectrogram        0.636527
mfcc                  0.095793
chroma_cens           0.056034
chroma_stft           0.039909
chroma_cqt            0.038814
spectral_contrast     0.034397
spectral_rolloff      0.032648
tonnetz               0.027535
spectral_centroid     0.019360
spectral_bandwidth    0.005222
tempo                 0.004055
rms                   0.003688
zero_crossing_rate    0.003435
spectral_flatness     0.002584

Как вы можете видеть, особенность melspectrogram, состоящая из почти тысячи столбцов , имеет на сегодняшний день самый высокий вес и впоследствии указан в качестве наиболее важной функции. С другой стороны, темп элемента, состоящий только из одного столбца, имеет гораздо меньший вес, поскольку он, естественно, не может соответствовать совокупному весу тысячи столбцов и поэтому указан в качестве одного из наименее важных элементов. Тем не менее, темп должен быть одной из самых важных функций для этого набора данных. Таким образом, этот подход кажется неправильным, потому что он поддерживает функции с большим количеством столбцов. Итак, я попробовал

Подход 2: взяв средний вес всех столбцов каждой функции:

spectral_rolloff      0.004664
tempo                 0.004055
spectral_centroid     0.002766
spectral_bandwidth    0.000746
melspectrogram        0.000710
spectral_contrast     0.000702
mfcc                  0.000684
chroma_cens           0.000667
tonnetz               0.000656
rms                   0.000527
zero_crossing_rate    0.000491
chroma_stft           0.000475
chroma_cqt            0.000462
spectral_flatness     0.000369

, что дает совершенно другой результат. При таком подходе функция темпа, кажется, находится в более подходящем месте (второе по важности), но другие функции, которые, по моему мнению, должны быть одними из самых важных, по-видимому, достигли довольно низкой важности. (melspectrogram, mf cc, spectral_contrast занимают соответственно 5, 7, 6 мест). Итак, я попробовал один последний подход

Подход 3: запускать неоптимизированный классификатор по каждой функции отдельно и сортировать их по баллам:

melspectrogram      55.44%
tempo               53.82%
mfcc                52.69%
spectral_contrast   46.06%
chroma_cens         41.80%
tonnetz             38.17%
chroma_cqt          37.42%
spectral_rolloff    36.55%
zero_crossing_rate  35.54%
spectral_centroid   33.17%
chroma_stft         32.17%
spectral_bandwidth  30.91%
spectral_flatness   30.29%
rms                 23.28%

Это, опять же, дает совершенно другой порядок функций. И мне кажется, это самый подходящий порядок. Хотя я никогда не видел, чтобы кто-то выбирал функции с использованием этого подхода.

Итак, мой вопрос, касающийся первого шага, заключается в том, как правильно в этом случае получить список функций, упорядоченных по важности?

ШАГ ВТОРОЙ: Выбор оптимального подмножества объектов из упорядоченного списка, полученного на предыдущем шаге.

То, как я мог бы подумать, состоит в том, чтобы запустить неоптимизированный классификатор для наиболее важной функции из списка, чем по двум самым важным признакам, чем по трем и так далее. Если оценка перестанет улучшаться, добавляя больше функций, я выберу первое (самое короткое) подмножество с наивысшим достигнутым значением, и это должно быть именно так. (Затем я бы переоптимизировал классификатор для этого подмножества функций и запустил классификацию, которая теоретически должна достичь даже лучшего результата, чем использование оптимизированного классификатора для всех функций. Потому что я избавился бы от неважных функций, которые не улучшат общий балл или, возможно, даже запутать классификатор и заставить его работать медленнее.)

Мои вопросы относительно второго шага: Является ли это жизнеспособным подходом? Есть ли лучший способ сделать это?

У кого-нибудь есть идея лучше подойти ко всей проблеме выбора функций?

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

...