机器学习08经典算法

张开发
2026/4/15 23:28:13 15 分钟阅读

分享文章

机器学习08经典算法
选择推荐标准一 KNNK最近邻算法简称KNN。K-Nearest Neighbor意思是K个最近的邻居。思路特别简单就是随⼤流。对于需要贴标签的数据样本它总是会找⼏个和⾃⼰离得最近的样本也就是邻居看看邻居的标签是什么。如果它的邻居中的⼤多数样本都是某⼀类样本它就认为⾃⼰也是这⼀类样本。距离的远和近看特征向量在特征空间中的距离。在KNN和其他机器学习算法中常⽤的距离计算公式包括欧⽒距离和曼哈顿距离。欧⽒距离曼哈顿距离因此KNN算法的结果和K的取值有关系。from sklearn.neighborsimportKNeighborsClassifier# 导⼊KNN模型K5# 设定初始K值为5KNNKNeighborsClassifier(n_neighborsK)# KNN模型KNN.fit(X_train, y_train)# 拟合KNN模型y_predKNN.predict(X_test)# 预测⼼脏病结果from sklearn.metricsimport(f1_score, confusion_matrix)# 导⼊评估指标二支持向量机SVM超平⾯就是⽤于特征空间根据数据的类别切分出来的分界平⾯。⽀持向量就是离当前超平⾯最近的数据点。下图实例H0就是⽬前的超平⾯。与之平⾏的H1H2线上的特征点就是⽀持向量。SVM算法就是要在⽀持向量的帮助之下通过类似于梯度下降的优化⽅法找到最优的分类超平⾯——具体的⽬标就是令⽀持向量到超平⾯之间的垂直距离最宽称为“最宽街道”。from sklearn.svmimportSVC# 导⼊SVM模型svmSVC(random_state1)svm.fit(X_train, y_train)y_predsvm.predict(X_test)# 预测⼼脏病结果svm_accsvm.score(X_test, y_test)*100 print(SVM预测准确率: {:.2f}%.format(svm.score(X_test, y_test)*100))print(SVM预测F1分数 {:.2f}%.format(f1_score(y_test, y_pred)*100))print(SVM混淆矩阵\n, confusion_matrix(y_pred, y_test))普通的SVM分类超平⾯只能应对线性可分的情况对于⾮线性的分类SVM要通过核⽅法kernel method解决。⾸先通过某种⾮线性映射核函数对特征粒度进⾏细化将原始数据的特征嵌⼊合适的更⾼维特征空间然后利⽤通⽤的线性模型在这个新的空间中分析和处理模式这样将在⼆维上线性不可分的问题在多维上变得线性可分。三朴素贝叶斯朴素⻉叶斯是⼀个通过条件概率进⾏分类的算法。所谓条件概率就是在事件A发⽣的概率下B发⽣的概率。⽐如男80岁⾎压150mmHg这3个已发⽣的事件就是样本已知的特征。下⾯就需要进⾏⼆分类确定患病还是未患病。怎么办呢看⼀下训练数据集中满⾜这3个条件的数据有多少个然后计算概率和计算分布。假如还有3个同样是80岁的男⼈⾎压也是150mmHg两个有⼼脏病⼀个健康。此时算法就告诉我们应该判断这个⼈也有⼼脏病的概率⽐较⼤。数学公式即为在机器学习实践中可以将上⾯的公式拆分成多个具体的特征from sklearn.naive_bayesimportGaussianNB# 导⼊朴素⻉叶斯模型nbGaussianNB()nb.fit(X_train, y_train)y_prednb.predict(X_test)# 预测⼼脏病结果当没有太多数据并且需要快速得到结果时朴素⻉叶斯算法可以说是解决分类问题的良好选择。四决策树DT了解概念实际少用决策树Decision TreesDT可以应⽤于回归或者分类问题所以有时候也叫分类与回归树。将⼀⼤堆的if…else语句进⾏连接直到最后得到想要的结果。决策树中最看重什么先看什么。在信息学中熵entropy度量着信息的不确定性信息的不确定性越⼤熵越⼤。信息熵和事件发⽣的概率成反⽐。信息熵代表随机变量的复杂度也就是不确定性。条件熵代表在某⼀个条件下随机变量的复杂度。信息增益等于信息熵减去条件熵它代表了在某个条件下信息复杂度不确定性减少的程度。如果⼀个特征从不确定到确定这个过程对结果影响⽐较⼤的话熵不确定性减少得最多也就是信息增益最⼤就最先判断。书中例子先看脸是因为觉得脸好不好看这一特征从不确定到确定对相亲结果界定最大结果的不确定性大幅减少。决策树的深度和剪枝决策树算法⾮常容易过拟合。也就是说在训练集上只要分得⾜够细就能得到100%的正确结果然⽽在测试集上准确率会显著下降。因为将训练集的一些特例数据也学习到了条件中导致测试集不对劲。解决的⽅法是为决策树进⾏剪枝pruning有以下两种形式。先剪枝分⽀的过程中熵减少的量⼩于某⼀个阈值时就停⽌分⽀的创建。后剪枝先创建出完整的决策树然后尝试消除多余的节点。但是还是容易过拟合泛化能力差决策树很少独⽴作为⼀种算法被应⽤于实际问题。实际常用决策树经过集成的各种升级版的算法——随机森林、梯度提升树算法等。from sklearn.treeimportDecisionTreeClassifier# 导⼊决策树模型dtcDecisionTreeClassifier()dtc.fit(X_train, y_train)dtc_accdtc.score(X_test, y_test)*100 y_preddtc.predict(X_test)# 预测⼼脏病结果print(Decision Tree Test Accuracy {:.2f}%.format(dtc_acc))print(决策树 预测准确率 {:.2f}%.format(dtc.score(X_test, y_test)*100))print(决策树 预测F1分数 {:.2f}%.format(f1_score(y_test, y_pred)*100))print(决策树 混淆矩阵\n, confusion_matrix(y_pred, y_test))五随机森林决策树升级决策树很容易过拟合⽽随机森林的思路是把很多棵决策树的结果集成起来以避免过拟合同时提⾼准确率。其中每⼀棵决策树都是在原始数据集中抽取不同⼦集进⾏训练的尽管这种做法会⼩幅度地增加每棵树的预测偏差但是最终对各棵树的预测结果进⾏综合平均之后的模型性能通常会⼤⼤提⾼。构造过程假设我们有⼀个包含N个训练样本的数据集特征的维度为M随机森林通过下⾯算法构造树。1从N个训练样本中以有放回抽样replacementsampling的⽅式取样N次形成⼀个新训练集这种⽅法也叫bootstrap取样可⽤未抽到的样本进⾏预测评估其误差。2对于树的每⼀个节点都随机选择m个特征m是M的⼀个⼦集数⽬远⼩于M决策树上每个节点的决定都只是基于这些特征确定的即根据这m个特征计算最佳的分裂⽅式。3默认情况下每棵树都会完整成⻓⽽不会剪枝。算法有两个关键点⼀个是有放回抽样⼆是节点⽣成时不总是考量全部特征。from sklearn.ensembleimportRandomForestClassifier# 导⼊随机森林模型rfRandomForestClassifier(n_estimators1000, random_state1)rf.fit(X_train, y_train)rf_accrf.score(X_test, y_test)*100 y_predrf.predict(X_test)# 预测⼼脏病结果随机森林算法⼴泛适⽤于各种问题尤其是针对浅层的机器学习任务随机森林算法很受欢迎。六选择合适机器学习算法调参与优化内容参数是算法内部的权重和偏置⽽超参数是算法的参数例如逻辑回归中的C值、神经⽹络的层数和优化器、KNN中的K值都是超参数。算法的内部参数是算法通过梯度下降⾃⾏优化⽽超参数通常依据经验⼿⼯调整。利⽤Sklearn的⽹格搜索Grid Search功能可以为特定机器学习算法找到每⼀个超参数指定范围内的最佳值。from sklearn.model_selectionimportStratifiedKFold# 导⼊K折验证⼯具from sklearn.model_selectionimportGridSearchCV# 导⼊⽹格搜索⼯具kfoldStratifiedKFold(n_splits10)# 10折验证rfRandomForestClassifier()# 随机森林模型# 对随机森林算法进⾏参数优化rf_param_grid{max_depth:[None],max_features:[3,5,12],min_samples_split:[2,5,10],min_samples_leaf:[3,5,10],bootstrap:[False],n_estimators:[100,300],criterion:[gini]}rf_gsGridSearchCV(rf,param_gridrf_param_grid,cvkfold,scoringaccuracy,n_jobs10, verbose1)rf_gs.fit(X_train, y_train)# ⽤优化后的参数拟合训练数据集10个“后台⼯作者”开始分批同步对54种参数组合中的每⼀组参数⽤10折验证的⽅式对训练集进⾏训练因为是10折验证所以共需训练540次并⽐较试图找到最佳参数。

更多文章