<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wa5teed</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wa5teed"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Wa5teed"/>
		<updated>2026-06-11T16:46:36Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=82546</id>
		<title>Уменьшение размерности</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=82546"/>
				<updated>2022-06-29T20:40:13Z</updated>
		
		<summary type="html">&lt;p&gt;Wa5teed: /* Выбор признаков */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Под '''уменьшением размерности''' (англ. ''dimensionality reduction'') в машинном обучении подразумевается уменьшение числа признаков набора данных. Наличие в нем признаков избыточных, неинформативных или слабо информативных может понизить эффективность модели, а после такого преобразования она упрощается, и соответственно уменьшается размер набора данных в памяти и ускоряется работа алгоритмов ML на нем. Уменьшение размерности может быть осуществлено методами выбора признаков (англ. ''feature selection'') или выделения признаков (англ. ''feature extraction'').&lt;br /&gt;
==Выбор признаков==&lt;br /&gt;
Методы '''выбора признаков''' оставляют некоторое подмножество исходного набора признаков, избавляясь от признаков избыточных и слабо информативных. Основные преимущества этого класса алгоритмов:&lt;br /&gt;
*Уменьшение вероятности [[переобучение|переобучения]];&lt;br /&gt;
*Увеличение точности предсказания модели;&lt;br /&gt;
*Сокращение времени обучения;&lt;br /&gt;
*Увеличивается семантическое понимание модели.&lt;br /&gt;
&lt;br /&gt;
Все методы выбора признаков можно разделить на 5 типов, которые отличаются алгоритмами выбора лишних признаков.&lt;br /&gt;
===Фильтры===&lt;br /&gt;
'''Фильтры''' (англ. ''filter methods'') измеряют релевантность признаков на основе функции $\mu$, и затем решают по правилу $\kappa$, какие признаки оставить в результирующем множестве.&lt;br /&gt;
&lt;br /&gt;
Фильтры могут быть:&lt;br /&gt;
*Одномерные (англ. ''univariate'') {{---}} функция $\mu$ определяет релевантность одного признака по отношению к выходным меткам. В таком случае обычно измеряют &amp;quot;качество&amp;quot; каждого признака и удаляют худшие;&lt;br /&gt;
*Многомерные (англ. ''multivariate'') {{---}} функция $\mu$ определяет релевантность некоторого подмножества исходного множества признаков относительно выходных меток.&lt;br /&gt;
&lt;br /&gt;
Распространенными вариантами для $\mu$ являются:&lt;br /&gt;
*Коэффициент ранговой корреляции Спирмена &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient Определение коэффициента ранговой корреляции Спирмена]&amp;lt;/ref&amp;gt;(англ. ''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}}$;&lt;br /&gt;
*Information gain&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Information_gain_in_decision_trees Определение information gain]&amp;lt;/ref&amp;gt;: $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))}$, и другие.&lt;br /&gt;
&lt;br /&gt;
Преимуществом группы фильтров является простота вычисления релевантности признаков в наборе данных, но недостатком в таком подходе является игнорирование возможных зависимостей между признаками.&lt;br /&gt;
===Оберточные методы===&lt;br /&gt;
[[File:Feature_selection_wrapper_rus.png|450px|thumb|right|Процесс работы оберточных методов]]&lt;br /&gt;
'''Оберточные методы''' (англ. ''wrapper methods'') находят подмножество искомых признаков последовательно, используя некоторый классификатор как источник оценки качества выбранных признаков, т.е. этот процесс является циклическим и продолжается до тех пор, пока не будут достигнуты заданные условия останова. Оберточные методы учитывают зависимости между признаками, что является преимуществом по сравнению с фильтрами, к тому же показывают большую точность, но вычисления занимают длительное время, и повышается риск [[переобучение|переобучения]]. &lt;br /&gt;
&lt;br /&gt;
Существует несколько типов оберточных методов: детерминированные, которые изменяют множество признаков по определенному правилу, а также рандомизированные, которые используют генетические алгоритмы для выбора искомого подмножества признаков. Среди детерминированных алгоритмов самыми простыми являются:&lt;br /&gt;
*SFS (Sequential Forward Selection) {{---}} жадный алгоритм, который начинает с пустого множества признаков, на каждом шаге добавляя лучший из еще не выбранных признаков в результирующее множество;&lt;br /&gt;
*SBS (Sequential Backward Selection) {{---}} алгоритм обратный SFS, который начинает с изначального множества признаков, и удаляет по одному или несколько худших признаков на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Популярным оберточным методом является SVM-RFE (SVM-based Recursive Feature Elimination), который иногда также обозначается как встроенный &amp;lt;ref&amp;gt;[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117/ C. Embedded method]&amp;lt;/ref&amp;gt;. Этот метод использует как классификатор [[Метод опорных векторов (SVM)| SVM]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; и работает итеративно: начиная с полного множества признаков обучает классификатор, ранжирует признаки по весам, которые им присвоил классификатор, убирает какое-то число признаков и повторяет процесс с оставшегося подмножества фичей, если не было достигнуто их требуемое количество. Таким образом, этот метод очень похож на встроенный, потому что непосредственно использует знание того, как устроен классификатор.&lt;br /&gt;
&lt;br /&gt;
===Встроенные методы===&lt;br /&gt;
[[File:Feature_selection_embedded_rus.png|450px|thumb|right|Процесс работы встроенных методов]]&lt;br /&gt;
Группа '''встроенных методов''' (англ. ''embedded methods'') очень похожа на оберточные методы, но для выбора признаков используется непосредственно структуру некоторого классификатора. В оберточных методах классификатор служит только для оценки работы на данном множестве признаков, тогда как встроенные методы используют какую-то информацию о признаках, которую классификаторы присваивают во время обучения. &lt;br /&gt;
&lt;br /&gt;
Одним из примеров встроенного метода является реализация на [[Дерево решений и случайный лес| случайном лесе]]: каждому дереву на вход подаются случайное подмножество данных из датасета с каким-то случайным набор признаков, в процессе обучения каждое из деревьев решений производит &amp;quot;голосование&amp;quot; за релевантность его признаков, эти данные агрегируются, и на выходе получаются значения важности каждого признака набора данных. Дальнейший выбор нужных нам признаков уже зависит от выбранного критерия отбора.&lt;br /&gt;
&lt;br /&gt;
Встроенные методы используют преимущества оберточных методов и являются более эффективными, при этом на отбор тратится меньше времени, уменьшается риск [[переобучение|переобучения]], но т.к. полученный набор признаков был отобран на основе знаний о классификаторе, то есть вероятность, что для другого классификатора это множество признаков уже не будет настолько же релевантным.&lt;br /&gt;
&lt;br /&gt;
===Правила обрезки===&lt;br /&gt;
Для признаков, у которых найдено качество, можно выкинуть ненужное число признаков.&lt;br /&gt;
От каких параметров может зависеть алгоритм обрезки:&lt;br /&gt;
* Число признаков&lt;br /&gt;
* Порог значимости признаков&lt;br /&gt;
* Интегральный порог значимости признаков&lt;br /&gt;
* Метод сломанной трости&lt;br /&gt;
* Метод локтя&lt;br /&gt;
&lt;br /&gt;
Может быть известно число признаков, которые нужно оставить, или выкинуть.&lt;br /&gt;
&lt;br /&gt;
Порог значимости признаков соответствует порогу для меры, например, корреляции, для которой выкидываются признаки, для которых корреляция меньше определенного порога:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\left | F \right | &amp;gt; x&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Может существовать интегральный порог значимости, то есть признаки отсортированы по нормированной по единице &amp;quot;полезности&amp;quot; &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt;, и выбирается несколько признаков с наибольшей &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Метод сломанной трости'''. Есть отрезок, который мы разбиваем по &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; случайным точкам. Если отсортировать длины подотрезков, то для &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го подотрезка длина будет равна примерно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T = \frac{\sum_{i=1}^{k} \frac{1}{i} }{k}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} число признаков, которые нужно оставить.&lt;br /&gt;
&lt;br /&gt;
Тогда берутся те признаки, для которых &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt; превышает порог &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Метод локтя'''. Пусть есть график для признаков, отсортированных по убыванию &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt;. Берутся признаки, идущие до резкого перехода между соседними значениями. То есть берутся &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt; до порога &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; {{---}} основание наиболее острого угла, образованного тремя соседними точками на графике.&lt;br /&gt;
&lt;br /&gt;
Метод локтя можно использовать и для задачи кластеризации. Например, пусть &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt; {{---}} внутрикластерное расстояние. Тогда выбирается число кластеров, соответствующее резкому переходу между соседними значениями на графике.&lt;br /&gt;
&lt;br /&gt;
===Другие методы===&lt;br /&gt;
[[File:Feature_selection_ensemble_rus.png|thumb|Один из примеров процесса работы ансамблевых методов]]&lt;br /&gt;
Есть и другие методы выбора признаков: '''гибридные''' (англ. ''hybrid methods'') и '''ансамблевые''' (англ. ''ensemble methods''). '''Гибридные методы''' комбинируют несколько разных методов выбора признаков, например, некоторое множество фильтров, а потом запускают оберточный или встроенный метод. Таким образом, гибридные методы сочетают в себе преимущества сразу нескольких методов, и на практике повышают эффективность выбора признаков.&lt;br /&gt;
&lt;br /&gt;
'''Ансамблевые методы''' применяются больше для наборов данных с очень большим числом признаков. В данном подходе для начального множества признаков создается несколько подмножеств признаков, и эти группы каким-то образом объединяются, чтобы получить набор самых релевантных признаков. Это довольно гибкая группа методов, т.к. для нее можно применять различные способы выбора признаков и объединения их подмножеств.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:{{{1|both}}};&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Примеры кода scikit-learn===&lt;br /&gt;
Пример кода, реализующего функцию оценки фильтра на основе коэффициента ранговой корреляции:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  import pandas as pd&lt;br /&gt;
  import numpy as np&lt;br /&gt;
  &lt;br /&gt;
  # Вспомогательная функция для расчета корреляции&lt;br /&gt;
  def correlation(X, Y):&lt;br /&gt;
      return np.cov(X, Y) / np.sqrt(np.var(X) * np.var(Y))&lt;br /&gt;
&lt;br /&gt;
  # Сам фильтр на основе метрики ранговой корреляции&lt;br /&gt;
  # Аргументы X -- значения объектов датасета для какой-то фичи, Y -- метки этих объектов&lt;br /&gt;
  def measure_spearmans(X, Y):&lt;br /&gt;
      xr = pd.Series(X).rank()&lt;br /&gt;
      yr = pd.Series(Y).rank()&lt;br /&gt;
      return correlation(xr, yr)&lt;br /&gt;
&lt;br /&gt;
Пример кода, реализующего SVM-RFE wrapper:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  import numpy as np&lt;br /&gt;
  import pandas as pd&lt;br /&gt;
  from sklearn import svm&lt;br /&gt;
&lt;br /&gt;
  # X -- наш датасет, Y -- массив меток&lt;br /&gt;
  # N -- число признаков, которые хотим оставить, step -- сколько фичей удаляется на каждой итерации&lt;br /&gt;
  # Возвращает массив из булевых переменных размерностью 1x[число признаков], показывающий, отбрасываем признак или нет&lt;br /&gt;
  def RFE(X, Y, N, step = 10):&lt;br /&gt;
        # cache_size нужен, если набор данных большой, иначе можно опустить&lt;br /&gt;
        clfRFE = svm.SVC(kernel='linear', cache_size=1024)&lt;br /&gt;
        featureCount = X.shape[1]&lt;br /&gt;
        featureList = np.arange(0, featureCount )&lt;br /&gt;
        included = np.full(featureCount, True)&lt;br /&gt;
        curCount = featureCount&lt;br /&gt;
        while curCount &amp;gt; N:&lt;br /&gt;
            actualFeatures = featureList[included]&lt;br /&gt;
            Xnew = X[:, actualFeatures]&lt;br /&gt;
            &lt;br /&gt;
            clfRFE.fit(Xnew, Y)&lt;br /&gt;
            curStep = min(step, curCount - N)&lt;br /&gt;
            elim = np.argsort(np.abs(clfRFE.coef_[0]))[:curStep]&lt;br /&gt;
            included[actualFeatures[elim]] = False&lt;br /&gt;
            curCount -= curStep&lt;br /&gt;
        return included&lt;br /&gt;
&lt;br /&gt;
==Выделение признаков==&lt;br /&gt;
Другим способом уменьшить размерность входных данных является выделение признаков. Эти методы каким-то образом составляют из уже исходных признаков новые, все также полностью описывающие пространство набора данных, но уменьшая его размерность и теряя в репрезентативности данных, т.к. становится непонятно, за что отвечают новые признаки.&lt;br /&gt;
Все методы feature extraction можно разделить на '''линейные''' и '''нелинейные'''.&lt;br /&gt;
&lt;br /&gt;
Одним из самых известных методов '''линейного''' выделения признаков является [[Метод главных компонент (PCA)| PCA]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (Principal Component Analysis, рус. ''метод главных компонент''). Основной идеей этого метода является поиск такой гиперплоскости, на которую при ортогональной проекции всех признаков максимизируется дисперсия. Данное преобразование может быть произведено с помощью сингулярного разложения матриц и создает проекцию только на линейные многомерные плоскости, поэтому и метод находится в категории линейных.&lt;br /&gt;
&lt;br /&gt;
К '''нелинейным''' методам, например, могут быть отнесены методы отображающие исходное пространство признаков на нелинейные поверхности или топологические многообразия. Одним из таких алгоритмов является [[Стохастическое вложение соседей с t-распределением |t-SNE]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (t-distributed Stochastic Neighbor Embedding, рус. ''стохастическое вложение соседей с t-распределением''). Данный метод состоит из двух шагов: изначально строится распределение вероятностей по всем парам точек набора данных, каждая условная вероятность $p_{j|i}$ которого означает насколько точка $X_j$ близка к точке $X_i$ при гауссовом распределении вокруг $X_i$. Данное распределение как метрику похожести использует евклидово расстояние. Алгоритм старается получить отображение из точек размерности $\mathbb{R}^k$ в меньшую размерность $\mathbb{R}^d$, для этого вводится еще одно распределение, описывающее насколько точки из нового пространства похожи друг на друга, но используя при этом t-распределение Стьюдента с одной степенью свободы. Как метрику похожести двух распределений используется дивергенция Кульбака-Лейблера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence Дивергенция Кульбака-Лейблера]&amp;lt;/ref&amp;gt;, и чтобы найти точки новой размерности $d$ запускается градиентный спуск для минимизации этой величины. &lt;br /&gt;
===Пример кода scikit-learn===&lt;br /&gt;
Пример выделения признаков с помощью PCA в scikit-learn:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  from sklearn.decomposition import PCA&lt;br /&gt;
  from sklearn.model_selection import train_test_split&lt;br /&gt;
&lt;br /&gt;
  X = ... # загрузка X&lt;br /&gt;
  Y = ... # загрузка Y&lt;br /&gt;
  # Разделение данных на train и test&lt;br /&gt;
  Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, Y)&lt;br /&gt;
&lt;br /&gt;
  clf = ... # берем какой-то классификатор&lt;br /&gt;
  # Обучаем PCA для выделения 5 признаков&lt;br /&gt;
  pca = PCA(n_components=5)&lt;br /&gt;
  pca.fit(Xtrain)&lt;br /&gt;
  # Изменяем наши наборы данных под выбранные признаки&lt;br /&gt;
  Xtrain = pca.transform(Xtrain)&lt;br /&gt;
  Xtest = pca.transform(Xtest)&lt;br /&gt;
  # Обучаем классификатор и проверяем точность его работы&lt;br /&gt;
  clf.fit(Xtrain, Ytrain)&lt;br /&gt;
  print (&amp;quot;Score: %.6f&amp;quot; % clf.score(Xtest, Ytest))&lt;br /&gt;
  &lt;br /&gt;
===Пример на языке Scala===&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример уменьшение размерности используя smile.feature.GAFeatureSelection&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/feature.html#genetic-algorithm-feature-selection Smile, Genetic Algorithm Based Feature Selection]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.feature.GAFeatureSelection&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.Accuracy&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Загрузка данных&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''data = read.arff(&amp;quot;data/weka/segment-test.arff&amp;quot;, 19)&lt;br /&gt;
  '''val '''(x, y) = data.unzipInt&lt;br /&gt;
  '''val '''trainer = '''new '''GradientTreeBoost.Trainer(100)&lt;br /&gt;
  '''val '''measure = '''new '''Accuracy&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Cоздание генетического алгоритма и его настройка.&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''selector = '''new '''GAFeatureSelection&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Размер популяции - 50, количество поколений - 20 &amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Каждая возращаемая BitString содержит фичи и их качество.&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''result = selector.learn(50, 20, trainer, measure, x, y, 5)&lt;br /&gt;
  result.foreach { bits =&amp;gt;&lt;br /&gt;
    print(100*bits.fitness)&lt;br /&gt;
    println(bits.bits.mkString(&amp;quot; &amp;quot;))&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
Пример уменьшения размерности датасета с применением &amp;lt;code&amp;gt;weka.attributeSelection.PrincipalComponents&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/attributeSelection/PrincipalComponents.html/ Weka, PCA]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;nz.ac.waikato.cms.weka&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;weka-stable&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;3.8.0&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' weka.attributeSelection.PrincipalComponents;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
  '''import''' weka.filters.Filter;&lt;br /&gt;
  '''import''' weka.filters.unsupervised.attribute.NumericToNominal;&lt;br /&gt;
  '''import''' java.io.BufferedReader;&lt;br /&gt;
  '''import''' java.io.FileReader;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// load dataset&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;data/bank-data.arff&amp;quot;)));&lt;br /&gt;
  '''var''' filter = new NumericToNominal();&lt;br /&gt;
  filter.setInputFormat(data);&lt;br /&gt;
  data = Filter.useFilter(data, filter);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// initialize the PCA-based selector&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' pca = new PrincipalComponents();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// dimensionality reduction is achieved through selecting enough eigenvectors to account&amp;lt;/font&amp;gt;&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// for some percantege of the variance in the original data&amp;lt;/font&amp;gt;&lt;br /&gt;
  pca.setVarianceCovered(0.95);&lt;br /&gt;
  pca.buildEvaluator(data);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// transform the dataset&amp;lt;/font&amp;gt;&lt;br /&gt;
  data = pca.transformedData(data);&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Переобучение]]&lt;br /&gt;
