在机器学习领域,算法主要分为两大类:监督学习算法和无监督学习算法。决策树算法属于监督学习算法的一种。监督学习算法还包括随机森林、K最近邻、朴素贝叶斯、逻辑回归、线性回归、提升算法等,它们都用于预测输出。基于历史数据,这些算法能够指示新数据的新输出。下面将详细介绍决策树算法。
决策树算法是一种用于分类和回归问题的监督学习算法,主要用于分类模型。它是一个树状结构的分类器,包含根节点、叶节点、分支树、父节点和子节点。这些节点帮助预测输出。
根节点:代表整个数据集。 叶节点:代表最后一个节点,即输出标签。 分支树:整个树的一个子部分称为分支树。 父节点:被分成子节点的节点称为父节点。 子节点:父节点的子节点称为子节点。 分裂:将节点分成子节点的过程称为分裂。 剪枝:停止决策节点的子节点的过程称为剪枝,即分裂的相反过程。 决策节点:基于条件将子节点进一步分成子节点的过程称为决策节点。
在决策树中,为了预测给定数据集的类别,算法从树的根节点开始,比较根属性的值与记录(实际数据集)属性的值,并根据比较结果跟随分支跳到下一个节点。算法再次比较属性值与其他子节点的值,并进一步移动。这个过程一直持续,直到到达树的叶节点。下面是一个简单的算法步骤:
一个简单的例子是使用泰坦尼克号数据集来预测乘客是否生存。在这个例子中,只使用了三个列/属性/特征——性别、年龄和兄弟姐妹数量(配偶或孩子的人数)。
在实现决策树算法时,人们会怀疑如何选择根节点和子节点。有一种称为属性选择度量(ASM)的技术。这种技术包括两种方法:
信息增益:熵是每个标签的概率乘以相同标签的对数概率的总和。它是一个随机数据源产生信息的平均速率,或者衡量与随机变量相关的不确定性。信息增益是观察另一个随机变量时获得的关于一个随机变量或信号的信息量。它倾向于具有不同值的较小分区。
基尼指数:通过从1中减去每个类别的平方概率之和来计算。它倾向于较大的分区。
在树算法中,剪枝概念扮演着重要的角色。当模型建立在大型数据集上时,可能会遇到模型过拟合的问题。为了减少这个问题,剪枝会有所帮助。剪枝是停止将节点分裂成子节点的过程。这里有两种类型:
为了构建模型,需要预处理数据,转换数据,将数据分割为训练和测试,然后构建模型。首先,需要导入数据集,将其分配给一个变量,然后查看它。
import pandas as pd
import numpy as np
data=pd.read_csv('train.csv')
data.head()
输出:
Survived Pclass Sex Age SibSp
0 0 3 male 22.0 1
1 1 1 female 38.0 1
2 1 3 female 26.0 1
3 0 3 female 35.0 1
4 0 1 male 35.0 0
“Survived”列是上述图像中的输出变量,其余列是输入变量。接下来,可以描述数据集并检查均值、标准差和百分位数值。
data.describe()
输出:
Survived Pclass Age SibSp
count 891.000000 891.000000 714.000000 891.000000
mean 0.383838 2.308642 29.699118 0.523008
std 0.486592 0.836071 14.526497 1.102743
min 0.000000 1.000000 0.420000 0.000000
25% 0.000000 2.000000 20.125000 0.000000
50% 0.000000 3.000000 28.000000 0.000000
75% 1.000000 3.000000 38.000000 1.000000
max 1.000000 3.000000 80.000000 8.000000
检查是否有缺失值。如果有,则用均值或中位数替换或删除。
data.isna().sum()
输出:
Survived 0
Pclass 0
Sex 0
Age 177
SibSp 0
从上述图像中,0表示列中没有缺失值,177表示该列中有177个缺失值。因此,目前删除了包含缺失值的所有行。
data.dropna(inplace=True)
删除缺失值后,再次检查是否已删除。
data.isna().sum()
输出:
Survived 0
Pclass 0
Sex 0
Age 0
SibSp 0
从上述图像中,成功删除了缺失值行。模型只处理数值数据。因此,现在检查数据集中是否有任何分类数据。如果输入数据中有任何分类属性,使用虚拟变量将其转换为数值。
data.info()
输出:
Int64Index: 714 entries, 0 to 890
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Survived 714 non-null int64
1 Pclass 714 non-null int64
2 Sex 714 non-null object
3 Age 714 non-null float64
4 SibSp 714 non-null int64
dtypes: float64(1), int64(3), object(1)
memory usage: 33.5+ KB
在上述图像中,Dtype对象存在,这意味着“Sex”列是分类的。现在应用虚拟变量方法,将其转换为数值。
data_1=pd.get_dummies(data.Sex,drop_first=True)
data_1.head()
输出:
male
0 1
1 1
2 0
3 0
4 1
从上述图像中,将性别分类列转换为数值。“1”代表男性,“0”代表女性。目前,没有更改男性列的名称。如果愿意,可以更改。现在,从数据集中删除原始列,并将新列添加到其中。
data.drop(['Sex'],inplace=True,axis=1)
data.head(3)
输出:
Survived Pclass Age SibSp
0 0 3 22.0 1
1 1 1 38.0 1
2 1 3 26.0 0
从上述图像中,新列已添加。现在所有列都是数值。
在分割数据之前,首先将输入和输出数据分开。将数据集分成训练和测试两部分。当模型存在拟合问题时,可以调整比例。
y=data1[['Survived']]
y.head(2)
输出:
Survived
0 0
1 1
x=data1.drop([‘Survived’],axis=1)
x.head(2)
输出:
Pclass Age SibSp male
0 3 22.0 1 1
1 1 38.0 1 1
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.30, random_state=0)
从上述图像中,x是输入变量,y是输出变量。对于这两个数据,导入了train_test_split方法。将数据分成70:30的比例,即训练数据占70%,测试数据占30%。为此,给出了test_size=0.30。
应用归一化或标准化,将所有属性值带到0-1。这有助于减少方差效应。
from sklearn.preprocessing import StandardScaler
st_x= StandardScaler()
x_train= st_x.fit_transform(x_train)
x_test= st_x.fit_transform(x_test)
print(x_train[1])
print(x_test[1])
输出:
array([-0.29658278, 0.10654022, -0.55031787, 0.75771531])
array([-1.42442296, 1.34921876, -0.56156739, -1.31206669])
从上述图像中,可以观察到所有值都已标准化。
从Sklearn库中导入模型并构建它。
from sklearn.tree import DecisionTreeClassifier
classifier= DecisionTreeClassifier(criterion='entropy', random_state=0)
classifier.fit(x_train, y_train)
从上述图像中,成功构建了模型。这个模型是在训练数据上创建的。
构建模型后,可以预测输出。
y_pred= classifier.predict(x_test)
y_pred
输出:
array([0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0,
1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0,
1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0], dtype=int64)
from sklearn.metrics import confusion_matrix
cm= confusion_matrix(y_test, y_pred)
cm
array([[106, 19],
[ 32, 58]], dtype=int64)