模型
import pandas as pd
import numpy as np
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, WhiteKernel, DotProduct
import matplotlib.pyplot as plt
import seaborn as sns
from pyDOE import *
from scipy.stats.distributions import norm
from datetime import time
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import seaborn as sns
sns.set_style(
style='darkgrid',
rc={'axes.facecolor': '.9', 'grid.color': '.8'}
)
sns.set_palette(palette='deep')
sns_c = sns.color_palette(palette='deep')
%matplotlib inline
上面的代码是一个Python脚本,它导入了几个库,并执行了与数据分析、机器学习和可视化有关的各种操作。代码开始时,分别使用'pd'和'np'别名导入了Pandas和NumPy库。Pandas库用于操作和分析表格数据,而NumPy则用于数学运算和数组操作。该脚本还导入了其他几个库,包括sklearn.gaussian_process、matplotlib、seaborn、pyDOE和scipy.stats.distributions。
接下来的几行代码从'sklearn.gaussian_process'库中导入特定的模块,包括GaussianProcessRegressor、RBF、WhiteKernel和DotProduct模块。这些模块用于建立高斯过程回归模型,这是一种强大的机器学习算法,可用于对变量之间复杂的非线性关系进行建模。
然后,该脚本设置了seaborn可视化库的风格,该库用于创建绘图和图形。风格被设置为 "darkgrid",并对坐标轴和网格颜色进行了一些定制,以达到特定的美学效果。
使用Pandas和NumPy加载和检查训练数据集的Python脚本
train_set_features = pd.read_csv("nasa-data/training_set_features.csv")
unique_storms = np.unique(train_set_features["Storm ID"])
print(len(unique_storms))
unique_storms[0]
train_set_labels = pd.read_csv("nasa-data/training_set_labels.csv")
train_set_labels.head()
int_df = pd.merge(train_set_features, train_set_labels, how ='inner', on =['Image ID', 'Image ID'])
int_df.head()
接下来的代码行使用 Pandas 库读取两个 CSV 文件。第一个文件名为“training_set_features.csv”,其中包含训练数据集的特征。第二个文件名为“training_set_labels.csv”,其中包含训练数据集的标签或目标值。然后,脚本使用“np.unique”方法从训练集特征创建一个唯一风暴 ID 的 NumPy 数组,并将数组的长度打印到控制台。最后,脚本打印 unique_storms 数组的第一个元素。
最后一行代码使用 Pandas 库的“head”方法读取训练集标签数据集的前几行。此方法默认返回数据集的前五行,允许用户快速检查数据并确保数据已正确加载。
总之,这段代码导入了几个用于数据分析、机器学习和可视化的库。它读入两个包含训练数据集的特征和标签的 CSV 文件,创建一个包含唯一风暴 ID 的 NumPy 数组,并将数组的长度和第一个元素打印到控制台。它还将训练集标签数据集的前几行打印到控制台。下一段代码首先使用 pd.merge() 函数合并先前加载的 train_set_features 和 train_set_labels DataFrames。生成的数据帧 int_df 仅包含图像 ID 和风暴 ID 值在两个数据帧中匹配的行。how='inner' 参数确保只有具有匹配 Image ID 和 Storm ID 值的行才会保留在生成的 DataFrame 中。
接下来,启动一个循环,遍历 int_df DataFrame 中 Storm ID 的所有唯一值。对于每个独特的风暴,都会创建一个新的 DataFrame,其中仅包含与该特定风暴对应的行。然后使用 nhe DataFrame 上 pandas DataFrame 的 plot() 方法创建一个图,x 轴作为相对时间,y 轴作为风速。titlestr 变量已更新以包含当前的风暴 ID,该 ID 用于为图加标题。然后该图作为图像保存在 image-storm 目录中,图像的名称是当前风暴的风暴 ID。plt.close() 方法用于关闭当前绘图。下一段代码将样本数 n 定义为 70257,并使用 np.arange(n) 创建一个 numpy 数组 t。然后创建一个 DataFrame data_df,其中包含一个标记为 t 的列并包含 t 的值。此 DataFrame 旨在用作创建合成数据的占位符。
在此代码段中,for 循环的主要目的是为每个唯一的风暴 ID 创建一个绘图并将该绘图保存为图像。生成的图像可用于可视化每个独特风暴的相对时间和风速之间的关系,这可能有助于识别数据中的模式和趋势。合成 data_df DataFrame 未在此代码段中使用,但可能会在后续代码段中使用。
使用Pandas和NumPy生成目标变量的季节性成分的Python脚本
def seasonal(int_df, unique_storms):"""Generate a sinusoidal curve."""actual_speed = []for i in range(494):actual_speed.append(int_df[int_df["Storm ID"]== unique_storms[i]]["Wind Speed"])y1 = [item for sublist in actual_speed for item in sublist]return y1# Define target variable.data_df['y1'] = seasonal(int_df, unique_storms)#Let us plot this seasonal variable:fig, ax = plt.subplots()sns.lineplot(x='t', y='y1', data=data_df, color=sns_c[0], label='y1', ax=ax)ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))ax.set(title='Seasonal Component', xlabel='t', ylabel='');
该代码首先定义一个名为 seasonal 的函数,该函数接受两个参数 int_df 和 unique_storms。此函数的目的是生成代表目标变量风速的季节性分量的正弦曲线。为此,该函数循环遍历数据集中的每个独特风暴并提取该风暴的风速数据。然后将此数据附加到名为 actual_speed 的列表中。一旦函数遍历了所有风暴,该函数将返回所有风暴的风速数据的串联列表。
接下来,代码将目标变量 y1 定义为季节性函数生成的季节性成分。然后,代码创建一个名为 data_df 的新 DataFrame,其中包含单个列 t,其中包含从 0 到 n-1 的值范围,其中 n 是数据点的总数。然后,代码将列 y1 添加到此 DataFrame,其中包含季节性函数生成的值。
绘制季节性成分图并为模型训练准备数据
为了可视化季节性成分,代码使用 subplots() 函数创建了一个带有单个子图的 matplotlib 图。seaborn 库中的 lineplot() 函数用于根据时间变量 t 绘制季节性分量。color 参数设置为 sns_c[0],这是 seaborn 调色板中的第一种颜色。label 参数设置为 'y1' 并且 ax 参数设置为 ax 以确保绘图绘制在之前创建的子图中。然后使用 legend() 函数向绘图添加图例,使用 set() 函数设置绘图的标题和轴标签。
然后,代码将预测变量 X 定义为形状为 (n, 1) 的 numpy 数组中的 t 值,其中 n 是数据点的总数。目标变量 y 被定义为与 X 具有相同形状的 numpy 数组中的 y1 值。然后代码定义了一个变量 prop_train,它表示用于训练模型的数据比例。在这种情况下,prop_train 设置为 0.7。然后代码将 n_train 定义为用于训练的数据点总数,它是通过四舍五入 prop_train 和 n 的乘积计算得出的。但是,下一行代码会覆盖此值并将 n_train 设置为 10000。
然后代码创建两个 numpy 数组 X_train 和 y_train,它们分别包含 X 和 y 的前 n_train 值。其余数据点用于创建 numpy 数组 X_test 和 y_test。在这种情况下,X_test 包含训练数据之后的下 100 个数据点,而 y_test 包含这些数据点对应的 y1 值。
设置高斯过程回归模型
指数正弦平方核是一个周期性核,可以捕捉到数据的周期性。它是用ConstantKernel定义的,ConstantKernel将指数正弦平方核乘以2的常数。指数正弦平方核的length_scale参数被设置为1.0,这决定了核的平滑度。周期性参数被设置为40,这是数据中季节性成分的周期。周期性参数被设置为(35,45),这是周期的上下限。
gp1_prior_samples = gp1.sample_y(X=X_train, n_samples=100)fig, ax = plt.subplots()for i in range(100):sns.lineplot(x=X_train[…,0], y = gp1_prior_samples[:, i], color=sns_c[1], alpha=0.2, ax=ax)sns.lineplot(x=X_train[…,0], y=y_train[…, 0], color=sns_c[0], label='y1', ax=ax)ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))ax.set(title='GP1 Prior Samples', xlabel='t');
最后,GaussianProcessRegressor用上面定义的kernel_1进行初始化。n_restarts_optimizer参数被设置为10,这意味着优化器将运行10次以找到模型的最佳超参数。normalize_y参数被设置为True,这意味着在拟合模型之前对目标值进行标准化。alpha参数被设置为0.0,它指定了模型的正则化参数。
高斯过程回归模型的先验样本的可视化
这个代码块与高斯过程回归有关。在这个模块中,代码首先准备训练和测试的数据。它将时间变量t和y1的值重塑为一个形状为(n,1)的二维数组,其中n是样本的数量。然后,它选择一部分数据用于训练,另一部分用于测试。训练数据包括前2500个样本,测试数据包括后100个样本。
接下来,代码使用gp1的sample_y()函数从高斯过程中生成先验样本。这个函数用指定的核和输入变量从高斯过程生成先验样本。这里,生成了100个样本,并与训练数据一起绘制成图。这样做是为了显示高斯过程在观察任何数据之前可以预测的数值范围。先验样本被绘制成浅色的线条,并以低α值显示其不确定性。
本文第三部分:讨论参数调整和准确度评分等。