No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

knn.ipynb 132KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "markdown",
  5. "id": "87214e92",
  6. "metadata": {},
  7. "source": [
  8. "## Import du dataset MNIST"
  9. ]
  10. },
  11. {
  12. "cell_type": "code",
  13. "execution_count": null,
  14. "id": "c2e6fa5e",
  15. "metadata": {},
  16. "outputs": [],
  17. "source": [
  18. "from sklearn.datasets import fetch_openml \n",
  19. "mnist = fetch_openml('mnist_784') "
  20. ]
  21. },
  22. {
  23. "cell_type": "markdown",
  24. "id": "a36d996c",
  25. "metadata": {},
  26. "source": [
  27. "## Manpulation du jeu de données"
  28. ]
  29. },
  30. {
  31. "cell_type": "code",
  32. "execution_count": 8,
  33. "id": "30516666",
  34. "metadata": {},
  35. "outputs": [
  36. {
  37. "name": "stdout",
  38. "output_type": "stream",
  39. "text": [
  40. "{'data': pixel1 pixel2 pixel3 pixel4 pixel5 pixel6 pixel7 pixel8 pixel9 \\\n",
  41. "0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  42. "1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  43. "2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  44. "3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  45. "4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  46. "... ... ... ... ... ... ... ... ... ... \n",
  47. "69995 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  48. "69996 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  49. "69997 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  50. "69998 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  51. "69999 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  52. "\n",
  53. " pixel10 ... pixel775 pixel776 pixel777 pixel778 pixel779 \\\n",
  54. "0 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  55. "1 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  56. "2 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  57. "3 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  58. "4 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  59. "... ... ... ... ... ... ... ... \n",
  60. "69995 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  61. "69996 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  62. "69997 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  63. "69998 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  64. "69999 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  65. "\n",
  66. " pixel780 pixel781 pixel782 pixel783 pixel784 \n",
  67. "0 0.0 0.0 0.0 0.0 0.0 \n",
  68. "1 0.0 0.0 0.0 0.0 0.0 \n",
  69. "2 0.0 0.0 0.0 0.0 0.0 \n",
  70. "3 0.0 0.0 0.0 0.0 0.0 \n",
  71. "4 0.0 0.0 0.0 0.0 0.0 \n",
  72. "... ... ... ... ... ... \n",
  73. "69995 0.0 0.0 0.0 0.0 0.0 \n",
  74. "69996 0.0 0.0 0.0 0.0 0.0 \n",
  75. "69997 0.0 0.0 0.0 0.0 0.0 \n",
  76. "69998 0.0 0.0 0.0 0.0 0.0 \n",
  77. "69999 0.0 0.0 0.0 0.0 0.0 \n",
  78. "\n",
  79. "[70000 rows x 784 columns], 'target': 0 5\n",
  80. "1 0\n",
  81. "2 4\n",
  82. "3 1\n",
  83. "4 9\n",
  84. " ..\n",
  85. "69995 2\n",
  86. "69996 3\n",
  87. "69997 4\n",
  88. "69998 5\n",
  89. "69999 6\n",
  90. "Name: class, Length: 70000, dtype: category\n",
  91. "Categories (10, object): ['0', '1', '2', '3', ..., '6', '7', '8', '9'], 'frame': pixel1 pixel2 pixel3 pixel4 pixel5 pixel6 pixel7 pixel8 pixel9 \\\n",
  92. "0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  93. "1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  94. "2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  95. "3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  96. "4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  97. "... ... ... ... ... ... ... ... ... ... \n",
  98. "69995 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  99. "69996 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  100. "69997 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  101. "69998 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  102. "69999 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  103. "\n",
  104. " pixel10 ... pixel776 pixel777 pixel778 pixel779 pixel780 \\\n",
  105. "0 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  106. "1 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  107. "2 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  108. "3 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  109. "4 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  110. "... ... ... ... ... ... ... ... \n",
  111. "69995 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  112. "69996 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  113. "69997 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  114. "69998 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  115. "69999 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  116. "\n",
  117. " pixel781 pixel782 pixel783 pixel784 class \n",
  118. "0 0.0 0.0 0.0 0.0 5 \n",
  119. "1 0.0 0.0 0.0 0.0 0 \n",
  120. "2 0.0 0.0 0.0 0.0 4 \n",
  121. "3 0.0 0.0 0.0 0.0 1 \n",
  122. "4 0.0 0.0 0.0 0.0 9 \n",
  123. "... ... ... ... ... ... \n",
  124. "69995 0.0 0.0 0.0 0.0 2 \n",
  125. "69996 0.0 0.0 0.0 0.0 3 \n",
  126. "69997 0.0 0.0 0.0 0.0 4 \n",
  127. "69998 0.0 0.0 0.0 0.0 5 \n",
  128. "69999 0.0 0.0 0.0 0.0 6 \n",
  129. "\n",
  130. "[70000 rows x 785 columns], 'categories': None, 'feature_names': ['pixel1', 'pixel2', 'pixel3', 'pixel4', 'pixel5', 'pixel6', 'pixel7', 'pixel8', 'pixel9', 'pixel10', 'pixel11', 'pixel12', 'pixel13', 'pixel14', 'pixel15', 'pixel16', 'pixel17', 'pixel18', 'pixel19', 'pixel20', 'pixel21', 'pixel22', 'pixel23', 'pixel24', 'pixel25', 'pixel26', 'pixel27', 'pixel28', 'pixel29', 'pixel30', 'pixel31', 'pixel32', 'pixel33', 'pixel34', 'pixel35', 'pixel36', 'pixel37', 'pixel38', 'pixel39', 'pixel40', 'pixel41', 'pixel42', 'pixel43', 'pixel44', 'pixel45', 'pixel46', 'pixel47', 'pixel48', 'pixel49', 'pixel50', 'pixel51', 'pixel52', 'pixel53', 'pixel54', 'pixel55', 'pixel56', 'pixel57', 'pixel58', 'pixel59', 'pixel60', 'pixel61', 'pixel62', 'pixel63', 'pixel64', 'pixel65', 'pixel66', 'pixel67', 'pixel68', 'pixel69', 'pixel70', 'pixel71', 'pixel72', 'pixel73', 'pixel74', 'pixel75', 'pixel76', 'pixel77', 'pixel78', 'pixel79', 'pixel80', 'pixel81', 'pixel82', 'pixel83', 'pixel84', 'pixel85', 'pixel86', 'pixel87', 'pixel88', 'pixel89', 'pixel90', 'pixel91', 'pixel92', 'pixel93', 'pixel94', 'pixel95', 'pixel96', 'pixel97', 'pixel98', 'pixel99', 'pixel100', 'pixel101', 'pixel102', 'pixel103', 'pixel104', 'pixel105', 'pixel106', 'pixel107', 'pixel108', 'pixel109', 'pixel110', 'pixel111', 'pixel112', 'pixel113', 'pixel114', 'pixel115', 'pixel116', 'pixel117', 'pixel118', 'pixel119', 'pixel120', 'pixel121', 'pixel122', 'pixel123', 'pixel124', 'pixel125', 'pixel126', 'pixel127', 'pixel128', 'pixel129', 'pixel130', 'pixel131', 'pixel132', 'pixel133', 'pixel134', 'pixel135', 'pixel136', 'pixel137', 'pixel138', 'pixel139', 'pixel140', 'pixel141', 'pixel142', 'pixel143', 'pixel144', 'pixel145', 'pixel146', 'pixel147', 'pixel148', 'pixel149', 'pixel150', 'pixel151', 'pixel152', 'pixel153', 'pixel154', 'pixel155', 'pixel156', 'pixel157', 'pixel158', 'pixel159', 'pixel160', 'pixel161', 'pixel162', 'pixel163', 'pixel164', 'pixel165', 'pixel166', 'pixel167', 'pixel168', 'pixel169', 'pixel170', 'pixel171', 'pixel172', 'pixel173', 'pixel174', 'pixel175', 'pixel176', 'pixel177', 'pixel178', 'pixel179', 'pixel180', 'pixel181', 'pixel182', 'pixel183', 'pixel184', 'pixel185', 'pixel186', 'pixel187', 'pixel188', 'pixel189', 'pixel190', 'pixel191', 'pixel192', 'pixel193', 'pixel194', 'pixel195', 'pixel196', 'pixel197', 'pixel198', 'pixel199', 'pixel200', 'pixel201', 'pixel202', 'pixel203', 'pixel204', 'pixel205', 'pixel206', 'pixel207', 'pixel208', 'pixel209', 'pixel210', 'pixel211', 'pixel212', 'pixel213', 'pixel214', 'pixel215', 'pixel216', 'pixel217', 'pixel218', 'pixel219', 'pixel220', 'pixel221', 'pixel222', 'pixel223', 'pixel224', 'pixel225', 'pixel226', 'pixel227', 'pixel228', 'pixel229', 'pixel230', 'pixel231', 'pixel232', 'pixel233', 'pixel234', 'pixel235', 'pixel236', 'pixel237', 'pixel238', 'pixel239', 'pixel240', 'pixel241', 'pixel242', 'pixel243', 'pixel244', 'pixel245', 'pixel246', 'pixel247', 'pixel248', 'pixel249', 'pixel250', 'pixel251', 'pixel252', 'pixel253', 'pixel254', 'pixel255', 'pixel256', 'pixel257', 'pixel258', 'pixel259', 'pixel260', 'pixel261', 'pixel262', 'pixel263', 'pixel264', 'pixel265', 'pixel266', 'pixel267', 'pixel268', 'pixel269', 'pixel270', 'pixel271', 'pixel272', 'pixel273', 'pixel274', 'pixel275', 'pixel276', 'pixel277', 'pixel278', 'pixel279', 'pixel280', 'pixel281', 'pixel282', 'pixel283', 'pixel284', 'pixel285', 'pixel286', 'pixel287', 'pixel288', 'pixel289', 'pixel290', 'pixel291', 'pixel292', 'pixel293', 'pixel294', 'pixel295', 'pixel296', 'pixel297', 'pixel298', 'pixel299', 'pixel300', 'pixel301', 'pixel302', 'pixel303', 'pixel304', 'pixel305', 'pixel306', 'pixel307', 'pixel308', 'pixel309', 'pixel310', 'pixel311', 'pixel312', 'pixel313', 'pixel314', 'pixel315', 'pixel316', 'pixel317', 'pixel318', 'pixel319', 'pixel320', 'pixel321', 'pixel322', 'pixel323', 'pixel324', 'pixel325', 'pixel326', 'pixel327', 'pixel328', 'pixel329', 'pixel330', 'pixel331', 'pixel332', 'pixel333', 'pixel334', 'pixel335', 'pixel336', 'pixel337', 'pixel338', 'pixel339', 'pixel340', 'pixel341', 'pixel342', 'pixel343', 'pixel344', 'pixel345', 'pixel346', 'pixel347', 'pixel348', 'pixel349', 'pixel350', 'pixel351', 'pixel352', 'pixel353', 'pixel354', 'pixel355', 'pixel356', 'pixel357', 'pixel358', 'pixel359', 'pixel360', 'pixel361', 'pixel362', 'pixel363', 'pixel364', 'pixel365', 'pixel366', 'pixel367', 'pixel368', 'pixel369', 'pixel370', 'pixel371', 'pixel372', 'pixel373', 'pixel374', 'pixel375', 'pixel376', 'pixel377', 'pixel378', 'pixel379', 'pixel380', 'pixel381', 'pixel382', 'pixel383', 'pixel384', 'pixel385', 'pixel386', 'pixel387', 'pixel388', 'pixel389', 'pixel390', 'pixel391', 'pixel392', 'pixel393', 'pixel394', 'pixel395', 'pixel396', 'pixel397', 'pixel398', 'pixel399', 'pixel400', 'pixel401', 'pixel402', 'pixel403', 'pixel404', 'pixel405', 'pixel406', 'pixel407', 'pixel408', 'pixel409', 'pixel410', 'pixel411', 'pixel412', 'pixel413', 'pixel414', 'pixel415', 'pixel416', 'pixel417', 'pixel418', 'pixel419', 'pixel420', 'pixel421', 'pixel422', 'pixel423', 'pixel424', 'pixel425', 'pixel426', 'pixel427', 'pixel428', 'pixel429', 'pixel430', 'pixel431', 'pixel432', 'pixel433', 'pixel434', 'pixel435', 'pixel436', 'pixel437', 'pixel438', 'pixel439', 'pixel440', 'pixel441', 'pixel442', 'pixel443', 'pixel444', 'pixel445', 'pixel446', 'pixel447', 'pixel448', 'pixel449', 'pixel450', 'pixel451', 'pixel452', 'pixel453', 'pixel454', 'pixel455', 'pixel456', 'pixel457', 'pixel458', 'pixel459', 'pixel460', 'pixel461', 'pixel462', 'pixel463', 'pixel464', 'pixel465', 'pixel466', 'pixel467', 'pixel468', 'pixel469', 'pixel470', 'pixel471', 'pixel472', 'pixel473', 'pixel474', 'pixel475', 'pixel476', 'pixel477', 'pixel478', 'pixel479', 'pixel480', 'pixel481', 'pixel482', 'pixel483', 'pixel484', 'pixel485', 'pixel486', 'pixel487', 'pixel488', 'pixel489', 'pixel490', 'pixel491', 'pixel492', 'pixel493', 'pixel494', 'pixel495', 'pixel496', 'pixel497', 'pixel498', 'pixel499', 'pixel500', 'pixel501', 'pixel502', 'pixel503', 'pixel504', 'pixel505', 'pixel506', 'pixel507', 'pixel508', 'pixel509', 'pixel510', 'pixel511', 'pixel512', 'pixel513', 'pixel514', 'pixel515', 'pixel516', 'pixel517', 'pixel518', 'pixel519', 'pixel520', 'pixel521', 'pixel522', 'pixel523', 'pixel524', 'pixel525', 'pixel526', 'pixel527', 'pixel528', 'pixel529', 'pixel530', 'pixel531', 'pixel532', 'pixel533', 'pixel534', 'pixel535', 'pixel536', 'pixel537', 'pixel538', 'pixel539', 'pixel540', 'pixel541', 'pixel542', 'pixel543', 'pixel544', 'pixel545', 'pixel546', 'pixel547', 'pixel548', 'pixel549', 'pixel550', 'pixel551', 'pixel552', 'pixel553', 'pixel554', 'pixel555', 'pixel556', 'pixel557', 'pixel558', 'pixel559', 'pixel560', 'pixel561', 'pixel562', 'pixel563', 'pixel564', 'pixel565', 'pixel566', 'pixel567', 'pixel568', 'pixel569', 'pixel570', 'pixel571', 'pixel572', 'pixel573', 'pixel574', 'pixel575', 'pixel576', 'pixel577', 'pixel578', 'pixel579', 'pixel580', 'pixel581', 'pixel582', 'pixel583', 'pixel584', 'pixel585', 'pixel586', 'pixel587', 'pixel588', 'pixel589', 'pixel590', 'pixel591', 'pixel592', 'pixel593', 'pixel594', 'pixel595', 'pixel596', 'pixel597', 'pixel598', 'pixel599', 'pixel600', 'pixel601', 'pixel602', 'pixel603', 'pixel604', 'pixel605', 'pixel606', 'pixel607', 'pixel608', 'pixel609', 'pixel610', 'pixel611', 'pixel612', 'pixel613', 'pixel614', 'pixel615', 'pixel616', 'pixel617', 'pixel618', 'pixel619', 'pixel620', 'pixel621', 'pixel622', 'pixel623', 'pixel624', 'pixel625', 'pixel626', 'pixel627', 'pixel628', 'pixel629', 'pixel630', 'pixel631', 'pixel632', 'pixel633', 'pixel634', 'pixel635', 'pixel636', 'pixel637', 'pixel638', 'pixel639', 'pixel640', 'pixel641', 'pixel642', 'pixel643', 'pixel644', 'pixel645', 'pixel646', 'pixel647', 'pixel648', 'pixel649', 'pixel650', 'pixel651', 'pixel652', 'pixel653', 'pixel654', 'pixel655', 'pixel656', 'pixel657', 'pixel658', 'pixel659', 'pixel660', 'pixel661', 'pixel662', 'pixel663', 'pixel664', 'pixel665', 'pixel666', 'pixel667', 'pixel668', 'pixel669', 'pixel670', 'pixel671', 'pixel672', 'pixel673', 'pixel674', 'pixel675', 'pixel676', 'pixel677', 'pixel678', 'pixel679', 'pixel680', 'pixel681', 'pixel682', 'pixel683', 'pixel684', 'pixel685', 'pixel686', 'pixel687', 'pixel688', 'pixel689', 'pixel690', 'pixel691', 'pixel692', 'pixel693', 'pixel694', 'pixel695', 'pixel696', 'pixel697', 'pixel698', 'pixel699', 'pixel700', 'pixel701', 'pixel702', 'pixel703', 'pixel704', 'pixel705', 'pixel706', 'pixel707', 'pixel708', 'pixel709', 'pixel710', 'pixel711', 'pixel712', 'pixel713', 'pixel714', 'pixel715', 'pixel716', 'pixel717', 'pixel718', 'pixel719', 'pixel720', 'pixel721', 'pixel722', 'pixel723', 'pixel724', 'pixel725', 'pixel726', 'pixel727', 'pixel728', 'pixel729', 'pixel730', 'pixel731', 'pixel732', 'pixel733', 'pixel734', 'pixel735', 'pixel736', 'pixel737', 'pixel738', 'pixel739', 'pixel740', 'pixel741', 'pixel742', 'pixel743', 'pixel744', 'pixel745', 'pixel746', 'pixel747', 'pixel748', 'pixel749', 'pixel750', 'pixel751', 'pixel752', 'pixel753', 'pixel754', 'pixel755', 'pixel756', 'pixel757', 'pixel758', 'pixel759', 'pixel760', 'pixel761', 'pixel762', 'pixel763', 'pixel764', 'pixel765', 'pixel766', 'pixel767', 'pixel768', 'pixel769', 'pixel770', 'pixel771', 'pixel772', 'pixel773', 'pixel774', 'pixel775', 'pixel776', 'pixel777', 'pixel778', 'pixel779', 'pixel780', 'pixel781', 'pixel782', 'pixel783', 'pixel784'], 'target_names': ['class'], 'DESCR': \"**Author**: Yann LeCun, Corinna Cortes, Christopher J.C. Burges \\n**Source**: [MNIST Website](http://yann.lecun.com/exdb/mnist/) - Date unknown \\n**Please cite**: \\n\\nThe MNIST database of handwritten digits with 784 features, raw data available at: http://yann.lecun.com/exdb/mnist/. It can be split in a training set of the first 60,000 examples, and a test set of 10,000 examples \\n\\nIt is a subset of a larger set available from NIST. The digits have been size-normalized and centered in a fixed-size image. It is a good database for people who want to try learning techniques and pattern recognition methods on real-world data while spending minimal efforts on preprocessing and formatting. The original black and white (bilevel) images from NIST were size normalized to fit in a 20x20 pixel box while preserving their aspect ratio. The resulting images contain grey levels as a result of the anti-aliasing technique used by the normalization algorithm. the images were centered in a 28x28 image by computing the center of mass of the pixels, and translating the image so as to position this point at the center of the 28x28 field. \\n\\nWith some classification methods (particularly template-based methods, such as SVM and K-nearest neighbors), the error rate improves when the digits are centered by bounding box rather than center of mass. If you do this kind of pre-processing, you should report it in your publications. The MNIST database was constructed from NIST's NIST originally designated SD-3 as their training set and SD-1 as their test set. However, SD-3 is much cleaner and easier to recognize than SD-1. The reason for this can be found on the fact that SD-3 was collected among Census Bureau employees, while SD-1 was collected among high-school students. Drawing sensible conclusions from learning experiments requires that the result be independent of the choice of training set and test among the complete set of samples. Therefore it was necessary to build a new database by mixing NIST's datasets. \\n\\nThe MNIST training set is composed of 30,000 patterns from SD-3 and 30,000 patterns from SD-1. Our test set was composed of 5,000 patterns from SD-3 and 5,000 patterns from SD-1. The 60,000 pattern training set contained examples from approximately 250 writers. We made sure that the sets of writers of the training set and test set were disjoint. SD-1 contains 58,527 digit images written by 500 different writers. In contrast to SD-3, where blocks of data from each writer appeared in sequence, the data in SD-1 is scrambled. Writer identities for SD-1 is available and we used this information to unscramble the writers. We then split SD-1 in two: characters written by the first 250 writers went into our new training set. The remaining 250 writers were placed in our test set. Thus we had two sets with nearly 30,000 examples each. The new training set was completed with enough examples from SD-3, starting at pattern # 0, to make a full set of 60,000 training patterns. Similarly, the new test set was completed with SD-3 examples starting at pattern # 35,000 to make a full set with 60,000 test patterns. Only a subset of 10,000 test images (5,000 from SD-1 and 5,000 from SD-3) is available on this site. The full 60,000 sample training set is available.\\n\\nDownloaded from openml.org.\", 'details': {'id': '554', 'name': 'mnist_784', 'version': '1', 'description_version': '1', 'format': 'ARFF', 'creator': ['Yann LeCun', 'Corinna Cortes', 'Christopher J.C. Burges'], 'upload_date': '2014-09-29T03:28:38', 'language': 'English', 'licence': 'Public', 'url': 'https://www.openml.org/data/v1/download/52667/mnist_784.arff', 'file_id': '52667', 'default_target_attribute': 'class', 'tag': ['AzurePilot', 'OpenML-CC18', 'OpenML100', 'study_1', 'study_123', 'study_41', 'study_99', 'vision'], 'visibility': 'public', 'status': 'active', 'processing_date': '2020-11-20 20:12:09', 'md5_checksum': '0298d579eb1b86163de7723944c7e495'}, 'url': 'https://www.openml.org/d/554'}\n"
  131. ]
  132. }
  133. ],
  134. "source": [
  135. "print(mnist)"
  136. ]
  137. },
  138. {
  139. "cell_type": "code",
  140. "execution_count": 9,
  141. "id": "ebe4b5c0",
  142. "metadata": {},
  143. "outputs": [
  144. {
  145. "name": "stdout",
  146. "output_type": "stream",
  147. "text": [
  148. " pixel1 pixel2 pixel3 pixel4 pixel5 pixel6 pixel7 pixel8 pixel9 \\\n",
  149. "0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  150. "1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  151. "2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  152. "3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  153. "4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  154. "... ... ... ... ... ... ... ... ... ... \n",
  155. "69995 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  156. "69996 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  157. "69997 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  158. "69998 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  159. "69999 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  160. "\n",
  161. " pixel10 ... pixel775 pixel776 pixel777 pixel778 pixel779 \\\n",
  162. "0 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  163. "1 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  164. "2 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  165. "3 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  166. "4 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  167. "... ... ... ... ... ... ... ... \n",
  168. "69995 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  169. "69996 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  170. "69997 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  171. "69998 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  172. "69999 0.0 ... 0.0 0.0 0.0 0.0 0.0 \n",
  173. "\n",
  174. " pixel780 pixel781 pixel782 pixel783 pixel784 \n",
  175. "0 0.0 0.0 0.0 0.0 0.0 \n",
  176. "1 0.0 0.0 0.0 0.0 0.0 \n",
  177. "2 0.0 0.0 0.0 0.0 0.0 \n",
  178. "3 0.0 0.0 0.0 0.0 0.0 \n",
  179. "4 0.0 0.0 0.0 0.0 0.0 \n",
  180. "... ... ... ... ... ... \n",
  181. "69995 0.0 0.0 0.0 0.0 0.0 \n",
  182. "69996 0.0 0.0 0.0 0.0 0.0 \n",
  183. "69997 0.0 0.0 0.0 0.0 0.0 \n",
  184. "69998 0.0 0.0 0.0 0.0 0.0 \n",
  185. "69999 0.0 0.0 0.0 0.0 0.0 \n",
  186. "\n",
  187. "[70000 rows x 784 columns]\n"
  188. ]
  189. }
  190. ],
  191. "source": [
  192. "print(mnist.data)"
  193. ]
  194. },
  195. {
  196. "cell_type": "code",
  197. "execution_count": 10,
  198. "id": "0b988493",
  199. "metadata": {},
  200. "outputs": [
  201. {
  202. "name": "stdout",
  203. "output_type": "stream",
  204. "text": [
  205. "0 5\n",
  206. "1 0\n",
  207. "2 4\n",
  208. "3 1\n",
  209. "4 9\n",
  210. " ..\n",
  211. "69995 2\n",
  212. "69996 3\n",
  213. "69997 4\n",
  214. "69998 5\n",
  215. "69999 6\n",
  216. "Name: class, Length: 70000, dtype: category\n",
  217. "Categories (10, object): ['0', '1', '2', '3', ..., '6', '7', '8', '9']\n"
  218. ]
  219. }
  220. ],
  221. "source": [
  222. "print(mnist.target)"
  223. ]
  224. },
  225. {
  226. "cell_type": "code",
  227. "execution_count": 11,
  228. "id": "80c2585f",
  229. "metadata": {},
  230. "outputs": [
  231. {
  232. "data": {
  233. "text/plain": [
  234. "70000"
  235. ]
  236. },
  237. "execution_count": 11,
  238. "metadata": {},
  239. "output_type": "execute_result"
  240. }
  241. ],
  242. "source": [
  243. "len(mnist.data)"
  244. ]
  245. },
  246. {
  247. "cell_type": "code",
  248. "execution_count": 13,
  249. "id": "08b562a6",
  250. "metadata": {},
  251. "outputs": [
  252. {
  253. "name": "stdout",
  254. "output_type": "stream",
  255. "text": [
  256. "(70000, 784)\n"
  257. ]
  258. }
  259. ],
  260. "source": [
  261. "print(mnist.data.shape)"
  262. ]
  263. },
  264. {
  265. "cell_type": "code",
  266. "execution_count": 14,
  267. "id": "4f85b82d",
  268. "metadata": {},
  269. "outputs": [
  270. {
  271. "name": "stdout",
  272. "output_type": "stream",
  273. "text": [
  274. "(70000,)\n"
  275. ]
  276. }
  277. ],
  278. "source": [
  279. "print(mnist.target.shape)"
  280. ]
  281. },
  282. {
  283. "cell_type": "code",
  284. "execution_count": 18,
  285. "id": "6f42de94",
  286. "metadata": {},
  287. "outputs": [
  288. {
  289. "data": {
  290. "text/html": [
  291. "<div>\n",
  292. "<style scoped>\n",
  293. " .dataframe tbody tr th:only-of-type {\n",
  294. " vertical-align: middle;\n",
  295. " }\n",
  296. "\n",
  297. " .dataframe tbody tr th {\n",
  298. " vertical-align: top;\n",
  299. " }\n",
  300. "\n",
  301. " .dataframe thead th {\n",
  302. " text-align: right;\n",
  303. " }\n",
  304. "</style>\n",
  305. "<table border=\"1\" class=\"dataframe\">\n",
  306. " <thead>\n",
  307. " <tr style=\"text-align: right;\">\n",
  308. " <th></th>\n",
  309. " <th>pixel1</th>\n",
  310. " <th>pixel2</th>\n",
  311. " <th>pixel3</th>\n",
  312. " <th>pixel4</th>\n",
  313. " <th>pixel5</th>\n",
  314. " <th>pixel6</th>\n",
  315. " <th>pixel7</th>\n",
  316. " <th>pixel8</th>\n",
  317. " <th>pixel9</th>\n",
  318. " <th>pixel10</th>\n",
  319. " <th>...</th>\n",
  320. " <th>pixel775</th>\n",
  321. " <th>pixel776</th>\n",
  322. " <th>pixel777</th>\n",
  323. " <th>pixel778</th>\n",
  324. " <th>pixel779</th>\n",
  325. " <th>pixel780</th>\n",
  326. " <th>pixel781</th>\n",
  327. " <th>pixel782</th>\n",
  328. " <th>pixel783</th>\n",
  329. " <th>pixel784</th>\n",
  330. " </tr>\n",
  331. " </thead>\n",
  332. " <tbody>\n",
  333. " <tr>\n",
  334. " <th>0</th>\n",
  335. " <td>0.0</td>\n",
  336. " <td>0.0</td>\n",
  337. " <td>0.0</td>\n",
  338. " <td>0.0</td>\n",
  339. " <td>0.0</td>\n",
  340. " <td>0.0</td>\n",
  341. " <td>0.0</td>\n",
  342. " <td>0.0</td>\n",
  343. " <td>0.0</td>\n",
  344. " <td>0.0</td>\n",
  345. " <td>...</td>\n",
  346. " <td>0.0</td>\n",
  347. " <td>0.0</td>\n",
  348. " <td>0.0</td>\n",
  349. " <td>0.0</td>\n",
  350. " <td>0.0</td>\n",
  351. " <td>0.0</td>\n",
  352. " <td>0.0</td>\n",
  353. " <td>0.0</td>\n",
  354. " <td>0.0</td>\n",
  355. " <td>0.0</td>\n",
  356. " </tr>\n",
  357. " <tr>\n",
  358. " <th>1</th>\n",
  359. " <td>0.0</td>\n",
  360. " <td>0.0</td>\n",
  361. " <td>0.0</td>\n",
  362. " <td>0.0</td>\n",
  363. " <td>0.0</td>\n",
  364. " <td>0.0</td>\n",
  365. " <td>0.0</td>\n",
  366. " <td>0.0</td>\n",
  367. " <td>0.0</td>\n",
  368. " <td>0.0</td>\n",
  369. " <td>...</td>\n",
  370. " <td>0.0</td>\n",
  371. " <td>0.0</td>\n",
  372. " <td>0.0</td>\n",
  373. " <td>0.0</td>\n",
  374. " <td>0.0</td>\n",
  375. " <td>0.0</td>\n",
  376. " <td>0.0</td>\n",
  377. " <td>0.0</td>\n",
  378. " <td>0.0</td>\n",
  379. " <td>0.0</td>\n",
  380. " </tr>\n",
  381. " <tr>\n",
  382. " <th>2</th>\n",
  383. " <td>0.0</td>\n",
  384. " <td>0.0</td>\n",
  385. " <td>0.0</td>\n",
  386. " <td>0.0</td>\n",
  387. " <td>0.0</td>\n",
  388. " <td>0.0</td>\n",
  389. " <td>0.0</td>\n",
  390. " <td>0.0</td>\n",
  391. " <td>0.0</td>\n",
  392. " <td>0.0</td>\n",
  393. " <td>...</td>\n",
  394. " <td>0.0</td>\n",
  395. " <td>0.0</td>\n",
  396. " <td>0.0</td>\n",
  397. " <td>0.0</td>\n",
  398. " <td>0.0</td>\n",
  399. " <td>0.0</td>\n",
  400. " <td>0.0</td>\n",
  401. " <td>0.0</td>\n",
  402. " <td>0.0</td>\n",
  403. " <td>0.0</td>\n",
  404. " </tr>\n",
  405. " <tr>\n",
  406. " <th>3</th>\n",
  407. " <td>0.0</td>\n",
  408. " <td>0.0</td>\n",
  409. " <td>0.0</td>\n",
  410. " <td>0.0</td>\n",
  411. " <td>0.0</td>\n",
  412. " <td>0.0</td>\n",
  413. " <td>0.0</td>\n",
  414. " <td>0.0</td>\n",
  415. " <td>0.0</td>\n",
  416. " <td>0.0</td>\n",
  417. " <td>...</td>\n",
  418. " <td>0.0</td>\n",
  419. " <td>0.0</td>\n",
  420. " <td>0.0</td>\n",
  421. " <td>0.0</td>\n",
  422. " <td>0.0</td>\n",
  423. " <td>0.0</td>\n",
  424. " <td>0.0</td>\n",
  425. " <td>0.0</td>\n",
  426. " <td>0.0</td>\n",
  427. " <td>0.0</td>\n",
  428. " </tr>\n",
  429. " <tr>\n",
  430. " <th>4</th>\n",
  431. " <td>0.0</td>\n",
  432. " <td>0.0</td>\n",
  433. " <td>0.0</td>\n",
  434. " <td>0.0</td>\n",
  435. " <td>0.0</td>\n",
  436. " <td>0.0</td>\n",
  437. " <td>0.0</td>\n",
  438. " <td>0.0</td>\n",
  439. " <td>0.0</td>\n",
  440. " <td>0.0</td>\n",
  441. " <td>...</td>\n",
  442. " <td>0.0</td>\n",
  443. " <td>0.0</td>\n",
  444. " <td>0.0</td>\n",
  445. " <td>0.0</td>\n",
  446. " <td>0.0</td>\n",
  447. " <td>0.0</td>\n",
  448. " <td>0.0</td>\n",
  449. " <td>0.0</td>\n",
  450. " <td>0.0</td>\n",
  451. " <td>0.0</td>\n",
  452. " </tr>\n",
  453. " <tr>\n",
  454. " <th>...</th>\n",
  455. " <td>...</td>\n",
  456. " <td>...</td>\n",
  457. " <td>...</td>\n",
  458. " <td>...</td>\n",
  459. " <td>...</td>\n",
  460. " <td>...</td>\n",
  461. " <td>...</td>\n",
  462. " <td>...</td>\n",
  463. " <td>...</td>\n",
  464. " <td>...</td>\n",
  465. " <td>...</td>\n",
  466. " <td>...</td>\n",
  467. " <td>...</td>\n",
  468. " <td>...</td>\n",
  469. " <td>...</td>\n",
  470. " <td>...</td>\n",
  471. " <td>...</td>\n",
  472. " <td>...</td>\n",
  473. " <td>...</td>\n",
  474. " <td>...</td>\n",
  475. " <td>...</td>\n",
  476. " </tr>\n",
  477. " <tr>\n",
  478. " <th>95</th>\n",
  479. " <td>0.0</td>\n",
  480. " <td>0.0</td>\n",
  481. " <td>0.0</td>\n",
  482. " <td>0.0</td>\n",
  483. " <td>0.0</td>\n",
  484. " <td>0.0</td>\n",
  485. " <td>0.0</td>\n",
  486. " <td>0.0</td>\n",
  487. " <td>0.0</td>\n",
  488. " <td>0.0</td>\n",
  489. " <td>...</td>\n",
  490. " <td>0.0</td>\n",
  491. " <td>0.0</td>\n",
  492. " <td>0.0</td>\n",
  493. " <td>0.0</td>\n",
  494. " <td>0.0</td>\n",
  495. " <td>0.0</td>\n",
  496. " <td>0.0</td>\n",
  497. " <td>0.0</td>\n",
  498. " <td>0.0</td>\n",
  499. " <td>0.0</td>\n",
  500. " </tr>\n",
  501. " <tr>\n",
  502. " <th>96</th>\n",
  503. " <td>0.0</td>\n",
  504. " <td>0.0</td>\n",
  505. " <td>0.0</td>\n",
  506. " <td>0.0</td>\n",
  507. " <td>0.0</td>\n",
  508. " <td>0.0</td>\n",
  509. " <td>0.0</td>\n",
  510. " <td>0.0</td>\n",
  511. " <td>0.0</td>\n",
  512. " <td>0.0</td>\n",
  513. " <td>...</td>\n",
  514. " <td>0.0</td>\n",
  515. " <td>0.0</td>\n",
  516. " <td>0.0</td>\n",
  517. " <td>0.0</td>\n",
  518. " <td>0.0</td>\n",
  519. " <td>0.0</td>\n",
  520. " <td>0.0</td>\n",
  521. " <td>0.0</td>\n",
  522. " <td>0.0</td>\n",
  523. " <td>0.0</td>\n",
  524. " </tr>\n",
  525. " <tr>\n",
  526. " <th>97</th>\n",
  527. " <td>0.0</td>\n",
  528. " <td>0.0</td>\n",
  529. " <td>0.0</td>\n",
  530. " <td>0.0</td>\n",
  531. " <td>0.0</td>\n",
  532. " <td>0.0</td>\n",
  533. " <td>0.0</td>\n",
  534. " <td>0.0</td>\n",
  535. " <td>0.0</td>\n",
  536. " <td>0.0</td>\n",
  537. " <td>...</td>\n",
  538. " <td>0.0</td>\n",
  539. " <td>0.0</td>\n",
  540. " <td>0.0</td>\n",
  541. " <td>0.0</td>\n",
  542. " <td>0.0</td>\n",
  543. " <td>0.0</td>\n",
  544. " <td>0.0</td>\n",
  545. " <td>0.0</td>\n",
  546. " <td>0.0</td>\n",
  547. " <td>0.0</td>\n",
  548. " </tr>\n",
  549. " <tr>\n",
  550. " <th>98</th>\n",
  551. " <td>0.0</td>\n",
  552. " <td>0.0</td>\n",
  553. " <td>0.0</td>\n",
  554. " <td>0.0</td>\n",
  555. " <td>0.0</td>\n",
  556. " <td>0.0</td>\n",
  557. " <td>0.0</td>\n",
  558. " <td>0.0</td>\n",
  559. " <td>0.0</td>\n",
  560. " <td>0.0</td>\n",
  561. " <td>...</td>\n",
  562. " <td>0.0</td>\n",
  563. " <td>0.0</td>\n",
  564. " <td>0.0</td>\n",
  565. " <td>0.0</td>\n",
  566. " <td>0.0</td>\n",
  567. " <td>0.0</td>\n",
  568. " <td>0.0</td>\n",
  569. " <td>0.0</td>\n",
  570. " <td>0.0</td>\n",
  571. " <td>0.0</td>\n",
  572. " </tr>\n",
  573. " <tr>\n",
  574. " <th>99</th>\n",
  575. " <td>0.0</td>\n",
  576. " <td>0.0</td>\n",
  577. " <td>0.0</td>\n",
  578. " <td>0.0</td>\n",
  579. " <td>0.0</td>\n",
  580. " <td>0.0</td>\n",
  581. " <td>0.0</td>\n",
  582. " <td>0.0</td>\n",
  583. " <td>0.0</td>\n",
  584. " <td>0.0</td>\n",
  585. " <td>...</td>\n",
  586. " <td>0.0</td>\n",
  587. " <td>0.0</td>\n",
  588. " <td>0.0</td>\n",
  589. " <td>0.0</td>\n",
  590. " <td>0.0</td>\n",
  591. " <td>0.0</td>\n",
  592. " <td>0.0</td>\n",
  593. " <td>0.0</td>\n",
  594. " <td>0.0</td>\n",
  595. " <td>0.0</td>\n",
  596. " </tr>\n",
  597. " </tbody>\n",
  598. "</table>\n",
  599. "<p>100 rows × 784 columns</p>\n",
  600. "</div>"
  601. ],
  602. "text/plain": [
  603. " pixel1 pixel2 pixel3 pixel4 pixel5 pixel6 pixel7 pixel8 pixel9 \\\n",
  604. "0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  605. "1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  606. "2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  607. "3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  608. "4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  609. ".. ... ... ... ... ... ... ... ... ... \n",
  610. "95 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  611. "96 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  612. "97 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  613. "98 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  614. "99 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  615. "\n",
  616. " pixel10 ... pixel775 pixel776 pixel777 pixel778 pixel779 pixel780 \\\n",
  617. "0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  618. "1 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  619. "2 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  620. "3 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  621. "4 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  622. ".. ... ... ... ... ... ... ... ... \n",
  623. "95 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  624. "96 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  625. "97 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  626. "98 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  627. "99 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
  628. "\n",
  629. " pixel781 pixel782 pixel783 pixel784 \n",
  630. "0 0.0 0.0 0.0 0.0 \n",
  631. "1 0.0 0.0 0.0 0.0 \n",
  632. "2 0.0 0.0 0.0 0.0 \n",
  633. "3 0.0 0.0 0.0 0.0 \n",
  634. "4 0.0 0.0 0.0 0.0 \n",
  635. ".. ... ... ... ... \n",
  636. "95 0.0 0.0 0.0 0.0 \n",
  637. "96 0.0 0.0 0.0 0.0 \n",
  638. "97 0.0 0.0 0.0 0.0 \n",
  639. "98 0.0 0.0 0.0 0.0 \n",
  640. "99 0.0 0.0 0.0 0.0 \n",
  641. "\n",
  642. "[100 rows x 784 columns]"
  643. ]
  644. },
  645. "execution_count": 18,
  646. "metadata": {},
  647. "output_type": "execute_result"
  648. }
  649. ],
  650. "source": [
  651. "mnist.data[:100]"
  652. ]
  653. },
  654. {
  655. "cell_type": "code",
  656. "execution_count": 28,
  657. "id": "473e3421",
  658. "metadata": {},
  659. "outputs": [
  660. {
  661. "data": {
  662. "text/plain": [
  663. "0.0"
  664. ]
  665. },
  666. "execution_count": 28,
  667. "metadata": {},
  668. "output_type": "execute_result"
  669. }
  670. ],
  671. "source": [
  672. "mnist.data.values[0][1]"
  673. ]
  674. },
  675. {
  676. "cell_type": "code",
  677. "execution_count": 24,
  678. "id": "10fd8682",
  679. "metadata": {},
  680. "outputs": [],
  681. "source": [
  682. "from sklearn.datasets import fetch_openml \n",
  683. "import matplotlib.pyplot as plt \n",
  684. "mnist = fetch_openml('mnist_784')"
  685. ]
  686. },
  687. {
  688. "cell_type": "code",
  689. "execution_count": 59,
  690. "id": "f2f61c72",
  691. "metadata": {
  692. "scrolled": true
  693. },
  694. "outputs": [
  695. {
  696. "data": {
  697. "image/png": "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\n",
  698. "text/plain": [
  699. "<Figure size 432x288 with 1 Axes>"
  700. ]
  701. },
  702. "metadata": {
  703. "needs_background": "light"
  704. },
  705. "output_type": "display_data"
  706. },
  707. {
  708. "name": "stdout",
  709. "output_type": "stream",
  710. "text": [
  711. "9\n"
  712. ]
  713. }
  714. ],
  715. "source": [
  716. "images = mnist.data.values.reshape((-1, 28, 28)) \n",
  717. "plt.imshow(images[4],cmap=plt.cm.gray_r,interpolation=\"nearest\") \n",
  718. "plt.show()\n",
  719. "print(mnist.target[4])"
  720. ]
  721. },
  722. {
  723. "cell_type": "markdown",
  724. "id": "73194d9b",
  725. "metadata": {},
  726. "source": [
  727. "## Premier entraînement"
  728. ]
  729. },
  730. {
  731. "cell_type": "code",
  732. "execution_count": 45,
  733. "id": "1992f78a",
  734. "metadata": {},
  735. "outputs": [],
  736. "source": [
  737. "from sklearn.datasets import fetch_openml \n",
  738. "import matplotlib.pyplot as plt \n",
  739. "mnist = fetch_openml('mnist_784')"
  740. ]
  741. },
  742. {
  743. "cell_type": "code",
  744. "execution_count": 4,
  745. "id": "c16f01ca",
  746. "metadata": {},
  747. "outputs": [
  748. {
  749. "data": {
  750. "text/plain": [
  751. "KNeighborsClassifier(n_neighbors=10)"
  752. ]
  753. },
  754. "execution_count": 4,
  755. "metadata": {},
  756. "output_type": "execute_result"
  757. }
  758. ],
  759. "source": [
  760. "import numpy as np\n",
  761. "from sklearn.model_selection import train_test_split\n",
  762. "from sklearn.neighbors import KNeighborsClassifier\n",
  763. "\n",
  764. "echantillon = np.random.randint(70000, size=5000)\n",
  765. "data = mnist.data.values[echantillon]\n",
  766. "target = mnist.target[echantillon]\n",
  767. "xtrain, xtest, ytrain, ytest = train_test_split(data, target, \n",
  768. "train_size=0.8)\n",
  769. "\n",
  770. "clf = KNeighborsClassifier(10) \n",
  771. "clf.fit(xtrain, ytrain)"
  772. ]
  773. },
  774. {
  775. "cell_type": "markdown",
  776. "id": "d7d80cd2",
  777. "metadata": {},
  778. "source": [
  779. "## Vérification de la prédiction faite avec l'algorithme entraîné"
  780. ]
  781. },
  782. {
  783. "cell_type": "code",
  784. "execution_count": 68,
  785. "id": "de3692e9",
  786. "metadata": {},
  787. "outputs": [
  788. {
  789. "data": {
  790. "image/png": "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\n",
  791. "text/plain": [
  792. "<Figure size 432x288 with 1 Axes>"
  793. ]
  794. },
  795. "metadata": {
  796. "needs_background": "light"
  797. },
  798. "output_type": "display_data"
  799. },
  800. {
  801. "name": "stdout",
  802. "output_type": "stream",
  803. "text": [
  804. "['0']\n"
  805. ]
  806. }
  807. ],
  808. "source": [
  809. "images = data.reshape((-1, 28, 28)) \n",
  810. "plt.imshow(images[4],cmap=plt.cm.gray_r,interpolation=\"nearest\") \n",
  811. "plt.show()\n",
  812. "\n",
  813. "print(clf.predict([data[4]]))"
  814. ]
  815. },
  816. {
  817. "cell_type": "markdown",
  818. "id": "8eb362f6",
  819. "metadata": {},
  820. "source": [
  821. "## Scores obtenus"
  822. ]
  823. },
  824. {
  825. "cell_type": "code",
  826. "execution_count": 71,
  827. "id": "5ad97acb",
  828. "metadata": {},
  829. "outputs": [
  830. {
  831. "name": "stdout",
  832. "output_type": "stream",
  833. "text": [
  834. "test:\n",
  835. "0.928\n",
  836. "train:\n",
  837. "0.938\n"
  838. ]
  839. }
  840. ],
  841. "source": [
  842. "print(\"test:\")\n",
  843. "print(clf.score(xtest, ytest))\n",
  844. "print(\"train:\")\n",
  845. "print(clf.score(xtrain, ytrain))"
  846. ]
  847. },
  848. {
  849. "cell_type": "markdown",
  850. "id": "aac45aac",
  851. "metadata": {},
  852. "source": [
  853. "## Nombre de voisins optimal"
  854. ]
  855. },
  856. {
  857. "cell_type": "code",
  858. "execution_count": 3,
  859. "id": "29bae5b3",
  860. "metadata": {},
  861. "outputs": [
  862. {
  863. "name": "stdout",
  864. "output_type": "stream",
  865. "text": [
  866. "max score : 0.9536\n",
  867. "k = 3\n"
  868. ]
  869. },
  870. {
  871. "data": {
  872. "image/png": "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\n",
  873. "text/plain": [
  874. "<Figure size 432x288 with 1 Axes>"
  875. ]
  876. },
  877. "metadata": {
  878. "needs_background": "light"
  879. },
  880. "output_type": "display_data"
  881. }
  882. ],
  883. "source": [
  884. "from sklearn.model_selection import KFold\n",
  885. "from statistics import mean\n",
  886. "import matplotlib.pyplot as plt \n",
  887. "\n",
  888. "mean_list =[]\n",
  889. "index = range(2,15)\n",
  890. "for i in range(2,15):\n",
  891. " clf = KNeighborsClassifier(i) \n",
  892. " clf.fit(xtrain, ytrain)\n",
  893. " kf = KFold(n_splits=10,shuffle=True) \n",
  894. " train = []\n",
  895. " test = []\n",
  896. " for train_index, test_index in kf.split(data):\n",
  897. " X_train, X_test = data[train_index], data[test_index]\n",
  898. " y_train, y_test = target.values[train_index], target.values[test_index]\n",
  899. " test.append(clf.score(X_test, y_test))\n",
  900. " train.append(clf.score(X_train, y_train))\n",
  901. " mean_list.append(mean(test))\n",
  902. "print(\"max score :\", max(mean_list))\n",
  903. "print(\"k = \", mean_list.index(max(mean_list))+2)\n",
  904. "\n",
  905. "plt.plot(index, mean_list)\n",
  906. "plt.ylabel('scores')\n",
  907. "plt.xlabel('nb_neighbors')\n",
  908. "plt.show()"
  909. ]
  910. },
  911. {
  912. "cell_type": "markdown",
  913. "id": "411f6841",
  914. "metadata": {},
  915. "source": [
  916. "## Séparation optimale entre l'entraînement et le test "
  917. ]
  918. },
  919. {
  920. "cell_type": "code",
  921. "execution_count": 18,
  922. "id": "aa975189",
  923. "metadata": {},
  924. "outputs": [],
  925. "source": [
  926. "import numpy as np\n",
  927. "from sklearn.model_selection import train_test_split\n",
  928. "from sklearn.neighbors import KNeighborsClassifier\n",
  929. "import matplotlib.pyplot as plt \n",
  930. "import time\n",
  931. "\n",
  932. "echantillon = np.random.randint(70000, size=5000)\n",
  933. "data = mnist.data.values[echantillon]\n",
  934. "target = mnist.target[echantillon]\n",
  935. "\n",
  936. "list_scores = []\n",
  937. "list_percentage = np.arange(0.1, 1, 0.1)\n",
  938. "times = []\n",
  939. "\n",
  940. "for i in list_percentage :\n",
  941. " xtrain, xtest, ytrain, ytest = train_test_split(data, target, train_size=i)\n",
  942. " start = time.time()\n",
  943. " clf = KNeighborsClassifier(3) \n",
  944. " clf.fit(xtrain, ytrain)\n",
  945. " end = time.time()\n",
  946. " elapsed = end-start\n",
  947. " list_scores.append(clf.score(xtest, ytest))\n",
  948. " times.append(elapsed)"
  949. ]
  950. },
  951. {
  952. "cell_type": "code",
  953. "execution_count": 19,
  954. "id": "27808a60",
  955. "metadata": {},
  956. "outputs": [
  957. {
  958. "data": {
  959. "image/png": "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\n",
  960. "text/plain": [
  961. "<Figure size 432x288 with 2 Axes>"
  962. ]
  963. },
  964. "metadata": {
  965. "needs_background": "light"
  966. },
  967. "output_type": "display_data"
  968. }
  969. ],
  970. "source": [
  971. "plt.subplot(2,1,1)\n",
  972. "plt.plot(list_percentage, list_scores)\n",
  973. "plt.ylabel('scores')\n",
  974. "plt.xlabel('training_percentage')\n",
  975. "\n",
  976. "plt.subplot(2,1,2)\n",
  977. "plt.plot(list_percentage, times)\n",
  978. "plt.ylabel('time')\n",
  979. "plt.xlabel('training_percentage')\n",
  980. "plt.show()"
  981. ]
  982. },
  983. {
  984. "cell_type": "markdown",
  985. "id": "b3563ad5",
  986. "metadata": {},
  987. "source": [
  988. "## Echantillonnage optimal du dataset"
  989. ]
  990. },
  991. {
  992. "cell_type": "code",
  993. "execution_count": 20,
  994. "id": "551cdf20",
  995. "metadata": {},
  996. "outputs": [],
  997. "source": [
  998. "import numpy as np\n",
  999. "import time\n",
  1000. "\n",
  1001. "list_sizes = np.arange(1000, 71000, 1000)\n",
  1002. "list_scores = []\n",
  1003. "times = []\n",
  1004. "for i in list_sizes:\n",
  1005. " echantillon = np.random.randint(70000, size=i)\n",
  1006. "\n",
  1007. " data = mnist.data.values[echantillon]\n",
  1008. " target = mnist.target[echantillon]\n",
  1009. " \n",
  1010. " xtrain, xtest, ytrain, ytest = train_test_split(data, target, train_size=0.9)\n",
  1011. " start = time.time()\n",
  1012. " clf = KNeighborsClassifier(3) \n",
  1013. " clf.fit(xtrain, ytrain)\n",
  1014. " end = time.time()\n",
  1015. " elapsed = end-start\n",
  1016. " list_scores.append(clf.score(xtest, ytest))\n",
  1017. " times.append(elapsed)"
  1018. ]
  1019. },
  1020. {
  1021. "cell_type": "code",
  1022. "execution_count": 21,
  1023. "id": "10e3471f",
  1024. "metadata": {},
  1025. "outputs": [
  1026. {
  1027. "data": {
  1028. "image/png": "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\n",
  1029. "text/plain": [
  1030. "<Figure size 432x288 with 2 Axes>"
  1031. ]
  1032. },
  1033. "metadata": {
  1034. "needs_background": "light"
  1035. },
  1036. "output_type": "display_data"
  1037. }
  1038. ],
  1039. "source": [
  1040. "plt.subplot(2,1,1)\n",
  1041. "plt.plot(list_sizes, list_scores)\n",
  1042. "plt.ylabel('scores')\n",
  1043. "plt.xlabel('sample size')\n",
  1044. "\n",
  1045. "plt.subplot(2,1,2)\n",
  1046. "plt.plot(list_sizes, times)\n",
  1047. "plt.ylabel('time')\n",
  1048. "plt.xlabel('sample size')\n",
  1049. "plt.show()"
  1050. ]
  1051. },
  1052. {
  1053. "cell_type": "markdown",
  1054. "id": "e387a386",
  1055. "metadata": {},
  1056. "source": [
  1057. "## Distance optimale"
  1058. ]
  1059. },
  1060. {
  1061. "cell_type": "code",
  1062. "execution_count": 25,
  1063. "id": "6b7b2aec",
  1064. "metadata": {},
  1065. "outputs": [],
  1066. "source": [
  1067. "import numpy as np\n",
  1068. "from sklearn.model_selection import train_test_split\n",
  1069. "from sklearn.neighbors import KNeighborsClassifier\n",
  1070. "import matplotlib.pyplot as plt\n",
  1071. "import time\n",
  1072. "\n",
  1073. "echantillon = np.random.randint(70000, size=5000)\n",
  1074. "data = mnist.data.values[echantillon]\n",
  1075. "target = mnist.target[echantillon]\n",
  1076. "\n",
  1077. "list_plot = []\n",
  1078. "liste_distance = [1, 2, 3, 4, 5, 6]\n",
  1079. "times = []\n",
  1080. "\n",
  1081. "for j in liste_distance :\n",
  1082. " list_score = []\n",
  1083. " \n",
  1084. " xtrain, xtest, ytrain, ytest = train_test_split(data, target, \n",
  1085. " train_size=0.8)\n",
  1086. " \n",
  1087. " start = time.time()\n",
  1088. " clf = KNeighborsClassifier(10, p = j) \n",
  1089. " clf.fit(xtrain, ytrain)\n",
  1090. " end = time.time()\n",
  1091. " elapsed = end-start\n",
  1092. " \n",
  1093. " list_score.append(clf.score(xtest, ytest))\n",
  1094. " list_plot.append(list_score)\n",
  1095. " times.append(elapsed)"
  1096. ]
  1097. },
  1098. {
  1099. "cell_type": "code",
  1100. "execution_count": 26,
  1101. "id": "9e50fec9",
  1102. "metadata": {},
  1103. "outputs": [
  1104. {
  1105. "data": {
  1106. "image/png": "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\n",
  1107. "text/plain": [
  1108. "<Figure size 432x288 with 2 Axes>"
  1109. ]
  1110. },
  1111. "metadata": {
  1112. "needs_background": "light"
  1113. },
  1114. "output_type": "display_data"
  1115. }
  1116. ],
  1117. "source": [
  1118. "plt.subplot(2,1,1)\n",
  1119. "plt.scatter(liste_distance, list_plot)\n",
  1120. "plt.ylabel('scores')\n",
  1121. "plt.xlabel('distance')\n",
  1122. "\n",
  1123. "plt.subplot(2,1,2)\n",
  1124. "plt.plot(liste_distance, times)\n",
  1125. "plt.ylabel('time')\n",
  1126. "plt.xlabel('distance')\n",
  1127. "plt.show()"
  1128. ]
  1129. },
  1130. {
  1131. "cell_type": "markdown",
  1132. "id": "c863ff41",
  1133. "metadata": {},
  1134. "source": [
  1135. "## Meilleure valeur de n_jobs "
  1136. ]
  1137. },
  1138. {
  1139. "cell_type": "code",
  1140. "execution_count": 31,
  1141. "id": "6575833c",
  1142. "metadata": {},
  1143. "outputs": [
  1144. {
  1145. "name": "stdout",
  1146. "output_type": "stream",
  1147. "text": [
  1148. "n_jobs = 1, score = 0.929\n",
  1149. "Temps d'exécution : 0.01147ms\n"
  1150. ]
  1151. }
  1152. ],
  1153. "source": [
  1154. "import time\n",
  1155. "\n",
  1156. "echantillon = np.random.randint(70000, size=5000)\n",
  1157. "data = mnist.data.values[echantillon]\n",
  1158. "target = mnist.target[echantillon]\n",
  1159. "\n",
  1160. "list_score = []\n",
  1161. "\n",
  1162. "xtrain, xtest, ytrain, ytest = train_test_split(data, target, \n",
  1163. "train_size=0.8)\n",
  1164. "\n",
  1165. "start = time.time()\n",
  1166. "clf = KNeighborsClassifier(3, n_jobs = 1) \n",
  1167. "clf.fit(xtrain, ytrain)\n",
  1168. "\n",
  1169. "end = time.time()\n",
  1170. "elapsed = end - start\n",
  1171. "\n",
  1172. "print(\"n_jobs = 1, score = \", clf.score(xtest, ytest))\n",
  1173. "print(f'Temps d\\'exécution : {elapsed:.4}ms')"
  1174. ]
  1175. },
  1176. {
  1177. "cell_type": "code",
  1178. "execution_count": 32,
  1179. "id": "0772056d",
  1180. "metadata": {},
  1181. "outputs": [
  1182. {
  1183. "name": "stdout",
  1184. "output_type": "stream",
  1185. "text": [
  1186. "n_jobs = -1, score = 0.931\n",
  1187. "Temps d'exécution : 0.01098ms\n"
  1188. ]
  1189. }
  1190. ],
  1191. "source": [
  1192. "echantillon = np.random.randint(70000, size=5000)\n",
  1193. "data = mnist.data.values[echantillon]\n",
  1194. "target = mnist.target[echantillon]\n",
  1195. "\n",
  1196. "list_score = []\n",
  1197. "\n",
  1198. "xtrain, xtest, ytrain, ytest = train_test_split(data, target, \n",
  1199. "train_size=0.8)\n",
  1200. "\n",
  1201. "start = time.time()\n",
  1202. "clf = KNeighborsClassifier(3, n_jobs = -1) \n",
  1203. "clf.fit(xtrain, ytrain)\n",
  1204. "\n",
  1205. "end = time.time()\n",
  1206. "elapsed = end - start\n",
  1207. "\n",
  1208. "print(\"n_jobs = -1, score = \", clf.score(xtest, ytest))\n",
  1209. "print(f'Temps d\\'exécution : {elapsed:.4}ms')"
  1210. ]
  1211. },
  1212. {
  1213. "cell_type": "markdown",
  1214. "id": "1a26da41",
  1215. "metadata": {},
  1216. "source": [
  1217. "## Matrice de confusion"
  1218. ]
  1219. },
  1220. {
  1221. "cell_type": "code",
  1222. "execution_count": 7,
  1223. "id": "94d331a4",
  1224. "metadata": {},
  1225. "outputs": [],
  1226. "source": [
  1227. "import numpy as np\n",
  1228. "from sklearn.metrics import confusion_matrix \n",
  1229. "echantillon = np.random.randint(70000, size=20000)\n",
  1230. "\n",
  1231. "data = mnist.data.values[echantillon]\n",
  1232. "target = mnist.target[echantillon]\n",
  1233. "\n",
  1234. "xtrain, xtest, ytrain, ytest = train_test_split(data, target, train_size=0.9)\n",
  1235. "clf = KNeighborsClassifier(3)\n",
  1236. "clf.fit(xtrain, ytrain)\n",
  1237. "cm = confusion_matrix(target.values, clf.predict(data))"
  1238. ]
  1239. },
  1240. {
  1241. "cell_type": "code",
  1242. "execution_count": 8,
  1243. "id": "2fdd3bfd",
  1244. "metadata": {},
  1245. "outputs": [
  1246. {
  1247. "name": "stdout",
  1248. "output_type": "stream",
  1249. "text": [
  1250. "[[2009 0 1 0 0 1 5 1 0 1]\n",
  1251. " [ 0 2211 2 1 1 0 0 3 0 0]\n",
  1252. " [ 13 7 1977 5 1 0 0 21 2 0]\n",
  1253. " [ 2 4 14 2037 0 13 0 10 9 4]\n",
  1254. " [ 0 10 0 0 1910 0 2 0 0 25]\n",
  1255. " [ 3 2 1 14 3 1687 6 1 4 7]\n",
  1256. " [ 4 8 0 0 2 3 1892 0 0 0]\n",
  1257. " [ 1 24 5 0 2 0 0 2101 1 22]\n",
  1258. " [ 5 19 3 14 5 19 4 2 1799 14]\n",
  1259. " [ 4 4 3 10 6 2 2 22 1 1967]]\n"
  1260. ]
  1261. }
  1262. ],
  1263. "source": [
  1264. "print(cm)"
  1265. ]
  1266. }
  1267. ],
  1268. "metadata": {
  1269. "kernelspec": {
  1270. "display_name": "Python 3",
  1271. "language": "python",
  1272. "name": "python3"
  1273. },
  1274. "language_info": {
  1275. "codemirror_mode": {
  1276. "name": "ipython",
  1277. "version": 3
  1278. },
  1279. "file_extension": ".py",
  1280. "mimetype": "text/x-python",
  1281. "name": "python",
  1282. "nbconvert_exporter": "python",
  1283. "pygments_lexer": "ipython3",
  1284. "version": "3.8.8"
  1285. }
  1286. },
  1287. "nbformat": 4,
  1288. "nbformat_minor": 5
  1289. }