/****************************************************************************** * Programme : Multithreading in Data Mining and Machine Learning Procedures * Reference : MULTITFE86 * Source : https://www.wearecas.eu/en/sampleCode/MULTITFE86 ******************************************************************************/ /* --- BLOC 1 --- */ /* Création d'une table CAS simple pour la démonstration */ data casuser.produits; input produit $ prix stock; datalines; Pomme 1.0 100 Banane 0.5 200 Orange 1.2 150 Poire 0.8 120 Raisin 2.5 50 ; run; /* Exécution basique de PROC FACTMAC */ proc factmac data=casuser.produits; model prix = produit stock; output out=casuser.factmac_output; run; /* Affichage des résultats (partiel) */ proc print data=casuser.factmac_output (obs=5); run; proc casutil incaslib="casuser"; droptable casdata="produits" quiet; droptable casdata="factmac_output" quiet; run; /* --- BLOC 2 --- */ /* Création d'une table CAS pour la démonstration de classification */ data casuser.clients; call streaminit(123); do i=1 to 1000; age = rand('uniform', 18, 65); revenu = rand('normal', 50000, 15000); satisfaction_produit = ceil(rand('uniform', 1, 5)); if revenu > 60000 and age > 30 then loyal = 1; else loyal = 0; output; end; drop i; run; /* Exécution de PROC FOREST avec des options courantes */ proc forest data=casuser.clients; input age revenu satisfaction_produit; target loyal; ods output FitStatistics=casuser.forest_stats; train ntree=100 seed=1234 maxdepth=10; save rstore=casuser.forest_model; run; /* Affichage des statistiques d'ajustement */ proc print data=casuser.forest_stats; run; proc casutil incaslib="casuser"; droptable casdata="clients" quiet; droptable casdata="forest_stats" quiet; droptable casdata="forest_model" quiet; run; /* --- BLOC 3 --- */ /* Création d'une table CAS avec des données de test */ data casuser.test_data; call streaminit(456); do i=1 to 200; age = rand('uniform', 20, 70); revenu = rand('normal', 60000, 20000); satisfaction_produit = ceil(rand('uniform', 1, 5)); output; end; drop i; run; /* Utilisation d'un modèle NNET pré-entraîné (ici, simulé par des coefficients simples) */ /* Dans un scénario réel, un modèle NNET serait entraîné et sauvegardé */ /* Ici, nous simulons l'étape de scoring */ data casuser.scored_data; set casuser.test_data; /* Simulation d'un scoring simple basé sur les inputs */ score_loyal = 0.5 + 0.01 * age + 0.00001 * revenu - 0.1 * satisfaction_produit; if score_loyal > 0.7 then predicted_loyal = 1; else predicted_loyal = 0; run; /* Affichage des données scorées */ proc print data=casuser.scored_data (obs=10); run; proc casutil incaslib="casuser"; droptable casdata="test_data" quiet; droptable casdata="scored_data" quiet; run; /* --- BLOC 4 --- */ /* Création d'une table CAS avec une variable de partitionnement */ data casuser.ventes; call streaminit(789); do i=1 to 5000; region_id = ceil(rand('uniform', 1, 4)); /* 4 régions */ publicite = rand('uniform', 0, 1000); prix = rand('uniform', 10, 100); ventes_reelles = 500 + 2 * publicite - 3 * prix + (region_id * 100) + rand('normal', 0, 50); output; end; drop i; run; /* Utilisation de PROC GRADBOOST avec PARTITION et options de thread (implicites CAS) */ proc gradboost data=casuser.ventes; input publicite prix; target ventes_reelles; partition region_id; /* Les options de multithreading sont gérées par le serveur CAS. */ /* L'option NTHREADS peut être utilisée dans certaines procs pour limiter explicitement. */ /* Ici, nous laissons CAS gérer l'allocation automatique des threads par défaut. */ ods output IterationHistory=casuser.gradboost_hist; run; /* Affichage de l'historique d'itération */ proc print data=casuser.gradboost_hist (obs=10); run; proc casutil incaslib="casuser"; droptable casdata="ventes" quiet; droptable casdata="gradboost_hist" quiet; run;