最近在Kaggle上做了一个数据挖掘的比赛,是一个分类的问题,收获良多。故此将比赛的过程记录了下来。
竞赛地址
Kaggle–Shelter Animal Outcomes
题目大意
在美国,每年大约有760万伴侣动物被动物收容所收容。大多数动物是被它们的主人主动放弃,而另一些则是由于种种的意外情况而进入收容所。最终,有些动物足够幸运找到了新的归宿,但另一些不那么幸运的则最终被安乐死。美国每年大约有270万的猫狗被执行安乐死。
这次的比赛使用的是来自Austin的动物收容所的数据,其中包括动物的品种,颜色,性别和年龄,要求参赛者预测每只动物的最终结局。这些结局包括:被领养、死亡、安乐死、归还所有者和转移。其中训练集和测试集是随机划分的。
最后输出测试集种每个动物的每一种结局的可能性即可。
给定数据集描述
给定的数据集中一共包括10个字段,其字段的含义如下:
- 数据集说明
- AnimalID : 动物的ID编号
- Name : 动物的名称,若动物没有名字次字段为空
- DateTime : 进入收容所的日期 (例:2014/2/12 18:22:00)
- OutcomeType : 动物的最终结局 ,有5种可能取值:Adoption(被领养)、Died(死亡)、Euthanasia(安乐死)、Return_to_owner(返回原主人)、Transfer(转移)
- OutcomeSubtype : 是对动物结局的补充说明,好像没有什么用
- AnimalType : 动物的类型,只有两种取值即Dog(狗)、Cat(猫)
- SexuponOutcome : 动物的性别和生育能力,取值Neutered Male(雄性动物不能生育)、Spayed Female(雌性动物不能生育)、Intact Male(雄性动物能够生育)、Intact Female(雌性动物能生育)、Unknown(未知)
- AgeuponOutcome : 动物的年龄(例如:1 year,3 weeks)
- Breed : 动物的品种(例如: Shetland Sheepdog Mix、Domestic Shorthair Mix)
- Color : 动物的毛色(例如:Brown/White、Cream Tabby)
初次尝试
数据准备
首先当然是将所给的数据集读入进来:
train_data <- read.csv("train.csv",stringsAsFactors = F)
test_data <- read.csv("test.csv",stringsAsFactors = F)
str(train_data)
train<-train_data[-1]
test<-test_data[-1]
library(dplyr)
full <- bind_rows(train, test)
可以看到所读入的数据内容:
特征提取
1.将动物有没有姓名作为一个特征:
full$Name[full$Name==""]<-"No"
full$Name[full$Name!="No"]<-"Yes"
![full$Name](http://img.blog.csdn.net/20170103223736505?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmFpZHVfMzM4OTM4ODA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2.处理AgeuponOutcome属性
full$TimeValue <- sapply(full$AgeuponOutcome,
function(x) strsplit(x, split = ' ')[[1]][1])
full$UnitofTime <- sapply(full$AgeuponOutcome,
function(x) strsplit(x, split = ' ')[[1]][2])
full$UnitofTime <- gsub('s', '', full$UnitofTime)
full$TimeValue <- as.numeric(full$TimeValue)
multiplier <- ifelse(full$UnitofTime == 'day', 1,
ifelse(full$UnitofTime == 'week', 7,
ifelse(full$UnitofTime == 'month', 30,
ifelse(full$UnitofTime == 'year', 365, NA))))
# 转换成天
full$AgeinDays <- full$TimeValue * multiplier
这样就可以将动物的年龄统一为天
3.将SexuponOutcome 拆分成两个特征,即性别和是否能生育,Unknown的情况认为是缺失
full$SexuponOutcome[full$SexuponOutcome=="Unknown"]<- "Unknown Unknown"
full$bear<-sapply(full$SexuponOutcome,
function(x) strsplit(x, split = ' ')[[1]][1])
full$sex<-sapply(full$SexuponOutcome,
function(x) strsplit(x, split = ' ')[[1]][2])
full$bear[full$bear=="Intact"]<-"Can"
full$bear[full$bear=="Spayed"]<-"Cannot"
full$bear[full$bear=="Neutered"]<-"Cannot"
full$bear[full$bear=="Unknown"]<-NA
full$sex[full$sex=="Unknown"]<-NA
4.处理DateTime属性
首先通过lubridate的相关函数获取动物进入收容所的年份、月份、星期以及小时
library(lubridate)
full$Hour <- hour(full$DateTime)
full$Weekday <- wday(full$DateTime)
full$Month <- month(full$DateTime)
full$Year <- year(full$DateTime)
为方便处理将Hour属性压缩:
## 将之划分为早上,下午,傍晚,深夜四类型
full$TimeofDay <- ifelse(full$Hour > 5 & full$Hour < 11, 'morning',
ifelse(full$Hour > 10 & full$Hour < 16, 'midday',
ifelse(full$Hour > 15 & full$Hour < 20, 'lateday', 'night'))
以同样的方式处理Weekday属性
# 将时间划分为工作日和周末
full$isWorkday<- ifelse(full$Weekday<=5,'WorkDay',
ifelse(full$Weekday>5,"Rest",NA))
5.处理Breed 属性
#设置属性表示动物是否是混合品种,属性为“Yes”或“No”
full$IsMix <- ifelse(grepl('Mix', full$Breed),"Yes","No")
为方便处理,将动物的品种去掉Mix后设为/之前的品种
# 设置动物的品种为第一个单词
full$SimpleBreed <- sapply(full$Breed,
function(x) gsub(' Mix', '',
strsplit(x, split = '/')[[1]][1]))
6.处理Color属性
# 设置一个属性标志其颜色是否是纯色的
full$isPureColor <- ifelse(grepl('/| ',full$Color),"Pure","Mix")
为方便处理,将杂色动物的杂色的第一种颜色作为动物的毛皮颜色
# 对于杂色的动物,取'/'的前一种颜色作为其颜色属性
full$SimpleColor <- sapply(full$Color,
function(x) strsplit(x, split = '/| ')[[1]][1])