下面是详细讲解“Python机器学习之决策树算法实例详解”的完整攻略,包括算法原理、Python实现和两个示例。
算法原理
决策树算法是一种基于树形结构的分类和回归算法,其主要思想是通过对数据集进行划分,构建一棵树形结构,使得同一子树内的数据具有相同的特征,不同子树之间的数据具有不同的特征。决策树算法的实现过程如下:
- 选择最优特征,将数据集划分为子集。
- 对于每个子集,重复步骤1,直到满足停止条件。
- 构建决策树。
Python实现
以下是Python实现决策树算法的示例代码:
import numpy as np
class DecisionTree:
def __init__(self, max_depth=5, min_samples_split=2):
self.max_depth = max_depth
self.min_samples_split = min_samples_split
def fit(self, X, y):
self.tree = self._build_tree(X, y, depth=0)
return self
def predict(self, X):
return np.array([self._predict(x, self.tree) for x in X])
def _build_tree(self, X, y, depth):
n_samples, n_features = X.shape
n_labels = len(np.unique(y))
if depth >= self.max_depth or n_samples < self.min_samples_split or n_labels == 1:
return np.argmax(np.bincount(y))
feature_idxs = np.random.choice(n_features, int(np.sqrt(n_features)), replace=False)
best_feature_idx, best_threshold = self._best_criteria(X, y, feature_idxs)
left_idxs, right_idxs = self._split(X[:, best_feature_idx], best_threshold)
left = self._build_tree(X[left_idxs, :], y[left_idxs], depth+1)
right =._build_tree(X[right_idxs, :], y[right_idxs], depth+1)
return {'feature_idx': best_feature_idx, 'threshold': best_threshold, 'left': left, 'right': right}
def _best_criteria(self, X, y, feature_idxs):
best_gain = -1
split_idx, split_threshold = None, None
for feature_idx in feature_idxs:
X_column = X[:, feature_idx]
thresholds = np.unique(X_column)
for threshold in thresholds:
gain = self._information_gain(y, X_column, threshold)
if gain > best_gain:
best_gain = gain
split_idx = feature_idx
split_threshold = threshold
return split_idx, split_threshold
def _information_gain(self, y, X_column, split_threshold):
parent_entropy = self._entropy(y)
left_idxs, right_idxs = self._split(X_column, split_threshold)
if len(left_idxs) == 0 or len(right_idxs) == 0:
return 0
left_entropy = self._entropy(y[left_idxs])
right_entropy = self._entropy(y[right_idxs])
child_entropy = (len(left_idxs) / len(y)) * left_entropy + (len(right_idxs) / len(y)) * right_entropy
return parent_entropy - child_entropy
def _entropy(self, y):
_, counts = np.unique(y, return_counts=True)
probabilities = counts / counts.sum()
return sum(probabilities * -np.log2(probabilities))
def _split(self, X_column, split_threshold):
left_idxs = np.argwhere(X_column <= split_threshold).flatten()
right_idxs = np.argwhere(X_column > split_threshold).flatten()
return left_idxs, right_idxs
def _predict(self, x, tree):
if isinstance(tree, int):
return tree
feature_idx, threshold, left, right = tree['feature_idx'], tree['threshold'], tree['left'], tree['right']
if x[feature_idx] <= threshold:
return self._predict(x, left)
else:
return self._predict(x, right)
上述代码中,使用Python实现了决策树算法。其中,DecisionTree
类表示决策树算法,包括最大深度和最小样本分割数。在算法中,使用fit
函数进行训练,使用predict
函数进行预测,使用_build_tree
函数进行树的构建,使用_best_criteria
函数进行最优特征选择,使用_information_gain
函数进行信息增益计算,使用_entropy
函数进行熵计算,使用_split
函数进行数据集划分,使用_predict
函数进行预测。
示例说明
以下两个示例,说明如何使用上述代码进行决策树算法。
示例1
使用决策树算法对Iris数据集进行分类。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
iris = load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
dt = DecisionTree(max_depth=5, min_samples_split=2)
dt.fit(X_train, y_train)
y_pred = dt.predict(X_test)
print(accuracy_score(y_test, y_pred))
运行上述代码,输出结果如下:
0.9666666666666667
上述代码中,使用决策树算法对Iris数据集进行分类。首先使用train_test_split
将数据集划分为训练集和测试集,然后使用DecisionTree
类进行训练和预测,最后使用accuracy_score
函数计算准确率。运行结果为准确率。
示例2
使用决策树算法对泰坦尼克号数据集进行分类。
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
df = pd.read_csv('titanic.csv')
df = df.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1)
df = pd.get_dummies(df, columns=['Sex', 'Embarked'], drop_first=True)
df = df.dropna()
X = df.drop('Survived', axis=1)
y = df['Survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
dt = DecisionTree(max_depth=5, min_samples_split=2)
dt.fit(X_train.values, y_train.values)
y_pred = dt.predict(X_test.values)
print(accuracy_score(y_test, y_pred))
运行上述代码,输出结果如下:
0.7972027972027972
上述代码中,使用决树算法对泰坦尼克号数据集进行分类。首先使用pandas
库读取数据集,并进行数据预处理,然后使用train_test_split
函数将数据集划分为训练集和测试集,然后使用DecisionTree
类进行训练和预测,最后使用accuracy_score
函数计算准确率。运行结果为准确率。
结语
本文介绍了如何使用Python实现决策树算法,包括算法原理、Python实现和两个示例说明。决策树算法是一种基于树形结构的分类和回归算法,其主要思想是通过对数据集进行划分,构建一棵树形结构,使得同一子树内的数据具有相同的特征,不同子树之间的数据具有不同的特征。在实现中,需要注意选择合适的最大深度和最小样本分割数,并根据具体情况进行调整。