La machine apprend et vous recommande des choses
Benjamin Guinebertière, évangéliste Microsoft et co-administrateur de ce blog, nous propose un article sur l’apprentissage automatique avec Mahout qui vient compléter notre première incursion dans le domaine du Machine Learning.
Cet article paru dans le Magazine Programmez n°160 est reproduit ici avec l’aimable autorisation de Programmez que nous remercions au passage. (L’article a été légèrement amendé de façon à prendre en compte la version Bêta publique courante de Windows Azure HDInsight.)
Pour celles et ceux qui ne connaitraient pas encore Programmez, ce dernier propose un nouveau magazine tous les mois traitant de l’univers du développement informatique, abordant toutes technologies sous forme de dossiers, articles, et tutoriels. Sa renommée s’est établie sur des articles de qualités et traitant de sujets d’actualités ou en avance de phase.
Dans le contexte de ce blog, nous vous invitons tout particulièrement à consulter le sommaire de ce numéro (160) dans lequel se trouvent trois articles abordant différents aspects d’Hadoop.
Si vous avez besoin d’une explication sur ce qu’est le l’apprentissage automatique, le billet Apprentissage automatique (Machine Learning) explique les principes fondamentaux de cette approche.
Je vous souhaite une bonne lecture de cet article et de Programmez.
--Philippe
_____________________________________________________________________________
Parmi les nouveautés qu’apporte « Big Data », il y a une inversion de contrôle si on peut dire, à savoir que l’utilisateur ne fait pas que chercher ; la machine lui propose des données également.
Pour faire cela, la machine apprend en fonction des données qu’elle a déjà en sa possession avant d’utiliser ce qu’elle a appris pour extrapoler et restituer par exemple des recommandations. Cela est un des types d’algorithmes classiques de type « Machine Learning ». Quand on parle ici de la machine dans le domaine des « Big Data », il s’agit en fait d’un cluster de machines. Il peut y en avoir des centaines, voire des milliers.
Mahout fait partie de l’écosystème Hadoop. C’est la traduction de Cornac qui est un conducteur d’éléphant, l’éléphant étant le symbole de Hadoop. Mahout regroupe des algorithmes de type « Machine Learning » et ils ont la caractéristique de pouvoir fonctionner de façon distribuée, typiquement sur des jeux de données qui ne tiennent pas sur une seule machine.
Mahout ne fait pas que recommander. Il existe aussi des algorithmes de classification, et de regroupement (« clustering »), qui avec les recommandations ou filtrage collectif représentent les principales catégories. La classification est souvent illustrée par l’exemple des newsgroups. Après avoir appris sur un certain nombre d’articles classés dans des groupes, la machine peut proposer un groupe ou classer un texte qu’elle n’avait pas encore rencontré. Le regroupement quant à lui consiste à passer d’un grand nombre de données à un petit nombre de groupes de données similaires, ce qui rend le tout humainement manipulable.
Mais revenons à la recommandation, et voyons comment tester cela concrètement, avec comme exemple des recommandations de chansons. L’idée est que plus une personne a écouté un morceau de musique plus elle l’aime. En fonction du comportement d’un grand nombre de personnes, on peut recommander à quelqu’un qui aime un certain nombre de morceaux les chansons qu’il risque d’aimer aussi, et qu’il n’a pas encore écoutées. Pour que ce genre d’algorithme fonctionne, il est nécessaire de disposer d’un jeu de données réel puisqu’on parle d’intelligence collective. Partir d’un jeu de données généré aléatoirement ne donnerait que des résultats aléatoires et sans intérêt en sortie. Pour cet exemple, on s’appuie sur le jeu de données appelé « Million Song Dataset » qu’on abrège en MSD. Ce jeu de données comporte un peu plus d’un million d’utilisateurs, un peu moins de quatre cent mille chansons, et presque cinquante millions de triplets (utilisateur, chanson, nombre d’écoutes). Ces informations et d’autres sont disponibles sur le site de l’université de Columbia.
Le job de recommandations de Mahout qu’on va utiliser ne prend que des entiers en entrée, alors que le MSD identifie les utilisateurs et les chansons par des identifiants. Il est donc nécessaire de faire une transformation pour passer de ce type de jeu de données :
b80344d063b5ccb3212f76538f3d9e43d87dca9eSOYHEPA12A8C13097F 8
b80344d063b5ccb3212f76538f3d9e43d87dca9eSOYYWMD12A58A7BCC9 1
b80344d063b5ccb3212f76538f3d9e43d87dca9eSOZGCUB12A8C133997 1
b80344d063b5ccb3212f76538f3d9e43d87dca9eSOZOBWN12A8C130999 1
b80344d063b5ccb3212f76538f3d9e43d87dca9eSOZZHXI12A8C13BF7D 1
85c1f87fea955d09b4bec2e36aee110927aedf9aSOACWYB12AF729E581 2
85c1f87fea955d09b4bec2e36aee110927aedf9aSOAUSXX12A8C136188 1
85c1f87fea955d09b4bec2e36aee110927aedf9aSOBVAHM12A8C13C4CB 1
85c1f87fea955d09b4bec2e36aee110927aedf9aSODJTHN12AF72A8FCD 2
85c1f87fea955d09b4bec2e36aee110927aedf9aSOELXOV12A8C13616B 2
85c1f87fea955d09b4bec2e36aee110927aedf9aSOGGLLR12A8C13C471 2
A ce type de jeu de données :
1,100,8
1,101,1
1,102,1
1,103,1
1,104,1
2,105,2
2,106,1
2,107,1
2,108,2
2,109,2
2,110,2
C’est le jeu de données d’apprentissage.
On conserve par ailleurs (par exemple dans un table non relationnelle du stockage Windows Azure) les correspondances. Les correspondances pour les utilisateurs sont utiles uniquement lors de la création du fichier pour retrouver un utilisateur. En effet, ils sont anonymisés et 85c1f87fea955d09b4bec2e36aee110927aedf9a ne signifie pas grand-chose de plus que 2 par exemple. En revanche, conserver les correspondances entre les chansons et les morceaux de musique a un intérêt car cela permet de faire appel à des API qui connaissent SOZZHXI12A8C13BF7D et pas 104. On trouvera à https://morceau.azurewebsites.net un site qui permet à partir du numéro (ex : 104) de retrouver les informations sur le morceau quand ses dernières sont disponibles. Cela s’appuie sur l’API disponible à https://developer.echonest.com. Le site echonest.com ne recense qu’une partie des morceaux du MSD ; c’est pourquoi on peut ne pas obtenir de renseignements à partir d’un identifiant MSD de chanson.
En entrée de l’algorithme, on aura besoin également d’un fichier users.txt qui donne la liste des numéros d’utilisateurs pour lesquels on veut des recommandations. Par exemple, si on veut des recommandations pour les utilisateurs 1, 5 et 6, le fichier users.txt contient :
1
5
6
Maintenant qu’on dispose du jeu de données voyons comment on peut exécuter l’algorithme.
On utilisera HDInsight Service, qui est une distribution d’Hadoop sur Windows Azure. Un de ses avantages est qu’on n’a pas besoin d’installer le cluster Hadoop, il est disponible à la demande. Pour savoir comment vous procurer un compte (gratuit ou premium), nous en parlons dans ce billet.
NB : Il est aussi possible d’installer une version mono serveur depuis le Web Platform Installer de Windows et en cherchant « Hadoop ». La démarche est décrite ici.
Une fois le cluster HDInisght Service créé, il est possible de se connecter sur le nœud principal du cluster avec le bureau à distance (« remote desktop »). Il faut copier le jeu de données sur HDFS ou un autre système de fichiers compatible tel qu’ASV (Azure Storage Vault, autrement dit les blobs Windows Azure). Ici, on s’appuie sur HDFS. Si les données sont assez petites, par exemple si les données d’apprentissage tiennent dans un fichier mInput.txt, on peut alors copier les fichiers sur C:\ sur le nœud principal du cluster puis les envoyer sur HDFS de la façon suivante. Ouvrir l’invite de commande qui est sur le bureau et entrer les commandes suivantes :
Hadoop fs –mkdir /hwork
Hadoop fs –mkdir /hwork/input1
Hadoop fs –mkdir /hwork/input2
hadoop fs -copyFromLocal c:\mInput.txt /hwork/input1/mInput.txt
hadoop fs -copyFromLocal c:\users.txt /hwork/input2/users.txt
Dans le cas où on utilise l’intégralité des données du MSD, il est plus réaliste de découper les données d’apprentissage par exemple en fichiers d’un million d’enregistrements chacun, de les compresser avec un algorithme tel que BIZP2, et de les mettre dans un répertoire. La décompression, et la lecture de tous les fichiers est prise en compte automatiquement par Hadoop ; on précise uniquement /hwork/input1/ comme source de données. Dans la copie d’écran suivante, on montre les données d’apprentissage complètes :
(…)
Il suffit ensuite de lancer la commande suivante :
hadoop jar c:\apps\dist\mahout-0.5\mahout-core-0.5-job.jar org.apache.mahout.cf.taste.hadoop.item.RecommenderJob --input=/hwork/input1/ --output=/work/output --usersFile=/hwork/input2/users.txt
Cela déclenche un batch qui peut durer plusieurs dizaines de minutes, voire plusieurs heures. En sortie, on a un fichier comprenant les recommandations pour les utilisateurs demandés :
1 [95:4.7,101:4.375,94:4.375,87:4.375,81:4.2,15:4.2,82:4.2,77:4.2,19:4.2,98:4.111111]
5 [2639:6.0,167:5.6923075,169:5.6923075,182:5.6923075,180:5.6923075,179:5.6923075,178:5.6923075,181:5.6923075,174:5.6923075,172:5.6923075]
6 [13:10.5,1719:10.5,1726:10.5,1736:9.666667,1482:9.666667,1731:9.666667,1738:9.666667,1242:9.5,1277:9.5,1247:9.5]
Cela se lit de la façon suivante :
On recommande à l’utilisateur 1 la chanson 95, avec un indice de 4,7, la chanson 101 avec un indice de 4,375, …, à l’utilisateur 6 la chanson 1247 avec un indice de 9.5. Plus l’indice est élevé, plus la recommandation est forte.
Le détail du mode opératoire sur un sous ensemble des données est documenté en anglais à https://www.windowsazure.com/en-us/develop/net/tutorials/hadoop-recommendation-engine/
Voyons maintenant la pertinence de ce qui est proposé par l’algorithme. Pour cela, on s’appuie sur l’exemple de l’utilisateur 35. Si l’on entre la liste de ce qu’il a écouté à https://morceau.azurewebsites.net, à savoir :
1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 206 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 509 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 214 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1768 1935 1936 1937 1938 1939 1940 1941 532 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1482 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986
On obtient une liste avec la possibilité d’écouter des échantillons d’une partie des morceaux. On voit qu’il y a une bonne proportion de morceaux de l’artiste Sade.
Les recommandations sur un jeu d’apprentissage moyen sont :
35 [8192:53.5,1825:53.5,1748:53.2,411:46.833332,1950:43.333332,335:42.75,1893:42.5,1880:42.333332,3511:40.090908,1979:39.333332]
Le morceau 1950 (SOVBAPB12A8AE48D82) est “Your Love Is King” de Sade.
Pour se faire une idée intuitive plus complète de ce que cela donne, il est préférable d’écouter des extraits de ce qui a été choisi et de ce qui est proposé. Pour cela, les données des premiers utilisateurs (écoute et recommandations) sont disponibles sur le site https://morceau.azurewebsites.net.
Les résultats d’exécution se trouvent dans l’archive test.zip, vous trouverez les logs d’Hadoop dans le fichier résultat-exécution.txt ainsi que les données d’entrée et de sortie dans le dossier mahout. De plus, un exemple de jeu de données est fourni à l’intérieur de l’archive SampleData.zip.
Toute ces archives sont proposées dans l’archive Mahout.zip disponible en pièce jointe ci-dessous.
Bon test !