机器学习综述

2022-03-25
7分钟阅读时长

名词释义

  1. 入侵检测技术的原理如何?

    包括基于数据源划分和基于检测技术的划分。数据源就是数据如何产生,可基于主机或基于网络;检测技术则分为基于误用和基于异常。基于误用可以理解为模式匹配,基于异常是只要不合法就判断为非法。入侵检测技术可简化成一种二分类问题。

  2. 如何选择研究方法?

    由于使用基于异常的检测技术,也就是对正常或者不正常的访问进行划分,数据集中包含了最终的分类标签,因此采用的是监督学习。

    在生成方法和判别方法中,生成方法是统计得到联合概率,计算后得到条件概率;判别方法则直接学习条件概率,因此判别方法可以简化学习问题

    毕业课题中,第一,所有的变量理论上都可以观测到值,不存在隐变量;第二,实际应用中部署的是训练好的模型,生成模型学习收敛速度快这点并不占优势,最后是由于判别方法直接学习条件概率或决策函数,准确率较高。

  3. 什么是输入空间,什么是输出空间,什么是特征空间?

    1. 输入X可能取值的集合是输入空间;

    2. 输出Y可能取值的集合是输出空间;

    3. 每个具体的输入是一个实例,由特征向量表示;

      所有特征向量存在的空间称为特征空间。

      特征空间与输入空间有时候不同,不同的情况是输入空间通过某种映射生成了特征空间。

  4. 什么是损失函数,什么是经验风险,什么是期望风险,什么是结构风险?

    1. 损失函数:针对单个具体样本,表示模型预测值与真实样本值之间的差距。常见的损失函数有0-1损失函数、平方损失函数、绝对损失函数、对数损失函数(对数似然损失函数)。
    2. 经验风险:对所有训练样本的损失函数的平均值,或模型对所有训练样本的预测能力。
    3. 期望风险:对所有样本的损失函数的平均值,或模型对未知样本和已知的训练样本的综合预测能力。
    4. 结构风险:是对经验风险和期望风险的折中,在经验风险函数后面加一个正则化项
  5. 为什么使用决策树、支持向量机、前馈神经网络算法实现入侵检测?

    1. 选择决策树是因为它原理简单,可解释性高,可视性好,一开始使用迭代二分法决策树作为原型,后面改用最大信息增益比率决策树进行实现,原因是需要对连续值进行划分;

    2. 选择支持向量机则是因为它是传统机器学习算法中表现最优异的一种,推导严谨,分类比较精确,具体实现上使用序列最小优化算法进行实现,后面借鉴了一下最小二乘法的实现;

    3. 选择前馈神经网络,它结构简单,实现快,可用它与传统机器学习算法进行对照。

  6. 没有免费午餐定理

    任何一个预测函数,如果在某些样本上表现好,那么在另一些样本上就表现不好。

    如果不对数据在特征空间的先验分布有一定假设,那么表现好与表现不好的情况一样多。

    定理价值:

    1. 必须假设:在特征空间上接近的样本属于同一类别的概率更高。
    2. 没有放之四海而皆准的最好算法,因为没有人知道特征空间先验分布的真正情况。
  7. 如何评价学习的效果?采用何种标准?

    样本共有4类,分别是:

    1. TP:实例是正例,且被判定为正例
    2. FP:实例是反例,但被判定为正例,误报
    3. TN:实例是反例,且被判定为反例
    4. FN:实例是反例,但被判定为正例,漏报

    正确率:$Accuracy=\frac{TP+TN}{TP+TN+FP+FN}$

    精确率:$Precision=\frac{TP}{TP+FP}$

    召回率:$Recall=\frac{TP}{TP+FN}$

    两者通常相互“制约”:追求精确率高,则召回率就低;追求召回率高,则通常会影响精确率。

