机器学习中, 特征值通常相差比较巨大,  不同维度的特征值相差巨大,导致部分特征影响微乎其微,   用来做训练效果不好。

       举个例子, 工作年数和 工资收入作为特征值,来构建预测模型。

       工作年数 一般比较小 1-10 ,  工资收入 都是3000-100 0000 不等。  从数值来看, 年份和工资相比数值太小, 对整个模型的影响基本上可以忽略。 

      因此,我们需要对特征值进行缩放, 已规避数值差异带来的影响。

1 特征缩放:线性归一化 (min-max normalization)

     Xnew = x - min(x)/ max(x)-min(x)

    也称最大最小值归一化   。  计算公式如下。

      

  2  标准差归一化  ( Z-score normalization)

     Xnew =  x - mean(x)  / std(x)            [均值   标准差】

标准差std(x) =  方差的算术平方根 。(方差计算的是数据平方, 个体数据相差值会放大,所以开方求平方根可以缩小换算回来。 即标准差)

3  特征标准化方法选择。

    具体哪一种 标准化方法比较好,依据实际效果来。   

5 特征值离散化

     一般在搭建机器学习分类模型时,需要对连续型的特征进行离散化,也就是分箱。

    5.1 无监督分箱

         1)  等距分箱

           特征的取值范围等间隔分割,从最小值到最大值之间,均分N等份,如果最小值和最大值分             别为A、B,则每个区间的长度为W=(B-A)/N,则区间的边界为A+W,A+2W,A+3W,...,              A+(N-1)W

           该方法对异常值比较敏感,比如远大于正常范围的数值会影响区间的划分。

        2)等频分箱

           每个区间包含大致相等的实例数量。比如说 N=10 ,每个区间应该包含大约10%的实例。

     5.2 有监督分箱

           卡方分箱 、最优分箱等。  

             TODO  

    举例:  年龄特征 (21 22  23 21 24 25  22 23  25 24  21  26  28  30)

              X<=22      ==>  X = 1

              22 < X <=24  ==>  X =2

              X > 24      ==>  X =3

6  类别特征分类编码 one-hot编码

     在机器学习中,我们常用到分类。比如 经典的 手写 1-9 数值分类识别。  如果分类特征 按, 1 ,2, 3 ...9来分类的话,   会把这些数值明显差异大小有别带入到模型中。 实际上 只是一个分类,没有大小。

    针对类别特征的编码,常用的是 one-hot编码。

7 交叉验证与参数调优

     一份数据集,我们一般取 80%作为训练集, 20%作为测试集。

    但是,仅一次选择,        可能效果泛化不好,特别是20%跟训练集比较接近的时候。

    因此, 为达到更好效果,我们经常使用交叉验证。

  1)S-fold交叉验证。 即S折交叉验证

        将数据集分成S份 (常用的是10折)。 以10折为例

          取1份作为验证数据。 另外9份作为训练集。

          取第2份作为验证数据。另外9份作为训练集。

          ......

          取第10份作为验证数据。另外9份作为训练集。

      将上述验证效果最好的参数模型,作为开发侧的输出,提交給测试团队进行下一步操作。

   

8 模型度量、评价

   0) 混淆矩阵

        TP:    预测为 Positive,  实际为Positive

        FP:     预测为 Positive,  实际为Negative

        TN:   预测为 Negative, 实际为Negative

        FN:    预测为 Negive,    实际为Positive

准确率

ACC

Accuray = TN + TF /  TP+TN+ FP+ FN 分类模型所有判断正确的样本,占所有观测值的比重

精确率

PPV

Precision = TP /  TP + FP 模型预测的所有positive样本中,模型预测对的比例

灵敏度

TPR(召回率)

Sensitive = Recall = TP/  TP + FN 真实是positive的样本中,模型预测对的比例

          F1 = 2 *  (Precision * Recall ) / (Precision+ Recall)

     

   如之前的场景。 我们要识别出所有的 次品 (提高recall)

   但是呢同时要兼顾 准确率,不要本来1个次品,结果识别出了20个次品,虽然提高了recall。打但是准确率太低。

     F1就是为兼顾两者,而设计的一个计算公式。

   1) 准确率:   就是所有预测正确的(包括正类和负类)占总的的比例。      

        

        准确率,不能作为一个模型好坏的唯一评价标准。

        eg:  某工厂产品加工。合格率本身就已经达到了99%

        如果我写个模型,直接全部输出全部是正品(实际99个正品,1个次品)。 那么准确率已经达到了99%。  达到客户要求(98%以上准确率)了。         

         但是呢, 客户实际上要求1个次品都不能流入市场。所以光靠准确率无法达到客户目标。

实际生产中,我们主要关注正向样本。因此一般以下2个指标构成F1来度量模型。

  2) 精确率(即positive准确率)

         positive样本中,模型预测对的比例

  3) 召回率(灵敏度)

        接问题1,   如果客户关注的是次品,  那么次品就是我们的positive正向指标。

        次品流向市场对客户严重影响,因此必须严控。提高召回率。

         召回率(也叫灵敏度) =  TP/ (TP +FN)

          假如为了满足我的 召回率, 我们的模型  增强了校验标准,把8分合格的产品也检测为 次品。  如 :100个样品,  5个识别为正向数据(次品, 实际只有一个次品,4个识别错误) 95个识别为负向数据(正品)

         recall= 1 /1 + 0 =100%  

可见,召回率 虽然 100%, 但是呢, 导致客户的成本加大,合格品也被当作次品处理了。因此准确率也是很重要,需要兼顾。

2) 多分类计算准确率和召回率:

    上述的度量用于2分类计算。如果需要计算多分类的度量,一般以观测分类作为正向值,分别计算,最后求所有分类的平均值。

可以参看:机器学习笔记-多分类下的召回率和F值_多分类召回率_柒夏码农之路的博客-CSDN博客

3)SKlearn 计算方法:

i) classification_report 对象可以直接计算 标签值和预测值的算术平均值

 和 加权平均值结果(样本数量占比)。

from sklearn.metrics import classification_report
y_train= [1, 1, 1, 0, 0, 0, 2, 2, 2, 2]   // 样本标签值
y_pred = [1, 0, 0, 0, 2, 1, 0, 0, 2, 2]  // 预测值
print(classification_report(y_true, y_pred))

ii) cross_val_score 、cross_val_predict

cross_val_score:得到K折验证中每一折的得分,K个得分取平均值就是模型的平均性能

cross_val_predict:得到经过K折交叉验证计算得到的每个训练验证的输出预测

示例代码(cross_val_score):

from sklearn.linear_model import SGDClassifier
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import cross_val_predict

clf = SGDClassifier()
scores = cross_val_score(clf, X_tfidf, target, cv=10)

//classification_instance 任意分类器

// cv: 训练数据打10折, 其中一折用于预测,下述返回结果即为预测打分。 其它9折用于训练模

// 型。 交叉10次
y_scores = cross_val_predict(classification_instance, X_train, y_train, cv=10)

有了这个得分,我们可以画出 阈值和召回率的曲线,(阈值越高,召回率月底,精度越高)

from sklearn.metrics import precision_recall_curve

precesion,recall, threshhod = precision_recall_curve(y_train,y_scores)

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