2.2 逻辑回归-part2

0x04 评估指标

以一个例子开始。假设我们有一个汉堡分类器,可以针对图片分类,分为是汉堡,或者不是汉堡。如果我们想知道,这个分类器的效果到底如何?该如何评价呢?

我们将手机里的照片输入分类器,得到分类结果:

可如果样本(照片)很多的时候,这将会是一个非常大的表格。如何更加简洁的表示呢?=> ==混淆矩阵 Confusion Matrix==

1. 混淆矩阵 Confusion Matrix

如图,仅用一个 2x2 的混淆矩阵就可以解决这个问题。左上角是真实类别为 Positive 样本,同时分类器预测结果也为 Positive 的样本数量统计,因此叫 True Positive,即真正样本。而右上角是真实类别为 Negative 样本,而分类器预测为 Positive 样本(即预测错了,将不是 Positive 样本的,预测为了 Positive 样本),因此叫他 False Positive,即伪正样本。第二行矩阵同理。

这里是从预测的角度来命名的。 - 把正样本预测对了,就是 TP,真正样本;预测错了就是 FP,伪正样本。 - 把负样本预测对了,就是 TN,真负样本;预测错了就是 FN,伪负样本。

推广到多分类也是一样:

主对角线上是预测正确的样本数,我们会希望主对角线上的数值尽可能的大。

2. 准确率,精确率,召回率,F1 值

如果有两个或者多个汉堡分类器,如何评估他们的效果呢?

2.1. 二分类

  1. 如果我们关心这个分类器到底分对了多少

准确率 (Accuracy) = (1+5) / (1+2+1+5) = 0.67

预测正确的样本数(TP+TN),除以样本总数 分类正确的汉堡,除以样本总数

  1. 假设在图片搜索引擎中,我们搜索汉堡,我们关心搜索返回的汉堡图片中,有多少是 True 的汉堡图片?(返回的图片中正确的有多少?)

精确率 (Precision) = 1 / (1+2) = 0.33

预测正确的正样本数(TP),除以预测为正样本的总数(TP+FP) 搜索引擎返回的正确的汉堡图片数量,除以返回的所有图片数量(因为返回给你的图片,就是搜索引擎预测为汉堡的图片,虽然其中有预测错误的)

  1. 假设还是在图片搜索引擎中搜索汉堡,我们关心,有多少的汉堡图片是被找到的,有多少是没有被找到的?

召回率 (Recall) = 1 / (1+1) = 0.50

预测正确的正样本数(TP),除以正样本总数(TP+FN) 搜索引擎返回的正确的汉堡图片数量,除以数据库中的所有汉堡图片数量

可以发现精确率召回率之间,是一种此消彼长的关系。

  1. F1 值

假设一种极端情况:分类器将所有样本都预测为汉堡。

所以不能单一地追求精确率或者召回率的数值高,需要平衡这两个指标。因此有这样一个指标——F1 值,对 P 和 R 做调和平均。

F1 值是 的特殊情况(,认为 P 和 R 一样重要)。

值应该怎么取呢? - 比如在医疗领域,我们不希望遗漏任何一个患者,即认为 Recall 更重要 - 此时一般 取为 2 - 如果在其他领域,我们认为 Precession 更重要 - 此时一般 取在 (0, 1] 之间

小结

2.2. 多分类

  • 宏观
    • Accuracy 依然是绿色方格(主对角线)的预测正确样本 / 总样本数。
    • [Precision, Recall, F1] 是计算每一个类别自己的 [P, R, F1]。
      • 比如计算 C3 的 Precision = (C3, C3)绿色方格 / 预测类别 C3 一整行的样本总数
      • C3 的 Recall = (C3, C3)绿色方格 / 真实类别 C3 一整列 的样本总数
    • 随后整体的 [P, R, F1] 通过对每一类的 [P, R, F1] 加起来求平均,或者做一个加权平均得到。
  • 微观
    • Accuracy = micro precision = micro recall = micro F1-score
    • 把每个类别的 TP, FP, FN 先相加之后,再根据二分类的公式进行计算。
      • 比如还是对 C3 来说
        • (C3, C3)绿色方格 为 TP (预测正确的正样本)
        • 预测类别为 C3 的行上其他项,为 FP (伪正样本)
        • 真实类别为 C3 的列上其他项,为 FN (伪负样本)
      • 将所有类别的 TP, FP, FN 先相加,然后根据二分类公式计算
        • 比如

微观比较难理解,可以参考这里

3. ROC 曲线和 AUC 值

3.1. ROC 曲线

依然是汉堡问题。分类器做预测的时候,输出的是一个在 (0, 1) 的预测值,我们通过设定一个阈值,将这个连续值转为 0 或 1 的离散值。如图,如果我们设定阈值为 0.5,那么可以得到唯一一个与之对应的混淆矩阵

可以想像,如果我们将这个阈值,从左到右(从 0 到 1)都取一遍,就会得到很多个混淆矩阵

那么有没有办法可以==将这所有的混淆矩阵,表示在一个二维平面内呢==?

=> ROC 曲线

如图,每个混淆矩阵都有他的 TP,FP,FN,TN 值,那么可以计算得到真阳率(True Positive Rate, TPR)与假阳率(False Positive Rate, FPR)。如果将这两个值映射到二维平面,FPR 作为横坐标,TPR 作为纵坐标。此时一个混淆矩阵就被表示为了二维平面上的一个点。如果将所有的混淆矩阵的点都表示在这个二维坐标系中,就可以拟合一条曲线,即 ROC 曲线

  • ROC 曲线描述了 TPR 与 FPR 的关系
  • 真阳率 TPR: 正样本中猜对的比例

3.2. AUC 值

如果有 A,B 两个分类器,并且有他们的 ROC 曲线,应该如何判断哪个分类器的效果好呢?

可以从 TPR 与 FPR 分析入手。观察公式发现,TPR 与 FPR 的分母分别是数据集中正样本个数与负样本个数,也就是说这两个值是已经确定的。因为无论取什么阈值,得到哪个混淆矩阵,这两个值都不会变(因为数据集已经给定,不会变)。

所以 TPR 与 FPR 仅同他们的分子相关。 - TPR 的分子 TP = count(真正样本) - FPR 的分子 FP = count(伪正样本)。 自然是分类正确的正样本数 TP 越大越好,分类错误的正样本数 FP 越小越好。即TPR 尽可能的大,FPR 尽可能的小。反应到二维平面上就是,ROC 曲线越靠近左上角,说明分类器效果越好。

或者说,正样本中猜对的比例——真阳率 TPR 越高越好。

那么有没有数值可以量化这种曲线靠近左上角的程度呢?

那就是 => AUC 值(Area Under the roc Curve)

  • AUC 的定义:AUC 描述 ROC 曲线下包围的面积。AUC 值在 (0, 1) 的区间内。
  • AUC 的意义:
    • 随机取一对正负样本,AUC 是把正样本预测为 1 的概率,大于把负样本预测为 1 的概率。或者如前面所说,正确预测一个正样本的概率
    • 公式如下:
      • 其中 代表将该正样本预测为 1 的概率,代表将该负样本预测为 1 的概率。

AUC 值也可以理解为(按照预测值做从小到大的排序后)负样本排在正样本前面的概率。(或者反过来)

结合实践 2 中的 AUC 实现可以更好的理解这句话。 - 假设有一个文件,每行代表一个样本,左列真实值,右列预测值。按照右列,从小到大排序。 - 那么此时,最理想的情况是——左列是全都预测正确,先全是 0,后面全是 1。 - 因为右边预测值从小到大排序,全部预测正确的话必然是这样。 - 此时所有的负样本都排在了正样本前面。即负样本排在正样本前面的概率为 1。即 AUC = 1。 - 但是,假如第 7 行,预测值为 0.03,真实值为 1。 - 也就是说预测错了,有一个正样本被排到了前面。那么 AUC 就会减小。 - 并且越多的正样本排到了负样本前面,说明错的越多,AUC 也会越小。

