模型总结
K邻近模型 KNeighborsClassifier
原理 KNeighborsClassifier
将一块磁铁放在一堆分散的不同颜色的铁块中,算法中的参数用于设定磁铁可以吸附铁块的个数,
肯定是从最近位置的铁块开始吸引.
当参数为1时,只吸引一个铁块,因此这个铁块是什么颜色, 那么这块磁铁就标记成什么颜色.
当参数为N时,会吸附N个铁块,不同颜色的铁块都会吸附过来,以最多颜色的铁块来标记磁铁的颜色.
磁铁就好比新数据, 铁块就好建模用的数据样本.
模型优缺点 KNeighborsClassifier
-
优点:
构建容易迅速, 便于理解 -
缺点:
不适用于大数据量样本计算, 不适含有多个特征数据的数据样本,
尤其是多特这中大多为0的那数据样本.因为需要每个点都计算,很浪费资源.
使用建议 KNeighborsClassifier
对于复杂模型产生的数据,应当使K尽量小, 因为复杂模型的数据已经足够精准,
扩大K势必降低其精确度.
反之,针对简单模型,因为数据太含糊不清,应尽量使K大一些,
多一些参考数据来决定最终数据类型.
开发相关信息 KNeighborsClassifier
模型 | 类别 | Class名 | PKG位置 | 参数 | 参数说明 |
---|---|---|---|---|---|
入门 | KNeighborsClassifier | sklearn.neighbors | [n_neighbors]: 相邻数 | 相邻数越大,训练模型得分越低,泛化能力提高 |
线性模型 LinearRegression
原理 LinearRegression
特征1 特征1系数 + 特征2 特征2系数 + 特征n 特征n系数 + 偏移系数 = 预测结果.
x[0] w[0] + x[1] w[1] + x[n] w[n] + b
通过各个特征系数分别获得各特征数据汇总后信息加上偏移量生成最终模型
通常验证模型的方法:
SUM((数据1预测值 - 数据1真实值)平方 … + (数据N预测值 - 数据N真实值)平方) / N
模型优缺点 LinearRegression
-
优点:
善于分析多特征数据 -
缺点:
- LinearRegression模型更多的是注重数据的线性趋势,因此在精度上会有一定的损失
- 不适合特征数较少的数据
- 不适合拥有多特征但大多是无效特征的数据
- 没有参数来控制模型的复杂度,因此会出现训练集过拟合,测试集欠拟合的情况出现
使用建议 LinearRegression
适合多特征且多数为有效的数据样本来预测数据的未来走势.
开发相关信息 LinearRegression
模型 | 类别 | Class名 | PKG位置 | 参数 | 参数说明 |
---|---|---|---|---|---|
线性模型 | LinearRegression | sklearn.linear_model |
线性模型 回归 Ridge
原理 Ridge L2正则化
础的线性模型:
特征1 特征1系数 + 特征2 特征2系数 + 特征n 特征n系数 + 偏移系数 = 预测结果.
x[0] w[0] + x[1] w[1] + x[n] w[n] + b
参考之上
L2正则化: 各个数据样本中各特征的平方值之和然后再开方.
L2正则化: 强调的是综合特征,适合数据特征很多,而且大多都为参考值的数据
模型优缺点 Ridge
-
优点:
- 善于分析多特征数据
- 通过损失参数alpha,来控制模型的精度
-
缺点:
- LinearRegression模型更多的是注重数据的线性趋势,因此在精度上会有一定的损失
- 不适合特征数较少的数据
- 不适合拥有多特征但大多是无效特征的数据
使用建议 Ridge
适合用多特征数据样本预测数据的未来走势,但是特征数不能太多.
开发相关信息 Ridge
模型 | 类别 | Class名 | PKG位置 | 参数 | 参数说明 |
---|---|---|---|---|---|
线性模型 | 回归 | Ridge(L2正则) | sklearn.linear_model | [alpha]: 损失参数 | 损失参数越大,偏移比较大的特征损失数越多, 模型的泛化能力越好 |
线性模型 Lasso
原理 Lasso L1正则化
础的线性模型:
特征1 特征1系数 + 特征2 特征2系数 + 特征n 特征n系数 + 偏移系数 = 预测结果.
x[0] w[0] + x[1] w[1] + x[n] w[n] + b
参考之上
L1正则化: 各个数据样本中各特征的绝对值之和.
L1正则化: 强调的是每个特征,因此会较容易筛选出有效特征, 适合特征数据大多为0的数据
模型优缺点 Lasso
-
优点:
- 善于处理大多为无效特征的多特征数据
- 通过损失参数alpha,来控制模型的精度
-
缺点:
- LinearRegression模型更多的是注重数据的线性趋势,因此在精度上会有一定的损失
- 不适合特征数较少的数据
使用建议 Lasso
- 适合用多特征数据样本预测数据的未来走势,但是特征数不能太多.
- 适合数据中多数为无效特征的数据
开发相关信息 Lasso
模型 | 类别 | Class名 | PKG位置 | 参数 | 参数说明 |
---|---|---|---|---|---|
线性模型 | 回归 | Lasso(L1正则) | sklearn.linear_model | [alpha]: 损失参数 | 损失参数越大,偏移比较大的特征损失数越多, 模型的泛化能力越好 |
线性模型 回归 LogisticRegression,SVM
原理 LogisticRegression,SVM
用当前分类去比较其它所有分类, 也就时把当前以外的分类变成一类,
这样问题就回归到了简单的二分类问题上了.
不同于二分类,多分类在比较时需要把每个分类都与其它分类比较一下,
然后让得分最高的分类作为模型的结果.
模型优缺点 LogisticRegression,SVM
-
优点:
- 善于处理大多为无效特征的多特征数据
- 通过精确参数C,来控制模型的精度
-
缺点:
- LinearRegression模型更多的是注重数据的线性趋势,因此在精度上会有一定的损失
- 不适合特征数较少的数据
- 不适合特征数多,但是都高度相关联的数据样本
使用建议 LogisticRegression,SVM
- 建议使用:
适合有大量数据样本且像预测新数据类型的时候 - 不建议使用:
数据的特征都高度关联或无效属性居多的时候
开发相关信息 LogisticRegression,SVM
模型 | 类别 | Class名 | PKG位置 | 参数 | 参数说明 |
---|---|---|---|---|---|
线性模型 | 分类 | LogisticRegression | sklearn.linear_model | [C]: 精确系数 [penalty:] 惩罚系数[L1, L2] [solver]: 内部使用的模型类型 | C为精度参数,值越小模型约趋于简单. 默认为L2正则,如果使用L1正则,则需要设置 penalty和solver |
线性模型 | 分类 | LinearSVC | sklearn.svm | [C]: 精确系数 | C为精度参数,值越小模型约趋于简单. |
朴素贝叶斯分类器
原理 贝叶斯分类器
贝叶斯分类器名称 | 算法概述 |
---|---|
BernoulliNB | 1.从数据样本中抽出各分类数据 |
2.抽出数据中对相同特征进行值相加 | |
MultinomialNB | 1.从数据样本中抽出各分类数据 |
2.抽出数据中对相同特征进行值相加 | |
3.求各特征的平均值 | |
GaussinaNB | 1.从数据样本中抽出各分类数据 |
2.抽出数据中对相同特征进行值相加 | |
3.求各特征的平均值 同时保存标准差 |
模型优缺点 贝叶斯分类器
使用建议 贝叶斯分类器
-
GaussinaNB模型是这次将的3类中最复杂的模型,很明显也是处理最难问题的,数据样本是高维数组的样本最好用这个模型.
-
BernoulliNB和MultinomialNB基本属于一类,适合处理稀疏数据样本,就是大多特征都是0的那种.
对于大数据量的样本数据,如果想分类数据的化,到目前掌握的知识来看,最好优先选用贝叶斯分类器模型.
开发相关信息 贝叶斯分类器
模型 | 类别 | Class名 | PKG位置 | 参数 | 参数说明 |
---|---|---|---|---|---|
线性模型 | 回归 | Lasso(L1正则) | sklearn.linear_model | [alpha]: 损失参数 | 损失参数越大,偏移比较大的特征损失数越多, 模型的泛化能力越好 |
max_iter: 训练次数 | 默认为1000 因为模型注重的是单个 | ||||
模型 | 类别 | Class名 | PKG位置 | 参数 | 参数说明 |
贝叶斯分类器 | 分类 | BernoulliNB | sklearn.naive_bayes | [alpha]: 填充参数 | 值越大,虚拟填充点数约大,曲线越平滑,精度越低,泛化能力越强 |
贝叶斯分类器 | 分类 | MultinomialNB | sklearn.naive_bayes | [alpha]: 填充参数 | 值越大,虚拟填充点数约大,曲线越平滑,精度越低,泛化能力越强 |
贝叶斯分类器 | 分类 | GaussinaNB | sklearn.naive_bayes | - | - |
决策树
原理 决策树
就是没完没了的问,直到问出答案
决策边界的产生规则:
- 决策边界的每一次产生因该都是调用相同的逻辑,只不过大于1的深度需要递归调用.
- 决策边界的每一次划分都是以数据特征来划分,目的就是尽可能多的决策出这一次的纯点(完全是某一类数据,没有夹杂其它类别)
- 只有产生不纯点的时候,才可能产生下一次的决策
- 不用纠结决策边界为啥一会X轴一会Y轴, 完全由算法和特征数据来决定样本的边界如何画
对于复杂数据的决策树是有方案优化的:
- 在事情变得恶化前及时止损的方法叫**预剪枝**, 理解起来就是觉得差不多这样就行了,别再细分了.
- 先细化再分类筛选的方法叫**后剪枝**,理解起来就是该干的活都给我干完喽,我最后决定要哪些.
模型优缺点 决策树
- 优点:
决策树对训练数据的契合度非常高,适合做过往数据的分析 - 缺点
对不参于建模的测试数据基本没有预测能力
使用建议 决策树
适合冷数据或过往数据做分析报告
开发相关信息 决策树
模型 | 类别 | Class名 | PKG位置 | 参数 | 参数说明 |
---|---|---|---|---|---|
决策树 | 分类 | DecisionTreeClassifier | sklearn.tree | [max_depth]: 最大深度 | max_depth越大训练模型越精确,泛化能力越弱 |
决策树 | 回归 | DecisionTreeRegressor | sklearn.tree | [max_depth]: 最大深度 | max_depth越大训练模型越精确,泛化能力越弱 |
决策树集合 随机森林
原理 随机森林
处理问题思路:
核心: 构建多个随机决策树,然后获取每棵树的预测结果再取平均值.
每棵树在决策时不在像决策树那样针对每个节点寻找最佳划分,而是针对某一特征做划分.
对于回归问题: 采用取各个树的平均值.
对于分类问题: 同样先算出每棵树,然后算出所有树的平均值,最终返回概率最大那棵树的结果
分类的那个有点怪异,为什么还要算平均值,每棵树算完不就知道概率了吗?
我猜可能跟这个模型的核心有关,那就是随机.
随机具体体现:
-
数据样本随机(n_sample 采样):
我理解每颗树的训练用的数据样本的个数因该是一样的,不同的是每个样本的数据内容.
书中提到了一个参数[n_sample],我猜它的作用因该是随机采样时每个重复样本的最大个数.举个例子说:
有10个数据样本,你需要随机在这个样本中抽数据.
完成条件是:
随便抽样本,重复了没事,凑出10个样本就行,但是重复样本的个数不能超过n_sample因此每棵树在开始建模就会于原始样本有偏差,
因此不论是解决分类问题也好,还是回归问题也好,都要先算平均值. -
数据特征随机(max_features 采样):
这个是关于特征的随机采样,跟上面稍有不同是:
特征不能重复,而且不能超过原始特征个数.
模型优缺点 随机森林
-
优点:
- 随机森林有决策树模型的所有优点,而且弥补了决策树过拟合的问题.
- 在默认参数下模型的预测结果就很准确
-
缺点
- 随机森林的模型深度要远远大于决策树的深度,不适合演示教育目的.
- 默认情况下模型的构建是随机的,如果需要再现模型问题时,模型构建参数 radom_state要设置成0才可以
- 模型的构建需要消耗更多的内存和时间
- 对高纬度的稀疏数据,特别是文本支持不是太好
- 如果想在短时间取得大概的预测结果,使用线性模型要更好一些
使用建议 随机森林
在内存和时间充裕的情况下,使用决策树结合来分析会得到比较准确的结果
反之使用线性模型预测也可以得到相对准确的结果
随机森林不适合高纬度的稀疏数据,特别是文本
开发相关信息 随机森林
模型 | 类别 | Class名 | PKG位置 | 参数 | 参数说明 |
---|---|---|---|---|---|
决策树集合 | 随机森林 | RandomForestClassifier | sklearn.ensemble | [n_estimators] 决策树个数 [max_feature] 单个决策树的特征数 [n_jobs] 参与计算的cpu内核数 [max_depth] 决策的最大深度 [leaf_nodes] 最终叶节点数 | [n_estimators] 决策树个数越多,预测结果越平滑,模型过拟合度越小(参考的内容越多结果越准确) [max_feature] 越小模型过拟合越小(每个数只考虑自己的小部分特征, 该特征的结果就较为准确),不太熟悉的化还是用默认值比较好 [n_jobs] 参与个数越多,计算越快,但不能超过物理内核数 [max_depth]深度越大,模型越准确,时间内存消耗越大 [leaf_nodes] 产生的最终的结果叶节点的个数,默认是最大 |
决策树集合 梯度提升决策树
原理 梯度提升决策树
通过合并多个数构建模型,
随机森林的重点在于随机,
梯度提升决策树是连续创建,而且新创建的树总是试图解决上棵树的错误
梯度提升决策树产生的思想: 合并多个简单的模型结果,通过迭代来提高模型性能
模型优缺点 梯度提升决策树
- 优点
- 模型深度很小,占用内存更少,计算也很快
- 有学习率参数可以控制学习强度以达到改变模型结果的目的
- 可以过滤掉不太重要的特征,对数据分析更直观
- 缺点
- 由于有过滤,因此训练模型会稍有损失
使用建议 梯度提升决策树
因为随机森林模型和梯度提升模型的变现都很好,而且随机森林在默认参数下的预测就很准确,
因此一般建议先选用随机森林来建模.
如果在机器性能优点吃紧或是时间比较仓促又或者需要更精确的预测那么可以选择梯度提升决策树模型.
梯度提升模型中n_estimators参数控制创建树的个数, learning_rate学习率控制每颗树的学习强度.
这两个参数耦合度很高.树越多,模型越复杂.学习率越低就需要更多的树来支持
书中建议优先使用n_estimaotrs来控制模型复杂度,然后通过微调learning_rate来控制模型精度.
开发相关信息 梯度提升决策树
模型 | 类别 | Class名 | PKG位置 | 参数 | 参数说明 |
---|---|---|---|---|---|
决策树集合 | 梯度提升决策树 | GradientBoostingClassifier | sklearn.ensemble | [n_estimators] 决策树个数 默认100 [max_depth] 决策的最大深度 默认3 一般不超过5 [learning_rate] 学习率 默认0.1 | [n_estimators] 决策树个数越多,预测结果越平滑,模型过拟合度越小(参考的内容越多结果越准确),相应的模型越复杂 [max_depth]深度越大,模型越准确,时间内存消耗越大 [learning_rate] 越大新树的纠错强度就越高,越低学习能力越弱,也就需要更多的树来学习 |
核支持向量机
原理 核支持向量机
核支持向量机的英文表示是: kernelized support vector machine 一般叫做SVM.
- 核:
模型中有针对不同数据样本封装好的核方法,核应当指的就是这些函数. - 核方法:
在低维空间中不能线性分割的点集,通过转化为高维空间中的点集时,从而变为线性可分的,这就是核方法。 - 核技巧:
将低维空间处理不了的问题转化到高维空间来处理的技巧. - 支持向量:
SVM在学习过程中对每个计算对于决策边界的重要性,通常影响决策边界的只有小部分的数据点, 这些点称作支持向量. - 总结:
使用核函数将低维空间难于处理的数据在处理高维空间进行解析处理的模型.
模型优缺点 核支持向量机
- 优点:
- 核函数丰富,可以针对不同的数据使用不同的核来处理,因此对各种数据集的表现都很好
- 允许数据的决策边界很复杂(因为模型可以使用高维空间处理低纬空间很难处理的问题)
- 缺点
- 对数样本个数的缩放不好,当数据样本个数达到10万以上的时候,是非常考验机器性能的
- 波动大的数据样本需要做数据的预处理(数据缩放)
- 不同核有不同的参数,例如C和gamma,这些参数的微小变化都能直接影响模型结果,
设置比较复杂, 而且为了调校至合适值可能需要多次的训练尝试.
使用建议 核支持向量机
数据量适中,数据特征的单位相似且整体的波动范围不大,对数据特征的多少并无要求.
- 数据量始终,样本个数不超10万件为宜
- 数据特征多少和复杂度都不限,但是特征单位尽量相似且特征的整体波动范围不大
- 对于波动范围较大的数据应用模型时需要做数据的预处理(数据缩放)
数据缩放
-
标准化数据扩张的思想:
排除掉不重要的数据,集中体现重要数据,整体数据的波动范围稍大,
标准化讲究的是集中体现重要数据,对个别的异常数据的容忍性比较好. -
归一化数据扩张的思想:
一个都不能少[异常数据也包含其中],全部按比例缩放到0~1区间,因此整体数据的波动范围很小
这么小的波动范围一个小小的噪点就能影响整个预测结果,
因此归一化讲究的是完整性,它对异常数据敏感.
结合上面的特性去理解下面的表格:
算法模型 | 推荐:标准化数据扩张 | 推荐:归一化数据扩张 |
---|---|---|
线性和逻辑回归 | 〇 | |
神经网络 | 〇 | |
支持向量机 | 〇 | |
K均值聚类 | 〇 | |
K最近邻居 | 〇 | |
主成分分析 | 〇 | |
分类和回归树 | 〇 | |
森林随机回归 | 〇 |
开发相关信息 核支持向量机
模型 | 类别 | Class名 | PKG位置 | 参数 | 参数说明 |
---|---|---|---|---|---|
核支持向量机 | 混合模型 | SVC | sklearn.svm | [C] 精度参数 | C影响的是决策边界与向量支持的距离. C越大,决策边界划分的越精确,边界越清晰可见,泛化能力越弱 |
[gamma]高斯核宽度 简单理解:气球半径 | 观察gamma是不能停留在2维空间的,应当在高维空间去考虑这个参数,简单点考虑可以想象一个气球, gamma就是气球的半径,gamma越大气球越大,气球越大使劲越大也就意味着模型越复杂, 随着gamma(气球)的逐渐增大,各个数据点也逐渐清晰,决策边界也越来越容易划分,太精确必将导致过拟合. | ||||
[kernel] 核参数 | [‘linear’]: 线性核,用于处理2分类数据 [‘rbf’]: 表示高斯核, 低维空间处理困难数据在高维空间空间处理 |
神经网络
原理 神经网络
因为书中只有关于MLPClassifier的例子,所以就以这个为例简单介绍.
神经网络模型区别于线性模型的关键点是增加了虚拟层和隐单元,因此最重要的参数首先要介绍这两个.
接下了进入了枯燥公式环节:
前提: 数据样本中有100个特征, 1个虚拟层, 100个隐单元
(线性模型)权重个数: 100(特征) * 1(输出) = 100(权重)
(神经网络模型)权重个数:
(1)各特征到虚拟层个单元: 100(特征) 100(第一层隐单元) = 10000(权重)
(2)隐单元到输出: 100(第一层隐单元) 1(输出) = 100(权重)
总结权重: (1) + (2) = 10100(权重)
以此类推,2层虚拟单元 100个隐单元的场合:
(1)各特征到虚拟层个单元: 100(特征) 100(第一层隐单元) = 10000(权重)
(2)第一虚拟层各隐单元至第二虚拟层各隐单元: 100(第一层隐单元) 100(第二层隐单元) = 10000(权重)
(3)第二虚拟层各隐单元到输出: 100(第一层隐单元) * 1(输出) = 100(权重)
总结权重: (1) + (2) + (3) = 20100(权重)
由此可见神经网络的计算量非常大.sklearn由于只含有简单的神经网络入门模型,
因此没有GPU计算这样的高级功能,因此使用sklearn处理神经网络模型效率不高.
模型优缺点 神经网络
- 优点:
- 能最大程度获取数据包中的信息
- 能构建非常复杂的模型
- 参数多,可控力高,如果有足够的数据和时间,神经网络模型应当是学到目前位置最出色的模型 - 缺点
- 训练模型花费时间多,对机器负荷也较高
- 参数多,调节复杂
使用建议 神经网络
模型使用建议:
- 神经网络模型最终要的是先要确定虚拟层个数个隐单元个数.
隐单元一般与特征个数相同,如果特征数太多,可以适当减少.
虚拟层一般先使用一层或两层,然后逐步增大,直到模型得分达到峰值. - 微调参数 alpha, solver等来保证模型不要过拟合,这个步骤可能需要反复尝试以达到最好效果.
数据使用建议:
- 与SVM类似,神经网络模型对相同单位特征的数据样本效率最高,如果特征单位相差很多,建议使用树形模型处理.
开发相关信息 神经网络
模型 | 类别 | Class名 | PKG位置 | 参数 | 参数说明 |
---|---|---|---|---|---|
神经网络网络 | 线性模型 | MLPClassifier | sklearn.neural_network | [hidden_layer_sizes] 虚拟层数&隐单元 格式: [10,10]表示二层每层10个隐单元 | 虚拟层越多,模型越精确,模型越趋于过拟合,计算量越大 隐单元越多决策边界越平滑 |
[alpha]正则系数 | 值越大,模型精度越低,泛化能力越高 | ||||
[solver]算法参数 | (1)adam(default): 大多数情况下很好,对数据缩放很敏感,(建议始终将数据缩放为均值0,方差为一是很重要的) (2)lbfgs:书中例子都是这个,他对数据的支持很好就是计算花费时间较多,不适合大型模型的演算 (3)sgd:书中没有细说,可能属于高级参数,与之搭配的还有一些可调参数,因为它不是sklearn的重点,因此了解就行. | ||||
回归模型 | MLPRegressor | sklearn.neural_network | 书中未详细说明 | 书中未详细说明 |