Python scikit-learn,分类,决策树与随机森林,DecisionTreeClassifier,RandomForestClassifier,信息熵

信息熵用来度量信息的混乱程度(不确定性),单位:比特。(信息熵越小 表示结果越确定)

信息熵H(x)的公式如下:

H(x) = - \sum_{i=1}^{n}p(x_{i}) \cdot log_{2}p(x_{i}) , i=1,2,...,n  

P(x_{i})表示所有可能的事件发生的概率。  -log_{2}P(x_{i})表示可能事件发生后包含的信息量(越小概率事件发生所包含的信息量越大。例如:中国乒乓球队获胜比美国乒乓球队获胜包含的信息量少)。

根据公式可以得到:当P(x_{i})都相等时,H(x)最大。即,当所有可能事件发生的可能性都相同时,信息熵最大。(例如:世界杯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建立多个决策树

•为什么要随机抽样训练集?  
   如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的

为什么要有放回地抽样?
   如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是“有偏的”,都是绝对“片面的”(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决。

猜你喜欢

转载自blog.csdn.net/houyanhua1/article/details/87982751