Изменения

Перейти к: навигация, поиск

Уменьшение размерности

3304 байта добавлено, 22:47, 30 января 2019
Нет описания правки
Под '''уменьшением размерности''' (англ. ''dimensionality reduction'') в машинном обучении подразумевается уменьшение числа признаков датасетанабора данных. Наличие в нем признаков избыточных, неинформативных или слабо информативных может понизить эффективность модели, а после такого преобразования она упрощается, и соответственно уменьшается размер набора данных в памяти и ускоряется работа алгоритмов ML на нем. Уменьшение размерности может быть осуществлено методами отбора выбора признаков (англ. ''feature selection'') или выделения признаков (англ. ''feature extraction'').==Отбор Выбор признаков==Методы '''отбора выбора признаков''' оставляют некоторое подмножество исходного набора признаков, избавляясь от признаков избыточных и слабо информативных. Основные преимущества этого класса алгоритмов:*Уменьшение вероятности [[переобучение|переобучения]];*Увеличение точности предсказания модели;*Сокращение времени обучения;*Увеличивается семантическое понимание модели.
Все методы отбора выбора признаков можно разделить на 5 типов, которые отличаются алгоритмами выбора лишних признаков.
===Фильтры===
'''Фильтры''' (англ. ''filter methods'') измеряют релевантность признаков на основе функции $\mu$, и затем решают по правилу $\kappa$, какие признаки оставить в результирующем множестве.
Фильтры могут быть:
*Одномерные (англ. ''univariate'') {{---}} функция $\mu$ определяет релевантность одного признака по отношению к выходным меткам. В таком случае, обычно, измеряют "качество" каждого признака и удаляют худшие.;
*Многомерные (англ. ''multivariate'') {{---}} функция $\mu$ определяет релевантность некоторого подмножества исходного множества признаков относительно выходных меток.
Распространенными вариантами для $\mu$ являются:
*Коэффициент ранговой корреляции Спирмена <ref>[https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient Определение коэффициента ранговой корреляции Спирмена]</ref>(англ. ''Spearman's rank correlation coefficient''): $p(x, y)=\displaystyle \frac{\sum_{i, j}(x_{ij}-\bar{x_j})(y_i-\bar{y})}{\sqrt{\sum_{i, j}(x_{ij}-\bar{x_j})^2\sum_i(y_i-\bar{y})^2}}$;*Information gain<ref>[https://en.wikipedia.org/wiki/Information_gain_in_decision_trees Определение information gain]</ref>: $IG(x, y)=\displaystyle -\sum_{i=1}^kp(c_i)\log_2{(p(c_i))}+\sum_{i=1}^{n}p(t_i)\sum_{j=1}^kp(c_j|t_i)log_2{(p(c_j|t_i))}$, и другие.
Преимуществом группы фильтров является простота вычисления релевантности признаков в датасетенаборе данных, но недостатком в таком подходе является игнорирование возможных зависимостей между признаками.
===Оберточные методы===
[[File:Feature_selection_Wrapper_MethodFeature_selection_wrapper_rus.png|450px|thumb|right|Процесс работы оберточных методов]]
'''Оберточные методы''' (англ. ''wrapper methods'') находят подмножество искомых признаков последовательно, используя некоторый классификатор как источник оценки качества выбранных признаков, т.е. этот процесс является циклическим и продолжается до тех пор, пока не будут достигнуты заданные условия останова. Оберточные методы учитывают зависимости между признаками, что является преимуществом по сравнению с фильтрами, к тому же показывают большую точность, но вычисления занимают длительное время, и повышается риск [[переобучение|переобучения]].
Существует несколько типов оберточных методов: детерминированные, которые изменяют множество признаков по определенному правилу, а также рандомизированные, которые используют генетические алгоритмы для выбора искомого подмножества признаков. Среди детерминированных алгоритмов самыми простыми являются:
*SFS (Sequential Forward Selection) {{---}} жадный алгоритм, который начинает с пустого множества признаков, на каждом шаге добавляя лучший из еще не выбранных признаков в результирующее множество;*SBS (Sequential Backward Selection) {{---}} алгоритм обратный SFS, который начинает с изначального множества признаков, и удаляет по одному или несколько худших признаков на каждом шаге.
Популярным оберточным методом является SVM-RFE (SVM-based Recursive Feature Elimination), который иногда также обозначается как встроенный <ref>[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117/ C. Embedded method]</ref>. Этот метод использует как классификатор [[Метод опорных векторов (SVM)| SVM]]<sup>[на 2028.01.18 19 не создан]</sup> и работает итеративно: начиная с полного множества признаков обучает классификатор, ранжирует признаки по весам, которые им присвоил классификатор, убирает какое-то число признаков и повторяет процесс с оставшегося подмножества фичей, если не было достигнуто их требуемое количество. Таким образом, этот метод очень похож на встроенный, потому что непосредственно использует знание того, как устроен классификатор.
===Встроенные методы===
[[File:Feature_selection_Embedded_MethodFeature_selection_embedded_rus.png|450px|thumb|right|Процесс работы встроенных методов]]
Группа '''встроенных методов''' (англ. ''embedded methods'') очень похожа на оберточные методы, но для выбора признаков используется непосредственно структуру некоторого классификатора. В оберточных методах классификатор служит только для оценки работы на данном множестве признаков, тогда как встроенные методы используют какую-то информацию о признаках, которую классификаторы присваивают во время обучения.
Одним из примеров встроенного метода является реализация на [[Дерево решений и случайный лес| случайном лесе]]: каждому дереву на вход подаются случайное подмножество данных из датасета с каким-то случайным набор признаков, в процессе обучения каждое из деревьев решений производит "голосование" за релевантность его признаков, эти данные агрегируются, и на выходе получаются значения важности каждого признака датасетанабора данных. Дальнейший отбор выбор нужных нам признаков уже зависит от выбранного критерия отбора.
Встроенные методы используют преимущества оберточных методов и являются более эффективными, при этом на отбор тратится меньше времени, уменьшается риск [[переобучение|переобучения]], но т.к. полученный набор признаков был отобран на основе знаний о классификаторе, то есть вероятность, что для другого классификатора это множество признаков уже не будет настолько же релевантным.
===Другие методы===
[[File:Ensemble_feature_selectionFeature_selection_ensemble_rus.jpgpng|thumb|Один из примеров процесса работы ансамблевых методов]]Есть и другие методы отбора выбора признаков: '''гибридные''' (англ. ''hybrid methods'') и '''ансамблевые''' (англ. ''ensemble methods''). '''Гибридные методы''' комбинируют несколько разных методов выбора признаков, например , некоторое множество фильтров, а потом запускают оберточный или встроенный метод. Таким образом, гибридные методы сочетают в себе преимущества сразу нескольких методов, и на практике повышают эффективность выбора признаков.
'''Ансамблевые методы''' применяются больше для датасетов наборов данных с очень большим числом признаков. В данном подходе для начального множества признаков создается несколько подмножеств признаков, и эти группы каким-то образом объединяются, чтобы получить набор самых релевантных признаков. Это довольно гибкая группа методов, т.к. для нее можно применять различные способы выбора признаков и объединения их подмножеств.
<div style="clear:{{{1|both}}};"></div>
===Примеры кода scikit-learn===
Пример кода, реализующего функцию оценки фильтра на основе коэффициента ранговой корреляции:
// # Импорт библиотек
import pandas as pd
import numpy as np
// # Вспомогательная функция для расчета корреляции
def correlation(X, Y):
return np.cov(X, Y) / np.sqrt(np.var(X) * np.var(Y))
// # Сам фильтр на основе метрики ранговой корреляции // # Аргументы X -- значения объектов датасета для какой-то фичи, Y -- метки этих объектов
def measure_spearmans(X, Y):
xr = pd.Series(X).rank()
Пример кода, реализующего SVM-RFE wrapper:
// # Импорт библиотек
import numpy as np
import pandas as pd
from sklearn import svm
// # X -- наш датасет, Y -- массив меток // # N -- число признаков, которые хотим оставить, step -- сколько фичей удаляется на каждой итерации // # Возвращает массив из булевых переменных размерностью 1x[число признаков], показывающий, отбрасываем признак или нет
def RFE(X, Y, N, step = 10):
// # cache_size нужен, если датасет набор данных большой, иначе можно опустить
clfRFE = svm.SVC(kernel='linear', cache_size=1024)
featureCount = X.shape[1]
return included
==Выделение признаков==
Другим способом уменьшить размерность входных данных является выделение признаков. Эти методы каким-то образом составляют из уже исходных признаков новые, все также полностью описывающие пространство датасетанабора данных, но уменьшая его размерность и теряя в репрезентативности данных, т.к. становится непонятно, за что отвечают новые признаки.
Все методы feature extraction можно разделить на '''линейные''' и '''нелинейные'''.
Одним из самых известных методов '''линейного feature extraction ''' выделения признаков является [[Метод главных компонент (PCA)| PCA ]]<sup>[на 28.01.19 не создан]</sup> (Principal Component Analysis, рус. ''метод главных компонент''). Основной идеей этого метода является поиск такой гиперплоскости, на которую при ортогональной проекции всех признаков максимизируется дисперсия. Данное преобразование может быть произведено с помощью сингулярного разложения матриц и создает проекцию только на линейные многомерные плоскости, поэтому и метод находится в категории линейных.  К '''нелинейным ''' методам, например, могут быть отнесены методы отображающие исходное пространство признаков на нелинейные поверхности или топологические многообразия. Одним из таких алгоритмов является [[Стохастическое вложение соседей с t-распределением |t-SNE]]<sup>[на 28.01.19 не создан]</sup> (t-distributed Stochastic Neighbor Embedding, рус. ''стохастическое вложение соседей с t-распределением''). Данный метод состоит из двух шагов: изначально строится распределение вероятностей по всем парам точек набора данных, каждая условная вероятность $p_{j|i}$ которого означает насколько точка $X_j$ близка к точке $X_i$ при гауссовом распределении вокруг $X_i$. Данное распределение как метрику похожести использует евклидово расстояние. Алгоритм старается получить отображение из точек размерности $\mathbb{R}^k$ в меньшую размерность $\mathbb{R}^d$, для этого вводится еще одно распределение, описывающее насколько точки из нового пространства похожи друг на друга, но используя при этом t-распределение Стьюдента с одной степенью свободы. Как метрику похожести двух распределений используется дивергенция Кульбака-Лейблера<ref>[https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence Дивергенция Кульбака-Лейблера]</ref>, и чтобы найти точки новой размерности $d$ запускается градиентный спуск для минимизации этой величины.
===Пример кода scikit-learn===
Пример выделения признаков с помощью PCA в scikit-learn:
// # Импорт библиотек
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
// X -- датасет, n -- число извлекаемых признаков= ... # загрузка X Y = ... # загрузка Y # Разделение данных на train и test def extractPCA(XXtrain, Xtest, Ytrain, n): pca = PCA(n_componentsYtest =n) return pca.fit_transformtrain_test_split(X, Y)
clf =... # берем какой-то классификатор # Обучаем PCA для выделения 5 признаков pca =PCA(n_components=Примеры кода 5) pca.fit(Xtrain) # Изменяем наши наборы данных под выбранные признаки Xtrain = pca.transform(Xtrain) Xtest = pca.transform(Xtest) # Обучаем классификатор и проверяем точность его работы clf.fit(Xtrain, Ytrain) print ("Score: %.6f" % clf.score(Xtest, Ytest)) ===Пример на языке Scala===
SBT зависимость:
libraryDependencies '''+=''' "com.github.haifengl" '''%%''' "smile-scala" '''%''' "1.5.2"
==См. также==
*[[Переобучение]]
*[[Метод опорных векторов (SVM)| SVM]]<sup>[на 2028.01.18 19 не создан]</sup>
*[[Дерево решений и случайный лес| Случайный лес]]
*[[Метод главных компонент (PCA)| PCA]]<sup>[на 28.01.19 не создан]</sup>
*[[Стохастическое вложение соседей с t-распределением |t-SNE]]<sup>[на 28.01.19 не создан]</sup>
==Примечания==
<references/>
77
правок

Навигация