常规机器学习算法的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yanhe156/article/details/83445964

常规机器学习算法的使用

  • 更新时间 2018年10月28日
  • 本篇总结尽量查找权威文献,而不是网上资料。

参考资料:

  1. scikit-learn的一个中文文档
  2. 西瓜书
  3. 统计学习方法
  4. 机器学习实战,注意这本书里说的labels很多时候指的是特征的具体意思,而不是分类
  5. PRML

0 数据预处理常用函数

注意 无论什么模型,训练时都先用少量数据测试确保没有bug, 不然太浪费时间了!

0.1 字符串处理

  1. 打开文件。这样不用再写关闭文件。
with open("filename") as f:
	...
  1. 按行读取文件
for line in f.readlines():
	...
  1. 获得目录下所有文件的名称
from os import listdir
filelist = listdir(dirname)
  1. 多个分隔符分割字符串
import re
text='3.14:15'
print re.split('[.:]', text)

re 是正则表达式模块

  1. 去除(替换)字符串中的某种字符
str.replace('a','')
  1. 字符列表转数字列表
    numbers = [ int(x) for x in numbers ]
    别忘了加中括号
  2. 列表元素筛选
new_list = [f(x) for x in old_list if x != '']
  1. 字符加减,python中字符不能直接加减,需要先获得ASCII码
ord(a) - ord(b)

对应的,ASCII码转化为字符的函数是chr()

0.2 numpy 常用操作

  • numpy主要是矩阵运算

0 Normlization

1 取不连续某几行或某几列,如:

data = data[[5,3,4],:]  # 取 5,3,4行
data = data[:,[5,3,4]]  # 取 5,3,4列

2 按某列的值排序,保持行数据不变,(按某行排序同理)如:

# 按最后一行排序
new_list = data[:,-1].argsort()
data = data[new_list]

3 按某列的值筛选,保持行数据不练,按列同理,如:

data[data[:,-1]==1,:] # 选出所有等于最后一个列值为1的行

data[:,-1]==1返回的是有bool类型数据组成的向量。
这里ndarray的行索引或列索引能接受bool类型数据组成的向量或列表,但必须维度相同。
4 浮点数组转整数

x.astype(int)

5 读取文件和保存文件

a = np.fromfile(filename)
a.tofile(filename) # 保存为bin格式

6 保持shape的前提下,mask元素和填充元素,结合起来可以替换元素

b = np.ma.masked_equal(a,2)  # 将a中值为2的元素mask掉,可以理解为替换成none
b = np.ma.filled(b, 22) # 用22填充所有的mask

0.3 scipy常用操作

  • scipy主要是科学计算,比如信号处理,优化问题等
    1 读取.mat文件,有时会需要读取matlab的数据文件
import scipy.io as sio
data = sio.loadmat("./hsi_dataset/Indian_pines.mat")

读取到的是一个字典,包含数据,matlab版本等信息

1 sklearn 的使用

  • sklearn中各种算法的调用方法都是差不多的,基本上有以下四个函数:
model = ..() # 初始化,不同算法初始化的参数不同
model.fit(X,y) # X,y 为训练数据和标签,一般为numpy数组
model.score(X_test,y_test) # 返回分类精确度。X_test,y_test 为测试数据和标签。
model.predict(X_test)  # 预测 

2 模型的评价

3 可视化

  • 神经网络中loss和accuracy变化曲线
    论文中一般要求svg格式,但是svg格式占得空间非常大,要注意画图时点的数量。

4 几句话总结常用机器学习算法-分类

4.1 KNN (k-NearestNeighbor)

  • 用途: 可以解决分类问题和回归问题。(下面是用于分类)
  • 基本思想:对一个数据进行分类,先计算训练集中K个与该数据距离最近的数据,这K个训练集中的数据的类别(即频率最高的类别)为输入数据的类别。

4.2 决策树(DTs,Decision Trees)

  • 类似人做决策的过程,依次对每个特征进行判断,最后得出结果。判断的过程就像树状图。
  • 训练的目的是确定这个决策过程如何建立,来依次根据每个特征确定最后结果。
  • 决策树的一个特点是它处理的是离散数据,即每个特征都需要是离散值(有若干个确定的类别)。决策树中每个节点有若干分支,每个分支对应特征的一个类别。
  • **如果数据是连续值,需要进行离散化。**最简单的方法是二分法,C4.5决策树算法就是使用了二分法。二分法需要选取一个阈值,选取阈值的准则也有多种,比如熵增益最大。

4.3 朴素贝叶斯

  • 训练的目的是统计每种label下,每种特征的取值数量,从而计算概率,得到概率分布。
  • 推断时,通过分布函数计算概率。最后可以得到每种分类的概率,概率最大的类别即为分类结果。

