# 机器学习决策树：sklearn分类和回归

1 逻辑回归和决策树分类比较

```def decisionTreeBoundary(data,n_classes=2,plot_colors = "yb",plot_step = 0.02):
#特征的列index
pairidx,pair = [1,2],[1,2]
X = data[:,[1,2]]
y = data[:,3]
# Train
#构造的无参数构造函数
clf = tree.DecisionTreeClassifier()
clf.fit(X, y)
# 绘制决策边界
x_min, x_max = X[:, 0].min(), X[:, 0].max()
y_min, y_max = X[:, 1].min(), X[:, 1].max()
xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),
np.arange(y_min, y_max, plot_step))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
cs = plt.contourf(xx, yy, Z, cmap=plt.cm.BrBG)
# 绘制训练点
for i, color in zip(range(n_classes), plot_colors):
idx = np.where(y == i)
clabel=np.array(i,dtype=np.str)
plt.scatter(X[idx, 0], X[idx, 1], c=color,label = clabel,
cmap=plt.cm.RdYlBu, edgecolor='black', s=15)
plt.axis("tight")
plt.xlabel("w1")
plt.ylabel("w2")
plt.title("using decision tree to binary classification")
plt.show()```

• 逻辑回归得到的决策边界更直接简洁，相应的泛化能力更好些。
• 决策树得到的边界弯弯曲曲，好像被切了很多刀，泛化能力没有逻辑回归好。

2 决策树做回归

```import numpy as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt
# Create a random dataset
rng = np.random.RandomState(100)
X = np.sort(rng.rand(100, 1), axis=0)
y = np.cos(X).ravel()
y[::10] += (0.5 - rng.rand(10))
# Plot the results
plt.scatter(X, y, s=20, edgecolor="black",
c="darkorange", label="data")
plt.scatter(X,y)
plt.show()```

```# Import the necessary modules and libraries
def dtr(maxdepth=2):
import numpy as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt
# Create a random dataset
rng = np.random.RandomState(100)
X = np.sort(rng.rand(100, 1), axis=0)
y = np.cos(X).ravel()
y[::10] += (0.5 - rng.rand(10))
# Fit regression model
regr = DecisionTreeRegressor(max_depth=5)
regr.fit(X, y)
# Predict
X_test = np.arange(0.0, 1.0, 0.01)[:, np.newaxis]
y_predict = regr.predict(X_test)
# Plot the results
plt.scatter(X, y, s=20, edgecolor="black",
c="darkorange", label="data")
plt.plot(X_test, y_predict, color="blue", linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("decision tree regression")
plt.show()```

3 总结

1. criterion gini or entropy，选择哪个特征作为分裂点的判断公式。

2. splitter best or random：选择spitter best的话，是说从所有特征中找最好的切分点， random在数据量大的时候，特征多的时候，在部分特征中找最好的切分点。

3. max_features or None ：max_features < 50是一般选择None，即使用所有的特征。

4. max_depth: 树的最大深度

5. min_samples_split：如果节点的样本数小于min_samples_split，则不再对这个节点分裂，这个值是在样本数很大时才用的。

6. min_samples_leaf：叶子节点的样本少于min_samples_leaf，则它和它的兄弟都会被裁剪。

7. max_leaf_nodes：决策树最大的叶子节点数，如果叶子节点大于max_leaf_nodes，则可能发生过拟合了，考虑调小这个值。

8. min_weight_fraction_leaf：这个值限制了叶子节点所有样本权重和的最小值，则会和兄弟节点一起被裁剪。

9. class_weight：调整某个类别的权重，主要考虑到某个类别的样本数所占比例大，导致偏向它，用户可以配置使这个类别权重小一些。

297 篇文章89 人订阅

0 条评论

## 相关文章

2267

### 从编程实现角度学习 Faster R-CNN（附极简实现）

Faster R-CNN 的极简实现： github: simple-faster-rcnn-pytorch（http://t.cn/RHCDoPv ） 本文插...

9815

811

### 神经网络与反向传播算法

1、前言 先简单的说下神经网络吧。 简单来说就是模拟大脑的神经元。 前端会有一大批数据输入，例如，前端输入了一张图像的所有像素点。 中间层会有成千上万个网络数据...

1976

3465

1443

1894

36710

6745

### 3. 经典卷积网络之GooleInceptionNet

GooleInceptionNet首次出现是在2014年的ILSVRC的比赛中，当时是第一名，最大的特点就是控制计算量的同时获得了比较好的分类性能--top-5...

1462