偏差和方差

  • 偏差(Bias):在统计和机器学习中是预测值的期望(平均预测值)和真实值之间的差异。

  • 方差(Variance):在统计和机器学习中是一个衡量预测值分散程度的量。如果我们有一组预测值,我们可以首先计算这组预测值的均值,然后计算每个预测值与中国均值的差的平方,最后计算这些平方差的平均值,得到的就是这组预测值的方差。更高的方差意味着预测值在其均值附近的分散程度更高。

偏差衡量的是模型的准确性,而方差衡量的是模型的稳定性。

  1. 低偏差,低方差:在这种情况下,模型的预测结果大部分都非常接近真实的模式,而且每次训练得到的模型之间的差别也非常小。这意味着,模型既能准确的学习到数据的真实规律,也对数据的微小变化不敏感,因此模型的预测效果非常好。

  2. 高偏差,低方差:在种情况下,虽然每次训练得到的模型之间的差别很小,但是他们离真实模型很远,这意味着模型并没有很好学习到数据的真实规律,即模型的偏差较大。但是、由于模型简单,对数据的微小变化不敏感,因此模型的方差很小。

  3. 低偏差,高方差:在种情况下,虽然模型的预测结果大部分都非常接近真实模型,但是每次训练得到的模型之间的差别较大。这意味着,模型能准确地学习到数据的真实规律,但对数据的微小变化过于敏感,导致模型的稳定性较差,即模型的方差较大。

  4. 高偏差,高方差:在这种情况下,模型的预测结果即远离真实模型,同时每次训练的模型之间的差别也很大。这意味着,模型即没有很好地学习到数据的真实规律,又对数据的微小变化过于敏感,这种情况时我们最不希望看到的。

低偏差、低方差:这是理想情况,模型既准确又稳定,但在实际中难以达到。

高偏差、低方差:模型过于简单,表现为欠拟合,无法准确捕捉数据模式。

低偏差、高方差:模型过于复杂,表现为过拟合,虽然在训练集上表现很好,但在测试集上表现不稳定。

高偏差、高方差:模型在准确性和稳定性上都存在问题,可能需要重新选择模型或调整数据和特征。

神经网络

前馈神经网路:所有的信息都只向前传递,所以这种神经网络也被称为多层神经网络。是应用最广泛、发展最迅速的人工神经网络之一。

递归神经网络:一种处理序列数据的深度学习模型。它通过引入循环结构,使得信息可以在网络内部进行传递和共享。

反向传播

反向传播是一种用于训练神经网络的算法,它结合了最优化方法(梯度下降法)来更新神经网络种的权重和偏差,以最小化损失函数。

反向传播首先执行前向传播,计算网络中每个节点的输出值,然后执行反向传播,计算损失函数值相对于每个参数的偏导数,即梯度。这些梯度信息被反馈给最优化方法,用于更新网络的权重和偏差,以逐步优化网络性能。反向传播是深度学习中的一个核心组成部分,对于训练多层神经网络至关重要。

机器学习方法

  1. 回归:回归算法用于建立两个或多个变量之间的关系模型,通过对数据进行拟合,预测一个或多个连续变量的值。回归算法的目标是找到一条最佳拟合曲线(直线、二次曲线),使得该曲线在训练数据上的误差最小化。常见的回归算法包括线性回归、岭回归和Lasso回归等。
  2. 分类:分类算法用于将数据点划分打我不同的类别中,预测一个或多个离散变量的取值。常见的分类算法包括逻辑回归、决策树和支持向量机等。
  3. 聚类:聚类算法用于将数据点分成不同的组,每个组包含相似的数据点,预测无标签数据集中的数据点所属的群组。聚类算法的目标是找到一种最佳的方式类划分数据点,使得同一组内的数据点相似度最高,不同组之间的1相似度最低。常见的聚类算法包括K均值聚类、层次聚类和DBSCAN等。

回归:线性回归、岭回归、Lasso回归

分类:逻辑回归、决策树、支持向量机

聚类:K均值聚类、层次聚类、DBSCAN

大数据的计算模式

  1. 批量计算(Batch Computing):批量计算首先进行数据的存储,然后对存储的静态数据进行集中计算。Hadoop是典型的大数据批量计算架构,由HDFS分布式文件系统负责静态数据的存储,并通过Hadoop将计算逻辑分配到各数据节点进行数据计算和价值发现。
  2. 流式计算(Steam Computing):在流式计算中,无法确定数据到来的时刻和到来的顺序,也无法将全部数据存储起来。因此,不再进行流式数据的存储,而是当流动的数据到来后,在内存中直接进行数据的实时计算。例如Twitter(X)的Storm、Yahoo的S4就是典型的流式数据计算架构,数据在任务拓扑中被计算,并输出有价值的信息。

