一、多项式回归(Polynomial Regression)介绍

1、多项式回归属于线性回归,和简单线性回归不同的是,函数包含 x 的次方,可以拟合出曲线。函数如图所示:

2、多项式回归的简单范例

https://www.geeksforgeeks.org/python-implementation-of-polynomial-regression/

以温度和压强关系为例,做多项式回归分析。

3、简单范例:

第一步:导入数据

# Importing the libraries 
import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd 
# Importing the dataset 
datas = pd.read_csv('data.csv') 

datas

第二步:切分数据集

X = datas.iloc[:, 1:2].values

y = datas.iloc[:, 2].values

第三步:多项式回归拟合

# Fitting Polynomial Regression to the dataset 
from sklearn.preprocessing import PolynomialFeatures 
  
poly = PolynomialFeatures(degree = 4) 
X_poly = poly.fit_transform(X) 
  
lin2 = LinearRegression() 
lin2.fit(X_poly, y) 

这张图显示的是,选取4次方,如果X是1到10的列向量,那么poly.fit_transform(X)的结果如下:

范例是0 20 40 60 80 100的列向量,那么fit_transform后,就是每列的值的1、2、3、4次方。

第四步:可视化

# Visualising the Polynomial Regression results 
plt.scatter(X, y, color = 'blue') 
  
plt.plot(X, lin2.predict(poly.fit_transform(X)), color = 'red') 
plt.title('Polynomial Regression') 
plt.xlabel('Temperature') 
plt.ylabel('Pressure') 
  
plt.show() 

第五步:多项式回归函数预测

# Predicting a new result with Polynomial Regression 
lin2.predict(poly.fit_transform(110.0)) 

二、多项式回归(Polynomial Regression)应用于运维

  • 项目名称:SAEGW用户数多项式回归拟合
  • 目的及效果:
  1. 利用多项式回归(Polynomial Regression)研究时间和用户数之间关系,并预测未来几天走势情况。
  2. 用户趋势与实际用户数差距过大,可用于发现现网是否出现故障。
  3. 无法确定预测未来某一时刻的用户数,但是多项式回归可以帮助运维分析用户数趋势,如果实际增长和预测趋势相异,那么网络必定存在故障。

预期结果,红色部分是预测值,深绿浅绿是实际值:

第一步:提取SAEGW用户数据

提取多个厂家的用户数,可以通过FTP或者读取数据库。将数据清洗后,将不同厂家,不同数据库的数据集成到本地数据库。

第二步:基于Python的预测

  • 提取本地前X天的数据,利用Python的 scikit-learn机器学习库,对SAEGW用户数进行拟合。

1、读取数据库

from sqlalchemy import create_engine

engine = create_engine('mysql+pymysql://username:[email protected] address:port/fzwdata')

sql = '''
SELECT pool_id,datatimestr,sum(sgwusers),sum(pgwusers)
FROM `saegw_users`,`saegw_name`
WHERE DATEDIFF(datatimestr,NOW())<=0 
AND DATEDIFF(datatimestr,NOW())>-6 
AND ggsnname = database_name and pool_id in (1,2,3,4)
GROUP BY pool_id,datatimestr
ORDER BY datatimestr
      '''
# read_sql_query的两个参数: sql语句, 数据库连接
dataset = pd.read_sql_query(sql, engine)

2、获取X轴时间戳,Y轴 SGW用户数和PGW用户数

pool1 = dataset[dataset.pool_id==1]
pool2 = dataset[dataset.pool_id==2]
pool3 = dataset[dataset.pool_id==3]
pool4 = dataset[dataset.pool_id==4]

# X 是时间戳,时间格式转换
X1 = pool1.iloc[:,1:2].values.astype(np.int64)/ 10 ** 9
X2 = pool2.iloc[:,1:2].values.astype(np.int64)/ 10 ** 9
X3 = pool3.iloc[:,1:2].values.astype(np.int64)/ 10 ** 9
X4 = pool4.iloc[:,1:2].values.astype(np.int64)/ 10 ** 9

