基於python3-sklearn,Flask 的回歸預測系統


看到一副圖片挺有意思,放在片頭
這里寫圖片描述

“傍晚小街路面上沁出微雨后的濕潤,和煦的西風吹來,抬頭看看天邊的晚霞,嗯明天又是一個好天氣。走到水果攤旁,挑了個根蒂蜷縮、敲起來聲音濁響的青綠西瓜,一邊滿心期待着皮薄肉厚瓤甜的爽落感,一邊愉快地想着,這學期狠下了工夫,基礎概念弄得很清楚,算法作業也是信手拈來,這門課成績一定差不了!”

上面的經驗是靠我們人類自身完成的,計算機能幫忙么?機器學習正是這樣一門學科,它致力於研究如何通過計算的手段,利用經驗來改善系統自身的性能。

現在各行各業強調使用大數據手段進行數據分析,大數據的上帝視角帶給我們的核心競爭力是對於個體甚至群體行為的預測,那么我們就來看看使用回歸類算法對於數值型的數據如何來進行預測

什么是回歸?

優點:結果易於理解,計算上不復雜。
缺點:對非線性的數據擬合不好。
適用數據類型:數值型和標稱型數據。

使用算法:使用回歸,可以在給定輸入的時候預測出一個數值,這是對分類方法的提升,因為這樣可以預測連續型數據而不僅僅是離散的類別標簽

回歸的一般方法:
(1)收集數據:采用任意方法收集數據;
(2)准備數據:回歸需要數值型數據,標稱型數據將被轉換成二值型數據;
(3)分析數據:繪出數據的可視化二維圖,有助於對數據做出理解和分析。在采用縮減法求得新回歸系數后,可以將新擬合線繪在圖上進行對比;
(4)訓練算法:找到回歸系數;
(5)測試算法:使用R2(相關系數的平方)或頂測值和數據的擬合度,來分析模型的效果;
使用算法:使用回歸,可以在給定輸入的時候預測出一個數值,這是對分類方法的提升,因為這樣可以預測出連續型數據而不僅僅是離散型的類別標簽

原理簡介
普通最小二乘法(ordinary least squares)

問題:如何知道sklearn擬合公式的參數結果是多少y=ax+b怎么知道a,b?

#

線性回歸(Linear regression)是利用稱為線性回歸方程的最小二乘函數(最小化誤差平方和)對一個或多個自變量和因變量之間關系進行建模的一種回歸分析。這種函數是一個或多個稱為回歸系數的模型參數的線性組合。只有一個自變量的情況稱為簡單回歸,大於一個自變量情況的叫做多元回歸。


典型業務場景

假設一路公交,在其始發站每小時會來很多人等車,坐車人數會和很多因素相關(天氣,是否節假日)。
為了方便調度人員預測下一個小時,或者當天的坐車人數,可以采用回歸算法制作基於時間的預測系統。

可能要有的功能

1.出現異常增量時候的預警,異常增量,概念的定義。
2.預測值和真實值的差別

數據准備

history 表中記錄了所有公交卡歷史記錄

建表語句,從已經采集的數據中構建,主要為兩列

create table t_hour_count ( quantity varchar2(128) time_frame varchar2(128) );

其中人的主要標識為公交卡(id),我們從公交卡的記錄表history中將每小時坐車的人篩選出來,由於只要數量,所以只要group_by之后再 去重再count

create table t_hour_count as select count(distinct ta.id) quantity, group_by time_frame from (select tt.*, to_char(tt.update_time, 'yyyymmddhh24') group_by from (select * from history where id in (select distinct id from t_公交卡 tc where tc.type = '公交')) tt where update_time > to_date('20170716 00:00:00', 'yyyymmdd hh24:ss:mi') and update_time < to_date('20170721 00:00:00', 'yyyymmdd hh24:ss:mi')) ta group by ta.group_by order by group_by;

這里寫圖片描述

參考代碼

python鏈接oracle 的簡單框架

#coding = utf-8
import cx_Oracle
import time
import json

import os
os.environ['NLS_LANG']='SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
#-----------------------connect oracle-------------------------------
username = '**'
password = '**'
ip = '*.*.*.*'
service_name = '*'

def getConnOracle(username,password,ip,service_name):
    try:
        conn = cx_Oracle.connect(username+'/'+password+'@'+ip+'/'+service_name)  # 連接數據庫
        return conn
    except Exception:
        print(Exception)

conn = getConnOracle(username, password, ip, service_name)

def getOracleSelect(conn):

    cursor = conn.cursor()
    try:
        sqlString = "select time_frame,quantity from t_hour_count order by time_frame"
        sqlresult = cursor.execute(sqlString)  # 使用cursor進行各種操作
        result = sqlresult.fetchall()
        return result

    except cx_Oracle.DatabaseError as msg:
        print(msg)
    finally:
        cursor.close()
#---------------------------------- 

自定義數據指標統計

計算一段時間的均值,最大,最小等指標

#---------------------------------------------------------------------------------------------- 
def my_average(result_list = []):
    sumvalue = 0
    if len(result_list)==0:
        return 0
    for i in result_list:
        sumvalue = i[1] + sumvalue
    return int(sumvalue/len(result_list))

#add 'my' to declare this function is user-defined
def my_min(result_list = []):
    if len(result_list)==0:
        return 0
    valuelist  = [i[1] for i in result_list]
    return min(valuelist)

def my_max(result_list = []):
    if len(result_list)==0:
        return 0
    valuelist  = [i[1] for i in result_list]
    return max(valuelist)

def generateAllresult():

    localtime = time.localtime()

    all_result = [list(i) for i in getOracleSelect(conn)]
    all_result_time = [[(time.strptime(i[0],"%Y%m%d%H")),i[1]] for i in all_result]
    all_result_time_today = [i  for i in all_result_time if  i[0].tm_yday > localtime.tm_yday-1]
    all_result_time_yesterday = [i  for i in all_result_time if i[0].tm_yday < localtime.tm_yday and i[0].tm_yday > localtime.tm_yday-2]

    all_result_time_thedaybeforeyesterday = [i  for i in all_result_time if i[0].tm_yday < localtime.tm_yday-1 and i[0].tm_yday > localtime.tm_yday-3]

    all_result_time_last3day = [i  for i in all_result_time if i[0].tm_yday < localtime.tm_yday and i[0].tm_yday > localtime.tm_yday-4]

    all_result_time_last7day = [i  for i in all_result_time if i[0].tm_yday < localtime.tm_yday and i[0].tm_yday > localtime.tm_yday-8]

    all_result_time_lastweekthisday = [i  for i in all_result_time if i[0].tm_yday < localtime.tm_yday-6 and i[0].tm_yday > localtime.tm_yday-8]

    my_dict = {"all_result":all_result_time,"today":all_result_time_today,"yesterday":all_result_time_yesterday,"before_yesterday":all_result_time_thedaybeforeyesterday,"last3day":all_result_time_last3day,"last7day":all_result_time_last7day,"lastweekthisday":all_result_time_lastweekthisday}
    my_result_dict = {}
    for item in my_dict:
        #print(my_dict[item])
        #print(len(my_dict[item]))
        my_result_dict[item] = [my_average(my_dict[item]),my_max(my_dict[item]),my_min(my_dict[item])]
    #print(my_result_dict)
    return my_result_dict


Flask頁面展示

還有一個3js需要下載

整個項目的目錄結果如下圖所示:
在windows上cmd中居然也有tree命令,使用tree /f顯示如下結構:

這里寫圖片描述

