决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法
依据 Boltzmann’s H-theorem,香农把随机变量 X X X 的熵值 H Η H(希腊字母Eta)定义如下,其值域为 x 1 , . . . , x n {x_1, ..., x_n} x1,...,xn:
H ( X ) = ∑ i P ( x i ) I ( x i ) = − ∑ i P ( x i ) log b P ( x i ) , \mathrm{H} (X)=\sum _{{i}}{{\mathrm {P}}(x_{i})\,{\mathrm {I}}(x_{i})}=-\sum _{{i}}{{\mathrm {P}}(x_{i})\log _{b}{\mathrm {P}}(x_{i})}, H(X)=i∑P(xi)I(xi)=−i∑P(xi)logbP(xi),
案例:每猜一次给一块钱,告诉我是否猜对了,那么我需要掏多少钱才能知道谁是冠军?
我可以把球编上号,从1到32,然后提问:冠 军在1-16号吗?依次询问,只需要五次,
就可以知道结果。
该案例中信息熵为:
− ( 1 32 l o g ( 1 32 ) + 1 32 l o g ( 1 32 ) + . . . ) = 5 -(\frac{1}{32}log(\frac{1}{32}) + \frac{1}{32}log(\frac{1}{32}) + ...) = 5 −(321log(321)+321log(321)+...)=5
信息增益表示得知特征 A A A 的信息而使得类 Y Y Y 的信息的不确定性减少的程度。
g ( D , A ) g(D,A) g(D,A): 特征 A A A 对训练数据集 D D D 的信息增益为:
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A) = H(D) - H(D|A) g(D,A)=H(D)−H(D∣A)
其中:
https://zh.wikipedia.org/wiki/%E7%9B%B8%E5%AF%B9%E7%86%B5
H ( D i ) = − ∑ k = 1 K ∣ C k ∣ ∣ D i ∣ l o g ∣ C k ∣ ∣ D i ∣ H ( D ∣ A ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ H(D_i) = - \displaystyle\sum_{k=1}^{K} \frac{|C_k|}{|D_i|}log\frac{|C_k|}{|D_i|} \\ H(D|A) = \displaystyle\sum_{i=1}^{n}\frac{|D_i|}{|D|} H(Di)=−k=1∑K∣Di∣∣Ck∣log∣Di∣∣Ck∣H(D∣A)=i=1∑n∣D∣∣Di∣
其中: K K K 为样本类别总量, C k C_k Ck 为类别 k k k 的样本数量。
https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html
import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_graphviz
# 泰坦尼克号乘客生存分析
# 一、pd读取数据
titanic = pd.read_csv("https://hbiostat.org/data/repo/titanic.txt")
# 二、处理数据
# 1.取出特征值与目标值
x = titanic[['pclass', 'age', 'sex']]
y = titanic['survived']
# 2.处理缺失值
x['age'].fillna(x['age'].mean(), inplace=True)
# 3.分割数据集到训练集与测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
# 三、进行特征工程
# 1.特征抽取
# 将有类别特征的数据转换成字典数据,x_train.to_dict(orient = 'records')
# 然后再把字典中一些类别数据,分别转换成特征(one-hot编码)
dict = DictVectorizer(sparse=False)
x_train = dict.fit_transform(x_train.to_dict(orient='records'))
# transform按照原先标准转换
x_test = dict.transform(x_test.to_dict(orient='records'))
# 返回类别数据
print(dict.get_feature_names())
print(x_train)
# 四、决策树估计器流程
dec = DecisionTreeClassifier()
dec.fit(x_train, y_train)
# 得到预测结果
print('预测结果为:\n', dec.predict(x_test))
# 预测准确率
print('预测准确率为:\n', dec.score(x_test, y_test))
# 导出决策树的结构
export_graphviz(dec, out_file='./tree.dot', feature_names=['年龄', '一等', '二等', '三等', '女', '男'])
dot -Tpdf tree.dot > tree.pdf
注:企业重要决策,由于决策树很好得分析能力,在决策过程应用较多
优点:
缺点:
定义:在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。
集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,
各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。
根据下列算法而建造每棵树:
用N来表示训练用例(样本)的个数,M表示特征数目。
为什么要随机抽样训练集?
为什么要有放回地抽样?
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
# 一.读取数据
titanic = pd.read_csv("https://hbiostat.org/data/repo/titanic.txt")
# 二、处理数据
# 1.提取特征值与目标值
x = titanic[['pclass', 'age', 'sex']]
y = titanic['survived']
# 2.处理age中的缺失值
x['age'].fillna(x['age'].mean(), inplace=True)
# 3.分割数据集 训练集与测试集、
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
# 三、进行特征工程
# 特征抽取
# 将特征值的类别特征数据转换成字典数据
# 再将类别数据转换成one-hot编码
dict = DictVectorizer(sparse=False)
x_train = dict.fit_transform(x_train.to_dict(orient='records'))
x_test = dict.transform(x_test.to_dict(orient='records'))
# 返回类别数据
print(dict.get_feature_names())
print(x_train)
# 四、随机森林-模型的选择与调优
# 1.构造实例
rf = RandomForestClassifier()
# 2.交叉验证与网格搜索
# n_estimators:决策树的数量
# max_depth:每棵树的深度限制
param = {'n_estimators': [100, 200, 300, 500, 800, 1200], 'max_depth': [5, 8, 15, 25, 30]}
gc = GridSearchCV(rf, param_grid=param, cv=5)
gc.fit(x_train, y_train)
# 准确率
print('准确率是:\n', gc.score(x_test, y_test))
# 在交叉验证中最好的结果
print('交叉验证中最好的结果是:\n', gc.best_score_)
# 最好的参数模型
print('最好的参数模型:\n', gc.best_estimator_)
# 查看选择的参数模型
print('查看选择的参数模型:\n', gc.best_params_)
随机森林的优点: