十三、常见的分类算法有哪些?他们各自的优缺点是什么?
13-1、贝叶斯分类法
优点
1、对小规模数据的表现很好,能处理多分类任务,适合增量式训练。
2、算法简单,训练速度快。
缺点
1、对缺失数据不太敏感。
2、因为朴素贝叶斯模型假设了属性之间相互独立,这在实际应用中往往是不成立的,在属性之间相关性比较大的时候,分类效果并不好。适合属性之间相关性较小的样本。
3、需要首先知道先验概率。如果先验概率是假设的,那么往往预测结果不会那么准确。
4、对于输入数据的表达形式很敏感。
13-2、决策树
优点:
1):
2):
3):
4):
缺点
1):
2):
3):
13-3、K近邻
优点:
1):
2):
3):
4):
缺点
1):
2):
3):
13-4、逻辑回归
优点:
1):
2):
3):
4):
缺点
1):
2):
3):
13-5、神经网络
优点:
1):分类准确率比较高
2):
3):
4):
缺点
1):需要大量的参数。
2):训练时间过长。
3):
十四、RF与GBDT之间的区别与联系?
十五、请问怎么处理特征向量的缺失值?
1、如果缺失值较多的话,应该直接将该特征舍弃。
2、缺失值较少的话,一般的处理方法有:
1):均值、中值、众值填充。
2):用随机森林等算法预测填充。
3):邻近值填充。
3、相关API介绍:
15-1、 API:SimpleImputer(均值、中值、众值填充)
from sklearn.impute import SimpleImputer
参数:
missing_values: 缺失值,默认为空值np.nan
strategy: 填充缺失值时的策略,输入mean为均值填充,输入median为中值填充,输入most_frequent为众数填充。
fill_value:当参数strategy参数为constant时可用,可输入字符表示即将要填充的值,常用的是0.
copy:默认为True,将创建特征矩阵的副本,反之则会将缺失值填充到原本的特征矩阵中去。
15-2、API:KNNImputer(邻近值填充)
from sklearn.impute import KNNImputer
参数:
n_neighbors:选择邻居的样本个数。
注意:fit是训练的意思,得到均值中值众值等,而transform是应用的意思。要注意fit_transform一起用和分开用的区别。
十六、简述KNN最近邻分类算法的过程?
KNN算法概述:每个样本都可以由它最接近的k个邻居来代表,分类算法。
算法过程:
1、计算要测试的数据与各个数据之间的距离。
2、将这些距离进行排序。
3、选取距离最小的K个点。
4、统计这k个点的类别,哪个类别出现的频率最高则作为测试数据的预测分类。
十七、请写出你了解的机器学习特征工程操作,以及它的意义?
特征工程:包括数据与特征处理、特征选择和降维。
17-1、数据与特征处理包括
1):数据选择、清洗、采样
数据清洗:填充缺失值,将不可靠的样本丢弃,处理异常值。
采样:保证不同类别样本的比例。
2):不同类型数据的特征处理
数值型:归一化、离散化。
API:
MinMaxScaler:归一到 [ 0,1 ]
from sklearn import preprocessing
preprocessing.MinMaxScaler()
MaxAbsScaler:归一到 [ -1,1 ] ,不常用。
类别型:one-hot编码,处理特征是分类型的数据。
from sklearn import preprocessing
preprocessing.OneHotEncoder()
文本型:使用tf-idf(词频–逆文件频率)处理,评估一个词对于一个文件集中的一个文件的重要程度。
核心思想:一个词语在一篇文章中出现次数越多, 同时在所有文档中出现次数越少, 越能够代表该文章,认为该词具有很好的类别区分能力,可以用来分类。
TF:词频,表现词条在文本中出现的频率,被归一化,防止偏向长的文件。
tf = 某一类中词条w出现的数目/某一类中所有的词条数目
IDF:逆文件频率
idf = log(文档总数/(包含该词的文档数+1))
某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。
公式: TF*IDF
API:from sklearn.feature_extraction.text import TfidfVectorizer
缺点:
1、每次增加语料时,需要重新计算,不适合增量编写
2、没有考虑特征词的位置对文本的区分程度,词条出现在不同位置,其重要性程度是不一样的。
from sklearn.feature_extraction.text import TfidfVectorizer train_document = ["The flowers are beautiful.", "The name of these flowers is rose, they are very beautiful.", "Rose is beautiful", "Are you like these flowers?"] test_document = ["The flowers are mine.", "My flowers are beautiful"] #利用函数获取文档的TFIDF值 print("计算TF-IDF权重") transformer = TfidfVectorizer() # fit(): 根据训练集生成词典和逆文档词频 # transform():使用fit学习的词汇和文档频率,将文档转化为文档-词矩阵。 X_train = transformer.fit_transform(train_document) X_test = transformer.transform(test_document) #观察各个值 #(1)统计词列表 word_list = transformer.get_feature_names() # 所有统计的词 print("统计词列表") print(word_list) #(2)统计词字典形式 print("统计词字典形式") print(transformer.fit(test_document).vocabulary_) #(3)TFIDF权重 weight_train = X_train.toarray() weight_test = X_test.toarray() print("train TFIDF权重") print(weight_train) print("test TFIDF权重") print(weight_test) #(4)查看逆文档率(IDF) print("train idf") print(transformer.fit(train_document).idf_)
时间型:提取出离散的年、月、日。比如说一周的星期几。
17-2、特征选择
1):Filter:使用方差过滤特征,评估单个特征和结果值的相关程度,留下相关性较强的特征。卡方检验:计算各个特征对目标值的相关系数,之后根据阈值筛选特征。
2):包装法:根据目标函数每次选择若干特征。
3):嵌入法:通过机器学习的某些算法和模型进行训练,得到各个特征的权值系数,并根据系数从大到小选择特征。
详细内容请看:Python特征选择(全).
17-3、降维
1):主成成分分析(PCA):将较高维度样本空间映射到较低维度的样本空间上。
API:from sklearn.decomposition import PCA
2):线性判别分析(LDA):LDA的目标是使降维后的数据点尽可能的容易被区分。
17-4、意义
1):对数据进行预处理,可以提高数据的质量。
2):使用正确的采样方法可以解决数据不平衡带来的预测偏差。
3):对不同类型数据的特征处理有助于提高特征的可用性。
4):特征选择有助于去除对结果不太重要的特征,提高计算性能。
5):降维有助于减少模型的训练时间,提高计算性能。
十八、如何降低数据集的维度以减少模型的计算时间?
1、首先关闭机器上正在运行的其他程序,确保大部分内存可用。
使用特征工程:
1、数据清洗:对于缺失值很多的特征直接删除。
2、随机采样数据,创建一个较小的数据集。
3、特征选择:相互关联的特征直接删除。对于结果影响不大的特征也直接删除。
4、降维:使用PCA(主成分分析):将较高维度样本空间映射到较低维度的样本空间上。
十九、如何提升已经达到96%精度的分类模型性能?
1、可能是数据不平衡,我们可以给分类分配权重,让较少的分类获得较大的权重。
2、我们可以通过AUC-ROC曲线找到最佳阈值来调整预测阈值。
二十、如何在一个数据集上选择重要的变量?给出解释?
1、使用信息增益来判断哪个特征是重要的。
2、选择重要的变量之前先去除相关变量。
3、使用随机森林,画出变量重要性图。
二十一、GBM和随机森林的区别?
二十二、如何理解模型的过拟合与欠拟合?以及如何解决?
欠拟合特点:模型在训练集和验证集上的效果都差。
1、添加更多的特征项。
2、增加模型的复杂度。比如说把低维不可分的数据映射到高维空间。
3、集成学习方法boosting(比如说GBDT)。
过拟合特点:随着训练过程的进行,模型在训练数据上的拟合效果越来越好,而在验证集上的效果则越来越差。
解决方法:
1、正则化:
L1正则化:逼迫更多w为0,变得稀疏。
L2正则化:逼迫所有w尽可能趋向于0但是不为0,顾及到了每一个点。
2、随机失活(dropout):让神经元以一定概率被激活。以一定的概率来删除相应的神经网络节点,这相当于每一次训练时模型的网络结构都不一样,这样可以有效的减少过拟合。
3、逐层归一化(batch normalization):这个方法给每层的输出都做一次归一化。使得下一层的输入接近正态分布。
4、提前终止Early Stopping:不去过分的追求精确的最小值,根据交叉验证来提前终止训练。
5、减少特征个数:将与结果没什么关系的特征删除,防止噪声干扰模型。
6、集成学习方法Bagging。
数据方面:
7、增加更多的训练数据,使用更大的数据集训练模型。
8、数据增强。
9、重新清洗数据。
二十三、xgboost的原理?
二十四、请详细说说梯度提升树(GBDT)的原理?
二十五、请说说Adaboost算法的原理与推导?
二十六、机器学习中的正则化到底是什么意思?
正则化:将系数估计朝0的方向进行约束、调整或者缩小。也就是说,正则化可以在学习过程中降低模型复杂度和不稳定程度,从而避免过拟合的危险。(即正则化是给损失函数加上一些限制。避免其过拟合)
过拟合函数:过拟合函数往往都是一个高阶多项式,正则化的目的就是使得高次项系数尽可能的为0或者是接近于0。
线性回归模型的代价函数:代价函数=损失函数+正则化项
备注:λ是正则化参数,参数越大,则对其惩罚的力度也越大,相应的会把所有的参数最小化,能起到规范的作用。θ 2 θ^2θ
2
平方是为了求导方便。
L1、L2正则化:又叫做L1范数、L2范数。目的是对损失函数加上一个约束,减小其解的范围。
L1正则化:逼迫更多w为0,变得稀疏。(Lasso回归)
L2正则化:逼迫所有w尽可能趋向于0但是不为0,顾及到了每一个点。(岭回归)
二十七、决策树、回归、SVM、神经网络等算法各自的优缺点?
决策树:
回归:
SVM:
神经网络:
二十八、最大熵模型中的数学推导?
二十九、如何通俗理解贝叶斯方法和贝叶斯网络?
三十、广义线性回归性能度量与评估方法
分类问题:
三十一、LightGBM的原理
三十二、GBDT与Xgboost的区别
传统的GBDT以CART树作为基学习器,XGBoost还支持线性分类器,这个时候XGBoost相当于L1和L2正则化的逻辑斯蒂回归(分类)或者线性回归(回归);
传统的GBDT在优化的时候只用到一阶导数信息,XGBoost则对代价函数进行了二阶泰勒展开,得到一阶和二阶导数;
XGBoost在代价函数中加入了正则项,用于控制模型的复杂度。从权衡方差偏差来看,它降低了模型的方差,使学习出来的模型更加简单,放置过拟合,这也是XGBoost优于传统GBDT的一个特性;
shrinkage(缩减),相当于学习速率(XGBoost中的eta)。XGBoost在进行完一次迭代时,会将叶子节点的权值乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。(GBDT也有学习速率);
列抽样:XGBoost借鉴了随机森林的做法, 支持列抽样, 不仅防止过 拟合,还能减少计算;
对缺失值的处理: 对于特征的值有缺失的样本,XGBoost还可以自动 学习出它的分裂方向;
XGBoost工具支持并行。Boosting不是一种串行的结构吗?怎么并行 的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代 中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
三十三、LightGBM与XGBoost的区别
xgboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略,区别是xgboost对每一层所有节点做无差别分裂,可能有些节点的增益非常小,对结果影响不大,但是xgboost也进行了分裂,带来了不必要的开销。 leaft-wise的做法是在当前所有叶子节点中选择分裂收益最大的节点进行分裂,如此递归进行,很明显leaf-wise这种做法容易过拟合,因为容易陷入比较高的深度中,因此需要对最大深度做限制,从而避免过拟合。
lightgbm使用了基于histogram的决策树算法,这一 点不同与xgboost中的 exact 算法,histogram算法在内存和计算代价上都有不小优势。
内存:直方图算法的内存消耗为(#data* #features * 1Bytes)(因为对特征分桶后只需保存特征离散化之后的值),而xgboost的exact算法内存消耗为:(2 * #data * #features* 4Bytes),因为xgboost既要保存原始feature的值,也要保存这个值的顺序索引,这些值需要32位的浮点数来保存。
计算:预排序算法在选择好分裂特征计算分裂收益时需要遍历所有样本的特征值,时间为(#data),而直方图算法只需要遍历桶就行了,时间为(#bin)