【线性回归算法】小案例之确诊病例数据预测(只用于理解预测算法理解)

import pandas as pd   # 用来读取数据的一个包. 
from sklearn.linear_model import LinearRegression  # 机器学习的包  用来做线性回归的-> 用咱们的数据帮我们求出一个函数
from sklearn.preprocessing import  PolynomialFeatures  # 机器学习的包 ..... 高次幂
import matplotlib.pyplot as plt  # 数据可视化-> 用来画图的
import numpy as np        # 做矩阵. 


data = pd.read_csv("data.csv", header=None)  # 读取数据
data["time"] = pd.to_datetime(data[0])   # 排序处理
print(data.head())
          0         1     2          time
0  2020-1-31  2102  5019 2020-01-31
1  2020-1-25   688  1309 2020-01-25
2  2020-1-24   444  1118 2020-01-24
3  2020-1-30  1982  4812 2020-01-30
4  2020-1-26   769  3806 2020-01-26

# 索引改成时间
data.index = data["time"]
data = data.sort_index()
print(data.head())
                                  0    1     2       time
time                                       
2020-01-20  2020-1-20   77    27 2020-01-20
2020-01-21  2020-1-21  149    26 2020-01-21
2020-01-22  2020-1-22  571   393 2020-01-22
2020-01-23  2020-1-23  259   680 2020-01-23
2020-01-24  2020-1-24  444  1118 2020-01-24


# 计算每天的确诊的总数量
totle = data[1].cumsum()  # 获取到确诊病例. 然后进行累积计算 前1, 2,3,4,5,项累加
print(totle)
time
2020-01-20       77
2020-01-21      226
2020-01-22      797
2020-01-23     1056
2020-01-24     1500
2020-01-25     2188
2020-01-26     2957
2020-01-27     4728
2020-01-28     6187
2020-01-29     7924
       。              。
       。              。
       。              。


# x轴是数字 使用时间不好使用机器学习的包
totle = totle.reset_index()[1]   #  去掉时间, 把时间转化成数字. 方便计算, 2020-1-20
totle.index = totle.index + 1
print(totle)
1        77
2       226
3       797
4      1056
5      1500
6      2188
7      2957


plt.scatter(totle.index, totle)   # 画散点图. 展示一下目前确诊病例数量
plt.show()
1:线性回归线:

# 一元一次线性回归
liner_reg = LinearRegression() # 创建线性回归对象

x_data = totle.index[:, np.newaxis]    # 增加维度, 拿到x

y_data = totle[:, np.newaxis]              # 增加维度, 拿到y

liner_reg.fit(x_data, y_data) # 数据训练

plt.scatter(x_data, y_data) # 画点
plt.plot(x_data, liner_reg.predict(x_data), "red") # 画回归线. 预测线, liner_reg.predict(x_data) 把x_data的值扔进去. 得到回归线上的y值

plt.show() # 展示数据

# 斜率 截距
# k b
# y = kx + b
# liner_reg.coef_, liner_reg.intercept_

2:线性回归的预测曲线:

# 区别于 以下两步是为了求出高幂次方程的x的固定值,比如方差,平均值等, 求出后的x_data_poly 抛到预测fit里面训练,最后画图直接扔liner_reg.predict(x_data_poly)即可

 poly = PolynomialFeatures(3) # 计算N幂次的公式 # degree=4   ax2+bx+c   ax3+bx2+cx1+dx0  升幂 1元二次方程 # 1.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00  0次方  1次方  2次方 3次方

 x_data_poly = poly.fit_transform(x_data) # 1 0. 2 1.4 2. 8 3.

liner_reg = LinearRegression() # 线性回归对象
liner_reg.fit(x_data_poly, y_data) # 数据训练
# x0, x1, x2, x3, y???
# dx0+cx1+bx2+ax3 = y

 plt.plot(x_data, liner_reg.predict(x_data_poly), "r") # 画图

# 预测值
plt.scatter(np.arange(1,50), liner_reg.predict([[i**0, i**1, i**2, i**3] for i in np.arange(1,50)])) # 几次幂就填几个i**n

plt.show()


 PS总结思路:创建训练数据与测试数据,使用sklearn的linear_model包进行对数据训练,会得到一个对应的算法公式,对于公式进行传入自变量x,就会得到一个因变量y,接着绘制图即可



原文地址:https://www.cnblogs.com/wanghong1994/p/13411968.html