第一章 开启数据挖掘之旅
首先,介绍类别的概念,下面是两个类别。
“图像里有狗吗?” 二值问题
“植物属于哪个种类?” 非二值问题
根据已知类别的数据集,经过训练得到一个分类模型,再用模型对类别未知的数据进行分类。
例子:用自己标注的邮件数据进行训练,得到一个能进行垃圾邮件过滤的分类模型。
在这里介绍特征值和类别的取值类型
特征值是连续的(花萼的长度1.1cm和1.2cm),且相近的值,表示相近度很大(意味着他们可以被同等对待)。
类别的取值是离散的,0、1、2分别代表不同的植物类型,且相近的值的类型并没有相近度(0、1与0、2并不表示0和1的有相似之处,也不意味0、2完全不相似)。
特征值的离散化:
确定一个阈值,大于该阈值的特征值为1;反之为0
(在这里我们去特征值的均值为阈值)
Iris植物分类数据集,scikit-learn库内置了这个数据集。根据植物的特征推测它的种类。
原则:选取四个特征中分类效果最好的作为分类依据。
内容:
算法遍历每一个特征的每一个取值,统计每一个特征在各个类别之中出现的次数,找到它出现次数最多的类别,并统计他在其他类别(即除了出现次数最多的以外的类别);
统计完后把某个特征各个取值(0、1)的错误率相加,选取错误率最低的特征作为唯一的分类准则(OneRule)。
代码:
import numpy as np
# 加在数据集
from sklearn.datasets import load_iris
#X, y = np.loadtxt("X_classification.txt"),np.loadtxt("y_classification.txt")
dataset = load_iris()
X = dataset.data
y = dataset.target
# 输出数据集信息,看源码,不列出
print(dataset.DESCR)
n_samples, n_features = X.shape
# 离散化特征值
attribute_means = X.mean(axis=0)
assert attribute_means.shape ==(n_features,)
X_d = np.array(X >= attribute_means,dtype='int')
# 划分数据集为 训练集和测试集
from sklearn.cross_validation importtrain_test_split
# 设置随机值为固定值,方便检查
random_state = 14
# X_train:训练集,X_test:测试集, y_train, y_test:测试集和训练集的类别信息
X_train, X_test, y_train, y_test =train_test_split(X_d, y, random_state=random_state)
print("There are {} trainingsamples".format(y_train.shape))
print("There are {} testingsamples".format(y_test.shape))
#导入defaultdict和itemgetter模块
from collections import defaultdict
from operator import itemgetter
# 定义训练函数
# 参数:
# X:二维数组,行表示一个植物(实例),列表示特征
# y_true:每个植物所属类别
# feature:特征编号
def train(X, y_true, feature):
# 检查遍历是否合法
n_samples, n_features = X.shape
assert0 <= feature < n_features
# 获得该特征的所有特征值
values= set(X[:,feature])
# 存储返回的预测器和错误率
predictors = dict()
errors = []
# 返回预测器和总错误率
forcurrent_value in values:
most_frequent_class, error =train_feature_value(X, y_true, feature, current_value)
predictors[current_value] =most_frequent_class
errors.append(error)
# 计算总错误率
total_error= sum(errors)
returnpredictors, total_error
# 计算某特征出现次数最多的类别,在其他类别出现的次数
def train_feature_value(X, y_true,feature, value):
# 存储特征出现次数的字典
class_counts = defaultdict(int)
# 计算每一种特征出现的次数
for sample, y in zip(X, y_true):
if sample[feature] == value:
class_counts[y] += 1
# 找出各个特征出现最多的类别
sorted_class_counts = sorted(class_counts.items(), key=itemgetter(1),reverse=True)
most_frequent_class = sorted_class_counts[0][0]
# 将除了出现次数最多的类别之外的各个取值的错误率相加
n_samples = X.shape[1]
error = sum([class_count for class_value, class_count inclass_counts.items()
if class_value !=most_frequent_class])
returnmost_frequent_class, error
# 计算所有的预测器
all_predictors = {variable:train(X_train, y_train, variable) for variable in range(X_train.shape[1])}
errors = {variable: error for variable,(mapping, error) in all_predictors.items()}
# 选择并存储最佳模型
# 按错误率排序,找出总错误率最小的特征,作为唯一准则
best_variable, best_error = sorted(errors.items(),key=itemgetter(1))[0]
print("The best model is based onvariable {0} and has error {1:.2f}".format(best_variable, best_error))
# 选择最佳模型
model = {'variable': best_variable,
'predictor': all_predictors[best_variable][0]}
print(model)
# 预测类别方法,依据最佳模型
def predict(X_test, model):
variable = model['variable']
predictor = model['predictor']
y_predicted= np.array([predictor[int(sample[variable])] for sample in X_test])
# 返回预测结果
returny_predicted
# 调用预测类别方法,预测测试数据集
y_predicted = predict(X_test, model)
print(y_predicted)
# 输出预测结果:
# [0 0 0 2 2 2 0 2 0 2 2 0 2 2 0 2 0 2 22 0 0 0 2 0 2 0 2 2 0 0 0 2 0 2 0 2 2]
# 计算预测的精确度
accuracy = np.mean(y_predicted ==y_test) * 100
print("The test accuracy is {:.1f}%".format(accuracy))
# 结果为65.8%
# The test accuracy is 65.8%
预测的结果为65.8%,虽然不高,但我们也只使用了一条规则,所以这也算是一个满意的结果。
亲和性分析找出了一个最佳的促销方案,实际不止只有如此,它可以发现很多潜在的规则,以探索最佳解决方案。
而分类可以通过已有数据进行训练,得到一个分类模型,他可以为我们处理很多费时费力的工作,且准确率极高(甚至超过人的平均水平,毕竟它不会累)。
到此已经完成数据挖掘第一章的学习,算是为入门做出了准备,之后即使在忙,我也会抽时间继续进行学习。