*[[Метод опорных векторов (SVM)| SVM]]&lt;br /&gt;
*[[Дерево решений и случайный лес| Случайный лес]]&lt;br /&gt;
*[[Метод главных компонент (PCA)| PCA]]&lt;br /&gt;
*[[Стохастическое вложение соседей с t-распределением |t-SNE]]&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
==Источники информации==&lt;br /&gt;
#[http://research.cs.tamu.edu/prism/lectures/pr/pr_l11.pdf Sequential feature selection] {{---}} курс ML Texas A&amp;amp;M University&lt;br /&gt;
#[https://en.wikipedia.org/wiki/Feature_selection Feature selection] {{---}} статья про Feature Selection в Wikipedia&lt;br /&gt;
#[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117 Публикация про feature selection]&lt;br /&gt;
#[https://towardsdatascience.com/feature-selection-using-random-forest-26d7b747597f Embedded random forest]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Уменьшение размерности]]&lt;/div&gt;</summary>
		<author><name>Wa5teed</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=82545</id>
		<title>Уменьшение размерности</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=82545"/>
				<updated>2022-06-29T20:32:42Z</updated>
		
		<summary type="html">&lt;p&gt;Wa5teed: /* Правила обрезки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Под '''уменьшением размерности''' (англ. ''dimensionality reduction'') в машинном обучении подразумевается уменьшение числа признаков набора данных. Наличие в нем признаков избыточных, неинформативных или слабо информативных может понизить эффективность модели, а после такого преобразования она упрощается, и соответственно уменьшается размер набора данных в памяти и ускоряется работа алгоритмов ML на нем. Уменьшение размерности может быть осуществлено методами выбора признаков (англ. ''feature selection'') или выделения признаков (англ. ''feature extraction'').&lt;br /&gt;
==Выбор признаков==&lt;br /&gt;
Методы '''выбора признаков''' оставляют некоторое подмножество исходного набора признаков, избавляясь от признаков избыточных и слабо информативных. Основные преимущества этого класса алгоритмов:&lt;br /&gt;
*Уменьшение вероятности [[переобучение|переобучения]];&lt;br /&gt;
*Увеличение точности предсказания модели;&lt;br /&gt;
*Сокращение времени обучения;&lt;br /&gt;
*Увеличивается семантическое понимание модели.&lt;br /&gt;
&lt;br /&gt;
Все методы выбора признаков можно разделить на 5 типов, которые отличаются алгоритмами выбора лишних признаков.&lt;br /&gt;
===Фильтры===&lt;br /&gt;
'''Фильтры''' (англ. ''filter methods'') измеряют релевантность признаков на основе функции $\mu$, и затем решают по правилу $\kappa$, какие признаки оставить в результирующем множестве.&lt;br /&gt;
&lt;br /&gt;
Фильтры могут быть:&lt;br /&gt;
*Одномерные (англ. ''univariate'') {{---}} функция $\mu$ определяет релевантность одного признака по отношению к выходным меткам. В таком случае обычно измеряют &amp;quot;качество&amp;quot; каждого признака и удаляют худшие;&lt;br /&gt;
*Многомерные (англ. ''multivariate'') {{---}} функция $\mu$ определяет релевантность некоторого подмножества исходного множества признаков относительно выходных меток.&lt;br /&gt;
&lt;br /&gt;
Распространенными вариантами для $\mu$ являются:&lt;br /&gt;
*Коэффициент ранговой корреляции Спирмена &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient Определение коэффициента ранговой корреляции Спирмена]&amp;lt;/ref&amp;gt;(англ. ''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}}$;&lt;br /&gt;
*Information gain&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Information_gain_in_decision_trees Определение information gain]&amp;lt;/ref&amp;gt;: $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))}$, и другие.&lt;br /&gt;
&lt;br /&gt;
Преимуществом группы фильтров является простота вычисления релевантности признаков в наборе данных, но недостатком в таком подходе является игнорирование возможных зависимостей между признаками.&lt;br /&gt;
===Оберточные методы===&lt;br /&gt;
[[File:Feature_selection_wrapper_rus.png|450px|thumb|right|Процесс работы оберточных методов]]&lt;br /&gt;
'''Оберточные методы''' (англ. ''wrapper methods'') находят подмножество искомых признаков последовательно, используя некоторый классификатор как источник оценки качества выбранных признаков, т.е. этот процесс является циклическим и продолжается до тех пор, пока не будут достигнуты заданные условия останова. Оберточные методы учитывают зависимости между признаками, что является преимуществом по сравнению с фильтрами, к тому же показывают большую точность, но вычисления занимают длительное время, и повышается риск [[переобучение|переобучения]]. &lt;br /&gt;
&lt;br /&gt;
Существует несколько типов оберточных методов: детерминированные, которые изменяют множество признаков по определенному правилу, а также рандомизированные, которые используют генетические алгоритмы для выбора искомого подмножества признаков. Среди детерминированных алгоритмов самыми простыми являются:&lt;br /&gt;
*SFS (Sequential Forward Selection) {{---}} жадный алгоритм, который начинает с пустого множества признаков, на каждом шаге добавляя лучший из еще не выбранных признаков в результирующее множество;&lt;br /&gt;
*SBS (Sequential Backward Selection) {{---}} алгоритм обратный SFS, который начинает с изначального множества признаков, и удаляет по одному или несколько худших признаков на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Популярным оберточным методом является SVM-RFE (SVM-based Recursive Feature Elimination), который иногда также обозначается как встроенный &amp;lt;ref&amp;gt;[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117/ C. Embedded method]&amp;lt;/ref&amp;gt;. Этот метод использует как классификатор [[Метод опорных векторов (SVM)| SVM]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; и работает итеративно: начиная с полного множества признаков обучает классификатор, ранжирует признаки по весам, которые им присвоил классификатор, убирает какое-то число признаков и повторяет процесс с оставшегося подмножества фичей, если не было достигнуто их требуемое количество. Таким образом, этот метод очень похож на встроенный, потому что непосредственно использует знание того, как устроен классификатор.&lt;br /&gt;
&lt;br /&gt;
===Встроенные методы===&lt;br /&gt;
[[File:Feature_selection_embedded_rus.png|450px|thumb|right|Процесс работы встроенных методов]]&lt;br /&gt;
Группа '''встроенных методов''' (англ. ''embedded methods'') очень похожа на оберточные методы, но для выбора признаков используется непосредственно структуру некоторого классификатора. В оберточных методах классификатор служит только для оценки работы на данном множестве признаков, тогда как встроенные методы используют какую-то информацию о признаках, которую классификаторы присваивают во время обучения. &lt;br /&gt;
&lt;br /&gt;
Одним из примеров встроенного метода является реализация на [[Дерево решений и случайный лес| случайном лесе]]: каждому дереву на вход подаются случайное подмножество данных из датасета с каким-то случайным набор признаков, в процессе обучения каждое из деревьев решений производит &amp;quot;голосование&amp;quot; за релевантность его признаков, эти данные агрегируются, и на выходе получаются значения важности каждого признака набора данных. Дальнейший выбор нужных нам признаков уже зависит от выбранного критерия отбора.&lt;br /&gt;
&lt;br /&gt;
Встроенные методы используют преимущества оберточных методов и являются более эффективными, при этом на отбор тратится меньше времени, уменьшается риск [[переобучение|переобучения]], но т.к. полученный набор признаков был отобран на основе знаний о классификаторе, то есть вероятность, что для другого классификатора это множество признаков уже не будет настолько же релевантным.&lt;br /&gt;
&lt;br /&gt;
===Правила обрезки===&lt;br /&gt;
Для признаков, у которых найдено качество, можно выкинуть ненужное число признаков.&lt;br /&gt;
От каких параметров может зависеть алгоритм обрезки:&lt;br /&gt;
* Число признаков&lt;br /&gt;
* Порог значимости признаков&lt;br /&gt;
* Интегральный порог значимости признаков&lt;br /&gt;
* Метод сломанной трости&lt;br /&gt;
* Метод локтя&lt;br /&gt;
&lt;br /&gt;
Может быть известно число признаков, которые нужно оставить, или выкинуть.&lt;br /&gt;
&lt;br /&gt;
Порог значимости признаков соответствует порогу для меры, например, корреляции, для которой выкидываются признаки, для которых корреляция меньше определенного порога:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\left | F \right | &amp;gt; x&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Может существовать интегральный порог значимости, то есть признаки отсортированы по нормированной по единице &amp;quot;полезности&amp;quot; &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt;, и выбирается несколько признаков с наибольшей &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод сломанной трости. Есть отрезок, который мы разбиваем по &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; случайным точкам. Если отсортировать длины подотрезков, то для &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го подотрезка длина будет равна примерно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T = \frac{\sum_{i=1}^{k} \frac{1}{i} }{k}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} число признаков, которые нужно оставить.&lt;br /&gt;
&lt;br /&gt;
Тогда берутся те признаки, для которых &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt; превышает порог &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод локтя. Пусть есть график для признаков, отсортированных по убыванию &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt;. Берутся признаки, идущие до резкого перехода между соседними значениями. То есть берутся &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt; до порога &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; {{---}} основание наиболее острого угла, образованного тремя соседними точками на графике.&lt;br /&gt;
&lt;br /&gt;
Метод локтя можно использовать и для задачи кластеризации. Например, пусть &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt; {{---}} внутрикластерное расстояние. Тогда выбирается число кластеров, соответствующее резкому переходу между соседними значениями на графике.&lt;br /&gt;
&lt;br /&gt;
===Другие методы===&lt;br /&gt;
[[File:Feature_selection_ensemble_rus.png|thumb|Один из примеров процесса работы ансамблевых методов]]&lt;br /&gt;
Есть и другие методы выбора признаков: '''гибридные''' (англ. ''hybrid methods'') и '''ансамблевые''' (англ. ''ensemble methods''). '''Гибридные методы''' комбинируют несколько разных методов выбора признаков, например, некоторое множество фильтров, а потом запускают оберточный или встроенный метод. Таким образом, гибридные методы сочетают в себе преимущества сразу нескольких методов, и на практике повышают эффективность выбора признаков.&lt;br /&gt;
&lt;br /&gt;
'''Ансамблевые методы''' применяются больше для наборов данных с очень большим числом признаков. В данном подходе для начального множества признаков создается несколько подмножеств признаков, и эти группы каким-то образом объединяются, чтобы получить набор самых релевантных признаков. Это довольно гибкая группа методов, т.к. для нее можно применять различные способы выбора признаков и объединения их подмножеств.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:{{{1|both}}};&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Примеры кода scikit-learn===&lt;br /&gt;
Пример кода, реализующего функцию оценки фильтра на основе коэффициента ранговой корреляции:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  import pandas as pd&lt;br /&gt;
  import numpy as np&lt;br /&gt;
  &lt;br /&gt;
  # Вспомогательная функция для расчета корреляции&lt;br /&gt;
  def correlation(X, Y):&lt;br /&gt;
      return np.cov(X, Y) / np.sqrt(np.var(X) * np.var(Y))&lt;br /&gt;
&lt;br /&gt;
  # Сам фильтр на основе метрики ранговой корреляции&lt;br /&gt;
  # Аргументы X -- значения объектов датасета для какой-то фичи, Y -- метки этих объектов&lt;br /&gt;
  def measure_spearmans(X, Y):&lt;br /&gt;
      xr = pd.Series(X).rank()&lt;br /&gt;
      yr = pd.Series(Y).rank()&lt;br /&gt;
      return correlation(xr, yr)&lt;br /&gt;
&lt;br /&gt;
Пример кода, реализующего SVM-RFE wrapper:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  import numpy as np&lt;br /&gt;
  import pandas as pd&lt;br /&gt;
  from sklearn import svm&lt;br /&gt;
&lt;br /&gt;
  # X -- наш датасет, Y -- массив меток&lt;br /&gt;
  # N -- число признаков, которые хотим оставить, step -- сколько фичей удаляется на каждой итерации&lt;br /&gt;
  # Возвращает массив из булевых переменных размерностью 1x[число признаков], показывающий, отбрасываем признак или нет&lt;br /&gt;
  def RFE(X, Y, N, step = 10):&lt;br /&gt;
        # cache_size нужен, если набор данных большой, иначе можно опустить&lt;br /&gt;
        clfRFE = svm.SVC(kernel='linear', cache_size=1024)&lt;br /&gt;
        featureCount = X.shape[1]&lt;br /&gt;
        featureList = np.arange(0, featureCount )&lt;br /&gt;
        included = np.full(featureCount, True)&lt;br /&gt;
        curCount = featureCount&lt;br /&gt;
        while curCount &amp;gt; N:&lt;br /&gt;
            actualFeatures = featureList[included]&lt;br /&gt;
            Xnew = X[:, actualFeatures]&lt;br /&gt;
            &lt;br /&gt;
            clfRFE.fit(Xnew, Y)&lt;br /&gt;
            curStep = min(step, curCount - N)&lt;br /&gt;
            elim = np.argsort(np.abs(clfRFE.coef_[0]))[:curStep]&lt;br /&gt;
            included[actualFeatures[elim]] = False&lt;br /&gt;
            curCount -= curStep&lt;br /&gt;
        return included&lt;br /&gt;
&lt;br /&gt;
==Выделение признаков==&lt;br /&gt;
Другим способом уменьшить размерность входных данных является выделение признаков. Эти методы каким-то образом составляют из уже исходных признаков новые, все также полностью описывающие пространство набора данных, но уменьшая его размерность и теряя в репрезентативности данных, т.к. становится непонятно, за что отвечают новые признаки.&lt;br /&gt;
Все методы feature extraction можно разделить на '''линейные''' и '''нелинейные'''.&lt;br /&gt;
&lt;br /&gt;
Одним из самых известных методов '''линейного''' выделения признаков является [[Метод главных компонент (PCA)| PCA]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (Principal Component Analysis, рус. ''метод главных компонент''). Основной идеей этого метода является поиск такой гиперплоскости, на которую при ортогональной проекции всех признаков максимизируется дисперсия. Данное преобразование может быть произведено с помощью сингулярного разложения матриц и создает проекцию только на линейные многомерные плоскости, поэтому и метод находится в категории линейных.&lt;br /&gt;
&lt;br /&gt;
К '''нелинейным''' методам, например, могут быть отнесены методы отображающие исходное пространство признаков на нелинейные поверхности или топологические многообразия. Одним из таких алгоритмов является [[Стохастическое вложение соседей с t-распределением |t-SNE]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (t-distributed Stochastic Neighbor Embedding, рус. ''стохастическое вложение соседей с t-распределением''). Данный метод состоит из двух шагов: изначально строится распределение вероятностей по всем парам точек набора данных, каждая условная вероятность $p_{j|i}$ которого означает насколько точка $X_j$ близка к точке $X_i$ при гауссовом распределении вокруг $X_i$. Данное распределение как метрику похожести использует евклидово расстояние. Алгоритм старается получить отображение из точек размерности $\mathbb{R}^k$ в меньшую размерность $\mathbb{R}^d$, для этого вводится еще одно распределение, описывающее насколько точки из нового пространства похожи друг на друга, но используя при этом t-распределение Стьюдента с одной степенью свободы. Как метрику похожести двух распределений используется дивергенция Кульбака-Лейблера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence Дивергенция Кульбака-Лейблера]&amp;lt;/ref&amp;gt;, и чтобы найти точки новой размерности $d$ запускается градиентный спуск для минимизации этой величины. &lt;br /&gt;
===Пример кода scikit-learn===&lt;br /&gt;
Пример выделения признаков с помощью PCA в scikit-learn:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  from sklearn.decomposition import PCA&lt;br /&gt;
  from sklearn.model_selection import train_test_split&lt;br /&gt;
&lt;br /&gt;
  X = ... # загрузка X&lt;br /&gt;
  Y = ... # загрузка Y&lt;br /&gt;
  # Разделение данных на train и test&lt;br /&gt;
  Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, Y)&lt;br /&gt;
&lt;br /&gt;
  clf = ... # берем какой-то классификатор&lt;br /&gt;
  # Обучаем PCA для выделения 5 признаков&lt;br /&gt;
  pca = PCA(n_components=5)&lt;br /&gt;
  pca.fit(Xtrain)&lt;br /&gt;
  # Изменяем наши наборы данных под выбранные признаки&lt;br /&gt;
  Xtrain = pca.transform(Xtrain)&lt;br /&gt;
  Xtest = pca.transform(Xtest)&lt;br /&gt;
  # Обучаем классификатор и проверяем точность его работы&lt;br /&gt;
  clf.fit(Xtrain, Ytrain)&lt;br /&gt;
  print (&amp;quot;Score: %.6f&amp;quot; % clf.score(Xtest, Ytest))&lt;br /&gt;
  &lt;br /&gt;
===Пример на языке Scala===&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример уменьшение размерности используя smile.feature.GAFeatureSelection&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/feature.html#genetic-algorithm-feature-selection Smile, Genetic Algorithm Based Feature Selection]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.feature.GAFeatureSelection&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.Accuracy&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Загрузка данных&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''data = read.arff(&amp;quot;data/weka/segment-test.arff&amp;quot;, 19)&lt;br /&gt;
  '''val '''(x, y) = data.unzipInt&lt;br /&gt;
  '''val '''trainer = '''new '''GradientTreeBoost.Trainer(100)&lt;br /&gt;
  '''val '''measure = '''new '''Accuracy&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Cоздание генетического алгоритма и его настройка.&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''selector = '''new '''GAFeatureSelection&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Размер популяции - 50, количество поколений - 20 &amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Каждая возращаемая BitString содержит фичи и их качество.&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''result = selector.learn(50, 20, trainer, measure, x, y, 5)&lt;br /&gt;
  result.foreach { bits =&amp;gt;&lt;br /&gt;
    print(100*bits.fitness)&lt;br /&gt;
    println(bits.bits.mkString(&amp;quot; &amp;quot;))&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
Пример уменьшения размерности датасета с применением &amp;lt;code&amp;gt;weka.attributeSelection.PrincipalComponents&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/attributeSelection/PrincipalComponents.html/ Weka, PCA]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;nz.ac.waikato.cms.weka&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;weka-stable&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;3.8.0&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' weka.attributeSelection.PrincipalComponents;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
  '''import''' weka.filters.Filter;&lt;br /&gt;
  '''import''' weka.filters.unsupervised.attribute.NumericToNominal;&lt;br /&gt;
  '''import''' java.io.BufferedReader;&lt;br /&gt;
  '''import''' java.io.FileReader;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// load dataset&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;data/bank-data.arff&amp;quot;)));&lt;br /&gt;
  '''var''' filter = new NumericToNominal();&lt;br /&gt;
  filter.setInputFormat(data);&lt;br /&gt;
  data = Filter.useFilter(data, filter);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// initialize the PCA-based selector&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' pca = new PrincipalComponents();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// dimensionality reduction is achieved through selecting enough eigenvectors to account&amp;lt;/font&amp;gt;&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// for some percantege of the variance in the original data&amp;lt;/font&amp;gt;&lt;br /&gt;
  pca.setVarianceCovered(0.95);&lt;br /&gt;
  pca.buildEvaluator(data);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// transform the dataset&amp;lt;/font&amp;gt;&lt;br /&gt;
  data = pca.transformedData(data);&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Переобучение]]&lt;br /&gt;
*[[Метод опорных векторов (SVM)| SVM]]&lt;br /&gt;
*[[Дерево решений и случайный лес| Случайный лес]]&lt;br /&gt;
*[[Метод главных компонент (PCA)| PCA]]&lt;br /&gt;
*[[Стохастическое вложение соседей с t-распределением |t-SNE]]&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
==Источники информации==&lt;br /&gt;
#[http://research.cs.tamu.edu/prism/lectures/pr/pr_l11.pdf Sequential feature selection] {{---}} курс ML Texas A&amp;amp;M University&lt;br /&gt;
#[https://en.wikipedia.org/wiki/Feature_selection Feature selection] {{---}} статья про Feature Selection в Wikipedia&lt;br /&gt;
#[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117 Публикация про feature selection]&lt;br /&gt;
#[https://towardsdatascience.com/feature-selection-using-random-forest-26d7b747597f Embedded random forest]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Уменьшение размерности]]&lt;/div&gt;</summary>
		<author><name>Wa5teed</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=82544</id>
		<title>Уменьшение размерности</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=82544"/>
				<updated>2022-06-29T20:29:43Z</updated>
		
		<summary type="html">&lt;p&gt;Wa5teed: /* Выбор признаков */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Под '''уменьшением размерности''' (англ. ''dimensionality reduction'') в машинном обучении подразумевается уменьшение числа признаков набора данных. Наличие в нем признаков избыточных, неинформативных или слабо информативных может понизить эффективность модели, а после такого преобразования она упрощается, и соответственно уменьшается размер набора данных в памяти и ускоряется работа алгоритмов ML на нем. Уменьшение размерности может быть осуществлено методами выбора признаков (англ. ''feature selection'') или выделения признаков (англ. ''feature extraction'').&lt;br /&gt;
