1.引言
先对机器学习有个总体的了解,机器学习类型:
1.监督学习:代表——分类和回归
2.无监督学习:代表——聚类
3.半监督学习:西瓜书p295图
4.强化学习:李宏毅强化学习
学习自bilibili菊安酱小姐姐机器学习实战录课,有些内容来自PDF课件。小姐姐讲的特别好,内容很丰富。记录一下一个月的学习内容,以便回顾。(●’◡’●)
2 经典算法
①k-近邻学习
定义(分类任务中):其工作机制非常简单:给定测试样本,基于某种距离度量,计算其与训练集样本的距离,取最近的k个训练样本,然后由这k个计算结果来投票决定属于哪个标签类。
重点提炼:
*距离度量:欧式距离(二维空间中计算两点之间的距离公式,这里拓展到高维);汉明距离(计算两个字符串间的距离,如手写数字识别)
*k的选择:k的选择是一个重要的参数,当k的取值不同时,分类结果会有显著的不同;
*和其他的学习方法相比,k-近邻学习有一个明显的不同之处:似乎没有显式的训练过程!
#代码原创菊安酱
def k_classified(inX,dataset,k):
result=[]
dist=list((((dataset.iloc[:6,1:3]-inX)**2).sum(1))**0.5) #计算测试样本和所有训练样本间的距离
dist_1=pd.DataFrame({'dist':dist,'labels':(dataset.iloc[:6,3])})#加上对应的标签列,此时有两列了
dr=dist_1.sort_values(by='dist')[:k]#对计算出来的距离进行排序,切片取k个
re=dr.loc[:,'labels'].value_counts()#取出两列中的标签列,将标签列作为索引,并对各种类别进行计数
result.append(re.index[0])#取标签数量最多的标签值并保存到列表容器中
return result
可以用来处理分类或者回归问题。
②决策树
定义:决策树是基于树的结构来进行决策的,通过问问题进行决策,每个判定问题都是对某个属性的测试。一般地,一颗决策树包含一个根节点、若干个内部节点和若干个叶节点。叶节点对应决策结果,内部节点对应于一个属性测试,根节点包含样本全集。
重点提炼:
*如何选择最优划分属性:
(信息熵是用来度量样本集合纯度最常用的一种指标。信息增益越大,则意味着使用属性a来进行划分所获得的“纯度提升”越大)
算法 | 划分准则 |
---|---|
ID3决策树 | 信息增益 |
C4.5决策树 | 信息率 |
CART决策树 | 基尼指数 |
基尼指数即从数据集中随机抽取两个样本,其类别标记不一样的概率。基尼指数越小,数据集的纯度越高。
*剪枝处理:决策树拟合数据的能力非常强,为了提高算法的泛化能力,需要进行剪枝处理来防止过拟合。
剪枝七个参数:
- Criterion:entropy,gini
- 两个随机性相关的参数:random_state,splitter
- 四个剪枝参数:max_depth,min_sample_leafmax_feature,min_impurity_decrease
#自己编写决策树算法步骤比较繁琐,这里是自己理解的步骤,思路来自菊安酱
1.定义一个计算样本信息熵函数,返回信息熵
2.定义一个根据信息增益选择出最佳数据集切分的‘列’函数,返回数据集最佳切分的列的索引
3.定义一个按照给定列划分数据集函数,返回按照指定列索引和属性值切分后的数据集
4.定义一个创建决策树函数,采用字典嵌套的方式存储树的信息。这是一个递归的过程
5.定义一个对单个测试数据进行分类的函数,这也是一个递归的过程
③朴素贝叶斯
定义:朴素贝叶斯是一个不建模的算法,是统计学的一种概率分类方法。之所以称之为‘朴素’,是因为只做最原始、最简单的假设:每个特征之间都是独立的。
重点提炼
*贝叶斯公式:根据条件概率和全概率公式
*在sklearn中有三种朴素贝叶斯的分类算法:
算法类型 | 简述 |
---|---|
GaussianNB | 高斯分布(正态分布)的朴素贝叶斯,假设每个标签的数据都服从简单的正态分布 |
MultinomialNB | 多项式朴素贝叶斯常用于文本分类,特征表示的是次数,例如某个词语的出现次数 |
BernoulliNB | 伯努利模型中每个特征的取值是布尔型的,适用于文本分类 |
④逻辑回归
定义:即应用对数几率函数 logistic function,能一定程度上近似单位阶跃函数,擅长处理分类问题。对数几率函数是一种sigmoid函数。
重点提炼
*LR的损失函数:采用的是对数损失函数
*正则化:
L1正则化(Lasso)相当于为模型添加了这样一个先验条件:服从零均值拉普拉斯分布;
L2正则化(Ridge)相当于为模型添加了这样一个先验条件:服从零均值正态分布。
*求解方法:梯度下降法
种类 | 简述 |
---|---|
批量梯度下降法BGD | 使用所有样本来更新参数 |
随机梯度下降法SGD | 仅取一个样本来更新参数 |
小批量梯度下降法MBGD | 取若干样本来更新参数 |
捋一下这个算法过程:大体思路就是把逻辑回归处理成线性回归问题。首先定义一个假设函数,再得到损失函数,用梯度下降算法对损失函数求参,求到的参数再带入假设函数中得到预测值,再将这个预测值进行sigmoid函数处理,得到预测连续值,再用0.5进行判断得到最终的预测结果。
⑤支持向量机
定义:基于训练集D在样本空间中找到一个划分超平面,将不同类别的样本分开。两个异类支持向量到超平面的距离和称之为间隔。具有“最大间隔”的超平面就是SVM要寻找的最优解。
重点提炼
求解一个服从不等式约束的最小化问题(满足KKT条件),想法就是使用拉格朗日方程,将约束条件放到目标函数中。从而一个有约束优化问题变成了一个无约束优化问题。对拉格朗日函数求解仍然困难,所以便有了拉格朗日对偶的诞生。对偶问题的求解分为两步,先求内侧的最小值,再求外侧的最大值。
对偶问题的求解有一个很高效的算法SMO(SMO即相当于逻辑回归中的梯度下降)。
核函数:用低维空间的内积来求解高维空间的内积。SVM可以应用核函数处理非线性问题。
类型 | 简述 |
---|---|
线性核函数 | 直接计算两个输入特征向量的内积 |
多项式核函数 | 多项式来作为特征映射函数 |
高斯核函数 | 也称为径向基核函数RBF(常用) |
Sigmoid核函数 | 常用的核函数之一 |
3.Tips
- one
#画图时显示中文
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['Simhei']
- two
sklearn包 | 作用 |
---|---|
TfidfVectorizer | 适用于对文本信息进行特征值抽取 |
DecisionTreeClassifier | 决策树分类器 |
graphviz | 决策树的绘制(可视化) |
train_test_split | 训练集和测试集的划分 |
LabelEncoder | 可以对类别进行编号 |
OrdinalEncoder | 可以对类别进行编号 |
KBinsDiscretizer | 可以将连续性变量划分为几类 |
OneHotEncoder | 另一处理文本标签的方式,几类加几列 |
SimpleImputer | 使用sklearn填充缺失值 |
cross_val_score | 交叉验证 |
- three
Levenshtein 包里面的hamming函数可以用来处理字符串间的距离。 - four
常用损失函数来衡量模型预测的好坏,即衡量真实值和预测值之间的差距。
Michael_Shentu_损失函数
损失函数类型 | 简述 |
---|---|
0-1损失函数 | 预测错误损失函数值为1;预测正确损失函数值为0 。非凸非连续 |
hinge损失函数 | max(0,1-z) ,hinge损失函数有一块平坦区域,保持了稀疏性(SVM) |
平方损失函数 | 预测值和实际值差的平方(回归任务常用) |
绝对损失函数 | 和上面类似,没有平方了 |
对数损失函数 | 这种损失函数用到了极大似然估计的思想 |
指数损失函数 | Adaboost |
欢迎指正!