突然来了需求,逼着我学习了线性回归,并写了个Demo

Posted liangxublog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了突然来了需求,逼着我学习了线性回归,并写了个Demo相关的知识,希望对你有一定的参考价值。

  线性回归在百度百科的解释:线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = w‘x+ee为误差服从均值为0的正态分布。

  设备监测值随着时间序列变化的趋势,按照上面的解释,我们要找到YX,才能得到回归的方程。很清楚,Y代表着设备监测值,X代表着时间序列。按照线性回归的话。可得到方程为:

    Y = aT + b    Y为设备监测值的预测值,T相当于时间序列。

 

  我们的目标就是求出a和b的值,画出预测值关于时间序列的线,就能够得到预测值相对于时间的趋势。问题时预测值肯定会出现误差,那么如何体现误差呢?

 

 一、体现预测值误差的方法

  同过上述方程式。我们能得到某个时间点的预测值,通过数据库存的数据我们能够得到实际值。那么,我们假设在某个T时间点,预测值为Y,实际值为Y。那么我们能得到残差为:Y-Y

  如果在理想状态下,我们取无数个时间节点,我们就能得到这些节点的时间残差集合,然后我们取平均,得到残差均值ε。公式为:

                                  技术图片

1.1

残差均值ε就能体现误差的大小,ε越趋向于0,预测越精准。

  想要更加准确我们可以通过以下方法进行误差计算,当然会比较复杂:

技术图片 

图 1.2

 

  得出cp就可以通过下表得出预测模型的精度等级:

技术图片 

1.3

 

二、代码演示

import time
from sklearn import datasets, linear_model, discriminant_analysis
import numpy as np
import matplotlib.pyplot as plt
import pymssql


def conn():
    connect = pymssql.connect(ip, sa, ******, test)  # 服务器名,账户,密码,数据库名
    if connect:
        print("connect successfully!!")
    return connect


def getArry():
    connect = conn()
    cursor = connect.cursor()  # 创建一个游标对象,python里的sql语句都要通过cursor来执行
    sql = "select * from * where * = ‘**‘"
    cursor.execute(sql)  # 执行sql语句
    row = cursor.fetchone()  # 读取查询结果,
    factor_list = []
    target_list = []
    while row:
        factor_list_ele = []
        target_list_ele = []
        factor_list_ele.append(int(time.mktime(time.strptime(str(row[0]), "%Y-%m-%d %H:%M:%S")))) #时间戳存进去
        target_list_ele.append(row[1])
        factor_list.append(factor_list_ele)
        target_list.append(target_list_ele)
        row = cursor.fetchone()

    return factor_list,target_list

def load_data():
    diabetes = getArry()  # 导入数据
    diabetes_X_train = diabetes[0][:-75]  # 取39000个样本作为训练样本
    diabetes_X_test = diabetes[0][-75:]  # 后475个作为测试样本
    diabetes_y_train = diabetes[1][:-75]  # 同理
    diabetes_y_test = diabetes[1][-75:]
    return diabetes_X_train, diabetes_y_train, diabetes_X_test, diabetes_y_test


def test_LinearRegrssion(*data):
    data = load_data()
    regr = linear_model.LinearRegression()
    regr.fit(data[0], data[1])  # 利用训练样本进行训练
    plt.scatter(data[2], data[3], c=red)  # 将测试样本集画出来
    plt.plot(data[2], regr.predict(data[2]), color=blue, linewidth=2)
    print(系数:%s,截距:%.2f % (regr.coef_, regr.intercept_))
    print("平均方差值:%.2f" % np.mean((regr.predict(data[2]) - data[3]) ** 2))  # 均方误差
    print(得分:%.2f % regr.score(data[2], data[3]))  # 得分,值越接近1,效果越好,也可为负数,训练效果很差的情况下
    plt.grid()
    plt.show()


test_LinearRegrssion()

 

三、Demo分析

1. 运行准备工作和运行环境

  语言:Python

  模块介绍:numpy--矩阵计算模块,sklearn--机器学习模块,matplotlib--绘图模块

  数据来源:公司服务器

  数据量:39475 39450作为训练数据 25 作为测试数据

 

2. Demo演示结果

趋势图:

   技术图片


结果:

  得分越趋近于1,预测越精准。平均方差值越趋近于0,预测越精准。

 

 

心得体会:估计还得换个模型继续看看吧,这个失败了。

 

 

 

图1.1  1.2  1.3 来自:《煤矿灾害风险预警的方法及模型》--黄竟文

 

以上是关于突然来了需求,逼着我学习了线性回归,并写了个Demo的主要内容,如果未能解决你的问题,请参考以下文章

园子的商业化努力-开篇:绝境求商

三天爆肝快速入门机器学习:线性回归逻辑回归岭回归第三天

机器学习笔记—再谈广义线性模型

如何自己实现简单的Google深度学习框架TensorFlow?

机器学习系列6 使用Scikit-learn构建回归模型:简单线性回归多项式回归与多元线性回归

深度学习入门:线性回归模型