1. 决策树

CART模型表示

CART模型的表示是二叉树。这是来自算法和数据结构的二叉树。每个根节点表示一个输入变量(x)和该变量上的一个拆分点(假设变量是数值型的)。

3.python中的决策树和随机森林实现

```import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.set_style("whitegrid")
plt.style.use("fivethirtyeight")

4. 数据处理

```from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split

df.drop(['EmployeeCount', 'EmployeeNumber', 'Over18', 'StandardHours'], axis="columns", inplace=True)
categorical_col = []
for column in df.columns:
if df[column].dtype == object and len(df[column].unique()) <= 50:
categorical_col.append(column)
df['Attrition'] = df.Attrition.astype("category").cat.codes
categorical_col.remove('Attrition')
label = LabelEncoder()
for column in categorical_col:
df[column] = label.fit_transform(df[column])
X = df.drop('Attrition', axis=1)
y = df.Attrition
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)```

5. 应用树和随机森林算法

```from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
def print_score(clf, X_train, y_train, X_test, y_test, train=True):
if train:
pred = clf.predict(X_train)
print("Train Result:
================================================")
print(f"Accuracy Score: {accuracy_score(y_train, pred) * 100:.2f}%")
print("_______________________________________________")
print(f"Confusion Matrix:
{confusion_matrix(y_train, pred)}
")
elif train==False:
pred = clf.predict(X_test)
print("Test Result:
================================================")
print(f"Accuracy Score: {accuracy_score(y_test, pred) * 100:.2f}%")
print("_______________________________________________")
print(f"Confusion Matrix:
{confusion_matrix(y_test, pred)}
")```

5.1 决策树分类器

criterion: 衡量拆分质量。支持的标准是基尼杂质的“基尼”和信息增益的“熵”。
splitter：用于在每个节点处选择拆分的策略。支持的策略是“best”选择最佳拆分和“random”选择随机拆分。
max_depth：树的最大深度。如果为None，则展开节点，直到所有叶节点，或者直到所有叶包含的样本小于min_samples_split。
min_samples_split：拆分内部节点所需的最小样本数。
min_samples_leaf:叶节点上所需的最小样本数。
min_weight_fraction_leaf:叶节点上所需的总权重的最小加权分数。当没有提供sample_weight时，样本具有相等的权值。
max_features：寻找最佳拆分时要考虑的特征数量。
max_leaf_nodesmax_leaf_nodes：以最佳优先的方式使用max_leaf_nodes形成树。最佳节点定义为杂质的相对减少。如果为None，则有无限数量的叶节点。
min_impurity_decrease：如果该拆分导致杂质减少大于或等于该值，则该节点将被拆分。
min_impurity_split: 提前停止的阈值。如果一个节点的杂质高于阈值，则该节点将拆分，否则，它是一个叶子。

```from sklearn.tree import DecisionTreeClassifier
tree_clf = DecisionTreeClassifier(random_state=42)
tree_clf.fit(X_train, y_train)
print_score(tree_clf, X_train, y_train, X_test, y_test, train=True)
print_score(tree_clf, X_train, y_train, X_test, y_test, train=False)```

5.2决策树分类器超参数调优

```from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV
params = {
"criterion":("gini", "entropy"),
"splitter":("best", "random"),
"max_depth":(list(range(1, 20))),
"min_samples_split":[2, 3, 4],
"min_samples_leaf":list(range(1, 20)),
}
tree_clf = DecisionTreeClassifier(random_state=42)
tree_cv = GridSearchCV(tree_clf, params, scoring="accuracy", n_jobs=-1, verbose=1, cv=3)
tree_cv.fit(X_train, y_train)
best_params = tree_cv.best_params_
print(f"Best paramters: {best_params})")
tree_clf = DecisionTreeClassifier(**best_params)
tree_clf.fit(X_train, y_train)
print_score(tree_clf, X_train, y_train, X_test, y_test, train=True)
print_score(tree_clf, X_train, y_train, X_test, y_test, train=False)```

5.3树的可视化

```from IPython.display import Image
from six import StringIO
from sklearn.tree import export_graphviz
import pydot
features = list(df.columns)
features.remove("Attrition")
dot_data = StringIO()
export_graphviz(tree_clf, out_file=dot_data, feature_names=features, filled=True)
graph = pydot.graph_from_dot_data(dot_data.getvalue())
Image(graph[0].create_png())```

5.4随机森林

n_estimators: 树的数量。
criterion: 衡量拆分质量的函数。支持的标准是gini和信息增益的“熵”。
max_depth：树的最大深度。如果为None，则展开节点，直到所有叶子都是纯的，或者直到所有叶子包含的样本少于min_samples_split。
min_samples_split：拆分内部节点所需的最小样本数。
min_samples_leaf：叶节点所需的最小样本数。min_samples_leaf只有在左右分支中的每个分支中至少留下训练样本时，才会考虑任何深度的分割点。这可能具有平滑模型的效果，尤其是在回归中。
min_weight_fraction_leaf：需要在叶节点处的总权重（所有输入样本的）的最小加权分数。当未提供 sample_weight 时，样本具有相同的权重。
max_features：寻找最佳分割时要考虑的特征数量。
max_leaf_nodesmax_leaf_nodes：以最佳优先方式种植一棵树。最佳节点定义为杂质的相对减少。如果 None 则无限数量的叶节点。
min_impurity_decrease：如果该分裂导致杂质减少大于或等于该值，则该节点将被分裂。
min_impurity_split: 树提前停止的阈值。如果一个节点的杂质高于阈值，则该节点将分裂，否则，它是一个叶子。
bootstrap：构建树时是否使用bootstrap样本。如果为 False，则使用整个数据集来构建每棵树。
oob_score：是否使用out-of-bag样本来估计泛化准确度。

```from sklearn.ensemble import RandomForestClassifier
rf_clf = RandomForestClassifier(n_estimators=100)
rf_clf.fit(X_train, y_train)
print_score(rf_clf, X_train, y_train, X_test, y_test, train=True)
print_score(rf_clf, X_train, y_train, X_test, y_test, train=False)```

5.5随机森林超参数调优

```n_estimators = [100, 500, 1000, 1500]
max_features = ['auto', 'sqrt']
max_depth = [2, 3, 5]
max_depth.append(None)
min_samples_split = [2, 5, 10]
min_samples_leaf = [1, 2, 4, 10]
bootstrap = [True, False]
params_grid = {'n_estimators': n_estimators, 'max_features': max_features,
'max_depth': max_depth, 'min_samples_split': min_samples_split,
'min_samples_leaf': min_samples_leaf, 'bootstrap': bootstrap}
rf_clf = RandomForestClassifier(random_state=42)
rf_cv = GridSearchCV(rf_clf, params_grid, scoring="f1", cv=3, verbose=2, n_jobs=-1)
rf_cv.fit(X_train, y_train)
best_params = rf_cv.best_params_
print(f"Best parameters: {best_params}")
rf_clf = RandomForestClassifier(**best_params)
rf_clf.fit(X_train, y_train)
print_score(rf_clf, X_train, y_train, X_test, y_test, train=True)
print_score(rf_clf, X_train, y_train, X_test, y_test, train=False)```