关于人工智能:数据科学的面试的一些基本问题总结

31次阅读

共计 7143 个字符,预计需要花费 18 分钟才能阅读完成。

在这篇文章中,将介绍如何为胜利的面试做筹备的,以及能够帮忙咱们面试的一些资源。

代码开发根底

如果你是数据科学家或软件开发人员,那么应该曾经晓得一些 Python 和 SQL 的基本知识,这对数据科学家的面试曾经足够了,因为大多数的公司基本上是这样的——然而,在你的简历中退出 Spark 是一个很好的加分项。

对于 SQL,你应该晓得一些最简略的操作,例如:

  • 从表中抉择某些列
  • 连贯两个表(内连贯、左连贯、右连贯和外连贯)
  • 汇总后果(总和、平均值、最大值、最小值)
  • 在 SQL 中应用窗口函数
  • 日期解决

对于 Python,须要理解:

  • 解决 df(pandas),例如读取、退出、合并、过滤
  • 操作日期和格式化日期
  • 操作字符串,例如应用正则表达式、搜寻字符串蕴含的内容
  • 无效地应用循环
  • 应用列表和字典
  • 在 Python 中创立函数和类

在你的编程面试中,把握 SQL 和 Python 是很重要的。

理解数据结构和算法

这是一个重要的问题,可能不像对软件开发人员那么重要,然而对数据结构和算法有很好的了解必定会让你不同凡响。以下是一个好的开始:

  • 大 O 符号
  • 二进制搜寻
  • 数组和链表
  • 抉择排序
  • 疾速排序
  • 冒泡排序
  • 合并排序
  • 哈希表

上面进入本文的正题,将介绍一些根本的 ML 面试相干材料, 能够作为笔记珍藏

线性回归

我对于线性回归的大部分笔记都是基于《统计学习导论》这本书。

Logistic 回归

它是一种宽泛应用的技术,因为它十分高效,不须要太多计算资源,高度可解释,不须要缩放输出特色,不须要任何调整,易于正则化,并且它输入通过良好校准的预测概率。

与线性回归一样,当删除与输入变量无关的属性以及彼此十分类似(相干)的属性时,逻辑回归的成果会更好。所以特色工程在逻辑和线性回归的性能方面起着重要作用。Logistic 回归的另一个长处是,它非常容易实现并且训练效率很高。我通常从逻辑回归模型作为基准开始,而后尝试应用更简单的算法。

因为其简略性以及能够绝对容易和疾速地实现的事实,逻辑回归是一个很好的基准能够应用它来掂量其余更简单算法的性能。

它的一个最次要的毛病是咱们不能用它解决非线性问题,因为它的决策面是线性的。

逻辑回归的假如:首先,逻辑回归不须要因变量和自变量之间的线性关系。其次,误差项(残差)不须要遵从正态分布。第三,不须要同方差性。最初,逻辑回归中的因变量不是在区间或比率尺度上测量的。

然而,其余一些假如依然实用。

首先,二元逻辑回归要求因变量是二元的,而序数逻辑回归要求因变量为序数。

其次,逻辑回归要求察看后果彼此独立。换言之,察看后果不应来自反复测量或匹配数据。

第三,逻辑回归要求自变量之间很少或没有多重共线性。这意味着自变量之间的相关性不应太高。

第四,逻辑回归假如自变量和对数几率是线性的。尽管这种剖析不要求因变量和自变量线性相关,但它要求自变量与对数几率线性相关。

最初,逻辑回归通常须要大样本量。对于模型中的每个自变量,个别状况下至多须要 10 个后果频率最低的样本。

聚类

应用 GMM 有两个益处。首先,GMM 在集群协方差方面比 K-Means 灵便得多;因为标准偏差参数,簇能够出现任何椭圆形状,而不是仅限于圆形。K-Means 实际上是 GMM 的一种非凡状况,其中每个集群在所有维度上的协方差都靠近 0。其次,因为 GMM 应用概率,因而每个数据点能够属于多个簇。因而,如果一个数据点位于两个重叠集群的两头,咱们能够简略地定义它的类,办法是说它属于类 1 的 X 百分比和属于类 2 的 Y 百分比。

