本文是个人学习笔记,内容主要涉及决策树(DecisionTreeClassifier)对titanic数据集进行二类分类。
当自变量和因变量呈现分段函数关系时(比如公交车让座),在数学上描述这种非线性关系是用分段函数,在ML模型里,决策树是描述这种非线性关系的好选择。
决策树结点代表数据特征,每个节点下的分支代表对应特征值的分类,决策树的所有叶子节点表示模型的决策结果。使用多种不同的特征组合搭建多层决策树时,模型在学习是要考虑特征节点的选取顺序(entropy/Gini)。
在把数据送入模型之前,需要对数据进行预处理,有些特征数据是完整的,有些是缺失的,有些是数值类型的,有些是字符串的。像LR等非树形模型需要对没有量化的数据特征(比如字符类别型)进行量化甚至标准化,树形模型就不需要。
import pandas as pd
titanic=pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
titanic.head()
titanic.to_csv(r'titanic.csv',index=None)
titanic=pd.read_csv(r'titanic.csv')
titanic.info()
X=titanic[['pclass','age','sex']] #从原始数据里取3个特征列进行建模
y=titanic['survived']
X.info()
对age列(数值型特征)补缺失值,有”平均数”或”中位数”补缺失值都是对”模型偏离”造成最小影响的策略。sex列和pclass列(字符型特征)都是类别型的,需要转化成数值型特征,用0/1代替。
X['age'].fillna(X['age'].mean(),inplace=True)
X.info()
from distutils.version import LooseVersion as Version
from sklearn import __version__ as sklearn_version
from sklearn import datasets
if Version(sklearn_version) < '0.18':
from sklearn.cross_validation import train_test_split
else:
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X, y, test_size=0.25, random_state=33)
看一下特征处理前数据的样子
print(X_train)
from sklearn.feature_extraction import DictVectorizer #特征转换器:将类别型特征独热编码
vec=DictVectorizer(sparse=False)
X_train=vec.fit_transform(pd.DataFrame(X_train).to_dict(orient='record'))
print(vec.feature_names_)
X_test=vec.transform(pd.DataFrame(X_test).to_dict(orient='record'))
看一下特征处理后的结果,即将要送入模型的数据的样子(对比特征处理前数据看)
print(X_train) #age class_one_hot3列 sex_one_hot2列
from sklearn.tree import DecisionTreeClassifier
dtc=DecisionTreeClassifier()
dtc.fit(X_train,y_train)
y_predict=dtc.predict(X_test)
from sklearn.metrics import classification_report
print(dtc.score(X_test,y_test))
print(classification_report(y_predict,y_test,target_names=['died','survived']))
import sys
import os
os.environ["PATH"] += os.pathsep + 'D:\PYTHON35\Anaconda3.4.2\Lib\site-packages\graphviz-2.38\bin'
#'D:\PYTHON35\Anaconda3.4.2\Lib\site-packages\graphviz-2.38\bin'是解压缩graphviz-2.38.zip包后bin文件夹所在位置
%matplotlib inline
import numpy as np
from IPython.display import Image
from sklearn import tree
import pydotplus
import graphviz
dot_data = tree.export_graphviz(dtc, out_file=None,
feature_names=vec.feature_names_,
class_names=['0','1'],
filled=True, rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())