pool_id_x1 = pool1.iloc[:,0:1].values
pool_id_x2 = pool2.iloc[:,0:1].values
pool_id_x3 = pool3.iloc[:,0:1].values
pool_id_x4 = pool4.iloc[:,0:1].values

#获取SGW用户数
sgwy1 = pool1.iloc[:,2].values
sgwy2 = pool2.iloc[:,2].values
sgwy3 = pool3.iloc[:,2].values
sgwy4 = pool4.iloc[:,2].values
#获取PGW用户数
pgwy1 = pool1.iloc[:,3].values
pgwy2 = pool2.iloc[:,3].values
pgwy3 = pool3.iloc[:,3].values
pgwy4 = pool4.iloc[:,3].values

3、通过数据集做多项式回归拟合

poly_reg_sgw1 = PolynomialFeatures(degree = 4)
poly_reg_pgw1 = PolynomialFeatures(degree = 4)

#sgw
X_poly_sgw1 = poly_reg_sgw1.fit_transform(X1)
lin_reg_sgw1 = LinearRegression()
lin_reg_sgw1.fit(X_poly_sgw1, sgwy1)

#pgw
X_poly_pgw1 = poly_reg_pgw1.fit_transform(X1)
lin_reg_pgw1 = LinearRegression()
lin_reg_pgw1.fit(X_poly_pgw1, pgwy1)


4、使用生成的拟合函数预测未来三天的用户数

(1)生成未来三天的时间戳

today = datetime.date.today()
tomorrow = today + datetime.timedelta(days=1)
yesterday_end_time = int(time.mktime(time.strptime(str(today), '%Y-%m-%d'))) - 1
today_start_time = yesterday_end_time + 1
daysToCome = []
#863 = 3days * 60min / 5per
for i in range(0,864):
    daysToCome.append(today_start_time+i*300)
df1 = pd.DataFrame({'future3ds':daysToCome})

df1['future3ds'] = 1;
print(df1)
#change to matrix
t1 = df1.values #all 1
#t + X1
all_time1 = np.vstack((X1,t))
all_pool_id1 = np.vstack((pool_id_x1,t1))

(2)利用时间戳生成预测数据

predictSgw1Values = lin_reg_sgw1.predict(poly_reg_sgw1.fit_transform(all_time1))
predictPgw1Values = lin_reg_pgw1.predict(poly_reg_pgw1.fit_transform(all_time1))

(3)现网数据及预测数据一起存入数据库

stampTimeItemAll1=[]
for stampTimeItem in all_time1:
    stampTimeItemAll1.append(datetime.datetime.utcfromtimestamp(stampTimeItem))
#save data to db
df_save = pd.DataFrame({'datatime_predict':stampTimeItemAll1,
'pool_id':all_pool_id1.tolist(),'sgw_users_predict':predictSgw1Values.tolist(),
'pgw_users_predict':predictPgw1Values.tolist()})
df_save.to_sql('pool_users_predict', engine,  if_exists = 'replace', index= False)

第三步:定时执行程序

每日凌晨定时执行拟合程序,执行后将预测数及现网数据存入数据库。

crontab –l

#每天7:00 执行程序,生成预测的用户数

0 7 * * * /home/hadoop/myproject/crontabFiles/runPridictUsers.sh

runPridictUsers.sh:

#!/bin/bash
source /home/hadoop/myproject/aivenv/bin/activate 
python /home/hadoop/myproject/polynomialRegression/pridictUsers.py
deactivate

第四步:数据展示

利用HighCharts进行数据展示,画出未来三天的用户趋势。www.highcharts.com

三、多项式回归(Polynomial Regression)总结

  • 线性回归在采集数据量不足的情况下不太准,需要持续采集一年以上的数据。但是用户数趋势分析可以看出本侧网元是否存在影响用户的故障。
  • 对用户数预测可以尝试采用Holt-Winters模型、ARIMA模型。
  • 对用户数的数据展示,可以通过热力图的方式结合位置区进行展示。
  • 可以选择在一张图中画出各指标的情况。比如用户数、流量、告警数的趋势情况,便于分析用户数、流量、告警之间的走势关系。



发表评论

电子邮件地址不会被公开。 必填项已用*标注