决策树①——信息熵&信息增益&基尼系数
决策树②——决策树算法原理(ID3,C4.5,CART)
决策树③——决策树参数介绍(分类和回归)
决策树④——决策树Sklearn调参(GridSearchCV调参及过程做图)
决策树⑤——Python代码实现决策树
决策树应用实例②——用户流失预测模型
决策树应用实例③——银行借贷模型
泰坦尼克号是二分类问题,今天尝试用决策树进行分类
1、导入数据集
2、数据清洗:
① 删除对分类无帮助的特征
② 将某些字符串特征数值化
③ 填补缺失值或删除
3、对数据集用train_test_split切割成训练集和验证集
4、用sklearn默认参数生成一棵普通的决策树,看训练集和验证集的评分
5、通过GridSearchCV进行调参,得到最优的参数并生成最终的树
6、用混淆矩阵得出此决策树的各项评判分值
# 导入库
import pandas as pd
import numpy as np
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV
from sklearn import metrics
# 导入数据并清洗
def read_dataset(data_link):
data = pd.read_csv(data_link, index_col=0) # 读取数据集,取第一列为索引
data.drop(['Name', 'Ticket', 'Cabin'], axis=1, inplace=True) # 删除掉三个无关紧要的特征
labels = data['Sex'].unique().tolist()
data['Sex'] = [*map(lambda x: labels.index(x), data['Sex'])] # 将字符串数值化
labels = data['Embarked'].unique().tolist()
data['Embarked'] = data['Embarked'].apply(lambda n: labels.index(n)) # 将字符串数值化
data = data.fillna(0) # 将其余缺失值填充为0
return data
train = read_dataset('train.csv')
y = train['Survived'].values # 类别标签
x = train.drop(['Survived'], axis=1).values # 所有样本特征
# 对样本进行随意切割,得到训练集和验证集
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2)
clf = DecisionTreeClassifier() # 先不进行调参,看训练样本和测试样本分数如何
clf.fit(x_train, y_train)
print('train score:', clf.score(x_train, y_train))
print('test score:', clf.score(x_test, y_test))
可以看出训练集拟合非常好,但是测试集拟合较差,说明过拟合了,要调参
param = [{'criterion':['gini'],'max_depth': np.arange(20,50,10),'min_samples_leaf':np.arange(2,8,2),'min_impurity_decrease':np.linspace(0.1,0.9,10)},
{'criterion':['gini','entropy']},
{'min_impurity_decrease':np.linspace(0.1,0.9,10)}]
clf = GridSearchCV(DecisionTreeClassifier(),param_grid=param,cv=10)
clf.fit(x_train,y_train)
print(clf.best_params_,clf.best_score_)
经过调参,最佳的参数如图所示,生成决策树如下:
# 按最优参数生成决策树
model = DecisionTreeClassifier(max_depth=20,min_impurity_decrease=0.1, min_samples_leaf=2)
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
print('train score:', clf.score(x_train, y_train))
print('test score:', clf.score(x_test, y_test))
print("查准率:", metrics.precision_score(y_test,y_pred))
print('召回率:',metrics.recall_score(y_test,y_pred))
print('f1分数:', metrics.f1_score(y_test,y_pred)) #二分类评价标准
调完参数后分值并无太大变化,从查准率、召回率和f1分数来看,也处于一般水平,说明泰坦尼克号问题可能并不适合用决策树进行分类