决策树不使用Standard Scaler时可视化出现MemoryError问题咨询
问题解答
一、决策树确实不需要特征缩放
决策树的分裂逻辑是基于特征取值的阈值计算信息增益、基尼系数、熵等指标来做划分,特征缩放只会改变数值的绝对大小,不会改变不同取值的相对顺序,所以完全不会影响模型的训练和预测结果。你实际测试也能发现,去掉特征缩放代码后,模型的训练、预测环节都能正常运行,报错只出现在可视化步骤,和决策树本身没有关系。
二、内存报错的原因
报错出现在meshgrid生成可视化网格的步骤,完全是可视化代码的参数适配问题:
- 做了标准化后,年龄、预估薪资两个特征的取值范围都被压缩到了±3左右,用步长0.01生成网格时,总点数只有(6/0.01)*(6/0.01)=36万,内存完全可以承载。
- 去掉标准化后,预估薪资的原始取值范围是1万到十几万,跨度超过10万,你还是用步长0.01生成网格的话,仅薪资维度就要生成超过1000万个点,两个维度相乘后点数达到百亿级别,直接超出内存上限,触发报错。
三、修复方案
任选一种即可:
- 方案1:调整网格生成的步长,适配原始特征的取值范围,比如年龄步长设为1、薪资步长设为100,就能把网格点数降到正常水平,修改后的代码示例:
# 未做特征缩放时的网格生成代码 x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =1), nm.arange(start = x_set[:, 1].min() - 100, stop = x_set[:, 1].max() + 100, step = 100))
- 方案2:可视化环节临时对特征做标准化,生成图像后再把坐标轴刻度映射回原始数值范围,不需要调整步长也能正常出图,且不会影响模型本身的结果。
内容的提问来源于stack exchange,提问作者curiouz
相关产品推荐
相关产品推荐

