经过数据的预处理,又基于挖掘目标的数据形式可以建立分类与预测,聚类分析,关联规则和偏差检测等模型。
4.1分类与预测模型
分类模型可以用如下的图进行直观表示。
4.2常用分类与预测算法
4.2.1回归分析
回归分析是通过建立模型来研究变量之之间相互关系的密切程度、结构状态、及进行模型预测的有效方法。回归研究的问题可以归纳如下:
当自变量出现多重共线性时,,用最小二乘法估计的回归系数将会不准确,消除多重共线性的参数改进估计方法主要有岭回归和主成分回归。
(a)Logistic回归分析
1.Logistic函数
2.Logistic回归建模步骤
在Python中可以利用Scikit-Learn对这个数据进行逻辑回归分析。
#coding:utf-8
import pandas as pd
filename = '/home/xiao/Desktop/analysis/5/bankloan.xls'
data = pd.read_excel(filename)
x = data.iloc[:,:8].as_matrix()
y = data.iloc[:,8].as_matrix()
from sklearn.linear_model import LogisticRegression as LR
from sklearn.linear_model import RandomizedLogisticRegression as RLR
rlr = RLR()
rlr.fit(x,y)
rlr.get_support()
print (u'通过随机逻辑回归模型筛选的结果')
print (u'有效特征为:%s'% ','.join(data.columns[rlr.get_support()]))
x = data[data.columns[rlr.get_support()]].as_matrix()
lr = LR()
lr.fit(x,y)
print (u'逻辑回归模型训练结束')
print (u'模型平均正确率%s'%lr.score(x,y))
在建立随机逻辑回归的时候,使用默认的阈值0.25,可以使用:
RLR(selection_threshold = 0.5)
进行手动设置阈值。
逻辑回归本质上还是一种线性模型,有效性检验的本质还是做线性相关检验,所以筛选出的变量,说明与结果之间有较强的线性相关性,其他被筛掉的变量不一定没有关系,有可能是非线性关系。非线性关系变量筛选方法有决策树、神经网络等。
(b)决策树
(参考:http://www.cnblogs.com/leoo2sk/archive/2010/09/19/decision-tree.html)
首先需要了解一下什么是决策树。
决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。
构造决策树的关键步骤是分裂属性。所谓分裂属性就是在某个节点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能地“纯”。尽可能“纯”就是尽量让一个分裂子集中待分类项属于同一类别。分裂属性分为三种不同的情况:
1、属性是离散值且不要求生成二叉决策树。此时用属性的每一个划分作为一个分支。
2、属性是离散值且要求生成二叉决策树。此时使用属性划分的一个子集进行测试,按照“属于此子集”和“不属于此子集”分成两个分支。
3、属性是连续值。此时确定一个值作为分裂点split_point,按照>split_point和<=split_point生成两个分支。构造决策树的关键性内容是进行属性选择度量,属性选择度量是一种选择分裂准则,是将给定的类标记的训练集合的数据划分D“最好”地分成个体类的启发式方法,它决定了拓扑结构及分裂点split_point的选择。
关于熵的解释:https://www.zhihu.com/question/24053383
关于信息增益的解释:https://www.52ml.net/9112.html
常用决策树算法如表所示:
经典的决策树算法(ID3算法):
(1)ID3算法与原理
(2)ID3算法具体流程
以下是具体的例子:
代码如下:
#-*- coding: utf-8 -*-
import pandas as pd
inputfile = '/home/xiao/Desktop/analysis/5/sales_data.xls'
data = pd.read_excel(inputfile, index_col = u'序号')
data[data == u'好'] = 1
data[data == u'是'] = 1
data[data == u'高'] = 1
data[data != 1] = -1
x = data.iloc[:,:3].as_matrix().astype(int)
y = data.iloc[:,3].as_matrix().astype(int)
from sklearn.tree import DecisionTreeClassifier as DTC
dtc = DTC(criterion='entropy')
dtc.fit(x, y)
from sklearn.tree import export_graphviz
x = pd.DataFrame(x)
from sklearn.externals.six import StringIO
x = pd.DataFrame(x)
with open("tree.dot", 'w') as f:
f = export_graphviz(dtc, feature_names = x.columns, out_file = f)
结果是生成一个dot文件,需要进行中文配置才能显示中文。具体如下:
digraph Tree {
edge [fontname = "SimHei"];
node [fontname = "SimHei"];
node [shape=box] ;
0 [label="是否周末 <= 0.0\nentropy = 0.9975\nsamples = 34\nvalue = [16, 18]"] ;
1 [label="是否有促销 <= 0.0\nentropy = 0.9341\nsamples = 20\nvalue = [13, 7]"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="天气 <= 0.0\nentropy = 0.5436\nsamples = 8\nvalue = [7, 1]"] ;
1 -> 2 ;
3 [label="entropy = 0.0\nsamples = 4\nvalue = [4, 0]"] ;
2 -> 3 ;
4 [label="entropy = 0.8113\nsamples = 4\nvalue = [3, 1]"] ;
2 -> 4 ;
5 [label="天气 <= 0.0\nentropy = 1.0\nsamples = 12\nvalue = [6, 6]"] ;
1 -> 5 ;
6 [label="entropy = 0.971\nsamples = 5\nvalue = [3, 2]"] ;
5 -> 6 ;
7 [label="entropy = 0.9852\nsamples = 7\nvalue = [3, 4]"] ;
5 -> 7 ;
8 [label="天气 <= 0.0\nentropy = 0.7496\nsamples = 14\nvalue = [3, 11]"] ;
0 -> 8 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
9 [label="是否有促销 <= 0.0\nentropy = 0.9544\nsamples = 8\nvalue = [3, 5]"] ;
8 -> 9 ;
10 [label="entropy = 0.9183\nsamples = 3\nvalue = [2, 1]"] ;
9 -> 10 ;
11 [label="entropy = 0.7219\nsamples = 5\nvalue = [1, 4]"] ;
9 -> 11 ;
12 [label="entropy = 0.0\nsamples = 6\nvalue = [0, 6]"] ;
8 -> 12 ;
}
使用查看器xdot进行查看:
(c) 神经网络
模拟生物神经网络处理信息的数学模型。其中,人工神经元是基本处理单位。人工神经元对信号的处理如下:
激活函数有如表展示的几种形式。
人工神经网络的学习也叫作训练,是指神经网络在受到外部环境刺激下调整参数的过程。
这里只简单介绍BP神经网络。
4.2分类与预测算法评价
预测模型的效果评价通常用相对误差,绝对误差,平均绝对误差,均方误差,均方根误差等指标进行衡量。
(1)绝对误差与相对误差
(2)平均绝对误差
(3)均方误差
(4)均方根误差
(5)平均绝对百分误差
(6)Kappa统计
(7)识别准确度
(8)识别精确率
(9)反馈率
(10)ROC曲线
(11)混淆矩阵
4.3分类预测模型的特点
Python主要有以下几种常见的分类/预测模型。
建模的第一步是建立一个对象,这个对象是空白的,需要进一步训练的,然后需要设置模型的参数;接着就是通过fit()方法对模型进行训练,最后通过predict()方法预测结果。score()方法可以完成模型的评估。