DecisionTreeClassifier

 使用sklearn.tree.DecisionTreeClassifier对应聘人员数据分类

  • 在进行训练之前,要把字符串形式的Feature值转换成数值形式;一个特征下的不同特征取值,分别用不同的数值代表
  • 字符串形式的Label也要转换成数值形式的分类
  • 本例提供了14条训练数据和2条验证数据。请注意,验证数据也需要进行数值化转换。因此,本例中先将所有数据都进行数值化转换;但最后执行训练时,仅取前14条
  • 本例的数值化转换代码暂未考虑验证数据中特征值缺失的问题!
    ''' 对数据进行数值化处理,再使用DecisionTreeClassifier进行决策 '''
    import numpy as np    
    import collections as col
    from sklearn import tree
    
    inputs = [
    ({'level':'Senior', 'lang':'Java', 'tweets':'no', 'phd':'no'}, False),
    ({'level':'Senior', 'lang':'Java', 'tweets':'no', 'phd':'yes'}, False),
    ({'level':'Mid', 'lang':'Python', 'tweets':'no', 'phd':'no'}, True),
    ({'level':'Junior', 'lang':'Python', 'tweets':'no', 'phd':'no'}, True),
    ({'level':'Junior', 'lang':'R', 'tweets':'yes', 'phd':'no'}, True),
    ({'level':'Junior', 'lang':'R', 'tweets':'yes', 'phd':'yes'}, False),
    ({'level':'Mid', 'lang':'R', 'tweets':'yes', 'phd':'yes'}, True),
    ({'level':'Senior', 'lang':'Python', 'tweets':'no', 'phd':'no'}, False),
    ({'level':'Senior', 'lang':'R', 'tweets':'yes', 'phd':'no'}, True),
    ({'level':'Junior', 'lang':'Python', 'tweets':'yes', 'phd':'no'}, True),
    ({'level':'Senior', 'lang':'Python', 'tweets':'yes', 'phd':'yes'}, True),
    ({'level':'Mid', 'lang':'Python', 'tweets':'no', 'phd':'yes'}, True),
    ({'level':'Mid', 'lang':'Java', 'tweets':'yes', 'phd':'no'}, True),
    ({'level':'Junior', 'lang':'Python', 'tweets':'no', 'phd':'yes'}, False),
    #下列2行数据是用来进行预测的,请不要作为训练数据
    ({ "level" : "Junior", "lang" : "Java", "tweets" : "yes", "phd" : "no"}, True),
    ({ "level" : "Junior", "lang" : "Java", "tweets" : "yes", "phd" : "yes"}, False),
    ]
    # 解释
    data = [row[0] for row in inputs]               # 仅获取特征矩阵(连同最后两行)
    # print('data ',data)
    
    y = [1 if row[1] else 0 for row in inputs[:-2]] # 以0或1来代替True或False, 去掉最后2行用于预测的数据
    
    # 以下:x中的每一列,列中的值统一转换成数值类型
    rows_count = len(data)
    columns_count = len(data[0])                    # 获取特征列的数目(不计Category列)
    x = np.ndarray((rows_count, columns_count))     # 用于存放数值化之后的特征矩阵
    column_index = 0
    for column_key in data[0].keys():    # 对于每一个特征名
        # 获取名为key的列的取值计数信息
        column_counter = col.Counter([row[column_key] for row in data])         
        resetting_value = 1    # 用于针对每个key分别从1开始计数
        for counter_key in column_counter.keys():
            # 每种取值分别对应到1,2,3...
            column_counter[counter_key] = resetting_value                       
            resetting_value += 1
        for i in np.arange(rows_count):
              # 将该列中的每个数据分别映射到设置为1,2,3... 
            x[i,column_index] = column_counter[data[i][column_key]]           
        column_index += 1
    
    print("数值映射后的特征矩阵:", x)
    
    
    # CART算法,使用entropy作为标准;默认是是用gini作为标准 
    clf = tree.DecisionTreeClassifier(criterion = 'entropy') 
    clf = clf.fit(x[:-2], y)            # 最后2行预测数据要去掉
    # 针对训练样本数据的准确率为100%
    accuracy = clf.score(x[:-2], y)
    print("针对训练数据的判别准确率:", accuracy)
    predicts = clf.predict(x[-2:])
    print("预测", inputs[-2], "结果:", predicts[0])
    print("预测", inputs[-1], "结果:", predicts[1])

案例2:使用sklearn.feature_extraction.DictVectorizer辅助进行数值化转化 

  • 该对象能够将字符串形式的特征值提取出来,展开成数值向量形式
  • 请注意,对于缺失特征值的情形,可能给出不同于以上案例的判别结果

 

''' 使用DictVectorizer进行数据预处理,再使用DecisionTreeClassifier决策树来判定 '''

import numpy as np    
import collections as col
from sklearn import tree
from sklearn.feature_extraction import DictVectorizer 

