机器学习的领域有两个不同的方向,一个是算法研究,另一个是将算法应用在实际的场景中。由于算法研究本身的门槛较高,绝大部分从事机器学习领域的工程师都是应用机器学习技术去解决实际问题。更简单的说,就是弄清楚各种机器学习工具如何使用(包括和算法的关系),然后使用这些现有的工具去解决实际问题。
以最简单的一元线性回归为例,它的假设函数形式是:
当我们使用scikit-learn这个python库的时候,你会发现没有叫theta的参数啊!!!如果你跟着Andrew Ng学过他的Machine Learning课程,知道向量theta就是我们要训练的模型的参数。如果你老老实实还完成过编程习题,还会记得用梯度下降算法实现时还需要把向量theta作为函数参数计算cost funtion。
为啥这些在scikit-learn中都找不到了呢?
因为这完全就是两个方向!!Andrew Ng教的相当好,可是他教的是机器学习算法及实现,scikit-learn库是一个写好的机器学习算法库,你不是要再用它实现一次机器学习算法,而是直接用。
使用scikit-learn库进行一元线性回归的学习时,代码可以简化到令人难以相信的程度,本质上就两个语句(不包括载入数据和检查结果这些输入输出处理辅助操作):
regr = linear_model.LinearRegression()
regr.fit(X, Y)
第一句创建线性回归模型的对象,第二句是使用训练集数据训练线性模型。然后,一切都结束了,模型训练好了,你可以直接使用这个模型对新的数据进行预测。
regr.predit(X)
可是训练好的参数到底长什么样?仔细阅读scikit-learn的手册1.1. Generalized Linear Models:
对比之前的假设函数,你就明白了,原来intercept_和coef_就是参数:
你兴高采烈的将regr.intercept_和regr.coef_参数打印出来,得到了
对比一下Ng老师的练习题,为啥这两个参数值和编程习题里的值不同呢?想没想过,Ng老师练习题中用的是gradient descent算法,是迭代接近,不是最优解。scikit-learn是实际应用的机器学习包,不能搞个接近就结束了,必须要直接给出它的最优解。
不相信吗?你可以用Octave实现一下Normal Equtation算法,得到的参数就是:
-3.895781和1.193034
总结
机器学习算法和应用是两个不同的方向,关注机器学习技术在实际中的应用才是大部分工程师努力的方向。
参考资料:
[1] Machine Learning Course by Andrew Ng in Coursera. (Programming Exercise 1: Linear Regression)
领取专属 10元无门槛券
私享最新 技术干货