导图社区 机器学习算法线性回归决策树笔记自学思维导图
机器学习算法线性回归决策数笔记自学完整分享!内容覆盖K-近邻算法、线性回归、逻辑回归、决策树、集成学习以及聚类。
编辑于2023-02-25 09:44:36 广东机器学习算法线性回归决策树笔记自学思维导图
K-近邻算法
算法原理及API
K-近邻算法的概念和原理
概念
如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别
特征空间
用所有特征作为坐标轴建立的空间,在特征空间里,每个样本是一个点
【重点】原理及实现步骤
1.计算已知类别数据集中的点与当前点之间的距离
2.把这些距离按升序排列
3.选取与当前点距离最小的k个点
4.统计前k个点所在的类别出现的频率(求K个类别的众数)
5.把众数类别作为当前点的类别
K-近邻算法的API
Scikit-learn 的介绍
实现了众多机器学习算法的机器学习工具
API
sklearn.neighbors.KNeighborsclassfier(n_neighbors)
算法计算及优化
距离的度量
欧式距离
曼哈顿距离(街区距离)
切比雪夫距离
闵可夫斯基距离(闵氏距离)
标准化的欧式距离
余弦距离
汉明距离
字符串长度相等
计算字符串的距离
杰卡德距离
两个集合的距离
马氏距离
K值的选择对模型的影响
欠拟合及过拟合的表现
近似误差
模型在训练集上的误差
估计误差
模型在测试集上的误差
欠拟合
近似误差大,估计误差大,说白了就是模型在训练集和测试集上表现都不好
过拟合
近似误差小,估计误差大,说白了就是模型在训练集上表现很好,在测试集上表现不好
K值过小
受异常点影响大
模型复杂, 学习能力强,容易过拟合
K值过大
样本不平衡的影响大
模型简单, 学习能力弱, 容易欠拟合
kd树
kd树介绍
树的概念
根节点
只有子节点,没有父节点的节点
内部节点
有子节点,也有父节点的节点
叶子节点
只有父节点,没有子节点的节点
二叉树
节点最多只有两个分叉的树
kd树的作用
减少样本距离 的计算次数,快速找到最近邻的点
kd树的构造方法
1. 随机选择一个特征,取这个特征的中位数作为划分点将数据划分成平均的两部分。选取的特征为当前节点的划分特征,中位数的点作为当前节点,在该特征上,小于中位数的点被划入左节点,大于中位数的点被划入右节点;
2. 分别对左节点和右节点上的数据重复第一步;
3. 直到把所有样本都放到节点上为止
kd树查找最近点的方法
1. 查询点M与kd树上每个节点的划分特征及相应的中位数进行比较,不断往下比较,直到到达叶子节点为止。按顺序记录整个过程中走过的节点search_path;
2. search_path末尾节点为N,不取出N,记录dist=M与N的距离, nearest=N;
3. 从search_path末尾取出一个节点L,该节点的划分轴为x,计算M点到x轴的距离a,接着分两种情况处理:
如果a<dist,则把节点L划分的另一边空间的所有点和当前nearest点纳入考察范围,计算考察范围内所有的点到M点的距离,找到距离最近的点,记录该点为nearest,该点到M的距离为dist,丢弃节点L,步骤结束;
如果a>=dist,丢弃节点L,步骤结束
4. 重复第3步,直到search_path为空;
5. nearest就是离查找点最近的点,最近的距离为dist。
案例1
scikit-learn的数据集API介绍
sklearn小数据集
API:load_* 如:load_iris()
sklearn大数据集
API:fetch_* 如:fetch_20newsgroups(sub_set='train')
参数说明:sub_set='train' 指定获取的数据集类型
sklearn数据集返回值介绍
数据类型:datasets.base.Bunch(字典格式)
data:特征数据数组
target:标签(目标值)数组
feature_names:特征名
target_names:标签名
keys() 获取字典的所有属性(字段)
绘制数据散点图, 查找异常点
sns.lmplot(col1, col2, data, hue, fit_reg)
数据集的划分
x_train, x_test, y_train, y_test = trian_test_split(x, y, test_size)
使用sklearn进行特征预处理
归一化
归一化的缺点 :受异常值的影响大
API:MinMaxScaler(feature_range)
作用:把数据转换到0~1之间
标准化
API :StandarScalar()
作用:把数据转换为mean=0, std=1
鸢尾花种类预测
案例2
交叉验证和网格搜索
交叉验证
把训练集平均分成N份,分别取不同的一份为验证集,其它为训练集,训练和验证模型表现,将N次模型表现的平均值作为该模型在这个训练集上的表现
网格搜索
寻找最优的超参数组合
API
sklearn.model_selection.GridSearchCV(estimator, param_grid, cv)
预测facebook签到位置
线性回归
线性回归简介
线性回归的数学公式(数学模型)
h(w) = w1*x1 + w2*x2 + w3*x3 + ... + wn*xn + b
超平面的概念
n维空间中的n-1维线性关系,就叫做n维空间中的超平面
API
sklearn.linear_model.LinearRegression()
线性回归的损失和优化
损失函数
1.损失函数是关于可训练参数的函数
2.损失函数的值越小,模型的预测值与真实值越接近
线性回归的优化方法
正规方程
直接计算最优参数
注意:只适用于最小二乘法损失的线性回归模型
梯度下降法
通过梯度不断迭代寻找最优可训练参数
通用的优化方法
损失函数+梯度下降是最常见的模型优化方法
梯度下降法
全梯度下降算法(FG)
随机梯度下降算法(SG)
随机平均梯度下降算法(SAG)
小批量梯度下降算法(mini-bantch)
案例-波士顿房价预测
回归性能评估API:sklearn.metrics.mean_squared_error(y_true, y_pred)
正规方程优化线性回归API:sklearn.linear_model.LinearRegression()
随机梯度下降优化线性回归:sklearn.linear_model.SGDRegressor()
过拟合和欠拟合
欠拟合
定义:模型在训练集和测试集上的表现都不好
解决办法:提高模型的复杂度
增加数据的特征数量
添加多项式项
过拟合
定义:模型在训练集上表现很好,但是在测试集上表现不理想
解决办法:降低模型的复杂度
重新清洗数据
增大数据的训练量
正则化
L1正则化:可以使得其中一些W的值直接为0,删除这个特征的影响。可以用来做特征选择
L2正则化:可以使得其中一些W的都很小,都接近于0,削弱某个特征的影响
减少特征数量
正则化线性模型
岭回归
线性回归+ L2正则化
Lasso 回归
线性回归+ L1正则化
弹性网络
线性回归+ L1 + L2
岭回归
加入了L2正则化的线性回归
API: Ridge(alpha)
模型的保存和加载
保存:joblib.dump(estimator, path)
加载:joblib.load(path)
逻辑回归
逻辑回归的原理
数学模型:线性回归 + 激活函数(sigmoid)
激活函数的作用:增加模型的非线性拟合能力
损失函数:对数似然损失
优化方法:梯度下降
API:sklearn.linear_model.LogisticRegression()
分类模型的评估方法
分类评估报告API:classification_report(y_true, y_pred, label, target_names)
ROC曲线
TPR = TP / (TP + FN)
FPR = FP / (FP + TN)
调整阈值得到多个(FPR, TPR)点, 绘制ROC曲线
AUC指标
含义:随机取一对正负样本,正样本得分大于负样本的概率
API:roc_auc_score(y_true, y_score),注意:y_true 必须用0,1标记假例和正例
决策树
决策树算法简介
决策树是一种树形结构
每个内部节点表示一个特征的判断
每个分支代表一个判断结果的输出
每个叶节点代表一种分类结果
决策树的原理
决策树节点的特征选择及划分依据
熵
“混乱”程度的量度
entropy = -p1logp1 - p2logp2 + ... + pn*log(pn)
信息增益
以某特征划分数据集前后的熵的差值
信息增益 = entroy(前) - entroy(后)
信息增益越大,说明这个特征的划分方式越好
信息增益率
信息增益/分离信息度量
分离信息度量 = 某个特征的各个类别出现的概率计算出来的熵
基尼值增益
基尼值:从数据集D中随机抽取两个样本,其目标值(标记)不一致的概率
基尼值越小,数据集的纯度越高
基尼增益 = 基尼值(前)- 基尼值(后)
基尼值增益越大,这种划分方式越好
决策树构建的步骤
1.开始将所有样本看作一个整体
2.遍历每个特征的每一种分割方式,找到最好的分割(依据就是信息增益,信息增益率,基尼值增益)
3.按照最优分割方式,把所有样本成两个部分N1和N2,也就是两个分支
4.对N1和N2分别继续执行2-3步,直到每个节点足够“纯”为止
根据不同的节点选择及划分依据,决策树分为
ID3决策树:信息增益
C4.5决策树:信息增益率
CART决策树:基尼值增益(或者基尼指数)
cart剪枝
目的:减少决策树节点的数量 -> 降低决策树复杂度 ->防止决策树过拟合
方法
预剪枝:创建决策树时剪枝
每一个结点所包含的最小样本数目,例如10,则该结点总样本数小于10时,则不再分
指定树的高度或者深度,例如树的最大深度为4
指定结点的熵小于某个值,不再划分
后剪枝:创建决策树之后剪枝
方法和预剪枝类似
特征工程:特征提取
字典特征提取
sklearn.feature_extraction.DictVectorizer(sparse=True)
注意:这个方法会自动把离散的数据进行one_hot编码
文本特征提取
词语出现次数
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
Tf-idf文本特征提取
TF: 词频
指的是某一个给定的词语在该文件中出现的频率
IDF:逆文档频率
由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
TF-IDF
TF-IDF = TF * IDF
作用:评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度
API:sklearn.feature_extraction.text.TfidfVectorizer(stop_works)
注意:对中文文章进行特征提取要先做分词
结巴分词:jieba.cut
案例:泰坦尼克号乘客生存预测
决策树的API:sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
决策树可视化: sklearn.tree.export_graphviz()
总结
决策树优点:简单,可解释,可以可视化
决策树缺点:容易过拟合
解决方法
剪枝
随机森林
集成学习
集成学习算法简介
生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成组合预测,因此优于任何一个单分类的做出预测
boosting -> 欠拟合
bagging -> 过拟合
Bagging集成学习
原理:并行建立多个模型,模型之间相互独立
1.采样:通过随机有放回采样N份数据
2.学习:用N份数据学习N个不同模型
3.集成:通过N个模型平权投票,票数多的作为最终结果
随机森林
什么是随机森林:bagging + 决策树
API:sklearn.ensemble.RandomForestClassifier(n_estimators, max_depth)
优点
均可在原有算法上提高约2%左右的泛化正确率
简单, 方便, 通用
Boosting 集成原理:串行建立多个模型,后建立的模型受前面建立的模型影响
1. 初始化训练权重,权重相等,训练第一个学习器(模型)
2.计算该学习器在训练数据中的错误率
3.根据错误率计算该学习器的权重
4.根据学习器的权重对训练数据重新赋权
5.重复执行1~4步m次
6.对m个模型的结果加权投票得到最终结果
聚类
聚类算法简介
聚类算法一种典型的无监督学习算法,主要用于将相似的样本自动归到一个类别中
聚类算法与分类算法的最大区别:聚类算法是无监督学习算法,分类算法是有监督学习算法
聚类算法API初步使用
sklearn.cluster.KMeans(n_clusters=8)
预测方式:调用fit_predict(X) 就可以得到分类结果
聚类算法实现流程(原理)
1.随机选择K个样本作为K个类别的中心;
2.计算所有样本到中心的距离;
3.样本离哪个中心近,就把它划为哪个类别;
4.划分好K个类别之后,重新计算中心的坐标,计算方法是,类别内样本的各个特征值的平均值作为新中心相应的坐标;
5.重复2、3、4步,知道中心的坐标不再变化为止。
聚类的模型评估
误差平方和:所有样本到对应类别中心的距离(欧式距离)的平方加起来
"肘”方法:下降率突然变缓时即认为是最佳的k值
SC轮廓系数:取值为[-1, 1],其值越大越好,如果为负值,则该样本可能被分类错了
CH系数:分数s高则聚类效果越好
算法优化
Canopy算法配合初始聚类
K-means++
二分k-means
ISODATA
kernel kmeans
Mini-batch K-Means
特征降维
特征选择
删除低方差的特征
皮尔逊相关系数
斯皮尔曼相关系数
主成分分析PCA
案例:探究用户对物品类别的喜好细分降维