Multivariate Exploratory Data Analyses(EDA)#

Exploratory Data Analyses (EDA) 叫做数据探索性分析,是用来在对时间序列处理前先进行数据

单变量时间序列是有多个变量的(除时间外)的序列,下面我们考虑单变量时间序列的EDA问题

导入时间序列#

import pandas as pd
df=pd.read_csv('TexasTurbine.csv')

# 打印前二十行
df.head(20)

导入必要的包#

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
plt.style.use("Solarize_Light2")  #using style ggplot

%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D
import datetime as dt
import plotly.graph_objects as go
import plotly.express as px
import datetime as dt

获取数据点的数量(数据描述的时候使用)#

df.shape

获取数据的类型#

df.info()

把Timestamp转化为strftime类型#

df['Time stamp'] = pd.to_datetime(df['Time stamp'], format='%b %d, %I:%M %p').dt.strftime('%b %d %H:%M:%S.%f')

检查数据集缺失的值#

df.isnull().sum()

检查数据集中重复出现的值(实际上我们并不想要)#

# 输出重复数据的数量
df.duplicated().sum()

# 用布尔值说明数据是否重复(最开始的那一个显示False) 
df.duplicated() 

# 筛选病展示重复数据
df[df.duplicated()]

# 去掉重复的数据 
df.drop_duplicates()

获取数据集的每一列的统计信息#

# round(2) 保留小数点后两位
df.describe().round(2)

添加一列特征(特征工程的基础)#

# 添加一列特征,这个特征是月份
df["Month"]=df["Time stamp"].dt.month

显示特征工程后的序列的信息#

df.info()

使用两列画出散点图(使用散点图画出时间序列)#

plt.figure(figsize=(17,8))

# Time stamp是一列
# System power generated | (kW) 是一列
sns.scatterplot(data=df,x="Time stamp",y="System power generated | (kW)",)
plt.title("Effect the time by the system power")
plt.show()

设置索引并且在原来的数据上更改#

# 索引是列名为Time stamp的列
df.set_index("Time stamp",inplace=True)

划分预测的值和特征#

这是由于特征和目标在同一个数据列表里面,所以需要分开

# X 是特征
X = df.drop(columns="System power generated | (kW)")  

# y 是要预测的量
y = df["System power generated | (kW)"]    # y = system power generated 

划分数据集#

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=42)

# 打印数据的数量,注意y应该是形如(2628,),而X应该是形如(6132,5),5是特征数
# 5当中 不包含timestamp这一列
print("X Train : ", X_train.shape)
print("X Test  : ", X_test.shape)
print("Y Train : ", y_train.shape)
print("Y Test  : ", y_test.shape)

定义模型: 这里使用tensorflow来实现#

LR = LinearRegression()
DTR = DecisionTreeRegressor()
RFR = RandomForestRegressor()
KNR = KNeighborsRegressor()
MLP = MLPRegressor()
XGB = XGBRegressor()
SVR = SVR()

对已经定义好的模型实行预测,并且输出MSE的误差值#

# 不同的训练好的模型
li = [LR,DTR,RFR,KNR,KNR,XGB,SVR]

# 误差列表
d = {}
for i in li:

    # 进行预测
    i.fit(X_train,y_train)

    #计算误差
    ypred = i.predict(X_test)

    # 打印出来误差
    print(i,":",r2_score(y_test,ypred)*100)

    # 保存误差
    d.update({str(i):i.score(X_test,y_test)*100})

打印每种预测模型的误差#

plt.figure(figsize=(30, 6))
plt.title("Algorithm vs Accuracy")
plt.xlabel("Algorithm")
plt.ylabel("Accuracy")
plt.plot(d.keys(),d.values(),marker='o',color='red')
plt.show()

使用自定义函数来计算误差#

# 得到预测序列
ypred_xgb=XGB.predict(X_test)

# 计算误差
import math
from sklearn.metrics import mean_squared_error
math.sqrt(mean_squared_error(y_test,ypred_xgb))

Tensorflow保存模型#

import pickle 
pickle.dump(XGB,open('model.pkl','wb'))

挑选出一个#

# 导入对应的包
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Flatten

df.head()
df1=df.reset_index()['System power generated | (kW)']
df1.shape