人工智能:机器学习、对环境的感知、实现动作
机器学习
学习:
2.机器学习三要素:数据、算法、模型
机器学习研究的是从数据中通过选取合适的算法,自动的归纳逻辑或规则,并根据这个归纳的结果(模型)与新数据来进行预测。
3.深度学习是在机器学习的基础上实现的,得益于机器性能的提升。神经网络则是深度学习的基础结构
4.从数据清洗,特征提取,到模型选择
四个基本概念
1监督学习(学习方式):
监督学习的数据比较特殊,举个栗子,比如你在中学学习英语,在老师的帮助下练习英语发音,
数据是你的发音和这个发音的对错/准确程度(对错/准确程度是老师告诉你的),
然后算法就是你去尝试去模拟数据(发音)的规律,
不断根据英语单词的拼写规律来学习发音,最终你学习到了基于拼写及句子的上下文调整发音。
2无监督学习:
无监督学习的数据中没有人告诉你对错信息,举个栗子,今天老师给你了一个碗,里面有黑米有红米,
让你对这个碗里的米分个类,你可能根据颜色分类,也可能根据大小、重要分类,都没有问题,因为老师没说按什么分,
对不对这个问题。
3降维:
降维是从更基本的维度来看问题,举个栗子,<nike 空军一号>这双鞋,
对其降维可以是nike这个运动品牌,也可以是运动鞋这个类目
4泛化:
泛华就是你学到的规则/模型的普适程度。
举个栗子吧,今天老师让你看了20个西瓜,并告诉你熟不熟,然后给你一个西瓜,问你只看外观,
这个西瓜熟不熟,你可能根据以下来判断:
可能你是这么做的:看表皮,你发现20个瓜里面,瓜皮表面光滑、花纹清晰、纹路明显、底面发黄的瓜都是熟的,
但是不满足任何一个条件的都是不熟的。
所以你学到的模型如下:如果瓜皮表面光滑、花纹清晰、纹路明显、底面发黄的,就说明是熟瓜;其它的是不熟的瓜。
但是其实有时候,纹路不明显,但其他条件满足的时候也会有一部分是熟的瓜。
所以你学到的模型具有一定泛化性能,但不具有很高的泛化性能。
5、半监督学习
半监督学习就有点不好理解了,半监督一般是指数据集中的数据有一部分是有标签的,另一部分是没标签的,
既不完全符合有监督学习的要求,也不完全符合无监督学习的要求,比如说在图像识别领域,
有一堆图片,手工标注出其中含有猫的图片,这样一个数据集就是一部分数据有标签一部分数据没标签,
这样一个数据集就可以用用半监督学习的方法对数据集进行训练,使一个模型能够准确从一堆图片中识别出猫.
在半监督学习中,也包含两种学习方法,一种是将没有标签的数据和有标签的数据同等对待进行训练,
另一种是将没有标签的数据作为需要被预测的数据对待,两者也是有不同的.
6、强化学习
是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利益。
说起这个强化学习就更厉害了,它的每一步没有明确的标签标识对错,只存在一个最终的结果作为导向,
比如说下棋,走的每一步都没有什么对错,毕竟看的是全局,在训练机器的时候,
机器也不知道对错,但是机器知道走到最后是输还是赢,如果输了,下次就不这么走了,
如果赢了,那就记下这种走法,是可行的.通过不断的"试错"来学习积累,这就是强化学习了.
传统机器学习的研究方向主要包括决策树、随机森林、人工神经网络、贝叶斯学习等方面的研究
逻辑回归
原理为将一个回归结果的因变量作为另外一个函数的自变量且值范围为0-1上
g(x)=1/(1+e^-x)
逻辑回归中最大似然函数和最小损失函数等价:一般使用梯度下降法来求解。
过拟合和欠拟合
欠拟合:模型在训练和测试都不好,此时应该增加特征值或者增加模型复杂度。
过拟合:在训练集表现好,测试集表现不好,此时可以正则化(l1,l2),或者增加数据集。
变量处理:
对连续型,可以考虑分箱再进行one-hot或者虚拟变量编码。增加鲁棒性。
离散型:可以考虑直接进行编码。
最后根据分析报告评价模型效果
precision recall f1-score support
0 0.90 0.90 0.90 63
1 0.94 0.94 0.94 108
accuracy 0.93 171
macro avg 0.92 0.92 0.92 171
weighted avg 0.93 0.93 0.93 171
参数解释:
(1)penalty:表示惩罚项(正则化类型)。字符串类型,取值为’l1’ 或者 ‘l2’,默认为’l2’。
l1:向量中各元素绝对值的和,作用是产生少量的特征,而其他特征都是0,常用于特征选择;
l2:向量中各个元素平方之和,作用是选择较多的特征,使他们都趋近于0。
注意:如果模型的特征非常多,我们想要让一些不重要的特征系数归零,从而让模型系数稀疏化的话,可以使用l1正则化。
(2)tol:浮点型,默认为1e-4;表示迭代终止判断的误差范围
(3)C:浮点型(为正的浮点数),默认为1.0;表示正则化强度的倒数(目标函数约束条件)。数值越小表示正则化越强。
(4)solver:用于优化问题的算法。取值有{'newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'},默认为'liblinear';
对于小数据集来说,“liblinear”就够了,而“sag”和'saga'对于大型数据集会更快。
对于多类问题,只有'newton-cg', 'sag', 'saga'和'lbfgs'可以处理多项损失;“liblinear”仅限于一对一分类。
注意:上面的penalty参数的选择会影响参数solver的选择。如果是l2正则化,那么4种算法{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}都可以选择。但如果penalty是l1正则化的话,就只能选择‘liblinear’了。这是因为L1正则化的损失函数不是连续可导的,而{‘newton-cg’, ‘lbfgs’,‘sag’}这三种优化算法时都需要损失函数的一阶或者二阶连续导数。而‘liblinear’并没有这个依赖。
(5)multi_class:字符串类型,取值有{ovr', 'multinomial'},默认为'ovr';
如果选择的选项是“ovr”,那么则为“one-versus-rest(OvR)”分类。multinomial则为“many-vs-many(MvM)”分类。
“one-versus-rest(OvR)”分类:无论你是多少元的逻辑回归,都可以看做多个二元逻辑回归的组合。具体做法是:对于第K类的分类决策,我们把所有第K类的样本作为正例,除了第K类样本以外的所有样本都作为负例,然后在上面做二元逻辑回归,得到第K类的分类模型。其他类的分类模型获得以此类推。
“many-vs-many(MvM)”分类:如果模型有T类,我们每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二元逻辑回归,得到模型参数。我们一共需要T(T-1)/2次分类(即组合数)。
(6)n_jobs:整数类型,默认是1;
如果multi_class='ovr' ,则为在类上并行时使用的CPU核数。无论是否指定了multi_class,当将
' solver ’设置为'liblinear'时,将忽略此参数。如果给定值为-1,则使用所有核。
特征工程
1 方法一:时间戳处理
时间戳属性通常需要分离成多个维度比如年、月、日、小时、分钟、秒钟。但是在很多的应用中,大量的信息是不需要的。比如在一个监督系统中,尝试利用一个“位置+时间”的函数预测一个城市的交通故障程度,这个实例中,大部分会受到误导只通过不同的秒数去学习趋势,其实是不合理的。并且维度“年”也不能很好的给模型增加值的变化,我们可能仅仅需要小时、日、月等维度。因此当我们在呈现时间的时候,试着保证你所提供的所有数据是你的模型所需要的。
别忘了时区,假如你的数据源来自不同的地理位置,别忘了利用时区将数据标准化。
2 方法二:分解类别属性
一些属性是类别型而不是数值型,举一个简单的例子,由{红,绿、蓝}组成的颜色属性,最常用的方式是把每个类别属性转换成二元属性,即从{0,1}取一个值。因此基本上增加的属性等于相应数目的类别,并且对于你数据集中的每个实例,只有一个是1(其他的为0),这也就是独热(one-hot)编码方式(类似于转换成哑变量)。
如果你不了解这个编码的话,你可能会觉得分解会增加没必要的麻烦(因为编码大量的增加了数据集的维度)。相反,你可能会尝试将类别属性转换成一个标量值,例如颜色属性可能会用{1,2,3}表示{红,绿,蓝}。这里存在两个问题:首先,对于一个数学模型,这意味着某种意义上红色和绿色比和蓝色更“相似”(因为|1-3| > |1-2|)。除非你的类别拥有排序的属性(比如铁路线上的站),这样可能会误导你的模型。然后,可能会导致统计指标(比如均值)无意义,更糟糕的情况是,会误导你的模型。还是颜色的例子,假如你的数据集包含相同数量的红色和蓝色的实例,但是没有绿色的,那么颜色的均值可能还是得到2,也就是绿色的意思。
能够将类别属性转换成一个标量,最有效的场景应该就是只有两个类别的情况。即{0,1}对应{类别1,类别2}。这种情况下,并不需要排序,并且你可以将属性的值理解成属于类别1/类别2的概率。
3 方法三:分箱或分区
有时候,将数值型属性转换成类别呈现更有意义,同时能使算法减少噪声的干扰,通过将一定范围内的数值划分成确定的块。举个例子,我们预测一个人是否拥有某款衣服,这里年龄是一个确切的因子。其实年龄组是更为相关的因子,所有我们可以将年龄分布划分成1-10,11-18,19-25,26-40等。而且,不是将这些类别分解成2个点,你可以使用标量值,因为相近的年龄组表现出相似的属性。
只有在了解属性的领域知识的基础,确定属性能够划分成简洁的范围时分区才有意义。即所有的数值落入一个分区时能够呈现出共同的特征。在实际应用中,当你不想让你的模型总是尝试区分值之间是否太近时,分区能够避免出现过拟合。例如,如果你所感兴趣的是将一个城市作为整体,这时你可以将所有落入该城市的维度值进行整合成一个整体。分箱也能减小小错误的影响,通过将一个给定值划入到最近的块中。如果划分范围的数量和所有可能值相近,或对你来说准确率很重要的话,此时分箱就不适合了。
4 方法四:交叉特征
交叉特征算是特征工程中非常重要的方法之一了,交叉特征是一种很独特的方式,它将两个或更多的类别属性组合成一个。当组合的特征要比单个特征更好时,这是一项非常有用的技术。数学上来说,是对类别特征的所有可能值进行交叉相乘。
假如拥有一个特征A,A有两个可能值{A1,A2}。拥有一个特征B,存在{B1,B2}等可能值。然后,A&B之间的交叉特征如下:{(A1,B1),(A1,B2),(A2,B1),(A2,B2)},并且你可以给这些组合特征取任何名字。但是需要明白每个组合特征其实代表着A和B各自信息协同作用。
一个更好地诠释好的交叉特征的实例是类似于(经度,纬度)。一个相同的经度对应了地图上很多的地方,纬度也是一样。但是一旦你将经度和纬度组合到一起,它们就代表了地理上特定的一块区域,区域中每一部分是拥有着类似的特性。
5 方法五:特征选择
为了得到更好的模型,使用某些算法自动的选出原始特征的子集。这个过程,你不会构建或修改你拥有的特征,但是会通过修剪特征来达到减少噪声和冗余。
那些和我们解决的问题无关需要被移除的属性,在我们的数据特征中存在了一些特征对于提高模型的准确率比其他更重要的特征,也还有一些特征与其他特征放在一起出现了冗余,特征选择是通过自动选出对于解决问题最有用的特征子集来解决上述问题的。
特征选择算法可能会用到评分方法来排名和选择特征,比如相关性或其他确定特征重要性的方法,更进一步的方法可能需要通过试错,来搜索出特征子集。
还有通过构建辅助模型的方法,逐步回归就是模型构造过程中自动执行特征选择算法的一个实例,还有像Lasso回归和岭回归等正则化方法也被归入到特征选择,通过加入额外的约束或者惩罚项加到已有模型(损失函数)上,以防止过拟合并提高泛化能力。
6 方法六:特征缩放
有时候,你可能会注意到某些特征比其他特征拥有高得多的跨度值。举个例子,将一个人的收入和他的年龄进行比较,更具体的例子,如某些模型(像岭回归)要求你必须将特征值缩放到相同的范围值内。通过缩放可以避免某些特征比其他特征获得大小非常悬殊的权重值。
7 方法七:特征提取
特征提取涉及到从原始属性中自动生成一些新的特征集的一系列算法,降维算法就属于这一类。特征提取是一个自动将观测值降维到一个足够建模的小数据集的过程。对于列表数据,可使用的方法包括一些投影方法,像主成分分析和无监督聚类算法。对于图形数据,可能包括一些直线检测和边缘检测,对于不同领域有各自的方法。
特征提取的关键点在于这些方法是自动的(虽然可能需要从简单方法中设计和构建得到),还能够解决不受控制的高维数据的问题。大部分的情况下,是将这些不同类型数据(如图,语言,视频等)存成数字格式来进行模拟观察。
步骤
1、导入数据根据特点进行缺失值填充,重复值删除
woe编码 最好用
1、混淆矩阵(Confuse Matrix)
(1)若一个实例是正类,并且被预测为正类,即为真正类TP(True Positive )
(2)若一个实例是正类,但是被预测为负类,即为假负类FN(False Negative )
(3)若一个实例是负类,但是被预测为正类,即为假正类FP(False Positive )
(4)若一个实例是负类,并且被预测为负类,即为真负类TN(True Negative )
2、准确率(Accuracy) 准确率是常用的一个评价指标,但是不适合样本不均衡的情况。
Accuracy=TP+TN / TP+TN+FP+FN
3、精确率(Precision) 又称查准率,正确预测为正样本(TP)占预测为正样本(TP+FP)的百分比。
Precision=TP / TP+FP
4、召回率(Recall) 又称为查全率,正确预测为正样本(TP)占正样本(TP+FN)的百分比。
Recall=TP / TP+FN
5、F1 Score 精确率和召回率是相互影响的,精确率升高则召回率下降,召回率升高则精确率下降,如果需要兼顾二者,就需要精确率、召回率的结合F1 Score。
F1−Score=2 / (1/Precision) + (1/ RecallF)
6、P-R曲线(Precision-Recall Curve) P-R曲线是描述精确率和召回率变化的曲线
p-r
7、ROC(Receiver Operating Characteristic)
ROC空间将假正例率(FPR)定义为 X 轴,真正例率(TPR)定义为 Y 轴。
TPR:在所有实际为正例的样本中,被正确地判断为正例之比率。TPR=TP / TP+FN
FPR:在所有实际为负例的样本中,被错误地判断为正例之比率。FPR=FP / FP+TN
roc.png
8、AUC(Area Under Curve) 被定义为 ROC曲线 下与坐标轴围成的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。AUC越接近1.0,检测方法真实性越高;等于0.5时,则真实性最低,无应用价值。
对于金融风控预测类常见的评估指标如下:
1、KS(Kolmogorov-Smirnov) KS统计量由两位苏联数学家A.N. Kolmogorov和N.V. Smirnov提出。在风控中,KS常用于评估模型区分度。区分度越大,说明模型的风险排序能力(ranking ability)越强。 K-S曲线与ROC曲线类似,不同在于
ROC曲线将真正例率和假正例率作为横纵轴
K-S曲线将真正例率和假正例率都作为纵轴,横轴则由选定的阈值来充当。公式:KS=max(TPR−FPR)
KS不同代表着不同情况,一般情况KS值越大,模型的区分能力越强,但是也不是越大模型效果就越好,如果KS过大,模型可能存在异常,所以当KS值过高可能需要检查模型是否过拟合。
以下为KS值对应的模型情况,但此对应不是唯一的,只代表大致趋势。
KS(%) 好坏区分能力
20以下 不建议采用
20-40 较好
41-50 良好
51-60 很强
61-75 非常强
75以上 过于高,疑似存在问题
2、ROC
3、AUC
特征选择标准,
criterion【entropy, gini】。
默认gini,即CART算法。
splitter
特征划分标准,【best, random】。
best在特征的所有划分点中找出最优的划分点,random随机的在部分划分点中找局部最优的划分点。
默认的‘best’适合样本量不大的时候,而如果样本数据量非常大,此时决策树构建推荐‘random’。
max_depth
决策树最大深度。默认值是‘None’。(int, None)
一般数据比较少或者特征少的时候可以不用管这个值,如果模型样本数量多,特征也多时,推荐限制这个最大深度,具体取值取决于数据的分布。常用的可以取值10-100之间,常用来解决过拟合。
min_samples_split
内部节点再划分所需最小样本数。默认值为2。(int, float)
如果是int,则取传入值本身作为最小样本数;如果是float,则取ceil(min_samples_split*样本数量)作为最小样本数。(向上取整)
min_samples_leaf
叶子节点最少样本数。
如果是int,则取传入值本身作为最小样本数;如果是float,则取ceil(min_samples_leaf*样本数量)的值作为最小样本数。这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。
min_weight_fraction_leaf
叶子节点最小的样本权重和。默认为0。(float)
这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。
默认是0,就是不考虑权重问题,所有样本的权重相同。一般来说如果我们有较多样本有缺失值或者分类树样本的分布类别偏差很大,就会引入样本权重,这时就要注意此值
max_features
在划分数据集时考虑的最多的特征值数量。
int值,在每次split时最大特征数;float值表示百分数,即(max_features*n_features);|random_state |特征选择标准,【entropy, gini】。默认gini,即CART算法。
max_leaf_nodes
最大叶子节点数。默认为None。(int, None)
通过设置最大叶子节点数,可以防止过拟合,默认情况下是不设置最大叶子节点数。
如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征多,可以加限制,具体的值可以通过交叉验证得到
min_impurity_decrease
节点划分最小不纯度。默认值为‘0’。(float,)
限制决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小与这个阈值,则该节点不再生成子节点。
min_impurity_split
信息增益的阀值。决策树在创建分支时,信息增益必须大于这个阀值,否则不分裂。
class_weight
类别权重。默认为None,(dict, list of dicts, balanced)
指定样本各类别的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。balanced,算法自己计算权重,样本量少的类别所对应的样本权重会更高。如果样本类别分布没有明显的偏倚,则可以不管这个参数。不适用于回归树,sklearn.tree.DecisionTreeRegressor.
模型调参注意事项:
1、当样本少数量但是样本特征非常多的时候,决策树很容易过拟合,一般来说,样本数比特征数多一些会比较容易建立健壮的模型
2、如果样本数量少但是样本特征非常多,在拟合决策树模型前,推荐先做维度规约,比如主成分分析(PCA),特征选择(Losso)或者独立成分分析(ICA)。这样特征的维度会大大减小。再来拟合决策树模型效果会好。
3、推荐多用决策树的可视化,同时先限制决策树的深度(比如最多3层),这样可以先观察下生成的决策树里数据的初步拟合情况,然后再决定是否要增加深度。
4、在训练模型先,注意观察样本的类别情况(主要指分类树),如果类别分布非常不均匀,就要考虑用class_weight来限制模型过于偏向样本多的类别。
5、决策树的数组使用的是numpy的float32类型,如果训练数据不是这样的格式,算法会先做copy再运行。
6、如果输入的样本矩阵是稀疏的,推荐在拟合前调用csc_matrix稀疏化,在预测前调用csr_matrix稀疏化。
最后通过总结的方式对比下 ID3、C4.5 和 CART 三者之间的差异。
除了之前列出来的划分标准、剪枝策略、连续值确实值处理方式等之外,我再介绍一些其他差异:
划分标准的差异:ID3 使用信息增益偏向特征值多的特征,C4.5 使用信息增益率克服信息增益的缺点,偏向于特征值小的特征,CART 使用基尼指数克服 C4.5 需要求 log 的巨大计算量,偏向于特征值较多的特征。
使用场景的差异:ID3 和 C4.5 都只能用于分类问题,CART 可以用于分类和回归问题;ID3 和 C4.5 是多叉树,速度较慢,CART 是二叉树,计算速度很快;
样本数据的差异:ID3 只能处理离散数据且缺失值敏感,C4.5 和 CART 可以处理连续性数据且有多种方式处理缺失值;从样本量考虑的话,小样本建议 C4.5、大样本建议 CART。C4.5 处理过程中需对数据集进行多次扫描排序,处理成本耗时较高,而 CART 本身是一种大样本的统计方法,小样本处理下泛化误差较大 ;
样本特征的差异:ID3 和 C4.5 层级之间只使用一次特征,CART 可多次重复使用特征;
剪枝策略的差异:ID3 没有剪枝策略,C4.5 是通过悲观剪枝策略来修正树的准确性,而 CART 是通过代价复杂度剪枝。
集成学习
那么,为什么集成学习会好于单个学习器呢?原因可能有三:
训练样本可能无法选择出最好的单个学习器,由于没法选择出最好的学习器,所以干脆结合起来一起用;
假设能找到最好的学习器,但由于算法运算的限制无法找到最优解,只能找到次优解,采用集成学习可以弥补算法的不足;
可能算法无法得到最优解,而集成学习能够得到近似解。比如说最优解是一条对角线,而单个决策树得到的结果只能是平行于坐标轴的,但是集成学习可以去拟合这条对角线。
随机森林:
Random Forest(随机森林),用随机的方式建立一个森林。RF 算法由很多决策树组成,每一棵决策树之间没有关联。建立完森林后,当有新样本进入时,每棵决策树都会分别进行判断,然后基于投票法给出分类结果。
优点:
在数据集上表现良好,相对于其他算法有较大的优势
易于并行化,在大数据集上有很大的优势;
能够处理高维度数据,不用做特征选择
AdaBoost(Adaptive Boosting,自适应增强),其自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。
同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。
为了防止 Adaboost 过拟合,我们通常也会加入正则化项,这个正则化项我们通常称为步长(learning rate)。
u的取值范围为 (0,1]。对于同样的训练集学习效果,较小的 u意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。
4.3.1 优点
分类精度高;
可以用各种回归分类模型来构建弱学习器,非常灵活;
不容易发生过拟合。
4.3.2 缺点
对异常点敏感,异常点会获得较高权重。
GBDT
GBDT(Gradient Boosting Decision Tree)是一种迭代的决策树算法,该算法由多棵决策树组成,从名字中我们可以看出来它是属于 Boosting 策略。GBDT 是被公认的泛化能力较强的算法。
GBDT 由三个概念组成:Regression Decision Tree(即 DT)、Gradient Boosting(即 GB),和 Shrinkage(一个重要演变)
1)criterion(划分标准):有两个参数 ‘entropy’(熵) 和 ‘gini’(基尼系数)可选,默认为gini。
2)max_depth(树的最大深度):默认为None,此时决策树在建立子树的时候不会限制子树的深度。也可以设置具体的整数,一般来说,数据少或者特征少的时候可以不管这个值。
如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。
3)min_samples_split(分割内部节点所需的最小样本数):意思就是只要在某个结点里有k个以上的样本,这个节点才需要继续划分,这个参数的默认值为2,
也就是说只要有2个以上的样本被划分在一个节点,如果这两个样本还可以细分,这个节点就会继续细分
4)min_samples_leaf(叶子节点上的最小样本数):当你划分给某个叶子节点的样本少于设定的个数时,这个叶子节点会被剪枝,这样可以去除一些明显异常的噪声数据。
默认为1,也就是说只有有两个样本类别不一样,就会继续划分。如果是int,那么将min_samples_leaf视为最小数量。如果为float,则min_samples_leaf为分数,ceil(min _ samples _ leaf * n _ samples)为每个节点的最小样本数。
通过上边的介绍,可以看到在模型调参的过程中只需要重点调整决策树的4个参数即可。这四个参数中,criterion只有两个值可选,是最好调的,剩下三个参数在调参过程中会互相影响,需要我们确定一个顺序。
1)确定criterion参数(决策树划分标准):这里可以简单比较一下,不过一般情况选用gini系数模型效果更好。
2)通过绘制得分曲线缩小max_depth(树的最大深度)的搜索范围,得到一个暂定的max_depth。
之所以第一个参数调max_depth,是因为模型得分一般随着max_depth单调递增,之后会区域稳定。
3)利用暂定的max_depth参数,绘制曲线,观察得分随着min_samples_split(分割内部节点所需的最小样本数)的变化规律,从而确定min_samples_split参数的大概范围。
因为随着min_samples_split的增大,模型会倾向于向着简单的方向发展。所以如果模型过拟合,那么随着min_samples_split的增大,模型得分会先升高后下降,我们选取得分最高点附近的min_samples_split参数;如果模型欠拟合,那么随着min_samples_split的增大,模型得分会一直下降,接下来调参时只需要从默认值2开始取就好。
4)利用暂定的max_depth和min_samples_split参数,绘制曲线,观察得分随着min_samples_leaf(叶子节点上应有的最少样例数)的变化规律,从而确定min_samples_leaf参数的大概范围。该参数的范围确定方法同上。
5)利用网格搜索,在一个小范围内联合调max_depth、min_samples_split和min_samples_leaf三个参数,确定最终的参数。
K-近邻
KNeighborsClassifier函数一共有8个参数:
1、n_neighbors: int, default=5,就是k-NN的k的值,选取最近的k个点,默认为5。
2、weights: 默认是uniform,参数可以是uniform、distance,也可以是用户自己定义的函数(直接weights=函数名就行)。uniform是均等的权重,就说所有的邻近点的权重都是相等的。
distance是不均等的权重,距离近的点比距离远的点的影响大。用户自定义的函数,接收距离的数组,返回一组维数相同的权重。
3、algorithm: {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, default=’auto’。快速k近邻搜索算法,默认参数为auto,可以理解为算法自己决定合适的搜索算法。除此之外,
用户也可以自己指定搜索算法ball_tree、kd_tree、brute方法进行搜索,brute是蛮力搜索,也就是线性扫描,当训练集很大时,计算非常耗时。kd_tree,
构造kd树存储数据以便对其进行快速检索的树形数据结构,kd树也就是数据结构中的二叉树。以中值切分构造的树,每个结点是一个超矩形,在维数小于20时效率高。
ball tree是为了克服kd树高纬失效而发明的,其构造过程是以质心C和半径r分割样本空间,每个节点是一个超球体。
4、leaf_size: int ,default=30。leaf_size:默认是30,这个是构造的kd树和ball树的大小。这个值的设置会影响树构建的速度和搜索速度,同样也影响着存储树所需的内存大小。
需要根据问题的性质选择最优的大小。
5、metric: str or callable, default=’minkowski’。用于距离度量,当p=2时为欧氏距离(欧几里德度量)。
6、p: 距离度量公式。即设置metric里闵氏距离的参数p,这个参数默认为2,也就是默认使用欧式距离公式进行距离度量。也可以设置为1,使用曼哈顿距离公式进行距离度量。
7、metric_params: 距离公式的其他关键参数,这个基本不用,使用默认的None即可。
8、n_jobs: 并行处理设置。默认为1,临近点搜索并行的工作数。如果为-1,那么CPU的所有cores都用于并行工作。
k一般低于训练样本数的平方根
支持向量机
和神经网络都起源于感知机:
支持向量机(Support Vector Machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,
间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,
也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。
线性可分(对偶问题求间隔最大)和线性不可分(通过核函数映射到高维空间),软间隔和硬间隔(允许误差松弛变量)。
线性核、多项式核、高斯核。
rbf高斯径向基核函数基本在任何数据集上都表现不错,属于比较万能的核函数
线性核函数和多项式核函数在非线性数据上表现会浮动,如果数据相对线性可分,则表现不错,如果
是像环形数据那样彻底不可分的,则表现糟糕。在线性数据集上,线性核函数和多项式核函数即便有扰动项也可以表现不错,可见多项式核函数是虽然也可以处理非线性情况,
但更偏向于线性的功能。
Sigmoid核函数就比较尴尬了,它在非线性数据上强于两个线性核函数,但效果明显不如rbf,它在线性数据上完全比不上线性的核函数们,对扰动项的抵抗也比较弱,
所以它功能比较弱小,很少被用到。
C: 惩罚系数,kernel='rbf':高斯核函数,gamma: 高斯核的系数,
kernel='linear' 线性核函数;C:正则化系数,float类型,默认值为1.0,用来防止模型过拟合。C越小,泛化能力越强
随机森林大致过程如下:
1)从样本集中有放回随机采样选出 n 个样本;
2)从所有特征中随机选择 k 个特征,对选出的样本利用这些特征建立决策树(一般是CART,也可是别的或混合使用);
3)重复以上两步 m 次,即生成 m 棵决策树,形成随机森林;
4)对于新数据,经过每棵树决策,最后投票确认分到哪一类。
n_estimators=100, 树的棵树,默认是100
max_features=寻找最佳分割时要考虑的特征数量。
min_samples_leaf
min_samples_split
max_depth
criterion='gini' entropy
xgbboost:
一般使用数模型,而不是线性模型。
性质:GBDT是机器学习算法,XGBoost除了算法内容还包括一些工程实现方面的优化。
基于二阶导:GBDT使用的是损失函数一阶导数,相当于函数空间中的梯度下降;而XGBoost还使用了损失函数二阶导数,相当于函数空间中的牛顿法。[2]
正则化:XGBoost显式地加入了正则项来控制模型的复杂度,能有效防止过拟合。
列采样:XGBoost采用了随机森林中的做法,每次节点分裂前进行列随机采样。
对特征值的分裂采取贪心算法,计算最高收益。
缺失值处理:XGBoost运用稀疏感知策略处理缺失值,而GBDT没有设计缺失策略。
并行高效:XGBoost的列块设计能有效支持并行运算,提高效率。
from xgboost.sklearn import XGBClassifier
from lightgbm import LGBMRegressor
lightgbm
特点:可以处理分类数据。将特征值变成k个直方图,使得数据运行速度加快。
遍历特征值时,不需要像XGBoost一样需要计算每次分裂的增益,
而是对每个特征只需要计算建立直方图的个数,即k次,
(由于决策树本身是弱分类器,分割点是否精确并不是太重要,
因此直方图算法离散化的分割点对最终的精度影响并不大。
另外直方图由于取的是较粗略的分割点,因此不至于过度拟合,起到了正则化的效果)。
lightgbm调整参数
1、设置较高的学习率learning_rate=0.1
2、n_estimators:通常来说迭代次数越多模型表现越好,但是过大的迭代次往往会导致模型的过拟合以及影响模型训练的时间。
一般我们选择的值在100~1000之间
3、max_depth: 一般在3,4,5这三个数里挑一个就好了,设置过大的数值过拟合会比较严重。
4、num_leaves: 在LightGBM里,叶子节点数设置要和max_depth来配合,要小于2^max_depth-1。
一般max_depth取3时,叶子数要<=2^3-1=7。如果比这个数值大的话,LightGBM可能会有奇怪的结果。
在参数搜索时,需要用max_depth去限制num_leaves的取值范围。
5、subsample: 不建议过度的精细的调节,比如用搜索算法搜一个0.814325这样一个数值就不是很好。
一般给出大致的搜索范围如[0.8, 0.9, 1.0]这样几个比较整的数值就足够了。
6、colsample_bytree: 和subsample同理,在[0.8, 0.9, 1.0]这样几个比较整的数值搜索就足够了。
不建议过度调节。
7、reg_alpha:此参数服务于L1正则化,
8、reg_lambda: 此参数服务于L2正则化,
切比雪夫大数定理
所有数据中,至少有3/4(或75%)的数据位于平均数2个标准差范围内。
所有数据中,至少有8/9(或88.9%)的数据位于平均数3个标准差范围内。
所有数据中,至少有24/25(或96%)的数据位于平均数5个标准差范围内
*****IV值会受分箱数量影响,因此即使是同样的样本,随着分箱数量改变,IV值也会发生改变,而AUC和KS是不变的。
从上面的结果可以看出,当分箱比较细的时候,对KS结果影响不大,但是如果分箱比较粗的话对KS会有一定的影响。
从IV值的公式中,易得变量的分组越多,IV值越大。但是分组分的太多,就会使得每个分组的数据量变少,导致细项分组的分布不稳定。
所以,我们在使用IV值筛选变量的时候,不能为了提高IV值一味地将分箱的数目提高,也要兼顾变量的业务含义和分布的稳定性。
风控指标
M0:正常资产,无逾期,有时也用C表示
M1:逾期一期,或逾期1-30天
M2:逾期两期,或逾期31-60天
M3:逾期三期,或逾期61-90天
M4:逾期四期,或逾期91-120天
M5:逾期五期,或逾期121-150天
M6:逾期六期,或逾期151-180天
M6+:逾期大于六期,或逾期大于180天。一般逾期大于180天,会进行坏账核销。
MOB的最大值指的是信贷产品期限
Eg:MOB0指的是资产放款至月底;MOB1指的是资产放款后第二个完整的月份;MOB2指的是资产放款后第三个完整的月份----如2019.11.13放款,
那么MOB0就为2019.11,MOB1为2019.12。
协方差和相关系数的关系与区别
协方差:
协方差表示的是两个变量的总体的误差,这与只表示一个变量误差的方差不同。 如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。 如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。
注:协方差大小,会受X,Y数据大小的影响,所以只能通过协方差的正负,来判断是正相关还是负相关,不能反映相关性的程度,所以相关系数就此诞生
相关系数:
公式翻译一下,就是XY的协方差除X的标准差和Y的标准差
所以,相关系数也可以看成协方差:一种剔除了两个变量量纲影响、标准化后的特殊协方差。是用来研究变量之间线性相关程度的量,取值范围是[-1,1]。
f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程式。
psi 指标模型稳定性
0~0.1 好 没有变化或者很少变化
0.1~0.25 略不稳定 有变化建议监控后续变化
大于0.25 不稳定 发生大变化,进行特征项分析