目录
1.导库
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
2.导入数据集,探索数据
data = pd.read_csv(r"C:\Users\yang\Desktop\机器学习\【机器学习】菜菜的sklearn课堂(1-12全课)\01 决策树课件数据源码\data.csv")
data.head()
# 中文名替换
zh_label = ['乘客ID','是否存活','船舱等级','姓名','性别','年龄','兄弟姐妹','父母小孩','票号','费用','舱号','登船口']
en_label = data.columns.values.tolist()
zh_label_dict = dict(zip(en_label,zh_label))
zh_label_dict
data.rename(columns =zh_label_dict ,inplace=True)
data.head()
data.info()
数据探索结论:
- 舱号、姓名、票号与预测的y无关 → 删除
- 年龄缺失200+ → 填补(中值、众数、随机森林)
- 登船口缺失2 → 删除所在行
- 性别、登船口需要转换成数值型
3.数据预处理
# 删除缺失值过多的列和与Y无关的列
data.drop(["舱号","姓名","票号"],inplace=True,axis=1)
# 填补缺失值较多的列
data["年龄"] = data["年龄"].fillna(data["年龄"].mean())
# 删除缺失较少的列所在的行
data = data.dropna()
# 将分类变量转换为数值型变量
#将二分类变量转换为数值型变量
ata["性别"] = (data["性别"] == "male").astype("int")
#将三分类变量转换为数值型变量
labels = data["登船口"].unique().tolist() # 数组 → 列表
data["登船口"] = data["登船口"].apply(lambda x: labels.index(x))
# 查看处理后的数据集
data.head()
4.提取标签和特征矩阵,分测试机和训练集
X = data.iloc[:,data.columns != "是否存活"]
y = data.iloc[:,data.columns == "是否存活"]
from sklearn.model_selection import train_test_split
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3)
# 修正测试机和训练集的索引
for i in [Xtrain, Xtest, Ytrain, Ytest]:
i.index = range(i.shape[0])
# 查看分好的训练集和测试集
Xtrain.head()
5.导入模型,粗略跑一下查看结果
clf = DecisionTreeClassifier(random_state=25) # 实例化
clf = clf.fit(Xtrain, Ytrain) # 训练
score_ = clf.score(Xtest, Ytest) # 打分
score_
score = cross_val_score(clf,X,y,cv=10).mean() # 交叉验证
score
6.在不同max_depth下观察模型的拟合状况
tr = []
te = []
for i in range(10):
clf = DecisionTreeClassifier(random_state=25
,max_depth=i+1
,criterion="entropy" # 一般用基尼系数(默认),两个都试试
)
clf = clf.fit(Xtrain, Ytrain)
score_tr = clf.score(Xtrain,Ytrain) # 训练集打分
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="blue",label="test")
plt.xticks(range(1,11))
plt.legend()
plt.show()
7.网格搜索调参
网格搜索:能够帮助我们同时调整多个参数的技术,枚举技术。我们将给网格搜索提供一个字典,字典是一组一组的参数和对应参数的取值范围,我们告诉网格搜索请帮我调整这些参数在这些范围内取值能让模型达到最好效果的参数组合。因为参数交叉进行,看起来像网格,所以叫网格搜索。
缺点:计算量大、耗时
网格搜索不会自动合并参数,因此网格搜索出来的组合不一定有自己调的高。
import numpy as np
gini_thresholds = np.linspace(0,0.5,20) # 范围内取20个等差数列
parameters = {'splitter':('best','random')
,'criterion':("gini","entropy")
,"max_depth":[*range(1,10)]
,'min_samples_leaf':[*range(1,50,5)] # 5是步长
,'min_impurity_decrease':[*np.linspace(0,0.5,20)]
}
clf = DecisionTreeClassifier(random_state=25)
GS = GridSearchCV(clf, parameters, cv=10)
GS.fit(Xtrain,Ytrain)
GS.best_params_
GS.best_score_