特征工程时Jupyter Notebook内核崩溃问题求助
解决高维特征下Jupyter内核崩溃问题
问题根源
生成2阶多项式后,特征量从1000暴涨到约49万,8700个样本对应的矩阵元素量超过40亿,直接用DataFrame存储并执行StandardScaler.fit_transform会耗尽内存,导致Jupyter内核崩溃。
具体解决方案
1. 跳过DataFrame转换,直接用Numpy数组处理
PolynomialFeatures输出的Numpy数组比Pandas DataFrame内存开销小得多(无需存储列名、索引等元数据),直接用数组完成缩放:
from sklearn.preprocessing import PolynomialFeatures, StandardScaler # 生成多项式特征,保留Numpy数组格式 poly = PolynomialFeatures(2) X_poly = poly.fit_transform(X) # 直接对Numpy数组做标准化 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_poly)
2. 先做特征筛选,削减维度
49万特征中存在大量冗余或低信息特征,先筛选再缩放可大幅降低内存压力:
- 移除低方差特征:
from sklearn.feature_selection import VarianceThreshold # 过滤方差低于0.01的特征(阈值可根据数据调整) selector = VarianceThreshold(threshold=0.01) X_poly_selected = selector.fit_transform(X_poly) print(f"筛选后特征数量:{X_poly_selected.shape[1]}") # 再执行标准化 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_poly_selected)
- 选择与目标变量高相关特征:
from sklearn.feature_selection import SelectKBest, f_regression # 假设y是目标变量,挑选Top 5000个最相关特征(数量可自定义) selector = SelectKBest(f_regression, k=5000) X_poly_selected = selector.fit_transform(X_poly, y) print(f"筛选后特征数量:{X_poly_selected.shape[1]}") # 执行标准化 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_poly_selected)
3. 增量式计算标准化参数
如果必须保留全量特征,可分批次计算均值和方差,再分步缩放,避免一次性加载全量数据:
from sklearn.preprocessing import StandardScaler import numpy as np scaler = StandardScaler() batch_size = 1000 # 按批次大小调整,适配你的内存 # 分批次拟合,计算全局均值和方差 for i in range(0, X_poly.shape[0], batch_size): batch = X_poly[i:i+batch_size] scaler.partial_fit(batch) # 分批次完成标准化 X_train_scaled = np.zeros_like(X_poly) for i in range(0, X_poly.shape[0], batch_size): batch = X_poly[i:i+batch_size] X_train_scaled[i:i+batch_size] = scaler.transform(batch)
4. 降低数据精度减少内存占用
如果业务允许牺牲部分精度,将数据类型从默认的float64转为float32,可直接减少一半内存开销:
X_poly = X_poly.astype(np.float32) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_poly)
5. 调整Jupyter内存限制
如果机器有足够物理内存,可修改Jupyter启动参数提升内存上限:
- 启动时添加参数:
jupyter notebook --NotebookApp.max_buffer_size=10737418240 # 10GB,根据机器内存调整
- 或修改Jupyter配置文件,找到
c.NotebookApp.max_buffer_size并设置对应值。
内容的提问来源于stack exchange,提问作者8Simon8
相关产品推荐
相关产品推荐

