Roadmap to becoming an Artificial Intelligence Expert in 2022
前言:对于一门复杂且快速迭代的学科,掌握知识的结构比掌握知识本身更重要,相信很多对数据科学和人工智能有兴趣的朋友一开始总免不了主动或被动的翻看各种大部头的技术书籍。由于技术书籍本身非常微观具体和颇有难度,self-learner往往容易深陷在某几个章节,要么难以持续,要么进展缓慢;倘若一开始,可以顺着一个全局的路线图来学习,本着循序渐进和有的放矢的节奏,那对于人工智能的学习理解会更加高效;
AMAI GmbH是一家位于德国的软件公司,最近在GitHub上发布了一个名为“AI-Expert-Roadmap”的项目。该项目提供了全面的AI领域知识点,几乎涵盖了AI领域所有的内容。如果你想快速入门并成为AI领域的专家,这个路线图可能会给你带来指引。该项目上线短短几天就获得了2.1k颗星的好评。
本系列的文章将简要地叙述这个学习路线框架,由于篇幅较长建议参考右侧栏目录查看,如果感兴趣可以浏览学习项目地址:https://github.com/AMAI-GmbH/AI…
导言
这里并非需要严格按照路线图前进,但是需要清楚某个知识在整个框架中的哪一环节,具体对你关心的部分的影响权重如何,是否依赖其他部分的知识;清楚了这个优先级的背景知识,可以帮助我们在自学过程中减少很多焦虑或迷茫~!
Foundamentals
矩阵和线性代数基础
在数据科学和AI领域所接触到的数据和平时我们熟悉的数据最大的区别,就是维度化和向量化,这是因为我们通常需要输入或让机器学习比较复杂的数据结构,这种结构通常就是用向量矩阵来表示的;而对于这种数据类型的计算规则就需要用到线性代数的基础知识;由于课本的线性代数知识比较复杂,建议先了解基础知识,等遇到了具体的问题再具体深入学习对应的工具;
必须掌握的基础知识:
线性代数本质:图像或更高维数据的线性变化,可以总结为在几向量方向的拉伸、旋转;
矩阵的运算:点积
数据库基础
关系型和非关系型数据:
关系数据库就像是一个大型的电子表格,数据存储在由行和列组成的表中,并且需要预定义表的结构和关系。(RDBMS:Relational Database Management Systems)也就是我们常说的SQL database;而非关系型数据库则更像是一个散列表或字典,它们不需要预定义固定的表结构,可以根据需要动态添加新的字段和属性。这种数据库通常适用于半结构化或非结构化数据,例如JSON或XML格式的数据。
再举一个例子,关系型数据库就像一家传统的银行,每个客户都有自己的帐户,所有交易记录都按照特定的格式进行记录,并且需要遵守特定的规则和标准。而非关系型数据库就像一个市场摊位,各个商贩可以自由地展示和出售自己的产品,每个商贩也可以随时添加和修改自己的货品和价格。虽然市场摊位没有像银行那么严谨的规定和要求,但它具有更高的灵活性和适应性,能够更好地满足不同的需求。
基础的SQL语法
如何查询所谓的关系型数据库呢,我们可以通过数据库查询语言进行;SQL(Structured Query Language)是一种用于管理关系型数据库的标准化语言。它可以用来创建、查询、更新和删除数据库中的数据。SQL使用简单易懂的语法,允许我们通过输入各种命令来与数据库交互,比如SELECT、INSERT、UPDATE和DELETE等命令。
可以把SQL想象成一个非常强大的工具箱,里面有各种各样的工具,帮助我们对数据库进行操作。举个例子,如果我们想要从一个表中检索某些数据,我们可以使用SELECT命令。如果我们想要在表中插入新的数据,我们可以使用INSERT命令。如果我们想要更新表中的数据,我们可以使用UPDATE命令。如果我们想要删除数据,我们可以使用DELETE命令。
总之,SQL是一种重要的编程语言,它为开发人员提供了一种可靠的方式来管理和操纵数据库中的数据。
NoSQL
常见的NOSQL数据库有以下几种:
-文档型数据库:MongoDB、Couchbase、RavenDB等。
-列族数据库:HBase、Cassandra、Scylla等。
-键值对数据库:Redis、Memcached、Couchbase等。
-图形数据库:Neo4j、OrientDB、Titan等。
-对象数据库:db4o、Versant Object Database等。
这些不同类型的NOSQL数据库适用于各种不同的应用场景和需求。例如,文档型数据库通常用于存储半结构化数据,列族数据库通常用于大规模分布式系统,键值对数据库通常用于缓存和快速查找,图形数据库通常用于复杂的网络关系图分析,而对象数据库则更适合面向对象的开发模型。
和SQL语法的关系:
-查询语言:SQL使用结构化查询语言(Structured Query Language)作为查询语言,而NOSQL数据库则根据其特定的数据模型和用途,使用不同的查询语言或API。例如,MongoDB使用MongoDB查询语言(MQL),Cassandra使用CQL(Cassandra Query Language)等等。
-数据操作:SQL使用标准的INSERT、SELECT、UPDATE和DELETE等命令进行数据操作,而NOSQL数据库则根据其特定的数据模型和查询语言,提供不同的数据操作方式。例如,MongoDB提供了find、insert、update、remove等方法,Redis则提供了get、set、del等命令。
-索引:SQL数据库通常使用B-tree索引,而NOSQL数据库则根据其特定的数据结构和查询方式,使用不同的索引类型。例如,MongoDB使用B-tree和哈希索引,Cassandra使用SSTable索引等等。
表格数据:
是指按照表格形式组织的数据,其中每一行表示一个记录或实例,每一列表示一个属性或特征,每个记录都有相同的数据结构。因此,表格数据可以用于存储、查询和分析非常规则化的数据集,例如订单信息、客户信息、销售报表等等。表格数据是在计算机科学和数据处理领域中最基本和最常用的类型之一,它们既易于理解又容易处理。许多数据分析工具和技术都是针对表格数据而设计的,例如SQL查询、数据透视表、图表等等。
DataFrame & Series
Data Frames和Series是Pandas库中常用的两种非常重要的数据结构。Pandas是一个开源的Python数据处理库,它提供了丰富、高效的数据分析工具,特别适合用于表格型或异质型数据的处理。
DataFrame:DataFrame是一种二维表格型数据结构,类似于Excel表格或SQL数据库中的表。每个DataFrame对象都由行和列组成,其中每一列可以是不同的数据类型(例如整数、浮点数、字符串等等)。我们可以将DataFrame看作是由多个Series对象组成的字典,它们共享相同的行索引,但拥有不同的列索引。在Pandas中,DataFrame通常被用来存储和处理大量的结构化数据,例如时间序列数据、金融数据、人口统计数据等等。
Series:Series是一种一维数组型数据结构,类似于Python中的列表(list)或Numpy中的一维数组(ndarray)。每个Series对象都由一组数据和一组与之对应的索引组成,它们可以是数字、字符串、布尔值等等。Series可以看作是DataFrame中的一列数据,也可以单独使用,通常用于存储和处理一些简单的数据集合,例如某个特定时期内的温度数据、股票价格变动数据等等。
数据预加工ETL
ETL(Extract,Transform,Load)是指从数据源中抽取(Extract)数据,经过转换(Transform)处理,最后加载(Load)到目标库中的一种数据集成方法。ETL通常用于将多个数据源中的数据进行汇聚、清洗、整合和转换,以便更好地支持数据分析、业务决策和数据挖掘等应用。
用一个比较形象的例子来介绍ETL的过程:假设你正在收集各个城市的天气信息,你需要将不同城市的气温、湿度、降雨量等数据抽取出来,并进行转换和整合,最后汇总到一个数据库中供数据分析专家使用。
-首先,你需要从各个数据源中抽取数据,例如从气象局网站上爬取每个城市的气象数据。这个过程就是Extract。
-接下来,你需要对采集到的数据进行转换,例如将不同城市的数据统一格式化,清洗掉不合法或重复的数据,计算平均温度等等。这个过程就是Transform。
-最后,你需要将处理后的数据加载到目标数据库中,例如使用SQL语句将数据插入到一个关系型数据库中,或者使用Hadoop/Hive将数据加载到一个大数据存储中。这个过程就是Load。
通过ETL的过程,你可以将来自不同数据源的数据进行整合和处理,得到更加规范化、一致性和可靠性的数据集合。这些数据可以用于数据分析、机器学习、业务报表等各种应用场景,帮助你做出更准确、更有针对性的决策。
Reporting & BI & Analytics
Reporting、BI和Analytics是数据分析领域中的三个重要概念,都是数据分析领域中的重要概念。报表主要用于展示数据或信息,BI则注重企业数据的转换和利用,Analytics则专注于数据分析和挖掘,发现新的洞见和知识。这些概念在实际应用中有着各自不同的侧重点和目标,但却都能为企业提供更多的商业价值,它们之间有些微妙的不同点:-
-Reporting(报表):Reporting通常是指展示数据或信息的静态或半静态的格式化文档。这些文档可以是PDF、Excel、Word等各种格式,通常用于告诉人们什么已经发生、正在发生或可能会发生。报表往往会根据用户需求生成预定的格式,并在固定时间内自动更新,例如月度财务报告、销售报告、客户报告等等。
-BI(商业智能):BI是指通过数据挖掘、数据分析、数据可视化和其他技术手段,将企业数据转换为有价值的信息和洞见。BI旨在帮助企业做出更明智的决策,优化业务流程和提高效率。与报表不同的是,BI通常会涉及对历史数据和趋势的分析以及对未来情景的模拟和预测,同时也可以使用交互性的可视化工具,让用户能够更好地理解数据和信息。
-Analytics(分析):Analytics通常被看作是BI的一部分,它着重于数据分析和挖掘,通过使用各种技术和工具对数据进行挖掘和解释,以发现新的信息和知识。Analytics可以帮助企业发现隐藏的模式、关联和趋势,进而提供更具体、更深入的见解,从中获得更好的商业价值。
Data Formats 常见的数据交换格式
数据交换格式是指用于在不同系统之间传输和共享数据的一种标准化格式。数据交换格式通常包括了数据结构、编码规则和交换协议等多个方面,其目的是为了保证不同系统之间能够正确地解析和使用数据。
在实际应用中,不同的系统可能会使用不同的数据格式来存储和处理数据,这就对数据的交换和共享带来了一些困难。为了解决这个问题,人们设计出了一系列标准化的数据交换格式,例如JSON、XML、CSV、Protobuf、Avro等等。这些数据交换格式具有以下特点:
JSON
JSON(JavaScript Object Notation):JSON是一种轻量级的数据交换格式,通常用于Web应用程序中的数据传输。JSON采用基于键值对的方式存储数据,支持多层嵌套结构,可以表示复杂的数据结构。它的语法简洁明了,易于阅读和编写,并且能够被大部分编程语言解析和生成。因此,在互联网领域,JSON已经成为了最流行的数据格式之一。
XML
XML(Extensible Markup Language):XML也是一种用于数据交换的标记语言,它支持自定义标签和属性,可以表示非常复杂的数据结构。XML在Web服务、文档传输、配置文件等方面非常常见,但由于其标签比较冗长,语法相对复杂,因此在数据传输方面逐渐被JSON所取代。
CSV
CSV(Comma-Separated Values):CSV是一种简单的纯文本文件格式,它使用逗号或其他分隔符将数据字段分隔开,每行表示一个记录或实例。CSV最初是电子表格软件中的一种常用数据格式,但现在已经广泛应用于数据交换和数据处理领域。CSV的优点是语法简单,易于生成和解析,并且可以作为多个数据分析工具之间的通用格式进行数据转换。
正则表达式RegExp
(Regular Expression),简称为Regex或RegExp,是一种用于字符串匹配和文本处理的表达式语言。它是通过定义规则来匹配和处理字符串的一种方式,可以在不知道具体字符串内容的情况下,快速地检索、替换和提取字符串。
正则表达式通常由各种字符和特殊符号组成,这些符号代表着某些意义或规则。例如,使用字符集合[]来表示一个字符集合,使用量词符{}来表示匹配次数,使用锚点^和$来表示字符串的开头和结尾等等。正则表达式的规则非常灵活,可以根据需要自由组合和扩展,以满足不同的字符串匹配和文本处理需求。可以了解比较基础的正则语法,具体的语法也是可以等到使用时再进行学习和查询;
Python Programming
Python 基础
Python表达式
Expressions是Python程序中的一种基本元素,它们由变量、操作符和函数组成,用于计算并返回一个值。Python表达式可以用于各种场合,例如赋值语句、条件语句、循环语句和函数调用等。Python表达式通常由以下几个部分组成:
-变量:变量是Python程序中的一个标识符,用于存储和处理数据。在表达式中,我们可以使用变量来表示一个值或对象。
-操作符:操作符是用于进行数学运算、比较和逻辑判断的符号。常见的操作符包括加号+、减号-、乘号*、除号/、等于号=、大于号>等等。
-函数:函数是一段可重复使用的代码块,用于封装和执行特定的任务。在表达式中,我们可以使用内置函数或自定义函数来执行特定的计算和操作。
例如,下面是一个简单的Python表达式,在这个表达式中,变量x和y分别被赋值为10和5,z被计算为(x+y)*2的结果,最终输出z的值20:
1 | x = 10 |
变量
Python中的变量(Variables)是用于存储数据值的标识符,可以通过变量名来访问和操作对应的数据。在Python中,变量不需要显式地声明,而是在第一次赋值时自动创建,并且可以随时重新赋值。
以下是一些常见的Python变量类型:
-整数:整数类型(int)用于存储整数值,例如:x = 10
-浮点数:浮点数类型(float)用于存储实数值,例如:y = 3.14
-布尔值:布尔类型(bool)用于存储True或False两种值,例如:z = True
-字符串:字符串类型(str)用于存储文本,例如:name = “Bob”
变量名必须遵循一定的命名规则,通常采用小写字母和下划线的组合,例如:my_variable、person_name等。此外,在Python中还有一些约定俗成的命名规则,例如:类名采用驼峰命名法、私有变量前面加上下划线等。
在Python中,变量的类型是动态的(Dynamic Typing),即它们的类型可以随着赋值操作而改变。例如:
1 | x = 10 # x是整数类型 |
总之,Python中的变量是用于存储数据值的标识符,可以随时重新赋值,并且可以自动推导出其类型。开发者需要遵循命名规则和约定俗成的命名方式(见PEP 8),以提高代码的可读性和可维护性。
数据格式
Data Structures
Python中的数据结构(Data Structures)是一种用于组织和存储数据的方式,可以支持各种不同类型的数据操作。Python提供了多种内置的数据结构,包括列表、元组、字典、集合等。
以下是一些常见的Python数据结构:
-列表(List):列表是一种有序的数据结构,可以存储任意数量的元素,并且支持动态添加、删除、修改等操作。例如:
1 | my_list = [1, 2, 3, "hello", True] |
-元组(Tuple):元组也是一种有序的数据结构,类似于列表,但是它的元素不可修改。例如:
1 | my_tuple = (1, 2, 3, "hello", True) |
–字典(Dictionary):字典是一种键值对的数据结构,可以通过键来访问对应的值,支持动态添加、删除、修改等操作。例如:
1 | my_dict = {"name": "Bob", "age": 25, "gender": "male"} |
-集合(Set):集合是一种无序的数据结构,可以存储任意数量的元素,并且自动去重。例如:
1 | my_set = {1, 2, 3, 4, 4, 5} |
除了以上内置的数据结构之外,Python还支持其他一些高级的数据结构,例如堆(Heap)、队列(Queue)等,它们可以在不同的场景下提高代码的效率和可读性。
总之,Python中的数据结构是一种用于组织和存储数据的方式,开发者可以根据具体需求选择适合的数据结构,并且灵活地使用内置方法和操作来对其进行增删改查等操作。
函数
在Python中,函数(Function)是一种可重用的代码块,可以接受输入参数并返回输出结果。通过定义封装和调用,函数能够提高代码的可读性、可维护性和复用性,常常被用于封装特定功能和算法。
在Python中,函数定义采用关键字def,后面跟着函数名和参数列表,参数列表中的参数可以有默认值,也可以使用带*的元组形式来接收任意数量的位置参数,或者使用带**的字典形式来接收任意数量的关键字参数。例如:
1 | def greet(name="world"): |
Python 主要的内置函数查询
1 | import builtins |
map:主要联合其他函数使用,将函数依次作用到序列的每个元素,得到一个新的序列。
filter:是将传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素,主要对序列的值进行过滤
sorted:sorted(iterable,key=None, reverse=False)接受一个key函数来实现对可迭代对象进行自定的排序
reduce:指定列表中两两相邻元素的结合条件
迭代器和生成器:都是 Python 中用来处理集合对象的概念。
-迭代器是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器是所有包含了__iter__() 和__next__() 方法的对象。其中__iter__() 方法返回迭代器对象本身,而__next__() 方法返回集合中的下一个元素。当没有更多元素时,该方法应该引发 StopIteration 异常。通常可以用于遍历可视化图像数据集;
1 | my_list = [1, 2, 3] |
以下是一些常见的数据结构,也是 Python 内置的迭代器类型:
列表(list)、元组(tuple)和集合(set)等序列类型都支持迭代器协议,因此它们可以被视为迭代器。
字典(dict)类型虽然不是序列,但也支持迭代器协议。当我们对一个字典进行迭代时,实际上是在遍历它的键。
文件(file)类型也实现了迭代器协议,每次迭代会返回文件中的下一行。
-在Python中,使用了yield的函数被称为生成器,生成器则是一种特殊的迭代器,它基于函数生成值序列。在函数内部,使用 yield 语句产生值。每次调用生成器的 next() 方法时,它会执行到 yield 语句处并返回一个值。再次调用 next() 方法时,该函数将从上次离开的地方恢复执行。和其他函数不同的是,每当程序执行完语句时,程序就会暂停执行。
以下是一个简单的生成器示例,生成斐波那契数列:
1 | def fibonacci(): |
生成器会无限地生成斐波那契数列,但在这个例子中我们使用了一个 break 语句来限制输出的数量。每次调用 next() 方法时,该生成器函数都会在 yield 语句处暂停并返回一个值(即当前斐波那契数),直到再次被调用以产生下一个值。
除了以上特性之外,Python函数还支持闭包、装饰器等高级特性,可以实现更加灵活和高效的编程方式。
包管理语言&依赖管理器
包管理语言是指一种用于管理特定编程语言或平台的软件包的工具或系统。它们提供了一种简单的方式来安装、升级和删除软件包,并解决软件项目中的依赖关系。在包管理语言中,软件包通常被存储在公共或私有的存储库(如npm、NuGet、PyPI等)中,并且可以通过特定的命令行工具进行访问和管理。这些工具可以下载和安装软件包及其依赖项,同时还可以提供其他功能,例如搜索和列出可用的软件包、创建和发布软件包等。
Dependency manager(依赖管理器)是指一种工具,用于管理软件项目中的依赖关系。在软件开发中,通常需要使用许多不同的库和框架来构建一个功能完整的应用程序,这些库和框架之间可能存在复杂的依赖关系。使用依赖管理器可以自动地解决这些依赖关系,安装和升级所需的包和库,从而简化了开发者的工作流程,提高了项目的可维护性和可重用性。目前比较知名的依赖管理器有npm、pip、Maven等。
包管理器通常包含依赖管理器的功能;
Python 常见的包管理工具有:
pip:Python 的默认包管理器,可以从 PyPI(Python Package Index)上安装、升级和卸载各种 Python 包。
Anaconda:一种针对数据科学领域的 Python 发行版,内置了众多数据分析和科学计算常用的包,可以使用 conda 进行包管理。
easy_install:另一种 Python 包安装工具,与 pip 类似,但已经逐渐被取代。
virtualenv:一种 Python 虚拟环境管理工具,可以创建独立的 Python 环境,使得不同项目之间可以隔离开来并且使用不同版本的 Python 和不同的库。
Codestyle
Codestyle是指编写代码时所遵守的规范和约定,它包括了代码组织、命名规则、注释风格、缩进方式、代码结构等方面的要求。能够提高代码的可读性、可维护性和可扩展性,从而降低代码出错和重构的风险。
PEP 8:PEP 8是Python语言的官方Codestyle规范,提供了关于代码布局、注释、命名、字符串引号、缩进等方面的建议。它强调代码的可读性和一致性,并且被广泛视为Python开发中的最佳实践。
以下是主要的规则:
缩进:使用四个空格作为缩进,不要使用制表符。
行长:每行代码不超过 79 个字符。
函数和类命名:使用小写字母和下划线分隔单词的方式来命名函数和类,例如 my_function、my_class。
变量命名:同样使用小写字母和下划线分隔单词的方式来命名变量,例如 my_variable。
空格:在运算符前后加上一个空格,但是在括号内部不加空格。
注释:使用注释来解释代码的意图,注释应该清晰、简洁、易于理解。
导入格式:每个导入应该独占一行,并放置在文件开头。标准库模块应该先导入,然后是第三方模块,最后是本地模块。
空行:使用空行分隔函数和类定义以及函数内的逻辑块,但是不要滥用空行。
常用库
Numpy
NumPy提供了高效的数组操作和数学函数,这使得它成为数值分析、科学计算和数据科学任务的首选库之一。它支持多维数组,包括向量、矩阵和张量,并且提供了广泛的数学函数和线性代数运算。更适合数值处理的场景。此外,NumPy还具有良好的内存管理和优化,因此在处理大型数据集时非常快速和高效。
Pandas
Pandas是一个基于NumPy构建的库,它提供了更高级别的数据结构,例如Series和DataFrame,这些结构与传统的SQL数据库表非常相似。适合各种类型的异质性数据,使用Pandas,可以轻松地读取、写入、转换和过滤数据,以及执行聚合、重塑和透视等常见操作。Pandas内置了许多强大的函数和方法,可以利用Python的灵活性和易用性来完成复杂的数据处理任务。
virtual environment
虚拟环境是隔离的 Python 环境,在其中你可以为特定的项目安装包。这很有用,因为不同的项目可能需要相同包的不同版本,甚至不同版本的 Python 本身。通过使用虚拟环境,你可以避免包之间的冲突,并确保你的项目具有所需的依赖项。
Pipenv是一个用于 Python 项目的虚拟环境和包管理工具。它为你的项目创建并管理虚拟环境,使你可以安装包而不影响系统上全局的 Python 安装。可以通过终端来运行;
Jupyter Notebooks / Lab
Jupyter Notebook 和 Jupyter Lab都是基于Web的交互式计算环境,用于创建和贡献文档,其中包括代码、方程式、可视化图标以及文字说明等元素。他们通常运行在本地计算机或远程服务器上,并且都支持多项语言,包括Python、R、Julia 等。
Jupyter Notebook 是最早的 Jupyter 项目,它通过单元格的方式组织代码和文本,并支持即时运行代码并查看输出结果。这些单元格可以随时修改、重新运行,并与其他单元格进行交互。Jupyter Notebook 还支持 Markdown 来添加富文本说明、数学公式和图像等内容。
Jupyter Lab 是 Jupyter Notebook 的下一代版本,增加了许多强大的功能和改进,例如更好的多窗口管理、扩展性和自定义界面。它还支持在同一个界面中同时打开多个文件类型(如 Notebooks、文本文件、终端等)。
总的来说,Jupyter Notebooks 和 Jupyter Lab 非常适合数据分析、科学计算和软件开发等领域,它们使得工作流程更加高效、可重复和易于分享。要在本地使用Jupyter Notebook,您需要安装Anaconda或Miniconda。这些是Python发行版,包括Jupyter Notebook和其他常用数据科学工具。
Data Sources
Data mining
数据挖掘是关于如何实现(商业)问题/目标的事情,是充分挖掘已知信息,来推测未知信息;通常在一个完整的建模分析中,数据挖掘的时间往往大于所谓的分析时间,数据质量,维度特征的重要性非常高,尤其是在机器学习中,不同特征的选取直接会对模型效果有较大影响;而在深度学习和集成学习中,由于神经网络的结构会天然对特征进行筛选,而机器往往比人类完成的会更好,因此很多场景中神经网络模型要比机器学习出色很多,这也说明了数据挖掘的重要性;
Web Scraping
爬虫:网页数据检索/抓取
爬虫好处:
· 能够批量且及时的更新你所关注的信息,听上去也是一种非常geek的信息获取方式,这种信息输入模型或直接提取能够发挥较大的实用价值;
爬虫劣势:
· 爬虫语言本身是一种相对静态获取信息的方式,因此随着要爬取对象包含JavaScript代码的多少(当网页中大量使用JavaScript时,这些JavaScript代码可以对爬虫产生很大的影响,包括页面中的内容发生改变、URL的生成发生变化、内容的异步加载等,这都可能导致爬虫难以成功地提取所需的数据),难度会不断上升,通常需要更为复杂的工具,例如Selenium等,以便能够完全模拟浏览器的行为来获取所需的数据;
· 随着AI的发展,AI能够自行检索网络信息,在信息处理领域人工智能的价值越来越大,因此掌握爬虫技术的性价比会越来越低;
· 爬虫需要遵守robots.text君子协议,基本上有用的信息都反爬,所以爬虫往往需要肩负法律风险;
· 因为网页通常是出于不断迭代中的,反爬技术也在不断更新,因此维护一段爬虫代码对精力投入的要求也是比较高的;
小结,爬虫只是一种互联网信息的获取方式,有很多获取信息的方式,需要考虑使用成本和方便程度,重要的是是否能够获取的信息,让信息为你所用;比如下一part,就会展示其实有很多组织和个人在做优质信息的处理和分享工作;如果更好地使用优质低成本的公开信息,也许更有价值;
Awesome Public Datasets
Kaggle
Kaggle 上有很多竞赛会提供高质量且真实的数据集供大家使用学习,这里有一些使用tips~
- 在Kaggle平台上可以找到各种主题的数据科学竞赛,包括分类、回归、聚类、自然语言处理、图像识别、时间序列预测等。寻找感兴趣的竞赛,并阅读比赛的描述、数据、评估标准等信息。
- 在参加比赛之前,需要先了解比赛所提供数据的格式、特点以及数据分布等情况。可以下载并分析数据,挖掘数据背后的信息。
- 在得到数据之后,可以根据比赛要求和自己的理解,构建和训练本地的机器学习模型,进行组合调参等优化,提高模型的预测表现。
- 当完成模型训练后,需要将模型提交到Kaggle竞赛平台以进行评估。提交后Kaggle平台将使用测试数据集来评估模型的性能,给出排名和评估指标。但是对于初学者,排名也许不是最重要的,而是理解不同模型方法对模型准确性的影响,不断积累对数据挖掘的模型经验才是最重要的;
- 参考讨论区:在参加比赛的过程中,可以参考讨论区查看其他用户的解决方案和经验,同时也可以在讨论区提出自己的问题与其他用户交流和讨论。
常见的数据挖掘方法
PCA 主成分分析
PCA是用信息中的主要成分表示原信息的特征,是通过降维进行信息压缩(降维)的一种方式;
原理:首先去中心化,然后旋转遍历找最合适的坐标系向量(找方差最大的方向,数据分布最分散的方向)原数据在正交轴上投影的分布,方差越大,数据越分散,能够保存样本点最多特征信息的最佳坐标系–>压缩后尽可能保留更多的信息量;
度量指标:这里的最佳坐标系可以理解为初始坐标系的线性变化,通常我们用协方差来度量 坐标系信息线性变换每个瞬间的离散程度;协方差表示:矩阵中的变量之间,相关性如何;xy同向变动时协方差较大,xy反方向变动时协方差为负;
迭代:由于协方差在数量大时计算相当复杂,因此在大数据量的情况下我们可以通过SVD直接计算PCA;在线性代数领域优化SVD的算法优化非常多,因此SVD在进行矩阵分解的计算有更优秀的性能;SVD的右奇异矩阵起到的作用同样是对列数即特征维度的压缩,等同于PCA的作用;
Dimensionality & Numerosity Reduction
数据归约:通过数据维度降维或样本量减少的方式,优化数据分析的一种数据挖掘技术;
常用方法:
- 抽样(Data Sampling)
- 聚类(Clustering)
- 汇总(Data Aggregation)
- 泛化(Data Generalization):用通用性的数据替代某些数据,使数据集仍能代表本身的重要信息;
- 数据压缩(Data Compression):通常有有损压缩和无损压缩,在图像处理,视频等高维数据中比较多常见;
Pros :
· 提升学习效率,更快;
· 提成学习性能(准确性,降低干扰);
· 节省存储成本;
· 降低数据的解释成本(减少低相关的数据);
Cons :
· 信息有损
· 影响准确性(当不小心删减了重要信息时)
· 提升数据的解释成本(当删减过多上下文,导致数据语境不明)
· 计算成本:进行数据压缩同样需要大量的机器计算成本
归一化 Normalization
归一化可以尽可能地保留数据内部样本之间的分布关系,而忽略数据绝对值的信息,从而使不同数据集之间的数据有可比性,能够更公允的对齐不同数据间的情况;
常见的操作:
-
最大-最小规范化(Min-max normalization):将数据转换到[,1]区间内。公式为:x_norm = (x - min(x)) / (max(x) - min(x))
-
z-score标准化(Z-score normalization):将数据通过平均数偏移和标准偏差缩放转换到标准正态分布上。公式为:x_norm = (x - mean(x)) / std(x)
-
小数定标规范化(Decimal scaling normalization):通过缩放因子10的幂次,将数据转换为[-1,1]或[,1]区间内。公式为:x_norm = x / (10 ^ j),其中j为作为缩放因子的幂次。
-
归一化积分值(Normalization by integral):将数据划分为若干区间,然后将每个区间的数据值除以整个数据集的总和。公式为:x_norm = x / Sum(x)
数据清洗
Quality data beats fancy algorithms.
尤其是在在如今大模型、通用人工智能模型表现出如此智能化/涌现 能力的今天,数据质量的重要性将比以往任何时候都更加重要;
在处理和清洗数据前,搞清楚的明白你的目的,比采取任何行动都至关重要;
一些CheatSheet:
-
标准「数据质量」:正确/有用性,准确性,完整性,连续性/一致性,统一性
· 数据可用性:数据格式、数据取值范围、空值检查/补全、数据去重、枚举值梳理、外键约束(一个表的外键必须存在于另一个表的主键)交叉验证;
· 数据格式化处理
· 数据有用性校验(end_date>start_date)
· 量纲统一 -
ToDo「工作流」:数据检查、数据清洗、数据可用性处理、数据报告
· 数据检查: 整体探查,可视化
· 数据清洗:不相关数据删除,重复数据合并,数据类型转换,格式纠正(eg:移除不必要的空格),标准化、量纲/范围修正(极端值剔除),归一化,空值处理(丢弃、推断补充、相似移植,标识(0/missing),数据逻辑校验(如果指标间有计算关系可以校验)
关于标识 Flag的处理方法的适用场景,可以参考幸存者偏差,因为很可能空值的样本本在总体中的分布式有原因的而非随机,那这种情况空值本身也是一种特征(删除和推断都会让我们丢失信息),如果被填充或者删除都会影响学习效果;
·记录在数据清洗中的主要工作,帮助我们在需要时进行回溯或迭代;