==Выбор признаков==&lt;br /&gt;
Методы '''выбора признаков''' оставляют некоторое подмножество исходного набора признаков, избавляясь от признаков избыточных и слабо информативных. Основные преимущества этого класса алгоритмов:&lt;br /&gt;
*Уменьшение вероятности [[переобучение|переобучения]];&lt;br /&gt;
*Увеличение точности предсказания модели;&lt;br /&gt;
*Сокращение времени обучения;&lt;br /&gt;
*Увеличивается семантическое понимание модели.&lt;br /&gt;
&lt;br /&gt;
Все методы выбора признаков можно разделить на 5 типов, которые отличаются алгоритмами выбора лишних признаков.&lt;br /&gt;
===Фильтры===&lt;br /&gt;
'''Фильтры''' (англ. ''filter methods'') измеряют релевантность признаков на основе функции $\mu$, и затем решают по правилу $\kappa$, какие признаки оставить в результирующем множестве.&lt;br /&gt;
&lt;br /&gt;
Фильтры могут быть:&lt;br /&gt;
*Одномерные (англ. ''univariate'') {{---}} функция $\mu$ определяет релевантность одного признака по отношению к выходным меткам. В таком случае обычно измеряют &amp;quot;качество&amp;quot; каждого признака и удаляют худшие;&lt;br /&gt;
*Многомерные (англ. ''multivariate'') {{---}} функция $\mu$ определяет релевантность некоторого подмножества исходного множества признаков относительно выходных меток.&lt;br /&gt;
&lt;br /&gt;
Распространенными вариантами для $\mu$ являются:&lt;br /&gt;
*Коэффициент ранговой корреляции Спирмена &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient Определение коэффициента ранговой корреляции Спирмена]&amp;lt;/ref&amp;gt;(англ. ''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}}$;&lt;br /&gt;
*Information gain&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Information_gain_in_decision_trees Определение information gain]&amp;lt;/ref&amp;gt;: $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))}$, и другие.&lt;br /&gt;
&lt;br /&gt;
Преимуществом группы фильтров является простота вычисления релевантности признаков в наборе данных, но недостатком в таком подходе является игнорирование возможных зависимостей между признаками.&lt;br /&gt;
===Оберточные методы===&lt;br /&gt;
[[File:Feature_selection_wrapper_rus.png|450px|thumb|right|Процесс работы оберточных методов]]&lt;br /&gt;
'''Оберточные методы''' (англ. ''wrapper methods'') находят подмножество искомых признаков последовательно, используя некоторый классификатор как источник оценки качества выбранных признаков, т.е. этот процесс является циклическим и продолжается до тех пор, пока не будут достигнуты заданные условия останова. Оберточные методы учитывают зависимости между признаками, что является преимуществом по сравнению с фильтрами, к тому же показывают большую точность, но вычисления занимают длительное время, и повышается риск [[переобучение|переобучения]]. &lt;br /&gt;
&lt;br /&gt;
Существует несколько типов оберточных методов: детерминированные, которые изменяют множество признаков по определенному правилу, а также рандомизированные, которые используют генетические алгоритмы для выбора искомого подмножества признаков. Среди детерминированных алгоритмов самыми простыми являются:&lt;br /&gt;
*SFS (Sequential Forward Selection) {{---}} жадный алгоритм, который начинает с пустого множества признаков, на каждом шаге добавляя лучший из еще не выбранных признаков в результирующее множество;&lt;br /&gt;
*SBS (Sequential Backward Selection) {{---}} алгоритм обратный SFS, который начинает с изначального множества признаков, и удаляет по одному или несколько худших признаков на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Популярным оберточным методом является SVM-RFE (SVM-based Recursive Feature Elimination), который иногда также обозначается как встроенный &amp;lt;ref&amp;gt;[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117/ C. Embedded method]&amp;lt;/ref&amp;gt;. Этот метод использует как классификатор [[Метод опорных векторов (SVM)| SVM]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; и работает итеративно: начиная с полного множества признаков обучает классификатор, ранжирует признаки по весам, которые им присвоил классификатор, убирает какое-то число признаков и повторяет процесс с оставшегося подмножества фичей, если не было достигнуто их требуемое количество. Таким образом, этот метод очень похож на встроенный, потому что непосредственно использует знание того, как устроен классификатор.&lt;br /&gt;
&lt;br /&gt;
===Встроенные методы===&lt;br /&gt;
[[File:Feature_selection_embedded_rus.png|450px|thumb|right|Процесс работы встроенных методов]]&lt;br /&gt;
Группа '''встроенных методов''' (англ. ''embedded methods'') очень похожа на оберточные методы, но для выбора признаков используется непосредственно структуру некоторого классификатора. В оберточных методах классификатор служит только для оценки работы на данном множестве признаков, тогда как встроенные методы используют какую-то информацию о признаках, которую классификаторы присваивают во время обучения. &lt;br /&gt;
&lt;br /&gt;
Одним из примеров встроенного метода является реализация на [[Дерево решений и случайный лес| случайном лесе]]: каждому дереву на вход подаются случайное подмножество данных из датасета с каким-то случайным набор признаков, в процессе обучения каждое из деревьев решений производит &amp;quot;голосование&amp;quot; за релевантность его признаков, эти данные агрегируются, и на выходе получаются значения важности каждого признака набора данных. Дальнейший выбор нужных нам признаков уже зависит от выбранного критерия отбора.&lt;br /&gt;
&lt;br /&gt;
Встроенные методы используют преимущества оберточных методов и являются более эффективными, при этом на отбор тратится меньше времени, уменьшается риск [[переобучение|переобучения]], но т.к. полученный набор признаков был отобран на основе знаний о классификаторе, то есть вероятность, что для другого классификатора это множество признаков уже не будет настолько же релевантным.&lt;br /&gt;
&lt;br /&gt;
===Правила обрезки===&lt;br /&gt;
Для признаков, у которых найдено качество, можно выкинуть ненужное число признаков.&lt;br /&gt;
От каких параметров может зависеть алгоритм обрезки:&lt;br /&gt;
* Число признаков&lt;br /&gt;
* Порог значимости признаков&lt;br /&gt;
* Интегральный порог значимости признаков&lt;br /&gt;
* Метод сломанной трости&lt;br /&gt;
* Метод локтя&lt;br /&gt;
&lt;br /&gt;
Может быть известно число признаков, которые нужно оставить, или выкинуть.&lt;br /&gt;
&lt;br /&gt;
Порог значимости признаков соответствует порогу для меры, например, корреляции, для которой выкидываются признаки, для которых корреляция меньше определенного порога:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\left | F \right | &amp;gt; x&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Может существовать интегральный порог значимости, то есть признаки отсортированы по нормированной по единице &amp;quot;полезности&amp;quot; &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt;, нормированной по единице, и выбирается несколько признаков с наибольшей &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод сломанной трости. Есть отрезок, который мы разбиваем по &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; случайным точкам. Если отсортировать длины подотрезков, то для &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го подотрезка длина будет равна примерно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;T = \frac{\sum_{i=1}^{k} \frac{1}{i} }{k}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} число признаков, которые нужно оставить.&lt;br /&gt;
&lt;br /&gt;
Тогда берутся те признаки, для которых &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt; превышает порог &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Метод локтя. Пусть есть график для признаков, отсортированных по убыванию &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt;. Берутся признаки, идущие до резкого перехода между соседними значениями. То есть берутся &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt; до порога &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; {{---}} основание наиболее острого угла, образованного тремя соседними точками на графике.&lt;br /&gt;
&lt;br /&gt;
Метод локтя можно использовать и для задачи кластеризации. Например, пусть &amp;lt;tex&amp;gt;\mu&amp;lt;/tex&amp;gt; {{---}} внутрикластерное расстояние. Тогда выбирается число кластеров, соответствующее резкому переходу между соседними значениями на графике.&lt;br /&gt;
&lt;br /&gt;
===Другие методы===&lt;br /&gt;
[[File:Feature_selection_ensemble_rus.png|thumb|Один из примеров процесса работы ансамблевых методов]]&lt;br /&gt;
Есть и другие методы выбора признаков: '''гибридные''' (англ. ''hybrid methods'') и '''ансамблевые''' (англ. ''ensemble methods''). '''Гибридные методы''' комбинируют несколько разных методов выбора признаков, например, некоторое множество фильтров, а потом запускают оберточный или встроенный метод. Таким образом, гибридные методы сочетают в себе преимущества сразу нескольких методов, и на практике повышают эффективность выбора признаков.&lt;br /&gt;
&lt;br /&gt;
'''Ансамблевые методы''' применяются больше для наборов данных с очень большим числом признаков. В данном подходе для начального множества признаков создается несколько подмножеств признаков, и эти группы каким-то образом объединяются, чтобы получить набор самых релевантных признаков. Это довольно гибкая группа методов, т.к. для нее можно применять различные способы выбора признаков и объединения их подмножеств.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:{{{1|both}}};&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Примеры кода scikit-learn===&lt;br /&gt;
Пример кода, реализующего функцию оценки фильтра на основе коэффициента ранговой корреляции:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  import pandas as pd&lt;br /&gt;
  import numpy as np&lt;br /&gt;
  &lt;br /&gt;
  # Вспомогательная функция для расчета корреляции&lt;br /&gt;
  def correlation(X, Y):&lt;br /&gt;
      return np.cov(X, Y) / np.sqrt(np.var(X) * np.var(Y))&lt;br /&gt;
&lt;br /&gt;
  # Сам фильтр на основе метрики ранговой корреляции&lt;br /&gt;
  # Аргументы X -- значения объектов датасета для какой-то фичи, Y -- метки этих объектов&lt;br /&gt;
  def measure_spearmans(X, Y):&lt;br /&gt;
      xr = pd.Series(X).rank()&lt;br /&gt;
      yr = pd.Series(Y).rank()&lt;br /&gt;
      return correlation(xr, yr)&lt;br /&gt;
&lt;br /&gt;
Пример кода, реализующего SVM-RFE wrapper:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  import numpy as np&lt;br /&gt;
  import pandas as pd&lt;br /&gt;
  from sklearn import svm&lt;br /&gt;
&lt;br /&gt;
  # X -- наш датасет, Y -- массив меток&lt;br /&gt;
  # N -- число признаков, которые хотим оставить, step -- сколько фичей удаляется на каждой итерации&lt;br /&gt;
  # Возвращает массив из булевых переменных размерностью 1x[число признаков], показывающий, отбрасываем признак или нет&lt;br /&gt;
  def RFE(X, Y, N, step = 10):&lt;br /&gt;
        # cache_size нужен, если набор данных большой, иначе можно опустить&lt;br /&gt;
        clfRFE = svm.SVC(kernel='linear', cache_size=1024)&lt;br /&gt;
        featureCount = X.shape[1]&lt;br /&gt;
        featureList = np.arange(0, featureCount )&lt;br /&gt;
        included = np.full(featureCount, True)&lt;br /&gt;
        curCount = featureCount&lt;br /&gt;
        while curCount &amp;gt; N:&lt;br /&gt;
            actualFeatures = featureList[included]&lt;br /&gt;
            Xnew = X[:, actualFeatures]&lt;br /&gt;
            &lt;br /&gt;
            clfRFE.fit(Xnew, Y)&lt;br /&gt;
            curStep = min(step, curCount - N)&lt;br /&gt;
            elim = np.argsort(np.abs(clfRFE.coef_[0]))[:curStep]&lt;br /&gt;
            included[actualFeatures[elim]] = False&lt;br /&gt;
            curCount -= curStep&lt;br /&gt;
        return included&lt;br /&gt;
