1、获取数据分析数据
先用flask请求mysql数据库,从数据库获取数据,并保存到csv文件
去读数据库数据
from flask import Flask,Response, json
from flask_sqlalchemy import SQLAlchemy
from flask import jsonify
from MyEncoder import MyEncoder
from DateEncoder import DateEncoder
import csv
app = Flask(__name__)
db = SQLAlchemy(app)
......中间代码省略
if __name__ == '__main__':
app.run()
保存csv文件
def writeCVS(user):
# 1. 创建文件对象
f = open('blood.csv', 'w', encoding='utf-8')
# 2. 基于文件对象构建 csv写入对象
csv_writer = csv.writer(f)
# 3. 构建列表头
csv_writer.writerow(["id号", "性别", "体重","身高","年龄","血糖值"])
# 4. 写入csv文件内容
for i in user:
csv_writer.writerow(i)
# 5. 关闭文件
f.close()
2、数据清洗,去除掉为空或者none的数据,保存为模型可以读取的数据格式
{data:[[]......],target:[]},以字典的方式读取数据
def readcvs():
birth_data = []
with open('blood.csv',encoding='utf-8') as csvfile:
csv_reader = csv.reader(csvfile) # 使用csv.reader读取csvfile中的文件
birth_header = next(csv_reader) # 读取第一行每一列的标题
for row in csv_reader: # 将csv 文件中的数据保存到birth_data中
if len(row) !=0:
birth_data.append(row)
#对样本数据进行改造
data=[]
target=[]
blood={}
for k in birth_data:
list = []
# luss = []
for i,j in enumerate(k):
if i == 1 or i == 2 or i == 3:
list.append(j)
elif i == 4:
age = time_tools(j)
list.append(age)
elif i == 5:
target.append(j)
data.append(list)
# target.append(luss)
blood['data'] = np.array(data)
blood['target'] = np.array(target)
return blood
3、搭建sklearn线性模型
#血糖建模数据的预测
# 线性回归和梯度下降
from sklearn.linear_model import LinearRegression, SGDRegressor
# 数据集的切分
from sklearn.model_selection import train_test_split
# 数据的标准化
from sklearn.preprocessing import StandardScaler
# 均方差
from sklearn.metrics import mean_squared_error
import csv
import numpy as np
import datetime
#保存模型和加载模型
#from sklearn.externals import joblib(这个报错,改为下面的)
import joblib
import sys
def train():
"""
线性回归直接预测血糖值
:return: None
"""
# 获取数据
lb = readcvs()
# print(lb)
# 分割数据集到训练集和测试集,按照75%:25%的比例进行数据分配训练数据和测试数据
x_train, x_test, y_train, y_test = train_test_split(lb['data'], lb['target'], test_size=0.25)
# 正规方程求解方式预测结果
lr = LinearRegression()
# 对训练数据进行拟合
lr.fit(x_train, y_train)
# 查看w的参数
print(lr.coef_)
# 查看b的参数
print(lr.intercept_)
# 保存训练模型
y_lr_predict = lr.predict(x_test)
score_ = lr.score(x_test, y_test)
print('模型得分', score_)
# 保存血糖模型数据
if score_ > 0.18:
joblib.dump(lr, "./model/blood.pkl")
return score_
A:数据集的划分
# 数据集的切分
from sklearn.model_selection import train_test_split
# 分割数据集到训练集和测试集,按照75%:25%的比例进行数据分配训练数据和测试数据 x_train, x_test, y_train, y_test = train_test_split(lb['data'], lb['target'], test_size=0.25)
B:训练模型的保存和读取
import joblib #保存模型 joblib.dump(lr, "./model/blood.pkl") # 导入血糖模型数据 lr = joblib.load("./model/blood.pkl") #直接预测结果 y_lr_predict=lr.predict(value)
C:模型的一些参数解释
拟合线:
y = wx + b
#回归系数
w = model.coef_
#截距
b = model.intercept_
预测测试模型的得分:
fit.score(x_test, y_test)
预测:
fit.predict(x_test)
输出一个目标预测值
D:数据预处理(标准化==归一化)
# 数据的标准化 from sklearn.preprocessing import StandardScaler # 特征值和目标值都必须进行标准化处理, 实例化两个标准化API # 标准化也就是归一化处理 std_x = StandardScaler() # 标准化训练数据 x_train = std_x.fit_transform(x_train) # 标准化测试数据 x_test = std_x.transform(x_test) # 目标值 std_y = StandardScaler() # 标准化目标训练数据(因为数据是[y,y,1,1,1,1,...]变换成[[],[],[],[],[]...])进行变换 #reshape(-1, 1),表示行和列,一列,行自动匹配(该维度根据其他维度来定) y_train = std_y.fit_transform(y_train.reshape(-1, 1)) # 标准化目标测试数据(同上) y_test = std_y.transform(y_test.reshape(-1, 1))
E:使用均方误差最小,来进行训练
print("正规方程的均方误差: ", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))公式: 其中表示真实值,t表示目标值
注意:训练模型需要做for循环,多次进行循环,得到最高分数的模型,然后保存模型。
4、测试模型
读取模型:
# 导入血糖模型数据
lr = joblib.load("./model/blood.pkl")
#直接预测结果
y_lr_predict=lr.predict(value)
5、模型测试好之后,就可以使用模型