开启数据挖掘及数据分析学习之旅

数据挖掘之旅

  • 数据挖掘简介及其应用场景
  • 搭建Python数据挖掘环境
  • 亲和性分析示例:根据购买习惯推荐商品
  • 经典分类问题示例:根据测量结果推测植物种类

数据挖掘简介

  • 数据挖掘旨在让计算机根据已有数据做出决策。决策可以是预测明天的天气、拦截垃圾邮件、检测网站的语言或者约会网站上发现新的恋爱对象等。
  • 数据挖掘设计算法、统计学、工程学、最优化理论和计算机科学相关领域的知识。

亲和性分析

  • 向网站用户提供多样化的服务和定制化的服务或投放定向广告
  • 为了向用户推荐电影或商品,而卖给他们呢一些与之相关的小玩意
  • 根据基因寻找有亲缘关系的人

商品推荐

  • 通过分析用户历史交易数据,找到用户购买相同商品的交易数据,通过打折、限购、预售等营销方式推荐给用户相同商品或相似商品

简单的排序规则

  • 规则的优劣有多种衡量方法,常用的是支持度(support)和置信度(confidence)
    • 支持度:指数据集中规则应验的次数,衡量的是给定规则应验的比例
    • 置信度:衡量的则是规则准确率如何 参考网址`

简单示例

import numpy as np
#  加载数据
# 数据title 面包、牛奶、奶酪、苹果、香蕉
# 0 表示未购买该商品,1 表示购买该商品
dataset_filename = "affinity_dataset.txt"
X = np.loadtxt(dataset_filename)
print(X[:5])

# 检测“如果买了苹果,也会购买香蕉”的置信度和支持度
# The names of the features, for your reference.
features = ["bread", "milk", "cheese", "apples", "bananas"]
num_apple_purchases = 0
for  sample in X:
    if  sample[3] == 1:
        num_apple_purchases += 1
print ("{0} people bought  Apples".format(num_apple_purchases))

# defaultdict 若查找键值不存在,则返回默认值
from collections  import defaultdict
#  规则应验
valid_rules = defaultdict(int) 
# 违反规则
invalid_rules = defaultdict(int)
# 相同规则,即若顾客买了苹果,他们也买苹果
num_occurances =  defaultdict(int)

#  顾客购买了某一商品
n_features = 4
for sample  in X:
    for premise  in range(4):
        if sample[premise] == 0:
            continue
        num_occurances[premise] += 1
        for conclusion in range(n_features):
            if premise  == conclusion:
                continue
            if sample[conclusion] == 1:
                valid_rules[(premise,conclusion)] += 1
            else:
                invalid_rules[(premise,conclusion)] += 1
                
# 计算置信度支持度
support  = valid_rules
confidence  =  defaultdict(float)
for premise,conclusion in valid_rules.keys():
    rule = (premise,conclusion)
    confidence[rule] = valid_rules[rule]/num_occurances[premise]
# 格式化输出函数
def print_rule(premise,conclusion,support,confidence,features):
    premise_name =  features[premise]
    conclusion_name = features[conclusion]
    print ("Rule: If a person buys {0} they will also buy {1}".format(premise_name,conclusion_name))
    print (" - Support: {0}".format(support[(premise,conclusion)]))
    print (" - Confidence: {0:.3f}".format(confidence[(premise,conclusion)]))
premise = 1
conclusion = 3
print_rule(premise,conclusion,support,confidence,features)

# 找出最优规则
from operator import itemgetter
sorted_support = sorted(support.items(),key=itemgetter(1),reverse = True)
for index  in range(5):
    print("Rule # {0}".format(index + 1))
    premise,conclusion = sorted_support[index][0]
    print_rule(premise,conclusion,support,confidence,features)
# 找出最优规则
sorted_confidence = sorted(confidence.items(),key=itemgetter(1),reverse = True)
for index  in range(5):
    print("Rule # {0}".format(index + 1))
    premise,conclusion = sorted_confidence[index][0]
    print_rule(premise,conclusion,support,confidence,features)

数据集位置及解释 提取码:hjyc
%%markdown

简单介绍分类问题

  • 分类应用的目标是,根据已知类别的数据集,经过训练得到一个分类模型,再用模型对类别未知的数据进行分类。
  • 什么是类别?类别值又怎么解释?,可参考如下例子
    • 根据检测数据确定植物的种类。类别的值为“植物属于哪个种类?”
    • 判断图像中有没有狗。类别是“图像里有狗吗?”
    • 根据化验结果,判断病人有没有被感染。类别是“病人被感染了吗?”

实现OneR算法 描述

  • OneR算法的思路很简单,根据已有数据中,具有相同特征值的个体最可能属于那个类别进行分类
  • OneR算法首先变量每个特征的每个取值,对每个特征值,统计它在各个类别中的出现次数,找到它出现次数最多的类别,并统计它在其他类别中出现的次数
  • OneR选取错误最低的特征作为唯一的分类准则

简单示例

#数据加载
import numpy as np
from sklearn.datasets import load_iris
dataset = load_iris()
X = dataset.data
y = dataset.target
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.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_d, y, random_state=14)
print("There are {} training samples".format(y_train.shape))
print("There are {} testing samples".format(y_test.shape))
from collections import defaultdict
from operator import itemgetter

def train(X, y_true, feature):
    """使用OneR算法计算给定特征的预测值和误差 
  
    Parameters
    ----------
    X: array [n_samples, n_features]
       保存数据集的二维数组。每一行是一个样本,每一列是一个特征。
    y_true: array [n_samples,]
        保存类值的一维数组。对应于X,这样y_true[i] is the class value for sample X[i].  
    feature: int
       与要测试的变量的索引相对应的整数
        0 <= variable < n_features
    Returns
    -------
    predictors: dictionary of tuples: (value, prediction)
        对于数组中的每个项,如果变量具有给定值,则进行给定的预测。
    error: float
        此规则错误预测的训练数据比率。
    """
    # Check that variable is a valid number
    n_samples, n_features = X.shape
    assert 0 <= feature < n_features
    # 获取此变量具有的所有唯一值
    values = set(X[:,feature])
    # Stores the predictors array that is returned
    predictors = dict()
    errors = []
    for current_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)
    return predictors, 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 in class_counts.items()
                 if class_value != most_frequent_class])
    return most_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 on variable {0} and has error {1:.2f}".format(best_variable, best_error))
model = {'variable': best_variable,
         'predictor': all_predictors[best_variable][0]}
# 定义预测函数
def predict(X_test, model):
    variable = model['variable']
    predictor = model['predictor']
    y_predicted = np.array([predictor[int(sample[variable])] for sample in X_test])
    return y_predicted
y_predicted = predict(X_test, model)
# Compute the accuracy by taking the mean of the amounts that y_predicted is equal to y_test
accuracy = np.mean(y_predicted == y_test) * 100
print("The test accuracy is {:.1f}%".format(accuracy))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容