带有 LSTM 的 GridSearchCV/RandomizedSearchCV

2024-06-20

我一直在尝试通过 RandomizedSearchCV 调整 LSTM 的超参数。

我的代码如下:

X_train = X_train.reshape((X_train.shape[0], 1, X_train.shape[1]))
X_test = X_test.reshape((X_test.shape[0], 1, X_test.shape[1]))

print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)

from imblearn.pipeline import Pipeline
from keras.initializers import RandomNormal

def create_model(activation_1='relu', activation_2='relu',
                 neurons_input = 1, neurons_hidden_1=1,
                 optimizer='Adam' , 
                 #input_shape = (X_train.shape[1], X_train.shape[2])
                 #input_shape=(X_train.shape[0],X_train.shape[1]) #input shape should be timesteps, features
                                                                 ):

  model = Sequential()
  model.add(LSTM(neurons_input, activation=activation_1, input_shape=(X_train.shape[1], X_train.shape[2]),
                  kernel_initializer=RandomNormal(mean=0.0, stddev=0.05, seed=42), 
                  bias_initializer=RandomNormal(mean=0.0, stddev=0.05, seed=42)))

  model.add(Dense(2, activation='sigmoid'))

  model.compile (loss = 'sparse_categorical_crossentropy', optimizer=optimizer)
  return model


clf=KerasClassifier(build_fn=create_model, epochs=10, verbose=0)

param_grid = {
    'clf__neurons_input':   [20, 25, 30, 35],
    'clf__batch_size': [40,60,80,100], 
    'clf__optimizer': ['Adam', 'Adadelta']}



pipe = Pipeline([
    ('oversample', SMOTE(random_state=12)),
    ('clf', clf)
    ])

my_cv = TimeSeriesSplit(n_splits=5).split(X_train)

rs_keras = RandomizedSearchCV(pipe, param_grid, cv=my_cv, scoring='f1_macro', 
                              refit='f1_macro', verbose=3,n_jobs=1, random_state=42)
rs_keras.fit(X_train, y_train)

我一直有一个错误:

Found array with dim 3. Estimator expected <= 2.

这是有道理的,因为网格搜索和随机搜索都需要 [n_samples, n_features] 类型的数组。有谁对如何处理此限制有经验或建议?

谢谢。

这是错误的完整回溯:

Traceback (most recent call last):

  File "<ipython-input-2-b0be4634c98a>", line 1, in <module>
    runfile('Scratch/prediction_lstm.py', wdir='/Simulations/2017-2018/Scratch')

  File "\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 786, in runfile
    execfile(filename, namespace)

  File "\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "Scratch/prediction_lstm.py", line 204, in <module>
    rs_keras.fit(X_train, y_train)

  File "Anaconda3\lib\site-packages\sklearn\model_selection\_search.py", line 722, in fit
    self._run_search(evaluate_candidates)

  File "\Anaconda3\lib\site-packages\sklearn\model_selection\_search.py", line 1515, in _run_search
    random_state=self.random_state))

  File "\Anaconda3\lib\site-packages\sklearn\model_selection\_search.py", line 711, in evaluate_candidates
    cv.split(X, y, groups)))

  File "\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py", line 917, in __call__
    if self.dispatch_one_batch(iterator):

  File "\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py", line 759, in dispatch_one_batch
    self._dispatch(tasks)

  File "\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py", line 716, in _dispatch
    job = self._backend.apply_async(batch, callback=cb)

  File "\Anaconda3\lib\site-packages\sklearn\externals\joblib\_parallel_backends.py", line 182, in apply_async
    result = ImmediateResult(func)

  File "\Anaconda3\lib\site-packages\sklearn\externals\joblib\_parallel_backends.py", line 549, in __init__
    self.results = batch()

  File "\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py", line 225, in __call__
    for func, args, kwargs in self.items]

  File "\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py", line 225, in <listcomp>
    for func, args, kwargs in self.items]

  File "\Anaconda3\lib\site-packages\sklearn\model_selection\_validation.py", line 528, in _fit_and_score
    estimator.fit(X_train, y_train, **fit_params)

  File "\Anaconda3\lib\site-packages\imblearn\pipeline.py", line 237, in fit
    Xt, yt, fit_params = self._fit(X, y, **fit_params)

  File "\Anaconda3\lib\site-packages\imblearn\pipeline.py", line 200, in _fit
    cloned_transformer, Xt, yt, **fit_params_steps[name])

  File "\Anaconda3\lib\site-packages\sklearn\externals\joblib\memory.py", line 342, in __call__
    return self.func(*args, **kwargs)

  File "\Anaconda3\lib\site-packages\imblearn\pipeline.py", line 576, in _fit_resample_one
    X_res, y_res = sampler.fit_resample(X, y, **fit_params)

  File "\Anaconda3\lib\site-packages\imblearn\base.py", line 80, in fit_resample
    X, y, binarize_y = self._check_X_y(X, y)

  File "\Anaconda3\lib\site-packages\imblearn\base.py", line 138, in _check_X_y
    X, y = check_X_y(X, y, accept_sparse=['csr', 'csc'])

  File "\Anaconda3\lib\site-packages\sklearn\utils\validation.py", line 756, in check_X_y
    estimator=estimator)

  File "\Anaconda3\lib\site-packages\sklearn\utils\validation.py", line 570, in check_array
    % (array.ndim, estimator_name))