頁面html:

 <title xmlns="http://www.w3.org/1999/html">monitor.com</title> <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Highstock Example</title> <script type="text/javascript" src="../static/js/jquery-1.8.2.min.js"></script> <style type="text/css"> ${demo.css} </style> <script type="text/javascript"> $(function () { $.getJSON('/data?callback=?', function (data) { // Create the chart $('#container').highcharts('StockChart', { rangeSelector: { inputEnabled: $('#container').width() > 480, selected: 1 }, title: { text: '人數情況小時統計' }, series: [{ name: '人數情況小時統計', data: data, type: 'spline', tooltip: { valueDecimals: 2 } }] }); }); }); </script> </head> <p> <script src="../static/js/2.js"></script> <script src="../static/js/3.js"></script> <div id="container" style="height: 400px"></div> <script type="text/javascript"> $(function () { $.getJSON('/predict?callback=?', function (data) { }); }); </script> <p>{{"統計概況"}}</p> <table border="1"> <tr> <td>日期</td> <td> 平均值 </td> <td>最大值</td> <td>最小值</td> </tr> {%for key in mydict%} <tr> <td>{{key}}</td> <td>{{mydict[key][0]}}</td> <td>{{mydict[key][1]}}</td> <td>{{mydict[key][2]}}</td> </tr> {%endfor%} </table> <img src="../static/sample.png" width="640" height="480"> </body> </html> 


from flask import Flask, request, render_template

app = Flask(__name__)
@app.route("/", methods=["GET", "POST"])
def hello():
    if request.method == "GET":
        today_Regression()
        return render_template("mon.html",mydict=generateAllresult())
    else:
        return "post method is not define"


@app.route("/data", methods=["GET"])
def getdata():
    #today_Regression()
    ones = [[(time.strptime(i[0],"%Y%m%d%H")), i[1]] for i in getOracleSelect(conn)]
    ones = [[time.mktime(i[0])*1000+28800000,i[1]] for i in ones]
    return "%s(%s);" % (request.args.get('callback'), json.dumps(ones))

''' '''

sklearn 回歸預測



#-------------------------------------------------------------------------------------- from sklearn import linear_model import numpy as np import matplotlib.pyplot as plt import pandas as pd #dataset = pd.read_csv('CSV.csv') #x is time ,y is people like [[1],[2],[3]] def my_Regression(X_array=[[]],Y_array=[[]]): X = np.array(X_array) y = np.array(Y_array) print (type(X)) from sklearn.preprocessing import PolynomialFeatures poly_reg = PolynomialFeatures(degree = 2) X_poly = poly_reg.fit_transform(X) lin_reg_2 = linear_model.LinearRegression() lin_reg_2.fit(X_poly,y) print(lin_reg_2.intercept_) X_grid = np.arange(min(X),max(X),0.1) X_grid = X_grid.reshape((len(X_grid),1)) plt.scatter(X,y,color = 'red') plt.plot(X_grid,lin_reg_2.predict(poly_reg.fit_transform(X_grid)),color = 'blue') plt.title('predict(2-Polynomial Regression)') plt.xlabel('time') plt.ylabel('people count') plt.savefig("./static/sample.png",dpi=200) #plt.show() def today_Regression(): localtime = time.localtime() all_result = [list(i) for i in getOracleSelect(conn)] all_result_time = [[(time.strptime(i[0],"%Y%m%d%H")),i[1]] for i in all_result] all_result_time_today = [i for i in all_result_time if i[0].tm_yday > localtime.tm_yday-1] X_array = [[time.mktime(i[0])] for i in all_result_time if i[0].tm_yday > localtime.tm_yday-1] Y_array = [i[1] for i in all_result_time_today] my_Regression(X_array,Y_array) if __name__ =='__main__': app.run(host="0.0.0.0", port=55555, debug=True)

使用一天的數據繪制一個二次函數,保存到本地作為一張圖片
這里寫圖片描述
但是sklearn怎么輸出二次函數的參數呢,我一直沒有找到


未完待續,將來將這個小項目共享出來
js文件下載地址:

1:
http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js
2:2.js
http://cdnjs.cloudflare.com/ajax/libs/highstock/2.0.4/highstock.js

3:3.js
http://code.highcharts.com/modules/exporting.js

大數據框架下的回歸預測
官方文檔
http://spark.apache.org/docs/latest/ml-classification-regression.html#regression
中文翻譯
http://www.apache.wiki/display/Spark/ML+Pipelines
python接口:
http://spark.apache.org/docs/latest/api/python/pyspark.ml.html#module-pyspark.ml.regression

spark mllib 全面介紹:
http://www.cnblogs.com/shishanyuan/p/4747761.html

python實現:
http://www.cnblogs.com/adienhsuan/p/5654481.html

學習筆記:
http://www.cnblogs.com/charlotte77/p/5518368.html

參考文獻

機器學習實戰,第八章
周志華,機器學習


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM