记得群主在青葱的大学岁月,经常从图书馆贪婪地借书。我不喜欢在冬天或夏天去图书馆蹭空调自习,觉得太舒服了(事实是不喜欢扎堆排队),而喜欢在破旧又有年代感的自习室里蒸着桑拿或瑟瑟发抖学着习。没错,就是这么自虐。说到图书馆,暑假是可以借十本书的。我经常为这十本书斟酌一下午。记得一次我拿了《居里夫人自传》,还有《C++ programming》之类的英文原版装逼书。走过计算机类书架,我无法不注意到其中竟默默地躺着一些《数据仓库》、《数据挖掘》之类不知所云的书。我的第一感觉是好土,不想碰。我想,这是一群DBA看的书吧(DBA不要打我)?我的目标是成为一枚闪闪发光的程序员啊。所以我连第一页都没翻开,就让那些智慧尘封在图书馆里变黄变脆……再回首已百年身,十年过去,数据已成为黄金在互联网世界流动,而数据挖掘也有了掘金的新贵意味。如果能穿越,我会回到那个吊扇吱呀作响的图书馆,拿上十本《数据挖掘从入门到卧室》,《数据仓库从小工到专家》,然后诚恳地塞进我自己手里说:“少年,认真看吧,不亏。”
时光如白驹过隙,如今很多大学的计算机本科生已把Python作为必修课程了,大数据也作为一个全新专业强势入驻各知名高校。让我们seize the day,立刻、马上数据挖掘吧!
1探索并可视化房价数据
波士顿房价数据下载链接:https://pan.baidu.com/s/1c1X4Aje
代码下载链接(拷贝到ipython notebook中运行):https://pan.baidu.com/s/1mhQ298O
属性说明:
1. CRIM per capita crime rate by town 每个城镇人均犯罪率
2. ZN proportion of residential land zoned for lots over
25,000 sq.ft. 超过25000平方尺用地划为居住用地的百分比
3. INDUS proportion of non-retail business acres per town 非零售商用地百分比
4. CHAS Charles River dummy variable (= 1 if tract bounds
river; 0 otherwise) 是否被河道包围
5. NOX nitric oxides concentration (parts per 10 million) 氮氧化物浓度
6. RM average number of rooms per dwelling 住宅平均房间数目
7. AGE proportion of owner-occupied units built prior to 1940 1940年前建成自用单位比例
8. DIS weighted distances to five Boston employment centres 5个波士顿就业服务中心的加权距离
9. RAD index of accessibility to radial highways 无障碍径向高速公路指数
10. TAX full-value property-tax rate per $10,000 每万元物业税率
11. PTRATIO pupil-teacher ratio by town 小学师生比例
12. B 1000(Bk - 0.63)^2 where Bk is the proportion of blacks
by town 黑人比例指数
13. LSTAT % lower status of the population 低层人口比例
14. MEDV Median value of owner-occupied homes in $1000's 业主自住房屋中值 (要预测的变量)
数据分析的第一步是进行探索性数据分析 (Exploratory Data Analysis, EDA),理解变量的分布与变量之间的关系。
从图中看出:
-
RM 和 MEDV 似乎是有线性关系的;
-
MEDV 类似 normal distribution。
-
对与 MEDV correlation 高的变量感兴趣,LSTAT 最高(-0.74), 其次是 RM (0.7)。
-
但从之前的图看出 MEDV 与 LSTAT 呈非线性关系,而与 RM 更呈线性关系,所以下面选用 RM 来演示简单线性回归。
2梯度下降法
机器学习算法中经常会求x的一组系数w(为向量),使得损失函数J(w)最小。损失函数可以理解为实际值y和理论值的误差平方和(为了求导方便往往乘上1/2)。最小化损失函数时,梯度下降(Gradient Descent)是最常采用的方法之一。
在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T,简称grad f(x,y)或者▽f(x,y)。
梯度下降法是一个最优化算法,通常也称为最速下降法。许多有效算法都是以它为基础进行改进和修正而得到的。最速下降法是用负梯度方向为搜索方向的,最速下降法越接近目标值,步长越小,前进越慢。
Wiki上的解释为如果目标函数 F(x)在点 a处可微且有定义,那么函数 F(x)在点 a 沿着梯度相反的方向 −∇F(a)下降最快。其中, ∇为梯度算子,。
设定起始点的负梯度方向 (即损失函数值减小的方向) 为搜索方向,寻找最小值。梯度下降法越接近目标值,步长越小,前进越慢。
= (w0+w1*x1+w2*x2+......+wn*xn)
下面我们来手写一个梯度下降算法的类:
发现在 epoch 5之后 cost 基本就不能再减小了。
3使用scikit-learn的LinearRegression建模
我们也可以直接使用scikit-learn.linear_model模块中的LinearRegression类来实现线性回归建模:
本来这周想先来点数据挖掘导论过渡一下,但我想大家应该已经等不及了。而且直面困难是实现进步的最快方法。所以为大家呈现了本次又干又硬的课程。希望大家慢慢消化。下周我们学习如何建立对outlier不敏感的健壮线性回归模型,敬请期待:)