涉及知识
熵
熵表明的是一个事物的混乱程度,熵越大,混乱程度越高,熵越小,表明混乱程度越低。信息熵的概念也是一样的,就是用来表明信息的混乱程度,我们选择一个树根的时候,最好的情况肯定是通过这个属性把数据分成几类以后,这些数据的熵越小越好,因为越小代表越有序,分类越清晰。那么我们要做的就是计算每个条件作为当前的根结点的信息熵,最终选一个最小的分类方法作为根节点,并以此类推,直到叶节点
信息增益
特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即公式为:
信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度
决策树
随机森林
参考:
https://www.jianshu.com/p/3183dd02d579
https://www.jianshu.com/p/7066d52b8f18
https://blog.csdn.net/chibangyuxun/article/details/60465956
https://www.cnblogs.com/Lin-Yi/p/8970609.html
导入和查看数据结构
#导入pandas用于数据分析 import pandas as pd #利用pandas的read_csv模块直接从互联网手机泰坦尼克号乘客数据 titan = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt') #观察前几行数据 print(titan.head()) #查看数据统计特性 titan.info()
处理数据
有可能影响存活率的因素有’pclass’, ‘age’, ‘sex’,目标值是是否存活。
#处理数据,找出特征值和目标值 x = titan[['pclass', 'age', 'sex']] y = titan['survived']
通过titan.info()
可以看到age是有缺失的,所以取平均值填充
# 缺失值处理 x['age'].fillna(x['age'].mean(), inplace=True)
# 分割数据集到训练集合测试集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25) # 进行处理(特征工程)特征-》类别-》one_hot编码 from sklearn.feature_extraction import DictVectorizer dict = DictVectorizer(sparse=False) x_train = dict.fit_transform(x_train.to_dict(orient="records")) #print(dict.get_feature_names()) x_test = dict.transform(x_test.to_dict(orient="records"))
这里忘记了为什么测试集用dict.transform
而不是 dict.fit_transform
…
#用决策树进行预测 dec = DecisionTreeClassifier(max_depth=5) dec.fit(x_train, y_train) # 预测准确率 print("预测的准确率:", dec.score(x_test, y_test)) # 导出决策树的结构 export_graphviz(dec, out_file="./tree.dot", feature_names=['年龄', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])
未完待续