怎么样做有效的特征选择

  • 什么是特征工程当中的无量纲化? 为什么要做无量纲化?

从原始数据中提取特征以供算法和模型使用。通过总结和归纳,人们认为特征工程包括以下几个方面:

无量纲化使不同规格的数据转化到同一规格, 常用方法:

  • 标准化和区间缩放法
  • 标准化的前提是特征服从正态分布。

为什么标准化要求区间符合符合正态分布?

[1]机器学习中,有哪些特征选择的工程方法?

常用评估指标的原理和计算方式

记录一次数据下跌的排查

ROC曲线

ROC曲线的全称是(receiver operating characteristic curve), 反应敏感性和特异性连续变量的的综合指标。

那么什么是敏感度(sensitivity)? 什么是特异度(specificity)? 对负样本的分类准确率, 对正样本的分类准确率。

特异度(specificity)与灵敏度(sensitivity 糖尿病人的例子

specificity: 是指对负样本识别的特异度, 负样本识别的比率高, 特异度越高。 TN / (TN + FP) sensitivity: 表示对正样本识别的敏感度, 正样本识别的比率高, 敏感度越高。

ROC曲线的横轴是: 1 - specificity ROC曲线的纵轴是: sensitivity

TP / (TP + FN)

ROC曲线是怎么绘制的

选择不同的分类阈值, 然后根据这些阈值分别计算sensitivity和 specificity

我们假设两种极端情况:

  1. 一个特别糟糕的模型, sensitivity的升高伴随着specificity的下跌幅度是1:1 这个时候, 模型完全随机。
  2. 一个特别好的模型, sensitivity的升高于specificity无关。
  3. 一个真实的优秀模型, sensitivity的升高, specificty降低,但是斜率逐渐减少。

那么, 我们可以得到ROC曲线下的面积其实可以表示模型分类的效果。

AUC的原理

AUC的全称(Area under curve)

AUC的计算方式

  1. 统计ROC曲线下的面积
  2. 在所有的正负样本对中, 正样本的概率大于负样本对的概率。
  3. 根据排序计算
\[AUC=\frac{\sum_{ins_{i}\in pos} rank_{ins_i} - \frac{M \times (M+1)}{2}}{M \times N}\]

其中$rank_{ins_i}$表示正样本在所有样本中的排序值, $M$ 表示正样本个数, $N$ 表示负样本个数。

struct RECORD {
    float label;
    float predict;
    float weight;

    RECORD(float label_y, float predict_y, float sample_weight = 1.0):
        label(label_y), predict(predict_y), weight(sample_weight) {}

    bool operator<(RECORD &i) { return predict < i.predict; }
  };

首先定义了一个RECORD的结构体, 这个结构体包含三个部分:

  • label: 表示positive和negative样本
  • predict: 表示预测的得分
  • weight: 表示每个样本的权重, weight的默认值是1.0
for (size_t i = 0; i < predicts.size(); ++i) {
    if (weights.empty()) {
      id_list_result[group_ids[i]].push_back(
          AucCalc::RECORD(labels[i], predicts[i]));
    } else {
      id_list_result[group_ids[i]].push_back(
          AucCalc::RECORD(labels[i], predicts[i], weights[i]));
    }
  }

struct RetAucInfo {
  RetAucInfo() : area(0.0), auc(0.0), weighted_postive_num(0.0),
      weighted_negative_num(0.0) {}
  // area is the intermediate value for distributed auc
  double area;
  double auc;
  double weighted_postive_num;
  double weighted_negative_num;
  SampleStatisticInfo sample_info;
};

struct SampleStatisticInfo {
    SampleStatisticInfo() : predict_sum(0.0), postive_num(0), negative_num(0) {}
    void Reset() {
      predict_sum = 0.0;
      postive_num = 0;
      negative_num = 0;
    }
    double predict_sum;
    uint64_t postive_num;
    uint64_t negative_num;
  };

RetAucInfo这个结构体里面有三个字段, 在不考虑权重的情况下:

  • area: 表示负样本的索引之和。
  • auc:
  • weighted_postive_num: 表示正样本的个数
  • weighted_negative_num: 表示负样本的个数
  • sample_info.postive_num: 表示正样本个数
  • sample_info.negative_num: 表示负样本个数
  • sample_info.predict_sum: 表示整体预测的数目

整体AUC的计算在以下代码中完成。

bool AucCalc::CalcLocalAuc(
    const std::list<RECORD> &list_result, RetAucInfo& out) {
  double weighted_postive_num = 0;
  double weighted_negative_num = 0;
  double predict_sum = 0.0;
  uint64_t postive_num = 0;
  uint64_t negative_num = 0;

  for (auto next = list_result.begin(); next != list_result.end(); next++) {
    if (next->label == 1) {
      weighted_postive_num += next->weight;
      postive_num++;
    } else {
      weighted_negative_num += next->weight;
      negative_num++;
    }
    predict_sum += next->predict;
  }  // for next

  double total_area = weighted_postive_num * weighted_negative_num;
  out.weighted_postive_num = weighted_postive_num;
  out.sample_info.predict_sum = predict_sum;
  out.sample_info.postive_num = postive_num;
  out.sample_info.negative_num = negative_num;
  if (total_area == 0) {
    NUMEROUS_ERROR << "fail to calculate auc, weighted_postive_num: "
                   << weighted_postive_num << ", weighted_negative_num: "
                   << weighted_negative_num;
    return false;
  }

  double h = 0;
  double area = 0;
  std::string label_before = "";
  std::string next_weight = "";
  for (auto next = list_result.rbegin(); next != list_result.rend(); next++) {
    label_before += std::to_string(next->label) + " ";
    next_weight += std::to_string(next->weight) + " ";
    if (next->label == 1) {
      h += next->weight;
    } else {
      area += (h * next->weight);
    }
  }

AUC为什么可以这么计算

AUC的计算方法

COPC的计算方式

AUC和COPC

什么是ECPM

ctr预估中的评估指标及校准

关注入口数据下跌排查

记录一次数据下跌的排查

现有的数据表现是什么?

To Do List

Doing

  • 整理ML Section排序其他任务
  • 关注入口数据统计分析
  • 写文章《说话的立场》

Things Basket

  • NCE LOSS原理文章整理
  • Focal LOSS原理文章整理

To Do Things

Overtime Things

问题1: 讨论的目的? 问题2: 表达的形式? 线上还是线下? 问题3: 讨论的内容? 是不是要有门槛,


能够Cover到的部分:

  1. 离线召回的生成
  2. 数据表的生成
  3. 离线的模型训练和预测

不能Cover到的部分:

  1. 服务方数据的漏出,以及漏出逻辑。
  2. 曲库的数据依赖,作品入库的流程。
  3. 搜索的数据入库,怎么样进入到ES当中。
  4. 数据埋点的上报流程。
  5. 公共包的发布。
  6. 模型ID与生成任务的绑定。
  7. Buzz和聊天房的交接
EmbedX 上Graph Sage的迭代

需要准备的数据文件

  1. 节点关系数据
  2. 节点特征数据
  3. 邻居节点特征数据
  4. 随机游走之边数据

这4份数据里面, 数据1和数据2是原始数据, 数据3和数据4是派生数据。

1. 节点关系数据的生成

主要在于节点编码: [ns_config] node_name=[””, “”, “”, “”] ugc_node=[””, “”, “”, “”]

[ns_code]

【使用指南】Venus 平台 EmbedX 模型训练