《数据挖掘导论》学习笔记(二)

数据挖掘导论 第四章

分类:基本概念、决策树与模型评估

分类的定义:分类任务就是通过学习得到一个目标函数f,把每个属性集x映射到一个预先定义的类标号y。

目标函数也称为分类模型,有两个主要目的:1、描述性建模 2、预测性建模

分类适用于预测两元或标称类型的数据集,即离散的数据集。

决策树分类法

选择最佳划分的度量通常都是根据划分后子女结点不纯性的程度。不纯的程度越低,类分布就越倾斜。

不纯性度量的例子包括:1、熵  2、基尼系数  3、分类差错率

模型的过分拟合

分类模型的误差大致分为两种:训练误差泛化误差。训练误差又叫再代入误差或表现误差,是在训练记录上误分类样本样本比例,

而泛化误差是模型在未知记录上的期望误差。

一个好的分类模型要具备低训练误差和低泛化误差。

对训练数据拟合太好的模型,其泛化误差可能比具有较高训练误差的模型高,这就造成模型过分拟合。

导致模型过分拟合的原因有:1、噪声记录导致的过分拟合 2、缺乏代表性样本导致的过分拟合

 

例题:现在有一些数据,有三个属性值,分别是权重,体重,身高,要根据这些数据,用决策树的算法训练。

1.5 50 thin
1.5 60 fat
1.6 40 thin
1.6 60 fat
1.7 60 thin
1.7 80 fat
1.8 60 thin
1.8 90 fat
1.9 70 thin
1.9 80 fat

实现代码
# coding:utf-8
import numpy as np
import scipy as sp
from sklearn import tree
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import classification_report
from sklearn.cross_validation import train_test_split


''''' 数据读入 '''
data = []
labels = []
with open("1.txt") as ifile:
    for line in ifile:
        tokens = line.strip().split(' ')
        data.append([float(tk) for tk in tokens[:-1]])
        # print ([float(tk) for tk in tokens[:-1]])
        labels.append(tokens[-1])
        # print (tokens[-1])
x = np.array(data)
# print x
labels = np.array(labels)
# print labels
y = np.zeros(labels.shape)
# print y

''''' 标签转换为0/1 '''
y[labels == 'fat'] = 1

''''' 拆分训练数据与测试数据 '''
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)


''''' 使用信息熵作为划分标准,对决策树进行训练 '''
clf = tree.DecisionTreeClassifier(criterion='entropy')
print "========clf========="
print(clf)
clf.fit(x_train, y_train)

''''' 把决策树结构写入文件 '''
with open("tree.dot", 'w') as f:
    f = tree.export_graphviz(clf, out_file=f)

''''' 系数反映每个特征的影响力。越大表示该特征在分类中起到的作用越大 '''
print "=====clf.feature_importances_======"
print(clf.feature_importances_)

'''''测试结果的打印'''
answer = clf.predict(x_train)
print(x_train)
print(answer)
print(y_train)
print(np.mean(answer == y_train))

'''''准确率与召回率'''
precision, recall, thresholds = precision_recall_curve(y_train, clf.predict(x_train))
answer = clf.predict_proba(x)[:, 1]
print "================="
print(classification_report(y, answer, target_names=['thin', 'fat']))

 

posted @ 2016-10-28 16:18  kinsomy  阅读(684)  评论(0编辑  收藏  举报