决策树的核心就是寻找纯净的划分,因此引入了纯度的概念。在属性选择上,我们是通过统计“不纯度”来做判断的,ID3 是基于信息增益做判断,C4.5 在 ID3 的基础上做了改进,提出了信息增益率的概念。实际上 CART 分类树与 C4.5 算法类似,只是属性选择的指标采用的是基尼系数。
你可能在经济学中听过说基尼系数,它是用来衡量一个国家收入差距的常用指标。当基尼系数大于 0.4 的时候,说明财富差异悬殊。基尼系数在 0.2-0.4 之间说明分配合理,财富差距不大。基尼系数本身反应了样本的不确定度。当基尼系数越小的时候,说明样本之间的差异性小,不确定程度低。分类的过程本身是一个不确定度降低的过程,即纯度的提升过程。
所以 CART 算法在构造分类树的时候,会选择基尼系数最小的属性作为属性的划分。我们接下来详解了解一下基尼系数。基尼系数不好懂,你最好跟着例子一起手动计算下。假设 t 为节点,那么该节点的 GINI 系数的计算公式为:
# -*- coding: utf-8 -*-
import tensorflow as tf
import time
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import r2_score,mean_absolute_error,mean_squared_error
class read_data():
def __init__(self,):
path='D://code//dataanaylze//credit_default-master//feature.csv'
self._CSV_FILE_PATH = path
self._data = pd.read_csv(self._CSV_FILE_PATH)
# print(self._data.shape)#查看数据维度
# print(self._data.describe())#数据集描述
self._sum_num = self._data.shape[0] # 数据总行数
self._indicator = 0
def read(self):
cardiac_output= self._data['CO'].value_counts()#查询心输出量的的情况
# print(cardiac_output)
df = pd.DataFrame({'ID': cardiac_output.index,'values': cardiac_output.values})
# print(df)
# plt.rcParams['font.sans-serif']=['SimHei']#设置字体为SimHei显示中文
# plt.figure(figsize = (6,6))
# plt.title('心输出量分布情况\n ')
# sns.set_color_codes("pastel")
# sns.barplot(x = 'ID', y="values", data=df)
# locs, labels = plt.xticks()
# plt.show()
self._data.drop(['ID'], inplace=True, axis =1) #去掉ID
target = self._data['CO'].values
# print(type(target))
# print(target.shape)
columns = self._data.columns.tolist()
columns.remove('CO')
# print(type(columns))
features = self._data[columns].values
# print(type(features))
# print(features.shape)
train_x,train_y ,test_x, test_y = train_test_split(features, target, test_size=0.30, random_state =1)#选择30%作为测试集
return train_x,test_x,train_y,test_y
# 创建CART回归树
dtr=DecisionTreeRegressor()
# 拟合构造CART回归树
train_x, train_y,test_x,test_y=read_data().read()
dtr.fit(train_x, train_y)
# 预测测试集中的心输出量
predict_y = dtr.predict(test_x)
# 测试集的结果评价
print('回归树二乘偏差均值:', mean_squared_error(test_y, predict_y))
print('回归树绝对值偏差均值:', mean_absolute_error(test_y, predict_y))
决策树做分类
# encoding=utf-8
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
# 准备数据集
iris=load_iris()
# 获取特征集和分类标识
features = iris.data
labels = iris.target
# 随机抽取33%的数据作为测试集,其余为训练集
train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33, random_state=0)
# 创建CART分类树
clf = DecisionTreeClassifier(criterion='gini')
# 拟合构造CART分类树
clf = clf.fit(train_features, train_labels)
# 用CART分类树做预测
test_predict = clf.predict(test_features)
# 预测结果与测试集结果作比对
score = accuracy_score(test_labels, test_predict)
print("CART分类树准确率 %.4lf" % score)
import numpy as np
from sklearn.model_selection import cross_val_score
# 使用K折交叉验证 统计决策树准确率
print(u'cross_val_score准确率为 %.4lf' % np.mean(cross_val_score(clf, train_features, train_labels, cv=10)))