Notebook 是代码、数据与运行环境的组合
Kaggle Notebook 是在云端运行代码并组织分析的工作区。Jupyter Notebook 由代码和 Markdown 单元格组成,Script 按文件顺序执行;创建与类型选项见官方 Notebook 文档。第一次使用先完成一个能从头运行的小任务,再扩大数据与模型规模。
还没有数据时,先读数据集选择与下载;还不清楚平台对象时,先读认识 Kaggle。本文解释操作与排错,模型选择和实验改动可以继续看项目工作流。
创建 Notebook 后,先检查这四处
| 位置 | 要确认什么 | 最小检查 |
|---|---|---|
| Input | 已添加的数据源、文件与版本 | 找到本次需要的一个文件 |
| Session options | 语言、加速器、网络与环境设置 | 选择与本场规则和任务一致的配置 |
| 代码单元格 | 数据、配置、预处理与模型的依赖顺序 | 从第一格开始运行,不依赖旧变量 |
| Output / 保存版本 | 实际生成的文件、日志与完整运行状态 | 确认输出存在且版本可重新执行 |
只阅读数据页不会自动把文件加入当前 Notebook。使用 Input 的添加入口选择允许使用的数据源,再查看实际挂载目录。代码里出现的路径必须来自本次环境,不能直接照搬他人的电脑路径。
先列路径,再读取数据
下面列出输入目录的第一层内容,帮助区分数据源名称和具体文件。找到目标文件后,用它的实际路径替换占位路径:
from pathlib import Path
import pandas as pd
input_root = Path("/kaggle/input")
print([path.name for path in input_root.iterdir()])
# 将占位路径替换为当前 Input 中真实存在的文件。
csv_path = input_root / "your-dataset" / "train.csv"
sample = pd.read_csv(csv_path, nrows=100)
print(sample.shape)
print(sample.dtypes)
输入数据通常用于读取,自己的中间结果和输出放在 /kaggle/working。若出现权限错误,不修改输入文件;从读取的数据生成新文件。网络下载、外部数据与依赖安装是否允许,仍要按本场规则和当前会话配置确认。
公开方法练习:先跑通 Pipeline,再迁移到赛题
scikit-learn 分类器比较示例由 scikit-learn developers 维护,采用 BSD-3-Clause。它使用合成数据、训练测试划分和 Pipeline 比较方法,适合理解预处理应在哪里拟合。
下面是依据这些方法组织的教学练习。先用 scikit-learn 内置的公开 Iris 数据检查运行环境,不需要下载或上传私人文件;再按下文切换到已挂载的 Kaggle Iris CSV。两条数据来源分别记录,不能因为都叫 Iris 就假定版本和行顺序相同。
完整示例使用 120 行训练、30 行留出验证,对比常数基线、有标准化的逻辑回归和不标准化的逻辑回归。预处理放在 Pipeline 内,只在训练集拟合。代码需 Pandas 与 scikit-learn;在 Kaggle 中输出到 working,在本地则输出到当前目录的 iris-output:
# iris-baseline-example
from pathlib import Path
from time import perf_counter
import pandas as pd
import sklearn
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.dummy import DummyClassifier
from sklearn.metrics import accuracy_score, confusion_matrix
print("版本:", {"numpy": np.__version__, "pandas": pd.__version__,
"scikit-learn": sklearn.__version__})
X, y = load_iris(return_X_y=True, as_frame=True)
data_source = "scikit-learn load_iris"
# 使用挂载 CSV 时,用下一节的读取代码替换上面两行。
X_train, X_valid, y_train, y_valid = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=42
)
models = {
"constant": DummyClassifier(strategy="most_frequent"),
"scaled_logistic": make_pipeline(
StandardScaler(), LogisticRegression(max_iter=200)
),
"unscaled_logistic": LogisticRegression(max_iter=200),
}
output = Path("/kaggle/working") if Path("/kaggle/working").is_dir() else Path("iris-output")
output.mkdir(parents=True, exist_ok=True)
summary = []
for name, model in models.items():
started = perf_counter()
model.fit(X_train, y_train)
fit_seconds = perf_counter() - started
started = perf_counter()
prediction = model.predict(X_valid)
predict_seconds = perf_counter() - started
summary.append({
"model": name, "accuracy": accuracy_score(y_valid, prediction),
"fit_seconds": fit_seconds, "predict_seconds": predict_seconds,
"train_rows": len(X_train), "valid_rows": len(X_valid),
"data_source": data_source, "seed": 42,
})
pd.DataFrame({"source_row": X_valid.index, "actual": y_valid.to_numpy(),
"prediction": prediction}).to_csv(output / f"{name}-validation.csv", index=False)
print(name, "混淆矩阵:", confusion_matrix(y_valid, prediction).tolist())
pd.DataFrame(summary).to_csv(output / "validation-summary.csv", index=False)
print(pd.DataFrame(summary).to_string(index=False))
print("输出:", sorted(path.name for path in output.glob("*.csv")))
切换到 Input 中的公开 Iris CSV
先完成下载与字段检查,在 Input 添加公开 uciml/iris。把以下代码放到示例的划分步骤之前,替换 load_iris 和 data_source 两行。若挂载了多个同名文件,先确认目标,避免默默读取错误版本:
paths = list(Path("/kaggle/input").rglob("Iris.csv"))
if len(paths) != 1:
raise ValueError(f"需要确认唯一的 Iris.csv,当前找到 {len(paths)} 个")
data = pd.read_csv(paths[0])
features = ["SepalLengthCm", "SepalWidthCm", "PetalLengthCm", "PetalWidthCm"]
if not set(features + ["Species"]).issubset(data.columns):
raise ValueError("文件字段不符,回到 Input 核对数据源和版本")
X = data[features]
y = data["Species"]
if X.isna().any().any() or y.isna().any():
raise ValueError("存在空值,先排查,再选择处理方式")
data_source = "Kaggle uciml/iris CSV;版本请按当前 Input 记录"
运行后应该看到什么?
2026-10-02 在本地 CPU、Python 3.10.16、NumPy 1.26.4、Pandas 2.2.3、scikit-learn 1.6.0 中执行上面的内置数据分支,得到以下结果。Kaggle 云端、CLI 下载和挂载 CSV 分支没有由这次本地运行验证;其结果需在当前环境重新检查。
| 检查项 | 本次内置数据运行结果 | 你应该检查什么 |
|---|---|---|
| 划分 | 120 行训练、30 行验证,4 个特征 | 数据来源、行列数、标签分布与种子 |
| 常数基线 | 10/30 正确,accuracy 0.3333 | 复杂方法是否优于简单基线 |
| 标准化逻辑回归 | 28/30 正确,accuracy 0.9333 | 混淆矩阵和两条错误样本 |
| 不标准化逻辑回归 | 29/30 正确,accuracy 0.9667 | 同一验证集上只比较标准化这一条件 |
| Output | 一份 summary,三份 validation CSV | summary 有三行;每份预测有 30 行且包含实际标签与预测 |
这里只相差一条样本,不能据此断定标准化没有价值,或用这次留出验证挑出“普遍最佳模型”。继续研究时先固定评价协议,再比较多次划分或交叉验证。CSV 是学习验证结果,不是任何比赛的 submission.csv。
完成后检查 scaled_logistic-validation.csv 中 actual != prediction 的行,说明错误涉及哪些类别。保存一份环境与数据来源记录,再进入 Save & Run All;版本界面的完整成功状态需要另行核对。希望解释一次差异,可以继续读复现实例与对照记录。
Quick Save 与 Save & Run All 怎么选
官方文档说明:Quick Save 保存编辑器当前状态,不从头执行 Notebook;Save & Run All 创建干净会话,从上到下运行完整 Notebook。探索时可以保存草稿,准备分享、形成项目记录或进入代码赛提交流程时,应检查完整运行版本。
完整版本至少确认:输入版本固定、依赖可获得、随机种子和配置记录、所有单元格成功、输出文件存在、日志没有秘密信息。编辑会话里“刚刚运行成功”和保存版本“从头运行成功”是两个检查点。
若准备参赛,按参赛检查表核对样本标识、列名、行数、输出路径与代码赛限制。运行成功仍不等于平台已经接受了一次有效提交。
常见错误,从第一条报错开始排查
| 现象 | 常见原因 | 检查动作 |
|---|---|---|
| FileNotFoundError | 数据没挂载、目录或大小写不同 | 对照 Input 和实际文件列表 |
| NameError / 单格成功、整本失败 | 单元格乱序或依赖旧会话变量 | 重新启动,从第一格依次运行 |
| ModuleNotFoundError | 环境或依赖未声明 | 记录版本,按允许的方式补依赖,再完整重跑 |
| PermissionError | 试图写入输入目录 | 将自己的输出写入 working 目录 |
| 内存不足 / 会话超时 | 全量读取、大型中间数组或运行范围过大 | 先缩小样本、列和模型;实测耗时及内存 |
| 网络请求失败 | 会话设置、网络服务或比赛限制 | 先核对允许条件,再看错误与日志 |
| Output 没有文件 | 写入路径不对或保存版本未完整执行 | 检查生成路径、日志和当前版本 |
资源配额与硬件可用性会变化,不把旧截图的 GPU 型号、运行时长或剩余额度当作当前承诺。普通电脑起步可以参考CPU 项目指南。
完成一次运行后,留下可复查记录
记录来源、数据版本、环境、配置、验证方法、输出说明和一次失败原因。希望学习他人的方案时,按公开方案复现指南区分原方法、自己的复现与新增实验。
先自行完成一次干净重跑,再决定需要讨论数据、运行环境还是验证设计。描述具体报错和最小复现步骤,比只提供“代码跑不了”更容易定位问题;公开分享前删除凭据与私人信息。
现在卡在哪一步?
选择当前进度,先看对应检查;需要讨论时,我们再确认支持范围与费用。
先按本文完成一个小任务;遇到卡点,准备公开来源和一句问题即可。
FAQ:常见问题
Kaggle Notebook 一定要开 GPU 吗?
不需要。数据检查和小型表格基线通常可以先用 CPU;是否使用加速器取决于任务、模型与实测成本。账号可用资源和比赛限制需要在当前界面核对。
Quick Save 成功,是否说明代码可以从头运行?
不能。Quick Save 不执行完整代码;检查可复现性需要在干净会话按顺序执行,并确认日志、输出和依赖。Save & Run All 用于这种完整版本检查。
为什么单个单元格能运行,完整版本却失败?
常见原因是依赖之前交互会话中的变量、临时安装、文件或运行顺序。先从第一条错误定位,统一输入、依赖和配置,再从干净会话重跑。
输出一个 CSV 就能提交到所有比赛吗?
不能。预测文件赛、代码赛、Simulation 与 Hackathon 的提交方式不同。输出字段、执行条件、网络限制和有效状态必须按本场官方说明检查。
参考依据(官方一手资料)
- https://www.kaggle.com/docs/notebooks
- https://www.kaggle.com/docs/datasets
- https://www.kaggle.com/docs/competitions
- https://github.com/scikit-learn/scikit-learn/blob/main/examples/classification/plot_classifier_comparison.py
涉及规则、资格、截止日期和评价方式的信息,请始终以 Kaggle 官方页面最新内容为准。
下一步
先完成干净运行,再解决具体卡点
能完整运行,就继续做一次验证与复盘;仍有报错时,联系时发送第一条错误、当前环境和已尝试的检查,确认需要的支持。省去账号凭据与私人数据,辅导范围和费用另行明确。