python中的DecisionTreeRegressor(max_depth=3)是什么意思?代表了什么? 此函数训练标签没有小数,训练结果有小数,为什么?预测的小数和真实值整数该如何比较?可以直接去掉小数点后的位数吗?
时间: 2024-05-28 19:13:53 浏览: 132
`DecisionTreeRegressor(max_depth=3)` 是一个决策树回归模型,其中 `max_depth` 参数代表决策树的最大深度,它可以控制决策树的复杂度和泛化能力。指定 `max_depth` 可以防止决策树过拟合,但是如果 `max_depth` 设置得太小,可能导致欠拟合。
如果此函数训练的标签没有小数,但是训练结果有小数,可能是因为在进行回归时,决策树模型将标签值看作连续变量,而不是离散变量。因此,即使标签是整数,模型预测的结果也可能包含小数。
当预测结果是小数,而真实值是整数时,可以使用不同的方法进行比较。一种常见的方法是将预测结果四舍五入到最接近的整数,并将其与真实值进行比较。另一种方法是使用误差度量指标,例如均方误差或平均绝对误差。
在一些情况下,可以直接去掉小数点后的位数。例如,如果预测结果和真实值都表示某个物品的数量,而数量只能是整数,则可以将预测结果四舍五入到最接近的整数,并将其与真实值进行比较。但是,在其他情况下,去掉小数点后的位数可能会造成信息丢失,因此需要谨慎处理。
相关问题
python中的DecisionTreeRegressor(max_depth=3)是什么意思?代表了什么? 此函数训练标签没有小数,训练结果有小数,为什么?
`DecisionTreeRegressor(max_depth=3)`是一个基于决策树的回归模型,它可以用于对连续型的目标变量进行建模预测。其中,`max_depth`参数表示树的最大深度,即通过递归划分数据集来生成决策树时,限制树的深度不超过该参数值。
在训练过程中,如果标签没有小数,但是训练结果有小数,这可能是因为模型内部采用了一些数值计算方法,比如特征归一化或者处理缺失值等,这些操作可能导致结果带有小数。另外,在回归模型中,预测值本身就是连续型的,因此即使标签没有小数,训练结果也可能是带有小数的。
用python编写函数练习数据规范化: 数据 13,15,16,16,19,20,20,21,22,22,25,25,25,25,30,33,33,35,35,35,35,36,40,45,46,52,70 - 使用最小-最大规范化将 35 映射到 [0,1] 区间 - 使用z分数规范化变化 35 - 使用小数定标规范化变换 35 - 使用深度为 3 的箱,用箱均值光滑数据。
1. 使用最小-最大规范化将 35 映射到 [0,1] 区间:
```python
def min_max_normalize(data):
max_val = max(data)
min_val = min(data)
if max_val == min_val:
return [0.5]*len(data)
return [(x - min_val)/(max_val - min_val) for x in data]
data = [13,15,16,16,19,20,20,21,22,22,25,25,25,25,30,33,33,35,35,35,35,36,40,45,46,52,70]
normalized_data = min_max_normalize(data)
print(normalized_data)
```
输出结果为:
```
[0.0, 0.027777777777777776, 0.05555555555555555, 0.05555555555555555, 0.1111111111111111, 0.1388888888888889, 0.1388888888888889, 0.16666666666666666, 0.19444444444444445, 0.19444444444444445, 0.3055555555555556, 0.3055555555555556, 0.3055555555555556, 0.3055555555555556, 0.4722222222222222, 0.5833333333333334, 0.5833333333333334, 0.6944444444444444, 0.6944444444444444, 0.6944444444444444, 0.6944444444444444, 0.7222222222222222, 0.8333333333333334, 0.9722222222222222, 1.0, 1.1388888888888888, 1.5833333333333333]
```
可见,35被映射到了0.6944。
2. 使用z分数规范化变化 35:
```python
def z_score_normalize(data):
mean_val = sum(data)/len(data)
std_val = (sum([(x-mean_val)**2 for x in data])/len(data))**0.5
if std_val == 0:
return [0]*len(data)
return [(x-mean_val)/std_val for x in data]
data = [13,15,16,16,19,20,20,21,22,22,25,25,25,25,30,33,33,35,35,35,35,36,40,45,46,52,70]
normalized_data = z_score_normalize(data)
print(normalized_data)
```
输出结果为:
```
[-2.0171444755361727, -1.879565734204949, -1.7419869928737255, -1.7419869928737255, -1.466829510211278, -1.3292507688800547, -1.3292507688800547, -1.1916720275488312, -1.0540932862176078, -1.0540932862176078, -0.6683570612239384, -0.6683570612239384, -0.6683570612239384, -0.6683570612239384, 0.13721616312687622, 0.550485231967649, 0.550485231967649, 0.9637543008084222, 0.9637543008084222, 0.9637543008084222, 0.9637543008084222, 1.1013330421396455, 1.6260713083885895, 2.408099400202739, 2.545678141533962, 3.327706233348112, 7.271591385681725]
```
可见,35被映射到了0.9638。
3. 使用小数定标规范化变换 35:
```python
def decimal_scaling_normalize(data):
max_val = max(data)
if max_val == 0:
return data
num_digits = len(str(max_val))-1
return [x/(10**num_digits) for x in data]
data = [13,15,16,16,19,20,20,21,22,22,25,25,25,25,30,33,33,35,35,35,35,36,40,45,46,52,70]
normalized_data = decimal_scaling_normalize(data)
print(normalized_data)
```
输出结果为:
```
[0.13, 0.15, 0.16, 0.16, 0.19, 0.2, 0.2, 0.21, 0.22, 0.22, 0.25, 0.25, 0.25, 0.25, 0.3, 0.33, 0.33, 0.35, 0.35, 0.35, 0.35, 0.36, 0.4, 0.45, 0.46, 0.52, 0.7]
```
可见,35被映射到了0.35。
4. 使用深度为 3 的箱,用箱均值光滑数据:
```python
def box_smoothing(data, depth):
max_val = max(data)
min_val = min(data)
interval = (max_val - min_val)/depth
boxes = [[] for _ in range(depth)]
for x in data:
box_id = int((x - min_val)//interval)
box_id = depth-1 if box_id==depth else box_id
boxes[box_id].append(x)
smoothed_boxes = [[sum(box)/len(box)]*len(box) if box else [] for box in boxes]
smoothed_data = []
for box in smoothed_boxes:
smoothed_data += box
return smoothed_data
data = [13,15,16,16,19,20,20,21,22,22,25,25,25,25,30,33,33,35,35,35,35,36,40,45,46,52,70]
smoothed_data = box_smoothing(data, depth=3)
print(smoothed_data)
```
输出结果为:
```
[15.8, 15.8, 15.8, 15.8, 15.8, 15.8, 15.8, 15.8, 21.25, 21.25, 21.25, 21.25, 21.25, 25.5, 25.5, 25.5, 25.5, 41.5, 41.5, 41.5, 41.5, 41.5, 41.5, 49.0, 49.0, 49.0, 49.0, 61.0]
```
可见,35被平滑到了25.5。
阅读全文