如何在Colab/Jupyter中自动重启运行Notebook以遍历特征组合训练回归模型?
解决方案
方法1:用Papermill批量执行Notebook
Papermill是专门用于参数化和批量运行Jupyter Notebook的工具,完美匹配你的需求:
- 安装Papermill
pip install papermill
- 修改原Notebook添加参数入口
在Notebook开头新增一个单元格,用# parameters注释标记为参数单元格,用来接收每次传入的特征组合:
# parameters feature_set = ['feature1', 'feature2'] # 默认值,Papermill会自动替换该参数
- 编写批量执行脚本
创建run_batch.py脚本,遍历特征组合列表,调用Papermill执行原Notebook并传入参数:
import papermill as pm # 定义所有待测试的特征组合 feature_combinations = [ ['feature1'], ['feature1', 'feature2'], ['feature1', 'feature3', 'feature4'], # 可添加更多组合 ] # 循环执行每个特征组合 for idx, features in enumerate(feature_combinations): output_notebook = f'result_feature_set_{idx}.ipynb' pm.execute_notebook( input_path='your_regression_notebook.ipynb', # 你的原Notebook路径 output_path=output_notebook, parameters={'feature_set': features} ) print(f'特征组合{idx}执行完成,结果已保存至{output_notebook}')
运行该脚本后,每个特征组合会对应一个独立的结果Notebook,里面记录了该组合下的模型预测性能。
方法2:核心逻辑模块化(更高效,推荐)
重跑整个Notebook效率偏低,更优方案是将数据处理、模型训练、评估逻辑封装成函数,直接在Notebook内遍历特征组合:
- 封装通用训练评估函数
在Notebook中新增单元格,编写可复用的函数:
import pandas as pd from sklearn.model_selection import train_test_split from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense def evaluate_features(features, df, target_col='y'): # 准备数据集 X = df[features] y = df[target_col] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 构建并训练回归模型 model = Sequential([ Dense(64, activation='relu', input_shape=(len(features),)), Dense(32, activation='relu'), Dense(1) ]) model.compile(optimizer='adam', loss='mse') model.fit(X_train, y_train, epochs=20, batch_size=32, verbose=0) # 评估模型性能 test_mse = model.evaluate(X_test, y_test, verbose=0) return {'feature_set': features, 'test_mse': test_mse}
- 遍历特征组合收集结果
在另一个单元格中执行循环,批量评估所有特征组合:
# 假设你已加载好数据集df # df = pd.read_csv('your_dataset.csv') feature_combinations = [ ['feature1'], ['feature1', 'feature2'], ['feature1', 'feature3'], # 可添加更多组合 ] # 存储所有评估结果 results = [] for features in feature_combinations: res = evaluate_features(features, df) results.append(res) print(f'特征组合{features}的测试MSE: {res["test_mse"]:.4f}') # 转换为DataFrame方便查看和分析 results_df = pd.DataFrame(results) print(results_df)
这种方式无需重复执行Notebook的初始化、数据加载步骤,速度更快,结果管理也更便捷。
方法3:用nbconvert结合脚本(无第三方依赖)
如果不想安装额外库,可以用Jupyter自带的nbconvert工具实现:
- 将Notebook转为Python脚本
jupyter nbconvert --to script your_regression_notebook.ipynb
- 修改脚本添加参数接收逻辑
在生成的.py脚本开头添加参数解析代码:
import argparse parser = argparse.ArgumentParser() parser.add_argument('--features', nargs='+', required=True) args = parser.parse_args() feature_set = args.features
随后将脚本中所有用到特征列表的地方替换为feature_set。
- 编写遍历执行脚本
创建run_loop.py脚本,循环调用生成的Python脚本:
import subprocess feature_combinations = [ ['feature1'], ['feature1', 'feature2'], # 可添加更多组合 ] for features in feature_combinations: cmd = ['python', 'your_regression_notebook.py', '--features'] + features subprocess.run(cmd, check=True) print(f'特征组合{features}执行完成')
内容的提问来源于stack exchange,提问作者KN202
相关产品推荐
相关产品推荐

