机器学习7-分类学习-决策树

模型介绍

决策树是通过一系列规则对数据进行分类的过程。是一种逼近离散函数值的方法。
首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策树对新数据进行分析。决策树算法构造决策树来发现数据中蕴涵的分类规则。如何构造精度高、规模小的决策树是决策树算法的核心内容。

数据描述

使用数据来自于历史上一件家喻户晓的灾难性事件:泰坦尼克号沉船事故。1912年,当时隶属于英国的世界级豪华客轮泰坦尼克号,因在处女航行中不幸撞上北大西洋冰山而沉没。这场事故使得1500多名乘客罹难。后来,这场震惊世界的惨剧被详细地调查,而且遇难乘客的信息也逐渐被披露。在当时的救援条件下,无法在短时间内确认每位乘客生还的可能性。而今,许多科学家试图尝试通过计算机模拟和分析找出潜藏在数据背后的生还逻辑。下面通过代码,尝试揭开这尘封了100多年的数据的面纱。

代码

import pandas as pd
#利用pandas的read_csv模块直接从互联网收集泰坦尼克号乘客数据
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
#观察前几行数据,可以发现,数据种类各异,数值型、类别型,甚至还有缺失数据。
print(titanic.head())
#使用pandas,数据都转入pandas独有的dataframe格式(二维数据表格),直接使用info(),查看数据的统计特性。
print(titanic.info())
#输出说明:该数据共用1313条乘客信息,并且有些特征数据是完整的,有些是缺失的;有些则是字符串。
#特征选择
X = titanic[['pclass', 'age', 'sex']]
y = titanic['survived']

#对当前选择的特征进行探查。
print(X.info())
#out[]  # <class 'pandas.core.frame.DataFrame'>
        # RangeIndex: 1313 entries, 0 to 1312
        # Data columns (total 3 columns):
        # pclass    1313 non-null object
        # age       633 non-null float64
        # sex       1313 non-null object
        # dtypes: float64(1), object(2)
        # memory usage: 30.9+ KB
        # None
#借由上面的输出,我们设计如下几个数据处理的任务:
#1)age这个列,只有633个,需要补完。
#2)sex与pclass两个数据列的值都是类别型的,需要转化为数值特征,用0/1代替。
#首先我们补充age里的数据,使用平均数或者中位数都是对模型偏离造成最小影响的策略。
X['age'].fillna(X['age'].mean(),inplace=True)
#对补完的数据重新探查
print(X.info())
#由此得知age特征得到了补充。
#数据分割。
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)

#使用scikit-learn.feature_extraction  中的特征转换器
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False)
#转换特征后,我们发现凡是类别型的特征都单独剥离出来,独成一列特征,数值型的则保持不变。
X_train = vec.fit_transform(X_train.to_dict(orient='record'))
# >>> df
#    col1  col2
# a     1   0.50
# b     2   0.75
# >>> df.to_dict()
# {'col1': {'a': 1, 'b': 2}, 'col2': {'a': 0.5, 'b': 0.75}}
# >>> df.to_dict('records')
# [{'col1': 1.0, 'col2': 0.5}, {'col1': 2.0, 'col2': 0.75}]
print(vec.feature_names_)

#同样需要对测试数据的特征进行转换。
X_test = vec.transform(X_test.to_dict(orient='record'))
# X_test = pd.get_dummies(X_test)
print(X_test)

#从sklearn.tree中导入决策数分类器。
from sklearn.tree import DecisionTreeClassifier
#使用默认配置初始化决策树分类器。
dtc = DecisionTreeClassifier()
dtc.fit(X_train, y_train)
y_predict = dtc.predict(X_test)
print(y_predict)

from sklearn.metrics import classification_report
#输出预测准确性
print(dtc.score(X_test, y_test))
#输出更加详细的分类性能
print(classification_report(y_predict, y_test, target_names=['died', 'survived']))

特点分析

相比于其他学习模型,决策数在模型描述上有着巨大的优势。决策树的推断逻辑非常直观,具有清晰的可解释性,也方便了模型的可视化。这些特性同时保证在使用决策树模型时,是五须考虑数据的量化甚至标准化的。决策数模型仍属于参数模型,需要花费更多的时间在训练数据上。

猜你喜欢

转载自blog.csdn.net/qq_38195197/article/details/81051274