美文网首页
Machine Learning——决策树

Machine Learning——决策树

作者: 小弦弦喵喵喵 | 来源:发表于2019-08-13 09:27 被阅读0次

样例参考自《从零开始学Python数据分析与挖掘》一书.

数据集

https://github.com/SnakeLiu/Python-Data-Aanalysis-and-Miner
第十章决策树与随机森林模型中 Titanic.csv
数据集表示在Titanic事件中乘客的幸存情况.Survived为因变量,为1表示该乘客幸存,为0表示该乘客不幸遇难,其他变量均为自变量.

数据清洗

先导入pandas模块,调用read_csv()方法并读取数据,返回一个DataFrame.

import pandas as pd

Titanic=pd.read_csv('Titanic.csv')

通过Titanic.head()可以获得这个DataFrame的前几行数据,不输入参数默认返回前5行.

print(Titanic.head())
打印DataFrame的前5行数据

其中PassengerId,Ticket,Cabin三个自变量对因变量没有直接的影响,因此将这三列去除.axis=1表示影响的是列,axis=0则表示影响的是行.inplace=True表示直接修改原DataFrame,inplace=False则表示不修改原DataFrame.

Titanic.drop(['PassengerId','Name','Ticket','Cabin'],axis=1,inplace=True)

检查剩余变量中是否有缺失值.Titanic.isnull()将返回一个结构和原先一致的DataFrame,内容为True(空)或Fals(非空),再通过sum()方法进行累加,axis=0表示按行进行累加.

print(Titanic.isnull().sum(axis=0))
检查剩余变量中是否有缺失值

可以发现Age有177个缺失值,较多,我们用均值填充法进行填充.Embarked有2个缺失值,较少,我们用众数填充法进行填充.
loc方法通过具体值来取DataFrame中符合的行,与此对应的还有iloc方法,通过行号来取DataFrame中的数据.
fillna()方法用来填充DataFrame中的缺失值.
这里先分别计算了男女的性别平均值,再将Titanic拆成temp1(男性),和temp2(女性)分别进行填充,最后调用concat()方法将temp1和temp2合成新的Titanic,并调用rest_index()方法对index进行重排.
对于Embarked,直接取其众数进行填充.

fillna_Titanic=[]
maleAveAge=round(Titanic.Age[Titanic.Sex=='male'].mean())
femaleAveAge=round(Titanic.Age[Titanic.Sex=='female'].mean())
temp1=Titanic.loc[Titanic.Sex=='male'].fillna(value={'Age':maleAveAge})
temp2=Titanic.loc[Titanic.Sex=='female'].fillna(value={'Age':femaleAveAge})
temp=[]
temp.append(temp1)
temp.append(temp2)
Titanic=pd.concat(temp)
Titanic.reset_index(drop=True, inplace=True)
Titanic.fillna(value={'Embarked':Titanic.Embarked.mode()[0]},inplace=True)

Pclass当前为int型,然而Pclass直接的1,2,3并没有数值上的倍数关系,因此需要对其进行类型转换.astype()方法用于强制类型转换,将Pclass转换为object型,方便于之后的哑变量处理.

Titanic.Pclass=Titanic.Pclass.astype('object')

对Sex,Embarked,Pclass三个变量进行哑变量处理.get_dummies()方法返回一个包含哑变量的DataFrame,调用concat()方法将新的DataFrame与原先的DataFrame进行合并,并drop掉原始的Sex,Embarked,Pclass三列.

dummy=pd.get_dummies(Titanic[['Sex','Embarked','Pclass']])
Titanic=pd.concat([Titanic,dummy],axis=1)
Titanic.drop(['Sex','Embarked','Pclass'],inplace=True,axis=1)

至此,对数据集的清洗已经完成,部分数据如下所示.


清洗后的数据

调参获取最佳参数

sklearn是封装好的机器学习库,导入相关的包.model_selection用于划分数据集.GridSearchCV通过网格搜索法,用于自动调参.tree中包含了封装好的决策树.metrics用于对模型的性能进行评估.
Titanic.columns获得所有列的名称,取第1行至最后一行,这些是自变量,而第0行是因变量.
调用model_selection.train_test_split()方法可以对训练集和测试集进行划分,返回参数格式为固定写法,方法参数中的第一个为特征数据,第二个为标签数据,第三个为测试集/训练集的大小,第四个为随机种子.

from sklearn import model_selection
from sklearn.model_selection import GridSearchCV
from sklearn import tree
from sklearn import metrics

predictors=Titanic.columns[1:]
X_train,X_test,Y_train,Y_test=model_selection.train_test_split(Titanic[predictors],Titanic.Survived,test_size=0.25,random_state=1234)

通过网格搜索法进行调参,构建决策树模型.先预设模型参数,等下将在这些候选参数中进行搜索.将预设好的各个参数封装成一个字典,调用GridSeachCV()方法进行网格搜索,方法中的第一个参数为所使用的分类器,第二个参数为需要优化的参数的候选取值,第三个参数为进行几重交叉验证,返回结果为一个决策树模型.再调用模型的fit()方法对训练集进行拟合,即可获得的最佳参数.输出结果为一个字典,{'max_depth': 3, 'min_samples_leaf': 4, 'min_samples_split': 2}.

max_depth=[2,3,4,5,6]
min_samples_split=[2,4,6,8]
min_samples_leaf=[2,4,8,10,12]
parameters={'max_depth':max_depth,'min_samples_split':min_samples_split,'min_samples_leaf':min_samples_leaf}
grid_dtcateg=GridSearchCV(estimator=tree.DecisionTreeClassifier(),param_grid=parameters,cv=10)
grid_dtcateg.fit(X_train,Y_train)
print(grid_dtcateg.best_params_)

构建决策树

将调好的最佳参数放入模型中,并用训练集进行拟合构建决策树,再对测试集进行预测.调用metrics.accuracy_score()方法计算模型在训练集和测试集上的准确率.

CART_Class=tree.DecisionTreeClassifier(max_depth=3,min_samples_leaf=4,min_samples_split=2)
decision_tree=CART_Class.fit(X_train,Y_train)
predict=CART_Class.predict(X_test)
print("TrainSet accuracy:\n",metrics.accuracy_score(Y_train,CART_Class.predict(X_train)))
print("TestSet accuracy:\n",metrics.accuracy_score(Y_test,predict))

绘图

最后导入matplotlib,绘制ROC曲线,x轴表示负例错判率,y轴表示正例覆盖率.

import matplotlib.pyplot as plt

Y_score=CART_Class.predict_proba(X_test)[:,1]
print(Y_score)
fpr,tpr,threshold=metrics.roc_curve(Y_test,Y_score)
roc_auc=metrics.auc(fpr,tpr)
plt.stackplot(fpr,tpr,color='steelblue',alpha=0.5,edgecolor='black')
plt.plot(fpr,tpr,color='black',lw=1)
plt.plot([0,1],[0,1],color='red',linestyle='--')
plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
plt.show()
ROC曲线

相关文章

网友评论

      本文标题:Machine Learning——决策树

      本文链接:https://www.haomeiwen.com/subject/vczujctx.html