随机森林和晋升树

这部分咱们介绍的很多了,能够参考我门以前的文章

自编码器

自编码器是一种无监督学习技术,利用神经网络来实现示意学习的工作。具体来说,设计一个神经网络架构,以便咱们在网络中蕴含一个瓶颈层(压缩),强制原始输出的压缩常识示意。如果输出特色彼此独立,那么这种压缩和随后的重建将是一项十分艰难的工作。然而如果数据中存在某种构造(即输出特色之间的相关性),则能够学习这种构造,从而在强制输出通过网络瓶颈时加以利用。

如上图所示,咱们能够将一个未标记的数据集构建为一个监督学习问题,其工作是输入 x̂,即原始输出 x 的重建。能够通过最小化重建误差 (x,x̂) 来训练该网络,该误差掂量咱们的原始输出与后续重建之间的差别。瓶颈层是咱们网络设计的要害属性;在不存在信息瓶颈的状况下,咱们的网络能够很容易地学会通过网络传递这些值来简略地记住输出值。

留神:事实上,如果咱们要构建一个线性网络(即在每一层不应用非线性激活函数),咱们将察看到与 PCA 中察看到的类似的降维

因为神经网络可能学习非线性关系,这能够被认为是比 PCA 更弱小的(非线性)泛化。PCA 试图发现形容原始数据的低维超平面,而主动编码器可能学习非线性流形(流形简略地定义为间断的、不相交的外表)。

梯度降落

梯度降落是一种用于寻找可微函数的部分最小值的优化算法。梯度降落通过最小化老本函数的办法找到函数参数(系数)的值。这是一个迭代迫近的过程。

梯度只是掂量所有权重绝对于误差变动的变动。也能够将梯度视为函数的斜率。梯度越高,斜率越陡,模型学习的速度就越快。然而如果斜率为零,模型就会进行学习。在数学术语中,梯度是对于其输出的偏导数。

批量梯度降落:批量梯度降落,也称为一般梯度降落,计算训练数据集中每个示例的误差,但只有在评估了所有训练示例之后,模型才会更新。这整个过程就像一个循环,称为一个训练轮次。

批量梯度降落的一些长处是它的计算效率,它产生稳固的误差梯度和稳固的收敛。毛病是稳固的误差梯度有时会导致收敛状态不是模型所能达到的最佳状态。它还要求整个训练数据集都在内存中并且可供算法应用。

随机梯度降落:相比之下,随机梯度降落 (SGD) 对数据集中的每个训练示例执行此操作,这意味着它会一一更新每个训练示例的参数。这能够使 SGD 比批量梯度降落更快。然而频繁更新比批量梯度降落办法的计算成本更高。每一个样本都计算梯度也会收到噪声的影响,导致不是向着梯度的方向挪动导致训练工夫的减少。

小批量梯度降落:小批量梯度降落是首选办法,因为它联合了 SGD 和批量梯度降落的概念。它只是将训练数据集分成小批,并为每个批执行更新。这在随机梯度降落的鲁棒性和批量梯度降落的效率之间建设了均衡。

常见的 mini-batch 大小在 50 到 256 之间,但与任何其余机器学习技术一样,没有明确的规定,因为它因不同的应用程序而异。这是训练神经网络时的首选算法,也是深度学习中最常见的梯度降落类型。

独热编码与标签编码

咱们应该如何解决分类变量呢?事实证明,有多种解决分类变量的办法。在本文中将探讨两种最宽泛应用的技术:

  • 标签编码
  • One-Hot 编码

标签编码

标签编码是一种用于解决分类变量的风行编码技术。在这种技术中,每个标签都依据字母程序调配一个惟一的整数。

让咱们看看如何应用 scikit-learn 库在 Python 中实现标签编码,并理解标签编码的挑战。

