数据挖掘实践

数据挖掘流程

FLowchart:

Created with Raphaël 2.2.0 原始数据 数据探索与预处理 数据建模 分析反馈

获取原始数据

采用爬虫或者其他方法获取航空公司客户的相关数据

数据探索

  • 对数据进行缺失值异常值分析,去除空值项和异常项。统计每列属性的特征:最大值,最小值等;把握数据的规律。

数据预处理

在了解数据的一般特征后,对数据进行清洗,属性规约,数据变换等操作。

  • 数据清洗:对于缺失值:原始数据量的则可以直接清楚缺失项;异常值过大或者过小也一样。 Pandas模块;根据数据的语义分析,去除不合理项。
  • 属性规约:丢弃与挖掘目标不相关的属性或冗余属性。
  • 数据变换:将数据转换为合适的格式和将原始数据的属性转换为便于挖掘的属性,适应后续建模的需要。比如单位转换;属性间的计算。
# -*- coding: utf-8 -*-
# 对数据进行基本的探索(缺失值和异常值处理)
# 返回缺失值个数以及最大最小值

import pandas as pd

datafile = '../data/air_data.csv'  # 航空原始数据,第一行为属性标签
result_file = '../tmp/explore.xls'  # 数据探索结果表

data = pd.read_csv(datafile, encoding='utf-8')  # 读取原始数据,指定UTF-8编码(需要用文本编辑器将数据装换为UTF-8编码)

# 包括对数据的基本描述,percentiles参数是指定计算多少的分位数表(如1/4分位数、中位数等);T是转置,转置后更方便查阅
explore = data.describe(percentiles=[], include='all').T

explore['null'] = len(data) - explore['count']  # describe()函数自动计算非空值数,需要手动计算空值数

explore = explore[['null', 'max', 'min']]
explore.columns = [u'空值数', u'最大值', u'最小值']  # 表头重命名
'''
describe()函数自动计算的字段有count(非空值数)、unique(唯一值数)、
top(频数最高者)、freq(最高频数)、mean(平均值)、std(方差)、
min(最小值)、50%(中位数)、max(最大值)
'''

explore.to_excel(result_file)  # 导出结果

数据建模

此次挖掘目标是对航空公司的客户进行价值分析,并分类。

  • 采用K-Means聚类算法对数据进行客户分群。这里聚成5类(k=5)。Scikit-Learn库的sklearn.cluster子库
  • 得到5维的聚类中心点。
  • 对客户价值进行分析:数据可视化
# -*- coding: utf-8 -*-
# K-Means聚类算法

import pandas as pd
from sklearn.cluster import KMeans  # 导入K均值聚类算法

input_file = '../tmp/zscoreddata.xls'  # 待聚类的数据文件
k = 5  # 需要进行的聚类类别数(选择的聚类中心数)

# 读取数据并进行聚类分析
data = pd.read_excel(input_file)  # 读取数据

# 调用k-means算法,进行聚类分析
kmodel = KMeans(n_clusters=k, n_jobs=4)  # n_jobs是并行数,一般等于CPU数较好
kmodel.fit(data)  # 训练模型

centers = kmodel.cluster_centers_  # 查看聚类中心
labels = kmodel.labels_  # 查看各样本对应的类别
print(centers)
print(labels)

K-Means聚类算法详解

算法思想

k-means算法的思想比较简单,假设我们要把数据分成K个类,大概可以分为以下几个步骤:

  • 随机选取k个点,作为聚类中心;

  • 计算每个点分别到k个聚类中心的聚类,然后将该点分到最近的聚类中心,这样就行成了k个簇;

  • 再重新计算每个簇的质心(均值);

  • 重复以上2~4步,直到质心的位置不再发生变化或者达到设定的迭代次数。

算法流程图解

例:

  • 假设我们首先拿到了这样一个数据,要把它分成两类,K=2:

在这里插入图片描述

  • 首先我们随机选取两个点作为聚类中心(因为已经明确是分为两类):

随机选取两个聚类中心

  • 接下来就可以开始计算每个点到红点和蓝点的距离了,离红点近就标记为红色,离蓝点近就标记为蓝色。结果为下图:

在这里插入图片描述

  • 很明显,这样完全不是我们想要的结果,接下来我们进行第三步,重新计算聚类中心的位置。
    在这里插入图片描述
  • 红X和蓝X都向中间靠拢了一点。我们可以看到,聚类中心发生改变后,其他点离两个聚类中心的距离也跟随着发生了变化。
  • 然后我们重复第二步,根据每个点到两个聚类中心的距离远近来进行重新分类,离红X近的归为红类,离蓝X近的归为蓝类。

在这里插入图片描述

  • 之前站错了队伍的一些点重新进行了调整,现在的分类离我们的目标越来越近了,但还没有达到最佳的分类效果。
  • 接下来继续重复上面的步骤,重新计算聚类中心的位置,再重新分类,不断迭代,直至聚类中心的位置不再变化(变化范围达到设定值)或达到迭代次数为止。

在这里插入图片描述

算法优化

判断依据

要使K-Means最后的分类结果最好,也就是要是K-均值最小化,即所有的数据点与其所关联的聚类中心点之间的距离之和最小。

合理选择K的大小

  • 即分成几类,根据挖掘需求和经验选取。虽然随着K值的增大,所有的数据点与其所关联的聚类中心点之间的距离之和会逐渐减小,但不是越大越好,需要合乎挖掘求进行分类。

合理初始化聚类中心

  • 选取原有数据作为聚类中心
  • 进行多次随机聚类中心选取,选取迭代完成后效果最好的一次。说明聚类效果最优,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值