实战说明

本次实战为,使用一些常用的回归模型对数据集做出预测,绘制预测结果是否符合要求。

本次实战的回归模型有:

  • Linear Regression(线性回归)
  • Decision Tree Regressor(决策树回归)
  • SVM Regressor(支持向量机回归)
  • K Neighbors Regressor(K近邻回归)
  • Random Forest Regressor(随机森林回归)
  • Adaboost Regressor(Adaboost 回归)
  • Gradient Boosting Random Forest Regressor(梯度增强随机森林回归)
  • bagging Regressor(bagging 回归)
  • ExtraTree Regressor(ExtraTree 回归)

共9种回归模型

 

数据集

使用自制的动态血糖监测数据作为数据集,数据维度为(4793,2)。

数据格式为:动态血糖值,检测时间点(时间戳)


目录

开始

载入相关库

数据预处理

使用一元线性回归检验数据集

多元模型定义

开始预测

Linear Regression(线性回归)

Decision Tree Regressor(决策树回归)

SVM Regressor(支持向量机回归)

K Neighbors Regressor(K近邻回归)

Random Forest Regressor(随机森林回归)

Adaboost Regressor(Adaboost 回归)

Gradient Boosting Random Forest Regressor(梯度增强随机森林回归)

Bagging Regressor(Bagging 回归)

ExtraTree Regressor(ExtraTree 回归)

结论

数据集和代码


 

开始

载入相关库

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 正常显示中文
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 正常显示符号
from matplotlib import rcParams
rcParams['axes.unicode_minus']=False

from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

载入模型库

#Linear Regression
from sklearn import linear_model
model_LinearRegression = linear_model.LinearRegression()
#Decision Tree Regressor
from sklearn import tree
model_DecisionTreeRegressor = tree.DecisionTreeRegressor()
#SVM Regressor
from sklearn import svm
model_SVR = svm.SVR()
#K Neighbors Regressor
from sklearn import neighbors
model_KNeighborsRegressor = neighbors.KNeighborsRegressor()
#Random Forest Regressor
from sklearn import ensemble
model_RandomForestRegressor = ensemble.RandomForestRegressor(n_estimators=20)
#Adaboost Regressor
from sklearn import ensemble
model_AdaBoostRegressor = ensemble.AdaBoostRegressor(n_estimators=50)
#Gradient Boosting Random Forest Regressor
from sklearn import ensemble
model_GradientBoostingRegressor = ensemble.GradientBoostingRegressor(n_estimators=100)
#bagging Regressor
from sklearn.ensemble import BaggingRegressor
model_BaggingRegressor = BaggingRegressor()
#ExtraTree Regressor
from sklearn.tree import ExtraTreeRegressor
model_ExtraTreeRegressor = ExtraTreeRegressor()

 

数据预处理

载入数据集

data = pd.read_csv('DynamicBloodGlucoseData.csv',index_col=0)
data.head()

分类模型改回归 分类数据回归模型_数据集

 

划分数据集,分为特征(X_train)和标签(y_train)。

X_train = data['dateline'].values.reshape(-1, 1)
y_train = data['blood_sugar'].values

由于时间戳的点过多,且时间戳对于血糖预测没有帮助,将时间戳转化为指定时间格式(小时分钟),因为血糖值和每天的时间点有关系。

import time

# 时间戳转字符串时间
def  stamp2str(stamp,strTimeFormat="%Y-%m-%d %H:%M:%S"):
    """
    常用的时间格式:"%Y-%m-%d %H:%M:%S"
    参数:
    stamp:int 时间戳
    return:时间字符串
    """
    return time.strftime(strTimeFormat,time.localtime(stamp))

for i in range(len(X_train)):
    X_train[i] = int(stamp2str(X_train[i],strTimeFormat="%H%M"))

数据预处理完毕。

 

使用一元线性回归检验数据集

model_LinearRegression.fit(X_train,y_train)
y_pred = model_LinearRegression.predict(X_train)
plt.figure(figsize=(14,4))
plt.scatter(X_train, y_train, color='g')
plt.plot(X_train, y_pred, color='r')
plt.xlabel('time(0000-2400)')
plt.ylabel('blood glucose value')

分类模型改回归 分类数据回归模型_实战演练_02

数据集基本没问题,就是一元线性回归不能成功拟合数据集的数据特征,需要使用多元化。

 

多元模型定义

使用PolynomialFeatures方法对特征数据进行多元化,然后使用np.linspace方法生成测试使用的线性空间进行制做回归图像。

def model_function(regr):
    pf = PolynomialFeatures(degree=7)
    regr.fit(pf.fit_transform(X_train),y_train)
    X_predict = np.linspace(0, 2400, 1440)
    X_predict_result = regr.predict(pf.transform(X_predict.reshape(X_predict.shape[0], 1)))
    plt.figure(figsize=(14,4))
    plt.scatter(X_train, y_train, color='g')
    plt.plot(X_predict, X_predict_result, 'r-')
    plt.xlabel('time(0-24)')
    plt.ylabel('blood glucose value')

这里先使用7元的,这个可以调整,调整到最适合的回归曲线。degree过高容易过拟合,合适即可。

 

开始预测

Linear Regression(线性回归)

model_function(model_LinearRegression)

分类模型改回归 分类数据回归模型_机器学习_03

 

Decision Tree Regressor(决策树回归)

model_function(model_DecisionTreeRegressor)

分类模型改回归 分类数据回归模型_机器学习_04

 

SVM Regressor(支持向量机回归)

model_function(model_SVR)

分类模型改回归 分类数据回归模型_实战演练_05

 

K Neighbors Regressor(K近邻回归)

model_function(model_KNeighborsRegressor)

分类模型改回归 分类数据回归模型_机器学习_06

 

Random Forest Regressor(随机森林回归)

model_function(model_RandomForestRegressor)

分类模型改回归 分类数据回归模型_机器学习_07

 

Adaboost Regressor(Adaboost 回归)

model_function(model_AdaBoostRegressor)

分类模型改回归 分类数据回归模型_机器学习_08

 

Gradient Boosting Random Forest Regressor(梯度增强随机森林回归)

model_function(model_GradientBoostingRegressor)

分类模型改回归 分类数据回归模型_回归模型_09

 

Bagging Regressor(Bagging 回归)

model_function(model_BaggingRegressor)

分类模型改回归 分类数据回归模型_回归模型_10

 

ExtraTree Regressor(ExtraTree 回归)

model_function(model_ExtraTreeRegressor)

分类模型改回归 分类数据回归模型_回归模型_11

 

结论

从以上的模型拟合程度直观分析得出以下结果:

  • 欠拟合:Linear Regression、SVM Regressor、Adaboost Regressor
  • 过拟合:K Neighbors Regressor、Random Forest Regressor、Bagging Regressor
  • 拟合程度最好的模型:Decision Tree Regressor、Gradient Boosting Random Forest Regressor、ExtraTree Regressor

其中Gradient Boosting Random Forest Regressor拟合程度最为优秀

分类模型改回归 分类数据回归模型_回归模型_09

此次实战测试只使用了degree=7,如有兴趣可以尝试其他值,直到大多数模型拟合度较高时degree为最优值。

 

数据集和代码

代码和数据集都存在在我的github中

本次实战的github项目地址:https://github.com/935048000/bloodGlucosePredict

有错误欢迎大家指出,Thank you !