Изменения

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

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

8310 байт добавлено, 22:47, 30 января 2019
Нет описания правки
Под '''уменьшением размерности''' (англ. ''dimensionality reduction'') в машинном обучении подразумевается уменьшение числа признаков датасетанабора данных. Наличие в нем признаков избыточных, неинформативных или слабо информативных может понизить эффективность модели, а после такого преобразования она упрощается, и соответственно уменьшается размер набора данных в памяти и ускоряется работа алгоритмов ML на нем. Уменьшение размерности может быть осуществлено методами отбора выбора признаков (англ. ''feature selection'') или выделения признаков (англ. ''feature extraction'').==Feature selectionВыбор признаков==Методы '''feature selectionвыбора признаков''' оставляют некоторое подмножество исходного набора признаков, избавляясь от признаков избыточных и слабо информативных. Основные преимущества этого класса алгоритмов:*Уменьшение вероятности [[переобучение|переобучения]];*Увеличение точности предсказания модели;*Сокращение времени обучения;*Увеличивается семантическое понимание модели.
Все методы отбора выбора признаков можно разделить на 5 типов, которые отличаются алгоритмами выбора лишних признаков.===FiltersФильтры==='''Фильтры''' (англ. ''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))}$, и другие.
Преимуществом группы фильтров является простота вычисления релевантности признаков в датасетенаборе данных, но недостатком в таком подходе является игнорирование возможных зависимостей между признаками.===WrappersОберточные методы===[[File:Feature_selection_Wrapper_MethodFeature_selection_wrapper_rus.png|300px450px|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> и работает итеративно: начиная с полного множества признаков обучает классификатор, ранжирует признаки по весам, которые им присвоил классификатор, убирает какое-то число признаков и повторяет процесс с оставшегося подмножества фичей, если не было достигнуто их требуемое количество. Таким образом, этот метод очень похож на встроенный, потому что непосредственно использует знание того, как устроен классификатор.
===EmbeddedВстроенные методы===[[File:Feature_selection_Embedded_MethodFeature_selection_embedded_rus.png|300px450px|thumb|right|Процесс работы встроенных методов]]Группа '''встроенных методов''' (англ. ''embedded methods'') очень похожа на оберточные методы, но для выбора признаков используется непосредственно структуру некоторого классификатора. В оберточных методах классификатор служит только для оценки работы на данном множестве признаков, тогда как встроенные методы используют какую-то информацию о признаках, которую классификаторы присваивают во время обучения.
Одним из примеров встроенного метода является реализация на [[Дерево решений и случайный лес| случайном лесе]]: каждому дереву на вход подаются случайное подмножество данных из датасета с каким-то случайным набор признаков, в процессе обучения каждое из деревьев решений производит "голосование" за релевантность его признаков, эти данные агрегируются, и на выходе получаются значения важности каждого признака датасетанабора данных. Дальнейший отбор выбор нужных нам признаков уже зависит от выбранного критерия отбора.
Встроенные методы используют преимущества оберточных методов и являются более эффективными, при этом на отбор тратится меньше времени, уменьшается риск [[переобучение|переобучения]], но т.к. полученный набор признаков был отобран на основе знаний о классификаторе, то есть вероятность, что для другого классификатора это множество признаков уже не будет настолько же релевантным.
===Другие методы===
[[File:Ensemble_feature_selectionFeature_selection_ensemble_rus.jpg|200pxpng|thumb|right|Один из примеров процесса работы ансамблевых методов]]Есть и другие методы отбора выбора признаков: '''гибридные''' (англ. ''hybrid methods'') и '''ансамблевые''' (англ. ''ensemble methods''). '''Гибридные методы''' комбинируют несколько разных методов выбора признаков, например , некоторое множество фильтров, а потом запускают оберточный или встроенный метод. Таким образом, гибридные методы сочетают в себе преимущества сразу нескольких методов, и на практике повышают эффективность выбора признаков.
'''Ансамблевые методы''' применяются больше для датасетов наборов данных с очень большим числом признаков. В данном подходе для начального множества признаков создается несколько подмножеств признаков, и эти группы каким-то образом объединяются, чтобы получить набор самых релевантных признаков. Это довольно гибкая группа методов, т.к. для нее можно применять различные способы выбора признаков и объединения их подмножеств. <div style="clear:{{{1|both}}};"></div>
===Примеры кода scikit-learn===
Пример кода, реализующего фильтр функцию оценки фильтра на основе коэффициента ранговой корреляции:<syntaxhighlight lang=python> # Импорт библиотек 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() yr = pd.Series(Y).rank() return correlation(xr, yr) Пример кода, реализующего SVM-RFE wrapper: # Импорт библиотек import numpy as np import pandas as pd from sklearn import svm
# X -- наш датасет, Y -- массив меток # N -- число признаков, которые хотим оставить, step -- сколько фичей удаляется на каждой итерации # Возвращает массив из булевых переменных размерностью 1x[число признаков], показывающий, отбрасываем признак или нет def correlationRFE(X, Y, N, step = 10): return np # cache_size нужен, если набор данных большой, иначе можно опустить clfRFE = svm.covSVC(Xkernel='linear', Ycache_size=1024) / featureCount = X.shape[1] featureList = np.sqrtarange(0, featureCount ) included = np.varfull(featureCount, True) curCount = featureCount while curCount > N: actualFeatures = featureList[included] Xnew = X[:, actualFeatures] clfRFE.fit(Xnew, Y) * curStep = min(step, curCount - N) elim = np.argsort(np.varabs(YclfRFE.coef_[0]))[:curStep] included[actualFeatures[elim]] = False curCount -= curStep return included==Выделение признаков==Другим способом уменьшить размерность входных данных является выделение признаков. Эти методы каким-то образом составляют из уже исходных признаков новые, все также полностью описывающие пространство набора данных, но уменьшая его размерность и теряя в репрезентативности данных, т.к. становится непонятно, за что отвечают новые признаки.Все методы feature extraction можно разделить на '''линейные''' и '''нелинейные'''.
def measure_spearmansОдним из самых известных методов '''линейного''' выделения признаков является [[Метод главных компонент (X, YPCA): xr = pd| PCA]]<sup>[на 28.Series01.19 не создан]</sup> (XPrincipal Component Analysis, рус. ''метод главных компонент'').rank() yr = pdОсновной идеей этого метода является поиск такой гиперплоскости, на которую при ортогональной проекции всех признаков максимизируется дисперсия.Series(Y)Данное преобразование может быть произведено с помощью сингулярного разложения матриц и создает проекцию только на линейные многомерные плоскости, поэтому и метод находится в категории линейных.rank()
return correlationК '''нелинейным''' методам, например, могут быть отнесены методы отображающие исходное пространство признаков на нелинейные поверхности или топологические многообразия. Одним из таких алгоритмов является [[Стохастическое вложение соседей с t-распределением |t-SNE]]<sup>[на 28.01.19 не создан]</sup> (xrt-distributed Stochastic Neighbor Embedding, yrрус. ''стохастическое вложение соседей с 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 Дивергенция Кульбака-Лейблера]</syntaxhighlightref>, и чтобы найти точки новой размерности $d$ запускается градиентный спуск для минимизации этой величины. ==Feature extraction=Пример кода scikit-learn===Пример выделения признаков с помощью PCA в scikit-learn: # Импорт библиотек from sklearn.decomposition import PCA from sklearn.model_selection import train_test_split  X =Linear... # загрузка X Y =... # загрузка Y # Разделение данных на train и test Xtrain, Xtest, Ytrain, Ytest =train_test_split(X, Y)  clf =... # берем какой-то классификатор # Обучаем PCA для выделения 5 признаков pca =PCA(n_components=5) pca.fit(Xtrain) # Изменяем наши наборы данных под выбранные признаки Xtrain =Nonlinear==pca.transform(Xtrain) Xtest =pca.transform(Xtest) # Обучаем классификатор и проверяем точность его работы clf.fit(Xtrain, Ytrain) print ("Score: %.6f" % clf.score(Xtest, Ytest))===Примеры кода scikit-learn=== ===Примеры кода Пример на языке Scala===
SBT зависимость:
libraryDependencies '''+= ''' "com.github.haifengl" '''%% ''' "smile-scala" '''% ''' "1.5.2"
Пример уменьшение размерности используя smile.feature.GAFeatureSelection<ref>[https://haifengl.github.io/smile/feature.html#genetic-algorithm-feature-selection Smile, Genetic Algorithm Based Feature Selection]</ref>:
'''import '''smile.classification._ '''import '''smile.data._ '''import '''smile.feature.GAFeatureSelection '''import '''smile.read '''import '''smile.validation.Accuracy
<span style="color:#3D9970>// Загрузка данных</span> '''val '''data = read.arff("data/weka/segment-test.arff", 19) '''val '''(x, y) = data.unzipInt '''val '''trainer = '''new '''GradientTreeBoost.Trainer(100) '''val '''measure = '''new '''Accuracy <span style="color:#3D9970>// Cоздание генетического алгоритма и его настройка.</span> '''val '''selector = '''new '''GAFeatureSelection <span style="color:#3D9970>// Размер популяции - 50, количество поколений - 20 </span> <span style="color:#3D9970>// Каждая возращаемая BitString содержит фичи и их качество.</span> '''val '''result = selector.learn(50, 20, trainer, measure, x, y, 5)
result.foreach { bits =>
print(100*bits.fitness)
==См. также==
*[[Переобучение]]
*[[Метод опорных векторов (SVM)| SVM]]<sup>[на 2028.01.18 19 не создан]</sup>
*[[Дерево решений и случайный лес| Случайный лес]]
*[[Метод главных компонент (PCA)| PCA]]<sup>[на 28.01.19 не создан]</sup>
*[[Стохастическое вложение соседей с t-распределением |t-SNE]]<sup>[на 28.01.19 не создан]</sup>
==Примечания==
<references/>
#[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117 Публикация про feature selection]
#[https://towardsdatascience.com/feature-selection-using-random-forest-26d7b747597f Embedded random forest]
 
[[Категория: Машинное обучение]]
[[Категория: Уменьшение размерности]]
77
правок

Навигация