[БЕЗ_ЗВУКА] В этом видео мы попробуем доработать наш простой baseline, добавив некоторое преобразование признаков, попробовав встроить ансамбли деревьев. И в конечном счете убедимся в том, что baseline не такой уж и плохой. Итак, начнем. Для начала попробуем применить какие-нибудь матричные разложения. Ну, вот посмотрим, за сколько они работают. NMF, как вы уже видите, строится за десять секунд для десяти компонент, это неотрицательное матричное разложение. А SVD сейчас увидим. SVD работает чуть быстрее, меньше двух секунд. Так или иначе, попробуем посмотреть на качество и SVD, и NMF. Мы, как и ранее, делаем pipeline для текстовой классификации. Сначала получаем частоты слов, затем выполняем преобразования. Раньше это было TF-IDF-преобразование, теперь это SVD и NMF. И опять же берем всего десять компонент и на этом строим линейный SVM. Как вы видите, результаты не очень впечатляют. Они существенно ниже, чем те результаты, которые у нас были ранее. Ну, кстати, вот у NMF немножко получше. И здесь можно предположить, что что-то мы делаем неправильно. Можно попробовать сделать больше компонент. Давайте выставим количество компонент, равным тысяче, и посмотрим на результат. Вот результат уже здесь есть. И как вы помните, примерно такой результат был и у исходного baseline. То есть у нас получилось сделать такое преобразование, которое по крайней мере не испортило наш классификатор. Как правило, если преобразование признаков с помощью матричных разложений действительно позволяет как-то поднять качество, то количество компонент должно быть не таким большим, чтобы качество было совсем такое же, как изначально, и не таким маленьким, чтобы качество уже начало «проседать». Но в то же время, далеко не всегда такое количество компонент есть. Не всегда с помощью матричных разложений можно действительно улучшить качество. И не стоит в этом месте поддаваться иллюзиям, что если сделать что-то «умное» с признаками, то обязательно это поможет и повысит качество. С другой стороны, понизив размерность пространства признаков, мы можем построить более сложные классификаторы. Например, композиции деревьев. Ну, давайте попробуем посмотреть, что получается с RandomForest. Опять-таки мы считаем частоты, дальше делаем SVD-преобразование и затем запускаем обучение RandomForest. И как вы видите, результаты тоже достаточно плачевные. Конечно, это лучше, чем то, что мы видели до этого на десяти компонентах. Но здесь и компонент побольше, и как вы видите, лучше не стало. Можно предположить, что дело в количестве компонент. Надо сделать побольше компонент. Но оказывается, что больше компонент не всегда хорошо. Смотрите, сделали мы 1000 компонент, сделали и деревьев чуть побольше, и качество у нас еще дополнительно просело, то есть так тоже бывает. Ну, можно предположить, что проблема в том, что мы используем частоты слов, а если мы будем использовать, например, TF-IDF, получится более удачный классификатор. Это предположение в какой-то степени оправдывается, но, конечно, это, скорее, шутливый результат. Мы действительно чуть-чуть улучшили качество, но оно по-прежнему совершенно неприемлемое. Можно предположить, если не получается построить хороший классификатор на признаках, которые получаются после SVD-разложения, то, может быть, можно совместить эти признаки с теми признаками, которые были до этого. И уж тогда, по крайней мере, должно получиться не хуже. Ну, давайте посмотрим, что получается из этого. Давайте добавим просто одну компоненту из SVD-разложения. Мы воспользуемся FeatureUnion из sklearn.pipeline, которая позволит нам совместить эти преобразования и получать единое множество признаков. И вот давайте опять оценим качество. И, как вы видите, качество получается тоже не очень хорошее. Уж по крайней мере заметно ниже, чем без добавления одной компоненты из SVD. Таким образом, как вы видите наш baseline был действительно не так уж плох. И просто поделать какие-то логичные, какие-то достаточно сложные, с точки зрения математики, которая стоит за ними, вещи и поднять качество, довольно затруднительно.