第一列 Country 是分类特色,因为它由对象数据类型示意,其余的是数字特色,因为它们由 int64 示意。

# Import label encoder 
from sklearn import preprocessing 
# label_encoder object knows how to understand word labels. 
label_encoder = preprocessing.LabelEncoder() 
# Encode labels in column‘Country’. 
data[‘Country’]= label_encoder.fit_transform(data[‘Country’]) 
print(data.head())

标签编码的问题

在上述场景中,国家名称没有程序或等级。然而很可能会因为数字自身导致模型很有可能捕捉到印度 < 日本 < 美国等国家之间的关系,这是不正确的。那么如何能力克服这个阻碍呢?这里呈现了 One-Hot Encoding 的概念

One-Hot 编码

One-Hot Encoding 是另一种解决分类变量的风行技术。它只是依据分类特色中惟一值的数量创立附加特色。类别中的每个惟一值都将作为特色增加。

在这种编码技术中,每个类别都示意为一个单向量。让咱们看看如何在 Python 中实现 one-hot 编码:

# importing one hot encoder 
from sklearn from sklearn.preprocessing import OneHotEncoder 
# creating one hot encoder object 
onehotencoder = OneHotEncoder() 
#reshape the 1-D country array to 2-D as fit_transform expects 2-D and finally fit the object 
X = onehotencoder.fit_transform(data.Country.values.reshape(-1,1)).toarray() 
#To add this back into the original dataframe 
dfOneHot = pd.DataFrame(X, columns = [“Country_”+str(int(i)) for i in range(data.shape[1])]) 
df = pd.concat([data, dfOneHot], axis=1) 
#droping the country column 
df= df.drop([‘Country’], axis=1) 
#printing to verify 
print(df.head())

One-Hot Encoding 会导致虚构变量陷阱,因为能够借助其余变量轻松预测一个变量的后果。

虚构变量陷阱导致称为多重共线性的问题。当独立特色之间存在依赖关系时,就会产生多重共线性。多重共线性是线性回归和逻辑回归等机器学习模型中的一个重大问题。

因而,为了克服多重共线性问题,必须删除其中虚构变量。上面将理论演示在执行 one-hot 编码后如何引入多重共线性问题。

查看多重共线性的罕用办法之一是方差收缩因子 (VIF):

  • VIF=1,多重共线性非常少
  • VIF<5,中度多重共线性
  • VIF>5,极其多重共线性(这是咱们必须防止的)

最初阐明:如果应用的树型模型,应用标签编码就足够了,应用线性模型倡议还是应用独热编码

超参数调优

随机搜寻穿插验证

通常,咱们对最佳超参数只有一个含糊的概念,因而放大搜寻范畴的最佳办法是评估每个超参数值。应用 Scikit-Learn 的 RandomizedSearchCV 办法,咱们能够定义超参数范畴的网格,并从网格中随机采样,对每个值组合执行 K-Fold CV。

from sklearn.model_selection import RandomizedSearchCV
# Number of trees in random forest
n_estimators = [int(x) for x in np.linspace(start = 200, stop = 2000, num = 10)]
# Number of features to consider at every split
max_features = [‘auto’,‘sqrt’]
# Maximum number of levels in tree
max_depth = [int(x) for x in np.linspace(10, 110, num = 11)]
max_depth.append(None)
# Minimum number of samples required to split a node
min_samples_split = [2, 5, 10]
# Minimum number of samples required at each leaf node
min_samples_leaf = [1, 2, 4]
# Method of selecting samples for training each tree
bootstrap = [True, False]# Create the random grid
random_grid = {‘n_estimators’: n_estimators,‘max_features’: max_features,‘max_depth’: max_depth,‘min_samples_split’: min_samples_split,‘min_samples_leaf’: min_samples_leaf,‘bootstrap’: bootstrap}pprint(random_grid){‘bootstrap’: [True, False],‘max_depth’: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, None],‘max_features’: [‘auto’,‘sqrt’],‘min_samples_leaf’: [1, 2, 4],‘min_samples_split’: [2, 5, 10],‘n_estimators’: [200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000]}
# Use the random grid to search for best hyperparameters
# First create the base model to tune
rf = RandomForestRegressor()
# Random search of parameters, using 3 fold cross validation,
# search across 100 different combinations, and use all available cores
rf_random = RandomizedSearchCV(estimator = rf, param_distributions = random_grid, n_iter = 100, cv = 3, verbose=2, random_state=42, n_jobs = -1)
# Fit the random search model
rf_random.fit(train_features, train_labels)