&lt;br /&gt;
==Выделение признаков==&lt;br /&gt;
Другим способом уменьшить размерность входных данных является выделение признаков. Эти методы каким-то образом составляют из уже исходных признаков новые, все также полностью описывающие пространство набора данных, но уменьшая его размерность и теряя в репрезентативности данных, т.к. становится непонятно, за что отвечают новые признаки.&lt;br /&gt;
Все методы feature extraction можно разделить на '''линейные''' и '''нелинейные'''.&lt;br /&gt;
&lt;br /&gt;
Одним из самых известных методов '''линейного''' выделения признаков является [[Метод главных компонент (PCA)| PCA]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (Principal Component Analysis, рус. ''метод главных компонент''). Основной идеей этого метода является поиск такой гиперплоскости, на которую при ортогональной проекции всех признаков максимизируется дисперсия. Данное преобразование может быть произведено с помощью сингулярного разложения матриц и создает проекцию только на линейные многомерные плоскости, поэтому и метод находится в категории линейных.&lt;br /&gt;
&lt;br /&gt;
К '''нелинейным''' методам, например, могут быть отнесены методы отображающие исходное пространство признаков на нелинейные поверхности или топологические многообразия. Одним из таких алгоритмов является [[Стохастическое вложение соседей с t-распределением |t-SNE]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (t-distributed Stochastic Neighbor Embedding, рус. ''стохастическое вложение соседей с t-распределением''). Данный метод состоит из двух шагов: изначально строится распределение вероятностей по всем парам точек набора данных, каждая условная вероятность $p_{j|i}$ которого означает насколько точка $X_j$ близка к точке $X_i$ при гауссовом распределении вокруг $X_i$. Данное распределение как метрику похожести использует евклидово расстояние. Алгоритм старается получить отображение из точек размерности $\mathbb{R}^k$ в меньшую размерность $\mathbb{R}^d$, для этого вводится еще одно распределение, описывающее насколько точки из нового пространства похожи друг на друга, но используя при этом t-распределение Стьюдента с одной степенью свободы. Как метрику похожести двух распределений используется дивергенция Кульбака-Лейблера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence Дивергенция Кульбака-Лейблера]&amp;lt;/ref&amp;gt;, и чтобы найти точки новой размерности $d$ запускается градиентный спуск для минимизации этой величины. &lt;br /&gt;
===Пример кода scikit-learn===&lt;br /&gt;
Пример выделения признаков с помощью PCA в scikit-learn:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  from sklearn.decomposition import PCA&lt;br /&gt;
  from sklearn.model_selection import train_test_split&lt;br /&gt;
&lt;br /&gt;
  X = ... # загрузка X&lt;br /&gt;
  Y = ... # загрузка Y&lt;br /&gt;
  # Разделение данных на train и test&lt;br /&gt;
  Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, Y)&lt;br /&gt;