批量计算:MapReduce(Google)、Hadoop(The Apache Software Foundation)

流式计算和批量计算分别适用于不同的大数据应用场景。对于先存储后计算,实时性要求不高,同时数据的准确性、全面性更为重要的应用场景,批量计算更适合。

流式计算:Storm(Twitter)、Kafka(The Apache Software Foundation)、Spark( Apache Spark)

对于无需先存储,可以直接进行数据计算,实时性要求很严格,但数据的精确度要求稍微宽松的应用场景,流式计算具有明显的优势。

流式大数据的特征

实时性:流式大数据是实时产生、实时计算的,结果反馈往往也需要保证及时性。流式大数据价值的有效时间往往较短,大部分数据到来后直接在内存中进行计算,只有少量数据才被长久保存到硬盘中。

易失性:在大数据流式计算环境中,数据流往往是到达后立即被计算并使用。在一些应用场景中,只有极少数的数据才会被持久化地保存下来,大多数数据往往会被直接丢弃。

突发性:在大数据流式计算环境中,数据的产生完全由数据源确定,由于不同的数据源在不同时空范围内的状态不统一且发生动态变化,导致数据流的速率呈现出了突发性的特征。

无序性:在大数据流式计算中,各数据流之间、同一数据流内部各数据元素之间是无序的。

无限性:在大数据流式计算中,数据是实时产生、动态增加的,只要数据源处于活动状态,数据就会一直产生和持续增加下去。

流式计算关键技术

系统架构:系统架构是系统中各子系统间的组合方式,属于大数据所共有的关键技术。大数据采用的系统架构可以分为无中心节点的对称式系统架构比如S4、Puma等系统和由中心节点的主从式架构比如Storm系统。

数据传输:数据传输是指完成有向任务图到物理计算节点的部署之后,各个计算机节点之间的数据传输方式。在大数据流式计算环境中,为了实现高吞吐和低延迟,需要更加系统地优化有向任务图以及有向任务图到物理节点的映射方式。

编程接口:编程接口用于方便用户根据流式计算的任务特征,通过有向任务图来描述任务内在逻辑和依赖关系,并编程实现任务图中各节点的处理功能。

高可用技术:大数据批量计算将数据事先存储到持久化设备上,节点失效后容易实现数据重放。而大数据流式计算对数据不进行持久化存储,因此批量计算中高可用技术不完全适用于流式计算环境。

机器学习

定义:机器学习(Machine Learning)是让机器从大量样本数据中自动学习其规则,并根据学习到的规则预测未知数据的过程。

本质:机器经过大量样本的训练(Training),获得了一定的经验(模型),从而产生了能够推测(Inference,推断或推理)新的事物的能力,就是机器学习这种预测能力,本质上是输入到输出的映射。

数据

ID Meals Tip Gender People Week Time
1 17.8 2.34 man 4 Saturday dinner
2 21.7 4.3 man 2 Saturday dinner
3 10.1 1.83 woman 1 Thursday lunch
4 32.9 3.11 man 2 Sunday dinner
5 16.5 3.23 woman 3 Thursday lunch
6 13.4 1.58 man 2 Friday lunch

数据集:像表中这样的样本数据叫做数据集(Dataset),该数据集以结构化的列表形式呈现。数据集由若干个样本组成。

样本:每个样本是一个观测数据的记录(Record),或者叫观测值(Observance),以表格中以行(Row)的形式体现。

标签/目标:在这个情景中,我们关注的是顾客的Tip的情况,Tip这一列是我们关注的结果(Outcome),我们可以把这个变量称为因变量(Dependent Variable)。在机器学习中通常叫做目标(Target)或标签(Label)。

特征:表中其他列表示的变量在这个问题中是用来解释和预测“Tip”的,我们把这些变量叫做自变量(Independent Variable),在机器学习领域通常用特征(Feature)这个术语来表示。特征和目标在表中通常以列(Column)的形式呈现。

  • 数据型(Numerical):长度、温度、价格
  • 分类型(Categorical):性别
  • 文本(Text):姓名、地址
  • 日期(Data time):2024-06-21

学习

监督式学习:我们把具有标签数据的学习任务叫做监督式学习。

回归任务:当目标变量式连续性(比如温度和价格)的时候,我们把这类问题叫做回归任务。

分类任务:当目标是离散型(例如某种植物是否具有毒性、贷款人是否违约、员工所属部门类型)的时候,我们遇到的问题则是分类任务。