RandomizedSearchCV 中最重要的参数是 n_iter,它管制要尝试的不同组合的数量,cv 是用于穿插验证的分折次数 (咱们别离应用 100 和 3)。更多的迭代将笼罩更大的搜寻空间,更多的 cv 折叠将缩小过拟合的机会,但进步每一个将减少运行工夫。机器学习是一个衡量取舍的畛域,性能与工夫是最根本的衡量之一。

咱们能够通过拟合随机搜寻来查看最佳参数:

rf_random.best_params_{‘bootstrap’: True,‘max_depth’: 70,‘max_features’:‘auto’,‘min_samples_leaf’: 4,‘min_samples_split’: 10,‘n_estimators’: 400}

网格搜寻穿插验证

随机搜寻容许放大每个超参数的范畴。也能够显式地指定要尝试的每个设置组合。应用 GridSearchCV 来实现这一点,该办法不是从一个散布中随机抽样,而是评估咱们定义的所有组合。为了应用网格搜寻,咱们依据随机搜寻提供的最佳值创立另一个网格:

from sklearn.model_selection import GridSearchCV

# Create the parameter grid based on the results of random search
param_grid = {‘bootstrap’: [True],‘max_depth’: [80, 90, 100, 110],‘max_features’: [2, 3],‘min_samples_leaf’: [3, 4, 5],‘min_samples_split’: [8, 10, 12],‘n_estimators’: [100, 200, 300, 1000]}

# Create a based model
rf = RandomForestRegressor()

# Instantiate the grid search model
grid_search = GridSearchCV(estimator = rf, param_grid = param_grid,cv = 3, n_jobs = -1, verbose = 2)

精度和召回

这些指标示意了模型在数据集中找到所有相干案例的能力

损失函数

回归:

均方误差损失

在数学上,如果指标变量的散布是高斯分布,则它是最大似然推理框架下的首选损失函数。首先要想到并且能够使间接应用损失函数,只有在有充沛理由的状况下才倡议应用其余的损失函数。

均匀绝对误差损失

在一些回归问题中,指标变量的散布可能次要是高斯分布,但可能有异样值,例如平均值的大值或小值间隔很远。在这种状况下,均匀绝对误差或 MAE 损失是一个适合的损失函数,因为它对异样值更持重。它被计算为理论值和预测值之间的相对差的平均值

二元分类:

穿插熵:穿插熵将计算一个分数,该分数总结了预测类 1 的理论概率分布和预测概率分布之间的均匀差别,完满的穿插熵值为 0。

Hinge Loss:

对于二元分类问题,穿插熵的代替办法是 Hinge Loss,次要开发用于反对向量机 (SVM) 模型。它旨在与目标值在汇合 {-1, 1} 中的二进制分类一起应用。Hinge Loss 激励示例具备正确的符号,当理论和预测的类值之间的符号存在差别时调配更多谬误。Hinge Loss 的性能报告是混合的,有时在二元分类问题上比穿插熵有更好的性能。

多类分类:多类穿插熵

最初总结

本文分享了一些在面试中常见的问题,后续咱们还会整顿更多的文章,心愿这篇文章对你有帮忙,并祝你为行将到来的面试做好筹备!

https://avoid.overfit.cn/post/22ca3b67bad14371a1c251a388f1fc4c

作者:Sameen

正文完
 0