数据分析分为数据处理,数据探索和数据建模,其中数据处理和数据探索往往能占整体工作的70%以上。这里主要讲如何利用dplyr包对数据进行操作以及如何利用caret包对数据建模。
这里我们采用真实的数据集(analytics vidhya竞赛练习load predicion中的数据):
load<-read.csv('https://datahack-prod.s3.ap
-south-1.amazonaws.com/
train_file/train_u6lujuX_CVtuz9i.csv')
数据处理篇-dplyr包:
dplyr能非常方便的对数据进行操纵,相似功能的包还有data.table或两者的合集dtplyr,可以在R中用??dtplyr查看。
library(dplyr)
dim(load)
[1]61413
str(load)
dplyr中的数据筛选函数:filter和select:
例如我想选择以下变量并另存一张表并标记位用户属性信息:
user <- select(load, Loan_ID,Gender,Married,
Dependents,Education,
Self_Employed,Property_Area)
同时在select中可以利用-(Gender,Married)来选择去除变量Gender,Married的数据。
如果我还想查看Gender为Male,以及Married为No的用户:
user_gender_married <- filter(user,
Gender == 'Male',
Married == 'No')
同时在filter中可以利用|来表示或,例如filter(user, Dependents == 0 | Dependents == 1)选择Dependents是0或是1的数据。
dplyr中的数据排序函数:arrange():
例如可以对load进行按照先ApplicantIncome升序,再CoapplicantIncome升序,
最后Loan_Amount_Term降序的次序排序:
load <- arrange(load, ApplicantIncome,
CoapplicantIncome,
desc(Loan_Amount_Term))
注意desc()表示降序。
dplyr中的数据添加函数:mutate():
其中mutate()会保留所有变量, transmute()只保留添加变量。
例如我想添加以下变量:
app_cpp=ApplicantIncome-CoapplicantIncome;
app_cpp_term=app_cpp/ Loan_Amount_Term;
load_app <- mutate(load,
app_cpp = ApplicantIncome-CoapplicantIncome,
app_cpp_term = app_cpp/ Loan_Amount_Term)
可以看到后面多出两个变量。如果用transmute(),load_app就会只有app_cpp和app_cpp_term两个变量。
dplyr中的数据去重函数: distinct():
类似uniqe()函数,但distinct()速度会更快。
例如我想看看Dependents变量或是Dependents和Married变量去重后的结果:
distinct(load, Dependents)
distinct(load, Dependents, Married)
dplyr中的数据分组和汇总函数: group_by()和summaris():
summaris()函数可以单独应用,例如求某列的均值:
summarise(load, mean_cpp = mean(CoapplicantIncome, na.rm = TRUE))
注:na.rm = TRUE表示去除缺失值。
通常summarise和group_by都是一起用的,类似于excel的数据透视表:
例如计算Gender变量不同种类的数目及不同种类下CoapplicantIncome的平均值:
load_gr <- group_by(load, Gender)
summarise(load_gr, count=n(),
gender_mean_cpp=mean(CoapplicantIncome, na.rm = TRUE))
数据建模篇-caret包
caret包能对数据进行预处理包括特征筛选和缺失值填充等,另外还能进行交叉验证和各种模型的grid调参。
library(caret)
查看并处理缺失值:
sum(is.na(load))
[1]86
colSums(is.na(load))
发现有缺省值我们可以用preProcess对缺失值进行填充,其实在处理缺失值之前应该首先弄清楚缺失值的属性即如何产生的,然后再根据缺失值属性对缺失值进行相应的处理,这里只是展示如何用preProcess函数处理缺失值。
preProcValues <- preProcess(load, method = c("knnImpute","center","scale"))
注意这里对数据进行了归一化处理,并采用knn模型进行填充。
library('RANN')
load_processed <- predict(preProcValues, load)
sum(is.na(load_processed))
[1]0
去除Loan_ID,并将Loan_Status改为0和1:
load_processed$Loan_Status<-ifelse(load_processed$Loan_Status=='N',0,1)
id<-load_processed$Loan_ID
load_processed$Loan_ID<-NULL
利用dummyVars对分类变量进行数值化处理,即将每一个类别做一个变量并用0或1表示其是否存在:
dmy <- dummyVars(" ~ .", data = load_processed,fullRank = T)
load_transformed <- data.frame(predict(dmy, newdata = load_processed))
注:" ~ ."表示对所有分类变量进行数值化处理。
利用createDataPartition将数据集按比例分成测试集和训练集:
index <- createDataPartition(load_transformed$Loan_Status, p=0.75, list=FALSE)
train <- load_transformed[ index, ]
test <- load_transformed[-index, ]
设置交叉验证参数:
fitControl <- trainControl(method = "repeatedcv", number = 5, repeats = 5)
设置grid调参参数范围:
这里采用gbm方法。
grid<- expand.grid(n.trees=c(10,20,50,100,500,1000),
shrinkage=c(0.01,0.05,0.1,0.5),
n.minobsinnode = c(3,5,10),
interaction.depth=c(1,5,10))
利用train函数训练模型:
train[,19] <- as.factor(train[,19])
model_gbm<-train(train[,1:18],train[,19],
method='gbm',
trControl=fitControl,
tuneGrid=grid)
可以根据实际需求在train的method中更改模型,例如将gbm改为rf即为随机森林模型,但不要忘了更改前面grid的模型参数类型及范围。
查看模型参数:
model_gbm
这里只截取了一部分。
查看模型各参数变化图:
plot(model_gbm)
查看变量重要性:
varImp(object=model_gbm)
将模型应用于测试集:
predictions<-predict(model_gbm,test[,18])
table(predictions)
查看混淆矩阵:
confusionMatrix(predictions, test[,19])
最后根据混淆矩阵的反馈调整模型,选取最优模型。