决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。决策树算法容易理解,适用各种数据,在解决各种问题时都有良好表现,尤其是以树模型为核心的各种集成算法,在各个行业和领域都有广泛的应用。
泰坦尼克号幸存者的预测
数据点击这里可以下载——>
点击这里下载
。也可以在评论区留下你的邮箱,我发送给您。
首先导入所用到的库:
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score
将数据导入:
data = pd.read_csv('taitannikehao.csv')
查看数据前五行:
data.head()
查看数据状况:
data.info()
将"Cabin",“Name”,"Ticket"这三个列删除,对预测影响没有影响。
data.drop(["Cabin","Name","Ticket"],inplace=True,axis=1)#inplace 表示是否覆盖原表
再次查看数据:
data.info()
发现"Age"列有200多缺失值,这里我们选择用平均值填充。
data["Age"] = data["Age"].fillna(data['Age'].mean())
“Age”列缺失值已经处理完毕,“Embarke”有两个缺失值,直接将这两个含有缺失值的行删除掉即可,因为影响并不大。
data = data.dropna()
现在已经将没用的列和缺失值进行处理完毕 ,查看一下数据。
data.head()
接下来要把object类型转换成数字类型:
labels =data["Embarked"].unique().tolist()
data["Embarked"] = data["Embarked"].apply(lambda x: labels.index(x))
现在发现"Embarked“列已经从S,C,Q,转变成了0,1,2.
将性别转换成0,1:
data["Sex"] = (data["Sex"] == "male").astype("int")#利用先判断是否为male,然后将T和F转换成数字0,1
data.head()
进行数据集划分,训练集和测试集。
x = data.iloc[:,data.columns != "Survived"] #除了Survived列都提取
y = data.iloc[:,data.columns == "Survived"]# 只提取Survived列
from sklearn.model_selection import train_test_split #导入划分训练集和测试集的库
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3)#划分数据
将划分好的数据集,重置索引:
for i in [x_train,x_test,y_train,y_test]:
i.index = range(i.shape[0])#对四个数据集都进行划分
实例化
clf = DecisionTreeClassifier(random_state=25)
对数据进行训练
clf=clf.fit(x_train,y_train)
求出训练评分
score = clf.score(x_test,y_test)
score
查看使用交叉验证的效果如何
from sklearn.model_selection import cross_val_score
clf = DecisionTreeClassifier(random_state=25)
#使用交叉验证
score = cross_val_score(clf,x,y,cv = 10).mean()
score
发现结果还不如上面的评分高,所以某种模式不一定适合。
画出图像
tr = []
te = []
for i in range(10):
clf = DecisionTreeClassifier(random_state=25
,max_depth = i + 1
,criterion = "entropy" )
clf = clf.fit(x_train,y_train)
score_tr = clf.score(x_train,y_train)
score_te = cross_val_score(clf,x,y,cv = 10).mean()
tr.append(score_tr)
te.append(score_te)
print(max(te))#查看最大值
plt.plot(range(1,11),tr,color = "red",label = "train")
plt.plot(range(1,11),te,color = "b",label = "test")
plt.legend()
plt.show()
使用网格搜索查看最适合的参数选项:
import numpy as np
parameters = {
"criterion":("gini","entropy")
,"splitter":("best","random")
,"max_depth":[*range(3,10)]
,"min_samples_leaf":[*range(1,50,5)]
,"min_impurity_decrease":[*np.linspace(0,0.5,20)]#这个20的值不宜设置过大,不然运行时间太长,我这里设置的20运行了三分钟多
}
clf = DecisionTreeClassifier(random_state=25)
GS = GridSearchCV(clf,parameters,cv = 10)
GS = GS.fit(x_train,y_train)
GS.best_params_ #从我们输入的参数和参数取值的列表中,返回最佳组合
GS.best_score_ #网格搜索后的模型的评判标准
这个返回的参数最合适的为:{‘criterion’: ‘gini’,
‘max_depth’: 7,
‘min_impurity_decrease’: 0.0,
‘min_samples_leaf’: 1,
‘splitter’: ‘best’}
但是这并不一定是最适合这个模型的,有可能它不需要某个参数,但是因为设定的时候给他加了这个参数,他必须要选择这个参数,所以要对这个有取有舍,参数测试这去添加。