Skip to content

Instantly share code, notes, and snippets.

@esevan
Created March 30, 2020 07:54
Show Gist options
  • Save esevan/3769a99f0b24317f436015ee6dd44cd1 to your computer and use it in GitHub Desktop.
Save esevan/3769a99f0b24317f436015ee6dd44cd1 to your computer and use it in GitHub Desktop.
handson_ml
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'data': array([[0., 0., 0., ..., 0., 0., 0.],\n",
" [0., 0., 0., ..., 0., 0., 0.],\n",
" [0., 0., 0., ..., 0., 0., 0.],\n",
" ...,\n",
" [0., 0., 0., ..., 0., 0., 0.],\n",
" [0., 0., 0., ..., 0., 0., 0.],\n",
" [0., 0., 0., ..., 0., 0., 0.]]),\n",
" 'target': array(['5', '0', '4', ..., '4', '5', '6'], dtype=object),\n",
" 'feature_names': ['pixel1',\n",
" 'pixel2',\n",
" 'pixel3',\n",
" 'pixel4',\n",
" 'pixel5',\n",
" 'pixel6',\n",
" 'pixel7',\n",
" 'pixel8',\n",
" 'pixel9',\n",
" 'pixel10',\n",
" 'pixel11',\n",
" 'pixel12',\n",
" 'pixel13',\n",
" 'pixel14',\n",
" 'pixel15',\n",
" 'pixel16',\n",
" 'pixel17',\n",
" 'pixel18',\n",
" 'pixel19',\n",
" 'pixel20',\n",
" 'pixel21',\n",
" 'pixel22',\n",
" 'pixel23',\n",
" 'pixel24',\n",
" 'pixel25',\n",
" 'pixel26',\n",
" 'pixel27',\n",
" 'pixel28',\n",
" 'pixel29',\n",
" 'pixel30',\n",
" 'pixel31',\n",
" 'pixel32',\n",
" 'pixel33',\n",
" 'pixel34',\n",
" 'pixel35',\n",
" 'pixel36',\n",
" 'pixel37',\n",
" 'pixel38',\n",
" 'pixel39',\n",
" 'pixel40',\n",
" 'pixel41',\n",
" 'pixel42',\n",
" 'pixel43',\n",
" 'pixel44',\n",
" 'pixel45',\n",
" 'pixel46',\n",
" 'pixel47',\n",
" 'pixel48',\n",
" 'pixel49',\n",
" 'pixel50',\n",
" 'pixel51',\n",
" 'pixel52',\n",
" 'pixel53',\n",
" 'pixel54',\n",
" 'pixel55',\n",
" 'pixel56',\n",
" 'pixel57',\n",
" 'pixel58',\n",
" 'pixel59',\n",
" 'pixel60',\n",
" 'pixel61',\n",
" 'pixel62',\n",
" 'pixel63',\n",
" 'pixel64',\n",
" 'pixel65',\n",
" 'pixel66',\n",
" 'pixel67',\n",
" 'pixel68',\n",
" 'pixel69',\n",
" 'pixel70',\n",
" 'pixel71',\n",
" 'pixel72',\n",
" 'pixel73',\n",
" 'pixel74',\n",
" 'pixel75',\n",
" 'pixel76',\n",
" 'pixel77',\n",
" 'pixel78',\n",
" 'pixel79',\n",
" 'pixel80',\n",
" 'pixel81',\n",
" 'pixel82',\n",
" 'pixel83',\n",
" 'pixel84',\n",
" 'pixel85',\n",
" 'pixel86',\n",
" 'pixel87',\n",
" 'pixel88',\n",
" 'pixel89',\n",
" 'pixel90',\n",
" 'pixel91',\n",
" 'pixel92',\n",
" 'pixel93',\n",
" 'pixel94',\n",
" 'pixel95',\n",
" 'pixel96',\n",
" 'pixel97',\n",
" 'pixel98',\n",
" 'pixel99',\n",
" 'pixel100',\n",
" 'pixel101',\n",
" 'pixel102',\n",
" 'pixel103',\n",
" 'pixel104',\n",
" 'pixel105',\n",
" 'pixel106',\n",
" 'pixel107',\n",
" 'pixel108',\n",
" 'pixel109',\n",
" 'pixel110',\n",
" 'pixel111',\n",
" 'pixel112',\n",
" 'pixel113',\n",
" 'pixel114',\n",
" 'pixel115',\n",
" 'pixel116',\n",
" 'pixel117',\n",
" 'pixel118',\n",
" 'pixel119',\n",
" 'pixel120',\n",
" 'pixel121',\n",
" 'pixel122',\n",
" 'pixel123',\n",
" 'pixel124',\n",
" 'pixel125',\n",
" 'pixel126',\n",
" 'pixel127',\n",
" 'pixel128',\n",
" 'pixel129',\n",
" 'pixel130',\n",
" 'pixel131',\n",
" 'pixel132',\n",
" 'pixel133',\n",
" 'pixel134',\n",
" 'pixel135',\n",
" 'pixel136',\n",
" 'pixel137',\n",
" 'pixel138',\n",
" 'pixel139',\n",
" 'pixel140',\n",
" 'pixel141',\n",
" 'pixel142',\n",
" 'pixel143',\n",
" 'pixel144',\n",
" 'pixel145',\n",
" 'pixel146',\n",
" 'pixel147',\n",
" 'pixel148',\n",
" 'pixel149',\n",
" 'pixel150',\n",
" 'pixel151',\n",
" 'pixel152',\n",
" 'pixel153',\n",
" 'pixel154',\n",
" 'pixel155',\n",
" 'pixel156',\n",
" 'pixel157',\n",
" 'pixel158',\n",
" 'pixel159',\n",
" 'pixel160',\n",
" 'pixel161',\n",
" 'pixel162',\n",
" 'pixel163',\n",
" 'pixel164',\n",
" 'pixel165',\n",
" 'pixel166',\n",
" 'pixel167',\n",
" 'pixel168',\n",
" 'pixel169',\n",
" 'pixel170',\n",
" 'pixel171',\n",
" 'pixel172',\n",
" 'pixel173',\n",
" 'pixel174',\n",
" 'pixel175',\n",
" 'pixel176',\n",
" 'pixel177',\n",
" 'pixel178',\n",
" 'pixel179',\n",
" 'pixel180',\n",
" 'pixel181',\n",
" 'pixel182',\n",
" 'pixel183',\n",
" 'pixel184',\n",
" 'pixel185',\n",
" 'pixel186',\n",
" 'pixel187',\n",
" 'pixel188',\n",
" 'pixel189',\n",
" 'pixel190',\n",
" 'pixel191',\n",
" 'pixel192',\n",
" 'pixel193',\n",
" 'pixel194',\n",
" 'pixel195',\n",
" 'pixel196',\n",
" 'pixel197',\n",
" 'pixel198',\n",
" 'pixel199',\n",
" 'pixel200',\n",
" 'pixel201',\n",
" 'pixel202',\n",
" 'pixel203',\n",
" 'pixel204',\n",
" 'pixel205',\n",
" 'pixel206',\n",
" 'pixel207',\n",
" 'pixel208',\n",
" 'pixel209',\n",
" 'pixel210',\n",
" 'pixel211',\n",
" 'pixel212',\n",
" 'pixel213',\n",
" 'pixel214',\n",
" 'pixel215',\n",
" 'pixel216',\n",
" 'pixel217',\n",
" 'pixel218',\n",
" 'pixel219',\n",
" 'pixel220',\n",
" 'pixel221',\n",
" 'pixel222',\n",
" 'pixel223',\n",
" 'pixel224',\n",
" 'pixel225',\n",
" 'pixel226',\n",
" 'pixel227',\n",
" 'pixel228',\n",
" 'pixel229',\n",
" 'pixel230',\n",
" 'pixel231',\n",
" 'pixel232',\n",
" 'pixel233',\n",
" 'pixel234',\n",
" 'pixel235',\n",
" 'pixel236',\n",
" 'pixel237',\n",
" 'pixel238',\n",
" 'pixel239',\n",
" 'pixel240',\n",
" 'pixel241',\n",
" 'pixel242',\n",
" 'pixel243',\n",
" 'pixel244',\n",
" 'pixel245',\n",
" 'pixel246',\n",
" 'pixel247',\n",
" 'pixel248',\n",
" 'pixel249',\n",
" 'pixel250',\n",
" 'pixel251',\n",
" 'pixel252',\n",
" 'pixel253',\n",
" 'pixel254',\n",
" 'pixel255',\n",
" 'pixel256',\n",
" 'pixel257',\n",
" 'pixel258',\n",
" 'pixel259',\n",
" 'pixel260',\n",
" 'pixel261',\n",
" 'pixel262',\n",
" 'pixel263',\n",
" 'pixel264',\n",
" 'pixel265',\n",
" 'pixel266',\n",
" 'pixel267',\n",
" 'pixel268',\n",
" 'pixel269',\n",
" 'pixel270',\n",
" 'pixel271',\n",
" 'pixel272',\n",
" 'pixel273',\n",
" 'pixel274',\n",
" 'pixel275',\n",
" 'pixel276',\n",
" 'pixel277',\n",
" 'pixel278',\n",
" 'pixel279',\n",
" 'pixel280',\n",
" 'pixel281',\n",
" 'pixel282',\n",
" 'pixel283',\n",
" 'pixel284',\n",
" 'pixel285',\n",
" 'pixel286',\n",
" 'pixel287',\n",
" 'pixel288',\n",
" 'pixel289',\n",
" 'pixel290',\n",
" 'pixel291',\n",
" 'pixel292',\n",
" 'pixel293',\n",
" 'pixel294',\n",
" 'pixel295',\n",
" 'pixel296',\n",
" 'pixel297',\n",
" 'pixel298',\n",
" 'pixel299',\n",
" 'pixel300',\n",
" 'pixel301',\n",
" 'pixel302',\n",
" 'pixel303',\n",
" 'pixel304',\n",
" 'pixel305',\n",
" 'pixel306',\n",
" 'pixel307',\n",
" 'pixel308',\n",
" 'pixel309',\n",
" 'pixel310',\n",
" 'pixel311',\n",
" 'pixel312',\n",
" 'pixel313',\n",
" 'pixel314',\n",
" 'pixel315',\n",
" 'pixel316',\n",
" 'pixel317',\n",
" 'pixel318',\n",
" 'pixel319',\n",
" 'pixel320',\n",
" 'pixel321',\n",
" 'pixel322',\n",
" 'pixel323',\n",
" 'pixel324',\n",
" 'pixel325',\n",
" 'pixel326',\n",
" 'pixel327',\n",
" 'pixel328',\n",
" 'pixel329',\n",
" 'pixel330',\n",
" 'pixel331',\n",
" 'pixel332',\n",
" 'pixel333',\n",
" 'pixel334',\n",
" 'pixel335',\n",
" 'pixel336',\n",
" 'pixel337',\n",
" 'pixel338',\n",
" 'pixel339',\n",
" 'pixel340',\n",
" 'pixel341',\n",
" 'pixel342',\n",
" 'pixel343',\n",
" 'pixel344',\n",
" 'pixel345',\n",
" 'pixel346',\n",
" 'pixel347',\n",
" 'pixel348',\n",
" 'pixel349',\n",
" 'pixel350',\n",
" 'pixel351',\n",
" 'pixel352',\n",
" 'pixel353',\n",
" 'pixel354',\n",
" 'pixel355',\n",
" 'pixel356',\n",
" 'pixel357',\n",
" 'pixel358',\n",
" 'pixel359',\n",
" 'pixel360',\n",
" 'pixel361',\n",
" 'pixel362',\n",
" 'pixel363',\n",
" 'pixel364',\n",
" 'pixel365',\n",
" 'pixel366',\n",
" 'pixel367',\n",
" 'pixel368',\n",
" 'pixel369',\n",
" 'pixel370',\n",
" 'pixel371',\n",
" 'pixel372',\n",
" 'pixel373',\n",
" 'pixel374',\n",
" 'pixel375',\n",
" 'pixel376',\n",
" 'pixel377',\n",
" 'pixel378',\n",
" 'pixel379',\n",
" 'pixel380',\n",
" 'pixel381',\n",
" 'pixel382',\n",
" 'pixel383',\n",
" 'pixel384',\n",
" 'pixel385',\n",
" 'pixel386',\n",
" 'pixel387',\n",
" 'pixel388',\n",
" 'pixel389',\n",
" 'pixel390',\n",
" 'pixel391',\n",
" 'pixel392',\n",
" 'pixel393',\n",
" 'pixel394',\n",
" 'pixel395',\n",
" 'pixel396',\n",
" 'pixel397',\n",
" 'pixel398',\n",
" 'pixel399',\n",
" 'pixel400',\n",
" 'pixel401',\n",
" 'pixel402',\n",
" 'pixel403',\n",
" 'pixel404',\n",
" 'pixel405',\n",
" 'pixel406',\n",
" 'pixel407',\n",
" 'pixel408',\n",
" 'pixel409',\n",
" 'pixel410',\n",
" 'pixel411',\n",
" 'pixel412',\n",
" 'pixel413',\n",
" 'pixel414',\n",
" 'pixel415',\n",
" 'pixel416',\n",
" 'pixel417',\n",
" 'pixel418',\n",
" 'pixel419',\n",
" 'pixel420',\n",
" 'pixel421',\n",
" 'pixel422',\n",
" 'pixel423',\n",
" 'pixel424',\n",
" 'pixel425',\n",
" 'pixel426',\n",
" 'pixel427',\n",
" 'pixel428',\n",
" 'pixel429',\n",
" 'pixel430',\n",
" 'pixel431',\n",
" 'pixel432',\n",
" 'pixel433',\n",
" 'pixel434',\n",
" 'pixel435',\n",
" 'pixel436',\n",
" 'pixel437',\n",
" 'pixel438',\n",
" 'pixel439',\n",
" 'pixel440',\n",
" 'pixel441',\n",
" 'pixel442',\n",
" 'pixel443',\n",
" 'pixel444',\n",
" 'pixel445',\n",
" 'pixel446',\n",
" 'pixel447',\n",
" 'pixel448',\n",
" 'pixel449',\n",
" 'pixel450',\n",
" 'pixel451',\n",
" 'pixel452',\n",
" 'pixel453',\n",
" 'pixel454',\n",
" 'pixel455',\n",
" 'pixel456',\n",
" 'pixel457',\n",
" 'pixel458',\n",
" 'pixel459',\n",
" 'pixel460',\n",
" 'pixel461',\n",
" 'pixel462',\n",
" 'pixel463',\n",
" 'pixel464',\n",
" 'pixel465',\n",
" 'pixel466',\n",
" 'pixel467',\n",
" 'pixel468',\n",
" 'pixel469',\n",
" 'pixel470',\n",
" 'pixel471',\n",
" 'pixel472',\n",
" 'pixel473',\n",
" 'pixel474',\n",
" 'pixel475',\n",
" 'pixel476',\n",
" 'pixel477',\n",
" 'pixel478',\n",
" 'pixel479',\n",
" 'pixel480',\n",
" 'pixel481',\n",
" 'pixel482',\n",
" 'pixel483',\n",
" 'pixel484',\n",
" 'pixel485',\n",
" 'pixel486',\n",
" 'pixel487',\n",
" 'pixel488',\n",
" 'pixel489',\n",
" 'pixel490',\n",
" 'pixel491',\n",
" 'pixel492',\n",
" 'pixel493',\n",
" 'pixel494',\n",
" 'pixel495',\n",
" 'pixel496',\n",
" 'pixel497',\n",
" 'pixel498',\n",
" 'pixel499',\n",
" 'pixel500',\n",
" 'pixel501',\n",
" 'pixel502',\n",
" 'pixel503',\n",
" 'pixel504',\n",
" 'pixel505',\n",
" 'pixel506',\n",
" 'pixel507',\n",
" 'pixel508',\n",
" 'pixel509',\n",
" 'pixel510',\n",
" 'pixel511',\n",
" 'pixel512',\n",
" 'pixel513',\n",
" 'pixel514',\n",
" 'pixel515',\n",
" 'pixel516',\n",
" 'pixel517',\n",
" 'pixel518',\n",
" 'pixel519',\n",
" 'pixel520',\n",
" 'pixel521',\n",
" 'pixel522',\n",
" 'pixel523',\n",
" 'pixel524',\n",
" 'pixel525',\n",
" 'pixel526',\n",
" 'pixel527',\n",
" 'pixel528',\n",
" 'pixel529',\n",
" 'pixel530',\n",
" 'pixel531',\n",
" 'pixel532',\n",
" 'pixel533',\n",
" 'pixel534',\n",
" 'pixel535',\n",
" 'pixel536',\n",
" 'pixel537',\n",
" 'pixel538',\n",
" 'pixel539',\n",
" 'pixel540',\n",
" 'pixel541',\n",
" 'pixel542',\n",
" 'pixel543',\n",
" 'pixel544',\n",
" 'pixel545',\n",
" 'pixel546',\n",
" 'pixel547',\n",
" 'pixel548',\n",
" 'pixel549',\n",
" 'pixel550',\n",
" 'pixel551',\n",
" 'pixel552',\n",
" 'pixel553',\n",
" 'pixel554',\n",
" 'pixel555',\n",
" 'pixel556',\n",
" 'pixel557',\n",
" 'pixel558',\n",
" 'pixel559',\n",
" 'pixel560',\n",
" 'pixel561',\n",
" 'pixel562',\n",
" 'pixel563',\n",
" 'pixel564',\n",
" 'pixel565',\n",
" 'pixel566',\n",
" 'pixel567',\n",
" 'pixel568',\n",
" 'pixel569',\n",
" 'pixel570',\n",
" 'pixel571',\n",
" 'pixel572',\n",
" 'pixel573',\n",
" 'pixel574',\n",
" 'pixel575',\n",
" 'pixel576',\n",
" 'pixel577',\n",
" 'pixel578',\n",
" 'pixel579',\n",
" 'pixel580',\n",
" 'pixel581',\n",
" 'pixel582',\n",
" 'pixel583',\n",
" 'pixel584',\n",
" 'pixel585',\n",
" 'pixel586',\n",
" 'pixel587',\n",
" 'pixel588',\n",
" 'pixel589',\n",
" 'pixel590',\n",
" 'pixel591',\n",
" 'pixel592',\n",
" 'pixel593',\n",
" 'pixel594',\n",
" 'pixel595',\n",
" 'pixel596',\n",
" 'pixel597',\n",
" 'pixel598',\n",
" 'pixel599',\n",
" 'pixel600',\n",
" 'pixel601',\n",
" 'pixel602',\n",
" 'pixel603',\n",
" 'pixel604',\n",
" 'pixel605',\n",
" 'pixel606',\n",
" 'pixel607',\n",
" 'pixel608',\n",
" 'pixel609',\n",
" 'pixel610',\n",
" 'pixel611',\n",
" 'pixel612',\n",
" 'pixel613',\n",
" 'pixel614',\n",
" 'pixel615',\n",
" 'pixel616',\n",
" 'pixel617',\n",
" 'pixel618',\n",
" 'pixel619',\n",
" 'pixel620',\n",
" 'pixel621',\n",
" 'pixel622',\n",
" 'pixel623',\n",
" 'pixel624',\n",
" 'pixel625',\n",
" 'pixel626',\n",
" 'pixel627',\n",
" 'pixel628',\n",
" 'pixel629',\n",
" 'pixel630',\n",
" 'pixel631',\n",
" 'pixel632',\n",
" 'pixel633',\n",
" 'pixel634',\n",
" 'pixel635',\n",
" 'pixel636',\n",
" 'pixel637',\n",
" 'pixel638',\n",
" 'pixel639',\n",
" 'pixel640',\n",
" 'pixel641',\n",
" 'pixel642',\n",
" 'pixel643',\n",
" 'pixel644',\n",
" 'pixel645',\n",
" 'pixel646',\n",
" 'pixel647',\n",
" 'pixel648',\n",
" 'pixel649',\n",
" 'pixel650',\n",
" 'pixel651',\n",
" 'pixel652',\n",
" 'pixel653',\n",
" 'pixel654',\n",
" 'pixel655',\n",
" 'pixel656',\n",
" 'pixel657',\n",
" 'pixel658',\n",
" 'pixel659',\n",
" 'pixel660',\n",
" 'pixel661',\n",
" 'pixel662',\n",
" 'pixel663',\n",
" 'pixel664',\n",
" 'pixel665',\n",
" 'pixel666',\n",
" 'pixel667',\n",
" 'pixel668',\n",
" 'pixel669',\n",
" 'pixel670',\n",
" 'pixel671',\n",
" 'pixel672',\n",
" 'pixel673',\n",
" 'pixel674',\n",
" 'pixel675',\n",
" 'pixel676',\n",
" 'pixel677',\n",
" 'pixel678',\n",
" 'pixel679',\n",
" 'pixel680',\n",
" 'pixel681',\n",
" 'pixel682',\n",
" 'pixel683',\n",
" 'pixel684',\n",
" 'pixel685',\n",
" 'pixel686',\n",
" 'pixel687',\n",
" 'pixel688',\n",
" 'pixel689',\n",
" 'pixel690',\n",
" 'pixel691',\n",
" 'pixel692',\n",
" 'pixel693',\n",
" 'pixel694',\n",
" 'pixel695',\n",
" 'pixel696',\n",
" 'pixel697',\n",
" 'pixel698',\n",
" 'pixel699',\n",
" 'pixel700',\n",
" 'pixel701',\n",
" 'pixel702',\n",
" 'pixel703',\n",
" 'pixel704',\n",
" 'pixel705',\n",
" 'pixel706',\n",
" 'pixel707',\n",
" 'pixel708',\n",
" 'pixel709',\n",
" 'pixel710',\n",
" 'pixel711',\n",
" 'pixel712',\n",
" 'pixel713',\n",
" 'pixel714',\n",
" 'pixel715',\n",
" 'pixel716',\n",
" 'pixel717',\n",
" 'pixel718',\n",
" 'pixel719',\n",
" 'pixel720',\n",
" 'pixel721',\n",
" 'pixel722',\n",
" 'pixel723',\n",
" 'pixel724',\n",
" 'pixel725',\n",
" 'pixel726',\n",
" 'pixel727',\n",
" 'pixel728',\n",
" 'pixel729',\n",
" 'pixel730',\n",
" 'pixel731',\n",
" 'pixel732',\n",
" 'pixel733',\n",
" 'pixel734',\n",
" 'pixel735',\n",
" 'pixel736',\n",
" 'pixel737',\n",
" 'pixel738',\n",
" 'pixel739',\n",
" 'pixel740',\n",
" 'pixel741',\n",
" 'pixel742',\n",
" 'pixel743',\n",
" 'pixel744',\n",
" 'pixel745',\n",
" 'pixel746',\n",
" 'pixel747',\n",
" 'pixel748',\n",
" 'pixel749',\n",
" 'pixel750',\n",
" 'pixel751',\n",
" 'pixel752',\n",
" 'pixel753',\n",
" 'pixel754',\n",
" 'pixel755',\n",
" 'pixel756',\n",
" 'pixel757',\n",
" 'pixel758',\n",
" 'pixel759',\n",
" 'pixel760',\n",
" 'pixel761',\n",
" 'pixel762',\n",
" 'pixel763',\n",
" 'pixel764',\n",
" 'pixel765',\n",
" 'pixel766',\n",
" 'pixel767',\n",
" 'pixel768',\n",
" 'pixel769',\n",
" 'pixel770',\n",
" 'pixel771',\n",
" 'pixel772',\n",
" 'pixel773',\n",
" 'pixel774',\n",
" 'pixel775',\n",
" 'pixel776',\n",
" 'pixel777',\n",
" 'pixel778',\n",
" 'pixel779',\n",
" 'pixel780',\n",
" 'pixel781',\n",
" 'pixel782',\n",
" 'pixel783',\n",
" 'pixel784'],\n",
" '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.\",\n",
" 'details': {'id': '554',\n",
" 'name': 'mnist_784',\n",
" 'version': '1',\n",
" 'format': 'ARFF',\n",
" 'upload_date': '2014-09-29T03:28:38',\n",
" 'licence': 'Public',\n",
" 'url': 'https://www.openml.org/data/v1/download/52667/mnist_784.arff',\n",
" 'file_id': '52667',\n",
" 'default_target_attribute': 'class',\n",
" 'tag': ['AzurePilot',\n",
" 'OpenML-CC18',\n",
" 'OpenML100',\n",
" 'study_1',\n",
" 'study_123',\n",
" 'study_41',\n",
" 'study_99',\n",
" 'vision'],\n",
" 'visibility': 'public',\n",
" 'status': 'active',\n",
" 'processing_date': '2018-10-03 21:23:30',\n",
" 'md5_checksum': '0298d579eb1b86163de7723944c7e495'},\n",
" 'categories': {},\n",
" 'url': 'https://www.openml.org/d/554'}"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.datasets import fetch_openml\n",
"\n",
"mnist = fetch_openml('mnist_784', version=1)\n",
"mnist"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"X, y = mnist['data'], mnist['target']"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(70000, 784)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X.shape"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(70000,)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y.shape"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0'"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y[1]"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAD4CAYAAAAq5pAIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAABmxJREFUeJzt3UuIzf8fx/H/0WSUadSklA2SlWRjWMkkC1mhZiHKzk4WiqVSctuRhZ1kQzaKhGKWNkKUSS5ZUMICuSSa/+q3UHPeJ3PmnJk5r8djOa++53tinn3Lp3M0JiYm/gf0vnkz/QaA7hA7hBA7hBA7hBA7hOjr8v380z90XmOyH3qyQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQ4i+mX4DtO/ixYtNtzt37pTXjoyMlPuRI0fK/e3bt+U+PDzcdDt//nx57Y8fP8p94cKF5b527dpyT+PJDiHEDiHEDiHEDiHEDiHEDiHEDiEaExMT3bxfV2/WK0ZHR8v9xo0bTbefP39O99v5S6vfnxUrVjTdPn/+XF67adOmKb2n/+zbt6/pNjY2Vl574sSJtu49wxqT/dCTHUKIHUKIHUKIHUKIHUKIHUL4iOsccPXq1XJvNCY9aemKVh8j3b59e9Pt9u3b5bXXr18v9/7+/nJfvnx5021oaKi8thd5skMIsUMIsUMIsUMIsUMIsUMIsUMI5+xzwODgYLl//fp1yq+9YcOGcj98+HC5r1mzptwHBgaabjt27CivHR8fL/dWvn//3nRr589srvJkhxBihxBihxBihxBihxBihxBihxC+SnoOaHXWffr06Sm/9v3798t9/fr1U35tZoyvkoZkYocQYocQYocQYocQYocQYocQPs8+C1y6dKncT5061bF737t3r9yds/cOT3YIIXYIIXYIIXYIIXYIIXYIIXYI4Zy9C37//l3ud+/ebev1q/+fvdX3wh88eLCtezN3eLJDCLFDCLFDCLFDCLFDCLFDCEdvXXDz5s1yv3DhQluvv23btqbbuXPnymv7+vwKpPBkhxBihxBihxBihxBihxBihxBihxAOWafBnz9/yv3o0aMdvf/WrVubbsuWLevovZk7PNkhhNghhNghhNghhNghhNghhNghhHP2afDq1atyf/DgQUfvPzIy0tHXpzd4skMIsUMIsUMIsUMIsUMIsUMIsUMI5+zTYMmSJeW+cuXKcn/x4kVb91+6dGlb15PBkx1CiB1CiB1CiB1CiB1CiB1CiB1COGefBoODg+W+ePHicn/58mW5tzpHf/r0adOtv7+/vLZdr1+/Lvfh4eGm28ePH8trV69eXe4DAwPlzt882SGE2CGE2CGE2CGE2CGE2CFEY2Jiopv36+rNZouzZ8+W+4EDB8q91d9Ro9H45/c0XVq9t0WLFjXdvnz5Ul67ZcuWct+9e3e57927t9x72KS/EJ7sEELsEELsEELsEELsEELsEELsEMI5exd8+/at3NetW1fu4+Pj5T6bz9ln8r1duXKl6bZz587y2nnz5vRz0Dk7JBM7hBA7hBA7hBA7hBA7hBA7hHDOPgu8e/eu3Pfs2VPuY2Nj0/hu/k2rr7nevHlz0+3JkyfltY8fP57Se/pP9bv96dOn8tqhoaG27j3DnLNDMrFDCLFDCLFDCLFDCLFDCLFDCOfsPa7Vd7PfunWr3EdHR6fz7fyTVp/j37VrV7k/evSo6XbmzJny2v3795f7LOecHZKJHUKIHUKIHUKIHUKIHUL0zfQboLMGBwfLfSaP1lp5+PBhuT979mzKrz08PDzla+cqT3YIIXYIIXYIIXYIIXYIIXYIIXYI4Zydjvrw4UPT7dChQ+W1ly9fLvdfv36Ve/URWOfsQM8SO4QQO4QQO4QQO4QQO4QQO4TwVdKUrl27Vu7Hjx8v9zdv3jTd3r9/X167YMGCcm/1dc8nT54s9x7mq6QhmdghhNghhNghhNghhNghhNghhM+zU3r+/Hm5r1q1qtznz58/5WuPHTtW7hs3bix3/ubJDiHEDiHEDiHEDiHEDiHEDiHEDiF8nh16j8+zQzKxQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQ4hu/5fNk37FLdB5nuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQ4v/GxfNRZYW5kQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"\n",
"some_digit = X[2000]\n",
"some_digit_image = some_digit.reshape(28, 28)\n",
"plt.imshow(some_digit_image, cmap=matplotlib.cm.binary, interpolation='nearest')\n",
"plt.axis('off')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'9'"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y[36000]"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"shuffle_index = np.random.permutation(70000)\n",
"X_train, y_train = X[shuffle_index[0:60000]], y[shuffle_index[0:60000]]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([65096, 18196, 6131, ..., 24452, 19983, 45538])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"shuffle_index"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"X_test, y_test = X[shuffle_index[60000:70000]], y[shuffle_index[60000:70000]]"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'9'"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y_test[100]"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['2', '4', '3', ..., '4', '4', '2'], dtype=object)"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y_train"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"y_train_5 = (y_train == '5')"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"5430"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len([y for y in y_train_5 if y])"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"y_test_5 = (y_test == 5)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\pes94\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:183: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If max_iter is set but tol is left unset, the default value for tol in 0.19 and 0.20 will be None (which is equivalent to -infinity, so it has no effect) but will change in 0.21 to 1e-3. Specify tol to silence this warning.\n",
" FutureWarning)\n"
]
},
{
"data": {
"text/plain": [
"SGDClassifier(alpha=0.0001, average=False, class_weight=None,\n",
" early_stopping=False, epsilon=0.1, eta0=0.0, fit_intercept=True,\n",
" l1_ratio=0.15, learning_rate='optimal', loss='hinge', max_iter=5,\n",
" n_iter=None, n_iter_no_change=5, n_jobs=None, penalty='l2',\n",
" power_t=0.5, random_state=42, shuffle=True, tol=None,\n",
" validation_fraction=0.1, verbose=0, warm_start=False)"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.linear_model import SGDClassifier\n",
"\n",
"sgd_clf = SGDClassifier(max_iter=5, random_state=42)\n",
"sgd_clf.fit(X_train, y_train_5)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAD4CAYAAAAq5pAIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAABmxJREFUeJzt3UuIzf8fx/H/0WSUadSklA2SlWRjWMkkC1mhZiHKzk4WiqVSctuRhZ1kQzaKhGKWNkKUSS5ZUMICuSSa/+q3UHPeJ3PmnJk5r8djOa++53tinn3Lp3M0JiYm/gf0vnkz/QaA7hA7hBA7hBA7hBA7hOjr8v380z90XmOyH3qyQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQ4i+mX4DtO/ixYtNtzt37pTXjoyMlPuRI0fK/e3bt+U+PDzcdDt//nx57Y8fP8p94cKF5b527dpyT+PJDiHEDiHEDiHEDiHEDiHEDiHEDiEaExMT3bxfV2/WK0ZHR8v9xo0bTbefP39O99v5S6vfnxUrVjTdPn/+XF67adOmKb2n/+zbt6/pNjY2Vl574sSJtu49wxqT/dCTHUKIHUKIHUKIHUKIHUKIHUL4iOsccPXq1XJvNCY9aemKVh8j3b59e9Pt9u3b5bXXr18v9/7+/nJfvnx5021oaKi8thd5skMIsUMIsUMIsUMIsUMIsUMIsUMI5+xzwODgYLl//fp1yq+9YcOGcj98+HC5r1mzptwHBgaabjt27CivHR8fL/dWvn//3nRr589srvJkhxBihxBihxBihxBihxBihxBihxC+SnoOaHXWffr06Sm/9v3798t9/fr1U35tZoyvkoZkYocQYocQYocQYocQYocQYocQPs8+C1y6dKncT5061bF737t3r9yds/cOT3YIIXYIIXYIIXYIIXYIIXYIIXYI4Zy9C37//l3ud+/ebev1q/+fvdX3wh88eLCtezN3eLJDCLFDCLFDCLFDCLFDCLFDCEdvXXDz5s1yv3DhQluvv23btqbbuXPnymv7+vwKpPBkhxBihxBihxBihxBihxBihxBihxAOWafBnz9/yv3o0aMdvf/WrVubbsuWLevovZk7PNkhhNghhNghhNghhNghhNghhNghhHP2afDq1atyf/DgQUfvPzIy0tHXpzd4skMIsUMIsUMIsUMIsUMIsUMIsUMI5+zTYMmSJeW+cuXKcn/x4kVb91+6dGlb15PBkx1CiB1CiB1CiB1CiB1CiB1CiB1COGefBoODg+W+ePHicn/58mW5tzpHf/r0adOtv7+/vLZdr1+/Lvfh4eGm28ePH8trV69eXe4DAwPlzt882SGE2CGE2CGE2CGE2CGE2CFEY2Jiopv36+rNZouzZ8+W+4EDB8q91d9Ro9H45/c0XVq9t0WLFjXdvnz5Ul67ZcuWct+9e3e57927t9x72KS/EJ7sEELsEELsEELsEELsEELsEELsEMI5exd8+/at3NetW1fu4+Pj5T6bz9ln8r1duXKl6bZz587y2nnz5vRz0Dk7JBM7hBA7hBA7hBA7hBA7hBA7hHDOPgu8e/eu3Pfs2VPuY2Nj0/hu/k2rr7nevHlz0+3JkyfltY8fP57Se/pP9bv96dOn8tqhoaG27j3DnLNDMrFDCLFDCLFDCLFDCLFDCLFDCOfsPa7Vd7PfunWr3EdHR6fz7fyTVp/j37VrV7k/evSo6XbmzJny2v3795f7LOecHZKJHUKIHUKIHUKIHUKIHUL0zfQboLMGBwfLfSaP1lp5+PBhuT979mzKrz08PDzla+cqT3YIIXYIIXYIIXYIIXYIIXYIIXYI4Zydjvrw4UPT7dChQ+W1ly9fLvdfv36Ve/URWOfsQM8SO4QQO4QQO4QQO4QQO4QQO4TwVdKUrl27Vu7Hjx8v9zdv3jTd3r9/X167YMGCcm/1dc8nT54s9x7mq6QhmdghhNghhNghhNghhNghhNghhM+zU3r+/Hm5r1q1qtznz58/5WuPHTtW7hs3bix3/ubJDiHEDiHEDiHEDiHEDiHEDiHEDiF8nh16j8+zQzKxQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQ4hu/5fNk37FLdB5nuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQ4v/GxfNRZYW5kQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"\n",
"some_digit = X[2000]\n",
"some_digit_image = some_digit.reshape(28, 28)\n",
"plt.imshow(some_digit_image, cmap=matplotlib.cm.binary, interpolation='nearest')\n",
"plt.axis('off')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([False])"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sgd_clf.predict([some_digit])"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"import warnings\n",
"warnings.filterwarnings(action='ignore')"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.9574 , 0.9643 , 0.96545])"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.model_selection import cross_val_score\n",
"\n",
"cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring='accuracy')"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.base import BaseEstimator\n",
"\n",
"class Never5Classifier(BaseEstimator):\n",
" def fit(self, X, y=None):\n",
" pass\n",
" \n",
" def predict(self, X):\n",
" return np.zeros((len(X), 1), dtype=bool)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.91 , 0.9063, 0.9122])"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"never_5_clf = Never5Classifier()\n",
"\n",
"cross_val_score(never_5_clf, X_train, y_train_5, cv=3, scoring='accuracy')"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.model_selection import cross_val_predict\n",
"\n",
"y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[53702, 868],\n",
" [ 1389, 4041]], dtype=int64)"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.metrics import confusion_matrix\n",
"\n",
"confusion_matrix(y_train_5, y_train_pred)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.metrics import roc_curve\n",
"\n",
"# decision_function = 각 Sample에 대한 점수를 구함. Threshold값과의 비교를 통해 class가 나뉨\n",
"y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3, method='decision_function')\n",
"\n",
"# roc_curve를 통해 fpr, tpr, 가능한 threhold set이 나옴\n",
"fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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CyUNPW02xtzit0quwg3VK1pdgiqHUlNT6devHzfffDNz586lffv2VpeklF+UdERhSnjNUk4940n5iTGG1atXA54mfosXL2bDhg0aEqpcKemIoqaIPH25F40xb/ugHq+E6GS28oNDhw7x2GOPMX/+fJYuXUrnzp3p2rWr1WUp5XclBYUTiCIAb/wQokcUyoeMMcyYMYOJEyeSk5PDm2++qU38VLlWUlAcNsa87LdKroJebKd8acCAAXz++ed07tyZ6dOnc+ONN1pdklKWKikoAnZvnHIyw+oSVJAp3sTvvvvuo3v37owdO1b7MylFyZPZCX6r4iq1qlfZ6hJUENm6dSt33HFHURO/4cOHa6dXpYopqSngKX8WcjUitMW4KgO5ubn86U9/ok2bNuzbt48qVapYXZJSAcmWt4n7WYee1DVav349I0eOZOvWrQwdOpR3332XGjVqWF2WUgHJlkHRPFbbN6trc/LkSU6fPs2CBQvo27ev1eUoFdBsGRR6eqwqje+//54tW7bwxBNP0L17d/bs2UNERITVZSkV8Gw5W6enx6qrcebMGR555BHuuusuPvjgg6ImfhoSSnnHlkGhRxTKWwsWLCAuLo7p06czceJE1q9fr038lLpKthx60l5Pyhupqan079+fJk2a8OWXX9K2bVurS1LKlmx5ROHU+1GoyzDG8MMPPwAXmvitW7dOQ0Kpa+DToBCRniKyS0T2isgLJSw3QESMiMR7s95DZ7LKrkgVNNLS0rj33nu54447WLZsGQBdunQhLCzM4sqUsjefBYWIOIFJQC8gDhgiInGXWC4aeAJY4+26b6wZXVZlqiDgdruZOnUqcXFxLFmyhLfffps777zT6rKUChq+PKJoB+w1xiQbY3KB2cCl7jr/Z+ANINvbFYfqHIUqpn///jz66KO0bduWrVu38tRTT+F06tX7SpUVXwZFLJBa7HFawXNFROQWoJ4x5quSViQi40RknYisAwgNseXUiipD+fn5uN1uwBMUH374Id9++y033HCDxZUpFXx8uce91Mf+orvmiYgDeAd45korMsZMM8bEG2PiQU+PLe+SkpLo0KEDH374IQDDhg1jzJgxiJ7koJRP+DIo0oB6xR7XBQ4VexwNNAeWisjPwG3AfG8mtE9m5JZhmcoucnJyeOmll7j11ls5cOCA9mZSyk98eR3FWqCxiDQE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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"def plot_roc_curve(fpr, tpr, label=None):\n",
" plt.plot(fpr, tpr, linewidth=2, label=label)\n",
" plt.plot([0, 1], [0, 1], 'k--')\n",
" plt.axis([0, 1, 0, 1])\n",
" plt.xlabel('FPR')\n",
" plt.ylabel('TPR')\n",
" \n",
"plot_roc_curve(fpr, tpr)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.ensemble import RandomForestClassifier\n",
"\n",
"forest_clf = RandomForestClassifier(random_state=42)\n",
"y_probas_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3, method='predict_proba')"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [],
"source": [
"y_scores_forest = y_probas_forest[:, 1]"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
"fpr_forest, tpr_forest, thresholds_forest = roc_curve(y_train_5, y_scores_forest)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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HTt2UL9+faZPnw5A9+7d6dWrl/xhCiGckiSKAnTlyhVGjx5N48aNOX/+PPfcc4/VIQnh1N5++21q165N3bp1CQgIYPv27SQmJvLqq69SvXp1AgICCAgI4O233057j7u7OwEBAdSuXRt/f38+/PBDkpOTLfwW9idDTwVk8+bNBAUFcfToUf7zn/8wceJEfHx8rA5LCKe1detWfvzxR3bv3k2RIkU4d+4c8fHxvP7665w5c4a9e/fi7e3NxYsX+eCDD9LeV7RoUUJCQgD466+/6N27NzExMbz11ltWfRXbkx5FAUm9sdC6deuYOXOmJAlhKy1bwvz55nFCgln+4guzfOWKWf7mG7McE2OWf/jBLJ87Z5aXLzfLZ87k7jP//PNPypYtS5EiRQAoW7YspUuXZs6cOXz88cd4e3sDULJkScaNG5flOsqVK8fs2bOZOnUqdrtmzJlIonCg5cuXM2mSucVGq1atiIiIoGXLltYGJYRNtGnThlOnTlGjRg2GDRvGhg0bOHz4MHfddRclS5bM9XruvvtukpOT+esvqRKUVzL05ABRUVGMHDmSr7/+moCAAJ577jm8vLzw8JDNLexp/fr0x56e1y4XK3btso/Ptctly167XL587j6zRIkSBAcHs2nTJtatW0ePHj149dVXr2nz6aef8tFHHxEdHc2WLVuyvT+89CZujvQo8pHWmq+++opatWrx3XffMX78eLZv3y5F/ITII3d3d1q2bMlbb73F1KlTWb58OSdPnuTixYsA9O/fn5CQEHx8fEhKSspyHUePHsXd3Z1y5coVZOguRRJFPjp58iT9+/enWrVq7NmzhzfeeEOShBB5dPDgQX7//fe05ZCQEO69914GDhzIiBEj0sqLJCUlpZXezywqKoqhQ4cyYsQIOf38JshYyE1KTk7m119/pW3btlSuXJlNmzZRv359KeInxE26dOkSzzzzDBcuXMDDw4Nq1aoxe/ZsfHx8eOONN/Dz86NkyZIULVqUoKAg7rzzTsDc/TEgIICEhAQ8PDzo27cvzz//vMXfxt6keuxN+P333xk8eDAbNmxgw4YNNG/e3OqQhMgX+/fvp1atWlaHIfIoq3+/m6keK0NPeZCYmMh7771H3bp1CQkJYd68eVLETwjhsmToKQ86duzIypUr6dy5M9OnT0/r8gohhCuSRJFLcXFxeHp64ubmxqBB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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(fpr, tpr, 'b:', label='SGD')\n",
"plot_roc_curve(fpr_forest, tpr_forest, 'Random Forest')\n",
"plt.legend(loc='lower right')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array(['8'], dtype='<U1')"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sgd_clf.fit(X_train, y_train)\n",
"sgd_clf.predict([some_digit])"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAD4CAYAAAAq5pAIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAABmxJREFUeJzt3UuIzf8fx/H/0WSUadSklA2SlWRjWMkkC1mhZiHKzk4WiqVSctuRhZ1kQzaKhGKWNkKUSS5ZUMICuSSa/+q3UHPeJ3PmnJk5r8djOa++53tinn3Lp3M0JiYm/gf0vnkz/QaA7hA7hBA7hBA7hBA7hOjr8v380z90XmOyH3qyQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQ4i+mX4DtO/ixYtNtzt37pTXjoyMlPuRI0fK/e3bt+U+PDzcdDt//nx57Y8fP8p94cKF5b527dpyT+PJDiHEDiHEDiHEDiHEDiHEDiHEDiEaExMT3bxfV2/WK0ZHR8v9xo0bTbefP39O99v5S6vfnxUrVjTdPn/+XF67adOmKb2n/+zbt6/pNjY2Vl574sSJtu49wxqT/dCTHUKIHUKIHUKIHUKIHUKIHUL4iOsccPXq1XJvNCY9aemKVh8j3b59e9Pt9u3b5bXXr18v9/7+/nJfvnx5021oaKi8thd5skMIsUMIsUMIsUMIsUMIsUMIsUMI5+xzwODgYLl//fp1yq+9YcOGcj98+HC5r1mzptwHBgaabjt27CivHR8fL/dWvn//3nRr589srvJkhxBihxBihxBihxBihxBihxBihxC+SnoOaHXWffr06Sm/9v3798t9/fr1U35tZoyvkoZkYocQYocQYocQYocQYocQYocQPs8+C1y6dKncT5061bF737t3r9yds/cOT3YIIXYIIXYIIXYIIXYIIXYIIXYI4Zy9C37//l3ud+/ebev1q/+fvdX3wh88eLCtezN3eLJDCLFDCLFDCLFDCLFDCLFDCEdvXXDz5s1yv3DhQluvv23btqbbuXPnymv7+vwKpPBkhxBihxBihxBihxBihxBihxBihxAOWafBnz9/yv3o0aMdvf/WrVubbsuWLevovZk7PNkhhNghhNghhNghhNghhNghhNghhHP2afDq1atyf/DgQUfvPzIy0tHXpzd4skMIsUMIsUMIsUMIsUMIsUMIsUMI5+zTYMmSJeW+cuXKcn/x4kVb91+6dGlb15PBkx1CiB1CiB1CiB1CiB1CiB1CiB1COGefBoODg+W+ePHicn/58mW5tzpHf/r0adOtv7+/vLZdr1+/Lvfh4eGm28ePH8trV69eXe4DAwPlzt882SGE2CGE2CGE2CGE2CGE2CFEY2Jiopv36+rNZouzZ8+W+4EDB8q91d9Ro9H45/c0XVq9t0WLFjXdvnz5Ul67ZcuWct+9e3e57927t9x72KS/EJ7sEELsEELsEELsEELsEELsEELsEMI5exd8+/at3NetW1fu4+Pj5T6bz9ln8r1duXKl6bZz587y2nnz5vRz0Dk7JBM7hBA7hBA7hBA7hBA7hBA7hHDOPgu8e/eu3Pfs2VPuY2Nj0/hu/k2rr7nevHlz0+3JkyfltY8fP57Se/pP9bv96dOn8tqhoaG27j3DnLNDMrFDCLFDCLFDCLFDCLFDCLFDCOfsPa7Vd7PfunWr3EdHR6fz7fyTVp/j37VrV7k/evSo6XbmzJny2v3795f7LOecHZKJHUKIHUKIHUKIHUKIHUL0zfQboLMGBwfLfSaP1lp5+PBhuT979mzKrz08PDzla+cqT3YIIXYIIXYIIXYIIXYIIXYIIXYI4Zydjvrw4UPT7dChQ+W1ly9fLvdfv36Ve/URWOfsQM8SO4QQO4QQO4QQO4QQO4QQO4TwVdKUrl27Vu7Hjx8v9zdv3jTd3r9/X167YMGCcm/1dc8nT54s9x7mq6QhmdghhNghhNghhNghhNghhNghhM+zU3r+/Hm5r1q1qtznz58/5WuPHTtW7hs3bix3/ubJDiHEDiHEDiHEDiHEDiHEDiHEDiF8nh16j8+zQzKxQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQwixQ4hu/5fNk37FLdB5nuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQQuwQ4v/GxfNRZYW5kQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"some_digit = X[2000]\n",
"some_digit_image = some_digit.reshape(28, 28)\n",
"plt.imshow(some_digit_image, cmap=matplotlib.cm.binary, interpolation='nearest')\n",
"plt.axis('off')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.88071789, 0.87890605, 0.85382076])"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cross_val_score(sgd_clf, X_train, y_train, cv=3, scoring='accuracy')"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [],
"source": [
"y_train_pred = cross_val_predict(sgd_clf, X_train, y_train, cv=3)"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [],
"source": [
"conf_mx = confusion_matrix(y_train, y_train_pred)"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[5767, 3, 15, 14, 19, 24, 27, 2, 22, 2],\n",
" [ 1, 6493, 115, 10, 8, 20, 9, 18, 62, 39],\n",
" [ 91, 63, 5314, 93, 72, 28, 84, 78, 162, 13],\n",
" [ 77, 32, 245, 5182, 17, 309, 25, 69, 119, 84],\n",
" [ 32, 24, 40, 8, 5402, 27, 41, 26, 71, 175],\n",
" [ 145, 37, 50, 244, 82, 4458, 92, 39, 211, 72],\n",
" [ 64, 42, 102, 1, 63, 132, 5422, 3, 41, 3],\n",
" [ 44, 50, 119, 38, 115, 28, 7, 5573, 35, 212],\n",
" [ 117, 248, 185, 223, 108, 379, 48, 40, 4331, 158],\n",
" [ 76, 66, 37, 120, 493, 166, 1, 487, 193, 4327]],\n",
" dtype=int64)"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"conf_mx"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x15f3c819940>"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAP4AAAECCAYAAADesWqHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAACypJREFUeJzt3c+LXfUZx/HPZ36YcZL6I7YbM6FRqLYqloShqAEXxkVbRTdZWIhQN9m0GkWQ2I3/gIguijDEutCgwphFEbEWVLCb0DEJjHEs/myMRkwJ1cSFM5N5upgJqEnnntH73DPX5/0CITPefHm4ue85594593sdEQJQy0DbAwDoPcIHCiJ8oCDCBwoifKAgwgcKai1827+2/S/b79re3dYcTdneaPtV2zO2D9ve1fZMTdgetH3Q9gttz9KE7YtsT9p+e+m+vr7tmTqxfd/SY+JN28/YHml7pk5aCd/2oKQ/S/qNpKsk/c72VW3MsgLzku6PiF9Iuk7SH/pgZknaJWmm7SFW4DFJL0XEzyX9Uqt8dtsbJN0jaTwirpE0KOmOdqfqrK0j/q8kvRsR70fErKRnJd3e0iyNRMSxiDiw9OeTWnxAbmh3quXZHpN0i6Q9bc/ShO0LJN0o6QlJiojZiPhvu1M1MiTpfNtDkkYlfdLyPB21Ff4GSR997eujWuURfZ3tTZI2S9rf7iQdPSrpAUkLbQ/S0OWSjkt6cunpyR7ba9seajkR8bGkhyUdkXRM0ucR8XK7U3XWVvg+x/f64tph2+skPS/p3oj4ou15/h/bt0r6LCLeaHuWFRiStEXS4xGxWdKXklb16z+2L9bi2eplki6VtNb2jnan6qyt8I9K2vi1r8fUB6dHtoe1GP3eiNjX9jwdbJV0m+0PtfhU6ibbT7c7UkdHJR2NiDNnUpNa/EGwmt0s6YOIOB4Rc5L2Sbqh5Zk6aiv8f0r6me3LbJ+nxRdD/trSLI3Ythafe85ExCNtz9NJRDwYEWMRsUmL9+8rEbGqj0QR8amkj2xfufStbZLeanGkJo5Ius726NJjZJtW+QuS0uKpVc9FxLztP0r6mxZfBf1LRBxuY5YV2CrpTknTtg8tfe9PEfFiizP9EN0tae/SAeF9SXe1PM+yImK/7UlJB7T4m5+Dkibanaoz87ZcoB6u3AMKInygIMIHCiJ8oCDCBwpqPXzbO9ueYSX6bV6JmXuh3+ZtPXxJfXWHqf/mlZi5F/pq3tUQPoAeS7mAZ/369TE2NtbotidOnND69esb3XZ6evr7jAWUEBHnehPcN6Rcsjs2NqYXX+z+lawbN27sfCOsWouXsufgCtSV4VQfKIjwgYIIHyiI8IGCCB8oqFH4/bYHPoDldQy/T/fAB7CMJkf8vtsDH8DymoTf13vgAzhbk/Ab7YFve6ftKdtTJ06c+P6TAUjTJPxGe+BHxEREjEfEeNNr7wG0o0n4fbcHPoDldXyTTp/ugQ9gGY3enbf0oRF8cATwA8GVe0BBhA8URPhAQYQPFET4QEEpm23aTtkALXNfteHh4ZR15+fnU9ZFbwwM5B0bMx7PEdFos02O+EBBhA8URPhAQYQPFET4QEGEDxRE+EBBhA8URPhAQYQPFET4QEGEDxRE+EBBhA8URPhAQYQPFET4QEGEDxRE+EBBhA8URPhAQYQPFNToQzO/i8HBwb5Y84yDBw+mrLtly5aUdaW87caz1s3cqjpL5mNudnY2be1O+u9fAsD3RvhAQYQPFET4QEGEDxRE+EBBhA8U1DF82xttv2p7xvZh27t6MRiAPE0u4JmXdH9EHLD9I0lv2P57RLyVPBuAJB2P+BFxLCIOLP35pKQZSRuyBwOQZ0XP8W1vkrRZ0v6MYQD0RuNr9W2vk/S8pHsj4otz/P+dknZ2cTYASRqFb3tYi9HvjYh957pNRExImli6fc67PAB0RZNX9S3pCUkzEfFI/kgAsjV5jr9V0p2SbrJ9aOm/3ybPBSBRx1P9iPiHJPdgFgA9wpV7QEGEDxRE+EBBhA8URPhAQc7YUdV2ZOyomrX7qySNjIykrPv666+nrCtJ4+PjKeuuW7cuZd1Tp06lrCvl7eCbuTNwxuP59OnTioiOv4XjiA8URPhAQYQPFET4QEGEDxRE+EBBhA8URPhAQYQPFET4QEGEDxRE+EBBhA8URPhAQYQPFET4QEGEDxRE+EBBhA8URPhAQYQPFET4QEFp22svfrp2d2Vur50xr5Q78/T0dMq61157bcq6mbLu58zttYeGOn5m7YrNzc1pYWGB7bUBnI3wgYIIHyiI8IGCCB8oiPCBgggfKKhx+LYHbR+0/ULmQADyreSIv0vSTNYgAHqnUfi2xyTdImlP7jgAeqHpEf9RSQ9IWkicBUCPdAzf9q2SPouINzrcbqftKdtTXZsOQIomR/ytkm6z/aGkZyXdZPvpb98oIiYiYjwixrs8I4Au6xh+RDwYEWMRsUnSHZJeiYgd6ZMBSMPv8YGCVvSG4Ih4TdJrKZMA6BmO+EBBhA8URPhAQYQPFET4QEEpu+wODAxExg6i8/PzXV8z28jISNras7OzKetOTk6mrLt9+/aUdSVpYSHnavI1a9akrCvl/PstLCwoIthlF8DZCB8oiPCBgggfKIjwgYIIHyiI8IGCCB8oiPCBgggfKIjwgYIIHyiI8IGCCB8oiPCBgggfKIjwgYIIHyiI8IGCCB8oiPCBglJ22bUdAwPd/5mSMesZGfNK0unTp1PWlfJmHhwcTFn30KFDKetK0tVXX52yrt1xw9rvLOvxzC67AM6J8IGCCB8oiPCBgggfKIjwgYIIHyioUfi2L7I9aftt2zO2r88eDECepp9l/ZiklyJiu+3zJI0mzgQgWcfwbV8g6UZJv5ekiJiVlPPB7AB6osmp/uWSjkt60vZB23tsr02eC0CiJuEPSdoi6fGI2CzpS0m7v30j2zttT9me6vKMALqsSfhHJR2NiP1LX09q8QfBN0TERESMR8R4NwcE0H0dw4+ITyV9ZPvKpW9tk/RW6lQAUjV9Vf9uSXuXXtF/X9JdeSMByNYo/Ig4JIlTeOAHgiv3gIIIHyiI8IGCCB8oiPCBgggfKChte+3MbYkzZG0pnbm9dr/NnLk9+jvvvJOy7hVXXJGyriStWbOm62t+9dVXWlhYYHttAGcjfKAgwgcKInygIMIHCiJ8oCDCBwoifKAgwgcKInygIMIHCiJ8oCDCBwoifKAgwgcKInygIMIHCiJ8oCDCBwoifKAgwgcKSttld2io6QfxNjc8PNz1Nc9YWFhIWTdzt+H5+fmUdUdHR1PWPXnyZMq6mZ577rm0tXfs2NH1Nefm5thlF8C5ET5QEOEDBRE+UBDhAwURPlAQ4QMFNQrf9n22D9t+0/YztkeyBwOQp2P4tjdIukfSeERcI2lQ0h3ZgwHI0/RUf0jS+baHJI1K+iRvJADZOoYfER9LeljSEUnHJH0eES9nDwYgT5NT/Ysl3S7pMkmXSlpr+6yLjG3vtD1le6r7YwLopian+jdL+iAijkfEnKR9km749o0iYiIixiNivNtDAuiuJuEfkXSd7VEvvtVsm6SZ3LEAZGryHH+/pElJByRNL/2dieS5ACRq9Kb5iHhI0kPJswDoEa7cAwoifKAgwgcKInygIMIHCiJ8oKC07bUHBvrrZ0rG/SBJg4ODKetK0oUXXpiybtY22LOzsynrStIll1ySsu6pU6dS1pWkp556qutr7t69W++99x7bawM4G+EDBRE+UBDhAwURPlAQ4QMFET5QEOEDBRE+UBDhAwURPlAQ4QMFET5QEOEDBRE+UBDhAwURPlAQ4QMFET5QEOEDBRE+UFDWLrvHJf274c1/LOk/XR8iT7/NKzFzL6yWeX8aET/pdKOU8FfC9lREjLc6xAr027wSM/dCv83LqT5QEOEDBa2G8CfaHmCF+m1eiZl7oa/mbf05PoDeWw1HfAA9RvhAQYQPFET4QEGEDxT0P6R8uVZSmUT9AAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 288x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.matshow(conf_mx, cmap=plt.cm.gray)"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [],
"source": [
"np.fill_diagonal(conf_mx, 0)"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x15f3cea2898>"
]
},
"execution_count": 67,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 288x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.matshow(conf_mx, cmap=plt.cm.gray)"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x15f3cef9208>"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 288x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"row_sums = conf_mx.sum(axis=1, keepdims=True)\n",
"norm_conf_mx = conf_mx / row_sums\n",
"plt.matshow(norm_conf_mx, cmap=plt.cm.gray)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.neighbors import KNeighborsClassifier\n",
"\n",
"\n",
"y_train_large = (y_train.astype('uint32') >= 7)\n",
"y_train_odd = (y_train.astype('uint32') % 2 == 1)\n",
"y_multilabel = np.c_[y_train_large, y_train_odd]\n",
"\n",
"knn_clf = KNeighborsClassifier()\n",
"knn_clf.fit(X_train, y_multilabel)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"y_train_knn_pred = cross_val_predict(knn_clf, X_train, y_multilabel, cv=3, n_jobs=-1)\n",
"f1_score(y_multilabel, y_train_knn_pred, average='macro')"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"import numpy.random as rnd\n",
"\n",
"noise = rnd.randint(0, 100, (len(X_train), 784))\n",
"X_train_mod = X_train + noise\n",
"noise = rnd.randint(0, 100, (len(X_test), 784))\n",
"X_test_mod = X_test + noise\n",
"\n",
"y_train_mod = X_train\n",
"y_test_mod = X_test"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"knn_clf.fit(X_train_mod, y_train_mod)\n",
"clean_digit = knn_clf.predict([X_test_mod[some_index]])"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment