0%

回归和分类作业

一、文件读取

  1. 白葡萄酒读数据

    使用 csv 模块,需要打开文件操作,不能使用 pandas

    1
    2
    3
    4
    5
    import csv
    path = "white_wine.csv"
    file = open(path, 'r')
    content = list(csv.reader(file))
    content[0:5]

    注意一下 csv 模块和 pandas 模块读取数据的区别

    • 使用pandas读取数据会默认将第一行数据作为列名,csv 则不会
    • pandas可以使用 read_csv(path, header=None) 来修改默认格式,将使用数字作为列名

二、数据处理

  1. 数据处理

    B

  2. 回归模型

    使用 sklearn.linear_model 中的 LinearRegression

    训练模型都是使用 fit()

    1
    2
    3
    from sklearn.linear_model import LinearRegression as lr
    model = lr().fit(df_trainx, df_trainy)
    predict_value = model.predict(df_testx)
  3. 同上

  4. 同上

三、二分类问题模型评价

  1. 正确率

    常见的评价指标,分类正确的样本占总样本的比例

    1
    2
    3
    4
    5
    import numpy as np
    import pandas as pd
    from sklearn.metrics import accuracy_score

    accuracy_rate = accuracy_score(y_true, y_pred)

    注意一下,这类评价函数都是第一个放 y_true ,第二个放 y_pred ,正确值放前面, 预测值放后面

  2. 召回率

    需介绍混淆矩阵,二分类情况下,准确值和预测值的组合有四种,多分类会有更多的组合

    将四种组合分为四种类型

预测 $ 0 $预测 $ 1 $
真实 $ 0 $tnfp
真实 $ 1 $fntp

tn :真负类,实际为负,预测为负

tp :真正类,实际为正,预测为正

fp :假正类,实际为负,预测为正

tn :假负类,实际为正,预测为负

四种类型没有交集,总和为样本总数,tp + tn = 预测正确的样本,fp + fn 为预测错误的样本

