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
?
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)
où 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).
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:
En changeant de degré = 3, on obtient:
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]])