sklearn shrinkage ensemble discriminant baggingclassifier python machine-learning scikit-learn

python - shrinkage - sklearn ensemble



¿Cómo obtengo los componentes para LDA en scikit-learn? (4)

En PCA, la operación de transformación utiliza self.components_.T (ver el código ):

X_transformed = np.dot(X, self.components_.T)

En LDA, la operación de transformación utiliza self.scalings_ (ver el código ):

X_new = np.dot(X, self.scalings_)

Tenga en cuenta el .T que transpone la matriz en la PCA, y no en LDA:

  • PCA: components_ : array, shape (n_components, n_features)
  • LDA: scalings_ : array, shape (n_features, n_classes - 1)

Cuando se usa PCA en sklearn, es fácil sacar los componentes:

from sklearn import decomposition pca = decomposition.PCA(n_components=n_components) pca_data = pca.fit(input_data) pca_components = pca.components_

Pero no puedo, por mi vida, descubrir cómo sacar los componentes de LDA, ya que no hay ningún atributo components_. ¿Hay un atributo similar en sklearn lda?


Hay un atributo coef_ que probablemente contiene lo que estás buscando. Se debe documentar. Como esta es una función de decisión lineal, coef_ es probablemente el nombre correcto en el esquema de asignación de nombres de sklearn.

También puede utilizar directamente el método de transform para proyectar datos al nuevo espacio.


Mi lectura del código es que el atributo coef_ se usa para ponderar cada uno de los componentes al puntuar las características de una muestra en comparación con las diferentes clases. scaling es el vector propio y xbar_ es la media. En el espíritu de UTSL, aquí está la fuente de la función de decisión: https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/lda.py#L188


En el caso de PCA , la documentación es clara. Los pca.components_ son los vectores propios.

En el caso de LDA , necesitamos el atributo lda.scalings_ .

Ejemplo visual utilizando datos de iris y sklearn:

import numpy as np import matplotlib.pyplot as plt from sklearn import datasets import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.discriminant_analysis import LinearDiscriminantAnalysis iris = datasets.load_iris() X = iris.data y = iris.target #In general it is a good idea to scale the data scaler = StandardScaler() scaler.fit(X) X=scaler.transform(X) lda = LinearDiscriminantAnalysis() lda.fit(X,y) x_new = lda.transform(X)

Verifique que lda.scalings_ son los vectores propios:

print(lda.scalings_) print(lda.transform(np.identity(4))) [[-0.67614337 0.0271192 ] [-0.66890811 0.93115101] [ 3.84228173 -1.63586613] [ 2.17067434 2.13428251]] [[-0.67614337 0.0271192 ] [-0.66890811 0.93115101] [ 3.84228173 -1.63586613] [ 2.17067434 2.13428251]]

Además, aquí hay una función útil para trazar el biplot y verificar visualmente:

def myplot(score,coeff,labels=None): xs = score[:,0] ys = score[:,1] n = coeff.shape[0] plt.scatter(xs ,ys, c = y) #without scaling for i in range(n): plt.arrow(0, 0, coeff[i,0], coeff[i,1],color = ''r'',alpha = 0.5) if labels is None: plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, "Var"+str(i+1), color = ''g'', ha = ''center'', va = ''center'') else: plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, labels[i], color = ''g'', ha = ''center'', va = ''center'') plt.xlabel("LD{}".format(1)) plt.ylabel("LD{}".format(2)) plt.grid() #Call the function. myplot(x_new[:,0:2], lda.scalings_) plt.show()

Resultados