机器学习小白学习笔记之scikit-learn
最近刚把西瓜书啃完,一大堆理论让脑子真的是一团浆糊,说实话看的基本只有一个概念哈哈哈,效果不高,但是让我对与机器学习真的是整体有了一个大的了解,但是并没能将每个课后作业都完成,甚至很多公式推导也没实现,太难了,让我着手于实践,古人云实践出真知,又拿起了另一本书《Introduce to Mashine Learning with python》
昨天上一节,学习完了knn分类回归,这一节继续往下学,自然而然地学到线性模型,线性模型在实际运用中还是相当广泛的。
用于回归的线性模型:
单一特征的预测结果是一条直线,双特征是一个平面,而高维度的则是一个超平面。
我们继续来看最常见的线性回归模型:
线性回归(普通最小二乘法)
线性回归寻找最佳的参数w(斜率、权重、系数),和b(截距),使得对训练集的预测值与真hide回归目标值y之间的均方误差最小。
在高位数据集中,线性模型将体现的更加强大,但同时会产生过拟合风险,根据书本,通过波士顿房价数据集进行预测。
我们会发现一个情况:
测试集的分数远远低于训练集的分数,显而易见就是产生了过拟合,所以我们应该找到一个可以控制复杂度的模型,标准线性回归最常用的替代方法之一就是岭回归。
岭回归
其实预测方法和最小二乘法相同,但是做了一下正则化(附带上拟合约束,希望系数尽可能小,让每个特征对输出的影响最小化)。这里用到的是L2正则化,这个不理解的可以去百度一下。
我们通过岭回归进行训练预测,可以看到效果十分显著:
因为我们现实中一般都关注泛化性能,所以理所应当选择岭回归。
我们可以通过控制岭回归方法中的alpha系数来调节模型,alpha越大使得各特征系数越接近0,越小使得约束越小,我这里写了一个循环来尝试一下。
我写了100个循环来调参,从0.01-1.0,大家可以看到,最高就是0.77,到后面就是走下坡路啦。下面这幅图也可以看出来:
那我们继续向下学习:
我们把岭回归和线性回归在波士顿房价数据集上的学习曲线拿出来分析一波:
这幅图可以看到,随着模型的数据越来越多,两个模型的性能都再提升——这里可以得到一个现象,如果有足够多的训练数据,正则化变得不太重要,岭回归和线性模型将具有同样的性能。
lasso
另一种正则化的回归,跟岭回归有点不一样的是这里用的是L1正则化,L1正则化的结果是,使用lasso时某些系数刚好为0,其实就是把重要而特征自动筛选出来,有的系数直接为零。
我们把lasso同样运用到lasso上,发现,存在严重的欠拟合现象,而且只用到了4个特征。
同样lasso也有一个alpha参数,我们接下来看一下不同的alpha系数对于lasso回归于岭回归比较:
现实中,一般会首先岭回归,但如果特征很多,而且有很多冗余的特征,那选择lasso回归可能会更好。书上讲到,ElasticNet类,结合了lasso和Ridge 的惩罚项,效果最好,不过腰调节两个参数,一个L1,一个L2.后面就来学学用于分类的线性模型。
用于分类的线性模型
学习线性模型有多种算法,算法的却别在于两点:
- 系数和截距的特定组合对训练数据拟合好坏的度量方法(损失函数loss)
- 是否使用正则化,以及使用哪种正则化方法
最常见的线性分类算法是logistic回归和svm(线性支持向量机),我们将连个模型应用到forge数据集上,将线性模型找到的决策边界可视化:
两个模型都默认使用了L2正则化,对于logistic和svm决定正则化强度的权衡参数叫C,C值越大,对应正则化越弱,训练集尽可能将训练机拟合的越好,泛性肯定也会下降;相反,同样道理。
较小的c值可以让算法尽量适应大多数数据点,较大的更强调每个据点都分类正确的重要性。
后面就讲到了多分类问题,其实大多数线性分类模型只适用于而分类问题,不能轻易推广到多分类问题。江而分类算法推广到多分类算法的一种常见方法就是一对多余,乍一听有点抽象,我们从代码入手,可视化一对多问题:
将每个类别与其他类别当作二分类问题来划分,得到后,判断测试集在哪个区域的置信度最高就归类于哪个类,通俗的说就看测试点在这些直线划分的哪一个区域,就是哪一类,在中间么就是看最靠近哪条线,就是对应的类别啦,用颜色填充判决类别之后就会更加清晰:
最后根据书上的总结来一个结尾:
线性模型主要参数就是正则化参数,回归模型中叫alpha,在svc和logistic中叫做C;通常在对数尺度上对C和alpha进行搜索,同时不要忘记L1和L2的区别,选择好正则化的方式也非常重要。
线性模型的训练速度非常快,预测速度也很快,这种模型可以推广到非常大的数据集,对于稀疏数据集也非常有用噢。如果数据集有上十万甚至有上百万个样本,到时候可以研究如何使用模型中的solver=‘sag’选项,在处理大型数据是,这一个选项比默认要快。
学到这里已经将西瓜书里面和自己看的论文都消化了一点点啦,虽然让我自己去解决一个真是问题还比较难,不过感觉已经提升很多了,实践出真知真的非常有用哈哈哈。继续加油,接下来就学到朴素贝叶斯了!