我读过这篇文章 https://towardsdatascience.com/do-decision-trees-need-feature-scaling-97809eaa60c6,还观看了这个视频 https://www.youtube.com/watch?v=nmBqnKSSKfM&ab_channel=KrishNaik,他们都提到在决策树机器学习中不需要使用标准化缩放器(Standard Scaler)。
但是,在我的代码中却出现了相反的情况。以下是我尝试运行的代码:
# 导入库
import numpy as nm
import matplotlib.pyplot as mpl
import pandas as pd
# 导入数据集
data_set= pd.read_csv('Social_Network_Ads.csv')
# 提取独立变量和依赖变量
x= data_set.iloc[:, [2,3]].values
y= data_set.iloc[:, 4].values
# 将数据集分成训练集和测试集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.25, random_state=0)
# 特征缩放
from sklearn.preprocessing import StandardScaler
st_x= StandardScaler()
x_train= st_x.fit_transform(x_train)
x_test= st_x.transform(x_test)
# 训练决策树分类器
from sklearn.tree import DecisionTreeClassifier
classifier= DecisionTreeClassifier(criterion='entropy', random_state=0)
classifier.fit(x_train, y_train)
我继续在尝试可视化数据的部分提出问题。以下是相关代码:
# 可视化训练集结果
from matplotlib.colors import ListedColormap
x_set,y_set = x_train, y_train
x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01),
nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01))
mpl.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape),
alpha = 0.75, cmap = ListedColormap(('purple','green' )))
mpl.xlim(x1.min(), x1.max())
mpl.ylim(x2.min(), x2.max())
for i, j in enumerate(nm.unique(y_set)):
mpl.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap(('purple', 'green'))(i), label = j)
mpl.title('决策树算法(训练集)')
mpl.xlabel('年龄')
mpl.ylabel('估计薪水')
mpl.legend()
mpl.show()
如果我使用标准化缩放器运行代码,输出是成功的。图形显示得很好。但是,当我注释掉(禁用)标准化缩放器部分时,它显示了内存错误。
MemoryError Traceback (most recent call last)
<ipython-input-8-1282bf709e27> in <module>
3 x_set,y_set = x_train, y_train
4 x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01),
----> 5 nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01))
6 mpl.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape),
7 alpha = 0.75, cmap = ListedColormap(('purple','green' )))
~\Anaconda3\lib\site-packages\numpy\lib\function_base.py in meshgrid(*xi, **kwargs)
4209
4210 if copy_:
-> 4211 output = [x.copy() for x in output]
4212
4213 return output
~\Anaconda3\lib\site-packages\numpy\lib\function_base.py in <listcomp>(.0)
4209
4210 if copy_:
-> 4211 output = [x.copy() for x in output]
4212
4213 return output
MemoryError:
错误只在可视化部分发生;在代码的其他部分,如预测,标准化缩放器不使用时工作正常。
决策树可以不使用标准化缩放器吗?如果可以,我该如何解决这个问题?
回答:
决策树可以不使用标准化缩放器,也可以使用标准化缩放器。需要注意的是,缩放数据不会影响决策树模型的性能。
不过,如果您之后要绘制数据,我猜想您不想绘制缩放后的数据,而是原始数据;因此出现了您的问题。
我能想到的最简单的解决方法是向 numpy.meshgrid
传递 sparse=True
参数,因为这似乎是您的错误跟踪中导致错误的原因。关于这一点,在过去的问题中有详细说明 这里。
所以应用到您的问题中,这意味着您需要更改这一行:
nm.meshgrid(
nm.arange(start=x_set[:, 0].min() - 1, stop=x_set[:, 0].max() + 1, step=0.01),
nm.arange(start=x_set[:, 1].min() - 1, stop=x_set[:, 1].max() + 1, step=0.01),)
为
nm.meshgrid(
nm.arange(start=x_set[:, 0].min() - 1, stop=x_set[:, 0].max() + 1, step=0.01),
nm.arange(start=x_set[:, 1].min() - 1, stop=x_set[:, 1].max() + 1, step=0.01),
sparse=True,)