机器学习笔记2-基于决策树的分类预测

决策树算法原理

决策树(Decision Tree)是一种以树形数据结构来展示决策规则和分类结果的模型,它是将看似无序、杂乱的已知实例,通过某种技术手段将它们转化成可以预测未知实例的树状模型。每一条从根结点(对最终分类结果贡献最大的属性)到叶子结点(最终分类结果)的路径都代表一条决策的规则。

决策树也是一种监督学习的分类算法,要求输入标注好类别的训练样本集,每个训练样本由若干个用于分类的特征来表示。决策树算法的训练目的在于构建决策树,希望能够得到一颗可以将训练样本按其类别进行划分的决策树。

优点

  1. 决策树易于理解和实现.人们在通过解释后都有能力去理解决策树所表达的意义。
  2. 计算复杂度不高,输出结果易于理解,数据缺失不敏感,可以处理不相关特征。

缺点

  1. 容易过拟合。
  2. 对于各类别样本数量不一致的数据,在决策树当中信息增益的结果偏向于那些具有更多数值的特征。

信息熵(Entropy)、信息增益(Information Gain)概念解释。

1、 信息熵:H(X) 描述X携带的信息量。 信息量越大(值变化越多),则越不确定,越不容易被预测。

对于抛硬币问题,每次有2种情况,信息熵为1。对于投骰子问题,每次有6中情况,信息熵为1.75。
下面为公式:
在这里插入图片描述其中log2§可以理解为p这个需要用几个bit位表示。如p(x1)=1/2, p(x2)=1/4, p(x3)=1/8, p(x4)=1/8,
可以用x1: 1, x2: 10, x3: 110, x4: 111表示,因为为了让平均的bit位最少,概率越大的bit为设的越短。而-log2§正好对应bit位数。那么H(X)可以理解为比特位的期望值。
  
  信息熵特点:(以概率和为1为前提):
  
a.不同类别的概率分布越均匀,信息熵越大;
b.类别个数越多,信息熵越大;
c. 信息熵越大,越不容易被预测;(变化个数多,变化之间区分小,则越不容易被预测)(对于确定性问题,信息熵为0;p=1; E=p*logp=0)

2、 信息增益IG(Y|X): 衡量一个属性(x)区分样本(y)的能力。 当新增一个属性(x)时,信息熵H(Y)的变化大小即为信息增益。 IG(Y|X)越大表示x越重要。
条件熵:H(Y|X),当X条件下Y的信息熵
在这里插入图片描述
信息增益: IG(Y|X)=H(Y)-H(Y|X)
(entropy):在信息论和概率统计中,熵是表示随机变量不确定性的度量
条件熵(conditional entropy):表示在一直随机变量X的条件下随机变量Y的不确定性度量。
信息增益(information gain):信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。
信息增益比(information gain ratio):其信息增益g(D, A)与训练数据集D关于特征A的值的熵HA(D)之比

基尼指数(gini index):基尼指数Gini(D)表示集合D的不确定性,基尼指数越大,样本集合的不确定性也就越大,这一点与熵相似。

转载于:http://www.cnblogs.com/pinard/p/6050306.html (楼主总结的很好,里面还有不同决策树算法思路、不足及使用方法)

利用决策树进行建模预测

Step1:利用 决策树模型 在二分类上 进行训练和预测

## 为了正确评估模型性能,将数据划分为训练集和测试集,并在训练集上训练模型,在测试集上验证模型性能。
from sklearn.model_selection import train_test_split

## 选择其类别为0和1的样本 (不包括类别为2的样本)
data_target_part = data[data['Species'].isin([0,1])][['Species']]
data_features_part = data[data['Species'].isin([0,1])][['Culmen Length (mm)','Culmen Depth (mm)',
            'Flipper Length (mm)','Body Mass (g)']]

