数据挖掘从开始到结束主要分为6个步骤:业务理解、数据采集、数据处理、数据建模、模型评估以及模型部署。抛开将业务转化为模型的业务理解以及对建立好的模型的模型部署两部分,本文将对建模过程当中的核心4步骤:数据采集、数据处理、数据建模、模型评估进行归纳和整理。每一部分,笔者都会从三个角度进行归纳:1.该部分到底是要做什么;2.该部分常用的R实现;3.该部分常用的python实现。
下面就让我们进入正题吧——gogogo!
一.数据采集
当将业务问题转化成建模目标之后,第一步要做的便是根据业务采集本次建模所需要的所有数据。将数据采集好之后,我们需要将其导入数据分析软件中,以便于接下来的建模使用。
1.1R实现
1.1.1路径设置
建模最开始,需要设置路径,以方便后续导入导出以及保存等流程。在R中,设置路径方式如下。
#查看工作路径
getwd()
#设置工作路径
setwd('G:/test/')
在R中,笔者最常用的数据导入方式有三种。
1.1.2csv导入
导入csv文件,有两种常用写法。
#法1
data<-read.csv('filename.csv',seq=',',header=TRUE)
#法2
data<-read.table('filename.csv')
1.1.3excel导入
导入excel文件,在R中有两个惯常使用的包——xlsx和XLConnect。
#法1
library(xlsx)
workbook<-"/data.xlsx"
data<-readxlsx(workbook,1)
#法2
library(XLConnect)
wb<-loadWorkbook("data.xlsx")
data<-readWorksheet(wb,sheet=getSheets(wb)[1])
1.1.4数据库导入
导入数据库数据,通常使用ROCBC包。
library(RODBC)
#连接数据库
channel<-odbcConnect("数据库名",uid="用户名",pwd="密码",believeNRows=FALSE)
#读取数据的sql
data<-sqlQuery(channel,"select * from data")
1.2python实现
1.2.1路径设置
import os
#查看工作路径
os.getcwd()
#设置工作路径
os.chdir("G:\\test\\")
1.2.2csv导入
import pandas as pd
data = pd.read_csv("filename.csv")
1.2.3数据库导入
因为笔者用的是oracle数据库,所以这里以oracle数据库为例。
import cx_Oracle as co
#创建连接
db = co.connect('用户名/密码@ip:1521/服务名')
#创建cursor
cursor = db.cursor()
#用sql写出想要的数据
sqldata='select * from data'
#执行sql语句
cursor.execute(sqldata)
#用完之后关闭数据库
db.close()
二.数据处理
导入数据之后,第二步需要做的是对数据进行处理,使得数据达到建模对数据的要求。
数据处理主要分为如下的几个步骤:数据探索、缺失值处理、异常值处理、数据格式转换、数据标准化。
2.1数据探索
数据处理的第一步,通常使用描述性统计去探索数据量、字段类型等基本信息。
#R实现
#查看数据结构
class(data)
str(data)
#最小值、最大值、四分位数和数值型变量的均值,以及因子向量和逻辑型向量的频数统计
summary(data)
#python实现
#查看数据结构
data.shape
data.dtypes
#最小值、最大值、四分位数和数值型变量的均值,以及因子向量和逻辑型向量的频数统计
data.describe()
查看数据信息,如果不同字段均值差异很大或者模型有需要,就要考虑数据标准化;如果某些字段类型不符合建模需要,就要对字段类型进行转换。
2.2缺失值处理
很多模型是要求数据当中不能存在缺失值的,因此,我们要检查数据当中是否存在缺失值,如果存在,需要对缺失值进行一定的处理。
2.2.1判断缺失值是否存在
#R实现
#判断数据是否有缺失值
#1.每个值都判断,然后做矩阵判断整体
table(is.na(data))
#2.判断矩阵
library(mice)
md.pattern(data)
#作图判断数据是否有缺失值
library(VIM)
aggr(data,prop=FALSE,numbers=TRUE)
#python实现
isnull = pd.isnull(data)
isnull_count = len(data[isnull.values==True])
判断之后,如果没有缺失值皆大欢喜,如果有缺失值,需要对缺失值进行插补或者是删除。
2.2.2删除缺失值
data=data[complete.cases(data),]
#or
data=na.omit(data)
data = data[isnull.values==False]
插补缺失值太过细化,这里暂不展开赘诉。
2.3异常值处理
2.3.1判断是否存在异常值
可用箱线图来判断数据是否存在异常值。
2.4数据格式转换
数据探索之后,如果发现有字段数据格式不符合建模要求,需要对格式进行转换。
#R实现
#在R中,可以使用as.xx函数对数据格式进行转换,例如:
#将x1转化成数值型
data$x1<-as.numeric(data$x1)
#将x2转化成字符串型
data$x2<-as.character(data$x2)
#python实现
#在python中,使用astype对数据格式进行转换,例如:
#将x1转化成数值型
data['x1'] =data['x1'].astype('Int32')
#将x2转化成字符串型
data['x2'] = data['x2'].astype('str')
2.5数据标准化
如果不同字段均值差异很大或者模型有需要,为了统一量纲,减小量纲给模型带来的误差,需要对数据进行标准化。
#R实现
##1.标准化(公式:(实际值-均值)/sd)
#scale函数:center和scale默认为真,如果只有scale为真则 :实际值/SD
data_scale<-scale(data,center=T,scale=T)
##2.中心化处理(公式:实际值-均值)(此函数也可以标准化),默认和scale相同,中心化并没有消除量纲的影响
library(caret)
data_center<-preProcess(data,method=c("center"))
###3.归一化(公式:(x-min(x))/max(x)-min(x))
data_range<-preProcess(data,method = c("range"))
#python实现
import numpy as np
##1.标准化
data = data.apply(lambda x:(x-np.mean(x)/np.std(data)))
##2.中心化
data = data.apply(lambda x:(x-np.mean(x)))
##3.归一化
data = data.apply(lambda x:(x-np.min(x))/(np.max(x)-np.min(x)))
三.数据建模
当数据整理成建模需要的格式之后,就进入数据挖掘最重要也是最核心的一步:数据建模。
在数据挖掘中,常用的数据挖掘算法分为预测、分类、聚类、关联规则、时间序列以及文本挖掘六个大类。下面,我将会归纳每个类常用的常用的几个算法,每个算法我将会简单地拎一拎它的理论核心以及在R或python中运用算法会用到的包。
在讲算法之前,还需要先提一个知识点,那就是数据分区。
3.1数据分区
在机器学习中,一般将建模的数据样本data分为训练集train和测试集test,使用训练集估计模型,使用测试集评估模型优劣。
#R实现
library(caret)
index<-createDataPartition(y,times=1,p=0.75)
train<-data[index,]
test<-data[-index,]
#python实现
from sklearn.cross_validation import train_test_split
x=data.iloc[:,1:(n-1)].values
y=data.iloc[:,n].values
(x_train,x_test,y_train,y_test)=train_test_split(x,y,train_size=0.75,random_state=1)
除了将数据简单地分为训练集和测试集之外,还可以进行k折交叉验证,这不是本文的重点,在此不进行展开。
3.2预测
预测模型指的是建立模型对连续函数值型的目标函数进行估计预测。属于预测的模型中,常见的有线性回归,岭回归,lasso回归,回归树,SVM,神经网络,下面,我将会对它们一一进行概要总结。
3.2.1线性回归
线性回归,即是对 Y=∑βX 做最小二乘法(OLS)估计,求解参数β,从而得出模型。
#R实现
lr_fit<-lm(x,y,data=train)
#python实现
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr_fit=lr.fit(x_train,y_train)
3.2.2岭回归
偏差描述了训练集在样本上的拟合程度,方差描述了模型的移植性,即用测试集验证模型模型的优度。方差和偏差需要同时小模型才好,如果偏差大,模型本身的优度糟糕,但如果一味地追求偏差使得方差大,那么即使在训练样本上拟合再好,一换了测试集就GG的这种可移植性差的模型也是没有意义的。
随着模型复杂度增加,方差和偏差会经历先同高,后同低,最后过拟合,方差高偏差低的过程。
岭回归是在线性回归的基础上给线性回归实际值减去估计值得到的平方误差( (Y−X