sklearn搭建线性模型的总结

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))

公式:(_{\theta - t})2  其中\theta表示真实值,t表示目标值

注意:训练模型需要做for循环,多次进行循环,得到最高分数的模型,然后保存模型。

4、测试模型

读取模型:

 # 导入血糖模型数据

lr = joblib.load("./model/blood.pkl")

#直接预测结果

y_lr_predict=lr.predict(value)

 5、模型测试好之后,就可以使用模型

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值