web-dev-qa-db-fra.com

Impossible de comprendre avec les fonctionnalités polynomiales de sklearn

Besoin d'aide dans les fonctionnalités polynomiales de sklearn. Il fonctionne assez bien avec une seule fonctionnalité mais chaque fois que j'ajoute plusieurs fonctionnalités, il génère également des valeurs dans le tableau en plus des valeurs élevées à la puissance des degrés. Par exemple: pour ce tableau,

X=np.array([[230.1,37.8,69.2]])

quand j'essaye de

X_poly=poly.fit_transform(X)

Il sort

[[ 1.00000000e+00 2.30100000e+02 3.78000000e+01 6.92000000e+01
5.29460100e+04 8.69778000e+03 1.59229200e+04 1.42884000e+03
2.61576000e+03 4.78864000e+03]]

Ici, qu'est-ce que 8.69778000e+03,1.59229200e+04,2.61576000e+03?

7
TechieBoy101

Si vous avez des entités [a, b, c], Les entités polynomiales par défaut (dans sklearn le degré est 2) devraient être [1, a, b, c, a^2, b^2, c^2, ab, bc, ca].

2.61576000e+03 Est 37.8x62.2=2615,76 (2615,76 = 2.61576000 x 10^3)

D'une manière simple avec le PolynomialFeatures vous pouvez créer de nouvelles fonctionnalités. Il y a une bonne référence ici . Bien sûr, il y a des inconvénients ("Overfitting") à utiliser PolynomialFeatures (voir ici ).

Modifier:
Nous devons être prudents lors de l'utilisation des fonctions polynomiales. La formule de calcul du nombre d'entités polynomiales est N(n,d)=C(n+d,d)n est le nombre d'entités, d est le degré du polynôme, C est le coefficient binomial (combinaison). Dans notre cas, le nombre est C(3+2,2)=5!/(5-2)!2!=10 mais lorsque le nombre d'entités ou le degré est hauteur, les entités polynomiales deviennent trop nombreuses. Par exemple:

N(100,2)=5151
N(100,5)=96560646

Donc, dans ce cas, vous devrez peut-être appliquer la régularisation pour pénaliser certains des poids. Il est fort possible que l'algorithme commence à souffrir de malédiction de dimensionnalité ( ici est également une discussion très agréable).

10
dim

PolynomialFeatures génère une nouvelle matrice avec toutes les combinaisons polynomiales de caractéristiques avec un degré donné.

Comme [a] sera converti en [1, a, a ^ 2] pour le degré 2.

Vous pouvez visualiser l'entrée en cours de transformation en matrice générée par PolynomialFeatures.

from sklearn.preprocessing import PolynomialFeatures
a = np.array([1,2,3,4,5])
a = a[:,np.newaxis]
poly = PolynomialFeatures(degree=2)
a_poly = poly.fit_transform(a)
print(a_poly)

Production:

 [[ 1.  1.  1.]
 [ 1.  2.  4.]
 [ 1.  3.  9.]
 [ 1.  4. 16.]
 [ 1.  5. 25.]]

Vous pouvez voir la matrice générée sous la forme de [1, a, a ^ 2]

Pour observer les entités polynomiales sur le nuage de points, utilisons le numéro 1-100.

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures

#Making 1-100 numbers
a = np.arange(1,100,1)
a = a[:,np.newaxis]

#Scaling data with 0 mean and 1 standard Deviation, so it can be observed easily
scaler = StandardScaler()
a = scaler.fit_transform(a)

#Applying PolynomialFeatures
poly = PolynomialFeatures(degree=2)
a_poly = poly.fit_transform(a)

#Flattening Polynomial feature matrix (Creating 1D array), so it can be plotted. 
a_poly = a_poly.flatten()
#Creating array of size a_poly with number series. (For plotting)
xarr = np.arange(1,a_poly.size+1,1)

#Plotting
plt.scatter(xarr,a_poly)
plt.title("Degree 2 Polynomial")
plt.show()

Production:

2 Degree

En changeant de degré = 3, on obtient:

3 Degree

8
Prasad Ostwal

Vous disposez de données tridimensionnelles et le code suivant génère toutes les entités poly de degré 2:

X=np.array([[230.1,37.8,69.2]])
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures()
X_poly=poly.fit_transform(X)
X_poly
#array([[  1.00000000e+00,   2.30100000e+02,   3.78000000e+01,
#      6.92000000e+01,   5.29460100e+04,   8.69778000e+03,
#      1.59229200e+04,   1.42884000e+03,   2.61576000e+03,
#      4.78864000e+03]])

Cela peut également être généré avec le code suivant:

a, b, c = 230.1, 37.8, 69.2 # 3-dimensional data
np.array([[1,a,b,c,a**2,a*b,c*a,b**2,b*c,c**2]]) # all possible degree-2 polynomial features
# array([[  1.00000000e+00,   2.30100000e+02,   3.78000000e+01,
      6.92000000e+01,   5.29460100e+04,   8.69778000e+03,
      1.59229200e+04,   1.42884000e+03,   2.61576000e+03,
      4.78864000e+03]])
1
Sandipan Dey