Python与数据挖掘-线性回归算法总结

一、简介

最近互联网行情不太好,公司业务比较闲,恰好有空总结下:数据分析、工程、挖掘这三个模块的心得。这篇文章恰好是数据挖掘这部分的第1篇-线性回归。
 

二、代码说明

# -*- coding: utf-8 -*-
"""
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

# import dataset to dataframe and revise them to number
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__":
    #import dataset
    sql='select GDP, AREA, Sales from Linear_Regression_Model'
    df=dataset(sql)
    
    #divided dataset into training and test sets 
    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:,])
    
    #by using sklearn to train the model and print the result
    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_))
    
    #import and export model
    export_model(model)
    model_address='lr.model'
    model = import_model(model_address)
    
    #by using pearsonr value to see the relationship between the true value and predicted value
    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 the final result to see the efficiency 
    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:比之于建模,我还是觉得数据分析更有意思,哈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值