1.1 数据集的获取
✨ 注意:本文仅使用其中的train.csv
文件。
1.2 数据的读取与信息查看
通常,数据的读取与信息查看的python函数主要包括如下三个:
pandas.read_csv()
函数:读取数据;head()
函数:查看数据的前5行,用于了解数据的整体结构;info()
函数:查看数据的整体统计信息。读取train.csv
数据的python代码:
import pandas as pd
train_data = pd.read_csv('./titanic/train.csv')
查看数据的前5行:
train_data.head()
本文以Survived
列,即以是否存活为目标值。
查看数据的整体统计信息:
train_data.info()
1.3 数据预处理
由于乘客姓名Name
、乘票信息Ticket
与客舱名称Cabin
特征对于乘客的存活影响很小,所以下面首先将其从train_data
中剔除:
train_data.drop(
['Cabin', 'Name', 'Ticket'], # 需要删除的列
inplace=True, # 替换原始数据
axis=1 # 对列进行操作
)
train_data.head()
此时可以通过下面的命令查看train_data
是否存在缺失值:
print(train_data.isnull().any())
由此可以看出Age
乘客年龄特征与Embarked
登船港口特征具有缺失值。下面通过下面的命令处理缺失值:
# 使用所有乘客的平均年对年龄特征进行缺失值填充
train_data['Age'] = train_data['Age'].fillna(
train_data['Age'].mean()
)
# 删除Embarked属性具有缺失值的行
train_data = train_data.dropna()
由于决策树无法处理字符串,下面将字符串的特征转换为数值形式。此时,具有字符串的特征属性包括性别属性Sex
与登船港口属性Embarked
,我们可以通过下面命令查看这两个属性包括的类别:
print("性别具有的类别:", train_data['Sex'].unique())
print("登船的港口类别:", train_data['Embarked'].unique())
由此,可以看出性别属性Sex
具有两类,登船的港口属性Embarked
具有三类。下面对这两个属性进行如下操作:
Sex
的处理代码:# 将性别属性Sex转为0,1整形数据,1表示男性,0表示女性
train_data["Sex"] = (train_data['Sex'] == "male").astype("int")
Embarked
的处理代码:# 首先将登船港口类别转换为列表格式
labels = train_data['Embarked'].unique().tolist()
# 然后获取每个登船港口类型的index值,并将其存储到train_data中
train_data["Embarked"] = train_data["Embarked"].apply(
lambda x: labels.index(x)
)
此时,数据已经处理完毕,可以通过train_data.head()
命令查看数据信息,以确认数据的情况。
由上图可以看出Sex与Embarked属性均已经处理妥当。
为了能够使用sklearn
库进行决策树设计,这里需要将预处理后的数据集train_data
划分为观测数据X
(特征值)与目标值y
(存活状况),代码如下所示:
X = train_data.loc[:, train_data.columns != "Survived"]
y = train_data.loc[:, train_data.columns == "Survived"]
至此,我们就可以着手设计决策树分类算法了。
本文使用sklearn库进行决策树分类算法的实现,主要包括如下几个步骤:
!! ✨ 网格搜索:通过枚举技术对多个参数进行优化分析,以提高模型的预测精度。
sklearn
提供了GridSearchCV
方法,其集成了拟合训练(fit
)、性能评价(score
)以及交叉验证(cross_val_score
)三个步骤的类方法,最终返回超参数网格parameters
搜索后的最佳模型,通过它可以方便地寻找出模型的最佳超参数。
sklearn.tree.DecisionTreeClassifier
所能调整的超参数可以参考博文:Python人工智能:基于sklearn的决策树分类算法实现总结的第三部分。代码如下所示:
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.model_selection import GridSearchCV
import numpy as np
# (1) 将数据集划分为训练数据集与测试数据集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3
)
# 由于train_test_split会对数据集进行随机排序,
# 为了防止后续数据分析出现混乱,使用如下代码将
# 索引变成顺序索引
for i in [X_train, X_test, y_train, y_test]:
i.index = range(i.shape[0])
# (2) 实例化决策树模型
clf = DecisionTreeClassifier()
# (3) 网格搜索技术调整决策树超参数
# 设置超参数搜索网格参数
parameters = {
"criterion": ("gini", "entropy"),
"splitter": ("best", "random"),
"max_depth": [*range(1,10)],
"min_samples_leaf": [*range(1, 30, 3)],
"min_impurity_decrease": [*np.linspace(0, 0.5, 20)]
}
# 使用GridSearchCV对超参数网格parameters进行网络搜索,
# 并以10折交叉验证方法得到评价结果
GS = GridSearchCV(clf, parameters, cv=10) # 实例化网格搜索对象
GS = GS.fit(X_train, y_train) # 对训练数据集进行训练
# 返回最佳超参数组合
print("\n最佳的超参数组合:\n", GS.best_params_)
# 返回最佳的模型评价结果
print("\n最佳的分类评价结果:\n", GS.best_score_)
最佳的预测结果为80.7%。