<>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 from
sklearn.model_selection import train_test_split import matplotlib.pyplot as plt
import numpy as np
<>2.准备数据集(需要数据集可以评论)
#不同路径下选择不同路径 data = pd.read_csv(r
"D:\download\sklearnjqxx_jb51\【机器学习】菜菜的sklearn课堂(1-12全课)\01 决策树课件数据源码\data.csv",
index_col=0) data.head()
<>3.查看数据信息
data.info()
查看数据信息如下:
<class 'pandas.core.frame.DataFrame'> Int64Index: 891 entries, 1 to 891 Data
columns (total 11 columns): Column Non-Null Count Dtype --- ------
-------------- ----- 0 Survived 891 non-null int64 1 Pclass 891 non-null int64
2 Name 891 non-null object 3 Sex 891 non-null object 4 Age 714 non-null float64
5 SibSp 891 non-null int64 6 Parch 891 non-null int64 7 Ticket 891 non-null
object 8 Fare 891 non-null float64 9 Cabin 204 non-null object 10 Embarked 889
non-null object dtypes: float64(2), int64(4), object(5) memory usage: 83.5+ KB
<>3.数据预处理
#删除缺失值过多的列,和观察判断来说和预测的y没有关系的列 data.drop(['Name', 'Ticket', 'Cabin'], axis=1,
inplace=True) data.head() #处理缺失值,对缺失值较多的列进行填补,有一些特征只确实一两个值,可以采取直接删除记录的方法 data[
'Age'] = data['Age'].fillna(data['Age'].mean()) data = data.dropna()
#将分类变量转换为数值型 data['Sex'] = data['Sex'].map({'male' : 1, 'female' : 0})
#也可采用下面这条语句进行转换 #data['sex'] = (data['sex']=='male').astype('int')
#将三分类变量转换为数值型变量,也可直接采用map函数或apply labels = data["Embarked"].unique().tolist()
data["Embarked"] = data["Embarked"].apply(lambda x: labels.index(x)) data.head()
<>4.提取标签和特征矩阵,分测试集和训练集
X = data.iloc[:, data.columns != "Survived"] y = data.iloc[:, data.columns ==
"Survived"] #利用内置函数划分训练集测试集 Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, y
, test_size=0.3)
<>5.导入模型,粗略跑一下查看结果
#clf精度计算 clf = DecisionTreeClassifier(random_state=25) 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.fit(Xtrain, Ytrain) #记录两种结果 score_tr
= clf.score(Xtest, Ytest) score_te = cross_val_score(clf, X, y, cv=10).mean() tr
.append(score_tr) te.append(score_te)
<>7.结果可视化
plt.figure() plt.plot(range(1, 11), tr, color='red', label='train') plt.plot(
range(1, 11), te, color='blue', label='test') plt.legend() plt.xticks(range(1,
11)) plt.show()
结果图如下

我们从上图发现我们的结果有一些欠拟合,我们下一步采用进一步网格搜索对参数进行优化。

<>8.用网格搜索调整参数
gini_thresholds = np.linspace(0,0.5,20) parameters = {'splitter':('best',
'random') ,'criterion':("gini","entropy") ,"max_depth":[*range(1,10)] ,
'min_samples_leaf':[*range(1,50,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_
输出的最佳参数为
{'criterion': 'gini', 'max_depth': 9, 'min_impurity_decrease': 0.0,
'min_samples_leaf': 6, 'splitter': 'best'}
最佳正确率为0.8458013312852021。

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:766591547
关注微信