inputs = [
({'level':'Senior', 'lang':'Java', 'tweets':'no', 'phd':'no'}, False),
({'level':'Senior', 'lang':'Java', 'tweets':'no', 'phd':'yes'}, False),
({'level':'Mid', 'lang':'Python', 'tweets':'no', 'phd':'no'}, True),
({'level':'Junior', 'lang':'Python', 'tweets':'no', 'phd':'no'}, True),
({'level':'Junior', 'lang':'R', 'tweets':'yes', 'phd':'no'}, True),
({'level':'Junior', 'lang':'R', 'tweets':'yes', 'phd':'yes'}, False),
({'level':'Mid', 'lang':'R', 'tweets':'yes', 'phd':'yes'}, True),
({'level':'Senior', 'lang':'Python', 'tweets':'no', 'phd':'no'}, False),
({'level':'Senior', 'lang':'R', 'tweets':'yes', 'phd':'no'}, True),
({'level':'Junior', 'lang':'Python', 'tweets':'yes', 'phd':'no'}, True),
({'level':'Senior', 'lang':'Python', 'tweets':'yes', 'phd':'yes'}, True),
({'level':'Mid', 'lang':'Python', 'tweets':'no', 'phd':'yes'}, True),
({'level':'Mid', 'lang':'Java', 'tweets':'yes', 'phd':'no'}, True),
({'level':'Junior', 'lang':'Python', 'tweets':'no', 'phd':'yes'}, False),
# 后4行数据用于预测结果
({ "level" : "Junior", "lang" : "Java", "tweets" : "yes", "phd" : "no"}, True),
({ "level" : "Junior", "lang" : "Java", "tweets" : "yes", "phd" : "yes"}, False),
({ "level" : "Intern" }, True),
({ "level" : "Senior" }, False)
]

# 对Dict形式的字符特征值进行数值化转换(转成数值向量)
inputs_data = [row[0] for row in inputs]
y = [1 if row[1] else 0 for row in inputs]
vec = DictVectorizer()  # 转换字符串数据类型
x = vec.fit_transform(inputs_data).toarray()
print("DictVectorizer转换后的特征矩阵中的特征名称:\n", vec.feature_names_)
print("特征矩阵值:\n", x)

seperate_index = -4
train_x = x[:seperate_index]   # 提取训练样本特征数组
train_y = y[:seperate_index]   # 提取训练样本标注向量

clf = tree.DecisionTreeClassifier(criterion = 'entropy') # CART算法,使用entropy作为标准;默认是是用gini作为标准 
clf.fit(train_x, train_y)
accuracy = clf.score(train_x, train_y)
print("针对训练数据的判别准确率:", accuracy)

# 对待预测数据进行数值化转换
test_x = x[seperate_index:]
predicts = clf.predict(test_x)
print("预测结果:")
print(predicts)

案例3:使用DecisionTreeClassifier处理汽车数据分类 

链接:https://pan.baidu.com/s/1x7XgdFHdEfykZm7bxs-1GQ?pwd=6688 
提取码:6688
''' 配合DictVectorizer和DecisionTreeClassifier对汽车数据进行判别 '''

import numpy as np    
from sklearn import tree    
from sklearn.feature_extraction import DictVectorizer 
0

data   = []    
labels = []    
with open("car.csv") as ifile:
        first_line = True
        for line in ifile:
            if first_line:              # 跳过第一行(标题行)
                first_line = False
                continue
            #data需要是字典形式,因为之后需要使用DictVectorizer()修改字符串数据类型,以便符合DecisionTreeClassifier()  
            rowDict = {}
            tokens = line.strip().split(',')  
            rowDict['buying']=tokens[0]
            rowDict['maint']=tokens[1]  
            rowDict['doors']=tokens[2]  
            rowDict['persons']=tokens[3]  
            rowDict['lug_boot']=tokens[4]  
            rowDict['safety']=tokens[5]  
            data.append(rowDict)  
            labels.append(tokens[-1])   
x = np.array(data)  
labels = np.array(labels)    
y = np.zeros(labels.shape)  # 初始label全为0  
  
y[labels =='vgood']=1       # 当label等于这三种属性的话,设置为1。  
y[labels =='good']=1  
y[labels =='acc']=1  
  
#任务一:对字符特征值进行数值化转换(转成数值向量)
vec =  DictVectorizer()      # 转换字符串数据类型
dx = vec.fit_transform(x).toarray()  

# 拆分成训练数据和测试数据
ratio = 0.75
xTrain = []
yTrain = []
xTest = []
yTest = []
features = xTrain,xTest
labels = yTrain, yTest
for i in range(len(dx)):
    dataSetIndex = 0 if np.random.random() < ratio else 1
    features[dataSetIndex].append(dx[i])
    labels[dataSetIndex].append(y[i])

#任务2:# CART算法,使用entropy作为标准;默认是是用gini作为标准 
clf = tree.DecisionTreeClassifier(criterion='entropy')

#任务三:用模型拟合训练数据
clf.fit(xTrain, yTrain)

# 任务四:计算模型在测试数据上的的准确率
accuracy = clf.score(xTest, yTest)
print(accuracy)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伪_装

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值