AUC 反应了整体样本间的排序能力。 此外还有 GAUC(Group AUC),计算每个用户的 AUC,然后加权平均。GAUC 关注的是每个用户的排序结果。

4. PR 曲线

如果将 ROC 曲线的 TPR 与 FPR 换成 Precision 与 Recall,就得到了 PR 曲线。所以每个 PR 曲线上的点,也是与相应的混淆矩阵对应的。并且我们知道,Precision 与 Recall 一起越大越好,因此 PR 曲线越靠近右上角越好。如下图。

  • ROC 曲线描述了 Precision 与 Recall 的关系
  • 所以 PR 曲线也可以看作取不同的阈值,得到不同的混淆矩阵,计算得到不同的 Precision 与 Recall 映射到二维空间,然后拟合出来的曲线。

那么应该什么时候用 PR 曲线,什么时候用 ROC 曲线呢?

如图,对于两种曲线,他们的横坐标轴是一样的,TPR = Recall。区别只在于 FPR 和 Precision。 - 假设,有两个分类器 - 分类器 A 得到的 FP 为 10 倍的 TP,但远小于负样本数 N - 分类器 B 得到的 FP 为 100 倍的 TP,但远小于负样本数 N - 对这两个分类器的 FPR 与 Precision 做差值 - FPR 差值约等于 0,因为 TP 远小于 N。 - Precision 差值约为 0.081。这个差值与 FP 强相关。而 FP 代表着,本该是负例,却被错误预测为正例的数量,说明对正例更加关心。 - 从 FPR 与 Precision 本身的含义理解 - FPR:有多少负样本的被预测为正样本(预测错误);也可以看作,有多少负样本预测正确了。 - Precision:预测为正样本的样本中,有多少是正确预测的。

举一个例子,假设有这样一组极度不平衡的数据(左下角写错了,应该是负例:493;正例:7)。

可以看到,正例一个都没预测对。但如果看左边的 ROC 曲线的话,好像效果还蛮好的。右边的 PR 曲线,反映了正例预测的效果差。

==因此,当我们更加关心正例的预测结果,而且数据极度不平衡时,我们一定要用 PR 曲线,而不是 ROC 曲线。==

0x05 实践2:基于逻辑回归的个性化排序

1. 案例描述

当用户浏览商品时,需要对这些商品做个性化排序。即对所有商品做一个打分,然后排序。在本案例,是预测一首歌曲用户是否喜欢。喜欢为 1,不喜欢为 0。也可以做个性化排序,因为预测值在 (0, 1) 区间中,那么将分数高的歌放在前面,用户有更大的可能性会喜欢。

1.1. 开发流程

数据采集(数据集): 用户画像,商品信息,用户行为 数据预处理: 将数据处理为样本数据集——可以提供给模型训练的数据 训练算法: 使用逻辑回归做二分类 评估算法: 获得预测值,然后通过 PR 曲线,AUC 指标进行评估

1.2. 数据集

  1. 用户行为数据 ranking_lr/data/user_watch_pref.sml

    包含以下字段:
    userid, itemid, watch_len, hour
    userid, itemid, 用户对 item 收听时长, 点击时间(小时)
    
    01e069ed67600f1914e64c0fe7730944^A4090309101^A15^A19
    01d86fc1401b283d5828c293be290e08^A6192809101^A75^A12
    002f4b9c49be9a0b2c13e1c3c4f6a21c^A8915109101^A385^A18
    01e3fdf415107cd6046a07481fbed499^A6470209102^A1635^A21
    01e3fdf415107cd6046a07481fbed499^A6470209102^A555^A16
    01e3fdf415107cd6046a07481fbed499^A6470209102^A2024^A22
    ......

  2. 歌曲元数据 ranking_lr/data/music_meta

    包含以下字段:
    itemid, name, desc, total_timelen, location, tags
    itemid, name, 内容, 时长, 地域, 标签
    
    0093709100^A韩国少女时代最新回归新专主打《I GOT A BOY》^A韩国少女时代最新回归新专主打《I GOT A BOY》^A304^A^A
    0102209100^A韩国张力尹携手EXO成员CHEN《呼吸》中文版^A韩国张力尹携手EXO成员CHEN《呼吸》中文版^A274^A^ACHEN,少>
    029900100^A徐颢菲《猫的借口》^A^A284^A国内^A
    0368709100^A美女翻唱 别问我是谁^A美女翻唱 别问我是谁^A288^A^A流行歌曲,翻唱,网络歌曲,美女,舞曲,社会
    0603409100^A龙梅子,老猫 老爸老爸你好吗^A龙梅子,老猫 老爸老爸你好吗^A259^A^A你好吗,龙梅子,老猫,老爸老爸
    0637909100^A《中国好歌曲》  诙?镜诹?赸-韩磊天边》^A《中国好歌曲》  诙?镜诹?赸-韩磊天边》^A289^A^A中国好歌曲,>
    ......

第一列是 歌曲id,后面几列是歌曲的一些信息。而且有的歌曲某些信息是缺失的,这里是以 ^A 作为分隔符,所以出现相连的两个分隔符时,如 ^A^A,就说明其中的 Tag 缺失了。

补充:^A 的编码是 '\001'

  1. 用户画像 ranking_lr/data/merge_base.data
    包含以下字段:
    userid, gender, age, salary, location
    userid, 性别, 年龄, 收入, 地域
    
    00ea9a2fe9c6810aab440c4d8c050000,,26-35,20000-100000,江苏
    01a0ae50fd4b9ef6ed04c22a7e421000,,36-45,0-2000,河北
    002db7d2360562dd16828c4b91402000,,46-100,5000-10000,云南
    006a184749e3b3eb83e9eb516d522000,,36-45,2000-5000,天津
    00de61c1d635ad964eef2aefa8292000,,19-25,2000-5000,内蒙古
    00d313fa79be989e330f215c39dc3000,,26-35,10000-20000,天津
    ......

2. 数据预处理

2.1. 合并数据集

总体思路:处理原始的数据,将用户画像数据 、物品元数据、用户行为数据,3 份融合到一起,得到处理后 merge_base.data。

cd ./pre_base_data
python gen_base.py
#coding=utf-8
import sys

# 三类原始数据文件的路径,用户画像数据、物品元数据,用户行为数据
user_action_data = '../data/user_watch_pref.sml'
music_meta_data = '../data/music_meta'
user_profile_data = '../data/user_profile.data'

# 将合并后的元数据放到新的文件里
output_file = '../data/merge_base.data'

# 将3份数据merge后的结果输出,供下游数据处理
ofile = open(output_file, 'w')

# step 1. decode music meta data
# 将处理后的结果放入字典里面,key是itemid,value为物品对应的信息,为最后写入做准备
item_info_dict = {}
with open(music_meta_data, 'r') as fd:
    for line in fd:
        ss = line.strip().split('\001')
        if len(ss) != 6:
            continue
        itemid, name, desc, total_timelen, location, tags = ss
        item_info_dict[itemid] = '\001'.join([name, desc, total_timelen, location, tags])

# step 2. decode user profile data
# 处理用户画像数据,将处理后的结果放入字典里面,key是用户id,value是用户信息
user_profile_dict = {}
with open(user_profile_data, 'r') as fd:
    for line in fd:
        ss = line.strip().split(',')
        if len(ss) != 5:
            continue
        userid, gender, age, salary, location = ss
        user_profile_dict[userid] = '\001'.join([gender, age, salary, location])

# step 3. decode user action data & output merge data
# 写入最后的信息,将用户行为数据进行处理,并把step1和step2得到的数据一并归纳在文件里面
with open(user_action_data, 'r') as fd:
    for line in fd:
        ss = line.strip().split('\001')
        if len(ss) != 4:
            continue
        userid, itemid, watch_len, hour = ss

        if userid not in user_profile_dict:
            continue

        if itemid not in item_info_dict:
            continue

        ofile.write('\001'.join([userid, itemid, watch_len, hour, \
                user_profile_dict[userid], item_info_dict[itemid]]))
        ofile.write("\n")

ofile.close()

合并后得到如下数据 ranking_lr/data/merge_base.data

包含以下字段:
userid, itemid, watch_len, hour, user_profile_dict[userid], item_info_dict[itemid]
userid, itemid, 用户行为数据(收听时长), 用户画像(年龄, 性别, 收入, 地区), 物品信息(名字, 描述, 时长, 标签)

01e069ed67600f1914e64c0fe7730944^A4090309101^A15^A19^A女^A0-18^A10000-20000^A江西^A大美妞 大哲2013最新伤感歌曲网络歌曲DJ舞曲 大连翻译^A^A248^A^A大美妞,流行
01d86fc1401b283d5828c293be290e08^A6192809101^A75^A12^A男^A26-35^A2000-5000^A广东^A李贞贤 Summer Dance MBC现场版???? ??? ?^A^A159^A^A李贞贤,明星
002f4b9c49be9a0b2c13e1c3c4f6a21c^A8915109101^A385^A18^A女^A36-45^A10000-20000^A广西^A音乐 《我是歌手》 周笔畅 《慢慢》第二季第五期_1^A音乐 《我是歌手》 周笔畅 《慢慢》第二季第五期_1^A314^A^A邓紫棋,我是歌手第二季,周笔畅,音乐,我是歌手,流行
01e3fdf415107cd6046a07481fbed499^A6470209102^A1635^A21^A男^A36-45^A20000-100000^A内蒙古^A黄家驹1993演唱会高清视频^A^A1969^A^A演唱会
01e3fdf415107cd6046a07481fbed499^A6470209102^A555^A16^A男^A36-45^A20000-100000^A内蒙古^A黄家驹1993演唱会高清视频^A^A1969^A^A演唱会
01e3fdf415107cd6046a07481fbed499^A6470209102^A2024^A22^A男^A36-45^A20000-100000^A内蒙古^A黄家驹1993演唱会高清视频^A^A1969^A^A演唱会
......

2.2. 制作数据集

cd ./pre_data_for_rankmodel
python gen_samples.py

将之前合并的数据进一步处理,将年龄、性别等 Feature 转为 index 表示。并且把歌曲标题转为 token。得到如下数据 ranking_lr/data/samples.data

包含以下字段:
标签 label (是否喜欢), 用户特征(性别, 年龄), 物品特征(标题token)

0 0:1 2:1 4702:1.38682463766 11188:0.996230625242 1350:0.996230625242 5943:0.996230625242 16069:0.996230625242 10378:0.793220918108 23573:0.697935392737 11664:0.631809128186 21965:0.62434573841 24869:0.517456462871 1003:0.503245881179
1 0:1 5:1 7353:1.99246125048 4324:1.71495995655 3972:1.64293773069 4968:1.52451457681 19756:1.10494485228 1118:1.03970163946
1 1:1 5:1 11299:2.64150609428 1998:2.39095350058 1161:2.13636036542 20762:1.99773092931 4221:1.61142664699
1 1:1 5:1 11299:2.64150609428 1998:2.39095350058 1161:2.13636036542 20762:1.99773092931 4221:1.61142664699
1 1:1 5:1 11299:2.64150609428 1998:2.39095350058 1161:2.13636036542 20762:1.99773092931 4221:1.61142664699
1 0:1 2:1 11299:2.64150609428 1998:2.39095350058 1161:2.13636036542 20762:1.99773092931 4221:1.61142664699

3. 训练模型

cd /rankmodel
python lr.py ../data/samples.data

4. 评估指标

  • 如何评价模型的效果?
    • PR 曲线
    • AUC

4.1. PR 曲线

# pr.py

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve, average_precision_score

#y_true = np.array([0, 0, 1, 1])
#y_scores = np.array([0.1, 0.5, 0.4, 0.8])

data = pd.read_csv('auc.txt')
print(data)
y_scores = data['pred']
y_true = data['true']

#画曲线
precision, recall, thresholds = precision_recall_curve(y_true, y_scores)
plt.figure("P-R Curve")
plt.title('Precision/Recall Curve')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.plot(recall,precision)
plt.show()

#计算AP
AP = average_precision_score(y_true, y_scores, average='macro', pos_label=1, sample_weight=None)
print('AP:', AP)

由于这里读取的时候是用的 data = pd.read_csv('auc.txt'),所以要把 auc.raw 转为 .csv 格式。

首先输出预测值与真实值的数据:

cd /rankmodel
python lr_auc.py ../data/samples.data

生成了两个文件,ranking_lr/rankmodel/T.txtranking_lr/rankmodel/P.txt。分别是测试集的真实值与预测值。

真实值:
ranking_lr/rankmodel/T.txt
# P(y=1|x)
0
0
1
0
1
1
......
预测值:
ranking_lr/rankmodel/P.txt
# 因为是二分类,所以预测值这里有两个列
# 左边:P(y=0|x) 右边:P(y=1|x)

[ 0.36431328  0.63568672]
[ 0.068367  0.931633]
[ 0.19792306  0.80207694]
[ 0.43181549  0.56818451]
[ 0.18593127  0.81406873]
[ 0.15577786  0.84422214]
......

然而只需要一列的预测值就可以了,所以将 P.txt 中的第二列取出。

cat P.txt | awk '{print $2}' | tr '\]' ' ' |> P_2.txt

解释一下这条命令做了什么。以管道符为分隔,依次解释。

1. 输出 P.txt
cat P.txt | head

2. 将 P.txt 的第二列输出
cat P.txt | awk '{print $2}' | head
输出如下:
0.75734437]
0.87088091]
0.71707007]
 
3. 将以上输出右边的中括号替换为空字符
cat P.txt | awk '{print $2}' | tr '\]' ' ' | head

4. 将以上结果存入文件 P_2.txt
cat P.txt | awk '{print $2}' | tr '\]' ' ' |> P_2.txt

将真实值与预测值的文件作为两列数据合到一个文件 auc.raw

paste T.txt P_2.txt > auc.raw

得到如下格式的文件:

1^M>0.75734437·
1^M>0.87088091·
0^M>0.71707007·
...

可以看到真实值与预测值之间用 ^M> 分隔,预测值右边还有一个空格。需要把这个文件改为 .csv 的文件格式。

用 vim 打开 auc.raw,然后替换。需要用到以下命令:

:{作用范围}s/{目标字符}/{替换的字符}/{替换标志}

- 目标字符:origin
- 替换的字符:new
- 作用范围:用于指定替换的范围。
	- `1,3`表示替换第一行至第三行
	- `1,$`表示替换第一行到最后一行
	- 也可以直接用`%`表示替换所有行。 
- 替换标志(可以组合使用): 
	- c: confirm,每次替换前都会询问
	- e:不显示error 
	- g: globe,不询问,整个替换
	- i: ignore,即不区分大小写

vim auc.raw

:%s/ $//g  # 将全局行尾的空格去掉
:%s/^M//g  # 这里的 `^M` 要使用 `CTRL-V CTRL-M` 生成,而不是直接键入 `^M`

cp auc.raw auc.txt  # 将 auc.raw 复制到一个新的文件,因为原文件后面还有用

vim auc.txt

:%s/^I/,/g  # 这里的 `^I` 就是 vim 里显示的 `>`,用 Tab 键输入。或者输入 `\t`。

# 跳转命令
:1  # 跳转到第 1 行
# 然后在第一行之前插入表头:
# true,pred

# 最终得到如下格式的文件:
# true,pred
# 1,0.75734437
# 1,0.87088091
# ...

