Восстановление имен функций explain_variance_ratio_ в PCA с помощью sklearn

Я пытаюсь оправиться от PCA, сделанного с помощью scikit-learn, какие функции выбраны как релевантные .

Классический пример с набором данных IRIS.

import pandas as pd import pylab as pl from sklearn import datasets from sklearn.decomposition import PCA # load dataset iris = datasets.load_iris() df = pd.DataFrame(iris.data, columns=iris.feature_names) # normalize data df_norm = (df - df.mean()) / df.std() # PCA pca = PCA(n_components=2) pca.fit_transform(df_norm.values) print pca.explained_variance_ratio_ 

Это возвращает

 In [42]: pca.explained_variance_ratio_ Out[42]: array([ 0.72770452, 0.23030523]) 

Как я могу восстановить, какие две функции позволяют объяснить эти два объяснения в наборе данных? С другой стороны, как я могу получить индекс этих функций в iris.feature_names?

 In [47]: print iris.feature_names ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] 

Заранее спасибо за вашу помощь.

  • В sklearn.decomposition.PCA, почему компоненты являются отрицательными?
  • Рандомизированная стратифицированная k-кратная перекрестная проверка в scikit-learn?
  • Как решить переобучение в случайном лесу Python sklearn?
  • Как добавить еще одну функцию (длину текста) в текущий пакет классификации слов? Scikit учиться
  • Дисбаланс в scikit-learn
  • Ошибка при попытке установить sklearn из Pycharm | arrayobject.h не может быть абсолютным
  • Определить точки в DBSCAN в sklearn в python
  • sklearn: как получить коэффициенты полиномиальных функций
  • 4 Solutions collect form web for “Восстановление имен функций explain_variance_ratio_ в PCA с помощью sklearn”

    Изменить: как прокомментировали другие, вы можете получить одинаковые значения из атрибута .components_ .


    Каждый главный компонент представляет собой линейную комбинацию исходных переменных:

    PCA-коэффици-

    где X_i s – исходные переменные, а Beta_i s – соответствующие веса или так называемые коэффициенты.

    Чтобы получить вес, вы можете просто передать матрицу идентичности методу transform :

     >>> i = np.identity(df.shape[1]) # identity matrix >>> i array([[ 1., 0., 0., 0.], [ 0., 1., 0., 0.], [ 0., 0., 1., 0.], [ 0., 0., 0., 1.]]) >>> coef = pca.transform(i) >>> coef array([[ 0.5224, -0.3723], [-0.2634, -0.9256], [ 0.5813, -0.0211], [ 0.5656, -0.0654]]) 

    Каждый столбец матрицы coef приведенный выше, показывает веса в линейной комбинации, которая получает соответствующий главный компонент:

     >>> pd.DataFrame(coef, columns=['PC-1', 'PC-2'], index=df.columns) PC-1 PC-2 sepal length (cm) 0.522 -0.372 sepal width (cm) -0.263 -0.926 petal length (cm) 0.581 -0.021 petal width (cm) 0.566 -0.065 [4 rows x 2 columns] 

    Например, выше показано, что второй главный компонент ( PC-2 ) в основном выровнен с sepal width 0.926 , который имеет самый высокий вес 0.926 по абсолютной величине;

    Поскольку данные были нормализованы, вы можете подтвердить, что основные компоненты имеют дисперсию 1.0 которая эквивалентна каждому вектору коэффициентов, имеющему норму 1.0 :

     >>> np.linalg.norm(coef,axis=0) array([ 1., 1.]) 

    Можно также подтвердить, что главные компоненты можно вычислить как точечное произведение указанных коэффициентов и исходных переменных:

     >>> np.allclose(df_norm.values.dot(coef), pca.fit_transform(df_norm.values)) True 

    Обратите внимание, что нам нужно использовать numpy.allclose вместо обычного оператора равенства из-за ошибки точности с плавающей запятой.

    Эта информация включена в атрибут pca : components_ . Как описано в документации , pca.components_ выводит массив из [n_components, n_features], поэтому, чтобы узнать, как компоненты линейно связаны с различными функциями, которые вы должны:

    Примечание : каждый коэффициент представляет собой корреляцию между конкретной парой компонентов и функцией

     import pandas as pd import pylab as pl from sklearn import datasets from sklearn.decomposition import PCA # load dataset iris = datasets.load_iris() df = pd.DataFrame(iris.data, columns=iris.feature_names) # normalize data from sklearn import preprocessing data_scaled = pd.DataFrame(preprocessing.scale(df),columns = df.columns) # PCA pca = PCA(n_components=2) pca.fit_transform(data_scaled) # Dump components relations with features: print pd.DataFrame(pca.components_,columns=data_scaled.columns,index = ['PC-1','PC-2']) sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) PC-1 0.522372 -0.263355 0.581254 0.565611 PC-2 -0.372318 -0.925556 -0.021095 -0.065416 

    С учетом вашей установленной оценки pca компоненты можно найти в pca.components_ , которые представляют собой направления наибольшей дисперсии в наборе данных.

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

    Понятие «восстановления» имен функций предполагает, что PCA идентифицирует те функции, которые наиболее важны в наборе данных. Это не совсем так.

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

    Чтобы привести эту теорию в практические примеры кода примера Rafa выше:

     # load dataset iris = datasets.load_iris() df = pd.DataFrame(iris.data, columns=iris.feature_names) # normalize data from sklearn import preprocessing data_scaled = pd.DataFrame(preprocessing.scale(df),columns = df.columns) # PCA pca = PCA(n_components=2) pca.fit_transform(data_scaled) 

    рассмотрите следующее:

     post_pca_array = pca.fit_transform(data_scaled) print data_scaled.shape (150, 4) print post_pca_array.shape (150, 2) 

    В этом случае post_pca_array имеет те же 150 строк данных, что и data_scaled , но четыре столбца data_scaled уменьшены с четырех до двух.

    Критическая точка здесь состоит в том, что два столбца – или компоненты, которые должны быть терминологически согласованы, – post_pca_array , не являются двумя «лучшими» столбцами data_scaled . Это два новых столбца, определяемые алгоритмом для модуля PCA sklearn.decomposition . Второй столбец PC-2 в примере @ Rafa сообщается sepal_width больше, чем любой другой столбец, но значения в PC-2 и data_scaled['sepal_width'] не совпадают.

    Таким образом, хотя интересно узнать, насколько каждый столбец исходных данных вносил вклад в компоненты набора данных после ПКА, понятие «восстановления» имен столбцов мало вводит в заблуждение и, конечно, вводит меня в заблуждение в течение длительного времени. Единственная ситуация, в которой было бы совпадение между пост-PCA и исходными столбцами, было бы, если бы количество основных компонентов было установлено с тем же номером, что и столбцы в оригинале. Однако не было бы смысла использовать одинаковое количество столбцов, потому что данные не изменились бы. Вы бы только пошли туда, чтобы вернуться, как есть.

    Python - лучший язык программирования в мире.