非监督学习:我们遇到的样本数据并没有标签数据,我们把这个问题叫做非监督式学习。

聚类:聚类它根据样本数据分布的特点将数据分成几个类。

强化学习:强化学习(Reinforcement Learning)是基于“行动-反馈”的自我学习机制。所谓反馈,是一种基于行动对学习机的奖励。学习机以最大化奖励为目标,不断改进“行动”,从而适应环境。强化学习与监督式学习的主要区别是,前者是完全靠自己的精力去学习,没有人告知学习机正确的答案,“强化”的信号是对学习机行动的反馈;而后者是有人在监督学习机。

迁移学习:迁移学习将已经训练好的参数提供给新的模型用做训练。现实中很多机器学习问题是存在相关性的。

数据集

在机器学习任务中,我们通常将数据集分成三部分:训练集(Training Set)、验证集(Validation Set)和测试集(Test Set)

  • 训练集:用于训练模型,确定模型中的参数。
  • 验证集:用于模型的选择和优化。
  • 测试集:用于对已经训练好的模型进行评估,评价其表现。

过拟合:模型是用训练集进行学习的,倾向于尽可能拟合训练集数据的特性,因此在训练集上的测试效果通常会很好,但在没有见过数据集上表现效果可能会明显下降,这个现象叫做过度拟合(Overfitting)简称过拟合。

欠拟合:“欠拟合”常常在模型学习能力较弱,而数据复杂度较高的情况出现,此时模型由于学习能力不足,无法学习到数据集中的“一般规律”,因而导致泛化能力弱。

机器学习流程

机器学习流程:数据导入 -> 探索性分析 -> 数据清洗 -> 特征工程 -> 算法选择和优化 -> 模型训练和评估

探索性分析:探索性分析或探索性数据分析是通过图表等可视化工具对原始数据进行大致了解和初步分析的过程。

  • 了解数据集的基本信息
  • 给数据清洗提供方向
  • 为特征工程提供方向

数据清洗:数据质量差,杂乱无章,即使再好的算法也没有用,就好比加工垃圾一样,是因为我们遇到的绝大数数据集都是“不干净的”

  • 存在重复记录的数据

    ​ 人口数据中同一个人有两条完全相同的记录

  • 存在不相关的记录

    ​ 我们只关注中国人口数据,但数据集有美国人的信息

  • 无用的特征信息

    ​ 身份ID等一些显然不会对结果有影响的编号类数据

  • 文字拼写错误

    ​ 一些比较明显的信息输入错误

  • 信息格式不统一

    ​ 大小写不一致,表述形式不一致

  • 明显错误的离群值

    ​ 某人的年龄数据显示为175

  • 缺少数据

    ​ 表格中有一些信息空缺,没有记录

特征工程:特征工程又称特征提取,是机器学习建模之前的一个重要步骤。机器学习的本质是要找到x到y的映射,我们最终的目标是输出y。如果x“不给力”的话,后面的努力往往会成为徒劳。特征工厂就是从原始数据中找到合适的特征集x的过程。

简答题

  1. 简述机器学习与人工智能的关系。

答:机器学习是人工智能的一个分支,作为人工智能核心技术和实现手段,通过机器学习的方法解决人工智能面对的问题。

  1. 简述机器学习与数据科学、大数据分析等概念的关系。

答:数据科学主要包括两个方面:用数据的方法研究科学和用科学的方法研究数据。前者包括生物信息学、天体信息学、数字地球等领域;后者包括统计学、机器学习、数据挖掘、数据库等领域。大数据分析即是后者的一个部分。一般使用机器学习这个工具做大数据的分析工作,也就是说机器学习是我们做大数据分析的一个比较好用的工具,但是大数据分析的工具并不止机器学习,机器学习也并不只能做大数据分析。

  1. 简要说明机器学习的基本过程。

答:机器学习的基本过程包括数据导入、探索性分析、数据清洗、特征工程、算法选择和优化、模型训练和评估。

  1. 什么是交叉校验?

答:在一般情况下将数据集随机切分成训练集、验证集和测试集三部分。其中训练集用来训练模型;验证集用于训练过程中模型的验证和选择,如果有多个模型,选择其中最小预测误差的模型;而测试集用于对最终训练完成的模型进行评估。在实际应用中,数据往往并不充足,此时可以采用交叉验证的方法,将训练集切分成很多份,然后进行组合,以扩大可用训练集的数量。

  1. 什么是过拟合问题?如何判断过拟合?

答:模型的训练误差低但是泛化误差比较高,则称此模型过拟合。