数据处理

  1. 项目过程(项目是怎么实现的)

    项目主要分为数据处理、模型学习和模型预测三个步骤。具体过程见下:

    环境准备

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import math
    
  2. 你的数据集是怎样选取的,为什么要这样选择?

    我选择的数据集是CIC-IDS-2017,基于以下原因。(待完善

  3. 你对数据做了哪些预处理?有哪些改进的方法?

    主要包括:数据准备、删除缺失值、归一化和特征缩放。

    数据处理这块参考了一个使用CIC-IDS-2017数据集的入侵检测基线系统,它有一个删除低关联的特征的操作,但是基于异常的入侵检测本身需要更多维度的数据作为支撑,对于未知的入侵过程来说具体哪些特征属于低关联特征是不清楚的,因此这里没有选择删除低关联的特征。

  4. 数据准备如何实现?

    解压缩数据:

    !unzip XXXX.zip -d ./data/
    

    项目使用pandas导入数据集,导入后格式为dataframe:

    wednesday=pd.read_csv('XXX.csv',low_memory = False) #low_memory参数可以省略
    

    若使用numpy导入数据集,导入后格式是元组:

    p = r'XXXX.csv'
    with open(p,encoding = 'utf-8') as f:
        data = np.loadtxt(f,str,delimiter = ",")
        print(data[:5])
    

    注释:

    1. numpy导入数据使用的方法是numpy.loadtxt(),默认是float格式,通过加入str参数可使其识别字符串类型数据,避免导入出错;
    2. with open() as f是读入文件方法,r代表以只读方式打开文件;
    3. [:5]代表的是从第1行一直到第5行。

    对数据列名进行规范:

    wednesday = wednesday.rename(str.lstrip, axis='columns')
    

    注释:

    1. dataframe.rename()方法用于更改数据的行列名。通过axis参数指定行列。
    2. str.lstrip()方法用于去除字符串起始部分的选定字符,默认为空格。

    查看标签情况:

    df = wednesday
    print(df['Label'].unique())
    

    注释:

    1. dataframe.unique()方法以数组形式返回列的唯一值(去除重复值),用于获知有哪些标签。
    2. dataframe.nunique()方法返回的是列的唯一值的个数。

    获得数据列名:

    #法一,等价于法二
    lables=[column for column in df] 
    #法二
    lables=[]
    for column in df:
        labels.append(column)
    lables.remove('Label')
    print(lables)
    print(len(lables))
    

    注释:

    1. c for b in a指的是对a中每一个迭代对象b,都进行c操作。此处将语句放在元组里等于对迭代对象使用list.append()方法。
    2. list.remove()方法用于移除元组中的某个元素。
    3. list.len(list)方法用于获得元组中的元素个数。
  5. 缺失值删除是如何实现的?

    将inf替换为NaN,然后删除缺失值

    df=df.replace(np.inf,np.nan)
    df=df.dropna(axis=0)
    

    注释:

    1. dataframe.replace()方法用于将数据中的某个元素统一替换为另一个元素;
    2. dataframe.dropna()方法用于将数据中的缺失值删除
    3. axis=0或’index’表示删除包含缺失值的行;axis=1或’columns’表示删除包含缺失值的列
  6. 标签与特征分离

    X = df.loc[:,df.columns != "Label"]
    y = df.loc[:,df.columns == "Label"]
    

    注释:

    1. dataframe.loc()方法用于切片,提供参数为行索引名称或条件 , 列索引名称,切片结果是闭区间;
    2. dataframe.iloc()方法亦用于切片,提供参数为行索引位置和列索引位置,切片结果是开区间。
  7. 归一化特征缩放是如何实现的?

    1. 对于标签数据,使用sklearn.LabelEncoder()来转化

      encoder = LabelEncoder()
      y = encoder.fit_transform(y)
      

      注释:

      1. LabelEncoder 来转化 dummy variable(虚拟数据)非常简便,encoder 可以将数据集中的文本转化成0或1的数值,从而解决二分类问题。
      2. fit_transform()方法对数据进行统一处理,包括将数据缩放(映射)到某个固定区间,归一化,正则化等标准化等。特别地,得到的类型为numpy。
    2. 对于非标签数据,使用sklearn.RobustScaler()来转化

      scaler=RobustScaler()
      X = scaler.fit_transform(X)
      

      注释:

      归一化分为StandardScalerMinMaxScalerRobustScaler等;

      1. 标准化缩放方法通过减去均值然后除以方差(或标准差);

      2. 最大最小值缩放方法将特征缩放到给定的最小值和最大值之间;

      3. 鲁棒缩放方法使用中位数和四分位矩,不容易受到异常值影响。

        原理:

        1. 四分位数,把所有数值从小到大分为四等份,处于三个分割点位置的数值是四分位数;

        2. 第一四分位数和第三四分位数的差称为四分位距;

        3. 计算方法为:

          $$ v_i^{’}=\frac{v_i-median}{IQR} $$

          其中median是中位数,IQR是样本的四分位距。

    3. 另外,dataframe.values()方法用于将pandas转为numpy类型

  8. 训练集与验证集划分

    使用sklearn.train_test_split()方法。

    x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.30, shuffle=True, random_state=123, stratify=y)
    

其他问题

  1. Python的四大数据类型是哪些?

    元组、列表、字典、字符串

  2. 项目具有哪些改进方向?

    1. 决策树:CART树
    2. 支持向量机:最小二乘法、加权、稀疏核机
    3. 神经网络:循环神经网络
Avatar

坐忘道琼峰 Sitting Oblivion Tao EndlessPeak

瞽者无以与乎文章之观,聋者无以与乎钟鼓之声。岂唯形骸有聋盲哉?
下一页 决策树问题