Binariser des classes discrètes sans dépasser les 1024 colonnes

Mon prof d’IA m’avait longuement expliqué à quel point les classifieurs aiment les valeurs binarisées. C’est une règle générale qui vaut aussi pour les algos de MS Research.
Or très fréquemment, les données discrètes à analyser possèdent un nombre de classes bien supérieur à deux. Une information comme la CSP peut prendre quelques dizaines de valeurs différentes.
Une solution évidente serait de transformer les données, de passer d’un schéma à une colonne de 20 classes à 20 colonnes binaires, une dénormalisation faisable via un PIVOT par exemple:
Soit passer de cela:


A cela:


Effectivement c’est la bonne solution et c’est ce que l’on fait dans beaucoup de cas. Cependant cela risque de vite poser un problème: en effet, une base de données SQL Server est limitée à 1024 colonnes dans un objet. Ce qui fait qu’avec ce genre de paradigme, on peut très vite se retrouver à franchir ce seuil.

C’est là qu’intervient la feature de Nested Tables de SQL Server.

En effectuant une application de Basket Analysis, vous vous etes peut être retrouvé à essayer de n’utiliser que la table de transaction (idBasket|idItem) sans la table d’items. Vous avez peut être remarqué que l’on peut créer un MAR sur cette table nested elle même.

En DMX:

CREATE MINING MODEL BasketAnalysis
(
IdBasket LONG KEY,
Items TABLE PREDICT
(
IdItem LONG KEY
)
)
USING Microsoft_Association_Rules


On alimente ensuite ce modèle avec la même table physique pour deux tables logiques (case et nested). C’est une des features puissantes de Microsoft DM.

La structure résultante posséde alors N entrées (une par item, valeur « Existing » ou « NotExisting ») ainsi que N sorties.

En poussant ce raisonnement un peu plus loin, on peut se dire que ce paradigme « dénormalise » la table de base: ce que nous cherchons à faire. Cependant nous n’aurons qu’une valeur dans la table nested par valeur dans la table de cas: les questions considérées n’étant pas multivaluées.

Si nous revenons au cas de la CSP, nous pourrions donc faire ça:

CREATE MINING MODEL CustomerAnalysis
(
Id LONG KEY,
AGE LONG PREDICT,
CSP TABLE INPUT
(
CSP TEXT KEY
)
)
USING Microsoft_Association_Rules

Ce qui revient dans BIDS à faire cela:

puis cela:

Que l’on alimente comme ceci: les données sont insérées dans la table de cas, on insère les valeurs de CSP dans la table de CSP et on relie par Id pour assurer l’unicité dans la table imbriquée.

INSERT INTO CustomerAnalysis
(

Id,
Age, CSP(SKIP, CSP)
)
SHAPE
{
OPENQUERY(TestDS, ‘SELECT Id, Age, CSP FROM Customers’)
}

APPEND

{
OPENQUERY(TestDS,
SELECT Id, CSP FROM Customers’)
RELATE
Id TO Id
}
AS CSP


On laisse donc au moteur le soin de créer les N colonnes, et de les binariser. La prédiction sera alors du type « Age=XXX si CSP->Cadre=Existing ». Sémantiquement cela ne change pas grand chose mais dans le cas d’un réseau de neurones par exemple, vous constaterez une amélioration des performances.

De cette manière vous allez contourner la limite de colonnes de SQL Server RDBMS et éviter certaines tâches de transformation de données fastidieuses.

A bientôt!

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s