机器学习--复健笔记
机器学习,即让计算机学习,是拟人的说法。
参考从机器学习谈起,(计算机的潜意识)十年前的博客,全文很形象,也讲得非常全面,输入这些信息我是不是也经历了一次潜意识的机器学习,哈哈。
1.机器学习的定义
从广义上来说,机器学习是一种能够赋予机器学习的能力以此让它完成直接编程无法完成的功能的方法。但从实践的意义上来说,机器学习是一种通过利用已有的数据,训练出模型,利用这个模型来预测未来的一种方法。
2.机器学习的应用范围
与模式识别、统计学习、数据挖掘类似,同时机器学习与其他领域的处理技术相结合,形成了计算机视觉、语音识别、自然语言处理等交叉学科。
3.机器学习的算法
3.1 回归算法
回归算法比较简单,介绍它可以让人平滑地从统计学迁移到机器学习中,它有两个重要的子类:即线性回归和逻辑回归。
两者的区别在于,线性回归处理的问题类型与逻辑回归不一致。线性回归处理的是数值问题,也就是最后预测出的结果是数字;而逻辑回归属于二分类算法,预测结果是离散的分类,例如判断这位病人疾病是否复发等。
实现方面,逻辑回归只是对线性回归的计算结果加上了一个Sigmoid函数,将数值结果转化为了0到1之间的概率,接着我们可以根据这个概率做预测,比如说>0.5就判定为复发,<0.5就判定为不复发。从直观上来说,逻辑回归是画出了一条分类线。
3.2 逻辑回归python实现
先对数据进行处理,调用panda
库把特征和标签分别分为X和Y,然后训练集测试集分类。
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=1)
调用库函数:from sklearn.linear_model import LogisticRegression
,设置一下参数如penalty(正则化防止过拟合的惩罚参数)等,建立对象。用训练集进行训练
model = LogisticRegression()#默认参数
model.fit(x_train, y_train)
训练出的结果,即建好的模型对test测试集进行预测,计算ROC曲线
y_pred = model.predict(x_test)
predictions_validation = model.predict_proba(xtest)[:,1]
fpr, tpr, _=roc_curve(ytest, predictions_validation)
roc_auc = auc(fpr, tpr)
最后用matplotlib库可视化,加上图例、标签、刻度什么的。
总结:逻辑回归思路简单,适用于分类场景;但分类精度不高,数据特征空间很大时表现效果并不好。
3.3 K-近邻算法
KNN全称是 K Nearest Neighbors,意思是K个最近的邻居, KNN算法中,所选择的邻居都是已经被正确分类的样本,然后我们测试集中的样本如何分类呢?很简单,依据距离它最近的K个样本是什么类别来判断该样本属于什么类别(多数投票)。
实现可以按照原理手搓,遍历计算欧式距离,递增排序等,也可以调库:
from sklearn.neighbors import KNeighborsClassifier
需要注意K值的确定很重要,这是一个超参数,对模型的性能影响很大,可以用交叉验证等方法来选择最优的K值。例如knn = KNeighborsClassifier(n_neighbors=9, weights='uniform', p=1)
,然后fit训练,predict预测。
3.4 随机森林算法
随机森林(Random Forest, RF)是一种集成学习算法(Ensemble Leaning),它是由多个决策树构成的分类器,可以用于分类和回归分析。
在分类问题中,每个决策树的输出结果为一个类别标签,通过投票来确定样本所属的类别。在回归问题中,每个决策树的输出结果为一个连续值,取所有决策树输出结果的平均值作为最终结果。
算法原理:RF算法的核心思想是“集成学习”,即将固定数量和不同特征的决策树集成起来,使其具有较高的预测性能和鲁棒性。RF的优点就在于它可以处理高维度数据、可以处理不平衡数据集、缺失值、可以评估特征的重要性、可以在大规模数据集上高效的训练和预测。
3.4.1 一颗决策树构造的具体步骤
-
step1:从样本集中通过有放回抽样方式抽取训练集样本;
-
step2:从所有自变量中通过无放回抽样方式随机抽取k个自变量,其中k远小于m。抽取的自变量集合可以表示为\(\{f1, f2, …, fk\}\)。
-
step3:使用选定的样本和特征来构建一个决策树,并且在每个节点处,都选择一个最好的特征进行分裂,以最大化它们的信息增益。通常,这种方法会一直进行下去,直到每个叶子节点都只包含一个样本。
然后重复step1-3操作T次,就生成了T棵决策树。这种基于样本和特征随机选取的决策树被称为随机决策树,而通过在随机森林中集成多个随机决策树,可以获得准确率更高的分类结果。最终,随机森林的分类结果是基于所有决策树的投票结果而计算出的。
3.4.2 RF算法实现
调用sklearn库的库函数,然后建立对象,其中一些参数的含义可以注意一下。
from sklearn.ensemble import RandomForestClassifier
#选用随机森林模型
rfc=RandomForestClassifier(
criterion='gini',
n_estimators=100,
min_samples_split=2,
min_samples_leaf=2,
max_depth=10,
random_state=6)
rfc=rfc.fit(xtrain,ytrain)
predictions_validation = rfc.predict_proba(xtest)[:,1]
fpr, tqr, _=roc_curve(ytest, predictions_validation)
roc_auc = auc(fpr, tqr)
3.5 朴素贝叶斯算法
朴素贝叶斯(Native_Bayes)是一种简单经典的分类算法。朴素贝叶斯模型假设属性之间相互独立,在属性之间相关性较大时,分类效果较差,只适用特征之间条件独立的情况。它的原理就是概率论当中的条件概率公式。
3.5.2 sklearn 朴素贝叶斯类库
在sklearn中,一共有3个朴素贝叶斯的分类算法类,分别是GaussianNB、MultinomialNB和BernoulliNB。三个类的适用场景各不相同,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好;样本特征是多元离散值,使用MultinomialNB;样本特征是二元离散值,使用BernoulliNB合适。
3.6 支持向量机算法
如下图所示,中间那条线是\(wx+b=0\),logistic回归强调所有点尽可能地远离中间那条线,学习出的结果也就是中间那条线。而SVM算法更关心靠近中间分割线的点,让它们尽可能的远离中间线,这样模型的正确率能更有提升。
支持向量机是一种二类分类模型,给定一组训练实例,每个训练实例被标记为属于两个类别中的一个或另一个,SVM训练算法创建一个将新的实例分配给两个类别之一的模型,使其成为非概率二元线性分类器。
线性可分的SVM,对于二维空间来说,我们可以找到一条线,将两个不同类别的样本划分开来,那么就说这个样本集是线性可分的。这里再解释一下超平面的概念,在数学上,我们将超过三维的曲面统称为超平面。超平面的公式为:
线性不可分的SVM,对于线性不可分的数据集,Vapinik提出一种观点,我们所认为的线性不可分,只是在当前维度下线性不可分,但不代表在高维的特征空间中线性不可分,当维数趋于无穷时,一定存在一个这样的超平面,可以将不同类型的样本线性分割开来。所以处理线性不可分问题,基本思想就是从低维映射到高维,通过公式,大概含义例如有一个100维的数据,映射至5000维。
3.7 LightGBM算法
LightGBM(Light Gredient Boosting Machine)是微软开源的一个实现GBDT(Gredient Boosting Decision Tree)算法的框架,支持高效率的并行训练。GBDT是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。
关于原理的介绍,简单来说,LightGBM是一个基于直方图的决策树算法,它通过直方图统计每个特征的最佳分割点、单边梯度采样、互斥特征捆绑、**带深度限制的Leaf-wise的叶子生长策略、cache命中优化等,进一步提升传统的梯度提升决策树的性能。
3.7.1 LightGBM接口
有原生接口、sklearn风格的接口两种,其中的一些重要参数包括boosting_type、objective、min_child_samples、learning_rate/eta、max_depth、num_leaves
等,注意LightGBM同样能输出特征重要性排序,它对于信息增益不大的叶结点将停止扩展下一层结点,因此树深度越大的相应特征对于模型的学习更重要。
关于LightGBM的调参思路,详情见参考博客。
生活不易啊,蛙蛙叹气,SVM算法的数学原理要全部理解至少得花个5天自己推算,主要就是超平面的最优化,如何找到一个分割面把样本集最近的样本点离这个线性分割面最远,还有涉及到噪点、惩罚参数、软分割之类的,现在先留个印象,以后来学习。