【泛化误差反映了模型在实际应用中对于新输入的处理能力,是衡量学习方法泛化能力的一个关键指标。】

判断标准是:模型在训练集和验证集上表现都很好,而在测试集上表现很差。

  1. 常用的分类算法有哪些?列举5种。

答:常见的分类算法包括逻辑回归、线性判别分析、决策树、朴素贝叶斯、K最近邻、支持向量机(SVM)等。

  1. 聚类分析的目的是什么?

答:聚类分析用于对未知类别的样本进行划分,将它们按照一定的规则划分成若干个类簇,把相似的样本聚在一个类簇中,把不相似的样本分为不同类簇,从而揭示样本之间内在的性质以及相互之间的联系规律。

  1. 常用的聚类算法有哪些?列举5种。

答:常见的聚类算法包括KMeans、均值漂移、DBSCAN、GMM(高斯混合模型)、凝聚层次、图团体等。

  1. 卷积神经网络包括哪几层?简要说明各层的作用。

答:卷积神经网络包括输入层、卷积层、池化层、全连接层和输出层。

输入层:卷积神经网络的起始,它接受原始的数据作为输入。

卷积层:卷积神经网络的重要组成部分,它通过一组可训练的卷积核对输入进行卷积操作以提取特征。

池化层:用于降低特征的维度,减少计算量和内存占用,同时增加模型的鲁棒性。

全连接层:将特征提取和分类/回归阶段联系起来,将多维特征转换为一维向量,并进行线性变换和激活操作,以生成最终的输出。

输出层:产生卷积神经网络的最终输出,通常是一个分类或回归结果。

  1. 如何防止卷积神经网络的过拟合问题?

答:防止过拟合的方法有三种:人为增加数据集、正则化、Dropout。

在训练图像识别的深度神经网络时,使用更多的图像数据集训练的模型会使训练的网络具有更好地泛化性能,减小过拟合。

正则化的作用是调节模型复杂度对损失函数的影响,若权重衰减很大,则复杂的模型损失函数的值也就大。

使用Dropout是在每次训练过程中随机将部分神经元的权重置为0,即让一些神经元失效,这样可以缩减参数量,避免过拟合。

程序题

  1. 请用户输入一个数,判断该数是否为质数。
1
2
3
4
5
6
7
8
9
10
n = int(input("请输入一个数:"))
flag = True
for i in range(2, n):
if n % i == 0:
flag = False
break
if flag:
print(n, "是质数")
else:
print(n, "不是质数")
  1. 打印出所有的"水仙花数"。所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=13+53+33。
1
2
3
4
5
6
7
for i in range(100, 1000):
s = str(i)
a = int(s[0])
b = int(s[1])
c = int(s[2])
if i == a ** 3 + b ** 3 + c ** 3:
print(i)
  1. 一个小球从100米高度自由落下,每次落地后反弹回原高度的一半,再落下。求它在第10次落地时,共经过多少米?第10次反弹多高?
1
2
3
4
5
6
7
8
h = 100
s = 0
for i in range(10):
s += 1.5 * h
h *= 0.5
s -= h
print("s:", s)
print("h:", h)
  1. 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少个桃子?
1
2
3
4
s = 1
for i in range(9):
s = (s + 1) * 2
print(s)
  1. 一个整数,它加上100后是一个完全平方数,再加上168后又是一个完全平方数,请问该数是多少?所谓的“完全平方数”,就是指一个数能表示成某个整数的平方的形式,例如9 = 3 * 3。
1
2
3
4
5
6
7
8
n = 1
while True:
if (n + 100) ** 0.5 == int((n + 100) ** 0.5) \
and (n + 168) ** 0.5 == int((n + 168) ** 0.5)
print(n)
break
else:
n += 1
  1. 输入某年某月某日,判断这一天是这一年的第几天?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def isLeap(year):
return ((year % 400 == 0) or (year % 4 == 0 and year % 100 != 0))

year = int(input("year:"))
month = int(input("month:"))

day = int(input("day:"))
arr = (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)

days = day
for i in range(0, month):
days += arr[i]
if month >= 3 and isLeap(year):
days += 1
print(days)
  1. 计算一个句子中各个单词的出现频率。例如"Hello, how are you? Are you feeling good today?"。
1
2
3
4
5
6
7
8
9
10
11
12
13
14

line = "Hello, how are you? Are you feeling good today?"
line = line.replace('?', '') \
​ .replace(',', '') \
​ .replace('.', '') \
​ .lower()
words = line.split()
counts = { }
for word in words:
if word in counts:
counts[word] += 1
else:
counts[word] = 1
print(counts)