ValueError: Found array with dim 3. Estimator expected <= 2.

这个问题不是由于scikit-learn. RandomizedSearchCV不检查输入的形状。这是各个 Transformer 或 Estimator 的工作,以确定传递的输入具有正确的形状。正如您从堆栈跟踪中看到的,该错误是由imblearn因为SMOTE要求数据是二维的才能工作。

为了避免这种情况,您可以在之后手动重新调整数据SMOTE在将其传递给之前LSTM。有多种方法可以实现这一目标。

1)您传递二维数据(没有像您当前在以下几行中所做的那样显式重塑):

X_train = X_train.reshape((X_train.shape[0], 1, X_train.shape[1]))
X_test = X_test.reshape((X_test.shape[0], 1, X_test.shape[1]))

到您的管道并之后SMOTE步骤,在你之前clf,将数据重塑为 3-D,然后将其传递给clf.

2) 将当前的 3-D 数据传递到管道,将其转换为 2-D 以供使用SMOTE. SMOTE然后将输出新的过采样 2-D 数据,然后您再次将其重塑为 3-D。

我认为更好的选择是 1。即使如此,您也可以:

  • 使用自定义类将数据从 2-D 转换为 3-D,如下所示:

    pipe = Pipeline([
        ('oversample', SMOTE(random_state=12)),
    
        # Check out custom scikit-learn transformers
        # You need to impletent your reshape logic in "transform()" method
        ('reshaper', CustomReshaper(),
        ('clf', clf)
    ])
    
  • 或使用已有的Reshape class https://keras.io/layers/core/。我在用Reshape.

所以修改器代码将是(请参阅注释):

# Remove the following two lines, so the data is 2-D while going to "RandomizedSearchCV". 

#    X_train = X_train.reshape((X_train.shape[0], 1, X_train.shape[1]))
#    X_test = X_test.reshape((X_test.shape[0], 1, X_test.shape[1]))


from keras.layers import Reshape

def create_model(activation_1='relu', activation_2='relu',
                 neurons_input = 1, neurons_hidden_1=1,
                 optimizer='Adam' ,):

  model = Sequential()

  # Add this before LSTM. The tuple denotes the last two dimensions of input
  model.add(Reshape((1, X_train.shape[1])))
  model.add(LSTM(neurons_input, 
                 activation=activation_1, 

                 # Since the data is 2-D, the following needs to be changed from "X_train.shape[1], X_train.shape[2]"
                 input_shape=(1, X_train.shape[1]),
                 kernel_initializer=RandomNormal(mean=0.0, stddev=0.05, seed=42), 
                 bias_initializer=RandomNormal(mean=0.0, stddev=0.05, seed=42)))

  model.add(Dense(2, activation='sigmoid'))

  model.compile (loss = 'sparse_categorical_crossentropy', optimizer=optimizer)
  return model
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有 LSTM 的 GridSearchCV/RandomizedSearchCV 的相关文章

  • 在Python中使用字典作为switch语句[重复]

    这个问题在这里已经有答案了 我正在尝试使用字典用 Python 制作一个简单的计算器 这是我的代码 def default print Incorrect input def add a b print a b def sub a b pr
  • 只使用 Django 的某些部分?

    我喜欢 Django 但对于一个特定的应用程序 我只想使用它的一部分 但我对 Django 的内部工作原理还不够熟悉 所以也许有人可以指出我必须做什么的正确方向查看 具体来说 我想使用 模型和数据库抽象 The 缓存API http doc
  • 使用 Python 在 Google Cloud Storage 存储桶中创建/上传新文件

    如何使用 Python 和可用的客户端库在 Google Cloud Storage 中创建新的空文件 或者如何使用 blob 函数 upload from filename 将新文件上传到选定的存储桶 要初始化 blob 对象 我们应该在
  • Python sqlite3参数化删除表

    我在 python 中删除 sqlite3 表时遇到问题 我正在使用标准sqlite3模块 self conn sqlite3 connect sql drop table self conn execute sql u table nam
  • Python 按照层次结构按多个分隔符分割字符串

    我只想根据多个分隔符 例如 and 和 按顺序分割字符串一次 例子 121 34 adsfd gt 121 34 adsfd dsfsd and adfd gt dsfsd adfd dsfsd adfd gt dsfsd adfd dsf
  • Windows Defender 检测 Python EXE 为木马

    我制作了一个 Python 脚本 将 Windows 目录以 zip 形式邮寄给我 我使用 sched 模块添加了一个调度程序 每小时重复一次 我试图制作一个简单的同步应用程序供个人使用 在 Windows 启动时启动 我使用将其转换为 e
  • Seaborn 热图中的自定义调色板间隔

    我正在尝试绘制一个heatmap https seaborn pydata org generated seaborn heatmap html使用seaborn库 绘图函数如下所示 def plot confusion matrix da
  • 在 vim 折叠线中语法高亮 Python

    我发现代码折叠 http en wikipedia org wiki Code folding帮助我更好地组织我的文件 因此 在我的底部 vimrc 我启用vim代码折叠 http vimdoc sourceforge net htmldo
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 从主机名中提取域名

    是否有一种编程方式可以从给定的主机名查找域名 给出 gt www yahoo co jp 返回 gt yahoo co jp 有效但非常慢的方法是 拆分为 并从左侧删除 1 个组 使用 dnspython 加入并查询 SOA 记录 当返回有
  • Flask 中的 import 和 extends 有什么区别?

    我正在阅读 Flask Web 开发 在例4 3中 extends base html import bootstrap wtf html as wtf 我想知道 extends 和 import 有什么区别 我认为它们在用法上很相似 在什
  • 根据给定列表中的值替换列中的值[重复]

    这个问题在这里已经有答案了 我在数据框中有一列 仅允许定义列表中存在的值 例如 给定列表 l1 1 2 5 6 如果列表中不存在列中的值 我需要将每个值替换为 0 column Expected column 1 1 5 5 2 2 3 0
  • 如何删除 pandas 数据框中的唯一行?

    我遇到了一个看似简单的问题 在 pandas 数据框中删除唯一的行 基本上 相反drop duplicates https pandas pydata org pandas docs stable generated pandas Data
  • Python,多线程,获取网页,下载网页

    我想在一个站点批量下载网页 我的 urls txt 文件中有 5000000 个 url 链接 大约有300M 如何让多线程链接这些网址并下载这些网页 或者如何批量下载这些网页 我的想法 with open urls txt r as f
  • 如何在 Pytorch 中将一维 IntTensor 转换为 int

    如何将一维 IntTensor 转换为整数 这 IntTensor int 给出错误 KeyError Variable containing 423 torch IntTensor of size 1 我所知道的最简单 最干净的方法 In
  • 如何在数据框中绘制包含三列的无向图,形成 3 种不同类型的节点(三方)?

    我正在尝试使用三个不同的列表绘制网络的可视化 这三个列表形成 3 种类型的节点 下面的代码正在运行 如图所示 需要两个列表 用户 ID 评分 但是 我希望我的图表是三部分的 即 user userId review ratings prod
  • Qcut Pandas:ValueError:Bin 边缘必须是唯一的

    我使用 Pandas 中的 Qcut 将数据离散化为大小相等的存储桶 我想要有价格桶 这是我的数据框 productId sell prix categ popularity 11997 16758760 0 28 75 50 524137
  • 如何使用 pygame.mixer 重复音乐?

    我创建了以下使用 pygame mixer 播放 mp3 音乐的代码 然而 音乐不会重复 有什么想法可以让音乐重复播放吗 这是代码 playlist list playlist append put music here mp3 playl
  • 如何可视化多维数据上的 kmeans 聚类

    我在 mnist 数据集上使用 kmeans 聚类算法 并希望可视化聚类后的图 到目前为止我做了这个 from mnist import MNIST mndata MNIST Datasets X train y train mndata
  • Scrapy 抓取并跟踪 href 中的链接

    我对 scrapy 很陌生 我需要从 url 的主页跟踪 href 到多个深度 再次在 href 链接内我有多个 href 我需要遵循这些href 直到到达我想要抓取的页面 我的页面的示例 html 是 初始页 div class page

随机推荐