&lt;br /&gt;
  clf = ... # берем какой-то классификатор&lt;br /&gt;
  # Обучаем PCA для выделения 5 признаков&lt;br /&gt;
  pca = PCA(n_components=5)&lt;br /&gt;
  pca.fit(Xtrain)&lt;br /&gt;
  # Изменяем наши наборы данных под выбранные признаки&lt;br /&gt;
  Xtrain = pca.transform(Xtrain)&lt;br /&gt;
  Xtest = pca.transform(Xtest)&lt;br /&gt;
  # Обучаем классификатор и проверяем точность его работы&lt;br /&gt;
  clf.fit(Xtrain, Ytrain)&lt;br /&gt;
  print (&amp;quot;Score: %.6f&amp;quot; % clf.score(Xtest, Ytest))&lt;br /&gt;
  &lt;br /&gt;
===Пример на языке Scala===&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример уменьшение размерности используя smile.feature.GAFeatureSelection&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/feature.html#genetic-algorithm-feature-selection Smile, Genetic Algorithm Based Feature Selection]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.feature.GAFeatureSelection&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.Accuracy&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Загрузка данных&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''data = read.arff(&amp;quot;data/weka/segment-test.arff&amp;quot;, 19)&lt;br /&gt;
  '''val '''(x, y) = data.unzipInt&lt;br /&gt;
  '''val '''trainer = '''new '''GradientTreeBoost.Trainer(100)&lt;br /&gt;
  '''val '''measure = '''new '''Accuracy&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Cоздание генетического алгоритма и его настройка.&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''selector = '''new '''GAFeatureSelection&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Размер популяции - 50, количество поколений - 20 &amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Каждая возращаемая BitString содержит фичи и их качество.&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''result = selector.learn(50, 20, trainer, measure, x, y, 5)&lt;br /&gt;
  result.foreach { bits =&amp;gt;&lt;br /&gt;
    print(100*bits.fitness)&lt;br /&gt;
    println(bits.bits.mkString(&amp;quot; &amp;quot;))&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
Пример уменьшения размерности датасета с применением &amp;lt;code&amp;gt;weka.attributeSelection.PrincipalComponents&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/attributeSelection/PrincipalComponents.html/ Weka, PCA]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;nz.ac.waikato.cms.weka&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;weka-stable&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;3.8.0&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' weka.attributeSelection.PrincipalComponents;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
  '''import''' weka.filters.Filter;&lt;br /&gt;
  '''import''' weka.filters.unsupervised.attribute.NumericToNominal;&lt;br /&gt;
  '''import''' java.io.BufferedReader;&lt;br /&gt;
  '''import''' java.io.FileReader;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// load dataset&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;data/bank-data.arff&amp;quot;)));&lt;br /&gt;
  '''var''' filter = new NumericToNominal();&lt;br /&gt;
  filter.setInputFormat(data);&lt;br /&gt;
  data = Filter.useFilter(data, filter);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// initialize the PCA-based selector&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' pca = new PrincipalComponents();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// dimensionality reduction is achieved through selecting enough eigenvectors to account&amp;lt;/font&amp;gt;&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// for some percantege of the variance in the original data&amp;lt;/font&amp;gt;&lt;br /&gt;
  pca.setVarianceCovered(0.95);&lt;br /&gt;
  pca.buildEvaluator(data);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// transform the dataset&amp;lt;/font&amp;gt;&lt;br /&gt;
  data = pca.transformedData(data);&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Переобучение]]&lt;br /&gt;
