信息熵用来度量信息的混乱程度(不确定性),单位:比特。(信息熵越小 表示结果越确定)
信息熵的公式如下:
, i=1,2,...,n
表示所有可能的事件发生的概率。 表示可能事件发生后包含的信息量(越小概率事件发生所包含的信息量越大。例如:中国乒乓球队获胜比美国乒乓球队获胜包含的信息量少)。
根据公式可以得到:当都相等时,最大。即,当所有可能事件发生的可能性都相同时,信息熵最大。(例如:世界杯32个球队,当所有球队获胜的概率相同时,“谁是冠军”的信息熵最大,信息最混乱,不确定性最大)。
信息增益:某个条件(特征值)确定的情况下,对信息熵的减少量。
决策树的划分依据之一:信息增益。某个特征的信息增益越大,越靠近决策树的根。
决策树使用的算法:一、ID3 (信息增益最大准则)。二、C4.5 (信息增益比最大准则)。三、CART (分类树:基尼系数最小准则,划分更加仔细。回归树:平方误差最小准则)。
scikit-learn默认使用基尼系数作为决策树的划分依据。
demo.py(决策树,随机森林,预测泰坦尼克号乘客生死,DecisionTreeClassifier,RandomForestClassifier):
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
# 决策树和随机森林进行分类预测,对泰坦尼克号乘客进行预测生死
# 获取数据
titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
# 处理数据,找出特征值和目标值
x = titan[['pclass', 'age', 'sex']] # 特征值
y = titan['survived'] # 目标值
print(x)
'''
pclass age sex
0 1st 29.00 female
1 1st 2.00 female
2 2nd 25.00 male
...
'''
# 缺失值处理
x['age'].fillna(x['age'].mean(), inplace=True) # 填充平均值。 inplace=True表示原地修改,返回值重新赋给x
# 分割数据集 划分为训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
# 进行特征抽取(特征工程)特征表示类别(字典类型)-》特征抽取-》one-hot编码
dict = DictVectorizer(sparse=False) # 字典类型的数据转换成数字类型 -》DictVectorizer -》one-hot编码
x_train = dict.fit_transform(x_train.to_dict(orient="records")) # to_dict(orient="records")表示把每一行都转换成字典类型。
x_test = dict.transform(x_test.to_dict(orient="records")) # 不需要fit()数据,按照训练集中的特征进行转换
print(dict.get_feature_names()) # ["age", "pclass=1st", "pclass=2nd", "pclass=3rd", "sex=female", "sex=male"]
# print(x_train)
'''
[[ 31.19 0. 0. 1. 0. 1.]
[ 40.00 0. 0. 1. 0. 1.]
[ 31.19 0. 1. 0. 1. 0.]
...
]
'''
# # 用决策树进行预测
# # max_depth表示数的深度,min_samples_split=2表示少于2个样本的结点不会再划分,min_samples_leaf=1表示将少于1个样本的叶子节点删除(减枝,为了防止树结构过于复杂,防止过拟合)。
# dec = DecisionTreeClassifier(max_depth=8) # 可以通过交叉验证和网格搜索自动进行调参
# dec.fit(x_train, y_train)
#
# # 预测准确率
# print("预测的准确率:", dec.score(x_test, y_test)) # 0.826747720365
#
# # 导出决策树的结构 (不能导出随机森林的结构)
# export_graphviz(dec, out_file="./tree.dot", feature_names=['年龄', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])
# 随机森林进行预测
rf = RandomForestClassifier(n_jobs=-1) # n_jobs表示用几个核并行训练,-1表示使用cpu中的所有核。
param = {"n_estimators": [120, 200, 300, 500, 800, 1200], "max_depth": [5, 8, 15, 25, 30]} # 参数一共有6*5种组合。会依次计算每种组合的结果。
# 网格搜索与交叉验证 (超参数调优)
gc = GridSearchCV(rf, param_grid=param, cv=2) # cv=2表示2折交叉验证(推荐10折交叉验证)
gc.fit(x_train, y_train)
print("准确率:", gc.score(x_test, y_test)) # 0.787234042553
print("查看选择的参数模型:", gc.best_params_) # {"max_depth": 5, "n_estimators": 120}
tree.png:
决策树的主要应用场景:企业决策。
集成学习方法:集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类做出的预测。
随机森林:随机森林属于集成学习方法,包含多个决策树的分类器,多个决策树的预测结果中最多的结果就是随机森林的预测结果。
随机森林的建立过程:(N表示训练用例(样本)数,M表示特征数)
1、从N个训练用例(样本)中以有放回抽样的方式,取样N次(可能抽到重复的),形成一个训练集(即bootstrap取样),并用未 抽到的用例(样本)作预测,评估其误差。
2、从M个特征中随机选出m个(m<<M)特征,与1中的取样构建决策树。
3、重复1,2建立多个决策树
•为什么要随机抽样训练集?
如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的
•为什么要有放回地抽样?
如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是“有偏的”,都是绝对“片面的”(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决。