《数据挖掘导论》学习笔记(二)
数据挖掘导论 第四章
分类:基本概念、决策树与模型评估
分类的定义:分类任务就是通过学习得到一个目标函数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']))