*[[Метод опорных векторов (SVM)| SVM]]&lt;br /&gt;
*[[Дерево решений и случайный лес| Случайный лес]]&lt;br /&gt;
*[[Метод главных компонент (PCA)| PCA]]&lt;br /&gt;
*[[Стохастическое вложение соседей с t-распределением |t-SNE]]&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
==Источники информации==&lt;br /&gt;
#[http://research.cs.tamu.edu/prism/lectures/pr/pr_l11.pdf Sequential feature selection] {{---}} курс ML Texas A&amp;amp;M University&lt;br /&gt;
#[https://en.wikipedia.org/wiki/Feature_selection Feature selection] {{---}} статья про Feature Selection в Wikipedia&lt;br /&gt;
#[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117 Публикация про feature selection]&lt;br /&gt;
#[https://towardsdatascience.com/feature-selection-using-random-forest-26d7b747597f Embedded random forest]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Уменьшение размерности]]&lt;/div&gt;</summary>
		<author><name>Wa5teed</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Wa5teed&amp;diff=82543</id>
		<title>Участник:Wa5teed</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Wa5teed&amp;diff=82543"/>
				<updated>2022-06-29T19:34:30Z</updated>
		
		<summary type="html">&lt;p&gt;Wa5teed: Создана пустая страница&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Wa5teed</name></author>	</entry>

	</feed>