一、简介
最近互联网行情不太好,公司业务比较闲,恰好有空总结下:数据分析、工程、挖掘这三个模块的心得。这篇文章恰好是数据挖掘这部分的第1篇-线性回归。
二、代码说明
"""
Created on Thu Oct 31 14:09:55 2019
@author: yuzhou
"""
import sqlite3
import pandas
as pd
import numpy
as np
import matplotlib
.pyplot
as plt
from scipy
import stats
from sklearn
import linear_model
from sklearn
.externals
import joblib
def dataset(sql
):
con
=sqlite3
.connect
('SelfGrowth_Data_Mining.db')
df
=pd
.read_sql
(sql
, con
)
df
=df
.apply(pd
.to_numeric
,errors
='ignore')
return df
def export_model(model
):
joblib
.dump
(model
, 'lr.model')
def import_model(model_address
):
return joblib
.load
(model_address
)
def plot_result(test_y
):
plt
.subplot
(1,1,1)
plt
.plot
(np
.arange
(len(test_y
)), test_y
, 'r-', linewidth
=2, label
='True Value')
plt
.plot
(np
.arange
(len(test_y_pred
)), test_y_pred
, 'go-', linewidth
=2, label
='Prediction Value')
plt
.title
('The Effection of LinearModel', fontsize
=18)
plt
.text
(10, 20, 'PCC=%0.3f' % pearsonr_relationship
, fontsize
=15)
plt
.legend
(loc
='upper left')
plt
.grid
(b
=True, ls
=':')
plt
.show
()
if __name__
== "__main__":
sql
='select GDP, AREA, Sales from Linear_Regression_Model'
df
=dataset
(sql
)
x
= df
[['GDP', 'AREA']]
y
= df
['Sales']
train_x
= np
.array
(x
.loc
[0:299,])
train_y
= np
.array
(y
.loc
[0:299,])
test_x
= np
.array
(x
.loc
[300:,])
test_y
= np
.array
(y
.loc
[300:,])
model
= linear_model
.LinearRegression
(fit_intercept
=True,normalize
=True)
model
.fit
(train_x
[:,:],train_y
)
print('The Result of Linear_Model: %s\t%s' % (model
.coef_
, model
.intercept_
))
export_model
(model
)
model_address
='lr.model'
model
= import_model
(model_address
)
test_y_pred
= model
.predict
(test_x
[:,:])
pearsonr_relationship
= stats
.pearsonr
(test_y
,test_y_pred
)[0]
pearsonr_pvalue
= stats
.pearsonr
(test_y
,test_y_pred
)[1]
plot_result
(test_y
)
文件包括:python脚本、sqlite数据源、训练模型结果。具体可以通过以下“百度云盘”链接提取。 链接:https://pan.baidu.com/s/1ODY0EAbPm3v_sHTUwIdbWQ 提取码:saxu 复制这段内容后打开百度网盘手机App,操作更方便哦
代码过程:
模拟了一个房价评估场景,而评估特征只设定: 当地GDP和房屋面积(GDP、AREA字段,真实要衡量房价肯定不会这么简单了,那是一个浩大的工程,这里只是简单模拟下罢了)。其中的数据是我通过一定范围的随机数系数自动生成,房价(Sales)则是对特征变量和随机系数,再加截距计算得到,该数据集不用放在心上,都是自然生成。直接使用sklearn模块(在不考虑安全的情况下,开源确实是个好东西),对训练集进行模型训练,得到最终模型并导出,同时用剩余的25%的样本量作为测试集,通过皮尔森系数衡量最终的预测结果。对最后的结果做了一个简单的可视化,并导出相关系数(显著性就不展示了,小于1%);如果是具体的业务,你还应该加上总结、分析、建议,这是分析师必须要有的基本素养,否则就是拉数据的了。
三、线性回归算法原理
线性回归的原理很简单,只需要知道三点即可: 1、他的原理 模型公式很简单,在已知部分x、y的情况下,问题演变成了:怎么设置系数,可以使得回归模型预测其他类似场景更准确(泛化) 理论上我们可以构建无数个回归模型来进行预测,胖子里面挑选苗条的,所以有了回归函数还不行,还需要一个衡量效果的函数,即:代价函数。对于这个函数书上有很多讲解,不多说,只需要知道:通过预测结果减去实际结果的平方和(你也可以把它想象成绝对值)最小,他的系数θ就是最合理的(最小二乘法)。 所以,让这个代价函数最小吧! 至于怎么求解代价函数,一般是通过梯度下降来算的(简单来说:对凸函数,找到目前节点的一个方向往下走,然后不停迭代,走着走着你就到达山脚下了,比较类似于互联网业务,都是要不停迭代的)。梯度下降很简单,具体可以参考专门的资料,并用python进行一波模拟。 其他方法还有矩阵的逆,不多说。
2、他的评估方式
一般的指标有:MSE,RMSE,MAE,R Squared;推荐R Squared,毕竟无量纲更具有普世性。相关系数是值域介于-1, 1之间的数,绝对值越大说明两组数据越相似;而决定系数是R Squared。这里直接使用相关系数,即:PCC=0.832,显著性低于1%,模型预测效果不错。
3、他的门门道道(细节)
线性回归简单,直观,计算速度快。缺点就是,很容易欠拟合,即:你需要提前判断单纯通过一个多维的线是否能解决问题根据我的经验,纯线性的场景很少;比如:钱越多的人越大方,经济越发达的地方房价越高,读书越多成绩就越好,这种单纯的结论一看就有问题,纯模式在人间界很少的。
四、总结和续篇
线性回归,能解决一些问题,但多数情况下不能很好地去解决一些问题,所以我们需要其他地方法。 下一篇可能明天写,如果开完周会还有空地话。写什么呢?可能逻辑回归,嗯,先把线的事情解决,然后再总结其他的模型。
PS:比之于建模,我还是觉得数据分析更有意思,哈。