├── .gitignore ├── .nojekyll ├── CNAME ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── cover.jpg ├── doc ├── 0.md ├── 1.md ├── 10.md ├── 11.md ├── 2.md ├── 4.md ├── 5.md ├── 6.md ├── 7.md ├── 8.md ├── en.html └── img │ ├── 10-1.png │ ├── 10-2.png │ ├── 10-3-1.png │ ├── 10-3.png │ ├── 10-4-1.png │ ├── 10-4.png │ ├── 4-1.png │ ├── 4-2.png │ ├── 5-1.png │ ├── 5-2.png │ ├── 5-3.png │ ├── 5-QRcode.png │ ├── 6-1.png │ ├── 6-2.png │ ├── 6-3.png │ ├── 6-4.png │ ├── 6-5.png │ ├── 6-6.png │ ├── 6-7.png │ ├── 6-8.png │ ├── 6-9.png │ ├── 7-1.png │ ├── 7-2.png │ ├── 7-3.png │ ├── 7-4.png │ ├── 7-5.png │ ├── 7-6.png │ ├── 7-7.png │ ├── 7-8.png │ ├── 7-9.png │ └── 8-1.png ├── update.sh └── 翻译 ├── 9.md ├── Figure1.PNG ├── Figure2.PNG ├── Figure3.PNG ├── Figure4.PNG ├── Figure5.PNG ├── Figure6.PNG ├── Figure7.PNG ├── 公式.PNG ├── 公式1.PNG ├── 公式2.PNG ├── 公式5.PNG └── 公式6.PNG /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | 49 | # Translations 50 | *.mo 51 | *.pot 52 | 53 | # Django stuff: 54 | *.log 55 | local_settings.py 56 | 57 | # Flask stuff: 58 | instance/ 59 | .webassets-cache 60 | 61 | # Scrapy stuff: 62 | .scrapy 63 | 64 | # Sphinx documentation 65 | docs/_build/ 66 | 67 | # PyBuilder 68 | target/ 69 | 70 | # Jupyter Notebook 71 | .ipynb_checkpoints 72 | 73 | # pyenv 74 | .python-version 75 | 76 | # celery beat schedule file 77 | celerybeat-schedule 78 | 79 | # SageMath parsed files 80 | *.sage.py 81 | 82 | # dotenv 83 | .env 84 | 85 | # virtualenv 86 | .venv 87 | venv/ 88 | ENV/ 89 | 90 | # Spyder project settings 91 | .spyderproject 92 | .spyproject 93 | 94 | # Rope project settings 95 | .ropeproject 96 | 97 | # mkdocs documentation 98 | /site 99 | 100 | # mypy 101 | .mypy_cache/ 102 | .DS_Store 103 | 104 | # gitbook 105 | _book 106 | 107 | # node.js 108 | node_modules 109 | 110 | # windows 111 | Thumbs.db 112 | 113 | # word 114 | ~$*.docx 115 | ~$*.doc 116 | -------------------------------------------------------------------------------- /.nojekyll: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | mlbook100.apachecn.org 2 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # 贡献指南 2 | 3 | > 请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并不要求您做到十全十美,因此请不要担心因为翻译上犯错——在大部分情况下,我们的服务器已经记录所有的翻译,因此您不必担心会因为您的失误遭到无法挽回的破坏。(改编自维基百科) 4 | 5 | 原文: 6 | 7 | + [PDF](http://themlbook.com/wiki/doku.php) 8 | + [HTML](http://mlbook100.apachecn.org/doc/en.html) 9 | 10 | 负责人: 11 | 12 | + [飞龙](https://github.com/wizardforcel) 13 | 14 | ## 目录 15 | 16 | + 零、前言 17 | + 一、介绍 18 | + 二、符号和定义 19 | + 三、基本算法 20 | + 四、线性算法剖析 21 | + 五、最佳实践 22 | + 六、神经网络和深度学习 23 | + 七、问题和答案 24 | + 八、高级实践 25 | + 九、无监督学习 26 | + 十、其它学习形式 27 | + 十一、总结 28 | 29 | ## 流程 30 | 31 | ### 一、认领 32 | 33 | 首先查看[整体进度](https://github.com/apachecn/ml-book-100-zh/issues/1)以及 ISSUE,确认没有人认领了你想认领的章节。 34 | 35 | 然后发布 ISSUE,注明“章节 + QQ 号”,方便联系。 36 | 37 | ### 二、翻译 38 | 39 | 可以合理利用翻译引擎(例如[谷歌](https://translate.google.cn/)),但一定要把它变得可读! 40 | 41 | ### 三、提交 42 | 43 | + `fork` Github 项目 44 | + 将译文放在`doc`文件夹下 45 | + `push` 46 | + `pull request` 47 | 48 | 请见 [Github 入门指南](https://github.com/apachecn/kaggle/blob/dev/docs/GitHub)。 49 | 50 | ## 注意事项 51 | 52 | + 积分奖励请咨询[片刻](https://github.com/jiangzhonglian)。 53 | + 公式写在`$...$`中。 54 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License (CC BY-NC-SA 4.0) 2 | 3 | Copyright © 2020 ApacheCN(apachecn@163.com) 4 | 5 | By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. 6 | 7 | Section 1 – Definitions. 8 | 9 | a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. 10 | b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. 11 | c. BY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License. 12 | d. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. 13 | e. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. 14 | f. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. 15 | g. License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike. 16 | h. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. 17 | i. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. 18 | j. Licensor means the individual(s) or entity(ies) granting rights under this Public License. 19 | k. NonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. 20 | l. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. 21 | m. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. 22 | n. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. 23 | 24 | Section 2 – Scope. 25 | 26 | a. License grant. 27 | 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: 28 | A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and 29 | B. produce, reproduce, and Share Adapted Material for NonCommercial purposes only. 30 | 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. 31 | 3. Term. The term of this Public License is specified in Section 6(a). 32 | 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. 33 | 5. Downstream recipients. 34 | A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. 35 | B. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. 36 | C. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. 37 | 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). 38 | b. Other rights. 39 | 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. 40 | 2. Patent and trademark rights are not licensed under this Public License. 41 | 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes. 42 | 43 | Section 3 – License Conditions. 44 | 45 | Your exercise of the Licensed Rights is expressly made subject to the following conditions. 46 | 47 | a. Attribution. 48 | 1. If You Share the Licensed Material (including in modified form), You must: 49 | A. retain the following if it is supplied by the Licensor with the Licensed Material: 50 | i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); 51 | ii. a copyright notice; 52 | iii. a notice that refers to this Public License; 53 | iv. a notice that refers to the disclaimer of warranties; 54 | v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; 55 | B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and 56 | C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. 57 | 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. 58 | 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. 59 | b. ShareAlike. 60 | In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. 61 | 1. The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License. 62 | 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. 63 | 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. 64 | 65 | Section 4 – Sui Generis Database Rights. 66 | 67 | Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: 68 | 69 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only; 70 | b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and 71 | c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. 72 | 73 | For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. 74 | 75 | Section 5 – Disclaimer of Warranties and Limitation of Liability. 76 | 77 | a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. 78 | b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. 79 | c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. 80 | 81 | Section 6 – Term and Termination. 82 | 83 | a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. 84 | b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: 85 | 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or 86 | 2. upon express reinstatement by the Licensor. 87 | For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. 88 | c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. 89 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. 90 | 91 | Section 7 – Other Terms and Conditions. 92 | 93 | a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. 94 | b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. 95 | 96 | Section 8 – Interpretation. 97 | 98 | a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. 99 | b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. 100 | c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. 101 | d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 百页机器学习小书 2 | 3 | ![](cover.jpg) 4 | 5 | > 原书:[The Hundred-Page Machine Learning Book](http://themlbook.com/wiki/doku.php) 6 | > 7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) 8 | > 9 | > 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 10 | 11 | * [ApacheCN 机器学习交流群 629470233](http://shang.qq.com/wpa/qunwpa?idkey=30e5f1123a79867570f665aa3a483ca404b1c3f77737bc01ec520ed5f078ddef) 12 | * [ApacheCN 学习资源](http://www.apachecn.org/) 13 | 14 | ## 目录 15 | 16 | + 零、前言 17 | + 一、介绍 18 | + 二、符号和定义 19 | + 三、基本算法 20 | + 四、线性算法剖析 21 | + 五、最佳实践 22 | + 六、神经网络和深度学习 23 | + 七、问题和答案 24 | + 八、高级实践 25 | + 九、无监督学习 26 | + 十、其它学习形式 27 | + 十一、总结 28 | 29 | ## 负责人 30 | 31 | * [飞龙](https://github.com/wizardforcel): 562826179 32 | 33 | ## 贡献指南 34 | 35 | 项目当前处于翻译阶段,请查看[贡献指南](CONTRIBUTING.md),并在[整体进度](https://github.com/apachecn/ml-book-100-zh/issues/1)中领取任务。 36 | 37 | > 请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并不要求您做到十全十美,因此请不要担心因为翻译上犯错——在大部分情况下,我们的服务器已经记录所有的翻译,因此您不必担心会因为您的失误遭到无法挽回的破坏。(改编自维基百科) 38 | 39 | ## 赞助我们 40 | 41 | ![](https://www.apachecn.org/img/about/donate.jpg) 42 | -------------------------------------------------------------------------------- /cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/cover.jpg -------------------------------------------------------------------------------- /doc/0.md: -------------------------------------------------------------------------------- 1 | # 前言 2 | 3 | 在我们开启学习之旅前,先告诉各位一个事实:机器不会学习。一个典型的“学习机”所做的就是找到一个数学模型,当它应用于一组输入(称为“训练数据”)时,就会产生所期望的输出。该数学模型还为大多数其他输入(不同于训练数据)生成正确的输出,条件是这些输入与训练数据具有相同或相似的统计分布。 4 | 5 | 为什么说机器不会学习呢?原因是如果你稍微改变输入,输出很可能会完全错误。这不是动物学习的方式。如果你通过直视屏幕来学习玩电子游戏,那么如果有人稍微旋转屏幕,你仍然是一个很好的玩家。机器学习算法,如果是通过“直视”屏幕来训练的,除非它也接受了识别旋转的训练,否则它将无法在旋转的屏幕上玩游戏。 6 | 7 | 8 | 那么为什么叫“机器学习”呢?原因通常是市场营销:阿瑟·塞缪尔(Arthur Samuel)是美国计算机游戏和人工智能领域的先驱,1959年在IBM工作时创造了这个词。类似于在2010年代,IBM试图将“认知计算”一词推向市场,以从竞争中脱颖而出。上世纪60年代,IBM使用了新的酷词“机器学习”来吸引客户和有天赋才华的员工。 9 | 10 | 如你所见,就像人工智能不是智能,机器学习不是学习。然而,机器学习是一个普遍认可的术语,通常指的是构建科学和工程的机器,这些机器可以做各种有用的事情,而这些事情通常不能被明确地编程来完成。因此,术语中的“学习”一词是类比动物的学习来使用的,而不是字面上的意思。 11 | 12 | ## 本书适合哪些读者? 13 | 14 | 这本书只包含了自20世纪60年代以来发展起来的大量机器学习材料中的一些部分,这些部分已被证明具有重要的实用价值。机器学习初学者会在这本书中发现足够的细节,以获得一个合适的水平了解该领域,并开始着手思考询问正确的问题。 15 | 16 | 有经验的从业者可以用这本书作为进一步自我完善的指导。在项目开始时,当你试图回答一个给定的技术或商业问题是否“机器可学”的问题时,这本书也会派上用场,如果是的话,你应该尝试解决哪些技术问题。 17 | 18 | ## 如何使用本书 19 | 20 | 如果你要开始学习机器,你应该从头到尾读这本书(只有一百页,没什么困难。)。如果您对书中涉及的特定主题感兴趣,并且希望了解更多信息,大多数部分内容都有一个[QR码](http://themlbook.com)。 21 | 22 | 通过使用手机扫描其中一个QR码,您将获得这本书wiki theMLbook.com上的页面链接,并提供附加材料:推荐阅读、视频、Q&A,代码片段、教程和其他奖金。这本书的维基是作者本人,以及来自世界各地的志愿者不断更新的贡献。所以这本书,就像一瓶好酒,购买之后就会变得更好。 23 | 24 | ![](https://i.imgur.com/pTlv0J1.png) 25 | 26 | 27 | 使用手机扫描QR码以获取图书维基。 28 | 29 | 有些部分没有QR码,但他们很可能也有维基页面。 您可以通过使用wiki的搜索引擎搜索该部分的标题来找到它。 30 | 31 | ## 我应该买本书吗? 32 | 33 | 本书是秉承“先读后买”的原则发行的。我坚信,在使用,消费之前为内容付费,就是在瞎特么买东西!譬如在你买车之前,你可以在经销商里查看并试用一辆汽车。你可以在百货公司试穿衬衫或连衣裙。所以你必须能够先阅读一本书,然后再付钱。这是本书坚持的理念。 34 | 35 | “先读后买”原则意味着你可以自由下载这本书,阅读它并与你的朋友和同事分享。只有当你阅读和喜欢这本书,或者发现它在任何方面都是有帮助或有用的时候,你才需要买它。 36 | 37 | 现在你们都准备好了。好好读吧! 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /doc/1.md: -------------------------------------------------------------------------------- 1 | # Chapter 1 导论 2 | ## 3 | 4 | ## 1.1 机器学习是什么? 5 | 6 | 机器学习是一个与构建算法有关的计算机科学的子领域,这些算法很有用,它依赖于某些现象的实例收集是有用的。这些实例可以来自自然,由人类手工设计或由另一种算法产生。 7 | 8 | 机器学习也可以定义为通过收集数据集来解决实际问题的过程。假设这个统计模型是用来解决实际问题的。 9 | 10 | 本书交替使用“学习”和“机器学习”这两个术语。 11 | ## 1.2学习类型 12 | 学习可以是监督的、半监督的、非监督的和强化的。 13 | 14 | ### 1.2.1 监督学习 15 | 16 | 在**监督学习**中,**数据集**是**标签示例**{(xi,yi)} Ni=1的集合。(如果术语以**粗体**显示,则表示该术语可以在本书末尾的索引中找到。) 17 | 18 | N中的每个元素xi称为**特征向量**。特征向量是这样的一种向量,它每个维度j = 1,...D包含一个以某种方式描述该样本的值。这些值被称为**特征**,表示为x(j)。例如,如果每个样本x在我们的集合代表一个人,然后第一个特征x(1),可以包含高度(厘米),第二个特征x(2),可以包含体重(千克),第三个特征x(3)可以包含性别等等。 19 | 20 | 数据集中的所有样本,特征向量中位置j处的特征始终包含同样的信息。这意味着在某一样本xi中,如果x(2)i包含重量(千克)的信息,那么,当k = 1 ,. 。 。 ,N时,在每个样本xk中的x(2)k都会包含重量(千克)的信息。 21 | 要么是属于有限的一组类{1,2,...的元素。 。 。 ,C},或实数,或更复杂的结构,如矢量,矩阵,树或图形。除非另有说明,否则本书yi是一组有限的类或实数2。你可以看到一个班级示例所属的类别。例如,如果您的示例是电子邮件并且您的问题是垃圾邮件检测,那么您有两个类{spam,not_spam}。 22 | 23 | 监督学习算法的目标是使用数据集生成一个模型,以特征向量x作为输入和输出信息以便推断标签特征向量。例如,使用人员数据集创建的模型可以视为输入描述一个人的特征向量,并输出该人患癌症的概率。 24 | 25 | 26 | ### 1.2.2 无监督学习 27 | 28 | 在无监督学习中,数据集是未标记示例的集合 {Xi}Ni=1 29 | x 是一个特征向量,无监督学习算法的目标是创建一个以特征向量 x 作为输入并将它转换为另一个向量或数值来用于解决实际问题的模型。例如,在聚类中,模型返回数据集中每个特征向量的群集ID。在维度减少中,模型的输出是一个特征向量,其特征比输入的x要少;其输出是一个实数,预测x与数据集中的"典型"示例是如何不同的。 30 | 31 | ### 1.2.3 半监督学习 32 | 33 | 在半监督学习中,数据集包含标记和未标记的示例。通常,未标记示例的数量远远高于标记示例的数量。半监督学习算法的目标与监督学习算法相同。希望使用许多未标记的示例可以帮助学习算法找到更好的模型(我们可以说"生成"或"计算")。 34 | 学习可能因为添加更多未标记的示例而受益,这似乎有悖常理。似乎我们给这个问题增加了更多的不确定性。但是,当您添加未标记的示例时,会添加有关问题的详细信息:较大的示例反映了我们标记数据更好的概率分布。从理论上讲,学习算法应该能够利用这些附加信息。 35 | 36 | ### 1.2.4 强化学习 37 | 38 | 强化学习是机器学习的一个子领域,机器"生活在"环境中,能够感知该环境的状态作为特征的载体。计算机可以在每种状态下执行操作。不同的行动带来不同的奖励,也可以将机器移动到环境的另一种状态。强化学习算法的目标是学习策略。 39 | 策略是一个函数(类似于监督学习中的模型),将状态的特征向量作为输入并输出,以该状态执行的最佳操作。如果操作是最佳的,则为最佳操作最大化预期的平均回报。 40 | 强化学习解决了一种特殊的问题,其中决策是连续的,目标是长期的,例如游戏、机器人、资源管理或物流。在此书,我强调一次性决策,其中输入实例是彼此独立的和过去式预测。我把强化学习排除在本书的讨论范围之内。 41 | 42 | ## 1.3 监督学习的工作原理 43 | 44 | 在这一部分中,我简要地解释了有监督的学习是如何工作的,这样在我们详细讨论之前的整个过程你脑海中就有了一定的画面。我决定把监督学习作为 45 | 例子,因为它是在实际中最常用的机器学习类型。 46 | 47 | 监督学习的过程从收集数据开始。监督学习的数据是成对的集合(输入、输出)。输入可以是任何内容,例如电子邮件,信息,图片或传感器测量。输出通常是实数或标签(例如“垃圾邮件”、“非垃圾邮件”、“猫”、“狗”、“老鼠”等)。在某些情况下,输出是向量(例如,图片上一个人周围矩形的四个坐标),序列(例如[“形容词”,“形容词”、“名词”]表示输入“大且漂亮的车”),或有其他结构。 48 | 49 | 假设您希望使用监督学习解决的问题是垃圾邮件检测。你收集数据,例如,10000封电子邮件,每个邮件都有一个标签“垃圾邮件”或“非垃圾邮件”(你可以手动添加这些标签,也可以花钱请人为我们添加)。现在,您必须将每个电子邮件转换为特征向量。 50 | 51 | 数据分析师根据他们的经验决定如何将一个真实的实体转换一个特征向量,例如一封电子邮件。词袋模型是一种将文本转换为特征向量的常见方法,它是取一本英语单词词典(假设它包含20000个单词,其中单词是通过字母顺序划分的),并在我们的特征向量中规定: 52 | 53 | 如果电子邮件中包含单词“a”,则第一个特征等于1;否则,这特征是0; 54 | 55 | 如果电子邮件中包含单词“aaron”,则第二个特征等于1;否则,该特征值为0; 56 | 57 | **......** 58 | 59 | 如果电子邮件中包含单词“zulu”,则第20000个特征等于1;否则,该特征值为0。 60 | 61 | 您可以对我们集合中的每一封电子邮件重复上述步骤,我们的集合有10000个特征向量(每个向量的维数为20000)和一个标签(“垃圾邮件”/“非垃圾邮件”)。 62 | 63 | 现在您有了一个机器可读的输入数据,但是输出标签仍然是人类可读的文本。一些学习算法需要把标签转换成数字。例如,有些算法需要像0这样的数字(表示标签“非垃圾邮件”)和1(表示“垃圾邮件”标签)。我用来解释监督学习的这种算法称为支持向量机(SVM)。该算法要求正标签(在此例中是“垃圾邮件”),数值为+1(1),负标签(“非垃圾邮件”)值为- 1。 64 | 65 | 此时,您已经有了一个数据集和一个学习算法,所以您已经准备好应用学习算法,得到数据集的模型。 66 | 67 | SVM将每个特征向量看作高维空间中的一个点(在我们的例子中是高维空间是20000 -维)。该算法将所有特征向量放在一个假想的20,000-高维图,并绘制一个假想的19,999维的线(超平面),它将带有正负面标签的例子分开。在机器学习中,将不同类的示例分隔开的边界称为决策边界。 68 | 69 | 超平面的方程由两个参数给出,一个实值向量w,它和输入特征向量x维数相同,和实数b。 70 | 71 |             wx − b = 0 72 | 表示wx意味着w(1)x(1) + w(2)x(2) +…+ w(D)x(D)和D是代表特征向量x维度的数字。   73 | 74 | (如果一些方程现在不清楚,在第 2 章中,我们重新审视数学和统计,理解它们所必需的概念。就目前而言,试着去了解此处是什么含义。阅读下一章后,一切都变得更加清晰。)   75 | 76 | 现在,一些输入的特征向量 x 的预测标签如下所示:   77 | 78 |           y = sign(wx − b),   79 | 80 | 其中*sign*是一个数学运算符,该运算符将任何值作为输入,如果输入为正例,返回+1。如果输入为负例,返回-1。 81 | 82 | 学习算法 (本例中为 SVM)的目标是利用数据集并查找参数w星号和b*的最佳值w和b。 83 | 84 | 一旦学习算法确定然后,将模型f(x)定义为: 85 |           f(x) = sign(w*x − b) 86 | 87 | 88 | 89 | 因此,要使用SVM模型预测电子邮件是垃圾邮件还是非垃圾邮件,您必须获取消息的文本,将其转换为特征向量,然后将其相乘 90 | w*的向量,减去b,并取符号作为结果。 这将给我们预测(+1表示“垃圾邮件”,-1表示“ 非垃圾邮件”)。 91 | 92 | 现在,机器如何找到w*和b? 它解决了优化问题。 机器是擅长在约束下处理优化问题的。 93 | 94 | 那么我们要在这里满足哪些约束? 首先,我们希望模型能够正确预测10,000个示例的标签。 请记住,每个示例i = 1。 。 。 ,10000由一对(xi,yi)给出,其中xi是示例i的特征向量,而yi是其标签,其标签使用值-1或+1。 因此,约束自然是: 95 | 96 | wxi − b ≥ +1 当 yi = +1, 97 | wxi − b ≤ −1 当 yi = −1。 98 | 99 | 我们也希望超平面将具有最大限量的正例与负例分开。 **决策**距离是两个类别的最接近示例之间的距离,由决策边界定义。 较大的决策距离有助于更好的泛化,这就是模型将来对新示例进行分类的程度。为此,我们需要 100 | 最小化w的欧几里得范数,表示为||w||,由![](https://i.imgur.com/RoHUALP.png)计算得来。 101 | 102 | 因此,我们要机器解决的优化问题看起来像这样: 103 | 104 | 最小化||w||, 服从 yi(wxi-b)≥1,i=1,...N。表达式yi(wxi-b)≥1只是上面两个约束的一种紧凑方式。 105 | 106 | 由w*和b给出的此优化问题的解决方案称为统计模型,或简称为模型。 建立模型的过程称为训练。 107 | 108 | 对于二维特征向量,问题和解决方案如图1.1所示。蓝色和橙色圆圈分别表示正例和负例,并且wx-b = 0给出的线是决策边界。 109 | 110 | 为什么通过最小化w的范数来找到两个类别之间的最大边界范围?如图1.1所示,从几何上讲,方程wx-b = 1和wx-b = -1定义了两个平行的超平面,这些超平面之间的距离为2/||w||,因此,范数||w||越小,这两个超平面之间的距离越大。 111 | 112 | 支持向量机就是这样工作的。该算法的特定版本建立了所谓的线性模型。之所以称为线性,是因为决策边界是直线(或平面或超平面)。 SVM还可以合并内核,这些内核可以使决策边界任意非线性化。在某些情况下,由于数据中的噪声,标注错误或离群值(示例与数据集中的“典型”示例截然不同),可能无法完全分离两组点。 SVM的另一个版本也可以包含惩罚超参数,用于对特定类别的训练示例进行错误分类。我们将在第3章中更详细地研究SVM算法。 113 | 114 | 此时,您应该保留以下内容:任何隐式或显式构建模型的分类学习算法都会创建决策边界。决策边界可以是直的或弯曲的,或者可以具有复杂的形式,也可以是某些几何图形的叠加。决策边界的形式决定了模型的准确性(即正确预测了标签示例的比例)。决策边界的形式(基于训练数据进行算法或数学计算的方式)将一种学习算法与另一种学习算法区分开。 115 | 116 | 在实践中,还需要考虑学习算法的其他两个基本区别:模型构建的速度和预测处理时间。 在许多实际情况下,您可能希望使用一种学习算法,该算法可以快速建立不太准确的模型。 此外,您可能更喜欢精度较低的模型,该模型可以更快地进行预测。 117 | 118 | ## 1.4 模型为什么适用于新数据 119 | 120 | 为什么机器学习模型能够正确预测以前新示例看不到的标签?要理解这一点,请查看图 1.1 中的图。如果两个类通过决策边界彼此分离,则属于每个类的示例显然位于决策边界创建的两个不同的子空间中。 121 | 如果用于训练的示例是随机选择的,彼此独立,并遵循相同的过程,那么,从统计上看,新的负例更有可能位于离其他负例不远的图上。同样,新的正例它很可能围绕在自其他正例。在这种情况下,我们的决定边界仍然极有可能将新的正负两方面的例子分开。对于其他不太可能的情况,我们的模型会出错,但由于此类情况的可能性较小,因此错误数可能小于正确预测的数量。 122 | 直观地说,训练示例集越大,**新示例与用于训练的示例,相同的可能性就越大。**(还需校对)。 123 | 124 | 为了尽可能降低在新示例中出错的可能性,SVM 算法通过查找最大的边距,精确试图绘制决策边界,使它尽可能远离从两个类的示例。 125 | 有兴趣更多地了解可学习性和了解模型误差之间的密切关系,训练集的大小,数学方程的形式定义模型,构建模型所需的时间的读者,鼓励阅读有关PAC的内容。PAC("可能近似正确")学习理论有助于分析学习算法在什么条件下或者说可能在什么条件下输出一个近似正确的分类器。 126 | -------------------------------------------------------------------------------- /doc/10.md: -------------------------------------------------------------------------------- 1 | # 其它形式的学习 2 | 3 | ## 10.1 度量学习(Metric Learning) 4 | 5 | 我曾提到过衡量两个特征向量之间相似性(或差异)最常用的度量是欧氏距离和余弦相似性。这种度量选择似乎是符合逻辑,但实际上是随意的,就像在线性回归中选择平方误差一样。事实上,一个指标可以比另一个指标性能更好,取决于特定的数据集。也就是说,没有一种指标是永远完美的。 6 | 7 | 您可以创建更适合您的数据集的指标。然后可以将您的度量标准集成到任何需要度量标准的学习算法中,例如 k-means 或 kNN。您如何在不尝试所有可能性的情况下知道哪个方程式是一个好的度量标准?您可以用数据训练您的度量标准。 8 | 9 | 比如两个向量 x 和 x` 间的欧氏距离: 10 | 11 | $$ 12 | d\left(\mathbf{x}, \mathbf{x}^{\prime}\right) \stackrel{\mathrm{def}}{=} \sqrt{\left(\mathbf{x}-\mathbf{x}^{\prime}\right)^{2}}=\sqrt{\left(\mathbf{x}-\mathbf{x}^{\prime}\right)\left(\mathbf{x}-\mathbf{x}^{\prime}\right)} 13 | $$ 14 | 15 | 我们可以稍微修改此指标以使其可参数化,然后从数据中学习这些参数。 16 | 请考虑以下修改: 17 | 18 | $$ d_{\mathbf{A}}\left(\mathbf{x},\mathbf{x}^{\prime}\right)=\left\|\mathbf{x}-\mathbf{x}^{\prime}\right\| \mathbf{A} \stackrel{\mathrm{def}}{=} \sqrt{\left(\mathbf{x}-\mathbf{x}^{\prime}\right)^{\top} \mathbf{A}\left(\mathbf{x}-\mathbf{x}^{\prime}\right)} $$ 19 | 20 | 其中 A 是 D× D 矩阵。假设 D = 3.如果我们让 A 为单位矩阵, 21 | 22 | $$ 23 | \mathbf{A} \stackrel{\operatorname{def}}{=}\left[\begin{array}{lll}{1} & {0} & {0} \\ {0} & {1} & {0} \\ {0} & {0} & {1}\end{array}\right] 24 | $$ 25 | 26 | 则 dA 为欧几里德距离。如果我们有一个通用的对角矩阵,像这样, 27 | 28 | $$ 29 | \mathbf{A} \stackrel{\operatorname{def}}{=}\left[\begin{array}{lll}{2} & {0} & {0} \\ {0} & {8} & {0} \\ {0} & {0} & {1}\end{array}\right] 30 | $$ 31 | 32 | 那么不同的维度在度量标准中具有不同的重要性。(在上面的例子中,第二个维度是度量计算中最重要的。)更一般地说,为了表示一个度量,两个变量的函数必须满足三个条件: 33 | 34 | $$ 35 | \begin{array}{ll}{\text { 1. } d\left(\mathbf{x}, \mathbf{x}^{\prime}\right) \geq 0} & {\text { nonnegativity }} \\ {\text { 2. } d\left(\mathbf{x}, \mathbf{x}^{\prime}\right) \leq d\left(\mathbf{x}, \mathbf{x}^{\prime}\right)+d\left(\mathbf{x}^{\prime}, \mathbf{z}\right)} & {\text { triangle inequality }} \\ {\text { 3. } d\left(\mathbf{x}, \mathbf{x}^{\prime}\right)=d\left(\mathbf{x}^{\prime}, \mathbf{x}\right)} & {\text { symmetry }}\end{array} 36 | $$ 37 | 38 | 为了满足前两个条件,矩阵必须是半正定的。你可以看到一个半正定矩阵作为非负实数对矩阵的概念的推广。任何半正定矩阵 M 满足: 39 | 40 | $$ 41 | \mathbf{z}^{\top} \mathbf{M z} \geq 0 42 | $$ 43 | 44 | 上述性质遵循半正定矩阵的定义。可以在本书的配套网站上找到半正定矩阵满足第二个条件证明。 45 | 为了满足第三个条件,我们可以简单地计算 $\left(d\left(\mathbf{x}, \mathbf{x}^{\prime}\right)+d\left(\mathbf{x}^{\prime}, \mathbf{x}\right)\right) / 2$ 46 | 47 | 假设我们有一个未标注数据集 $\mathcal{X}=\left\{\mathbf{x}_{i}\right\}_{i=1}^{N}$。为了构建我们的度量学习问题的训练数据,我们手动创建两组。第一个数据集 S 包含这样的样本 $\left(\mathbf{x}_{i}, \mathbf{x}_{k}\right)$ ,其中 $x_{i}$ 和 $x_{k}$ 相似(从我们的主观角度来看)。第二个数据集 D 包含样本(xi,xk),其中 $x_{i}$ 和 $x_{k}$ 不相似。 48 | 49 | 为了从数据中训练参数矩阵 A,我们希望找到一个半正定矩阵 A 来解决以下优化问题: 50 | 51 | $$ 52 | \min _{\mathbf{A}} \sum_{\left(\mathbf{x}_{i}, \mathbf{x}_{k}\right) \in \mathcal{S}}\left\|\mathbf{x}-\mathbf{x}^{\prime}\right\|_{\mathbf{A}}^{2} \text { such that } \sum_{\left(\mathbf{x}_{i}, \mathbf{x}_{k}\right) \in \mathcal{D}}\left\|\mathbf{x}-\mathbf{x}^{\prime}\right\| \mathbf{A} \geq c 53 | $$ 54 | 55 | c 为正常数(可以是任何数)。 56 | 57 | 这种优化问题的解决方案是通过梯度下降和修改来确定的,确保找到的矩阵A是半正定的。本书未提及具体的算法描述,以供进一步阅读。您应该知道还有许多其他方法可以学习度量,包括非线性和基于核的方法。但是,本书中介绍的方法可以为大多数实际问题提供良好的结果。 58 | 59 | ![10-1](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/10-1.png) 60 | 61 | ## 10.2 排序学习(Learning to Rank) 62 | 63 | 排序学习是一个有监督的学习问题。其中,使用排序学习的一个常见问题是搜索引擎为查询返回的搜索结果的优化。在搜索结果排名优化中,N 个样本的训练集中一个带标签的样本 $\mathcal{X}_{i}$ 是关于文档大小 $r_{i}$ 的排序集合(标签是文档的排名)。一个特征向量表示集合中的每个文档。学习的目标是确定排序函数,其输出的值可用于对文档进行排名。对于每个训练样本,一个理想的函数的输出应该根据给出的标签包含相同排名的文档。 64 | 65 | 每个样本 $\mathcal{X}_{i}$, i = 1,...,N, 是一个带标签的特征向量:$\mathcal{X}_{i}=\left\{\left(\mathbf{x}_{i, j}, 3 i, j\right)\right\}_{j=1}^{r} .$ 特征向量 $\mathbf{x}_{i, j}$ 代表着文档 $j=1, \ldots, r_{i}$ 。比如, $\mathbf{x}_{i, j}^{(1)}$ 可以表示文本的近期情况, $\mathbf{x}_{i, j}^{(2)}$ 将反映是否可以在文档标题中找到查询的单词, $\mathbf{x}_{i, j}^{(1)}$ 代表着文档的大小,等等。而标签 $y_{i, j}$ 代表着排名 $\left(1,2, \ldots, r_{i}\right)$ 或分数。例如,分数越低,文档应该排名越高。 66 | 67 | 解决这种学习问题有三种主要方法:单文档方法(Pointwise),文档对方法(Pairwise),文档列表方法(Listwise)。 68 | 69 | 单文档方法将每个样本转化为多个样本:每个文档对应一个样本。学习问题是标准的监督学习问题,无论是线性回归还是逻辑回归。单文档方法中的每个样本 $(\mathbf{x}, y)$ ,X 是一些文档的特征向量,y 是初始分数(如果 $y_{i, j}$ 是分数)或从排名中获得的合成分数(排名越高,合成分数越低)。在这种情况下可以使用任何监督学习算法。解决方案通常是不完美的。原则上,这是因为每个文档被孤立地考虑,而原始排名(由原始训练集的标签 $y_{i, j}$ 给出)会优化其在整个文档集的位置。例如,如果我们已经在某些文档集合中给予某个维基百科页面高排名,我们就不会对同一查询的另一个维基百科页面给出高排名。 70 | 71 | 文档对方法中存在的问题也是将文档孤立地考虑,然而,在这种情况下,每次会考虑一对文档。给定一对文档 $\left(\mathrm{x}_{i}, \mathrm{x}_{k}\right)$ ,我们想要建立一个模型 f,将给定 $\left(\mathrm{x}_{i}, \mathrm{x}_{k}\right)$ 作为输入,如果 $\mathrm{x}_{i}$ 要比 $\mathrm{x}_{k}$ 排名更高,则输出接近 1 的值。否则,f 输出一个接近 0 的值。在测试时,给定一个模型,通过聚合 X 中所有文档对的预测获得未标记的样本 X 的最终排名。这种方法比单文档方法更好,但仍远非完美。 72 | 73 | 最先进的排序学习算法,例如 LambdaMART,实现了文档列表方法。在列表方法中,我们尝试直接在一些反映出排名质量的度量上优化模型。评估搜索结果排名有各种指标,包括精确度和召回率。将精确度和召回率相结合的一种常用度量称为平均精度(MAP)。 74 | 75 | 要定义 MAP,让我们让评委(谷歌称那些人是 rankers )检查查询的搜索结果集合,并为每个搜索结果分配相关性标签。标签可以是二进制的(1 表示“相关”,0 表示“不相关”)或某种尺度,例如 1 到 5:值越高,文档与搜索查询的相关性越高。让我们的评委为 100 个查询的集合构建相关标签。现在,让我们测试一下这个系列的排名模型。我们的模型对某些查询的精度由下式给出: 76 | 77 | $$ 78 | \text { precision }=\frac{ |\{\text { relevant documents }\} \cap\{\text { retrieved documents }\} |}{ |\{\text { retrieved documents }\} |} 79 | $$ 80 | 81 | 这里的 |·| 代表数量。 82 | 83 | 平均精度度量标准 AveP 定义为搜索引擎为查询 q 返回的排序文档集合: 84 | 85 | $$ 86 | \operatorname{AveP}(q)=\frac{\sum_{k=1}^{n}(P(k) \times \operatorname{rel}(k))}{ |\{\text { relevant documents }\} |} 87 | $$ 88 | 89 | 其中 n 是检索到的文档的数量。 90 | 91 | $P(k)$ 表示由我们的查询排名模型返回的前 k 个搜索结果计算的精度,如果排名 k 的是相关文档(根据评判),则 $rel(k)$ 是等于 1 的指标函数,否则,函数值为零。最后,给出大小为 Q 的搜索查询集合的 MAP, 92 | 93 | $$ 94 | \mathrm{MAP}=\frac{\sum_{q=1}^{Q} \operatorname{AveP}(\mathrm{q})}{Q} 95 | $$ 96 | 97 | 现在我们回到 LambdaMART。该算法实现了文档对方法,并使用梯度增强来训练排序函数 $h(k)$。预测文档 $\mathbf{x}_{i}$ 是否具有比文档 $\mathbf{x}_{k}$ 更高的等级(对于相同的搜索查询)的二进制模型 $f\left(\mathbf{x}_{i}, \mathbf{x}_{k}\right)$ 由具有超参数 α 的 sigmoid 函数给, 98 | 99 | $$ 100 | f\left(\mathbf{x}_{i}, \mathbf{x}_{k}\right) \stackrel{\mathrm{def}}{=} \frac{1}{1+\exp \left(\left(h\left(\mathbf{x}_{\mathbf{i}}\right)-h\left(\mathbf{x}_{\mathbf{k}}\right)\right) \alpha\right.} 101 | $$ 102 | 103 | 同样,与许多预测概率的模型一样,使用模型 f 对代价函数进行交叉熵计算。在梯度提升中,我们通过尝试最小化 cost 来组合多个回归树来构建函数 h。请记住,在梯度提升中,我们向模型添加树以减少当前模型对训练数据的误差。对于分类问题,我们计算了代价函数的导数,用这些导数代替训练样例的实际标签。LambdaMART 的工作方式类似,只有一个例外。它使用梯度和取决于度量的另一个因子(例如 MAP)的组合来替换实际梯度。该因子通过增加或减少原始梯度来修改原始梯度,从而提高度量值。 104 | 105 | 这是一个非常明智的想法,并不是很多监督学习算法可以直接提升他们的优化度量( matric )。优化度量是我们真正想要的,但我们在典型监督学习算法中所做的是优化代价 ( cost ) 而不是度量(matric)。通常,在监督学习中,一旦我们找到优化代价函数的模型,我们就会尝试调整超参数以提高度量的值。而 LambdaMART 直接优化度量标准 106 | 107 | 剩下的问题是我们如何基于模型 f 的预测来构建排序的结果列表,模型 f 预测其第一个输入是否必须高于第二个输入。它通常是计算上难以解决的问题,并且存在多种能够将文档对比较转换为排序列表的工具。最直接的方法是使用现有的排序算法。 108 | 109 | 排序算法按递增或递减顺序对数字集合进行排序。(最简单的排序算法称为冒泡排序,工程学院中通常会教授它。)通常,排序算法迭代地比较集合中的一对数字,并根据比较结果更改列表中的位置。如果我们将函数 f 插入到排序算法中以执行此比较,则排序算法将对文档而不是数字进行排序。 110 | 111 | ![10-2](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/10-2.png) 112 | 113 | ## 10.3 推荐学习(Learning to Recommend) 114 | 115 | 推荐学习是一种构建推荐系统的方法。通常,我们有一个消费某些内容的用户。我们有消费历史,我们希望向用户推荐用户想要的新内容。它可能是 Netflix 上的一部电影或亚马逊上的一本书。 116 | 117 | 传统上,有两种方法用于提供推荐:基于内容的过滤(content-based filtering)和协作过滤(collaborative filtering)。 118 | 119 | 基于内容的过滤通过基于他们消费的内容的描述来学习用户喜欢什么。例如,如果新闻网站的用户经常阅读有关科学和技术的新闻文章,那么我们会向该用户建议更多关于科学和技术的文献。更一般地,我们可以为每个用户创建一个训练集,并将新闻文章添加到该数据集作为特征向量 x 以及用户最近是否将该新闻文章作为标签 y 阅读。然后我们构建每个用户的模型,并定期检查每个新内容以确定特定用户是否会读取它。 120 | 121 | 基于内容的方法有许多限制。例如,用户可能被困在所谓的过滤泡沫中:系统将始终向该用户建议看起来与用户已经消费的非常相似的信息。这可能导致用户完全隔离不同于他们的观点或扩展他们的信息。在更实际的方面,用户可能只是获得他们已经知道的项目的推荐,这是不合需要的。 122 | 123 | 协作过滤相对于基于内容的过滤具有显着优势:对一个用户的推荐是基于其他用户消费或评价的内容计算的。例如,如果两个用户对相同的十个电影给予高评价,那么用户 1 更可能会欣赏基于用户 2 的品味而推荐的新电影,反之亦然。这种方法的缺点是忽略了推荐项目的内容。 124 | 125 | 在协作过滤中,关于用户偏好的信息以矩阵形式组织。每行对应一个用户,每列对应一个用户评价或消费的内容。通常,这个矩阵非常庞大且非常稀疏,这意味着它的大部分单元都没有填充(或填充为零)。这种稀疏性的原因是大多数用户仅消耗或评估可用内容项的一小部分。基于这样的稀疏数据很难做出有意义的推荐。 126 | 127 | 大多数现实中的推荐系统使用混合方法:它们结合了基于内容和协作过滤模型获得的推荐。 128 | 129 | 我已经提到过基于内容的推荐模型可能是使用分类或回归模型构建,该模型预测用户是否会根据内容的特征来喜欢内容。特征的示例可以包括用户喜欢的书籍或新闻文章中的词语,价格,内容的新近度,内容作者的身份等等。 130 | 131 | 两种有效的协同过滤学习算法是 因子分解机 (FM)和去噪自动编码器(DAE)。 132 | 133 | ### 10.3.1 因子分解机 (Factorization Machines) 134 | 135 | 因子分解机是一种相对较新的算法。它是为稀疏数据集而设计的。让我们来解释这个问题。 136 | 137 | ![图 1:稀疏特征向量 x 及其各自标签 y 的示例](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/10-3-1.png) 138 | 139 | 在图 1,您会看到带标签的稀疏特征向量的示例。每个特征向量表示有关一个特定用户和一个特定电影的信息。蓝色部分中的功能代表用户。用户被编码为独热矢量 (one-hot vectors)。绿色部分中的功能代表电影。电影也被编码为独热矢量。黄色部分中的功能表示绿色用户对其评级的每部电影的分数。特征 $x_{99}$ 表示特定用户观看的电影与奥斯卡的比例。特征 $x_{100}$ 表示​​用户在以绿色评分电影之前以蓝色观看的电影的百分比。目标 y 表示用户以蓝色给予电影的绿色分数。 140 | 141 | 在真正的推荐系统中,用户数量可以达到数百万,所以矩阵就可以了。1 将计数数亿行。功能的数量可能达到数十万,具体取决于内容选择的覆盖范围以及作为数据分析师在特征工程中的创造性。特征 $x_{99}$ 和 $x_{100}$ 是在特征工程过程中手工制作的,我只是为了说明的目的而展示了两个特征。 142 | 143 | 如果对这样一个非常稀疏的数据集进行回归或分类模型,实际上会导致泛化性非常差。因子分解机以不同的方式解决这个问题。 144 | 145 | 因子分解机模型的定义如下: 146 | 147 | $$ 148 | f(\mathbf{x}) \stackrel{\mathrm{def}}{=} b+\sum_{i=1}^{D} w_{i} x_{i}+\sum_{i=1}^{D} \sum_{j=i+1}^{D}\left(\mathbf{v}_{i} \mathbf{v}_{j}\right) x_{i} x_{j} 149 | $$ 150 | 151 | 其中 $b$ 和 $w_{i}, i=1, \ldots, D$ 是与标准回归相似的标量参数。向量 $v_{i}, i=1, \ldots, D$ ,是因子的 k 维向量。k 是一个超参数,通常比 D 小得多。表达式 $\left(\mathbf{v}_{i} \mathbf{v}_{j}\right)$ 是因子的第 i 个和第 j 个向量的点积。正如您所看到的,我们不是试图找到一个宽的参数向量,而是由于稀疏性而能够反映出特征之间的不良交互,我们通过适用于特征之间的成对交互 $x_{i} x_{j}$ 的附加参数来完成它。然而,我们不是为每个交互设置一个参数 $w_{i, j}$,而是为模型添加了大量的新参数(注:更确切地说,我们将添加 D(D-1) 个参数 $w_{i, j}$,我们仅将满足 $D k \ll D(D-1)$ 的参数添加到模型来将 $w_{i, j}$ 分解为 $v_{i} v_{j}$ 。 152 | 153 | 根据问题,损失函数可以是平方误差损失(用于回归)或铰链损失(hinge loss)。对于 $y \in\{-1,+1\}$ 的回归问题,在铰链损失或 logistic 损失的情况下,预测为 $y=\operatorname{sign}(f(x))$。 logistic 损失定义为, 154 | 155 | $$ 156 | \operatorname{loss}(f(\mathbf{x}), y)=\frac{1}{\ln 2} \ln \left(1+e^{-y f(\mathbf{x})}\right) 157 | $$ 158 | 159 | 梯度下降可用于优化平均损失。在图 1 中的示例中,标签为 { 1, 2, 3, 4, 5} ,所以这是一个多类问题。我们可以使用一个与休息策略将这个多类问题转换成五个二分类问题。 160 | 161 | ### 10.3.2 去噪自动编码器(Denoising Autoencoders) 162 | 163 | 在第 7 章,您就知道去噪自动编码器是什么:它是一个从瓶颈层重建其输入的神经网络。事实上,输入被噪声破坏,而输出不受影响,使得自动编码器成为理想的建模工具。 164 | 165 | 这个想法非常简单:用户喜欢的新电影被视为因为一些错误过程从完整的电影数据集中移除的。去噪自动编码器的目标是重建那些被移除的项目。 166 | 167 | 要为我们的去噪自动编码器准备训练集,请从图 1 训练集中删除蓝色和绿色特征。因为现在一些例子重复,只保留唯一的例子。 168 | 169 | 在训练时,使用零随机替换输入向量中的一些非零黄色要素。训练自动编码器以重建未损坏的输入。 170 | 171 | 在预测时,为用户构建特征向量。特征向量将包括未破坏的黄色特征以及 $x_{99}$ 和 $x_{100}$ 等手工制作的特征。使用训练有素的 DAE 模型重建未损坏的输入。推荐用户在模型输出中得分最高的电影。 172 | 173 | 另一种有效的协同过滤模型是具有两个输入和一个输出的前馈神经网络。还记得第8章中说,神经网络善于处理多个同时输入。这里的训练样本是三元组(u,m,r)。输入向量 u 是用户的独热码。第二输入向量 m 是电影的独热码。输出层可以是 sigmoid(在这种情况下标签 r 在 [0,1] 中)或 ReLU,在这种情况下 r 可以在某些特殊范围内,例如 [1,5]。 174 | 175 | ![10-3](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/10-3.png) 176 | 177 | ## 10.4 自监督学习:词嵌入 (Word Embeddings) 178 | 179 | 我们已经在第7章讨论过 Word Embeddings。回想一下,词嵌入向量是单词的特征向量。它们具有一种特性:相似单词具有相似单词向量。您可能想问的问题是这些词嵌入向量来自何处。答案是:从数据中学习它们。 180 | 181 | 学习 Word Embeddings 有很多算法。在这里,我们只详细介绍其中一个:skip-gram(word2vec的一个特定版本),在实践中效果很好。可以在线下载多种语言的预训练 word2vec 嵌入模型。 182 | 183 | 在单词嵌入学习中,我们的目标是构建一个模型,我们可以使用该模型将单词的独热码(one-hot)转换为词嵌入。假如我们的字典包含 10000 个单词。每个单词的一个独热码向量是一个 10000 维向量的全零向量,除了一个包含 1 的维度。不同的单词在不同的维度上为 1。 184 | 185 | 考虑一句话:“I almost finished reading the book on machine learning.” 现在,考虑一下我们删除了一些单词的相同句子,比如 “book.” 我们的句子变成:“I almost finished reading the · on machine learning.” 现在让我们只保留 “ · ”之前三个单词和在它之后的三个词:“finished reading the · on machine learning.”看着这个七字窗口,如果我要求你猜猜 “ · ” 代表什么,你可能会说:“book,” “article,” 或者 “paper.” 这就是上下文单词如何让你预测它们所包围的单词。这也是机器如何发现 “book,” “article,” 或者 “paper.” 这几个词的含义相似:因为它们在多个文本中共享相似的语境。 186 | 187 | 它也可以反向工作的:一个词可以预测它上下文环境。“finished reading the · on machine learning” 这一部分被称为具有窗口大小为 7(3 + 1 + 3)的 skip-gram。通过使用 Web 上提供的文档,我们可以轻松创建数亿个 skip-gram。 188 | 189 | 让我们用这样的skip-gram表示单词:$\left[\mathbf{X}_{-3}, \mathbf{X}_{-2}, \mathbf{X}_{-1}, \mathbf{X}, \mathbf{X}_{+1}, \mathbf{X}_{+2}, \mathbf{X}_{+3}\right]$。在我们上面的例句中,$\mathbf{X}_{-3}$ 是 “finished,” 的独热矢量,$\mathbf{X}_{-2}$ 对应于 “reading,” $\mathbf{X}$ 是跳过的单词(·),$\mathbf{X}_{+1}$ 是 “on” ,依此类推。窗口大小为 5 的 skip-gram 将如下所示:$\left[\mathbf{X}_{2}, \mathbf{X}_{-1}, \mathbf{X}, \mathbf{X}_{+1}, \mathbf{X}_{+2}\right]$。 190 | 191 | 具有窗口大小 5 的 skip-gram 模型如图 2 所示。它是一个全连接的网络,就像多层感知机一样。输入单词是我们的 skip-gram 中表示为 · 的单词。神经网络必须学会在给定中心词的情况下预测 skip-gram 的上下文单词。 192 | 193 | ![图 2:窗口大小为 5 的 skip-gram 模型和 300 个单元的嵌入层。](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/10-4-1.png) 194 | 195 | 您现在可以明白为什么这种学习被称为自监督:标记的样本从未标记的数据(如文本)中提取。 196 | 197 | 输出层中使用的激活函数是 softmax。cost 函数是负对数似然(negativelog-likelihood)。当给出该单词的独热码作为模型的输入时,获得单词的嵌入向量作为嵌入层的输出。 198 | 199 | 由于 word2vec 模型中有大量参数,因此可以使用两种技术使计算更加高效:hierarchical softmax(计算 softmax 的一种有效方法,包括将 softmax 的输出表示为二叉树的叶)和负采样(基本上,这个想法只是为每次迭代下降迭代更新所有输出的随机样本)。我们留下这些以供进一步阅读。 200 | 201 | ![10-4](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/10-4.png) 202 | -------------------------------------------------------------------------------- /doc/11.md: -------------------------------------------------------------------------------- 1 | # 11. 总结 2 | 3 | 哇,太快了!如果你到了这里并且设法理解了大部分的好的材料,那你真的很厉害。 4 | 5 | 如果你注意到本页的底部的数字,你会发现本书远超百页,这意味着书名有点误导。我希望你能原谅这个小小的营销手法。毕竟,如果我想要使这本书正好百页,我可以减少字体大小,白边距和行间距,或删除 UMAP 上的部分,让你自己去找它们。相信我:你不希望这些内容被放在 UMAP 中! 6 | 7 | 但是,先停下来,我可以自信地说你已经拥有成为一名优秀的现代数据分析师或机器学习工程师所需的一切。这并不意味着我把所有的需要的东西都包括在内,而是我在这本书中所提到的内容,你可以扩展学习很多资料。我所强调的的大部分内容根本不局限于书中:典型的机器学习书籍是保守的和学术性的,而我强调的那些将在日常工作中发挥作用的算法以及方法。 8 | 9 | 而那些我没提到的,将会在千页机器学习中提到吧? 10 | 11 | ## 11.1 主题模型 (Topic Modeling) 12 | 13 | 在文本分析中,主题模型是一种普遍的无监督学习问题。您有一组文本文档,并且您希望发现每个文档中存在的主题。Latent Dirichlet Allocation(LDA)是一种非常有效的主题发现算法。您可以决定文档集合中存在多少主题,算法会为此集合中的每个单词指定一个主题。然后,要从文档中提取主题,您只需计算该文档中每个主题的单词数。 14 | 15 | ## 11.2 高斯过程 (Gaussian Processes) 16 | 17 | 高斯过程(GP)是一种与核回归不相上下的监督学习方法。它比后者有一些优点。例如,它为每个点中的回归线提供置信区间。我决定不解释 GP,因为我无法通过一种简单的方式来解释它们,但你可以花一些时间来学习 GP。这将花费一些时间。 18 | 19 | ## 11.3 广义线性模型 (Generalized Linear Models) 20 | 21 | 广义线性模型(GLM)是线性回归的一般化,用于对输入特征向量和目标之间的各种形式的依赖性进行建模。例如,逻辑回归是 GLM 的一种形式。如果您对回归感兴趣并且寻找简单且可解释的模型,那么您应该阅读更多 GLM 方面的内容。 22 | 23 | ## 11.4 概率图模型 (Probabilistic Graphical Models) 24 | 25 | 我们在第7章中提到了概率图形模型(PGM)的一个例子:条件随机场(CRF)。使用 CRF,我们可以将单词的输入序列以及此序列中的要素和标签之间的关系建模为顺序依赖图。更一般地,PGM 可以是任何图形。图是由连接一对节点的节点和边的集合组成的结构。PGM 中的每个节点表示一些随机变量(其值可以被观察或未观察到),并且边表示一个随机变量对另一个随机变量的条件依赖性。例如,随机变量“人行道湿度”取决于随机变量“天气条件”。通过观察一些随机变量的值,优化算法可以从数据中学习观测变量和未观测变量之间的依赖性。 26 | 27 | PGM 允许数据分析师查看一个特征的值是如何依赖于其他特征的值。如果依赖图的边缘是定向的,则可以推断因果关系。不幸的是,手工构建这样的模型需要大量的领域专业知识和对概率论和统计学的深刻理解。后者通常是许多领域专家的问题。一些算法允许从数据中学习依赖图的结构,但是学习的模型通常难以被人解释,因此它们对于理解生成数据的复杂概率过程不是有益的。CRF 是目前使用最多的 PGM,主要用于文本和图像处理。然而,在这两个领域中,它们被神经网络所超越。另一种图形模型,隐马尔可夫模型或 HMM,在过去经常被用于语音识别,时间序列分析和其他时间推理任务,但是,HMM 再次败给了神经网络。 28 | 29 | PGM 的名气也在贝叶斯网络,信念网络和概率独立网络之下。 30 | 31 | ## 11.5 马尔可夫链蒙特卡洛方法 (Markov Chain Monte Carlo) 32 | 33 | 如果您使用图形模型并希望从依赖图定义的非常复杂的分布中抽样示例,则可以使用马尔可夫链蒙特卡罗(MCMC)算法。MCMC 是一类算法,用于从数学上定义的任何概率分布中进行采样。记得当我们讨论去噪自动编码器时,我们从正态分布中采样噪声。从标准分布中取样,例如正常分布或均匀分布,相对容易,因为它们的属性是众所周知的。然而,当概率分布可以具有由从数据学习的依赖图定义的任意形式时,采样任务变得显着更复杂。 34 | 35 | ## 11.6 遗传算法 (Genetic Algorithms) 36 | 37 | 遗传算法(GA)是一种用于优化不可区分的优化目标函数的数值优化技术。他们使用来自进化生物学的概念,通过模拟进化生物过程来寻找优化问题的全局最优(最小或最大)。 38 | 39 | GA 工作从初始生成候选解决方案开始。如果我们寻找模型参数的最佳值,我们首先会随机生成多个参数值组合。然后,我们针对目标函数测试参数值的每个组合。想象一下参数值的每个组合作为多维空间中的一个点。然后,我们通过应用“选择”,“交叉”和“突变”等概念,从上一代生成后续一代点。 40 | 41 | 简而言之,这导致每个新一代保持更多的点,类似于上一代中针对目标执行的那些点。在新一代中,在上一代中表现最差的点被表现最好的点的“突变”和“交叉”所取代。点的突变是通过随机失真的一些原点属性获得的。交叉是几个点的某种组合(例如,平均值)。 42 | 43 | 遗传算法允许找到任何可测量的优化标准的解决方案。例如,G A可用于优化学习算法的超参数。它们通常比基于梯度的优化技术慢得多。 44 | 45 | ## 11.7 强化学习 (Reinforcement Learning) 46 | 47 | 正如我们已经讨论过的那样,强化学习(RL)解决了一个非常具体的问题,即决策是连续的。通常,代理人在未知环境中行事。每个动作都会带来奖励并将代理移动到另一个环境状态(通常是由于某些具有未知属性的随机过程)。代理的目标是优化其长期奖励。 48 | 49 | 强制学习算法,如 Q-learning,以及基于神经网络的对应物,用于学习玩视频游戏,机器人导航和协调,库存和供应连锁管理,复杂电力系统(电网)优化和学习金融交易策略。 50 | 51 | *** 52 | 53 | 这本书在这里结束了。不要忘记偶尔看看本书的配套维基网页,以便及时了解本书中提到的每个机器学习领域的新发展。正如我在序言中所说的那样,这本书就像你去购买后的葡萄酒一样越来越好,当然这要感谢维基。哦,不要忘记这本书是先阅读,然后再买的原则。这意味着如果在阅读这些文字时你看到电子屏幕,那么你可能是购买这本书的合适人选。 54 | -------------------------------------------------------------------------------- /doc/2.md: -------------------------------------------------------------------------------- 1 | # Chapter 2 **符号和定义** 2 | 3 | ## 2.1符号 4 | 5 | 让我们从重温在学校都学过的数学符号开始,但有些内容可能在毕业晚会一结束就忘了。 6 | 7 | ### 2.1.1 数据结构 8 | 9 | 标量是一个简单的数值,如15或−3.25。采用标量值的变量或常量用斜体字母表示,如*x*或*a*。 10 | 11 | 向量是标量值的有序列表,称为属性。我们将向量表示为粗体字符,例如**x**或**w**。向量可以可视化为指向多维空间中某些方向和点的箭头。图2.1给出了三个二维向量**a**=[2,3],**b**=[−2,5]和**c**=[1,0]的例子。我们将向量的属性表示为带有索引的斜体值,例如:*w*(j)或*x*(j)。索引*j*表示向量的特定维度,即属性在列表中的位置。例如,在图2.1中以红色表示的向量a中,*a*(1)=2,*a*(2)。 12 | 13 | 符号*x*(j)不要与幂运算符混淆,如*x*2(平方)或*x*3(立方)。如果我们要将幂运算符(例如square)应用于向量,我们这样写:(*x*(j))2。 14 | 15 | 一个变量可以有两个或两个以上的索引,如:*x*i(j)或类似于*x*i,j(k)。 例如,在神经网络中,我们表示为*x*l,u(j)表示l层,u单元的输入特征j。 16 | 17 | **矩阵**是排列成行和列的数字的矩形数组。下面是一个有两行三(英文版写的是两行两列,但例子是两行三列)列的矩阵的例子,矩阵用粗体大写字母表示,例如**A**或**W**。 18 | 19 | $$ 20 | \begin{bmatrix} 21 | 2 & 4 & -3 \\ 22 | 31 & -6 & 1 23 | \end{bmatrix} \tag{4} 24 | $$ 25 | 26 | 27 | 集合是唯一元素的无序集合。我们用大写书法体字母表示一个集合。比如,***S***。集合里面的数字可以是有限的(包括一个固定的数量值)。在本节中,我们使用连谱号来表示集合,比如{1, 3, 18, 23, 235} 或者{x1, x2, x3, x4, . . . , xn}。一个集合可以是无限的,并且在某个区间包含所有的值。如果一个集合包含a,b之间所有的值,也包括a,b的值,那么可以用方括号表示为[a,b]。如果集合不包含a,b的值,这样的集合可以用圆括号表示为(a,b)。举个栗子,集合[0,1]包含诸如0,0.0001,0.25,0.784,0.9995和1这样的值。特殊集合***R***包含从负无穷到正无穷所有的数。 28 | 29 | 当元素*x*属于集合***S***时,我们记作*x*$\in$***S***,我们能从***S1***和***S2***两集合的相交的部分,得到一个新集合***S3***。在这种情况下,我们写作***S3*** ***S1*** ***S2***。比如,{1,3,5,8}交{1,8,4}得到新集合{1,8}。 30 | 31 | 我们能从***S1***和***S2***两集合的联合,得到一个新集合***S3***。在这种情况下,我们写作***S3*** ***S1*** ***S2***。比如,{1,3,5,8}并{1,8,4}得到新集合{1,3,4,5,8}。 32 | 33 | ### 2.1.2 大写Sigma符号 34 | -------------------------------------------------------------------------------- /doc/4.md: -------------------------------------------------------------------------------- 1 | # 学习算法剖析 2 | 3 | 译者:[P3n9W31](https://github.com/P3n9W31) 4 | 5 | ## 一个学习算法的组成模块 6 | 7 | 通过对先前章节的阅读,你可能已经注意到了,我们看到的每个学习算法都是由三个部分组成的: 8 | 9 | 1. 一个损失函数 10 | 2. 一个建立在损失函数之上的优化准则(例如,一个代价函数,cost function) 11 | 3. 一个能够利用训练数据集来使优化准则不断优化的优化过程 12 | 13 | 以上的这三个部分是任何一个学习算法都包含的组成模块。你在之前的章节中可以看到,某些算法旨在对明确地对特定的一些优化准则进行不断的优化(包括线性回归、逻辑回归、SVM)。而此外其他的一些算法,包括决策树以及kNN算法,并没有对相应的优化准则进行明确地不断优化。决策树算法以及kNN算法几乎是历史最久远的机器学习算法,它们在被发明的时候更多的是实验性的基于直觉来构建的,并没有一个特定的全局优化的准则,它们的优化准则在晚些时候才发展而来(就像在科学的历史中常常发生的那样),用于解释这些算法的工作原理。 14 | 15 | 在阅读关于机器学习的一些现代的文献的时候,你常常都会遇到 **梯度下降法** 与 **随机梯度下降法** 的概念。它们是在优化准则可微分的情况下使用的两种最常用的优化算法。 16 | 17 | 梯度下降法是一个用于寻找函数最小值的迭代优化算法。使用梯度下降法是为了寻找函数的一个 *局部* 最小值,一次梯度下降法从一个随机点开始,并移动与函数当前点的梯度(或近似梯度)的负值成比例的距离。 18 | 19 | 梯度下降可用于找到线性和逻辑回归,SVM以及我们稍后考虑的神经网络的最佳参数。对于许多模型来说,例如逻辑回归或SVM,优化准则是凸的(convex)。凸函数只有一个全局最小值。而神经网络的优化准则不是凸函数,但是在实际应用中,找到一个局部最小值就已经能够满足优化的需求了。 20 | 21 | 接下来让我们看看梯度下降法到底是怎么工作的。 22 | 23 | ## 梯度下降法 24 | 25 | 在本节中,我将演示梯度下降法是如何找到线性回归问题的解的(脚注1:正如你所知的那样,线性回归具有闭合形式的解。这意味着这种特定类型的问题其实并不需要梯度下降来解决。 然而,出于说明目的,线性回归是解释梯度下降的一类完美问题)。我将使用Python的源代码以及图像来说明在一定数量的迭代运算之后,梯度下降是如何让解进行改进的。 26 | 27 | 我使用的数据集只包含一个特征。然而,优化准则将有两个参数: $w$ 与 $b$ 。拓展到多维的训练数据是也是十分直接的:对于二维数据来说,你会有参数 $w^{(1)}$, $w^{(2)}$ 与 $b$ ,对于三维数据来说,你会有参数 $w^{(1)}$, $w^{(2)}$ , $w^{(3)}$ 与 $b$ ,以此类推。 28 | 29 | ![图1:原始数据。Y轴对应于单元内的销售额(我们想要预测的数量),X轴对应于样本的特征:以M$为单位的广播广告支出。](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/4-1.png) 30 | 31 | 图1:原始数据。Y轴对应于单元内的销售额(我们想要预测的数量),X轴对应于样本的特征:以M$为单位的广播广告支出。 32 | 33 | 为了给出一个实际的例子,我使用了包含以下列的真实数据集:每年广播广告的各公司的支出和按销售量计算的年度销售额。我们想要构建一个能够根据一家公司在广播广告上的支出来预测销售量的模型。数据集中的每一行代表了一个特定的公司: 34 | 35 | | Company | Spendinngs, M$ | Sales, Units | 36 | | :-----: | :------------: | :----------: | 37 | | 1 | 37.8 | 22.1 | 38 | | 2 | 39.3 | 10.4 | 39 | | 3 | 45.9 | 9.3 | 40 | | 4 | 41.3 | 18.5 | 41 | | ... | ... | ... | 42 | 43 | 我们的数据包含了200家公司,所以我们就有200条训练样本。图1在2维图像上展示了所有的样本。 44 | 45 | 要记得,线性回归模型看起来有着这样的形式: $f(x)=w x+b$ 。我们不知道 $w$ 与 $b$ 的最佳值是多少,我们希望能够从数据中学习得到。为了实现这个目标,我们为 $w$ 与 $b$ 寻找能够最小化均方误差的值: 46 | 47 | $$l=\frac{1}{N} \sum_{i=1}^{N}\left(y_{i}-\left(w x_{i}+b\right)\right)^{2}$$ 48 | 49 | 梯度下降从计算每个参数的偏导数开始: 50 | 51 | $$\begin{aligned} \frac{\partial l}{\partial w} &=\frac{1}{N} \sum_{i=1}^{N}-2 x_{i}\left(y_{i}-\left(w x_{i}+b\right)\right) \\ \frac{\partial l}{\partial b} &=\frac{1}{N} \sum_{i=1}^{N}-2\left(y_{i}-\left(w x_{i}+b\right)\right) \end{aligned}$$ 52 | 53 | 为了找到 $\left(y_{i}-(w x+b)\right)^{2}$ 项关于 $w$ 的偏导数,我们应用 *链式法则* 。在这里,我们具有 $f=f_{2}\left(f_{1}\right)$ 这样形式的一条链,其中, $f_{1}=y_{i}-(w x+b)$ , $f_{2}=f_{1}^{2}$ 。为了找到 $f$ 关于 $w$ 的偏导数,我们首先必须要找到 $f$ 关于 $f_2$ 的,与 $2(y_i-(w x+b))$ 相等的偏导数(通过计算,我们知道导数 $\frac{\partial f}{\partial x} x^{2}=2 x$ )然后我们必须将其与 $y_{i}-(w x+b)$ 关于 $w$ 并与 $-x$ 相等的偏导数相乘。综上所述, $\frac{\partial l}{\partial w}=\frac{1}{N} \sum_{i=1}^{N}-2 x_{i}\left(y_{i}-\left(w x_{i}+b\right)\right)$ 。同样的,也可以计算出 $l$ 关于 $b$ , $\frac{\partial l}{\partial b}$ 的偏导数。 54 | 55 | 我们初始化 $w_0 = 0$ 与 $b_0 = 0$ (脚注2:在一些复杂的模型中,例如神经网络,将有着数以千计的参数,对参数的初始化将极大的影响使用梯度下降法进行优化时找到的解。有着不同的初始化方法(随机初始化,全部初始化为0,初始化为0附近小的数值,以及其它),这是数据分析师必须做出的重要选择),然后通过训练样本进行迭代,每个样本都有如 $\left(x_{i}, y_{i}\right)=\left(\text {Spendings}_{i}, \text {Sales}_{i}\right)$ 的形式。对于每一个训练样本来说,我们使用偏导数来更新 $w$ 与 $b$ 。学习率 $\alpha$ 控制了一次参数更新的幅度: 56 | 57 | $$\begin{aligned} w_{i} & \leftarrow \alpha \frac{-2 x_{i}\left(y_{i}-\left(w_{i-1} x_{i}+b_{i-1}\right)\right)}{N} \\ b_{i} & \leftarrow \alpha \frac{-2\left(y_{i}-\left(w_{i-1} x_{i}+b_{i-1}\right)\right)}{N} \end{aligned}$$ 58 | 59 | 其中,$w_i$ 与 $b_i$ 表示 $w$ 与 $b$ 在利用 $\left(x_{i}, y_{i}\right)$ 进行更新之后的值。 60 | 61 | 一次对所有训练样本的遍历称为1 epoch(代)。一般情况下,我们进行许多代更新,直到我们开始发现 $w$ 与 $b$ 的值不再发生大的变化,我们就停止。 62 | 63 | 很难想象一个机器学习工程师不使用Python。所以,如果你真正寻找一个合适的时机来开始学习Python的话,那就是现在了。在下面,我们说明了如何在Python中编写梯度下降算法。 64 | 65 | 用于在每一代中更新参数 $w$ 与 $b$ 的函数如下所示: 66 | 67 | ```python 68 | def update_w_and_b(spendings, sales, w, b, alpha): 69 | dl_dw = 0.0 70 | dl_db = 0.0 71 | N = len(spendings) 72 | 73 | for i in range(N): 74 | dl_dw += -2*spendings[i]*(sales[i] - (w*spendings[i] + b)) 75 | dl_db += -2*(sales[i] - (w*spendings[i] + b)) 76 | 77 | # update w and b 78 | w = w - (1/float(N))*dl_dw*alpha 79 | b = b - (1/float(N))*dl_db*alpha 80 | 81 | return w, b 82 | ``` 83 | 84 | 在多代训练中进行循环的函数如下所示: 85 | 86 | ```python 87 | def train(spendings, sales, w, b, alpha, epochs): 88 | for e in range(epochs): 89 | w, b = update_w_and_b(spendings, sales, w, b, alpha) 90 | 91 | # log the progress 92 | if e % 400 == 0: 93 | print("epoch:", e, "loss: ", avg_loss(spendings, sales, w, b)) 94 | 95 | return w, b 96 | ``` 97 | 98 | 下面的 *avg_loss* 函数适用于计算均方误差,其被定义为: 99 | 100 | ```python 101 | def avg_loss(spendings, sales, w, b): 102 | N = len(spendings) 103 | total_error = 0.0 104 | for i in range(N): 105 | total_error += (sales[i] - (w*spendings[i] + b))**2 106 | 107 | return total_error / float(N) 108 | ``` 109 | 110 | 如果我们将参数设置为 $\alpha = 0.001, w = 0.0, b = 0.0, epochs = 15000$ 来运行 *train* 函数,我们将看到如下的输出结果(部分): 111 | 112 | ``` 113 | epoch: 0 loss: 92.32078294903626 114 | epoch: 400 loss: 33.79131790081576 115 | epoch: 800 loss: 27.9918542960729 116 | epoch: 1200 loss: 24.33481690722147 117 | epoch: 1600 loss: 22.028754937538633 118 | ... 119 | epoch: 2800 loss: 19.07940244306619 120 | ``` 121 | 122 | ![图2:回归线随着梯度下降法代数变化的演变过程](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/4-2.png) 123 | 124 | 图2:回归线随着梯度下降法代数变化的演变过程 125 | 126 | 从图中可以发现平均损失值随着 *train* 函数的循环与epoch增加正在降低。图2展示了回归线随着代数(epoch)变化的演变过程。 127 | 128 | 最终,一旦我们找到了参数 $w$ 与 $b$ 的最佳值,我们唯一缺少的东西就是一个能够用于预测的函数了: 129 | 130 | ```python 131 | def predict(x, w, b): 132 | return w*x + b 133 | ``` 134 | 135 | 尝试执行以下的代码: 136 | 137 | ```python 138 | w, b = train(x, y, 0.0, 0.0, 0.001, 15000) 139 | x_new = 23.0 140 | y_new = predict(x_new, w, b) 141 | print(y_new) 142 | ``` 143 | 144 | 输出的结果为13.97。 145 | 146 | 梯度下降法对于学习率 $\alpha$ 的选择是十分敏感的。且对于大型的数据集来说,梯度下降法是比较慢的。幸运的是,有好几种十分重要的针对梯度下降法的优化方式已经被提出了。 147 | 148 | **随即梯度下降**(SGD)是梯度下降法的一种改进,其通过估算训练样本中的更小的批次(子集)的梯度来加速了计算的过程。SGD本身就存在许多版本的升级,**Adagrad** 是SGD的其中一个版本,能够根据梯度的变化历史来对参数的学习率 $\alpha$ 进行缩放调整。 **Momentum** 是一种可以通过确定梯度下降在相关方向上的方向并减少震荡的一种能够对SGD加速的方法。在神经网络的训练中,SGD的变体,如 **RESprop** 与 **Adam** 都是使用的十分频繁的。 149 | 150 | 注意,梯度下降法及其变体都不是机器学习算法。它们是最小化问题的解决方案,其中需要最小化的目标函数在其值域的大多数点处都具有梯度。 151 | 152 | ## 机器学习工程师会怎么做 153 | 154 | 除非你是研究科学家或为拥有大量研发预算的大公司工作,否则你通常情况下都不会自己实现机器学习算法。你不会去实现梯度下降或其他的求解器。你使用库,其中大部分都是开源的。库是一些算法以及支持工具的一个集合,其同时考虑了程序的稳定性与运行效率。在现实中,使用的最频繁的开源机器学习库是 *scikit-learn* 。它是用Python与C语言写的。下面一个实例,告诉了你如何在scikit-learn中来完成线性回归: 155 | 156 | ```python 157 | def train(x, y): 158 | from sklearn.linear_model import LinearRegression 159 | model = LinearRegression().fit(x,y) 160 | return model 161 | 162 | model = train(x,y) 163 | x_new = 23.0 164 | y_new = model.predict(x_new) 165 | print(y_new) 166 | ``` 167 | 168 | 输出的结果。再一次的,为13.97。这很简单,对吧?你可以将其中的LinearRegression换为其它类型的回归学习算法,而其余部分不需要进行额外的改动。马上就正常工作了。同样的方式也可以使用在分类问题中。你可以简单的将 *LogisticRegression* 算法替换为 *SVC* 算法(这是支持向量机算法在scikit-learn中的名字), *DecisionTreeClassifier* ,*NearestNeighbors* 或着是许多其它的scikit-learn中已经实现的分类学习算法。 169 | 170 | ## 学习算法的特点 171 | 172 | 在这里,我们概述了一些可以将一种学习算法与另一种学习算法区分开来的实用特性。你可能已经知道了,不同的学习算法可以有着不同的超参数(SVM中的 $C$ ,ID3中的 $\epsilon$ 与 $d$ )。类似于梯度下降法之类的求解器也可以有着超参数,例如其中的 $\alpha$ 。 173 | 174 | 某些算法,如决策树学习,可以接受分类型特征。举个例子,如果你有一个特征“颜色”,可能的取值为“红”,“黄”,“绿”,那你可以不用对这个“颜色”特征的取值进行额外的调整,直接保持原样即可。SVM,逻辑回归,线性回归与kNN(具有余弦相似性或欧几里德距离度量),则希望所有的特征都是数字型的。在scikit-learn中实现的所有算法所期望的特征都是数字型的。在下一章我将介绍如何将分类型的特征转化为数字型的特征。 175 | 176 | 一些算法,如SVM,允许数据分析师为每个类别提供权重。这些权重影响了决策边界的绘制。如果某些类别的权重很高,那么所采用的学习算法在预测该类别的训练样本时则会尽可能的试图不出现错误(典型的,考虑到在其他类别处出错的代价)。这可能很重要,如果某些类别的实例在你的训练数据中占少数,但您希望尽可能避免错误地分类该类的样本。 177 | 178 | 一些分类模型,如SVM与kNN,给出了直接输出类别的特征向量。其他的,如逻辑回归或决策树,则也会返回一个位于0到1之间的可以解释模型对结果的置信程度或是作为预测为某一个具体类别的实际概率的数。(脚注3:如果真的有必要,可以使用一些简单的技术合成创建SVM和kNN预测的分数) 179 | 180 | 一些分类算法(如决策树,逻辑回顾,SVM)在建立模型的时候一次性的使用了数据集中所有的数据。如果在模型完成建立之后你又有了一些额外的带标签的数据,那么你必须从头开始重建模型。另外一些算法(如scikit-learn中的朴素贝叶斯,多层感知器,SGDClassifier/SGDRegressor, PassiveAggressiveClassifier/PassiveAggressiveRegressor)可以迭代的训练,一次只训练其中的一批。一旦新的训练样本可以使用了,你可以在仅使用新数据的情况下完成模型的更新。 181 | 182 | 最后,如决策树, SVM与kNN算法在分类问题与回归问题中都是适用的,而其他的算法只能够解决其中的一种问题:要么是分类,要么是回归,无法两类都解决。 183 | 184 | 通常情况下,每个库提供的文档都解释了每种算法解决的问题类型,允许的输入值以及模型产生的输出值类型。该文档还提供了有关超参数的信息。 -------------------------------------------------------------------------------- /doc/5.md: -------------------------------------------------------------------------------- 1 | # 5 基础实践 2 | 3 | 译者:[@chengchengbai](https://github.com/chengchengbai) 4 | 5 | 直到现在,我也只是顺便提到了数据分析师在处理机器学习问题时可能遇到的一些问题:特征工程,过拟合,以及超参数调优。在本章,我们将会谈谈这样那样的一些挑战,这些挑战是你在 scikit-learn 中键入 $model = LogisticRegresion().fit(x,y)$ 之前需要被解决的。 6 | 7 | ## 5.1 特征工程 8 | 9 | 当产品经理跟你说:“我们要能预测一个特定的客户是否会继续留下,这里有他五年间使用我们的产品的日志。”你不能只是直接把这些数据塞进一个库然后得到预测结果,你首先要建一个**数据集**(dataset)。 10 | 11 | 还记得第一章里头讲的,数据集是**带标记样本**(labeled examples)的集合 $\{( \bold{x}_i,y_i)\}_{i=1}^{N}$,这 $N$ 个里面的每一个元素 $\bold{x_i}$ 被称为**特征向量**( feature vector )。特征向量的每一个维度 $j=1,…,D$ 都是以某种方式来描述这个样本的,这些值被称为**特征**( feature ),用 $x^{(j)}$ 表示。 12 | 13 | 将原始数据转换为数据集的问题称为特征工程。 对于大多数实际问题,特征工程是一个体力活,同时也需要数据分析师的创造力,当然,有领域知识就更好了。 14 | 15 | 举个栗子,为了将用户与某计算机系统交互的日志转换为数据集,我们需要创造一些特征,这些特征包含用户信息以及各式各样的从日志中提取出来的统计信息。对于每一个用户,一个特征可以包含订阅价格,其他的特征可以包含每天,每周,每年的连接频率,还有另外的特征包含平均会话的时长是多少秒,或者一个请求的平均响应时长,等等。任何可以计量的东西都可以被用作特征。数据分析师的角色就是建立*富含有用信息*( *informative* )的特征:这些特征能够让学习算法构建一个在训练数据上表现良好的模型。含有丰富信息的特征也被称为具有高*预测力*( *predictive power* )的特征。比如用户会话的平均时长(译者注:可以理解为用户的平均使用时长)对于预测用户将来是否还会继续使用这个应用就具有高预测力。 16 | 17 | 当一个模型在训练数据集上预测很准的话,我们称这个模型有**低偏差**( low bias )。也就是说当我们尝试预测用于构建这个模型的样本的标签时,模型仅会犯很少的错误。(译者注:原文此处比较啰嗦,核心意思就是说在训练数据上表现良好的模型是低偏差的) 18 | 19 | ### 5.1.1 热编码 ( One-Hot encoding ) 20 | 21 | 一些学习算法只能处理数值型的特征向量,当你数据集中有一些特征是类别型的时候,比如“颜色”或者“星期几”,你可以将这样一个变量转换为几个二值的变量。 22 | 23 | 如果你的样本有一个类别型特征“颜色”并且这个特征总共有三个可能的取值:“红”,“黄”,“绿”,那么你就可以将这个特征转换为一个具有三个数值特征的向量: 24 | $$ 25 | \begin{aligned} red &=[1,0,0] \\ yellow &=[0,1,0] \\ green &=[0,0,1] \end{aligned} \tag{1} 26 | $$ 27 | 通过这样做,你增加了你的特征维数。但你不能直接将红转为 1,黄转为 2,绿转为 3 来避免维数的增加,因为这样做就暗示了这个类别内的不同值有了大小顺序之分,而这个指定的顺序对后面的决策十分重要。如果特征值的大小顺序本身并不重要,用这种有序的数值就很有可能迷惑学习算法[^1],因为算法将会试图寻找本来不存在的规律,这有可能导致过拟合。 28 | 29 | [^1]: 类别型变量的值的大小有意义的话,我们就可以用数字来替换变量的值,这样就保持了这个特征跟以前一样只用一个变量表示了。比如,如果我们的变量表示文章的质量,取值是 $\{ poor,decent,good,excellent\}$,然后我们就可以用数字来代替这些类别,比如 $\{ 1,2,3,4\}$。 30 | 31 | ### 5.1.2 分箱 ( Binning ) 32 | 33 | 有一种相反的情况,在实际中出现得较少,就是你想要将数值型特征转换为类别型。**分箱**( binning,也叫分段 bucketing )是将连续特征转换为多个二进制特征(称为箱或桶)的过程,通常基于(原始特征的)取值范围。比如,相较于直接把年龄表示成单个实值数字特征,数据分析师可以将年龄范围划分为离散的区间(箱):0到5岁可以放入一个区间(箱),6到10年之间可以放到第二个箱,11到15岁可以在第三个箱里,依此类推。 34 | 35 | 举个栗子:假如我们的特征 $j=18$ 表示年龄。通过分箱操作,我们将这些特征用对应的箱来代替。假设我们有三个新的箱,"age_bin1","age_bin2","age_bin3" 以及他们分别对应的索引 $j=123,j=124,j=125$ ,现在,如果对于某些样本点 $\bold{x}_i$ 其特征 $x_i^{(18)}=7$,那我们就将特征 $x_{i}^{(124)}$ 设置为1,如果 $x_i^{(18)}=13$ 就将特征 $x_{i}^{(125)}$ 设为1,其他也如此。 36 | 37 | 在某些情况下,精心设计的分箱策略可以帮助学习算法使用更少的样本。 之所以发生这种情况,是因为我们对学习算法给出了“暗示”,即如果特征的值落在特定范围内,则该特征的确切值是无关紧要的。 38 | 39 | ### 5.1.3 归一化 ( Normalization ) 40 | 41 | **归一化**( normalization )是指将一个数值型特征的实际取值范围转换到一个标准范围内的处理过程,一般是转换到 $[-1,1]$ 或则 $[0,1]$ 。 42 | 43 | 比如,假设有个特征的取值范围是350到1450,通过对每个值都减去350,然后除以1100,我们就能将这些特征的值归一化到 $[0,1]$ 。 44 | 45 | 更通俗来讲,归一化的公式长这样: 46 | $$ 47 | \overline{x}^{(j)}=\frac{x^{(j)}-m i n^{(j)}}{max^{(j)}- min ^{(j)}} \notag{} 48 | $$ 49 | 其中 $max^{(j)}$ 和 $ min ^{(j)}$ 分别表示数据集中第 $j$ 个特征的最大值和最小值。 50 | 51 | 那么问题来了,为啥要归一化呢?数据归一化并不是严格要求的。 但是在实践中,它可以提高学习速度。 记得前面章节中讲到的梯度下降的例子, 想象一下,你有一个二维特征向量,当你更新参数 $w^{(1)},w^{(2)}$ 时,你要用均方误差( average squared error )关于 $w^{(1)},w^{(2)}$ 的偏导数,如果 $x^1$ 取值 $[0,1000]$ 而 $x^2$ 取值 $[0,0.0001]$,这将导致取值大的那个特征将对更新起到决定性作用。 52 | 53 | 此外,确保我们的输入都大致处于相同的相对较小的范围内是十分实用的,这可以避免计算机在处理非常小或非常大数字时遇到的问题(称为流量数据)。 54 | 55 | ### 5.1.4 标准化 ( Standardization ) 56 | 57 | 标准化( standardization,又称 z-score 归一化 ),是指将特征的值进行缩放,从而使得其具有*标准正态分布*( $\mu = 0, \sigma = 1 $ )性质的操作,其中 $\mu$ 表示均值(数据集中所有样本关于这个特征的平均值),$\sigma$ 表示关于均值的标准差。 58 | 59 | 特征的标准分数(又称z分数)是按如下这样计算的: 60 | $$ 61 | \hat{x}^{(j)}=\frac{x^{(j)}-\mu^{(j)}}{\sigma^{(j)}} \notag 62 | $$ 63 | 你可能会问啥时候该使用归一化啥时候该使用标准化呢。 这个问题没有明确的答案。 通常情况下,如果的的数据集不是太大并且你有时间,那么你可以两种都试一下看哪一个更适合你的任务。 64 | 65 | 如果你没有很多时间进行试验,以下是几条经验: 66 | 67 | - 对于无监督学习,在实践中,标准化通常要好于归一化。 68 | - 如果特征的值分布接近正态分布(所谓的钟形曲线),则标准化也是特征的首选; 69 | - 同样的,标准化也更适用于可能会取到极大或极小值(外点)的特征,因为规范化会将规范值“挤压”到一个非常小的范围内。 70 | - 在其他情况下,规范化更好一点 71 | 72 | 当然,你可以在一些流行的库里面找到的现代实现的学习算法,都对不同范围的特征鲁棒,特征缩放通常对大多数学习算法是有益的,不过在很多情况下,直接用原始特征训练的模型效果也很好。 73 | 74 | ### 5.1.5 处理缺失值 75 | 76 | 在某些情况下,分析人员拿到的数据都是特征已经被定义好了的。 在一些样本中,一些特征的值可能会缺失。 这通常发生在数据集是手工制作的时候,制作人员忘记填写某些值或根本没有进行测量。 77 | 78 | 通常,处理缺失值得方法包括: 79 | 80 | - 移除那些有值缺失的样本点,当然,前提是你的数据集足够大,这样就可以牺牲一些训练样本 81 | - 使用那些可以应对缺失值的算法(这取决于库以及算法的特定实现) 82 | - 使用数据插补技术 83 | 84 | ### 5.1.6 数据插补技术 85 | 86 | 一种技术是用数据集中该特征的平均值替换缺失的特征值: 87 | $$ 88 | \hat{x}^{(j)}=\frac{1}{N} x^{(j)} \notag 89 | $$ 90 | 另一种技术是将缺失值都替换为正常范围值之外的相同值。比如,如果正常范围是 $[0,1]$ 那么你就能将缺失值替换成 2 或者 -1 ,这背后的思想是:学习算法将学习当特征具有与其他值明显不同的值时最好做什么。另外一种方法是,你可以用取值范围中间的那个值替换缺失值,比如,如果特征的取值范围是 $[-1,1] $ 那么你可以将缺失值设为 0,这背后的思想是,如果我们用中间值来替换缺失值得话,不会对预测有太大影响。 91 | 92 | 更高级的技术是使用缺失值作为回归问题的目标变量。你可以用所有的剩余的特征$\left[x_{i}^{(1)}, x_{i}^{(2)}, \ldots, x_{i}^{(j-1)}, x_{i}^{(j+1)}, \ldots, x_{i}^{(D)}\right]$ 来建立一个特征向量 $\hat{\bold{x}}_i$ ,令 $\hat{y}_i =x^{(j)}$ ,其中 $j$ 是有缺失值的特征,现在我们就可以建立一个回归模型利用 $\hat{\bold{x}}$ 来预测 $\hat{y}$ ,当然为了构建这样的训练样本 $(\hat{\mathbf{x}}, \hat{y})$ 你只需要使用那些原始数据集中 $j$ 特征有值存在的样本就好了。 93 | 94 | 最后,如果你有一个非常大的数据集,并且只有一小部分特征有缺失值,你可以通过对每个有缺失的特征增加一个二值标识符特征来增加维度。假设在 $D$ 维数据集上 $j=12$ 有缺失值,那么对于每个特征向量 $\bold{x}$ ,你可以增加一个特征 $j=D+1$ ,当第12个特征值未缺失时,这个(新加的)特征设为1,否则为0,缺失的特征值随后可以用0或你任选的数来替换。 95 | 96 | 在预测时,如果样本也是不完整的,那么你应该使用跟在训练时相同的数据插补技术来填充缺失值。 97 | 98 | 在开始研究学习问题之前,你无法确定哪种数据插补技术是最好的。 尝试几种技术,多建立几个模型并选择其中最好的。 99 | 100 | ## 5.2 学习算法的选择 101 | 102 | 选择机器学习算法可能是一项艰巨的任务。 如果你有很多时间,你可以所有的都试一遍。然而通常你要解决问题的时间有限。 在开始解决问题之前,你可以问自己几个问题。 根据你的答案,可以将一些算法列入候选名单并对开始用你的数据进行尝试。 103 | 104 | - 可解释性 105 | 106 | 你的模型是否需要对非技术受众好解释?很多非常精准地学习算法被称为“黑盒”,它们能学到只犯极少错误的模型,但是为什么模型会做出特定的预测则非常难理解更别说解释。这样的模型有如神经网络和集成模型。 107 | 108 | 另一方面,kNN,线性回归或决策树这样的学习算法得到的模型通常并不是最准的,但是它们却能以一种非常直接的方式做预测。 109 | 110 | - 内存内还是内存外 111 | 112 | 你的数据集能被完整地加载进服务器或者个人电脑的内存吗?如果是的,那么你可以选择非常多的算法,否则,你最好用增量式的学习算法,增量式算法能通过一点点地增加数据来提升模型效果。 113 | 114 | - 特征和样本的数量 115 | 116 | 你的数据集中有多少个训练样本? 每个样本有多少特征? 一些算法,包括**神经网络**和**梯度提升**(我们后来都考虑过),可以处理大量的样本和数百万特征。 其他的比如SVM,其能力可能就比较一般。 117 | 118 | - 类别型 vs 数值型特征 119 | 120 | 你的训练样本是全部只有类别型特征,还是全部只含数值型特征,还是两者混合?根据你的回答,一些学习算法不能直接处理你的数据集,你需要将你的类别型特征转换为数值型特征,比如使用类似热编码的方式。 121 | 122 | - 数据的非线性 123 | 124 | 你的数据时线性可分的吗,换句话说,你的数据能否用线性模型建模?如果是的,那么线性核的SVM,逻辑回归或者线性回归就是不错的选择。否则,深度神经网络或者集成学习算法(在第6,第7章中讨论的)会更适用于你的数据。 125 | 126 | - 训练速度 127 | 128 | 允许用多长的时间来训练模型? 众所周知,神经网络训练很慢。 像逻辑和线性回归这样的简单算法以及决策树学得要快得多。 一些专业库包含一些算法的非常高效的实现; 你可能更喜欢多上网瞅瞅以找到这样的库。 一些算法,例如随机森林,可以使用多CPU核心加速,因此在具有数十个CPU核心的机器上,它们模型构建的时间可以显著减少。 129 | 130 | - 预测速度 131 | 132 | 在预测的时候模型要有多快?你的模型是否会用在有高吞吐量需求的环境上?一些算法,比如 SVM,线性回归和逻辑回归,或者某些类型的神经网络,做预测非常地快,其他一些算法比如 kNN,集成算法和深度神经网络后者循环神经网络,就会慢一些[^2]。 133 | 134 | [^2]: kNN 和集成方法在当今的库里的实现预测速度还是很快的,所以在实践中不要怕去使用这些算法。 135 | 136 | ![fig1](./img/5-1.png) 137 | 图1:scikit-learn机器学习算法选择示意图 138 | 139 | ## 5.3 三个集合 140 | 141 | 直到现在,我认为“数据集”和“训练数据”这两种表述是可互换的,然而,在实际的中,数据分析师通常会跟三个带标签的样本集合打交道: 142 | 143 | 1. 训练集 144 | 2. 验证集 145 | 3. 测试集 146 | 147 | 一旦获得了带标注的数据集,你首先要做的事情是将样本分成三个子集:训练集,验证集和测试集,训练集通常是最大的那个,你可以用它来构建模型,验证集和测试集的大小大致相同,比训练集要小很多。学习算法不能使用这两个集和内的数据进行建模,这也是为什么这两个集合通常被称为**保留集** (hold-out sets)。 148 | 149 | 没有最佳的切分比例来切分这三个集合,过去的经验法则是 70% 的数据集用作训练,15%用于验证,15%用于测试,然而,在大数据时代,数据集通常含有数百万个样本,在这种情况下,持95%的训练集和2.5%/ 2.5%的验证/测试集是合理的。 150 | 151 | 你也许会好奇,为什么要分为这三个集合而不是只有一个,答案很简单:当我们构建模型时,我们不想模型只对那些已经看到过标签的样本上表现很好,一个记住所有训练样本然后用记忆进行预测的简单算法在训练集上将不会有任何错误,但这样的算法在实际中却是无用的,我们真正想要的是我们的模型预测表现的很好,当遇到学习算法没有看到过的例子时。 因此,我们希望在保留集上获得良好的表现。 152 | 153 | 为什么我们需要两个保留集呢?我们将使用验证集来 1)选择学习算法, 2)寻找超参数的最优值。在将模型交付或者投入生产前,我们使用测试集来评估模型。 154 | 155 | ## 5.4 欠拟合与过拟合 156 | 157 | 上文中我提到了**偏差**(bias)这个概念。我们说当模型在训练数据上预测得很准时,模型的偏差就很小。如果模型在训练数据上犯了很多错误,则我们就说模型有高偏差,或者模型欠拟合。所以,欠拟合指的是模型没法在训练数据上预测得很准,欠拟合通常有很多原因,下面的是最重要的: 158 | 159 | - 你的模型对数据而言太简单了(比如线性模型经常欠拟合) 160 | - 你设计的特征没有足够的信息量 161 | 162 | 第一点在一维回归的例子下很好展示:数据集可能是一条曲线,但我们的模型是一条直线。第二个点可以这么解释:假设你想要预测一个病人是不是有癌症,你有身高,血压和心率这些特征,显然这三个特征对于癌症来说并不是很好的预测因子,所以我们的模型将无法学到特征和标签之间有意义的关系。 163 | 164 | 欠拟合的解决方案是尝试更加复杂的模型或者使用更加具有预测意义的特征。 165 | 166 | 过拟合是模型可能出现得另一个问题。过拟合的模型在训练集上表现得非常好,但是至少在两个保留集中的一个上表现得很差。我之前已经在第3张给出了过拟合的一个例子。好几个原因会导致过拟合,其中最重要的是: 167 | 168 | - 你的模型对于数据来说太复杂了(比如非常高的决策树或者非常深或者广的神经网络通常会过拟合) 169 | - 你有太多的特征,但是却只有很少的训练数据 170 | 171 | 在学术文献中,你可以找到过拟合问题的另外一个名字:高方差问题,这个术语来自于统计学。方差是模型的误差,因为它对训练集中的小波动很敏感,这意味着如果你的训练数据是以不同的方式被采样的话,训练的学习过程将会导致截然不同的模型,这也是为什么过拟合的模型会在测试集上表现很差:测试数据和训练数据是从不同的数据集中独立采样的。 172 | 173 | 过拟合问题的几个可能的解决方法: 174 | 175 | 1. 尝试更简单的模型(线性代替多项式回归,或者线性核的 SVM 而不是 RBF核,更少层数/神经元的神经网络) 176 | 2. 减少数据集中样本的维度(比如,使用第9章中讨论的降维技术) 177 | 3. 如果可能的话,使用更多的训练数据 178 | 4. 正则化模型 179 | 180 | ![fig2](./img/5-2.png) 181 | 182 | 左:欠拟合,中:拟合良好,右:过拟合 183 | 184 | 图2:欠拟合(线性模型),良好拟合(二次模型),过拟合(多项式模型)的例子 185 | 186 | 图2展示了一个一维数据集,回归模型是如何欠拟合,良好拟合,过拟合这个数据集的。 187 | 188 | 正则化是最常使用的防止过拟合的手段。 189 | 190 | ## 5.5 正则化( Regularization ) 191 | 192 | 即使是最简单的模型,比如线性模型,也会过拟合数据。这通常发生在数据的维度很高但训练样本特相对少的情况。实际上,当特征向量是很高维的时候,线性学习算法会构建一个这样的模型:该模型将会分配非零值给参数向量 $\bold{w}$ 中的大多数维度 $w^{(j)}$ ,试图找到所有可能的特征之间的复杂关系,来完美预测训练样本的标签。 193 | 194 | 这样复杂的模型通常可能在保留集上表现较差,这是因为模型努力去预测训练样本的同时,也会学到训练集的特点:训练集特征值中的噪声,小数据量的采样缺陷,以及存在于训练集中的其他的外在人工决策问题。 195 | 196 | **正则化**是一个总结性的术语,围绕那些强制使学习算法构建一个更加不复杂的模型的方法展开。在实践中,这通常会使偏差稍微高一点,但能显著降低方差。这个问题在文献中通常被称为偏差-方差权衡。 197 | 198 | 最常用的两种类型的正则化称为 $\bold{L1}$ 正则化和 $\bold{L2}$ 正则化,其思想非常简单,为了创建正则化了的模型,我们修改一下目标函数,加上一个惩罚项,如果模型越复杂的话惩罚项的值就越高。 199 | 200 | 简单起见,我以线性回归作为一个正则化的例子,相同的原则也适用于其他很多模型。 201 | 202 | 回想一下线性回归,我们想最小化以下式子: 203 | $$ 204 | \min _{\mathbf{w}, b} \frac{1}{N} \sum_{i=1}^{N}\left(f_{\mathbf{w}, b}\left(\mathbf{x}_{i}\right)-y_{i}\right)^{2} \tag{2} 205 | $$ 206 | 加上 $\bold{L1}$ 正则化后目标函数长这样: 207 | $$ 208 | \min _{\mathbf{w}, b} C|\mathbf{w}|+\frac{1}{N} \sum_{i=1}^{N}\left(f_{\mathbf{w}, b}\left(\mathbf{x}_{i}\right)-y_{i}\right)^{2} \tag{3} 209 | $$ 210 | 其中 $|\mathbf{w}| \stackrel{\mathrm{def}}{=} \sum_{j=1}^{D}\left|w^{(j)}\right|$ , $C$ 作为控制正则化重要性的超参数。如果将 $C$ 设为零,模型就会变成标准的无正则项的线性回归模型。另一方面,如果我们将 $C$ 设为很大,学习算法就会试图将大多数 $w^{(j)}$ 设为更小的值或者零以求最小化目标函数,这样模型就会变得非常简单,会导致欠拟合。你作为数据分析师,需要寻找这样一个合适的参数 $C$ ,使得偏差不会增太多,但是可以显著减少过拟合。在下一节,我将会告诉你如何去做。 211 | 212 | 一个 $L2$ 正则项长这样子: 213 | $$ 214 | \min _{\mathbf{w}, b} C\|\mathbf{w}\|^{2}+\frac{1}{N} \sum_{i=1}^{N}\left(f_{\mathbf{w}, b}\left(\mathbf{x}_{i}\right)-y_{i}\right)^{2}, \quad \text { where }\|\mathbf{w}\|^{2} \stackrel{\text { def }}{=} \sum_{j=1}^{D}\left(w^{(j)}\right)^{2} \tag{4} 215 | $$ 216 | 在实际中,$L1$ 正则化会产生稀疏模型,稀疏模型的大多数参数(在线性回归的例子里就是大多数的 $w^{(j)}$)都是零(假设超参数 $C$ 足够大的话,所以 $L1$ 其实做了**特征选择**,通过决定哪些特征对预测来讲是重要的,哪些是不重要的,这一点在你想提高模型解释性的时候很有用,不过,如果你只是想最大化模型在保留集上的效果的话,$L2$ 正则化要好一点,$L2$ 通常是可微的,所以梯度下降能够用来优化目标函数。 217 | 218 | $L1$ 和 $L2$ 也会组合起来用,在 $L1$ 和 $L2$ 取一些特殊情况下称为**弹性网正则化**。你可以找到一些名为 $L2$ 脊回归, 219 | 220 | $L1$ lasso 回归的文献。 221 | 222 | 除了被广泛运用在线性模型上以外,$L1$ 和 $L2$ 也常被用在神经网络和其他模型上,用来直接最小化目标函数。 223 | 224 | 神经网络也收益于其他两种正则化技术:**dropout** 和 **batch-normalization**,也有一些非数学手段也起到正则化的作用,比如数据增强(data augmentation)和提早停止( early stopping),我们将在第8章讨论这些技术。 225 | 226 | ## 5.6 模型效果评估 227 | 228 | 一旦你用训练数据构建了一个模型,你将如何描述你的模型到底有多好?你可以用测试集来评估模型。 229 | 230 | 测试集包含了那些学习算法之前从未见过的样本,如果我们的模型在测试集里的样本上预测表现很好,我们就称模型*泛化性*很好,或者简单点讲,就是模型很牛逼。 231 | 232 | 更加严格来说,机器学习专家用各种形式的指标和工具来评估模型性能。对于回归,模型的评估十分简单,一个拟合良好的模型的预测结果会非常接近于观测值。均值模型,就是总是预测训练数据平均值的模型,通常如果没有一些比较有信息特征的时候我们将会使用这个模型。回归模型的拟合评价应该,至少也得比均值模型要好,如果这个条件满足,那么下一步就是就是比较模型在训练数据和测试数据上的效果。 233 | 234 | 为了干这件事,我们计算分别计算训练数据和测试数据的均方差[^3](mean square error, MSE),如果模型在测试数据上的MSE明显高于训练数据上的,这是过拟合的标志,正则化和其他的超参数调优方法可以解决这个问题,“明显高于”的含义取决于你手中的问题并且需要数据分析师和决策者,拥有模型的产品owner联合决定。 235 | 236 | [^3]:或者你用来构建模型的其他类型的损失函数 237 | 238 | 对于分类任务而言,事情会有一点点复杂,评价分类任务时使用的最广泛的指标和工具是这些: 239 | 240 | - 混淆矩阵(confusion matrix) 241 | - 准确率(accuracy) 242 | - 损失敏感准确率(cost-sensitive accuracy) 243 | - 精确率(precision)/召回率(recall) 244 | - ROC曲线下面积(area under the ROC curve,AUC) 245 | 246 | 为了简化问题,我这里用一个二分类问题举例,在必要的地方,我会告诉你如何扩展到多分类的场景下。 247 | 248 | ### 5.6.1 混淆矩阵 249 | 250 | 混淆矩阵是一个总结了分类模型预测类别成功程度的表。混淆矩阵的一个轴是模型预测的标签,另一个轴是真实标签,在二分类问题中,就有两类。我们假设:模型预测两个类别:“垃圾邮件”和“非垃圾邮件”: 251 | 252 | | | 垃圾邮件(预测值) | 非垃圾邮件(预测值) | 253 | | :----------------------- | :----------------- | :------------------- | 254 | | **垃圾邮件(真实值)** | 23 ( TP ) | 1 ( FN ) | 255 | | **非垃圾邮件(真实值)** | 12 ( FP ) | 556 ( TN ) | 256 | 257 | 上面的信息显示,有 24 个样本确实是垃圾邮件,模型成功分类出来 23 个,在这种情况下,我们称有 23 个**真正类**(**True positive**)或者 $\mathrm{TP}=23$ . 模型将一个样本误分类成非垃圾邮件,在这种情况下,我们有 1 个 **假负类**(**False negative**)或者 $\mathrm{FN} = 1$. 同样的,我们有 568 个样本不是垃圾邮件,模型正确分类出 556 个( 556 **真负类 True negative**,$\mathrm{TN}=556$),有 12 个错误分类的(12 **假正类 False positive**, $\mathrm{FP}=12$) 258 | 259 | 多分类问题的混淆矩阵有很多行和列,代表不同的类别。它能帮助你确定误分类的模式。举个栗子:一个混淆矩阵可以揭示训练用于识别动物的模型更倾向于错误地预测“猫”而不是“黑豹” 或 “鼠标”而不是“老鼠”,在这种情况下,你可以决定增加这些类别的带标签的训练样本,来帮助学习算法更多地见识它们之间的不同,或者,你可以决定添加一些新的特征,使得学习算法可以用这些特征来构建一个能更好地区分这些类别的模型。 260 | 261 | 混淆矩阵可以用来计算两个重要的效果指标:**精确率**(precision)**和召回率**(recall) 262 | 263 | ### 5.6.2 精确率/召回率 264 | 265 | 两个最常用的评价指标,来评估模型好坏的就是精确率和召回率,精确率是预测正确的正类占所有预测正类中的比例: 266 | $$ 267 | \text { Precision }=\frac{\mathrm{TP}}{\mathrm{TP}+\mathrm{FP}} \notag 268 | $$ 269 | 召回率是预测正确的正类占所有真正类的比例: 270 | $$ 271 | \text { Recall }=\frac{\mathrm{TP}}{\mathrm{TP}+\mathrm{FN}} \notag 272 | $$ 273 | 为了理解精确率和召回率在模型评估中的意义和重要性,将预测问题视为查询数据库中的文档的问题通常是有用的。精确率就是在返回的文档列表中,相关文档所占的比例。召回率就是搜索引擎所返回的相关文档占所有数据库中相关文档的比例。 274 | 275 | 在垃圾邮件检测的例子中,我们希望有高的精确率(我们想要避免误将合法的邮件分类成垃圾邮件),我们可以容忍低一些的召回率(我们可以容忍收件箱中有一些垃圾邮件)。 276 | 277 | 往往在实践中,我们需要在高精确率和高召回率之间进行选择,二者兼顾是不太可能的,我们可以通过一些方式实现其中二者中的一个: 278 | 279 | - 通过赋予垃圾邮件信息更多的权重(SVM算法接受类别权重作为输入) 280 | - 通过调优超参数,取在验证集上有最大精确率或召回率的超参 281 | - 通过变化返回类别概率的算法的决策阈值,比如:如果我们用逻辑回归或者决策树,为了增加精确率(代价是更低的召回率),我们可以定义:只有在模型返回的概率大于0.9时才预测为正 282 | 283 | 即使精确率和召回率是为二分类场景下定义的,你也可以用它来评估多分类问题,为此,首先选择要评估的类,然后将此类作为正类,剩余的类作为负类。 284 | 285 | ### 5.6.3 准确率 ( Accuracy ) 286 | 287 | 准确率是这样计算出的:正确分类的样本个数除以总的分类的样本个数,从混淆矩阵的角度而言: 288 | $$ 289 | \text { Accuracy }=\frac{\mathrm{TP}+\mathrm{TN}}{\mathrm{TP}+\mathrm{TN}+\mathrm{FP}+\mathrm{FN}} \tag{5} 290 | $$ 291 | 当每个类别的预测误差都很重要时,准确率是一个是一个十分有用的指标,在判断是否为垃圾邮件的例子并不符合这个情况。比如:相比于假负类,你更不能容忍假正类。垃圾邮件检测中的假正类情形是这样的:当你的朋友给你发送一封邮件时,模型将其标记为垃圾邮件然后没有给你正常显示,另一方面,假负类通常并不构成什么严重问题,如果你的模型没有检测出一小部分的垃圾邮件,那也没什么。 292 | 293 | ### 5.6.4 代价敏感准确率 294 | 295 | 为了处理不同类别有不同重要性的情况,一个有用的指标是代价敏感准确率 ( Cost-Sensitive Accuracy ) ,为了计算代价敏感准确率,你首先得赋一个cost(一个正整数)给两种误判的类型:FP和FN,然后正常计算TP, TN, FP, FN ,最后在计算准确率之前,将FP和FN乘上之前赋的值就好了。 296 | 297 | ### 5.6.5 ROC曲线下面积 ( AUC ) 298 | 299 | ROC曲线(ROC,receiver operating characteristic,受试者工作特征,这个术语来自于雷达工程)是一个常用的用来评估分类模型性能的方法。ROC曲线结合真正率(正确预测的正类样本比例,准确定义为召回率)和假正率(错误预测的负类样本比例)来构成分类效果的概要说明。 300 | 301 | 真正率和假正率分别定义如下: 302 | $$ 303 | \mathrm{TPR}=\frac{\mathrm{TP}}{(\mathrm{TP}+\mathrm{FN})} \text { , } \mathrm{FPR}=\frac{\mathrm{FP}}{(\mathrm{FP}+\mathrm{TN})} \notag 304 | $$ 305 | ROC曲线只能被用来评估那些返回预测类别的置信度(或者说概率)的分类器。比如,逻辑回归,神经网络,决策树(基于决策树的集成模型)就可以用ROC曲线评估。 306 | 307 | 为了画出一条 ROC 曲线,我们首先将置信分数的区间范围离散化。如果我们模型的这个区间是 $[0,1]$ ,我们就可以将其离散化为 $[0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]$ ,然后我们用这些离散值作为预测的阈值,然后用这些离散值作为预测的标签。举个栗子:如果我们想计算关于阈值 0.7 的 $\mathrm{TPR}$ 和 $\mathrm{FPR}$ ,我们首先将每个样本都输入模型,然后对于得到的预测分数如果大于等于0.7,我们就将其作为正类,反之就是负类。 308 | 309 | 5-3 310 | 311 | 图3:ROC曲线下面积 312 | 313 | 如图3所示,很容易观查到,如果阈值为0,我们所有的预测结果都是正类,所以 $\mathrm{TPR}$ 和 $\mathrm{FPR}$ 都为1(右上角),相反的,如果阈值为1,那么预测结果就不会有正类, $\mathrm{TPR}$ 和 $\mathrm{FPR}$ 都是0,对应图中的左下角。 314 | 315 | ROC曲线下面积 ( AUC ) 越大,分类器就越好。一个ROC曲线下面积大于0.5的分类器好于随机分类器,如果ROC曲线下面积小于0.5,则你的模型一定是哪里出问题了。一个完美的分类器的AUC是1。通常,如果我们的模型表现良好,我们通过选取使得 $\mathrm{TPR}$ 接近 1 而 $\mathrm{FPR}$ 接近 0 的阈值来获得一个好的分类器。 316 | 317 | ROC曲线由于比较好理解而被广泛使用,它能捕获分类效果多个层面(通过将假正类和假负类都考虑进去),并且能够可视化地比较不同模型的效果。 318 | 319 | ## 5.7 超参数调优 320 | 321 | 当我展示学习算法的时候,我提到了这一点:你作为数据分析师必须选择好的算法超参数,比如 $\mathrm{ID3}$ 的 $ 322 | \epsilon$ 和 $d$ ,$\mathrm{SVM}$ 的 $C$ ,或者梯度下降的 $\alpha$ ,但是,这些具体意味着什么呢?那个值是最好的,如何寻找它?在这一节,我将回答这些基础的问题。 323 | 324 | 正如你之前就知道的,学习算法的超参数不会自己优化,数据分析师需要通过实验来一个个地寻找最优参数值的组合,来“调节”这些超参数。 325 | 326 | 一个典型的做法是,当你有足够多的数据来搞出像样的验证集时(验证集中每个类至少有一些样本)并且超参数的范围不会很大可用用**网格搜索**的时候。 327 | 328 | 网格搜索是一个最简单的超参数调优方法,假设你训练一个 $\mathrm{SVM}$ ,有两个超参数要调:惩罚参数 $C$ 和 核(linear或者rbf)的选择。 329 | 330 | 这是你头一次使用这个数据集,你不知道 $C$ 的可能的取值范围,最通常的做法是用对数范围,比如对于 $C$ 你可以尝试这些取值:$[0.001, 0.01, 0.1, 1.0, 10, 100, 1000]$ 。这个情况下你有 14 个超参数的组合要尝试 [(0.001, “linear”), (0.01, “linear”), (0.1, “linear”),(1.0, “linear”), (10, “linear”), (100, “linear”), (1000, “linear”), (0.001, “rbf”), (0.01, “rbf”), (0.1, “rbf”), (1.0, “rbf”), (10, “rbf”), (100, “rbf”), (1000, “rbf”)]​。 331 | 332 | 你使用训练数据训练这14个模型,每个超参数的组合对应一个模型,然后你在验证集上使用我们之前讨论的评价指标来评估这些模型的效果(或者你在意的一些评价指标),最后,你根据评价指标留下最好的那个模型。 333 | 334 | 当找到最佳超参数组合后,你可以在试着用这些最佳值周围的值来尝试一下,这样做有时能有更好的结果。 335 | 336 | 最后,你用测试集来评估你选择出的模型。 337 | 338 | 正如你注意到的,尝试枚举所有超参数的组合时时很耗时的,尤其是当超参数组合很多时或者数据集很大的时候。这里有一些更加高效的技术:**随机搜索**和**贝叶斯超参优化**。 339 | 340 | 随机搜索区别于网格搜索的地方在于,你不需要提供离散的参数值的集合来探索每个超参数,而是为提供每个超参数提的统计分布,超参数是从中随机采样出来的,并设置要尝试的组合总数。 341 | 342 | 贝叶斯方法区别于随机搜索和网格搜索:它用之前的评估结果来选择下一次要评估的参数值,这个想法是根据过去表现得很好的结果来选择下一个超参数值,以用来限制昂贵的目标函数优化。 343 | 344 | 5-QRcode 345 | 346 | 还有基于梯度的技术,进化优化技术和其他超参数调优技术,大部分现代的机器学习库都实现了一种或多种此类技术,当然也有一些其他的库超参数调整库几乎可以帮你调整一切学习算法,包括你自己编写的算法(译者注:详见上面的二维码)。 347 | 348 | ### 5.7.1 交叉验证 ( Cross Validation ) 349 | 350 | 当你没有合适的验证集来调优你的超参数,能帮到你的常见技术是**交叉验证**,当你只有比较少的训练样本时候,想要都拥有验证集和测试集是不太可能的,你更希望用比较多的数据去训练模型。在这种情况下,你只需要将数据集划分为训练集和测试集,然后在训练集上采用交叉验证来模拟验证集。 351 | 352 | 交叉验证是像如下这样工作的:首先,你固定要评估的超参数,然后将训练集分为几个相同大小的子集,每个子集称为一个折( fold ),在实践中典型的是5折( five-fold )交叉验证。使用5折交叉验证,你随机将训练集划分为5个子集:$\left\{F_{1}, F_{2}, \ldots, F_{5}\right\}$,每个$F_{k}, k=1, \dots, 5$ 含有20%的训练数据,每个然后你依次训练5个模型:对于模型 $f_1$ 你使用 $ F_2, F_3, F_4$ 和 $F_5$ 作为训练数据,然后使用 $F_1$ 作为验证集,第二个模型 $f_2$ 你使用 $F_1,F_3,F_4,F_5$ 作为训练数据,$F_2$ 作为验证集,然后依此继续迭代地构建模型,然后计算相关评价指标的在对应验证集的值,从 $F_1$ 到 $F_5$ ,然后将这5个值的平均值作为最后的值。 353 | 354 | 你能使用带交叉验证的网格搜索来寻找模型的最优参数,一旦你寻找到了这个最佳参数,你就可以用整个数据集和这个最好的参数来构建模型了,最后,你用测试集来评估模型。 -------------------------------------------------------------------------------- /doc/6.md: -------------------------------------------------------------------------------- 1 | "虽然模型一定不能够反应完全真实的情况,但是在某些情况下确实是很有用。" — *George Box* 2 | 3 | 本书按"先读后买"的原则分发。 4 | 5 | **第六章 神经网络与深度学习** 6 | 7 | 首先,您已经知道神经网络是什么了,并且您已经知道如何构建这样的一个模型。 是的,它就是逻辑回归!事实上,逻辑回归模型,或者更确切地说是多类分类的推广,称为softmax回归模型,是神经网络中的一个标准单元。 8 | 9 | 10 | ** 6.1神经网络** 11 | 12 | 如果您了解线性回归,逻辑回归和梯度下降,理解神经网络应该不是问题。与回归或SVM模型一样,**神经网络**(NN)是一个数学函数: 13 | 14 | $$y=f_{N N}(\mathbf{x})$$ 15 | 16 | 函数$$f_{N N}$$有一个特定的形式:它是一个**嵌套函数**。您可能已经听说过神经网络**层**。 17 | 18 | 因此,对于返回标量的3层神经网络,$$f_{N N}$$看起来像这样: 19 | 20 | $$ y=f_{N N}(\mathbf{x})=f_{3}\left(f_{2}\left(\boldsymbol{f}_{1}(\mathbf{x})\right)\right) $$ 21 | 22 | 在上面的等式中,**f**1和 **f**2是以下形式的向量函数: 23 | 24 | $$\boldsymbol{f}_{l}(\mathbf{z}) \stackrel{\text { def }}{=} \boldsymbol{g}_{l}\left(\mathbf{W}_{l} \mathbf{z}+\mathbf{b}_{l}\right)$$ 25 | 26 | 其中l称为层索引,可以跨越1到任意数量的层。函数 $$\boldsymbol{g} l$$ 称为**激活函数**。它是固定的, 在学习开始之前由数据分析员选择的,通常是非线性的函数。通过根据任务优化特定所以损失函数(例如*MSE*),使用熟悉的梯度下降来学习每层的参数$$\mathbf{W}_{l}$$(矩阵)和$$\mathbf{b}_{l}$$(矢量) 。比较eq. 1使用逻辑回归方程,用sigmoid函数替换$$\boldsymbol{g} l$$ ,你不会看到任何差异。函数$$f_{3}$$是回归任务的标量函数,但也可以是矢量函数,具体取决于您的问题。 27 | 28 | 你可能想知道为什么使用矩阵 $$\mathbf{W}_{l}$$ 而不是矢量$$\mathbf{W}_{l}$$。原因是$$\boldsymbol{g} l$$是矢量函数。矩阵$$\mathbf{W}_{l}$$的每行$$\mathbf{w}_{l, u}$$(u表示单位)是与** z **具有相同维数的向量。 29 | 30 | 设$$a_{l, u}=\mathbf{w}_{l, u} \mathbf{z}+b_{l, u}$$ $$\boldsymbol{f}_{l}(\mathbf{z})$$的输出是向量$$ 31 | \left[g_{l}\left(a_{l, 1}\right), g_{l}\left(a_{l, 2}\right), \ldots, g_{l}\left(a_{l, s i z e_{l}}\right)\right]$$,其中$$g l$$是一些标量函数1,$$\operatorname{si} z e_{l}$$是层l中的单位数。为了使其更具体,让我们考虑一种称为**多层感知器**的神经网络架构,通常称为**香草神经网络**。 32 | 33 | 1_{\mathrm{A}}标量函数输出一个标量,即一个简单的数字,而不是一个向量。 34 | 35 | 36 | ** 6.1.1多层感知器示例** 37 | 38 | 我们仔细研究了称为**前馈神经网络**(FFNN)的神经网络的一种特定配置,更具体地说是称为**多层感知器**(MLP)的架构。 39 | 举个例子,让我们考虑一个有三层的MLP。我们的网络将二维特征向量作为输入并输出一个数字。此FFNN可以是回归或分类模型,具体取决于第三个输出层中使用的激活函数。 40 | 41 | 我们的MLP如图1所示。神经网络以图形方式表示为**单元的连接组合**逻辑组织成一个或多个**层**。每个单元由圆形或矩形表示。入站箭头表示单位的输入,并指示此输入来自何处。出站箭头表示单位的输出。 42 | 43 | 每个单元的输出是在矩形内写入的数学运算的结果。圆形单位不对输入做任何事情;他们只是将输入直接发送到输出。 44 | 45 | 每个矩形单元中都会发生以下情况。首先,单元的所有输入连接在一起以形成输入向量。然后该单元对输入向量应用线性变换,就像线性回归模型对其输入特征向量一样。最后,该单元将激活函数g应用于线性变换的结果,并获得输出值,即实数。在vanilla FFNN中,某个层的单位的输出值变为后续层的每个单元的输入值。 46 | 47 | 在图1中,激活函数$$g l$$有一个索引$$l$$,这个是单元所属层的索引。通常,图层的所有单位都使用相同的激活函数,但这不是一个规则。每图层可以有不同数量的神经元。 48 | 49 | 每个单位的参数$$\mathbf{W} l, u$$和$$b_{l, u}$$,其中u是单位的索引,l是图层的索引。每个单位的向量$$\mathbf{y} l-1 50 | $$是定义为$$\left[y_{l-1}^{(1)}, y_{l-1}^{(2)}, y_{l-1}^{(3)}, y_{l-1}^{(4)}\right]$$。第一层中的向量** x **定义为$$\left[x^{(1)}, \ldots, x^{(D)}\right]$$ 51 | 52 | 如图1所示,在多层感知器中,一层的所有输出都连接到后一层的每个输入。这种架构称为**完全连接**。神经网络可以包含**完全连接的层**。这些层是其单元接收前一层的每个单元的输出作为输入的层。 53 | 54 | 55 | ** 6.1.2前馈神经网络架构** 56 | 57 | 如果我们想要解决前面章节中讨论的回归或分类问题,神经网络的最后(最右边)层通常只包含一个单元。 如果最后一个单元的激活函数$$\text { glast }$$是线性的,则神经网络是回归模型。 如果$$\text { glast }$$是逻辑函数,则神经网络是二元分类模型。 58 | 59 | ![6-1](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-1.png) 60 | 61 | 图1:具有二维输入的多层感知器,两层具有四个单元,一个输出层具有一个单元。 62 | 63 | 数据分析师可以选择任何数学函数,例如$$g l, u$$,假设它是可微分的。后一个属性对于梯度下降是必不可少的,用于找到所有l和u的参数$$\mathbf{W} l, u$$和$$b_{l, u}$$的值。在函数$$f_{N} N$$中使用非线性分量的主要目的是允许神经网络逼近非线性函数。如果没有非线性,$$f_{N} N$$将是线性的,无论它有多少层。原因是$$\mathbf{W}_{l} \mathbf{z}+\mathbf{b}_{l}$$是线性函数,线性函数的线性函数也是线性函数。 64 | 65 | 激活功能的流行选择是您已经知道的逻辑功能,以及** TanH **和** ReLU **。前者是双曲正切函数,类似于逻辑函数,但范围从-1到1(未达到它们)。后者是经过整流的线性单位函数,当其输入z为负时等于零,否则为z: 66 | 67 | $$ 68 | \tanh (z)=\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}} 69 | $$ 70 | 71 | $$ 72 | r e l u(z)=\left\{\begin{array}{ll}{0} & {\text { if } z<0} \\ {z} & {\text { otherwise }}\end{array}\right. 73 | $$ 74 | 75 | 如上所述,表达式 $$\mathbf{W}_{l} \mathbf{z}+\mathbf{b}$$ 中的$$\mathbf{W}_{l}$$ 是矩阵,而 $$\mathbf{b}_{l}$$是向量。那看起来不同于线性回归的$$\mathbf{w} \mathbf{z}+b$$。在矩阵 $$\mathbf{W}_{l}$$中,每行u对应于矢量参数$$\mathbf{W} l, u$$。向量的维数$$\mathbf{W} l, u$$等于l-1层的单位数。 76 | 77 | 操作$$\mathbf{W}_{l} \mathbf{Z}$$导致向量$$\mathbf{a}_{l} \stackrel{\text { def }}{=}\left[\mathbf{w}_{l, 1} \mathbf{z}, \mathbf{w}_{l, 2} \mathbf{z}, \dots, \mathbf{w}_{l, s i z e_{l}} \mathbf{z}\right]$$。 然后 78 | $$\mathbf{a}_{l}+\mathbf{b}_{l}$$的和给出了sizel维向量cl。最终,函数$$\boldsymbol{g}_{l}\left(\mathbf{c}_{l}\right)$$产生了向量$$\mathbf{y}_{l} \stackrel{\text { def }}{=}\left[y_{l}^{(1)}, y_{l}^{(2)}, \ldots, y_{l}^{\left(s i z e_{l}\right)}\right]$$作为输出。 79 | 80 | 81 | ** 6.2深度学习** 82 | 83 | **深度学习**指的是训练具有两个以上非输出层的神经网络。在过去,随着层数的增加,训练这样的网络变得更加困难。两个最大的挑战被称为**爆炸梯度**和**梯度弥散**的问题,因为梯度下降用于训练网络参数。 84 | 85 | 虽然通过应用诸如**梯度削减**和L1或L2正则化的简单技术更容易处理梯度爆炸的问题,但是梯度消失的问题在数十年内仍然难以处理。 86 | 87 | 什么是消失梯度,为什么会出现?为了更新神经网络中的参数值,通常使用称为**反向传播**的算法。反向传播是使用链规则计算神经网络梯度的有效算法。在第4章中,我们已经看到链规则如何用于计算复函数的偏导数。在梯度下降期间,神经网络的参数在每次训练迭代中接收与成本函数相对于当前参数的偏导数成比例的更新。问题在于,在某些情况下,梯度将非常小,有效地防止某些参数改变其值。在最坏的情况下,这可能完全阻止神经网络进一步训练。 88 | 89 | 传统的激活函数,例如我上面提到的双曲正切函数,具有范围(0,1)中的梯度,反向传播通过链规则计算梯度。这具有将这些小数中的n乘以计算较早的渐变的效果(最左边)n层网络中的层,意味着梯度随n呈指数下降。这导致早期层的训练非常缓慢,如果有的话。 90 | 91 | 然而,神经网络学习算法的现代实现允许您有效地训练非常深的神经网络(多达数百层)。这是由于几个改进结合在一起,包括ReLU,LSTM(和其他门控单元;我们在下面考虑它们),以及**残余神经网络**中使用的**跳过连接**等技术,以及梯度下降算法的高级修改。 92 | 93 | 因此,今天,由于梯度消失和爆炸的问题在很大程度上得到了解决(或其效果减弱),“深度学习”一词指的是使用现代算法和数学工具包训练神经网络,而与神经的深度无关。在实践中,许多业务问题可以通过在输入和输出层之间具有2-3层的神经网络来解决。这些层是既不输入也不输出通常称为**隐藏层**。 94 | 95 | ** 6.2.1卷积神经网络** 96 | 您可能已经注意到,当您使网络变大时,MLP可以增加的参数数量会非常快。更具体地说,当您添加一个图层时,添加$$\left(s i z e_{l-1}+1\right) \cdot s i z e_{l}$$参数(我们的矩阵$$\mathbf{W}_{l}$$加上向量$$\mathbf{D}_{\boldsymbol{l}}$$)。这意味着如果您将另一个1000单位图层添加到现有神经网络,那么您可以向模型添加超过100万个附加参数。优化这些大型模型是一个非常计算密集的问题。 97 | 98 | 当我们的训练样例是图像时,输入是非常高维的。如果您想学习使用MLP对图像进行分类,优化问题可能会变得棘手。**卷积神经网络**(CNN)是一种特殊类型的FFNN,它可以显着减少具有许多单元的深度神经网络中的参数数量,同时不会损失模型的质量。 CNN已经在图像和文本处理中找到了应用,它们击败了许多先前建立的基准。 99 | 100 | 因为CNN是在考虑图像处理的情况下发明的,所以我在图像分类示例中对它们进行了解释。 101 | 102 | 您可能已经注意到,在图像中,彼此接近的像素通常表示相同类型的信息:天空,水,树叶,毛皮,砖块等。规则的例外是边缘:图像的两个不同对象彼此“接触”的部分。 103 | 104 | 105 | 如果我们可以训练神经网络识别相同信息的区域以及边缘,则该知识将允许神经网络预测图像中表示的对象。例如,如果神经网络检测到多个皮肤区域和边缘看起来像椭圆形的一部分,内部有皮肤般的色调,外部有蓝色调,那么很可能它是天空背景上的一张脸。 106 | 如果我们的目标是在图片上检测人物,神经网络很可能成功预测这张照片中的人物。 107 | 108 | 109 | 考虑到图像中最重要的信息是局部的,我们可以使用移动窗口方法将图像分割成方形补丁。然后我们可以一次训练多个较小的回归模型,每个小回归模型接收一个方形补丁作为输入。每个小型回归模型的目标是学习检测输入补丁中的特定类型的模式。每个小型回归模型的目标是学习检测输入补丁中的特定类型的模式。例如,一个小的回归模型将学会探测天空;另一个将检测草,第三个将检测建筑物的边缘,等等。 110 | 111 | 在CNN中,一个小的回归模型看起来像图1中的模型,但它只有第1层,没有第2层和第3层。要检测某些模式,小回归模型必须学习矩阵的参数**F**(对于“滤波器”)大小为p×p,其中p是贴片的大小。为了检测某些模式,小回归模型必须学习大小为p×p的矩阵**F**(对于“滤波器”)的参数,其中p是补丁的大小。为简单起见,假设输入图像是黑白的,1代表黑色,0代表白色像素。还假设我们的补丁是3乘3像素(p = 3)。然后一些补丁看起来像下面的矩阵 **P**(对于“补丁”):还假设我们的补丁是3乘3像素(p = 3)。 然后一些补丁看起来像下面的矩阵**P**(对于“补丁”): 112 | $$ 113 | \mathbf{P}=\left[\begin{array}{lll}{0} & {1} & {0} \\ {1} & {1} & {1} \\ {0} & {1} & {0}\end{array}\right] 114 | $$ 115 | 上面的补丁代表一个看起来像十字架的图案。将检测这种模式(并且只有它们)的小回归模型需要学习3乘3参数矩阵**F**,其中与输入补丁中的1s相对应的位置处的参数将是正数,而参数在 对应于0的位置将接近零。如果我们计算矩阵的**卷积**P**和**F**,我们得到的值越高,**F**越接近**P**。 116 | 为了说明两个矩阵的卷积,假设** F **看起来像这样: 117 | $$ 118 | \mathbf{F}=\left[\begin{array}{lll}{0} & {2} & {3} \\ {2} & {4} & {1} \\ {0} & {3} & {0}\end{array}\right] 119 | $$ 120 | 然后,仅为具有相同行数和列数的矩阵定义卷积运算符。对于我们的** P **和** F **矩阵,它的计算方法如下图所示: 121 | 122 | ![6-2](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-2.png) 123 | 124 | 图2:两个矩阵之间的卷积。 125 | 如果我们的输入补丁** P **有不同的模式,例如字母L, 126 | 127 | $$ 128 | \mathbf{P}=\left[\begin{array}{lll}{1} & {0} & {0} \\ {1} & {0} & {0} \\ {1} & {1} & {1}\end{array}\right] 129 | $$ 130 | 131 | 然后使用** F **进行卷积会得到较低的结果:5。因此,您可以看到补丁“看起来”越像滤波器,卷积运算的值就越高。 132 | 为方便起见,还有一个偏置参数b与每个滤波器** F **相关联,它被添加到a的结果中在应用非线性(激活函数)之前进行卷积。 133 | 134 | CNN的一层由多个卷积滤波器组成(每个都有自己的偏置参数),就像香草FFNN中的一个层由多个单元组成一样。第一个(最左边)图层的每个滤镜在输入图像上从左到右,从上到下滑动 - 或*卷曲* - 135 | 并且在每次迭代时计算卷积。 136 | 137 | 图3给出了该过程的图示,其中示出了一个滤波器在图像上卷积的6个步骤。 138 | 139 | 滤波器矩阵(每层中每个滤波器一个)和偏差值是可训练参数,使用梯度下降和反向传播进行优化。 140 | 141 | 非线性应用于卷积和偏差项的总和。通常,ReLU激活功能用于所有隐藏层。输出层的激活功能取决于任务。 142 | 由于我们可以在每个层l中具有sizel滤波器,因此卷积层l的输出将由sizel矩阵组成,每个滤波器一个。 143 | 144 | 145 | ![6-3](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-3.png) 146 | 147 | 图3:在图像上卷积的滤波器。 148 | 149 | 150 | 如果CNN在另一个卷积层之后具有一个卷积层,则后续层l + 1将前一层l的输出视为sizel图像矩阵的集合。这样的集合称为**卷**。该集合的大小称为卷的深度。层l+1的每个滤波器卷绕整个卷。卷的一个卷的卷积只是卷所包含的各个矩阵的相应补丁的卷积之和。 151 | 152 | ![6-4](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-4.png) 153 | 154 | 图4:由三个矩阵组成的体积的卷积。 155 | 156 | An example of a convolution of a patch of a volume consisting of depth 3 is shown in Figure 4. 157 | 158 | 图4显示了由深度为3组成的体积的卷积的一个例子。 159 | 160 | 卷积的值-3, 计算公式为(-2·3 + 3·1 + 5·4 + -1· 1)+( -2·2 + 3·( -1)+ 5·(-3)+ -1·1)+(-2·1 + 3·(-1)+ 5·2 + -1·(-1))+(-2) 161 | 162 | 在计算机视觉中,CNN通常将音量作为输入,因为图像通常由三个通道表示:R,G和B,每个通道是单色图像。 163 | 164 | 165 | 卷积的两个重要特性是** stride **和** padding **。步幅是移动窗口的步长。在图3中,步幅是1,即滤波器一次向右滑动到底部一个单元。在图5中,您可以看到带有步幅2的卷积的部分示例。当步幅更大时,您可以看到输出矩阵更小。 166 | 167 | 填充允许获得更大的输出矩阵;它是在您将图像与滤镜卷积之前围绕图像(或体积)的其他单元格的正方形宽度。通过填充添加的单元格通常包含零。在图3中,填充为0,因此不会向图像添加其他单元格。另一方面,在图6中,步幅是2并且填充是1,因此将额外单元的宽度为1的正方形添加到图像中。 168 | 你可以看到输出填充越大,矩阵越大。 169 | 170 | ![6-5](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-5.png) 171 | 图5:步幅2的卷积。 172 | 173 | ![6-6](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-6.png) 174 | 图6:步幅2和填充1的卷积。 175 | 176 | 带有填充2的图像示例如图7所示。填充有助于使用较大的滤波器,因为它允许它们更好地“扫描”图像的边界。 177 | ![6-7](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-7.png) 178 | 图7:带填充的图像2。 179 | 180 | 如果不提供** pooling **这一CNN中经常使用的技术,本节将不完整。池的工作方式与卷积非常相似,作为使用移动窗口方法应用的过滤器。但是,池化层不是将可训练的过滤器应用于输入矩阵或体积,而是应用固定的算子,通常是最大值或平均值。与卷积类似,池化具有超参数:过滤器的大小和步幅。 181 | 图8中显示了具有大小为2和步幅2的过滤器的最大池的示例。 182 | 183 | 通常,池化层跟随卷积层,它将卷积输出作为输入。将池应用于卷时,卷中的每个矩阵将独立于其他矩阵进行处理。因此,应用于体积的合并层的输出是与输入相同深度的体积。 184 | 185 | 如您所见,池化仅具有超参数,并且没有要学习的参数。通常,在实践中使用尺寸为2或3和步幅2的过滤器。最大池化比平均值更受欢迎,并且通常会产生更好的结果。 186 | 187 | 通常,池化有助于提高模型的准确性。它还通过减少神经网络的参数数量来提高训练速度。 (如图8所示,过滤器大小为2且步幅为2时,参数数量减少到25%,即4个参数而不是16个。) 188 | 189 | ![6-8](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-8.png) 190 | 图8:使用大小为2和步幅为2的过滤器进行池化。 191 | 192 | ** 6.2.2递归神经网络** 193 | 194 | 递归神经网络(RNN)用于标记,分类或生成序列。 序列是矩阵,其每一行是特征向量,并且行的顺序很重要。 标记序列是为了预测序列中每个特征向量的类。 对序列进行分类是为了预测整个序列的类。 生成序列是输出与输入序列有某种相关的另一个序列(可能不同长度)。 195 | 196 | RNN经常用于文本处理,因为句子和文本自然是单词/标点符号或字符序列的序列。 出于同样的原因,递归神经网络也用于语音处理。 197 | 198 | 递归神经网络不是前馈:它包含循环。 该想法是复发层1的每个单元u具有实值状态$$h_{l, u}$$。 状态可以被视为单位的记忆。 在RNN中,每层中的每个单元u接收两个输入:来自前一层l-1的状态向量和来自前一时间步骤的同一层1的状态向量。 199 | 200 | 为了说明这个想法,让我们考虑一下RNN的第一个和第二个复发层。 第一(最左边)层接收特征向量作为输入。 第二层接收第一层的输出作为输入。 201 | 202 | 这种情况在图9中示意性地描绘。如上所述,每个训练示例是矩阵,其中每行是特征向量。 为简单起见,让我们说明这个矩阵$$ 203 | \mathbf{X}=\left[\mathbf{x}^{1}, \mathbf{x}^{2}, \ldots, \mathbf{x}^{t-1}, \mathbf{x}^{t}, \mathbf{x}^{t+1}, \ldots, \mathbf{x}^{l e n g t h x}\right]$$,其中$$\text { length } \mathbf{x}$$是输入序列的长度。 如果我们的输入示例X是文本句子,则每个t = 1的特征向量$$x^{t}$$, . . . , $$\text { length } \mathbf{x}$$表示位置t的句子中的单词。 204 | 205 | ![6-9](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/6-9.png) 206 | 图9:RNN的前两层。 207 | 输入特征向量是二维的;每层有两个单元。 208 | 209 | 如图9所示,在RNN中,来自输入示例的特征向量被“读取”神经网络按时间顺序依次排列。索引t表示时间步长。为了在每个层l的每个单位u中的每个时间步t更新状态$$h_{l, u}^{t}$$,我们首先计算输入特征向量与来自先前时间步t-1的该相同层的状态向量$$\mathbf{h}_{l, u}^{t-1}$$的线性组合。 210 | 使用以下计算两个向量的线性组合两个参数矢量$$\mathbf{W} l, u$$,$$\mathbf{u}_{l}, u$$和参数$$b_{l, u}$$。然后通过将激活函数g1应用于线性组合的结果来获得$$h_{l, u}^{t}$$的值。一个典型的选择函数g1是tanh。输出$$\mathbf{y}_{l}^{t}$$通常是针对整个l层进行一次计算的向量。为了获得$$\mathbf{y}_{l}^{t}$$,我们使用激活函数g2,它将一个向量作为输入并返回一个同一维度的不同向量。函数g2应用于线性组合使用参数矩阵$$\mathbf{V}_{l}$$和参数向量l,u计算的状态向量值$$h_{l, u}^{t}$$。在分类中,g2的典型选择是softmax函数: 211 | 212 | $$ 213 | \boldsymbol{\sigma}(\mathbf{z}) \stackrel{\text { def }}{=}\left[\sigma^{(1)}, \ldots, \sigma^{(D)}\right], \text { where } \sigma^{(j)} \stackrel{\text { def }}{=} \frac{\exp \left(z^{(j)}\right)}{\sum_{k=1}^{D} \exp \left(z^{(k)}\right)} 214 | $$ 215 | 216 | softmax函数是S形函数到多维输出的推广。对于所有j,它具有$$\sum_{j=1}^{D} \sigma^{(j)}=1$$且$$\sigma^{(j)}>0$$的特性。 217 | 218 | 维数的维数由数据分析员选择,使得矩阵V1乘以向量hlt导致具有与向量cl相同维度的向量。 此选择取决于训练数据中输出标签y的维度。 (到目前为止,我们只看到了一维标签,但我们将在后面的章节中看到标签也可以是多维的。) 219 | 220 | 使用具有反向传播的梯度下降从训练数据计算$$\mathbf{w}_{l, u}, \mathbf{u}_{l, u}, b_{l, u}, \mathbf{V}_{l, u}$$和$$\mathbf{c}_{l, u}$$的值。 为了训练RNN模型,使用称为反向传播的特殊版本的反向传播。 221 | 222 | tanh和softmax都存在消失的梯度问题。即使我们的RNN只有一个或两个复发层,由于输入的顺序性,反向传播必须随着时间的推移“展开”网络。从梯度计算的角度来看,实际上这意味着输入序列越长,展开的网络就越深。 223 | 224 | RNN的另一个问题是处理长期依赖性。随着输入序列的长度增加,从序列开始的特征向量倾向于“被遗忘”,因为用作网络存储器的每个单元的状态受到最近读取的特征向量的显着影响。因此,在文本或语音处理中,长句中的远程单词之间的因果关系可能丢失。 225 | 226 | 在实践中使用的最有效的递归神经网络模型是门控RNN。这些包括长期短期记忆(LSTM)网络和基于门控循环单位(GRU)的网络。 227 | 228 | 在RNN中使用门控单元的美妙之处在于,此类网络可以将信息存储在其单元中以供将来使用,就像计算机内存中的位一样。 与实际存储器的不同之处在于,存储在每个单元中的信息的读取,写入和擦除由具有范围(0,1)中的值的激活函数控制。 经训练的神经网络可以“读取”特征向量的输入序列,并在某个早期时间步骤t确定以保持关于特征向量的特定信息。 关于先前特征向量的信息稍后可以由模型用于处理来自输入序列的末尾附近的特征向量。 例如,如果输入文本以单词she开头,则语言处理RNN模型可以决定存储关于性别的信息以正确地解释他们在句子中稍后看到的单词。 229 | 230 | 单位决定要存储哪些信息,何时允许读取,写入和删除。 这些决定是从数据中学习出来的,并通过门的概念来实现。 有几种门控单元的架构。 一个简单但有效的称为最小门控GRU,由一个存储单元和一个忘记门组成。 231 | 232 | 让我们看一下RNN第一层(将特征向量序列作为输入)的示例中的GRU单元的数学运算。 233 | 234 | 层l中的最小门控GRU单元u取两个输入:来自同一层中所有单元的存储单元值的向量前一个时间步长$$\mathbf{h}_{l}^{t-1}$$和一个特征向量$$\mathbf{x}^{t}$$。 然后使用这两个向量如下(以下序列中的所有操作都在一个接一个的单元中执行): 235 | $$ 236 | \begin{aligned} \tilde{h}_{l, u}^{t} & \leftarrow g_{1}\left(\mathbf{w}_{l, u} \mathbf{x}^{t}+\mathbf{u}_{l, u} \mathbf{h}_{l}^{t-1}+b_{l, u}\right) \\ \Gamma_{l, u}^{t} & \leftarrow g_{2}\left(\mathbf{m}_{l, u} \mathbf{x}^{t}+\mathbf{o}_{l, u} \mathbf{h}^{t-1}+a_{l, u}\right) \\ h_{l, u}^{t} & \leftarrow \Gamma_{l, u}^{t} \tilde{h}_{l}^{t}+\left(1-\Gamma_{l, u}^{t}\right) h_{l}^{t-1} \\ \mathbf{h}_{l}^{t} & \leftarrow\left[h_{l, 1}^{t}, \ldots, h_{l, s i z e_{l}}^{t}\right] \\ \mathbf{y}_{l}^{t} & \leftarrow \boldsymbol{g}_{3}\left(\mathbf{V}_{l} \mathbf{h}_{l}^{t}+\mathbf{c}_{l, u}\right) \end{aligned} 237 | $$ 238 | 239 | 其中g1是tanh激活函数,g2称为门函数,实现为sigmoid函数,取值范围为(0,1)。 如果门$$\Gamma_{l, u}$$接近0,则存储器单元保持其来自前一时间步$$h_{l}^{t-1}$$的值。 另一方面,如果门$$h_{l}^{t-1}$$接近1,则存储器单元的值被新值$$\tilde{h}_{l, u}^{t}$$覆盖(参见从顶部开始的第三个分配)。 就像在标准RNN中一样,g3通常是softmax。 240 | 241 | 门控单元接受输入并存储一段时间。 这个相当于将标识函数(f(x)= x)应用于输入。 因为身份函数的导数是常数,当一个网络具有门控单位通过时间反向传播训练,梯度不会消失。 242 | 243 | RNN的其他重要扩展包括双向RNN,具有关注的RNN和序列到序列RNN模型。 特别是后者经常用于构建神经机器翻译模型和用于文本到文本转换的其他模型。 RNN的推广是递归神经网络。 -------------------------------------------------------------------------------- /doc/7.md: -------------------------------------------------------------------------------- 1 | # 问题与答案 2 | 3 | 译者:[@laiczhang](https://github.com/laiczhang) 4 | 5 | ## 7.1 核回归 6 | 7 | 我们谈到了线性回归,但是如果我们的数据不具有直线形式呢?使用多项式回归可能会有所帮助。 假设我们有一个一维数据$\left\{\left(x_{i}, y_{i}\right)\right\}_{i=1}^{N}$。我们可以尝试为我们的数据设置二次方程$y=w_{1} x_{i}+w_{2} x_{i}^{2}+b$。通过定义均方误差成本函数,我们可以应用梯度下降并找到参数$w1,w2,b$的值,以最小化该成本函数。 在一维或二维空间中,我们可以很容易地看出函数是否包含数据。但是,如果我们的输入是D维特征向量并且D> 3,那么找到正确的多项式将很难。 8 | 9 | 核回归是一种非参数方法。 这意味着没有要学习的参数。 该模型基于数据本身(如kNN)。 在最简单的形式中,在内核回归中,我们寻找这样的模型:$f(x)=\frac{1}{N} \sum_{i=1}^{N} w_{i} y_{i},$ where $w_{i}=\frac{N k\left(\frac{x_{i}-x}{b}\right)}{\sum_{k=1}^{N} k\left(\frac{x_{k}-x}{b}\right)}$ (1) 10 | 11 | 函数k(·)是一个内核。 它可以有不同的形式,最常用的是高斯核:$k(z)=\frac{1}{\sqrt{2 \pi}} \exp \left(\frac{-z^{2}}{2}\right)$ 12 | 13 | ![7-1](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/7-1.png) 14 | 15 | 值b是我们使用验证集调整的超参数(通过在验证集示例上运行使用特定值b构建的模型并计算均值squarederror)。 你可以用它来说明方程1。 16 | 17 | 如果您的输入是多维特征向量,$x_{i}-x$ 和 $x_{k}-x$ 在方程1中。必须由欧几里德距离分别代替$\left\|\mathbf{x}_{i}-\mathbf{x}\right\|$ 和 $\left\|\mathbf{x}_{k}-\mathbf{x}\right\|$ 。 18 | 19 | ## 7.2 多类分类 20 | 21 | 在多分类中,标签可以是C类:$y \in\{1, \ldots, C\}$之一。许多机器学习算法是二进制的; SVM就是一个例子。 一些算法自然可以扩展到处理多类问题。ID3和其他决策树学习算法可以像这样简单地改变:$f_{I D 3}^{S} \stackrel{\mathrm{def}}{=} \operatorname{Pr}\left(y_{i}=c | \mathbf{x}\right)=\frac{1}{|S|} \sum_{\{y |(\mathbf{x}, y) \in S, y=c\}} y$,for all $c \in\{1, \ldots, C\}$ 22 | 23 | 通过用我们在第6章中已经看到的softmax函数替换sigmoid函数,逻辑回归可以自然地扩展到多类学习问题。 24 | 25 | kNN算法也很容易扩展到多类情况:当我们找到输入x的k个最接近的例子并检查它们时,我们返回我们在k个例子中看到的最多的类。 26 | 27 | SVM不能自然地扩展到多类问题。 在二进制情况下,某些算法可以更有效地实现。 如果您有多类问题但是二元分类学习算法,您应该怎么做? 一种常见的策略叫做一对一休息。 我们的想法是将多类问题转换为C二进制分类问题并构建C二进制分类器。例如,如果我们有三个类,$y \in\{1,2,3\}$ 我们创建原始数据集的副本并进行修改。 在第一个副本中,我们将所有不等于1的标签替换为0.在第二个副本中,我们将所有不等于2的标签替换为0.在第三个副本中,我们将所有不等于3的标签替换为0.现在我们 有三个二元分类问题,我们必须学会区分标签1和0,2和0,以及标签3和0之间。 28 | 29 | 一旦我们有三个模型并且我们需要对新输入特征向量x进行分类,我们将三个模型应用于输入,并且我们得到三个预测。 然后我们选择非零类的预测,这是最确定的。 请记住,在逻辑回归中,模型不返回标签,而是返回得分(0,1),可以将其解释为标签为正的概率。 我们也可以将此分数解释为预测的确定性。 在SVM中,确定性的模拟是从输入x到决策边界的距离。 这个距离是由$d=\frac{\mathbf{w}^{*} \mathbf{x}+b^{*}}{\|w\|}$ 给出的。 30 | 31 | 距离越大,预测越确定。 大多数学习算法可以自然地转换为多类情况,或者它们返回我们可以在一对战策略中使用的分数。 32 | 33 | ## 7.3 单类分类 34 | 35 | 一类分类,也称为一元分类或类建模,试图通过从仅包含该类对象的训练集中学习来识别所有对象中特定类的对象。 与传统的分类问题不同,后者试图用包含来自所有类的对象的训练集来区分两个或更多个类。 典型的一类分类问题是正常情况下安全网络中传输的分类。 在这种情况下,攻击或入侵期间的流量示例很少(如果有)。 然而,正常交通的例子通常很多。 一类分类学习算法用于异常值检测,异常检测和新颖性检测。 36 | 37 | 有几种一流的学习算法。 在实践中最广泛使用的是一类高斯,一类kmeans,一类kNN和一类SVM。 38 | 39 | 一类高斯背后的想法是我们将数据建模为好像它来自高斯分布,更准确地说是多元正态分布(MND)。 MND的概率密度函数(pdf)由以下等式给出:$f_{\boldsymbol{\mu}, \mathbf{\Sigma}}(\mathbf{x})=\frac{\exp \left(-\frac{1}{2}(\mathbf{x}-\boldsymbol{\mu})^{\mathrm{T}} \mathbf{\Sigma}^{-1}(\mathbf{x}-\boldsymbol{\mu})\right)}{\sqrt{(2 \pi)^{D}|\boldsymbol{\Sigma}|}}$ 40 | 41 | 其中,$f_{\mu, \mathbf{\Sigma}}(\mathbf{x})$返回对应于输入特征向量x的概率密度。概率密度可以解释为示例x从我们建模为MND的概率分布中抽取的可能性。值$μ$(向量)和$Σ$(矩阵)是我们必须学习的参数。最大似然准则(类似于我们如何解决逻辑回归学习问题)被优化以找到这两个参数的最佳值。$|\mathbf{\Sigma}|=\operatorname{det} \mathbf{\Sigma}$是矩阵$Σ$的行列式。符号$\mathbf{a}^{T}$表示向量$a$的转置。$\mathbf{\Sigma}^{-1}$是矩阵$Σ$的逆矩阵。 42 | 43 | 如果行列式,转置和逆矩阵对您来说是新知识,请不要担心。 这些是来自数学分支的矢量和矩阵的标准运算,称为矩阵理论。 如果你觉得有必要知道它们是什么,维基百科很好地解释了这些概念。 44 | 45 | 实际上,矢量$μ$中的数字决定了我们的高斯分布曲线居中的位置,而$Σ$中的数字决定了曲线的形状。 对于由二维特征向量组成的训练集,在图2中给出了单类高斯模型的示例。 46 | 47 | ![7-2](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/7-2.png) 48 | 49 | 一旦我们的模型通过$μ$和$Σ$从数据中学习参数化,我们就可以通过使用$f_{\boldsymbol{\mu}, \boldsymbol{\Sigma}}(\mathbf{x})$来预测每个输入$x$的可能性。 只有当可能性高于某一某个阈值时,我们预测这个例子属于我们的类; 否则,它被归类为异常值。 阈值的值可以通过实验或使用“有根据的猜测”找到。 50 | 51 | 当数据具有更复杂的形状时,更高级的算法可以使用几个高斯的组合(称为高斯混合)。 在这种情况下,可以从数据中学习更多参数:每个高斯的一个$μ$和一个$Σ$以及允许组合多个高斯形成一个pdf的参数。 在第9章中,我们考虑了高斯混合体和聚类应用。 52 | 53 | 一类kmeans和一类kNN基于与一类Gaussian相似的原理:构建一些数据模型,然后根据模型确定我们的新特征向量是否与其他示例类似。 在前者中,使用kmeans聚类算法对所有训练示例进行聚类,并且当观察到新示例x时,距离$d(\mathbf{x})$被计算为$x$与每个聚类的中心之间的最小距离。 如果$d(\mathbf{x})$小于特定阈值,则$x$属于该类。 54 | 55 | 根据公式,单类SVM尝试1)将所有训练样例与原点(在特征空间中)分开并最大化从超平面到原点的距离,或2)以获得围绕数据的球形边界。 最小化这个超球面的体积。 我留下了一类kNN算法的描述,以及一类kmeans和一类SVM的细节,用于补充阅读。![7-3](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/7-3.png) 56 | 57 | 58 | 59 | ## 7.4 多标签分类 60 | 61 | 在多标签分类中,每个训练示例不仅有一个标签,而且还有几个标签。 例如,如果我们想要描述一个图像,我们可以为它分配几个标签:“人”,“音乐会”,“自然”,同时分配这三个标签。 62 | 63 | 标签的可能值的数量很多,但它们都具有相同的性质,例如标签,我们可以将每个标记的示例转换为几个标记的示例,每个标签一个。 这些新示例都具有相同的特征向量和仅一个标签。 这成为一个多类分类问题。 我们可以使用one-rest策略来解决它。 与通常的多类问题唯一不同的是,现在我们有了一个新的超参数:阈值。 如果某个标签的预测分数高于阈值,则为输入特征向量预测该标签。 在这种情况下,可以为一个特征向量预测多个标签。 使用验证集选择阈值。 64 | 65 | 类似地,自然可以制成多类算法(决策树,逻辑回归和神经网络等)可以应用于多标签分类问题。 因为它们返回每个类的分数,所以我们可以定义阈值,然后如果阈值高于使用验证集实验选择的某个值,则为一个特征向量分配多个标签。 66 | 67 | 神经网络算法可以通过使用二元交叉熵成本函数自然地训练多标签分类模型。 在这种情况下,神经网络的输出层每个标签有一个单元。 输出层的每个单元具有S形激活功能。 68 | 69 | 因此,每个标记$l$是二进制的($y_{i, l} \in\{0,1\}$),其中$l=1, \ldots, L$ 且 $i=1, \ldots, N$ 。预测概率$\hat{y}_{i, l}$的二元交叉熵,即示例$\mathbf{x}_{i}$具有标记$l$的概率为:$-\left(y_{i, l} \ln \left(\hat{y}_{i, l}\right)+\left(1-y_{i, l}\right) \ln \left(1-\hat{y}_{i, l}\right)\right)$最小化标准仅仅是所有训练样本中所有二元交叉熵项的平均值以及这些示例的所有标签。 在每个标签可以采用的可能值的数量很小的情况下,可以将多标签转换为多标签问题。 想象一下以下问题。 我们想要标记图像和标签可以有两种类型。 第一种标签可以有两个可能的值: { photo,painting } ; 第二种类型的标签可以有三个可能的值:{portrait,paysage,other}.我们可以为两个原始类的每个组合创建一个新的假类,如下所示:![7-4](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/7-4.png) 70 | 71 | 现在我们有相同的标记示例,但是我们用一个假标签替换真正的多标签,其值为1到6.当没有太多可能的类组合时,这种方法在实践中很有效。 否则,您需要使用更多的训练数据来补偿增加的类集。 72 | 73 | 后一种方法的主要优点是,您可以保持标签的相关性,这与先前看到的预测每个标签彼此独立的方法相反。 标签之间的相关性可能是许多问题中的基本属性。 例如,如果您想要预测电子邮件是否是垃圾邮件或not_spam,则可以预测它是普通电子邮件还是优先电子邮件。 您希望避免像[垃圾邮件,优先级]这样的预测。 74 | 75 | ## 7.5 集成学习 76 | 77 | 集成学习是一种学习范式,它不是试图学习超精确模型,而是专注于训练大量低精度模型,然后将这些弱模型给出的预测结合起来,以获得高精度的元模型。 低精度模型通常由弱学习者学习,即学习算法无法学习复杂模型,因此通常在训练和预测时快速。 最常用的弱学习者是决策树学习算法,其中我们经常在几次迭代后停止分割训练集。 获得的树很浅而且不是特别准确,但是集合学习背后的想法是如果树不相同并且每棵树至少比随机猜测略好,那么我们可以通过组合大量这样的树来获得高精度。 78 | 79 | 为了获得输入$x$的预测,使用某种加权投票来组合每个弱模型的预测。 投票权重的具体形式取决于算法,但是,与算法无关,这个想法是相同的:如果弱模型理事会预测该消息是垃圾邮件,那么我们将标签垃圾邮件分配给$x$。 两种最广泛使用和有效的集成学习算法是随机森林和梯度增强。 80 | 81 | ### 7.5.1 随机森林 82 | 83 | 有两种集合学习范例:套袋和提升。 套袋包括创建训练数据的许多“副本”(每个副本与另一个副本略有不同),然后将弱学习者应用于每个副本以获得多个弱模型然后将它们组合。 套袋范例是随机森林学习算法的背后。 84 | 85 | “vanilla”装袋算法的工作原理如下。 给定训练集,我们创建训练集的$B$随机样本$S_{b}$(对于每个$b=1, \ldots, B $),并使用每个样本$S_{b}$作为训练集来构建决策树模型$f_b$。 为了对某些$b$采样$S_{b}$,我们进行了替换采样。 这意味着我们从空集开始,然后从训练集中随机选取一个示例,并通过将原始示例保留在原始训练集中将其精确副本放入$S_{b}$。 我们一直随机挑选示例,直到$\left|S_{b}\right|=N$. 86 | 87 | 训练结束后,我们有B决策树。 获得新示例x的预测作为B预测的平均值:$y \leftarrow \hat{f}(\mathbf{x}) \stackrel{\mathrm{def}}{=} \frac{1}{B} \sum_{b=1}^{B} f_{b}(\mathbf{x})$ ,在回归的情况下,或在分类的情况下通过多数投票。 88 | 89 | 随机森林算法与香草套袋不同,只有一种方式。 它使用修改树学习算法,在学习过程中的每个分割中检查特征的随机子集。 这样做的原因是为了避免树的相关性:如果一个或几个特征是目标的非常强的预测器,则将选择这些特征以在许多树中分割示例。 这将在我们的“森林”中产生许多相关树。相关预测器无助于提高预测的准确性。 模型集成性能更好的主要原因是,良好的模型可能会对同一预测达成一致,而糟糕的模型可能会对不同的模型产生不同意见。 相关性将使坏模型更有可能达成一致,这将阻碍多数投票或平均投票。 90 | 91 | 要调整的最重要的超参数是树的数量$B$,以及每次拆分时要考虑的特征的随机子集的大小。 92 | 93 | 随机森林是最广泛使用的集成学习算法之一。 它为什么如此有效? 原因是通过使用原始数据集的多个样本,我们减少了最终模型的方差。 请记住,低方差意味着低过度配置。 虽然在我们的数据集中,但是因为我们的数据集只是对现象中所有可能的示例进行填充,所以我们试图建模。 如果我们不熟悉我们的训练集是如何被采样的,那么它可能包含一些不期望的(但不可避免的)伪像:噪声,异常值以及过度或不足的示例。 通过创建多个随机样本并替换我们的训练集,我们可以减少这些伪影的影响。 94 | 95 | ### 7.5.2梯度增强 96 | 97 | 另一种有效的集成学习算法是梯度增强。 让我们首先看一下回归的梯度增强。 为了构建一个强大的回归量,我们从常量模型$f=f_{0}$开始(就像我们在ID3中所做的那样):$f=f_{0}(\mathbf{x}) \stackrel{\mathrm{def}}{=} \frac{1}{N} \sum_{i=1}^{N} y_{i}$ 98 | 99 | 然后我们在训练集中修改每个例子$i=1, \ldots, N$的标签,如下所示:$\hat{y}_{i} \leftarrow y_{i}-f\left(\mathbf{x}_{i}\right)$ (2) 100 | 101 | 其中$\hat{y}_{i}$,称为残差,是新标签,例如$x_{i}$。 102 | 103 | 现在我们使用修改训练集,用残差而不是原始标签来构建新的决策树模型$f_{1}$。 现在将增强模型定义为$f \stackrel{\mathrm{def}}{=} f_{0}+\alpha f_{1}$,其中$α$是学习速率(超参数)。 104 | 105 | 然后我们使用方程2重新计算残差。再次替换训练数据中的标签,训练新的决策树模型$f_{2}$,将增强模型重新定义为$f \stackrel{\mathrm{def}}{=} f_{0}+\alpha f_{1}+\alpha f_{2}$,并且该过程继续直到$M$(另一个超参数)树的最大值被组合。 106 | 107 | 直观地说,这里发生了什么? 通过计算残差,我们发现当前模型f预测每个训练样例的目标的好坏程度(或差)。 然后我们训练另一棵树来修复当前模型的误差(这就是为什么我们使用残差而不是真实标签)并将这个新树添加到具有一些权重$α$的现有模型中。 因此,添加到模型中的每个附加树部分地修复了先前树所做的错误,直到组合了最大数量的树。 108 | 109 | 现在你应该合理地问为什么算法被称为梯度增强? 在梯度增强中,我们不计算任何与第4章中线性回归相反的梯度。 为了看到梯度增强和梯度下降之间的相似性,请记住为什么我们在线性回归中计算梯度:我们这样做是为了了解我们应该在哪里移动参数值以使MSE成本函数达到最小值。 梯度显示了方向,但是我们不知道我们应该朝这个方向走多远,所以我们在每次迭代时使用了一个小步α,然后重新评估了我们的方向。 在梯度增强中也是如此。 然而,我们不是直接获得渐变,而是以残差的形式使用其代理:它们向我们展示了如何调整模型以便减少误差(残差)。 110 | 111 | 调整梯度增强的三个主要超参数是树的数量,学习速率和树的深度 - 这三个都是模型的精确度。 树木的深度也会影响训练和预测的速度:越短,越快。 112 | 113 | 可以证明,对残差的训练优化了均方误差标准的整体模型f。 你可以在这里看到与装袋的不同之处:增强可以减少偏差(或者在配置下)而不是方差。 因此,提升可以超过。 但是,通过调整树木的深度和数量,可以在很大程度上避免过度配置。 114 | 115 | 渐进式算法的分类方法类似,但很有可能。 让我们考虑二元情况。 假设我们有M个回归决策树。 与逻辑回归类似,使用sigmoid函数对决策树集合的预测进行建模:$\operatorname{Pr}(y=1 | \mathbf{x}, f) \stackrel{\mathrm{def}}{=} \frac{1}{1+e^{-f(\mathbf{x})}}$,其中$f(\mathbf{x})=\sum_{m=1}^{M} f_{m}(\mathbf{x})$且$f_{m}$是回归树。 116 | 117 | 同样,在逻辑回归中,我们通过尝试找到最大化$L_{f}=\sum_{i=1}^{N} \ln \left(\operatorname{Pr}\left(y_{i}=1 | \mathbf{x}_{i}, f\right)\right)$的$f$来应用最大似然原理。 同样,为了避免数值超过流量,我们最大化对数似然的总和而不是可能性的乘积。 118 | 119 | 该算法以初始常数模型$f=f_{0}=\frac{p}{1-p}$开始,其中$p=\frac{1}{N} \sum_{i=1}^{N} y_{i}$。 (可以证明这种初始化对于sigmoid函数是最佳的。)然后在每次迭代$m$,将新的树$f_{m}$添加到模型中。 为了找到最佳的$f_{m}$,首先计算当前模型的偏导数$g_{i}$,每个$i=1, \ldots, N $:$g_{i}=\frac{d L_{f}}{d f}$,其中$f$是在前一次迭代$m-1$中构建的集合分类器模型。为了计算$g_{i}$,我们需要找到关于所有$i$的$f$的$\ln \left(\operatorname{Pr}\left(y_{i}=1 | \mathbf{x}_{i}, f\right)\right)$的导数。 注意$\ln \left(\operatorname{Pr}\left(y_{i}=1 | \mathbf{x}_{i}, f\right)\right) \stackrel{\operatorname{def}}{=} \ln \left(\frac{1}{1+e^{-f\left(\mathbf{x}_{i}\right)}}\right)$。 前一个等式中右手项的导数相对于$f$等于$\frac{1}{e^{f\left(\mathbf{x}_{i}\right)}+1}$。 120 | 121 | 然后,我们通过用相应的偏导数$g_{i}$替换原始标签$y_{i}$来变换我们的训练集,并且我们使用变换的训练集来构建新的树$f_{m}$。 然后我们找到最佳更新步骤$ρ_{m}$:$\rho_{m}=\underset{\rho}{\arg \max } L_{f+\rho f_{m}}$ 122 | 123 | 在迭代$m$结束时,我们通过添加新树$f_{m}$来更新集合模型$f$:$f \leftarrow f+\alpha \rho_{m} f_{m}$ 124 | 125 | 我们迭代直到$m = M$,然后我们停止并返回整体模型$f$。 126 | 127 | 渐变增强是最强大的机器学习算法之一。 不仅因为它创建了非常精确的模型,还因为它能够处理具有数百万个示例和功能的大型数据集。 它通常在准确性上优于随机森林,但由于其连续性,在训练中可能会明显变慢。 128 | 129 | ## 7.6 学习标记序列 130 | 131 | 序列是最常观察到的结构化数据类型之一。 我们使用单词和句子的顺序进行交流,我们按顺序执行任务,我们的基因,我们听的音乐和我们观看的视频,我们对连续过程的观察,例如移动的汽车或股票的价格都是连续的。 132 | 133 | 在序列标记中,标记的顺序示例是一对列表$(X,Y)$,其中X是特征向量的列表,每个时间步长一个,$Y$是相同长度的标签的列表。 例如,$X$可以表示句子中的单词,如[“big”,“beautiful”,“car”],$Y$可以是相应词性的列表,例如[“形容词”,“形容词”, “名词”])。 更正式地,在示例$i$中,$X_{i}=\left[\mathbf{x}_{i}^{1}, \mathbf{x}_{i}^{2}, \ldots, \mathbf{x}_{i}^{\text {size}}\right]$,其中$size_{i}$是示例$i$的序列的长度,$Y_{i}=\left[y_{i}^{1}, y_{i}^{2}, \ldots, y_{i}^{s i z e_{i}}\right]$和$y_{i} \in\{1,2, \ldots, C\}$。 134 | 135 | 您已经看到RNN可用于注释序列。 在每个时间步长$t$,它读取输入特征向量$\mathbf{x}_{i}^{(t)}$,最后一个复发层最后输出标签$y_{l a s t}^{(t)}$(在二进制标记的情况下)或最后输出$y_{l a s t}^{(t)}$(在 多类或多标签标签)。 136 | 137 | 然而,RNN不是序列标记的唯一可能模型。 称为条件随机场(CRF)的模型是一种非常有效的替代方案,在实践中通常对具有许多信息特征的特征向量表现良好。 例如,假设我们有命名实体提取的任务,我们想要构建一个模型,用以下类之一标记句子中的每个单词,例如“我去旧金山”:{location,name,company_name, 其他}。 如果我们的特征向量(代表单词)包含诸如“单词是否以大写字母开头”和“是否可以在位置列表中找到该单词”这样的二进制特征,则这些特征将提供非常丰富的信息。 帮助将San和Francisco这两个词分类为位置。 众所周知,构建手工制作的特征是一个劳动密集型过程,需要大量的领域专业知识。 138 | 139 | CRF是一个有趣的模型,可以看作是对序列的逻辑回归的推广。 然而,在实践中,它已经被双向深门控RNN用于序列标记任务。 CRF在训练中也明显变慢,这使得它们很难应用于大型训练集(有数十万个例子)。 此外,大型训练集是深度神经网络蓬勃发展的地方。 140 | 141 | ![7-5](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/7-5.png) 142 | 143 | ## 7.7序列到序列学习 144 | 145 | 序列到序列学习(通常简称为secq2seqlearning)是序列标记问题的中心化。 在seq2seq中,$X_{i}$和$Y_{i}$可以有不同的长度。 seq2seq模型已经在机器翻译中找到应用(例如,输入是英语句子,输出是相应的法语句子),会话界面(输入是用户输入的问题,输出是 从机器上回答),文本摘要,拼写纠正等等。 146 | 147 | 许多但不是大多数序列到序列学习问题目前最好通过神经网络解决。 机器翻译是一个臭名昭着的例子。 seq2seq有多种神经网络架构,根据任务的不同,它们的性能优于其他架构。 所有这些网络架构都有一个共同的特性:它们有两个部分,一个编码器和一个解码器(因此它们也被称为编码器 - 解码器神经网络)。 148 | 149 | 在seq2seq学习中,编码器是一个接受顺序输入的神经网络。 它可以是RNN,也可以是CNN或其他一些架构。 编码器的作用是读取输入并生成某种状态(类似于RNN中的状态),可以将其视为机器可以使用的输入含义的数字表示。 某个实体的含义,无论是图像,文本还是视频,通常都是包含实数的矢量或矩阵。 这个向量(或矩阵)在机器学习术语中被称为输入的嵌入。 150 | 151 | seq2seq学习中的解码器是另一个神经网络,它将嵌入作为输入并且能够生成一系列输出。 正如您可能已经猜到的那样,嵌入来自编码器。 为了产生一系列输出,解码器采用序列输入特征向量$\mathbf{x}^{(0)}$的开始(通常为全零),产生第一输出$\mathbf{y}^{(1)}$,通过组合嵌入和输入$\mathbf{x}^{(0)}$来更新其状态 ,然后使用输出$\mathbf{y}^{(1)}$作为其下一个输入$\mathbf{x}^{(1)}$。 为简单起见,$\mathbf{y}^{(t)}$的维数可以与$\mathbf{x}^{(t)}$的维度相同; 但是,这不是绝对必要的。 正如我们在第6章中看到的那样,RNN的每一层都可以产生许多同时输出:一个可用于生成标签$\mathbf{y}^{(t)}$,而另一个具有不同维度的输出可用作$\mathbf{x}^{(t)}$。 152 | ![7-6](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/7-6.png) 153 | 154 | 使用训练数据同时训练编码器和解码器。 解码器输出处的误差通过反向传播传播到编码器。 155 | 156 | 传统的seq2seq架构如图所示。 图4使用注意力的架构可以获得更准确的预测。 注意机制由一组额外的参数实现,这些参数组合来自编码器的一些信息(在RNN中,该信息是来自所有编码器时间步骤的最后一个重复层的状态向量的列表)和解码器的当前状态以生成 标签。 与门控单元和双向RNN相比,这可以更好地保留长期依赖性。 图5中示出了一个引人注目的seq2seq架构。 157 | 158 | ![7-7](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/7-7.png) 159 | 160 | 序列到序列学习是相对较新的研究领域。 定期发现并发布新的网络架构。 培训这样的架构可能具有挑战性,因为调整的超参数和其他架构决策的数量可能是压倒性的。 我建议您查阅本书的wiki,了解最新的材料,教程和代码示例。 161 | 162 | ![7-8](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/7-8.png) 163 | 164 | 165 | 166 | ## 7.8 主动学习 167 | 168 | 主动学习是一种有趣的监督学习范式。 通常在获得标记的示例时使用它是昂贵的。 在医疗或金融领域中通常就是这种情况,其中可能需要专家的意见来注释患者或客户的数据。 我们的想法是,我们使用相对较少的标记示例和大量未标记的示例开始学习,然后仅将标签添加到对模型质量贡献最大的那些示例中。 169 | 170 | 主动学习有多种策略。 在这里,我们仅讨论以下两个: 171 | 172 | 1)基于数据密度和不确定性,以及 173 | 174 | 2)支持基于矢量的。 175 | 176 | 前一策略将使用现有标记示例训练的当前模型f应用于剩余的未标记示例中的每一个(或者,为了节省计算时间,将其保存到它们的一些随机样本中)。 对于每个未标记的示例x,计算以下重要性分数:密度($x$)*不确定性($f(x)$)。 密度反映了在其邻近区域中围绕$x$的示例,而不确定性$f(x)$反映了模型f的预测对于x的不确定性。 在具有sigmoid的二进制分类中,预测分数越接近0.5,预测就越不确定。 在SVM中,示例越靠近决策边界,最不确定的是预测。 177 | 178 | 在多类分类中,熵可以用作不确定性的典型度量:$\mathrm{H}_{f}(\mathrm{x})=-\sum_{c=1}^{C} \operatorname{Pr}\left(y^{(c)} ; f(\mathrm{x})\right) \ln \operatorname{Pr}\left(y^{(c)} ; f(\mathrm{x})\right)$ 179 | 180 | 其中$\operatorname{Pr}\left(y^{(c)} ; f(\mathbf{x})\right)$是模型$f$在分类$x$时分配给类$y^{(c)}$的概率分数。你可以看到,如果每个$y^{(c)}$,$f\left(y^{(c)}\right)=\frac{1}{C}$,则模型最不确定,熵最大为1; 另一方面,如果对于某些$y^{(c)}, f\left(y^{(c)}\right)=1$,则模型确定关于类$y^{(c)}$并且熵最小为0。 181 | 182 | 可以通过获取从x到其k个最近邻居中的每一个的平均距离来获得示例x的密度(其中k是超参数)。 183 | 184 | 一旦我们知道每个未标记示例的重要性得分,我们选择具有最高重要性得分的那个并请求专家对其进行注释。 然后我们将新注释的示例添加到训练集,重建模型并继续该过程,直到满足一些停止标准。 可以提前选择停止标准(基于可用预算向专家请求的最大数量),或者取决于我们的模型根据某个度量标准执行的程度。 185 | 186 | 基于支持向量的主动学习策略包括使用标记数据构建SVM模型。 然后,我们请求我们的专家注释最接近分隔两个类的超平面的未标记示例。 这个想法是,如果这个例子最接近超平面,那么它是最不确定的,并且会对真实(我们寻找的)超平面可能存在的可能位置的减少贡献最大。 187 | 188 | 一些主动学习策略可以包括向专家询问标签的成本。 其他人学会询问专家的意见。 “委员会查询”策略包括使用不同的方法训练多个模型,然后请专家标记这些模型最不同意的示例。 一些策略尝试选择标注示例,以便模型的方差或偏差减少最多。 189 | 190 | ## 7.9 半监督学习 191 | 192 | 在半监督学习(SSL)中,我们也标记了数据集的一小部分; 大多数其余的例子都没有标记。 我们的目标是利用大量未标记的示例来提高模型性能,而无需咨询专家的标签示例。 193 | 194 | 从历史上看,有多次尝试解决这个问题。 它们都不能被称为普遍赞誉并且经常在实践中使用。 例如,一种经常引用的SSL方法称为“自学习”。在自学习中,我们使用学习算法使用标记的示例来构建初始模型。 然后我们将模型应用于所有未标记的示例,并使用模型标记它们。 如果某些未标记的示例x的预测的置信分数高于某个阈值(通过实验选择),那么我们将这个标记的示例添加到我们的训练集中,重新训练模型并继续这样,直到满足停止标准。 例如,如果在最后$m$次迭代期间模型的准确性没有得到改善,我们就可以停止。 195 | 196 | 与仅使用最初标记的数据集相比,上述方法可以为模型带来一些改进,但性能的提高通常不是很令人印象深刻。 此外,在实践中,模型的质量甚至可以降低。 这取决于数据来源的统计分布的属性,我们通常不知道。 197 | 198 | 另一方面,神经网络学习的最新进展带来了一些令人印象深刻的结果。 例如,据显示,对于某些数据集,例如MNIST(计算机视觉中的频繁测试平台,由0到9的手写数字标记图像组成),以半监督方式训练的模型具有几乎完美的性能 每个类别10个标记的示例(总共100个标记的示例)。 为了比较,MNIST包含70,000个标记示例(60,000个用于训练,10,000个用于测试)。 获得如此卓越性能的神经网络架构称为梯形网络。 要了解梯形网络,您必须了解自动编码器的含义。 199 | 200 | 自动编码器是具有编码器 - 解码器架构的前馈神经网络。 它经过培训可以重建其输入。 所以训练样例是一对$(x,x)$。 我们希望模型$f(x)$的输出x尽可能类似于输入$x$。 201 | 202 | ![7-9](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/7-9.png) 203 | 204 | 这里一个重要的细节是自动编码器的网络看起来像一个沙漏,中间有一个瓶颈层,包含D维输入向量的嵌入; 嵌入层通常具有比D少得多的单元。解码器的目标是从该嵌入重构输入特征向量。 从理论上讲,在瓶颈层中有10个单元来成功编码MNIST图像是非常有用的。 在典型的自动编码器中,如图所示。 在图6中,成本函数通常是均方误差(当特征可以是任何数字时)或负对数似然(当特征是二进制并且解码器的最后一层的单位具有S形激活函数时)。 如果成本是均方误差,则由下式给出:$\frac{1}{N} \sum_{i=1}^{N}\left\|\mathbf{x}_{i}-f\left(\mathbf{x}_{i}\right)\right\|^{2}$,其中$\left\|\mathbf{x}_{i}-f\left(\mathbf{x}_{i}\right)\right\|$是两个向量之间的欧几里德距离 205 | 206 | 去噪自动编码器通过向特征添加一些随机扰动来破坏训练示例$(x,x)$中的左侧$x$。 如果我们的示例是具有表示为0和1之间的值的像素的灰度图像,则通常将普通高斯噪声添加到每个特征。 对于输入特征向量x的每个特征$j$,噪声值$n^{(j)}$从以下分布中采样:$n^{(j)} \sim \frac{1}{\sigma \sqrt{2 \pi}} \exp \left(-\frac{(-\mu)^{2}}{2 \sigma^{2}}\right)$,其中符号$〜$表示“从中采样”,$π$是常数3.14159 ...而$μ$是必须调整的超参数。 特征$x^{(j)}$的新的,损坏的值由$x^{(j)}+ n{(j)}$给出。 207 | 208 | 梯形网络是一种具有升级功能的去噪自动编码器。 编码器和解码器具有相同的层数。 瓶颈层直接用于预测标签(使用softmax激活功能)。 该网络具有多种成本功能。 对于编码器的每个层$l$和解码器的对应层$l$,一个成本$C_{d}^{l}$惩罚两个层的输出之间的差异(使用平方欧几里德距离)。 当在训练期间使用标记示例时,另一个成本函数$C_{c}$惩罚标签预测中的误差(使用负对数似然成本函数)。 组合的成本函数$C_{c}+\sum_{l=1}^{L} \lambda_{l} C_{d}^{l}$(在批次中的所有实例上平均)通过随后的梯度下降与反向传播来优化。 每个层$l$的超参数$λ_{l}$确定分类和编码 - 解码成本之间的交换。 209 | 210 | 在梯形网络中,不仅输入被噪声破坏,而且每个编码器层的输出(在训练期间)也被破坏。 当我们将训练的模型应用于新输入$x$以预测其标签时,我们不会破坏输入。 211 | 212 | 存在与训练神经网络无关的其他半监督学习技术。 其中一个意味着使用标记数据构建模型,然后使用任何聚类技术将未标记和标记的示例聚集在一起(我们在第9章中考虑其中的一些)。 213 | 214 | 对于每个新示例,我们然后输出它所属的集群中的多数标签作为预测。 另一种称为S3VM的技术基于使用SVM。 我们为每个可能的未标记示例标记构建一个SVM模型,然后我们选择具有最大边距的模型。 关于S3VM的论文描述了一种方法,该方法允许在不实际枚举所有可能的标签的情况下解决该问题。 215 | 216 | ## 7.10 单样本学习 217 | 218 | 这个章节可能完全没有完成任何其他重要的监督学习范式。 其中之一是一次性学习。 在一次性学习中,通常应用于人脸识别,我们想要建立一个模型,可以识别同一个人的两张照片代表同一个人。 如果我们向模特展示两张不同人物的两张照片,我们希望模特能够认识到这两个人是不同的。 219 | 220 | 构建这种模型的一种方法是训练暹罗神经网络(SNN)。 SNN可以实现为任何类型的神经网络,CNN,RNN或MLP。 重要的是我们如何培训网络。 221 | 222 | 为了训练SNN,我们使用三重态损失函数。 例如,让我们有三个面部图像:图像$A$(用于锚点),图像$P$(用于正面)和图像$N$(用于负面)。 $A$和$P$是同一个人的两张不同的照片; $N$是另一个人的照片。 每个训练示例i现在是三元组($A_{i},P_{i},N_{i}$)。 223 | 224 | 假设我们有一个神经网络模型$f$,它可以将一张面部图片作为输入并输出该图片的嵌入。 一个例子的三重态损失定义为,$\max \left(\left\|f\left(A_{i}\right)-f\left(P_{i}\right)\right\|^{2}-\left\|f\left(A_{i}\right)-f\left(N_{i}\right)\right\|^{2}+\alpha, 0\right)$ (3) 225 | 226 | 成本函数定义为平均三重损失:$\frac{1}{N} \sum_{i=1}^{N} \max \left(\left\|f\left(A_{i}\right)-f\left(P_{i}\right)\right\|^{2}-\left\|f\left(A_{i}\right)-f\left(N_{i}\right)\right\|^{2}+\alpha, 0\right)$,其中$α$是正超参数。 直观地,当我们的神经网络为$A$和$P$输出类似的嵌入向量时,$\|f(A)-f(P)\|^{2}$是低的; 当两个不同人物的图片嵌入不同时,$\left\|f\left(A_{i}\right)-f\left(N_{i}\right)\right\|^{2}$很高。如果我们的模型以我们想要的方式工作,则术语$m=\left\|f\left(A_{i}\right)-f\left(P_{i}\right)\right\|^{2}-\left\|f\left(A_{i}\right)-f\left(N_{i}\right)\right\|^{2}$将始终为负,因为我们从较小的值中减去一个高值。 通过将$α$设置得更高,我们强制使用该术语$m$要更小,以确保模型学会识别两个相同的面和两个具有高边距的不同面。 如果$m$不够小,那么由于$α$,成本将为正,并且模型参数将在反向传播中进行调整。 227 | 228 | 不是随机选择N的图像,而是为训练创建三元组的更好方法是在几个学习时期之后使用当前模型,并根据该模型找到与$A$和$P$类似的$N$的候选者。 使用随机例子作为$N$会显着减慢训练速度,因为神经网络很容易看到两个随机人物的图像之间的差异,因此大多数时候平均三胞胎损失会很低,而且参数的更新速度也不够快。 229 | 230 | 为了构建SNN,我们首先决定我们的神经网络的架构。 例如,如果我们的输入是图像,CNN是典型的选择。 举一个例子,为了计算平均三重态损失,我们连续地将模型应用于$A$,然后应用于$P$,然后应用于$N$,然后我们使用等式3计算该示例的损失。 我们对批次中的所有三元组重复这一点,然后计算成本; 具有反向传播的梯度下降通过网络传播成本以更新其参数。 231 | 232 | 这是一种常见的误解,对于一次性学习,我们只需要每个实体的一个例子进行训练。 在实践中,我们需要每个人的一个以上的例子,以使人识别模型准确。 它被称为一次性,因为这种模型的应用最频繁:基于面部的身份验证。 例如,这种模型可用于解锁手机。 如果你的模型很好,那么你只需要在你的手机上有一张你的照片,它就会认出你,而且它会认出别人不是你。 当我们有模型时,为了确定两张图片$A$和是$\hat{A}$否属于同一个人,我们检查$\|f(A)-f(\hat{A})\|^{2}$是否小于某个阈值$τ$,这是模型的另一个超参数。 233 | 234 | ## 7.11 零样本学习 235 | 236 | 我们通过零样本学习来完成本章。 这是一个相对较新的研究领域,而且还提出了一个尚未实现实用性的算法。 因此,我只在此概述基本思想,并留下各种算法的细节以供进一步阅读。 在零样本学习(ZSL)中,我们想要训练模型以将标签分配给对象。 最常见的应用是学习为图像分配标签。 237 | 238 | 但是,我们希望模型能够预测我们在训练数据中没有的标签。 怎么可能? 239 | 240 | 诀窍是使用嵌入不仅代表输入$x$而且代表输出$y$。 想象一下,我们有一个模型,对于英语中的任何单词都可以生成具有以下属性的嵌入向量:如果单词yi与单词yk具有相似的含义,则这两个单词的嵌入向量将是相似的。 例如,如果$y_{i}$是Paris而$y_{k}$是Rome,那么它们将具有类似的嵌入; 另一方面,如果$y_{k}$是马铃薯,那么$y_{i}$和$y_{k}$的嵌入将是不同的。 这种嵌入向量称为“字嵌入”,它们通常使用余弦相似度量度进行比较。 241 | 242 | 词嵌入向量具有这样的属性,即嵌入的每个维度代表单词含义的特定特征。 例如,如果我们的单词嵌入有四个维度(通常它们更宽,在50到300维之间),那么这四个维度可以代表asanimalness,abstractness,sourness和yellowness这些含义的特征(是的,听起来很有趣,但是 这只是一个例子)。 所以蜜蜂这个词就像这个[1,0,0,1]那样嵌入,像这样的[0,1,0,1]这个单词是黄色,像这样的单词[1,1,0,0]。 每个嵌入的值是使用应用于大文本语料库的特定训练过程获得的。 243 | 244 | 现在,在我们的分类问题中,我们可以使用词嵌入替换我们训练集中每个示例$i$的标签$y_{i}$,并训练预测单词嵌入的多标签模型。 为了获得新示例$x$的标签,我们将模型$f$应用于$x$,得到嵌入$\hat{\mathbf{y}}$,然后在所有英语单词中搜索嵌入与$\hat{\mathbf{y}}$最相似的那些使用余弦相似性的单词。 245 | 246 | 为什么这样做? 以斑马为例。 它是白色的,它是一种哺乳动物,它有条纹。 拿一个小丑,它是橙色的,不是哺乳动物,有条纹。 现在拿一只老虎:它是橙色的,它有条纹,它是一种哺乳动物。 如果在字嵌入中存在这三个特征,则CNN将学习在图片中检测这些相同的特征。 即使标签虎没有出现在训练数据中,但其他物体包括斑马和小丑,那么CNN很可能会学习哺乳动物,橙色和条纹的概念来预测这些物体的标签。 一旦我们将老虎的图片呈现给模型,这些特征将从图像中正确识别,并且很可能从我们的英语词典嵌入到预测嵌入的最接近的词将是老虎的。 247 | 248 | 249 | 250 | 251 | 252 | -------------------------------------------------------------------------------- /doc/8.md: -------------------------------------------------------------------------------- 1 | # 8 高级实践 2 | 译者:@Laiczhang 3 | 本章包含在某些情况下您可以在实践中使用的技术的描述。 它被称为“高级实践”并不是因为所提出的技术更复杂,而是因为它们应用于某些非常具体的背景中。 在许多实际情况中,您很可能不需要使用这些技术,但有时它们非常有用。 4 | 5 | ## 8.1 处理不平衡的数据集 6 | 7 | 在许多实际情况中,您的标记数据集将代表某些类的示例。 例如,当您的分类师必须区分真实和欺诈性的电子商务交易时,就是这种情况:真实交易的例子更为频繁。 如果您使用具有软边距的SVM,则可以为错误分类的示例定义成本。 由于噪声始终存在于训练数据中,因此许多真实交易的例子很可能通过贡献成本而最终落在决策边界的错误一侧。 8 | ![8-1](https://github.com/apachecn/ml-book-100-zh/blob/master/doc/img/8-1.png) 9 | SVM算法将尝试移动超平面以尽可能避免错误分类的示例。 “欺诈性”的例子属于少数,可能会被错误分类,以便正确地对更多类别的多数例子进行分类。 这种情况如图1a所示。 对于应用于不平衡数据集的大多数学习算法,观察到此问题。 10 | 11 | 如果你将少数类的例子的错误分类成本设置得更高,那么模型将更加努力避免对这些例子进行错误分类,显然是因为大多数类的一些例子的错误分类成本,如图1b所示。 12 | 13 | 一些SVM实现(包括scikit-learn中的SVC)允许您为每个类提供权重。 在寻找最佳超平面时,学习算法会将此信息考虑在内。 14 | 15 | 如果您的学习算法不允许加权类,您可以尝试通过制作此类示例的多个副本来增加某些类示例的重要性(这被称为过采样)。 16 | 17 | 相反的方法是从训练集中随机删除多数类的一些示例(欠采样)。 18 | 19 | 您也可以尝试通过随机抽取少数类的几个示例的特征值并将它们组合以获得该类的新示例来创建合成示例。 有两种流行的算法通过创建合成示例对少数类进行过采样:合成少数过采样技术(SMOTE)和自适应合成采样方法(ADASYN)。 20 | 21 | SMOTE和ADASYN在很多方面的工作方式相似。 对于少数类的给定示例$x_{i}$,他们选择此示例的$k$个最近邻居(让我们将这组$k$个例子称为$S_{k}$),然后创建一个合成示例$x_{new}$作为$\mathbf{x}_{i}+\lambda\left(\mathbf{x}_{z i}-\mathbf{x}_{i}\right)$,其中$x_{z}$i是一个示例 从$S_{k}$中随机选择的少数民族。 插值超参数λ是$[0,1]$范围内的随机数。 22 | 23 | SMOTE和ADASYN都随机选择数据集中所有可能的$x_{i}$。 在ADASYN中,为每个$x_{i}$生成的合成示例的数量与Sk中不属于少数类的示例的数量成比例。 因此,在少数类的例子很少的区域中产生更多的合成例子。 24 | 25 | 有些算法对不平衡数据集的问题不太敏感。 决策树以及随机森林和梯度增强通常在不平衡数据集上表现良好。 26 | 27 | ## 8.2 结合模型 28 | 29 | 像随机森林这样的集合算法通常组合相同性质的模型。 它们通过组合数百个弱模型来提升性能。 在实践中,我们有时可以通过组合使用不同学习算法的强大模型来获得额外的性能提升。 在这种情况下,我们通常只使用两个或三个模型。 30 | 31 | 结合模型有三种典型方法: 32 | 1)平均, 33 | 2)多数投票, 34 | 3)堆叠。 35 | 36 | 平均值适用于回归以及返回分类分数的分类模型。 您只需将所有模型(我们称之为基本模型)应用于输入$x$,然后对预测进行平均。 要查看平均模型是否比每个单独的算法更好,您可以使用您选择的度量标准在验证集上进行测试。 37 | 38 | 多数投票适用于分类模型。 您将所有基础模型应用于输入$x$,然后在所有预测中返回多数类。 在平局的情况下,您要么随机选择其中一个类,要么返回错误消息(如果错误分类的事实会产生相当大的成本)。 39 | 40 | 堆叠包括构建一个元模型,该模型将基础模型的输出作为输入。 假设您想要组合分类器$f_{1}$和分类器$f_{2}$,它们都预测同一组类。 要为堆叠模型创建训练示例$\left(\hat{\mathbf{x}}_{i}, \hat{y}_{i}\right)$,请设置$\hat{\mathbf{x}}_{i}=\left[f_{1}(\mathbf{x}), f_{2}(\mathbf{x})\right]$和$\hat{y}_{i}=y_{i}$。 41 | 42 | 如果您的某些基础模型不仅返回一个类,而且还返回每个类的分数,您也可以将这些值用作功能。 43 | 44 | 为了训练堆叠模型,建议使用训练集中的示例并使用交叉验证调整堆叠模型的超参数。 45 | 46 | 显然,您必须确保堆叠模型在验证集上的性能优于您堆叠的每个基础模型。 47 | 48 | 结合多个模型可以带来更好的整体性能的原因是观察到,当几个不相关的强模型同意时,他们更有可能就正确的结果达成一致。 这里的关键词是“不相关的”。理想情况下,必须使用不同的特征或使用不同性质的算法来获得不同的强模型 - 例如,SVM和随机森林。 将不同版本的决策树学习算法或具有不同超参数的多个SVM组合在一起可能不会导致显着的性能提升。 49 | 50 | ## 8.3 训练神经网络 51 | 52 | 在神经网络训练中,一个具有挑战性的方面是将您的数据转换为网络可以使用的输入。 如果您的输入是图像,则首先必须调整所有图像的大小,使它们具有相同的尺寸。 之后,像素通常首先被标准化,然后归一化到范围$[0,1]$。 53 | 54 | 文本必须被标记化(分成片段,例如单词,标点符号和其他符号)。 对于CNN和RNN,使用单热编码将每个标记转换为向量,因此文本变为单热向量的列表。 另一种通常是表示令牌的更好方法是使用单词嵌入。 对于多层感知器,要将文本转换为向量,单词方法可能效果很好,尤其是对于较大的文本(大于SMS消息和推文)。 55 | 56 | 特定神经网络架构的选择是一个不同的选择。 对于同样的问题,如seq2seq学习,有各种各样的架构,几乎每年都会提出新的架构。 我建议使用谷歌学术搜索或微软学术搜索引擎,针对您的问题进行最先进的解决方案研究,以便使用关键词和时间范围搜索科学出版物。 如果你不介意使用不太现代的架构,我建议在GitHub上寻找实现的架构,并找到一个可以通过微小的修改应用于你的数据的架构。 57 | 58 | 实际上,当您对数据进行预处理,清理和规范化以及创建更大的训练集时,现代体系结构优于旧体系结构的优势变得不那么重要。 许多现代神经网络架构是来自几个实验室和公司的几位科学家合作的结果; 这些模型可能非常复杂,无法自行实现,通常需要很大的计算能力来训练。 尝试从最近的科学论文中复制结果所花费的时间可能不值得。 这次可以更好地用于围绕不太现代但稳定的模型构建解决方案并获得更多的培训数据。 59 | 60 | 一旦决定了网络的体系结构,就必须决定层数,类型和大小。 建议从一层或两层开始,训练模型并查看它是否能很好地获得训练数据(具有低偏差)。 如果不是,则逐渐增加每层的大小和层数,直到模型完美地匹配训练数据。 在这种情况下,如果模型在验证数据上表现不佳(具有高差异),则应将正则化添加到模型中。 如果在添加正则化之后,模型不再处理训练数据,则再次稍微增加网络的大小,并继续像这样迭代地工作,直到模型根据训练和验证数据得到足够好的结果。 你的指标。 61 | 62 | ## 8.4 高级正规化 63 | 64 | 在神经网络中,除了L1和L2正则化之外,您还可以使用神经网络特定正则化器:丢失,批量归一化和早期停止。 批量归一化在技术上不是正则化技术,但它通常在模型上具有正则化效应。 65 | 66 | 辍学的概念非常简单。 每次通过网络运行训练示例时,都会暂时从计算中随机排除某些单位。 排除的单位百分比越高,正则化效应越高。 神经网络库允许对于层的oryoucanspecifythedropout参数进行更多的操作。 dropout参数在$[0,1]$范围内,必须通过在验证数据上进行调整来实验。 67 | 68 | dropout的概念非常简单。 每次通过网络运行训练示例时,都会暂时从计算中随机排除某些单位。 排除的单位百分比越高,正则化效应越高。 神经网络库允许在两个连续的图层之间添加dropout图层,或者您可以指定图层的dropout参数。 dropout参数在[0,1]范围内,必须通过在验证数据上进行调整来实验。 69 | 70 | 批量标准化是一种技术,它包括在后续层的单元接收它们作为输入之前标准化每层的输出。 在实践中,批量标准化导致更快和更稳定的训练,以及一些正规化效果。 因此,尝试使用批量标准化始终是个好主意。 在神经网络库中,您通常可以在两个层之间插入批量标准化层. 71 | 72 | 早停法是通过在每个时期之后保存初步模型并在验证集上评估初步模型的性能来训练神经网络的方式。正如您在第4章关于梯度下降的部分所记得的那样,随着时代数量的增加,成本降低。降低的成本意味着该模型很好地提供了训练数据。但是,在某些时候,在某个时代之后,模型可以重新开始:成本不断下降,但模型对验证数据的性能会下降。如果您在文件中保留每个纪元后的模型版本,则可以在开始观察验证集上的性能下降后停止培训。或者,您可以继续运行固定数量的时期的训练过程,然后,最后,您选择最佳模型。每个纪元后保存的模型称为检查点。一些机器学习从业者经常依赖这种技术;其他人试图正确地规范模型以避免这种不良行为。 73 | 74 | 另一种可以不仅应用于神经网络而且应用于几乎任何学习算法的正则化技术称为数据增强。 此技术通常用于规范与图像一起使用的模型。 获得原始标记训练集后,可以通过对原始图像应用各种变换从原始示例创建合成示例:轻微缩放,旋转,闪烁,变暗等。 您将原始标签保留在这些合成示例中。 实际上,这通常会提高模型的性能。 75 | 76 | ## 8.5 处理多个输入 77 | 78 | 在许多实际问题中,您将使用多模态数据。 例如,您的输入可以是图像和文本,二进制输出可以指示文本是否描述此图像。 79 | 80 | 浅层学习算法并不特别适合处理多模态数据。 但是,这并不意味着它是不可能的。 例如,您可以在图像上训练一个模型,在文本上训练另一个模型。 然后你可以使用我们上面讨论过的模型组合技术。 81 | 82 | 如果您不能将问题划分为两个独立的子问题,则可以尝试对每个输入进行矢量化(通过应用相应的特征工程方法),然后简单地将两个特征向量连接在一起以形成一个更宽的特征向量。 例如,如果您的图像具有$\left[i^{(1)}, i^{(2)}, i^{(3)}\right]$的特征,并且您的文本具有$\left[i^{(1)}, i^{(2)}, i^{(3)},i^{(4)}\right]$的特征 你的级联特征向量将是$\left[i^{(1)}, i^{(2)}, i^{(3)}, t^{(1)}, t^{(2)}, t^{(3)}, t^{(4)}\right]$. 83 | 84 | 使用神经网络,您可以获得更多灵活性。 您可以构建两个子网,每种类型的输入一个子网。 例如,CNN子网将读取图像,而RNN子网将读取文本。 两个子网都将最后一层作为嵌入:CNN具有图像嵌入,而RNN具有文本嵌入。 然后,您可以连接两个嵌入,然后在连接嵌入之上添加一个分类层,例如softmax或sigmoid。 神经网络库提供简单易用的工具,允许连接来自多个子网的层。 85 | 86 | ## 8.6 处理多个输出 87 | 88 | 在某些问题中,您希望预测一个输入的多个输出。 我们在前一章中考虑了多标签分类。 多输出的一些问题可以有效地转换成多标签分类问题。 特别是具有相同性质标签(如标签)或假标签的那些可以创建为原始标签组合的完整枚举。 89 | 90 | 但是,在某些情况下,输出是多模式的,并且它们的组合不能有效地列举。 请考虑以下示例:您要构建一个模型来检测图像上的对象并返回其坐标。 同一模型还必须返回对象的标签,例如“人”,“猫”或“仓鼠”。您的训练示例将有一个图像作为输入,一个矢量具有对象的坐标,另一个矢量具有单热编码标签。 91 | 92 | 要处理这种情况,您可以创建一个可用作编码器的子网。 它将使用例如一个或几个卷积层读取输入图像。 编码器的最后一层是图像的嵌入。 然后在嵌入层顶部添加另外两个子网:一个将嵌入向量作为输入并预测对象的坐标。 这个第一个子网可以有一个ReLU作为最后一层,这是预测正实数的好选择,例如坐标; 这个子网可以使用均方误差成本$C_{1}$。 第二个子网将采用相同的嵌入向量作为输入,并预测每个标签的概率。 该第二子网可以具有softmax作为最后一层,其适合于概率输出,并且使用平均负对数似然成本$C_{2}$(也称为交叉熵成本)。 93 | 94 | 显然,您对准确预测的坐标和标签感兴趣。 然而,在时间上是不可能实现的。 通过尝试优化,你可能会伤害第二个,反过来。 你可以做的是在$\gamma C_{1}+(1-\gamma) C_{2}$中加入另一个超参数$γ(0,1)$和组合成功函数。 然后,您可以像验证任何其他超参数一样调整验证数据上的$γ$值. 95 | 96 | ## 8.7 迁移学习 97 | 98 | 迁移学习可能是神经网络比浅层模型具有独特优势的地方。 在迁移学习中,您选择在某些数据集上训练的现有模型,并调整此模型以预测来自另一个数据集的示例,与建立该模型的数据集不同。 第二个数据集与用于验证和测试的保留集不同。 它可能代表了一些其他现象,或者,正如机器学习科学家所说,它可能来自另一个统计分布。 99 | 100 | 例如,假设您已训练模型以识别(和标记)大型标记数据集上的野生动物。 过了一段时间,你还有另外一个问题要解决:你需要建立一个能识别家畜的模型。 使用浅层学习算法,您没有太多选择:您必须构建另一个大的标记数据集,现在用于家畜。 101 | 102 | 通过神经网络,情况更加有利。 神经网络中的迁移学习就像这样。 103 | 104 | 1.在原始大数据集(野生动物)上构建深度模型。 105 | 106 | 2.为第二个模型(家畜)编译一个小得多的标记数据集。 107 | 108 | 3.从第一个模型中删除最后一个或多个图层。 通常,这些是负责分类或回归的层次; 它们通常遵循嵌入层。 109 | 110 | 4.使用适合新问题的新图层替换已删除的图层。 111 | 112 | 5.您“冻结”第一个模型中剩余的图层的参数。 113 | 114 | 6.您使用较小的标记数据集和梯度下降来训练仅新层的参数。 115 | 116 | 通常,网上有大量的视觉问题深度模型。 您可以找到一个很有可能用于解决问题的方法,下载该模型,删除多个最后一层(要删除的图层数量是一个超参数),放置自己的预测图层并训练您的模型。 117 | 118 | 即使您没有现有模型,当您的问题需要标记数据集获取成本非常高时,转移学习仍然可以帮助您调整,但您可以获得更容易获得标签的另一个数据集。 假设您构建了一个文档分类模型。 您从雇主那里获得了标签的分类,它包含一千个类别。 在这种情况下,您需要主动提供给某人 119 | a)阅读,理解和记忆类别之间的差异, 120 | b)阅读多达一百万份文件并对其进行注释。 这听起来不太好。 121 | 122 | 为了节省标记这么多的例子,你可以考虑使用维基百科页面作为数据集来构建你的第一个模型。 维基百科页面的标签可以通过获取维基百科页面所属的类别自动获得。 一旦您的第一个模型学会了很好地预测维基百科类别,您就可以转移这种学习来预测雇主分类的类别。 通常,如果您从头开始解决原始问题,您需要的雇主问题的注释示例要少得多。 123 | 124 | ## 8.8 算法效率 125 | 126 | 并非所有能够解决问题的算法都是实用的。 有些人可能很快; 有些可能太慢了。 一些问题可以通过快速算法解决,对于其他问题,不存在快速算法。 127 | 128 | 被称为算法分析的计算机科学的子领域涉及确定和比较算法的复杂性。 大O符号是根据其输入大小增长时的运行时间或空间需求如何增长而使用的类别算法。 129 | 130 | 例如,假设我们遇到了在大小为$N$的示例集$S$中找到两个最远的一维示例的问题。我们可以用来解决这个问题的一个算法看起来像这样(在Python中这里和下面): 131 | 132 | ~~~python 133 | def find_max_distance(S): 134 | result = None 135 | max_distance = 0 136 | for x1 in S: 137 | for x2 in S: 138 | if abs(x1 - x2) >= max_distance: 139 | max_distance = abs(x1 - x2) 140 | result = (x1, x2) 141 | return result 142 | ~~~ 143 | 144 | 在中间算法中,我们循环索引,并且在第一个循环中进行了非常规,我们再次循环在$S$中的所有值。 因此,上述算法对数字进行$N^{2}$比较。 如果我们以比较(一次),绝对(两次)和分配(两次)操作所花费的时间作为单位时间,那么该算法的时间复杂度(或简单地,复杂性)最多为5$N^{2}$。 当在最坏的情况下测量算法的复杂性时,使用大O符号。 对于上述算法,使用大O表示法,我们写出算法的复杂度为$O\left(N^{2}\right)$(常数,如5,被忽略)。 145 | 146 | 对于同样的问题,我们可以制作另一种算法: 147 | ~~~Python 148 | def find_max_distance(S): 149 | result = None 150 | min_x = float("inf") 151 | max_x = float("-inf") 152 | for x in S: 153 | if x < min_x: 154 | min_x = x 155 | elif x >max_x: 156 | max_x = x 157 | result = (max_x, min_x) 158 | return result 159 | ~~~ 160 | 在上面的算法中,我们只将S中的所有值循环一次,因此算法的复杂度为$O(N)$。 在这种情况下,我们说后一种算法比前者算法更有效。 161 | 162 | 通常,当算法的大O符号的复杂度是输入大小的多项式时,算法被称为高效算法。 因此,$O(N)$和$O\left(N^{2}\right)$都是有效的。 但是,对于非常大的输入,$O\left(N^{2}\right)$算法仍然可能非常慢。 在大数据时代,科学家们经常寻找$O(\log N)$算法。 163 | 164 | 从实际角度来看,当您实现算法时,应尽可能避免使用循环。 例如,您应该对矩阵和向量使用操作,而不是循环。 在Python中,要计算$wx$,你应该写 165 | ~~~python 166 | 167 | import numpy 168 | wx = numpy.dot(w,x) 169 | 170 | and not 171 | 172 | wx = 0 173 | for i in range(N) 174 | wx += w[i] * x[i] 175 | ~~~ 176 | 177 | 使用适当的数据结构。 如果集合中元素的顺序无关紧要,请使用set而不是list。 在Python中,当$S$被声明为一个集合时,验证特定示例$x$是否属于$S$的操作是有效的,并且当$S$被声明为列表时,它是无效的。 178 | 179 | 另一个重要的结构,你可以使用它来进行比赛。 它在其他语言中称为字典或散列映射。 它允许您通过非常快速的键查找来定义键值对的集合。 180 | 181 | 除非你确切知道你做了什么,否则总是喜欢使用流行的库来编写自己的科学代码。 科学Python软件包如numpy,scipy和scikit-learn是由经验丰富的科学家和工程师构建的,并且考虑到了效率。 他们有许多用C编程语言实现的方法以获得最大速度。 182 | 183 | 如果你需要遍历大量的元素集合,请使用生成器,它一次返回一个元素,而不是一次返回所有元素。 184 | 185 | 使用Python中的cPro文件包来找到代码中的低效率。 186 | 187 | 最后,当从算法的角度来看代码中没有什么可以改进时,你可以通过使用以下方法进一步提高代码的速度: 188 | - 多处理包以并行运行计算,以及 189 | - PyPy,Numba或类似工具将Python代码编译成 快速,优化的机器代码。 -------------------------------------------------------------------------------- /doc/img/10-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/10-1.png -------------------------------------------------------------------------------- /doc/img/10-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/10-2.png -------------------------------------------------------------------------------- /doc/img/10-3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/10-3-1.png -------------------------------------------------------------------------------- /doc/img/10-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/10-3.png -------------------------------------------------------------------------------- /doc/img/10-4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/10-4-1.png -------------------------------------------------------------------------------- /doc/img/10-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/10-4.png -------------------------------------------------------------------------------- /doc/img/4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/4-1.png -------------------------------------------------------------------------------- /doc/img/4-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/4-2.png -------------------------------------------------------------------------------- /doc/img/5-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/5-1.png -------------------------------------------------------------------------------- /doc/img/5-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/5-2.png -------------------------------------------------------------------------------- /doc/img/5-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/5-3.png -------------------------------------------------------------------------------- /doc/img/5-QRcode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/5-QRcode.png -------------------------------------------------------------------------------- /doc/img/6-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/6-1.png -------------------------------------------------------------------------------- /doc/img/6-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/6-2.png -------------------------------------------------------------------------------- /doc/img/6-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/6-3.png -------------------------------------------------------------------------------- /doc/img/6-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/6-4.png -------------------------------------------------------------------------------- /doc/img/6-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/6-5.png -------------------------------------------------------------------------------- /doc/img/6-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/6-6.png -------------------------------------------------------------------------------- /doc/img/6-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/6-7.png -------------------------------------------------------------------------------- /doc/img/6-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/6-8.png -------------------------------------------------------------------------------- /doc/img/6-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/6-9.png -------------------------------------------------------------------------------- /doc/img/7-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/7-1.png -------------------------------------------------------------------------------- /doc/img/7-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/7-2.png -------------------------------------------------------------------------------- /doc/img/7-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/7-3.png -------------------------------------------------------------------------------- /doc/img/7-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/7-4.png -------------------------------------------------------------------------------- /doc/img/7-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/7-5.png -------------------------------------------------------------------------------- /doc/img/7-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/7-6.png -------------------------------------------------------------------------------- /doc/img/7-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/7-7.png -------------------------------------------------------------------------------- /doc/img/7-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/7-8.png -------------------------------------------------------------------------------- /doc/img/7-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/7-9.png -------------------------------------------------------------------------------- /doc/img/8-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ml-book-100-zh/373f849e6361a10d6a2576166c93475492180a47/doc/img/8-1.png -------------------------------------------------------------------------------- /update.sh: -------------------------------------------------------------------------------- 1 | git add -A 2 | git commit -am "$(date "+%Y-%m-%d %H:%M:%S")" 3 | git push -------------------------------------------------------------------------------- /翻译/9.md: -------------------------------------------------------------------------------- 1 | # 9 无监督学习 2 | 3 | 无监督学习是处理你的数据集没有标签的问题,这个特性使其成为许多实际应用的难题。对于你的模型,没有表示行为的标签意味着缺少了一个可靠的参考点来判断你的模型的质量。在这本书中,我只提出无监督学习的方法,建立根据数据而不是人类判断的可评估的模型。 4 | 5 | ## 9.1 密度估计 6 | 7 | 密度估计是对未知概率分布的数据集的概率密度函数(pdf)建模的问题。它对很多应用都是有用的,特别是在新颖或入侵检测。在第7章,我们已经估计pdf来解决一级分类问题。为此,我们决定我们的模型是参数化的,更准确的说是多元正态分布(MVN)。这个决定有些时候有点武断,因为如果我们的数据集的真实分布与MVN是不同的,我们的模型将很有可能不是很好。我们也知道模型可以是非参数的。我们在核回归中使用了非参数的模型。事实证明,相同的方法也可以用于密度估计。 8 | 9 | 令$\{x_i\}_{i=1}^N$是一维数据集(多维的情况类似),其例子来自未知概率密度函数(pdf)$f$的分布,对所有的$i=1,...,N$有$x_i\in R$。我们感兴趣的是对这个函数$f$的形式进行建模。我们的核模型$f$,让我们记它为$\hat f$,由下式给出, 10 | $$ 11 | \hat f_b(x)=\frac {1}{Nb}\sum_{i=1}^Nk(\frac {x-x_i}{b}), 12 | $$ 13 | $b$是超参数控制我们模型的方差和偏差之间的权衡,$k$是一个核函数。再次的,像第7章,我们使用高斯核函数 14 | $$ 15 | k(z)=\frac {1}{\sqrt{2\pi}}exp(\frac {-z^2}{2}) 16 | $$ 17 | 我们寻找一个$b$的值来最小化实际的$f$的形式和我们模型$\hat f_b$的形式之间的差异。一种合理衡量这种差异的方法被称为平均积分平方误差: 18 | $$ 19 | MISE(b)=E[\int_R(\hat f_b(x)-f(x))^2dx] 20 | $$ 21 | 直观地,你可以看到在等式2中我们平方了实际的概率密度函数$f$和我们模型中的$\hat f$之差。积分$\int_R$代替了我们的求和$\sum_{i=1}^N$我们采用了平均误差,利用期望$E$代替了平均值$\frac 1 N$。 22 | 23 | ![Figure1](F:\翻译\Figure1.PNG) 24 | 25 | 图像1:核密度估计:$(a)$很好的拟合;$(b)$过拟合;$(c)$欠拟合;$(d)$网格曲线搜索b的最佳值。 26 | 27 | 的确,当我们的损失函数是连续域的函数时,例如$(\hat f_b(x)-f(x))^2$,我们必须要用积分来代替求和。期望$E$意味着我们希望$b$对于我们的训练集$\{x_i\}_{i=1}^{N}$所有可能的情况都是最优的。这很重要,因为$\hat f$被定义成有限样本上的某个概率分布,然而真正的概率密度函数$f$是在无限域上定义的(集合$R$)。 28 | 29 | 现在,我们可以重写等式2右边的式子,如下所示: 30 | $$ 31 | E[\int_R{\hat f_{b}^{2}}(x)dx]-2E[\int_R{\hat f_b(x)f(x)dx}]+E[\int_R{f(x)^2dx}] 32 | $$ 33 | 上式求和的第三项和b无关,因此可以忽略。第一项的无偏差估计由$\int_R{\hat f_{b}^{2}(x)dx}$而第二项的无偏差估计可以近似为$-\frac {2}{N}\sum_{i=1}^{N}\hat f_b^{(i)}(x_i)$,其中$\hat f_{b}^{(i)}$是在我们的排除示例$x_i$的训练集上计算$f$的核模型。 34 | 35 | 式子$\sum_{i=1}^{N}$在统计学中被称为留一估计,交叉验证的一种形式,其中每折由一个例子组成。你可能已经注意到了式子$\int_R {\hat f_b(x)f(x)dx}$(让我们称它为$a$)是函数$\hat f_b$的期望值,因为函数$f$是概率密度函数。可以证明留一估计是$Ea$的无偏差估计。 36 | 37 | 现在,为了寻找$b$的最优值$b^*$,我们希望最小化如下定义的成本函数: 38 | $$ 39 | \int_R{\hat f_{b}^{2}(x)dx}-\frac {2}{N}\sum_{i=1}^N{\hat f_{b}^{(i)}(x_i)} 40 | $$ 41 | 我们可以通过网格搜索找到$b^*$。对于$D$维特征向量$x$,等式1中的误差项$x-x_i$可以用欧几里得距离$||x-x_i||$。在图像1中,您可以看到从包含100个示例的数据集中使用3个不同的$b$值获得相同的概率密度函数的估计值,以及网格搜索曲线。我们在网格搜索曲线的最小值位置选择$b^*$。 42 | 43 | ## 9.2 聚类 44 | 45 | 聚类是通过学习未标记的数据集为示例分配标签的问题。因为数据集是完全没有被标记的,决定学习模型是否是最佳的要比监督学习中要复杂的多。 46 | 47 | 有各种各样的聚类算法,不幸的是,很难告诉你哪个算法针对你的数据集会更好一些。通常,每种算法的性能取决于数据集的概率分布的未知的属性。 48 | 49 | ### 9.2.1 K-Means 50 | 51 | K-Means聚类算法的工作原理如下。首先,分析选择k—类(或簇)的数量。然后,我们在特征空间中随机的选取k个特征向量(称为质心)。然后我们使用一些度量去计算每个样本$x$到质心$c$之间的距离,像欧几里得距离。然后我们为每个例子分配最近的质心(就像我们用质心ID作为标签做标记每个样本)。对于每个质心,我们计算被它标记的样本的平均特征向量。这些平均的特征向量将成为质心新的位置。 52 | 53 | ![Figure2](F:\翻译\Figure2.PNG) 54 | 55 | 图2:K-Means算法过程中取了$k=3$。圆形是二维特征向量,方形表示正在移动的质心。 56 | 57 | 我们重新计算每个例子到每个质心之间的距离,修改每个样本分配的类,并重复该过程,直到重新计算质心位置后样本分配的类保持不变。模型就是给样本分配质心ID的清单。 58 | 59 | 质心的初始位置影响最终位置,因此运行两次K-Means算法可以产生两种不同的模型。K-Means算法运行一次的结果如图2所示。不同的背景颜色表示所有点属于同一簇区域。 60 | 61 | k的值(簇的数量)是一个必须由数据分析调整的超参数。有一些选择k的技巧。它们都没有被证明是最优的。他们中的大多数要求分析通过查看某些指标或通过检查群集分配来进行“有根据的猜测”。在本章的最后,我们介绍一种技术,它允许在不查看数据和猜测的情况下为k选择合理的值。 62 | 63 | ### 9.2.2 DBSCAN和HDBSCAN 64 | 65 | 虽然K-Means和类似的算法都是基于质心的,DBSCAN是一种基于密度的聚类算法。通过使用DBSCAN,你不需要猜测类的数量,你定义两个超参数:$\epsilon$和$n$。首先,你从你的数据集中随机的选择一个样本$x$并给他标记为类1。然后你计算有多少个样本和$x$之间的距离小于或等于$\epsilon$。如果此数量大于或等于$n$,那么将所有的这些$\epsilon$近邻都放到类1中。然后检查类1中的每个成员并找到他们各自的$\epsilon$近邻。如果类1中的某个成员有$n$个或$n$多个$\epsilon$近邻,你需要在类中放入这些$\epsilon$近邻以此来扩展类。你继续扩展类1,直到没有更多示例放入其中了。其后,你从数据集中选择另一个不属于任何类的样本,并将其放入类2中。你重复上述步骤,直到所有样本都属于某个类或被标记为异常值。异常值是一个样本的$\epsilon$近邻数量小于$n$。 66 | 67 | DBSCAN的优势在于它可以构建具有任意形状的类,而K-Means和其他的质心算法会构建具有超球面形状的类。DBSCAN的一个明显的缺点是它具有两个超参数,选择好的值(特别是$\epsilon$)可能是一项挑战。此外,在$\epsilon$固定下,聚类算法不能有效的处理不同密度的类。 68 | 69 | HDBSCAN是保持了DBSCAN优点的聚类算法,通过消除决定$\epsilon$值的需要。该算法能构建不同密度的类。HDBSCAN是多个想法的巧妙组合,完整的描述该算法会超出本书的范围。 70 | 71 | HDBSCAN仅只有一个重要的超参数$n$,它是放入类中最小的样本数。这种超参数通过直觉选择相对简单。HDBSCAN的实现速度特别快:它可以有效地处理数百万个样本。现今,K-Means的实现要比HDBSCAN快很多,但是在许多实际任务中,后者的优点可能要超过它的缺点。建议首先在你的数据上尝试HDBSCAN。 72 | 73 | ### 9.2.3 确定类的数量 74 | 75 | 最重要的问题是你的数据集有多少个类?当特征向量是一维,二维,三维时,你可以查看数据并看特征空间中点形成的“云”。每一个云都是一个潜在的类。但是对于$D$维数据,即$D>3$时,看数据是困难的。有一种实用的方法,它是基于预测强度的概念来确定合理的类的数量。想法是将数据分为训练集和测试集,类似于我们在监督学习中所做的。当你有训练集和测试集时,$N_{tr}$,$N_{te}$的大小分别为$S_{tr}$,$S_{te}$,你修改$k$,类的数量,在数据集$S_{tr}$和$S_{te}$上运行聚类算法$C$并且获得聚类的结果$C(S_{tr},k)$和$C(S_{te},k)$。 76 | 77 | 设$A$是使用训练集建立的聚类$C(S_{tr},k)$。注意$A$的类可以由某些区域定义。如果一个样本是属于这个区域之一的,那么这个样本属于某个特定的类。例如,我们在一些数据集上运用我们的K-Means算法,如图2所示,它将特征空间划分为$k$个多边形区域。 78 | 79 | 定义$N_{te}\times N_{te}$联合成员矩阵$D[A,S_{te}]$如下:$D[A,S_{te}]^{(i,i')}=1$,当且仅当测试集的样本$x_i$和$x_{i'}$根据类$A$属于同一类。否则$D[A,S_{te}]^{(i,i')}=0$。 80 | 81 | 让我们休息一下,看看我们在这里有什么。我们使用训练集的样本构建了具有$k$个类的聚类$A$。然后我们构建了成员联合矩阵,指示测试集中的两个样本是否属于$A$中的同一类。 82 | 83 | 直觉上,如果数量$k$是合理的聚类数量,那么类$C(S_{te},k)$中属于同一类中的两个样本也很有可能属于类$C(S_{tr},k)$中的同一类。另一方面,如果$k$是不合理的(过高或过低),那么基于训练集和基于测试集得到的类可能会不一致。 84 | 85 | ![Figure3](F:\翻译\Figure3.PNG) 86 | 87 | 图3:对于$k=4$的类,(a)训练集的类,(b)测试集的类,(c)在训练的类中绘制测试集数据 88 | 89 | 这个想法如图3所示。图3a和图3b分别表示出了$C(S_{tr},4)$和$C(S_{te},4)$及其各自的类区域。图3c表示在训练数据类区域上绘制测试样本。根据从训练数据中获得的类的区域,你可以在图3c中看到橙色测试样本不再属于同一类。这将导致矩阵$D[A,S_{te}]$中有许多0,反过来说,$k=4$可能不是最优的类的数量。 90 | 91 | 更正式的说,类$k$的数量的预测强度由下式给出: 92 | 93 | ![公式](F:\翻译\公式.PNG) 94 | 95 | 其中,![公式1](F:\翻译\公式1.PNG)$A_j$是来自类$C(S_{te},k)$的第$j$个类,$|A_j|$是类$A_j$的样本数。 96 | 97 | 给定一个类$C(S_{tr},k)$,对于每一个测试类,我们计算该类中观察对的比例,这些观察对也由训练集质心分配给同一类。预测强度是$k$个测试集群中的最小值。 98 | 99 | ![Figure4](F:\翻译\Figure4.PNG) 100 | 101 | 图4:2个,3个,4个类数据的不同$k$值的预测强度。 102 | 103 | 实验表明,合理数量的类是最大的$k$,使得$ps(k)$大于0.8。你可以在图中看到,2个,3个,4个类数据不同$k$值的预测强度的例子。 104 | 105 | 对于非确定性聚类算法,例如K-Means,根据质心的初始位置可以产生不同的聚类,建议对同一个$k$执行多次聚类算法,并计算多次运行的平均预测强度$\bar{ps}(k)$。估计类的数量的另一种有效的方法是gap statistic。其他一些分析时仍然会采用的自动化方法是elbow method和average silhouette method。 106 | 107 | ### 9.2.4 其他聚类算法 108 | 109 | DBSCAN和K-Means计算所谓的硬聚类,每个样本只能属于一种类。高斯混合模型(GMM)允许每个样本是具有不同隶属度分数的若干类的成员(顺便说一下,HDBSCAN也允许这样做)。计算GMM与基于模型的密度估计非常相似。在GMM中,我们不是只有一个多元正态分布(MND),而是有多个多元正态分布(MND)的加权和: 110 | $$ 111 | f_X=\sum_{j=1}^{k}\phi_jf_{\mu_j},\Sigma_j 112 | $$ 113 | 114 | $f_{\mu_j},\Sigma_j$是一个关于$j$的多元正态分布(MND),$\phi_j$是它的权重,对于所有的$j=1,...,k$,参数$\mu_j,\Sigma_j,\phi_j$使用最大期望算法(EM)来优化最大似然准则来获得。 115 | 116 | 同样,为了简单起见,让我们来看一维数据。还假设有两个类:$k=2$。在这种情况下,我们有两个高斯分布, 117 | $$ 118 | f(x|\mu_1,\sigma_{1}^{2})=\frac {1}{\sqrt{2\pi\sigma_{1}^{2}}}e^{-\frac {{(x-\mu_1)}^2}{2\sigma_{1}^{2}}} and f(x|\mu_2,\sigma_{2}^{2})=\frac {1}{\sqrt{2\pi\sigma_{2}^{2}}}e^{-\frac {{(x-\mu_2)}^2}{2\sigma_{2}^{2}}} 119 | $$ 120 | $f(x|\mu_1,\sigma_{1}^{2})$和$f(x|\mu_2,\sigma_{2}^{2})$是两个参数化的概率密度分布函数(pdf),用来定义$X=x$的可能性。我们使用EM算法去估计$\mu_1,\sigma_{1}^{2},\mu_2,\sigma_{2}^{2},\phi_1,\phi_2$。GMM的参数$\phi_1,\phi_2$对于密度估计任务非常有用,而对于聚类任务没有那么有用,我们将在下面看到。 121 | 122 | EM工作如下。在最开始,我们猜测$\mu_1,\sigma_{1}^{2},\mu_2,\sigma_{2}^{2}$的初始值,并且令$\phi_1=\phi_2=\frac {1}{2}$(通常上,对于每个$\phi_k$它是$\frac 1k$) 123 | 124 | 对于EM算法的每一次迭代,执行以下四个步骤: 125 | 126 | 1.对于所有的$i=1,...,N$,使用等式3计算每个$x_i$的可能性: 127 | $$ 128 | f(x|\mu_1,\sigma_{1}^{2}) \leftarrow \frac {1}{\sqrt{2\pi\sigma_{1}^{2}}}e^{-\frac {{(x-\mu_1)}^2}{2\sigma_{1}^{2}}} and f(x|\mu_2,\sigma_{2}^{2}) \leftarrow \frac {1}{\sqrt{2\pi\sigma_{2}^{2}}}e^{-\frac {{(x-\mu_2)}^2}{2\sigma_{2}^{2}}} 129 | $$ 130 | 2.使用贝叶斯准则,对于每一个样本$x_i$,计算样本属于类$j\in\{1,2\}$的可能性$b_{i}^{(j)}$(换句话说,该样本是从高斯$j$中提取的可能性): 131 | $$ 132 | b_{i}^{(j)} \leftarrow \frac {f(x_i|\mu_j,\sigma_{j}^{2})\phi_j}{f(x_i|\mu_1,\sigma_{1}^{2})\phi_1+f(x_i|\mu_2,\sigma_{2}^{2})\phi_2} 133 | $$ 134 | 参数$\phi_j$反映了具有参数$\mu_j$和$\gamma_j$的高斯分布$j$产生我们数据集的可能性。这就是为什么开始我们另$\phi_1=\phi_2=\frac {1}{2}$:我们不知道两个高斯分布中每一个的可能性,我们通过将两者的可能性设置为一半来反映我们的未知。 135 | 136 | ![Figure5](F:\翻译\Figure5.PNG) 137 | 138 | 图5:使用EM算法对两个类$(k=2)$进行高斯混合模型估计的过程。 139 | 140 | 3.计算新的$\mu_j,\sigma_{j}^{2}$的值: 141 | $$ 142 | \mu_j \leftarrow \frac {\sum_{i}^{N}b_{i}^{(j)}x_i}{\sum_{i}^{N}b_{i}^{(j)}} and \sigma_{j}^{2} \leftarrow \frac {\sum_{i}^{N}b_{i}^{(j)}(x_i-\mu_j)^2}{\sum_{i}^{N}b_{i}^{(j)}} 143 | $$ 144 | 4.更新$\phi_j$,$j \in \{1,2\}$ 145 | $$ 146 | \phi_j \leftarrow \frac 1N\sum_{i=1}^{N}b_{i}^{(j)} 147 | $$ 148 | 迭代执行步骤1-4直到$\mu_j,\sigma_{j}^{2}$的值不在改变很多:例如,值的变化应该低于阈值$\varepsilon$。图5说明了这个过程。 149 | 150 | 你可能注意到了EM算法和K-Means算法很相似:随机类起始,然后通过平均分配给类的数据来迭代更新类的参数。GMM情况的唯一区别在于,向类$j$分配样本$x_i$是软的:$x_i$属于类$j$的概率为$b_{i}^{(j)}$。这就是为什么我们计算等式4中$\mu_j$和$\sigma_{j}^{2}$新值不是平均值(使用K-Means)而是作为权重$b_{i}^{(j)}$的加权平均值。 151 | 152 | 一旦我们学习了每个类$j$的参数$\mu_j$和$\sigma_{j}^{2}$,类$j$中的样本$x$的得分将由$f(x|\mu_j,\sigma_{j}^{2})$给出。 153 | 154 | 扩展到D维数据($D>1$)就很简单了。唯一的区别是,我们现在有了协方差矩阵$\Sigma$来参数化我们的多元正态分布(MND),而不是方差$\sigma^2$。GMM优于K-Means的优点在于GMM中的簇可以具有椭圆形状,其可以具有任意伸长和旋转。协方差矩阵中的值控制这些属性。 155 | 156 | 如何选择GMM中的$k$,不幸的是,没有普遍认可的方法,通常建议将数据集拆分为训练集和测试集。然后尝试不同的$k$并且为训练集上的每个$k$建立不同的模型$f_{tr}^{k}$。然后选择最大化测试集中样本可能性的模型: 157 | 158 | ![公式2](F:\翻译\公式2.PNG) 159 | 160 | $N_{te}$是测试集的大小。 161 | 162 | 文献中描述了各种聚类算法。值得一提的是谱聚类和层次聚类。对于某些数据集,你有可能会发现更合适的模型。但是,在大多数的实际情况中,K-Means,HDBSCAN和高斯混合模型将满足您的需求。 163 | 164 | ## 9.3 降维 165 | 166 | 许多现代机器学习算法,例如集成算法和神经网络,需要处理非常高维的样本,高达数百万个特征。使用现代计算机和图形处理单元(GPU),在实践中使用降维技术比过去少的多。降维最常见的用例是数据可视化:人们最多只能在图上解释3维。 167 | 168 | 另一种从维度减少中受益的情况是,当你必须构建一个可解释的模型的时,你必须选择学习算法。例如,你只能选择决策树或线性回归。通过将数据减少到较低的维度,并通过确定缩小的要素空间中的每个新要素反映的原始示例的质量,可以使用更简单的算法。降维消除了冗余或高度相关的特征;它还可以降低数据中的噪音——所有这些都有助于模型的可解释性。 169 | 170 | 三种最广泛使用的降维技术是主成分分析(PCA),均匀流行近似和投影(UMAP)以及自动编码器。 171 | 172 | 我已经在第7章中解释了自动编码器。您可以使用自动编码器瓶颈层的低维输出表示高维输入特征向量的降维度向量。您知道这个低维向量表示输入向量中包含的基本信息,因为自动编码器能够仅基于瓶颈层输出重建输入特征向量。 173 | 174 | ### 9.3.1 主成分分析 175 | 176 | 主成分分析或PCA是最古老的方法之一。它背后的数学涉及到矩阵的操作,我在第2章没有解释,因此我将PCA的数学留给你进一步阅读。在这里,我只提供直觉并在一个例子中说明方法。 177 | 178 | ![Figure6](F:\翻译\Figure6.PNG) 179 | 180 | 图6:PCA:(a)原始数据;(b)两个主要组成部分显示为向量;(c)投影在第一主成分上的数据。 181 | 182 | 考虑二维数据,如图6a所示。主成分是定义新坐标系的向量;其中第一轴是数据集上最高的方差的方向。第二轴与第一轴正交,并沿数据中第二高方差的方向。如果我们的数据是三维的,那么第三轴将与第一个和第二个轴正交,并沿着数据中第三高方差的方向,以此类推。在图6b中,两个主要成分显示为箭头。箭头的长度反映了这个方向上的差异。 183 | 184 | 现在,如果我们想把数据的维数减少到$D_{new}