绘制 PR 曲线:

python pr.py

4.2. AUC

计算 AUC:

cat auc.raw | sort -t$'\t' -k2g |awk -F'\t' '($1==0){++x;a+=y;}($1==1){++y;}END{print 1.0-a/(x*y);}'

# cat auc.raw | sort -t$'\t' -k2g 对第二列数据从小到大做排序
# -F'\t' 以 '\t' 作为分隔符,第一列用 $1 表示,第二列用 $2 表示
# $1==0){++x;a+=y;} 如果满足 $1==0,那么执行大括号里的内容。
# x:负样本个数 y:正样本个数 a:错误预测样本 pair 个数
# x*y:正负样本 pair 个数
# a/x*y:错误的概率
# 1-a/x*y:正确的概率

0x06 面试题

1. 逻辑回归和朴素贝叶斯的区别? - 逻辑回归是判别模型,朴素贝叶斯是生成模型 - 判别模型:逻辑回归是直接对 P(y|x) 的问题进行建模,学习和求解,是在给定观测变量值的前提下,目标变量的==条件生成概率==。 - 生成模型:基于条件独立假设,在计算 P(y|x)之前,先要从训练数据中计算 P(x|y)和 P(y)的先验概率,从而利用贝叶斯公式计算 P(y|x)。需要所有变量的==全概率模型==。

2. 线性回归和逻辑回归的区别? - 逻辑回归是线性回归加了 Sigmoid 函数。 - 逻辑回归输出只取 0 和 1,线性回归输出连续值 - 拟合函数也有区别 - 线性回归:目标是拟合函数 - 逻辑回归:目标是拟合对一类样本的概率

3. 随机梯度下降(SGD)和批量梯度下降(BGD)的区别? - SGD 是每次随机取一个样本做梯度更新 - BGD 是每次随机取一个 batch(n 个样本)做梯度更新

4. 什么是 AUC?

5. 模型中的 w 参数,为什么不宜过大?

  • 因为当某一个或者某几个 w 参数过大时,会导致模型过于依赖这几个特征,使得模型的泛化性变差。
  • 也会导致梯度更新波动较大。

6. 什么是正则化项? - 在损失函数中添加==惩罚项(范数)==,作为约束,使得 w 保持接近 0 值,不会过大。 - 如果是 L1 正则化,除了缩小解空间,使模型参数尽可能接近 0;还可以过滤掉一些特征(结合 L1 的图理解),让模型变得简洁,可解释性更好。

7. 过拟合的问题? - 如果数据中存在噪音,模型有将==噪音==一起过度学习,导致模型失效。 - 如果不使用正则化,模型参数学习的较大,导致模型过拟合,过度依赖某些特征,==不具备泛化性==。

8. 解决过拟合的方法? - 降低模型复杂度:处理过拟合的第一步就是降低模型复杂度。 - 增加数据量:使用更大的数据集训练模型。 - 数据增强,对原有样本做变换:比如在 CV 中,对图片进行翻转。 - 正则化: - L1, L2 - Dropout - 早停:当相邻两次结果变化小于一定程度时,就停止训练,防止过度学习。 - 重新清洗数据:把明显异常值剔除。 - 使用集成学习方法:把多个模型集成在一起,降低单个模型的过拟合风险。 - BatchNorm 批量归一

References

评估指标: 【小萌五分钟】机器学习 | 混淆矩阵 Confusion Matrix_bilibili 【小萌五分钟】机器学习 | 模型评估: ROC曲线与AUC值_bilibili 多分类模型 Accuracy, Precision, Recall 和 F1-score 的超级无敌深入探讨 - 知乎 「评估」AUC离线好,上线差?试试GAUC

Linux 命令: awk 入门教程 - 阮一峰的网络日志 Linux awk 命令 | 菜鸟教程 Linux tr命令 | 菜鸟教程

音乐推荐系统实战: 音乐推荐系统-CSDN博客 GitHub - GoAlers/Music-Top-Recommend