大数据应用导论 Chapter04 | 大数据分析
大家好,我是不温卜火,是一名计算机学院大数据专业大二的学生,昵称来源于成语—
不温不火
,本意是希望自己性情温和
。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只有csdn这一个平台,博客主页:https://buwenbuhuo.blog.csdn.net/
Chapter04 | 大数据分析
一、数据分析介绍
什么是数据分析?
-
数据分析就是利用机器学习等算法分析数据、挖掘数据信息的一个过程。
-
机器学习是大数据分析的核心方法
-
机器学习就是让计算机从大量的数据中学习相关的规律,然后利用学习来的规律对未知数据进行预测的方法。
1、机器学习发展历程
2、机器学习的分类
2.1、有监督学习(supervised learning)
数据集中的样本带有标签,有明确目标
- 实例:信用风险评估
根据用户的历史还款记录和信用账户账龄等信息,预测用户未来是否违约。
2.2、无监督学习(unsupervised learning)
数据集中的样本没有标签,没有明确目标
- 实例:电信用户聚类
根据用户的通信行为数据集,将电信用户划分为不同的群体
2.3、强化学习(reinforcement learning)
智慧决策的过程,通过过程模拟和观察来不断学习、提高决策能力
- 实例:AlphaGo
3、机器学习的基本概念和流程
3.1、机器学习的基本概念
1、明确目标
- 将实际问题转换为数学问题
- 明确需要的数据的形式
- 明确机器学习的目标分类、回归还是聚类,还是其他
1、什么是分类
- 分类就是根据样样本数据的特征或属性,将其分到某一已有的类别中
eg:在电子邮箱服务中,将邮箱划分为正常邮件或垃圾邮件,这时比较典型的一个分类问题。
2、什么是回归
- 在日常生活中,我们会碰到目标特征为连续型的预测问题,例如收入预测、销量预测和商品预测等,这种问题称为回归问题。
eg:根据钻石的切割、成色、净度、卡拉重量和价格等特征,对钻石的价格进行预测。
3、什么是聚类
- 聚类就是将数据集中类似的样本进行分组的过程,每一个称为一个“簇”
eg:根据全球各地观测到的气候特征,将全球划分为不同的气候区域
3.2、机器学习的基本流程
下图为信贷模型完整流程示意:
信贷模型
- 目标:根据借贷人的基本信息如收入、教育程度、婚姻状态等,预测借贷人未来是否违约
- 研究的问题“是否违约”称为目标变量
- 研究的问题是一个分类问题
特征:
- 在信贷模型中,我们收集到的数据集中的变量有:性别、收入、教育程度、婚姻状态等,我们把这些变量称为特征。
- 特征不仅仅包括这些可以直接获得的变量,还包括利用原始信息构成的新的变量。
特征的数据类型:
1、训练集和测试集
- 在银行贷款案例中,我们将获取到的数据集分为两部分,一部分用来学习分类、训练模型,称之为训练集;另一部分用来预测,即测试训练好的模型的预测能力,称之为测试机
- 一般按照一定的比例随机的将数据集划分为训练集和测试机
2、训练模型和测试模型
1、训练模型
- 用训练集来训练模型,其中每个训练样本由特征和目标变量组成
- 银行借贷案例中,每个训练样本有四种特征(性别、收入、教育程度、婚姻状态),一个目标变量(是否违约)
2、测试模型
- 当完成模型训练后,利用测试集对模型进行测试,检验模型的好坏
- 将测试集输入训练好的模型,输出预测值
- 通过性能指标,比较预测的目标变量值和实际目标变量值之间的差别,评价模型的好坏
3、模型性能评估
-
在回归问题上,通常用均方误差(MSE)来评价模型的好坏
-
在分类问题上,常用正确率和错误率来评价模型的好坏
-
混淆矩阵(confusion matrix)可以直观查看分类问题中预测分类与真实分类的情况
-
①正确率(Accuracy):正确分类(预测类别与实际类别相等)
样本数占样本总数的比例:
-
一般情况下,正确率越大,表示模型预测效果越好
-
② 错误率:错误分类(预测类别与实际类别不相等)样本数占样本总数的比例:
-
一般来说,错误率越小,表示模型越策效果越好
-
③召回率(recall)和精度(precision):
-
④ROC曲线基本概念:
-
⑤AUC值:
二、机器学习算法模型与算法
不同的模型能达到不同的效果,如果选择错模型,就会无用功。
1、线性回归
基本思想:
- 就是寻找一条直线,使得所有样本尽可能地落在它的附近,即目标变量y和特征x之间的关系近似遵循一条直线
1.1、公式及图解
- 一元线性回归模型为:
1.2、线性回归的特点:
- 形式简单,易于建模
- 具有很好的可解释性
2、逻辑回归
- 逻辑回归之所以称为“回归”,是因为它采用了回归分析的思想。然而,它是用来解决分类问题的模型,通常解决的是二分类问题
- 逻辑回归是应用最为广泛的模型之一
- ①金融领域的风险评估
- ②互联网广澳点击预测
从线性回归到逻辑回归
- 在线性回归中,预测目标y是连续型,模型如下
- 假如要解决的是二分类问题,也就是预测目标y为离散型
-
这时线性回归无法解决该问题
- 1
-
为了能够利用回归的方法来解决二分类问题,需要对线性回归的输出作改变
- 1
改变方式—引入Logistic函数
2.1、逻辑回归公式
2.2、逻辑回归的特点
- 速度快,适合二分类问题
- 简单易于理解,可以直接看到各个特征的权重
3、K近邻(KNN)
K近邻并没有学习的过程,而是在预测的时候根据数据的状况直接进行预测
3.1、K近邻算法流程
- 确定K的大小和相似度的计算方法
- 从训练样本中挑选k个与测试样本最相似的样本
- 根据k个训练样本的类别,通过投票的方式来确定测试样本的类别
3.2、K近邻(KNN)的特点
优点:
- 简单实用,易于实现
- 对异常数据不敏感
缺点:
- 计算效率不高
4、决策树
生活中有很多场景需要我们通过一系列问题的诊断结果来进行决策。
4.1、决策树的基本结构
- 一个根节点(没有箭头指向它):图中的“收入”就是一个根节点
- 内部节点(既有箭头指向它,它又有箭头指出):图中的“教育程度”就是一个内部节点
- 叶子节点(只有箭头指向它,它没有箭头指出):表示一个类,图中粉色和绿色方块就是两个叶子节点
4.2、决策树的生成
- 决策树模型就是基于特征,自动生成一颗具有分类能力的树的过程
- 从根节点开始,进行特征的选择(如年龄)
- 然后选择该节点特征的分裂点,根据分裂点分裂节点(如50)
- 然后选择新的特征作为分支节点,继续分裂,直至达到一定条件停止分裂,形成一颗决策树
4.3、决策树的特点
- 原理简单、易于理解
- 具有较强的解释性
- 对缺失值也有很好的处理方式
5、K-means聚类
-
聚类:“物以类聚,人以群分”
-
K-means聚类原理:
将n个样本划分到K个簇中,其中每个样本归属于距离自己最近的簇 -
聚类效果:使簇内具有较高的相似度,而簇间的相似度较低
5.1、K-means算法步骤
1、随机选取K个样本作为初始中心
2、重复迭代如下步骤直至收敛:
①把每个样本指派到最近的中心,形成K个簇
②重新计算每个簇的中心
③直到中心不在发生变化
- 1
- 2
- 3
5.2、K-means算法的优缺点
优点:
- 算法实现简单、直观
- 支持多种距离计算
缺点:
- 聚类结果依赖于初始于K个中心的选择
- 需要指定K值和初始化K个簇
- 不易处理非簇状数据,且易受离群值的影响
6、PCA降维
- 高纬数据给数据分析带来的一个严重的挑战是维度灾难问题,即模型的复杂度和计算量随着维数的增加而呈指数增长
- 降维试解决维度灾难的一种手段
假如我们现在要借助用户手机的通信数据对用户价值进行分析,原始通信数据包括:入网时间、套餐价格、每月话费、每月流量、每月通话时长、欠费金额、欠费月数等7个特征,但它的“内在维度”可能只有3个:用户忠诚度、消费能力、欠费指数,这3个维度能够更加直观地对用户价值进行刻画
- 即将原始7维数据降为3维
6.1、PCA的基本思想
主成分分析(PCA)是一种有效的降维方法
- 构成原始特征的一系列线性组合形成低维的特征,以去除相关数据的相关性,并使降维后的数据最大程度地保持原始高维数据地信息
- 即把多个特征转换为少数几个互不相关地总和特征,且尽可能地保留原始数据地信息,这些互不相关地综合特征称为主成分
6.2、步骤
6.3、特点
优点:
- 计算效率高
- 便于理解低维数据
缺点:
- 构建的主成分特征没有明确的含义
三、数据分析的工具与介绍
1、数据分析常用工具
- 基于Python的Scikit-learn库
- 基于Hadoop的Mahout
- 基于Spark的Mllib模块
2、常用到的Python模块
- Numpy库:科学计算基础库
- Pandas库:数据处理和分析工具库
- Scipy库:算法和数学工具库
- Matplotlib:绘制数据图表的库
- Scikit-learn(简称Sklearn)库:机器学习库
3、Sklearn库
3.1、Sklearn库简介
Sklearn是Python著名的机器学习库
- 封装了众多机器学习算法,内置了许多公开数据集,且拥有完整的文档
- 实现了数据预处理、分类、回归、降维、特征选择、特征抽取和模型评价等机器学习功能
- Sklearn官网:http://scikit-learn.org/stable/index.html#
3.2、常用模块
- 分类:Classification
包括逻辑回归、K近邻、决策树等 - 回归:Regression
线性回归 - 聚类:Clustering
K-means - 降维:Dimensionality reduction
主成分分析(PCA) - 模型选择:Model selection
- 预处理:Preprocessing
4、Mahout
- Apache Mahout是Apache Software Foundation(AFS)旗下的一个开源项目,提供了一些经典的机器学习的算法
- Mahout安装官网:http://archive.apache.org/dist/mahout/
- 基于Hadoop的机器学习和数据挖掘的分布式框架,通过MapReduce模式实现
- 封装了大量数据挖掘经典算法,包括聚类、分类等
5、基于Spark的Mllib模块
5.1、Spark简介
- Spark是专用大规模数据处理而设计的快速通用的计算引擎。具有运行速度快。容易使用、通用性强、运行模式多样的特点
- Spark安装官网:http://spark.apache.org/downloads.html
- Spark 分布式数据分析
- 允许用户将数据加载至集群内存,并多次对其进行查询,非常适合用于机器学习算法。
- Spark的一个最大特点就是它的分布式计算,即它可以将一个大任务分解成很多小人物,交给很多台机器去分别完成,最后汇总,这就是“人多力量大”的道理。
除了数据处理性能上的优化,Spark还提供了多种特殊环境下的数据分析工具
5.2、Mllib
- Mllib是构建在Apache Spark之上,一个专门针对大数据处理通用的、快速的引擎
- Mllib是Spark的可以拓展的机器学习库
- 由以下部分组成:
通用的学习算法和工具,包括分类、回归、聚类、协同过滤、降维、以及调优等。
Mllib提供的工具:
- 机器学习算法:常用的学习算法,如分类、回归、聚类
- 特征:特征提取、选择及降维
- 存储:保存和加载算法、模型
- 实用工具:线性代数,统计,数据处理等
四、使用K近邻构造糖尿病诊断模型(案例)
1、前提准备
此案例的目标:
- 根据历史数据信息,建立糖尿病自动诊断模型,预测被诊断者是否患有糖尿病
- 分类问题
- 使用K邻近算法进行分类
糖尿病的背景介绍:
- 主要特征:高血糖
- 检测糖尿病大多需要检查血糖、体重、胰岛素水平等
数据集特征说明:
2、分析过程
2.1、数据导入
- 载入pandas库,利用read_csv函数读取数据
import pandas as pd
diabetes = pd.read_csv("./input/india_diabetes.csv")
- 1
- 2
- 数据查看
# 数据查看
display(diabetes.head(10))
- 1
- 2
- 导入后的数据表格一共9列
- Pandas中describe()函数可查看数据集中变量的描述性信息
2.2、数据划分
- 在数据集划分之前,将特征和目标变量分离
- 其中X为特征,Y为目标变量
X=diabetes.iloc[:,:8]
Y=diabetes.iloc[:,8:9]
- 1
- 2
- 特征变量中,怀孕次数(Pregnancies)为离散型特征,其它为连续型特征
- 另一种切分方法:载入sklearn.model_selection,利用train_test_split()函数将数据集按照一定的比例随机划分为训练集和测试机
# 将数据集划分为训练集和测试集
# 通过控制random_state
# 可以保证每次切分的时候,得到的结果是一样的
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,Y,test_size=0.2,random_state=10,stratify=diabetes['Outcome'])
- 1
- 2
- 3
- 4
- 5
代码解释:
- 将数据集按8:2比例划分成训练集(train)和测试集(test)
- test_size为测试集比例(0.2表示测试集占总样本的比例)
- 参数stratify保持测试集和训练集中Outcome(目标变量)类别比例不变
用训练集训练模型
- 从sklearn.neighbors中载入k近邻算法KNeighborsClassifier
from sklearn.neighbors import KNeighborsClassifier
# 生成模型
knn = KNeighborsClassifier(n_neighbors=5)
# 训练模型
knn.fit(X_train,y_train)
- 1
- 2
- 3
- 4
- 5
利用测试集测试模型:
# 测试模型
y_predict = knn.predict(X_test)
# 测试集上的预测结果
y_predict
- 1
- 2
- 3
- 4
- 其中"1"表示"是",“0"表示"否”
模型性能评估
- sklearn中有可直接得出正确率的函数:accuracy_score()
# 查看模型的正确率
from sklearn.metrics import accuracy_score
accuracy_score(y_test,y_predict)
# 74.5%的数据预测是正确的
- 1
- 2
- 3
- 4
得到的结果是:0.745
我们也可以通过混淆矩阵计算正确率
性能提成
- 再上述K近邻模型中,K=5,我们知道,对于不同的K值,将会得到不同的模型,所以尝试取不同的K值,得到最优模型。
klist = [3,5,7,9]
knn_grid = KNeighborsClassifier(n_neighbors=5)
# 搜索参数
knn_grid = GridSearchCV(knn_grid,dict(n_neighbors = klist), cv=10)
# GridSearchCV
# 训练
knn_grid.fit(X_train,y_train)
# 获取最佳
y_predict_grid = knn_grid.best_estimator_.predict(X_test)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 利用Python自动选取最优K值
#最优K值
knn_grid.best_params_
{'n_neighbors': 3}
- 1
- 2
- 3
- 用选取的最优K值进行预测
#利用最优k值进行预测
y_predict_grid = knn_grid.best_estimator_.predict(X_test)
accuracy_score(y_test,y_predict_grid)
# 77.5%
- 1
- 2
- 3
- 4
结果为:0.775
以上就是一个完整的机器学习流程。
3、完整代码
# warning
import warnings
warnings.filterwarnings('ignore')
# 数据展示方法
from IPython.display import display
# 载入pandas
import pandas as pd
# matplotlib
%matplotlib inline
# 载入数据
diabetes = pd.read_csv("./input/india_diabetes.csv")
# 数据查看
display(diabetes.head(10)) # 查看数据维度
diabetes.shape
# 统计各列键非空数据数量、数据类型
diabetes.info()
# 描述性统计
diabetes.describe()
# 查看目标特征各个类别的数量
diabetes['Outcome'].value_counts()
数据集划分
# 将目标变量和特征分离
# 特征和label的分离
X=diabetes.iloc[:,:8]
Y=diabetes.iloc[:,8:9]
# 将数据集划分为训练集和测试集
# 通过控制random_state
# 可以保证每次切分的时候,得到的结果是一样的
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,Y,test_size=0.2,random_state=10,stratify=diabetes['Outcome'])
X_train.head() # 查看训练集中目标变量类别比例
y_train['Outcome'].value_counts()
# 查看测试集中目标变量类别比例
y_test['Outcome'].value_counts() 学习算法——knn
# 训练模型
# 载入模型
from sklearn.neighbors import KNeighborsClassifier
# 生成模型
knn = KNeighborsClassifier(n_neighbors=5)
# 训练模型
knn.fit(X_train,y_train)
# 测试模型
y_predict = knn.predict(X_test)
# 测试集上的预测结果
y_predict
# 查看模型的正确率
from sklearn.metrics import accuracy_score
accuracy_score(y_test,y_predict)
# 74.5%的数据预测是正确的
另一种办法:
from sklearn import metrics
import seaborn as sns
colorMetrics = metrics.confusion_matrix(y_test,y_predict)
sns.heatmap(colorMetrics,annot=True,fmt='d')
选取最优K值
from sklearn.model_selection import GridSearchCV
klist = [3,5,7,9]
knn_grid = KNeighborsClassifier(n_neighbors=5)
# 搜索参数
knn_grid = GridSearchCV(knn_grid,dict(n_neighbors = klist), cv=10)
# GridSearchCV
# 训练
knn_grid.fit(X_train,y_train)
# 获取最佳
y_predict_grid = knn_grid.best_estimator_.predict(X_test) #最优K值
knn_grid.best_params_
#利用最优k值进行预测
y_predict_grid = knn_grid.best_estimator_.predict(X_test)
accuracy_score(y_test,y_predict_grid)
# 77.5%
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
本次的分享就到这里了,
好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论”“收藏”
一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注
我哦!
文章来源: buwenbuhuo.blog.csdn.net,作者:不温卜火,版权归原作者所有,如需转载,请联系作者。
原文链接:buwenbuhuo.blog.csdn.net/article/details/105094108
- 点赞
- 收藏
- 关注作者
评论(0)