分类算法
目标值:类别
一、转换器——特征工程的父类
想一下之前做的特征工程的步骤?
- 1、实例化 (实例化的是一个转换器类(Transformer))
- 2、调用fit_transform(对于文档建立分类词频矩阵,不能同时调用)
我们把特征工程的接口称之为转换器,其中转换器调用有这么几种形式
- fit_transform (以标准化为例:(x- mean )/std )
- fit 计算每一列的平均值 mean、标准差 std
- transform (x-mean)/std进行最终的转换
二、估计器(sklearn机器学习算法的实现)
1、在sklearn中,估计器(estimator)是一个重要的角色,是一类实现了算法的API
- 1、用于分类的估计器:
- sklearn.neighbors k-近邻算法
- sklearn.naive_bayes 贝叶斯
- sklearn.linear_model.LogisticRegression 逻辑回归
- sklearn.tree 决策树与随机森林
- 2、用于回归的估计器:
- sklearn.linear_model.LinearRegression 线性回归
- sklearn.linear_model.Ridge 岭回归
- 3、用于无监督学习的估计器
- sklearn.cluster.KMeans 聚类
2、工作流程
将训练集的特征值(x_train)与目标值(y_train)传入估计器(estimator),通过estimator.fit其内部会生成一个模型?
![image-20240324205405154](https://img-blog.csdnimg.cn/img_convert/b4aa41a9824d7ef9422abe0cfc5921f3.png)
-
例化一个estimator
-
estimator.fit(x_train,y_train)计算
-
x:特征值 y:目标值
-
调用完毕,模型生成
-
-
模型评估:
-
直接比对真实值和预测值
-
y_predict =estimator.predict(x_test)
-
y_test ==y_predict
将测试集的特征值(x_test)传入预估器,生成预测的目标值(y_predict),再将预测的目标值与实际的目标值(y_test)对比
-
-
计算准确率
- accuracy=estimator.score(x_test,y_test)
-
三、K-近邻算法(KNN)
根据你的“邻居”来推断出你的类别
1. 原理
- 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
来源:KNN算法最早是由Cover和Hart提出的一种分类算法
k 值取得过小时,容易受到异常点的影响;k 值取得过大时,容易受到样本不均衡的影响
2. 距离公式
如何确定谁是“邻居”?计算距离
两个样本的距离可以通过如下公式计算,又叫欧式距离
![image-20240324210641148](https://img-blog.csdnimg.cn/img_convert/ffcbe645405fa5ded3c1e2d2d1eadbd4.png)
曼哈顿距离:绝对值距离
明可夫斯基距离
3. K-近邻算法API
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=‘auto’)
- n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数
- algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可选用于计算最近邻居的算法:‘ball_tree’将会使用 BallTree,‘kd_tree’将使用 KDTree。‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。 (不同实现方式影响效率)
4. 案例一:鸢尾花种类预测
![image-20240324211800193](https://img-blog.csdnimg.cn/img_convert/1516cd13ad714d5c906f6c850ab67b6a.png)
流程:
- 获取数据
- 数据集划分(训练集、测试集)
- 特征工程——标准化
- KNN预估器流程
- 模型评估
5. 总结
- 优点:简单,易于理解,易于实现,无需训练
- 缺点:
- 懒情算法,对测试样本分类时的计算量大,内存开销大
- 必须指定K值,K值选择不当则分类精度不能保证
- 使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试
四、模型选择与调优
1. 为什么要交叉验证
交叉验证目的:为了让被评估的模型更加准确可信
2. 什么是交叉验证(cross validation)
交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成4份,其中一份作为验证集。然后经过4次(组)的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。又称4折交叉验证。
3. 分析
我们之前知道数据分为训练集和测试集,但是为了让从训练得到模型结果更加准确。做以下处理:
- 训练集:训练集+验证集
- 测试集:测试集
![image-20240325104658257](https://img-blog.csdnimg.cn/img_convert/b604f1076dba2e0600a0d47368599eb3.png)
问题:那么这个只是对于参数得出更好的结果,那么怎么选择或者调优参数呢?
4. 超参数搜索-网格搜索(Grid Search)
通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。
5. 模型选择与调优API
- sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
- 对估计器的指定参数值进行详尽搜索
- estimator:估计器对象
- param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}
- cv:指定几折交叉验证
- fit():输入训练数据
- score():准确率
- 结果分析:
- 最佳参数:best_params_
- 最佳结果:best_score_
- 最佳估计器:best_estimator_
- 交叉验证结果:cv_results_
6. Facebook签到位置预测K值调优
五、朴素贝叶斯算法
1. 概率基础
- 概率(Probability)定义
- 概率定义为一件事情发生的可能性
- 扔出一个硬币,结果头像朝上
- 某天是晴天
- P(X) : 取值在[0, 1]
- 概率定义为一件事情发生的可能性
2. 联合概率、条件概率与相关独立
- 联合概率:包含多个条件,且所有条件同时成立的概率
- 记作:P(A,B)
- 特性:P(程序员,匀称)
- 条件概率:就是事件A在另外一个事件B已经发生条件下的发生概率
- 记作:P(A|B)
- 特性:P(程序员|喜欢)
- 相互独立:如果P(A,B)=P(A)P(B),则称事件A与事件B相互独立。
3. 朴素贝叶斯
贝叶斯公式:
朴素贝叶斯:简单理解,就是假定了特征与特征之间相互独立的贝叶斯公式。
也就是说,朴素贝叶斯,之所以朴素,就在于假定了特征与特征相互独立。
应用场景:文本分类(以单词作为特征)
![image-20240325152904089](https://img-blog.csdnimg.cn/img_convert/4798ae2c09a2be765f2432c4230f3ab6.png)
公式分为三个部分:
- P©:每个文档类别的概率(某文档类别数/总文档数量)
- P(W│C):给定类别下特征(被预测文档中出现的词)的概率
- 计算方法:P(F1│C)=Ni/N (训练文档中去计算)
- Ni为该F1词在C类别所有文档中出现的次数
- N为所属类别C下的文档所有词出现的次数和
- 计算方法:P(F1│C)=Ni/N (训练文档中去计算)
- P(F1,F2,…) 预测文档中每个词的概率
如果计算两个类别概率比较:
![image-20240325153803004](https://img-blog.csdnimg.cn/img_convert/a0b5cd2f28f9346496419b127d2d278e.png)
所以我们只要比较前面的大小就可以,得出谁的概率大
如果我们计算出来的某个概率为0时,是不合理的。
4. 拉普拉斯平滑系数
目的:防止计算出的分类概率为0
![image-20240325153929168](https://img-blog.csdnimg.cn/img_convert/68ba44cb0ae61a8573dde26cd4f3cbf3.png)
5. API
- sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
- 朴素贝叶斯分类
- alpha:拉普拉斯平滑系数
6.总结:
- 优点
- 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
- 对缺失数据不太敏感,算法也比较简单,常用于文本分类。
- 分类准确度高,速度快
- 缺点
- 于使用了样本属性独立性(假定了特征与特征之间相互独立)的假设,所以如果特征属性有关联时其效果不好
六、决策树
决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法
![image-20240325200346333](https://img-blog.csdnimg.cn/img_convert/73c13572c8a3ba45dc5ea68a507da0f4.png)
如何高效的进行决策?(找到最高效的决策顺序)特征的先后顺序
1. 信息论基础
-
信息:消除随机不定性的东西
- 小明 年龄 “我今年18岁” —— 信息
- 小华 ”小明明年19岁” —— 不是信息
-
信息熵:H的专业术语称之为信息熵,单位为比特。
-
决策树的划分依据之一------信息增益
- 信息增益 = 信息熵 — 条件熵
![image-20240327100513171](https://img-blog.csdnimg.cn/img_convert/d26a626b1dea6e444179955f7316c948.png)
2. 决策树的三种算法实现
当然决策树的原理不止信息增益这一种,还有其他方法。但是原理都类似,我们就不去举例计算。
- ID3
- 信息增益 最大的准则
- C4.5
- 信息增益比 最大的准则
- CART
- 分类树: 基尼系数 最小的准则 在sklearn中可以选择划分的默认原则
- 优势:划分更加细致(从后面例子的树显示来理解)
3. 决策树API
- class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
- 决策树分类器
- criterion:默认是’gini’系数,也可以选择信息增益的熵’entropy’
- max_depth:树的深度大小
- random_state:随机数种子
- 其中会有些超参数:max_depth:树的深度大小
- 其它超参数我们会结合随机森林讲解
4. 决策树可视化
-
保存树的结构到dot文件
- sklearn.tree.export_graphviz() 该函数能够导出DOT格式
- ree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])
- sklearn.tree.export_graphviz() 该函数能够导出DOT格式
-
[Graphviz Online (dreampuf.github.io)](https://dreampuf.github.io/GraphvizOnline
5. 总结
- 优点:
- 简单的理解和解释,树木可视化。(可视化,可解释能力强)
- 缺点:
- 决策树学习者可以创建不能很好地推广数据的过于复杂的树,这被称为过拟合。
- 改进:
- 减枝cart算法(决策树API当中已经实现,随机森林参数调优有相关介绍)
- 随机森林
注:企业重要决策,由于决策树很好的分析能力,在决策过程应用较多, 可以选择特征
七、集成学习方法之随机森林
集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成组合预测,因此优于任何一个单分类的做出预测。
在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。
例如, 如果你训练了5个树, 其中有4个树的结果是True, 1个数的结果是False, 那么最终投票结果就是True
1. 随机森林原理过程
训练集:特征值 + 目标值
随机:训练集随机、特征随机
学习算法根据下列算法而建造每棵树:
- 用N来表示训练用例(样本)的个数,M表示特征数目。
- 1、一次随机选出一个样本,重复N次, (有可能出现重复的样本)(随机有放回)
- 2、随机去选出m个特征, m <<M,建立决策树
- 采取bootstrap抽样
2. 为什么采用BootStrap抽样
- 为什么要随机抽样训练集?
- 如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的
- 为什么要有放回地抽样?
- 如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是“有偏的”,都是绝对“片面的”(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决。
3. API
-
class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’, max_depth=None, bootstrap=True, random_state=None, min_samples_split=2)
- 随机森林分类器
- n_estimators:integer,optional(default = 10)森林里的树木数量120,200,300,500,800,1200
- criteria:string,可选(default =“gini”)分割特征的测量方法
- max_depth:integer或None,可选(默认=无)树的最大深度 5,8,15,25,30
- max_features="auto”,每个决策树的最大特征数量
- If “auto”, then
max_features=sqrt(n_features)
. - If “sqrt”, then
max_features=sqrt(n_features)
(same as “auto”). - If “log2”, then
max_features=log2(n_features)
. - If None, then
max_features=n_features
.
- If “auto”, then
- bootstrap:boolean,optional(default = True)是否在构建树时使用放回抽样
- min_samples_split:节点划分最少样本数
- min_samples_leaf:叶子节点的最小样本数
-
超参数:n_estimator, max_depth, min_samples_split,min_samples_leaf
注意
- 随机森林的建立过程
- 树的深度、树的个数等需要进行超参数调优
4. 总结
- 在当前所有算法中,具有极好的准确率
- 能够有效地运行在大数据集上,处理具有高维特征的输入样本,而且不需要降维
- 能够评估各个特征在分类问题上的重要性