## 测试集大小为20%, 80%/20%分
x_train, x_test, y_train, y_test = train_test_split(data_features_part, data_target_part, test_size = 0.2, random_state = 2020)
## 从sklearn中导入决策树模型
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
## 定义 决策树模型 
clf = DecisionTreeClassifier(criterion='entropy')
## 在训练集上训练决策树模型
clf.fit(x_train, y_train)
## DecisionTreeClassifier(class_weight=None, criterion='entropy', max_depth=None,
##            max_features=None, max_leaf_nodes=None,
##            min_impurity_decrease=0.0, min_impurity_split=None,
##            min_samples_leaf=1, min_samples_split=2,
##            min_weight_fraction_leaf=0.0, presort=False, random_state=None,
##            splitter='best')
## 可视化
## 本段代码实际效果为本地生成PDF可视化文档,在体验过程中可以不运行,可能无法正常展示结果;
## 代码生成的可视化结果会截图展示实际效果
import graphviz
dot_data = tree.export_graphviz(clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("penguins")
## 'penguins.pdf'
## 在训练集和测试集上分布利用训练好的模型进行预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)
from sklearn import metrics
## 利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict))
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict))
## 查看混淆矩阵 (预测值和真实值的各类情况统计矩阵)
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
print('The confusion matrix result:\n',confusion_matrix_result)
# 利用热力图对于结果进行可视化
plt.figure(figsize=(8, 6))
sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')
plt.xlabel('Predicted labels')
plt.ylabel('True labels')
plt.show()
## The accuracy of the Logistic Regression is: 0.9954545454545455
## The accuracy of the Logistic Regression is: 1.0
## The confusion matrix result:
## [[31  0]
## [ 0 25]]

Step2:利用 决策树模型 在三分类(多分类)上 进行训练和预测

## 测试集大小为20%, 80%/20%分
x_train, x_test, y_train, y_test = train_test_split(data[['Culmen Length (mm)','Culmen Depth (mm)',
            'Flipper Length (mm)','Body Mass (g)']], data[['Species']], test_size = 0.2, random_state = 2020)
## 定义 决策树模型 
clf = DecisionTreeClassifier()
# 在训练集上训练决策树模型
clf.fit(x_train, y_train)
## DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
##            max_features=None, max_leaf_nodes=None,
##            min_impurity_decrease=0.0, min_impurity_split=None,
##            min_samples_leaf=1, min_samples_split=2,
##            min_weight_fraction_leaf=0.0, presort=False, random_state=None,
##            splitter='best')
## 在训练集和测试集上分布利用训练好的模型进行预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)
## 由于逻辑回归模型是概率预测模型(前文介绍的 p = p(y=1|x,\theta)),所有我们可以利用 predict_proba 函数预测其概率
train_predict_proba = clf.predict_proba(x_train)
test_predict_proba = clf.predict_proba(x_test)
print('The test predict Probability of each class:\n',test_predict_proba)
## 其中第一列代表预测为0类的概率,第二列代表预测为1类的概率,第三列代表预测为2类的概率。
## 利用accuracy(准确度)【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict))
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict))
#  The test predict Probability of each class:
#    [[0. 0. 1.]
#    [0. 1. 0.]
#    [0. 1. 0.]
#    [1. 0. 0.]
#    …………
#    [0. 1. 0.]
#    [0. 0. 1.]
#    [1. 0. 0.]
#    [1. 0. 0.]]
#  The accuracy of the Logistic Regression is: 0.996363636364

#  The accuracy of the Logistic Regression is: 0.971014492754
## 查看混淆矩阵
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
print('The confusion matrix result:\n',confusion_matrix_result)

# 利用热力图对于结果进行可视化
plt.figure(figsize=(8, 6))
sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')
plt.xlabel('Predicted labels')
plt.ylabel('True labels')
plt.show()

#    The confusion matrix result:
#    [[30  1  0]
#    [ 0 23  0]
#    [ 2  0 13]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值