4.4 Logistic回归

  • 这部分太冗长了,问题有点多,有些问题是和神经网络相关的。Logistic回归在我看来是其实是一个单层感知机,也就是最简单的神经网络。

  • 逻辑回归和线性回归的区别:
    逻辑回归基于线性回归,逻辑回归是一种分类算法。
    线性回归会得到一个线性函数,逻辑回归的思想就是寻找一个阈值,将线性函数变成分段函数(阶跃函数),分为2段,值为0,1。代表是否为某一类。
    如果是二分类的话,那么0,1可以代表第0类和第1类(不是第0类)。

  • 梯度上升和梯度下降的区别:
    首先明确梯度的概念:表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快变化率最大(为该梯度的模)。
    因此,函数在该点沿着梯度方向,能够增长最快,沿着负梯度方向,下降最快。
    所以梯度上升,加上梯度,能取得局部最大值;梯度下降,加上负梯度,能取得局部最小值。
    机器学习实战中使用的loss function不是交叉熵函数,而是交叉熵函数的负值,所以要做梯度上升。一般使用交叉熵函数时,做的是梯度下降。

  • loss function和cost function
    吴恩达公开课2.3节讲了,loss function指的是单个训练样本的,cost function是用来衡量整个训练样本,一般是loss function的均值。

  • 关于梯度下降和随机梯度下降:
    批量梯度下降一次迭代使用全部数据,用每条数据梯度的均值来更新参数; (吴恩达1.2.10)
    随机梯度下降迭代一次随机使用一条数据(不重复),用这条数据的梯度来更新参数。
    小批量梯度下降(mini-batch gradient descent)迭代一次使用若干条数据,所有mini-batch共同组成训练集。(吴恩达2.2.1)
    三者各有优缺点

  • 逻辑回归为什么不用阶跃函数而是用sigmoid函数去模拟阶跃函数?
    我认为一个原因是阶跃函数求导后不便于计算。学过信号与系统的都知道阶跃函数求导是冲激函数,冲激函数是一种奇异函数。
    同时也有一些要用sigomid函数的理由。为什么 LR 模型要使用 sigmoid 函数,背后的数学原理是什么?

  • 逻辑回归如何进行多分类?
    一般的例子讲的都是二分类。
    机器学习(周志华) 的3.5节多分类学习讲了 将多分类任务拆解成若干个二分类任务求解。讲了3种拆解方法。
    常用的方法是,进行多分类时,依次判断每一种类别的置信度。进行某一种类别的判别时,置信度越高(越接近1)表示为该类的可能性越大,置信度越低(越接近0)表示不为该类的可能性越大,这样就转化为了二分类问题。最后选取置信度最大的类别作为分类结果。

  • sigmoid 函数的导数是什么?
    f' = f(1-f)

  • 训练时其实没必要计算出具体的cost,只需计算梯度就可以了,但是往往需要观察cost是否下降。
    注意cost和输出是不同的概念,cost是通过输出和label计算的。
    注意逻辑回归的输出为置信度,label也为置信度。置信度属于[0,1],表示为某个类别的可能性。
    注意! 监督学习的训练时,label的意义必须和输出的意义必须相同

  • softmax和多分类逻辑回归有什么关系?为什么要softmax?

4.5 SVM

4.6 Adaboost

5 无监督学习

5.1 聚类

5.2 关联分析

关联分析一般包括两部分:1. 频繁项集(Frequent items sets) 2. 关联规则(Association rules)

  • 项集指若干特征(物品)组成的集合。 频繁指该集合出现的频率高,也就是概率大。寻找频繁项集的过程就是统计每个项集出现的概率。
  • 关联规则指的是在某个物品存在的前提下,另一种物品存在的概率高。寻找关联规则的过程是依次计算不同物品对不同集合的条件概率。

5.2.1 Apriori算法

  • Apriori算法主要是对枚举做了一些剪枝,剪枝的思路如下:
    如果一个集合出现的频率高,那么它的子集出现的频率也高。这个命题显然是成立的,Apriori这个单词就是指“先验的”,也就是说Apriori算法利用了这个先验假设。
    编程时真正起到剪枝作用的是上面这个命题的逆否命题,即如果一个集合出现的概率低,那么包含它的集合出现的概率也低。 根据这个思路显然能够减少频繁项集的搜索次数。那么如何关联规则如何优化?

5.2.2 FP-growth

  • FP-growth 用于寻找频繁项集,以Apriori算法为基础,但不能用于发现关联规则。

6 其他方法

6.1 SVD

6.2 PCA

7 相关术语

7.1 距离

  • 欧氏距离
  • 曼哈顿距离
  • 切比雪夫距离

猜你喜欢

转载自blog.csdn.net/yanhe156/article/details/83445964
今日推荐