第一章 1. 4 分类问题的简单示例

第一章 开启数据挖掘之旅

1.4 分类问题的简单示例

1.4.1 什么是分类?

首先,介绍类别的概念,下面是两个类别。

“图像里有狗吗?”      二值问题

“植物属于哪个种类?”   非二值问题

 

根据已知类别的数据集,经过训练得到一个分类模型,再用模型对类别未知的数据进行分类。

例子:用自己标注的邮件数据进行训练,得到一个能进行垃圾邮件过滤的分类模型。

 

在这里介绍特征值和类别的取值类型

特征值是连续的(花萼的长度1.1cm和1.2cm),且相近的值,表示相近度很大(意味着他们可以被同等对待)。

类别的取值是离散的,0、1、2分别代表不同的植物类型,且相近的值的类型并没有相近度(0、1与0、2并不表示0和1的有相似之处,也不意味0、2完全不相似)。

 

 

特征值的离散化:

确定一个阈值,大于该阈值的特征值为1;反之为0

(在这里我们去特征值的均值为阈值)

1.4.2 案例

Iris植物分类数据集,scikit-learn库内置了这个数据集。根据植物的特征推测它的种类。

1.4.3 OneR算法分析

原则:选取四个特征中分类效果最好的作为分类依据。

内容:

算法遍历每一个特征的每一个取值,统计每一个特征在各个类别之中出现的次数,找到它出现次数最多的类别,并统计他在其他类别(即除了出现次数最多的以外的类别);

统计完后把某个特征各个取值(0、1)的错误率相加,选取错误率最低的特征作为唯一的分类准则(OneRule)。

1.4.4 代码分析及实现

例子1:输出数据集的前五行(在Numpy中采集数据)

代码:

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%


1.4.5 学习总结

预测的结果为65.8%,虽然不高,但我们也只使用了一条规则,所以这也算是一个满意的结果。

亲和性分析找出了一个最佳的促销方案,实际不止只有如此,它可以发现很多潜在的规则,以探索最佳解决方案。

而分类可以通过已有数据进行训练,得到一个分类模型,他可以为我们处理很多费时费力的工作,且准确率极高(甚至超过人的平均水平,毕竟它不会累)。

到此已经完成数据挖掘第一章的学习,算是为入门做出了准备,之后即使在忙,我也会抽时间继续进行学习。

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(数据挖掘)