精准率:

  • 表示预测出来的样本中,正确的样本所占比例
  • 显然需要预测出来,即预测值为 1 中正确的比例
  • $ p = \frac{TP}{FP + TP} $

    召回率:

  • 又称为查全率,即预测出来的占该类总数的比例

  • 显然分子为 tp ,分母则为该类的全体,为 fn + tp
  • $ R = \frac{TP}{TP + FN} $

    1
    2
    3
    4
    5
    import numpy as np
    import pandas as pd
    from sklearn.metrics import recall_score, accuracy_score

    rec_rate = round(recall_score(y_true, y_pred), 2) # 5留双
  1. 特异度

    即负样本的召回率,查全率

    显然 $ P = \frac{TN}{TN + FP} $

    注意返回矩阵类型是 ndarray ,所以实际内容和上面的表格一样

    1
    2
    3
    4
    5
    from sklearn.metrics import confusion_matrix
    a = confusion_matrix(y_true, y_pred)
    tn = a[0][0]
    fp = a[0][1]
    spe_value = round(tn / (tn + fp), 2)
  2. kappa

    (😂,这个不是背靠背品牌

    Kappa是用于计算分类精度和评价一致性的指标。

    其中, $ P_o $ 为准确率,表明实际一致率,即混淆矩阵中对角线单元格中所有值的总和所占的比例; $ p_e $ 为正确预测的各分类数值的期望,表明理论一致率。

    image-20210419235045566

    image-20210419235056935

    sklearn 里面已经实现过了

    1
    2
    from sklearn.metrics import cohen_kappa_score
    kappa_score=round(cohen_kappa_score(y_true, y_pred), 2)
  3. AUC

    AUC 被定义为 ROC 曲线下的面积

    受试者工作特征曲线 (receiver operating characteristic curve,简称ROC曲线),又称为感受性曲线(sensitivity curve)。得此名的原因在于曲线上各点反映着相同的感受性,它们都是对同一信号刺激的反应,只不过是在两种不同的判定标准下所得的结果而已。受试者工作特征曲线就是以假阳性概率(False positive rate)为横轴,真阳性(True positive rate)为纵轴所组成的坐标图,和受试者在特定刺激条件下由于采用不同的判断标准得出的不同结果画出的曲线。
    ROC曲线是根据一系列不同的二分类方式(分界值或决定阈),以真阳性率(灵敏度)为纵坐标,假阳性率(1-特异度)为横坐标绘制的曲线。传统的诊断试验评价方法有一个共同的特点,必须将试验结果分为两类,再进行统计分析。ROC曲线的评价方法与传统的评价方法不同,无须此限制,而是根据实际情况,允许有中间状态,可以把试验结果划分为多个有序分类,如正常、大致正常、可疑、大致异常和异常五个等级再进行统计分析。因此,ROC曲线评价方法适用的范围更为广泛
    — 百度百科

    ROC曲线的坐标,纵坐标为真正例率(True Positive Rate,TPR),横坐标为假正例率(False Positive Rate,FPR)

    其中

    1
    2
    from sklearn.metrics import roc_auc_score
    auc_value=round(roc_auc_score(y_true, y_prob), 2)

  1. 回归问题的平均绝对误差 MAE
1
2
from sklearn.metrics import mean_absolute_error as mae
mae_value = round(mae(y_true, y_pred), 2)
  1. 回归问题的均方误差 MSE

    平方误差的期望,顾名思义可得:

    1
    2
    from sklearn.metrics import mean_squared_error as mse
    mse_value=round(mse(y_true, y_pred), 2)
  2. 回归问题的均方根误差 MSE

    就是 MSE 的方根

    1
    2
    3
    4
    5
    from sklearn.metrics import mean_squared_error as mse
    import numpy as np
    import pandas as pd
    import math
    rmse_value=round(math.sqrt(mse(y_true, y_pred)), 2)
  1. 回归问题的 $ R^2 $ 系数

    可以用来度量模型的拟合程度

    在评判回归模型优劣的指标中,决定系数 $ R2 $ 指的是回归平方和占总误差平方和的比例。它是表征回归方程在多大程度上解释了因变量的变化,或者说方程对观测值的拟合程度如何。 $ R2 $ 越趋近于 $ 1 $ ,说明回归方程拟合的越好, $ R2 $ 越趋近于 $ 0 $ ,说明回归方程拟合的越差。

    $ R2 $ 的有效性通常要求: $ \frac{\text{自变量个数}}{\text{样本数}} \gt \frac{1}{10} $

    需要注意的是 $ R2 $ 仅适用于线性回归模型的评价。

    1
    2
    from sklearn.metrics import r2_score
    r_square_value=round(r2_score(y_true, y_pred), 2)

  1. 信息熵

    信息熵,物理中出现过这个概念,计算公式为 $ H = -x\log{x} $

    在信息论与概率论中,熵是表示随机变量不确定性的度量,设 $ Y $ 是一个取有限个值的离散随机变量,其概率分布为: $ P(Y=y_i) = p_i, \quad i = 1,2,\cdots, n $

    则随机变量 $ Y $ 的熵定义为: $ H(Y) = -\sum_{i=1}^n p_i \ \textbf{log} \ p_i $

    上式中,若 $ p_i = 0 $ ,则定义 $ 0\ \textbf{log} \ 0 = 0 $ ,计算的时候对数以 $ 2 $ 底,这时熵的单位称作比特(bit)。由定义可知,熵只依赖于 $ Y $ 的分布,而与 $ Y $ 的具体取值无关。所以也可将 $ Y $ 的熵记作 $ H(p) $ ,即 $ H(p) = -\sum_{i=1}^n p_i \ \textbf{log} \ p_i $

    注意需要首先计算出概率分布

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import pandas as pd
    from scipy import log2
    import numpy as np
    sum = 0
    mp = {}
    row = y.shape[0]
    for i in range(row):
    tmp = y.iloc[i, 0]
    if mp.get(tmp) == None:
    mp[tmp] = 1
    else:
    mp[tmp] = mp[tmp] + 1
    for key in mp:
    p = mp[key] / row
    if p != 0:
    sum = sum - p * log2(p)
    entropy_value = round(sum, 2)

四、距离

  1. 欧几里得距离




~ python
​ import numpy as np
​ from math import sqrt
​ dis = round(np.sqrt(np.dot((x1 - x2).T, (x1 - x2))), 2)
​ ~

  1. 余弦相似度

    夹角

    1
    2
    3
    import numpy as np
    from numpy.linalg import norm
    cos_value = round(np.dot(x1, x2) / np.linalg.norm(x1) / np.linalg.norm(x2), 2)
  2. Jaccard 距离

    Jaccard距离(或相似度)通常用作衡量两个集合之间的相似度——比如Cathy的朋友集合表示为AKahn,Mark,Laura,⋯AKahn,Mark,Laura,⋯,Rachel 的朋友集合表示为BMladen,Kahn,Mark,⋯BMladen,Kahn,Mark,⋯,那么两个朋友集合的 Jaccard 相似度为:

    1
    2
    3
    4
    import numpy as np
    inter = len(np.intersect1d(x1, x2))
    uni = len(np.union1d(x1, x2))
    jaccard_dis = round(1 - inter / uni, 2)
  1. Hamming 距离

    在信息论中,两个等长字符串之间的汉明距离(Hamming distance)是两个字符串对应位置的不同字符的个数。Hamming距离主要用于衡量两个字符串,字组或者具有相同长度的DNA序列之间的相似程度。比如单词oliveoceanHamming距离为4,因为除了第一个字母o相同之外,这两个单词包含的其他四个字母都不相同。因此Hamming距离的计算方式其实十分简单,按照位置顺序,比对两个单词(或者字符串)字母之间是否相同,每个位置上字母不同的,相应Hamming距离的值增加1

    Hamming距离是以Richard Wesley Hamming的名字命名的,Hamming在误差检测与校正码的基础性论文中首次引入这个概念。在通信中累计定长二进制字中发生翻转的错误数据位,所以它也被称为信号距离。Hamming重量分析在包括信息论、编码理论、密码学等领域都有应用。

    1
    2
    3
    4
    5
    6
    7
    hamming_dis = None
    l1 = min(len(x1), len(x2))
    ans = 0
    for i in range(l1):
    if x1[i] != x2[i]:
    ans = ans + 1
    hamming_dis = max(len(x1), len(x2)) - l1 + ans
  2. 曼哈顿距离

    1
    2
    3
    4
    5
    6
    7
    import math
    manhattan_dis = None
    l = len(x1)
    ans = 0
    for i in range(l):
    ans = ans + abs(x1[i] - x2[i])
    manhattan_dis = round(ans, 2)