web-dev-qa-db-fra.com

Comment utiliser KBinsDiscretizer pour transformer des données continues en bacs dans Sklearn?

Je travaille sur un algorithme ML dans lequel j'ai essayé de convertir les valeurs cibles continues en petits bacs pour mieux comprendre le problème. Par conséquent, pour faire une meilleure prédiction. Mon problème d'origine est pour la régression mais je me convertis en classification en faisant de petits bacs avec des étiquettes.

J'ai fait comme suit,

from sklearn.preprocessing import KBinsDiscretizer  
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
s = est.fit(target) 
Xt = est.transform(s)

Il montre une erreur de valeur comme ci-dessous. Ensuite, j'ai remodelé mes données en 2D. pourtant je ne pouvais pas le résoudre.

ValueError: tableau 2D attendu, tableau 1D à la place:

from sklearn.preprocessing import KBinsDiscretizer

myData = pd.read_csv("train.csv", delimiter=",")
target = myData.iloc[:,-5]  # this is a continuous data which must be 
                        # converted into bins with a new column.

xx = target.values.reshape(21263,1)

est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
s = est.fit(xx) 
Xt = est.transform(s)

Vous pouvez voir que ma cible a 21263 lignes. Je dois les diviser en 10 bacs égaux et les écrire dans une nouvelle colonne dans mon dataframe. Merci pour les conseils.

P.S .: valeur cible maximale: 185,0
Valeur cible minimale: 0,00021

7
Mass17

D'accord, j'ai pu le résoudre. En tout cas, je poste la réponse si quelqu'un d'autre en a besoin à l'avenir. J'ai utilisé pandas.qcut

target['Temp_class'] = pd.qcut(target['Temeratue'], 10, labels=False)

Cela a résolu mon problème.

1
Mass17

L'erreur dans votre première tentative est que vous donnez la sortie de la fonction d'ajustement en transformation. .fit() renvoie le modèle ajusté et non les données d'entrée. La bonne façon serait l'une des options ci-dessous.

from sklearn.preprocessing import KBinsDiscretizer  
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
Xt = est.fit_transform(target) 

ou

from sklearn.preprocessing import KBinsDiscretizer  
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
est.fit(target)
Xt = est.transform(target)
0
AI_Learning

J'avais un problème similaire en travaillant avec l'ensemble de données Titanic. J'ai trouvé qu'une de mes fonctions avait converti ma colonne en un flottant, et en la changeant en un entier, cela semblait aider le problème. De plus, appeler le nom de colonne spécifique avec des crochets doubles a fonctionné pour moi:

from sklearn.preprocessing import KBinsDiscretizer
est = KBinsDiscretizer(n_bins=5, encode='onehot-dense', strategy='uniform')
new = est.fit_transform(dataset[['column_name']])
0
Doug