neuralNet annScore

Détection de Churn Client avec Analyse de Probabilités

Scénario de test & Cas d'usage

Contexte Métier

Une entreprise de télécommunications souhaite prédire de manière proactive les clients susceptibles de résilier leur abonnement (churn). Le but est de scorer la base client mensuellement pour cibler les clients à risque avec des offres de rétention. Le service marketing a besoin non seulement de la prédiction (Churn/No Churn) mais aussi du score de probabilité pour moduler l'agressivité des campagnes.
À propos du Set : neuralNet

Entraînement de réseaux de neurones artificiels classiques.

Découvrir toutes les actions de neuralNet
Préparation des Données

Création d'une table de clients avec des caractéristiques démographiques et d'usage, ainsi qu'un modèle de classification binaire pré-entraîné simulé.

Copié !
1PROC CAS;
2 LOADACTIONSET 'dataStep';
3 LOADACTIONSET 'neuralNet';
4 
5 /* 1. Création des données clients à scorer */
6 ACTION dataStep.runCode / code='
7 data clients_a_scorer (caslib="casuser");
8 call streaminit(42);
9 do id_client = 1 to 1000;
10 anciennete_mois = 6 + int(rand("Uniform") * 60);
11 consommation_gb = 5 + rand("Normal", 20, 5);
12 reclamations_12m = int(rand("Poisson", 0.5));
13 if consommation_gb < 0 then consommation_gb = 0;
14 output;
15 end;
16 run;';
17 
18 /* 2. Simulation d''un modèle pré-entrainé (structure) */
19 ACTION dataStep.runCode / code='
20 data model_churn_simule (caslib="casuser");
21 length _Layer_ $20 _Neuron_ 8 _Weight_ 8;
22 /* Ceci est une représentation très simplifiée d''une table modèle */
23 _Layer_="INPUT"; _Neuron_=1; _Weight_=0.5; output;
24 _Layer_="HIDDEN1"; _Neuron_=1; _Weight_=1.2; output;
25 _Layer_="OUTPUT"; _Neuron_=1; _Weight_=-0.8; output;
26 run;';
27 
28 /* 3. Entraînement d''un vrai modèle pour le test */
29 ACTION dataStep.runCode / code='
30 data churn_train_data (caslib="casuser");
31 call streaminit(123);
32 do i = 1 to 2000;
33 anciennete_mois = 6 + int(rand("Uniform") * 60);
34 consommation_gb = 5 + rand("Normal", 20, 5);
35 reclamations_12m = int(rand("Poisson", 0.5));
36 churn = (anciennete_mois < 12 and reclamations_12m > 1) or (consommation_gb > 40);
37 output;
38 end;
39 run;';
40 ACTION neuralNet.annTrain /
41 TABLE={name='churn_train_data', caslib='casuser'},
42 target='churn',
43 inputs={'anciennete_mois', 'consommation_gb', 'reclamations_12m'},
44 hiddens={10},
45 modelTable={name='model_churn_nn', caslib='casuser', replace=true};
46QUIT;

Étapes de réalisation

1
Exécution du scoring en copiant l'identifiant client et en demandant les probabilités de prédiction pour chaque classe.
Copié !
1PROC CAS;
2 LOADACTIONSET 'neuralNet';
3 ACTION neuralNet.annScore /
4 TABLE={name='clients_a_scorer', caslib='casuser'},
5 modelTable={name='model_churn_nn', caslib='casuser'},
6 copyVars={'id_client'},
7 assessOneRow=true,
8 casOut={name='churn_scores', caslib='casuser', replace=true};
9QUIT;
2
Vérification du contenu de la table de sortie pour s'assurer que les colonnes attendues sont présentes.
Copié !
1PROC CAS;
2 ACTION TABLE.columnInfo / TABLE={name='churn_scores', caslib='casuser'};
3 ACTION TABLE.fetch / TABLE={name='churn_scores', caslib='casuser'}, to=5;
4QUIT;

Résultat Attendu


La table de sortie `churn_scores` doit contenir l'identifiant `id_client`, la prédiction de churn `_NN_PredName_`, et deux colonnes de probabilité : `_NN_P_0` (probabilité de ne pas churner) et `_NN_P_1` (probabilité de churner). Ces colonnes permettent au marketing de prioriser les actions en fonction de la certitude du modèle.