这一章和《TensorFlow机器学习理论与实战 第二章 Logistic回归模型》以及《Python机器学习理论与实战 第二章 Logistic回归模型》使用的是同样的数据集,只不过分别用R 语言,TensorFlow,Scikit-Learn实现,前两章内容已经发布,感兴趣的读者可以到主页查看。接下来进入正题,利用R语言进行“泰坦尼克号生还预测”。
获取数据集
# 从网站获取数据titanic = read.cs("https://gitee.com/boyan615/DataSet/raw/master/titanic.txt")# 取出对生还有影响的主要属性titanic_=titanic[,c('suried','pclass','sex','age','sibsp','parch','fare','embarked')]head(titanic_)
数据筛选
关于数据的筛选方法以及每个属性的含义之前的文章《Python机器学习理论与实战 第二章 Logistic回归模型(上)》已经介绍过,在此就不再赘述。
缺失值识别
统计每个属性缺失值的个数:
sapply(titanic_,function(data))
属性的缺失值统计
可以看到 age 的缺失值个数较多,fare有1个缺失值。
缺失值填充
采用比较简单的填充方式,补充 Age 和 fare 里的数据,使用平均数或者中位数填充都是对模型偏离造成最小影响的策略。
titanic_[is.na(titanic_$age),"age"]=mean(titanic_$age,na.rm = TRUE)titanic_[is.na(titanic_$fare),"fare"]=mean(titanic_$fare,na.rm = TRUE)sapply(titanic_,function(data))
数据划分
数据分割,随机采样25%的数据用于测试,剩下的75%用于构建训练模型。
# 查看数据类型信息str(titanic_)# 首先对数值型数据标准化 ,Z-Score标准化titanic_[,-c(1,3,8)]= scale(titanic_[,-c(1,3,8)] )head(titanic_)#分割数据集set.seed(3)trainindex = sample(1:nrow(x = titanic_),0.75*nrow(titanic_))trainset = titanic_[trainindex,]testset = titanic_[-trainindex,]
特征工程
特征转换
对于类别型的变量,需要使用one-hot 编码转化为数值特征,用0/1代替,转换特征后,凡是类别型的特征都单独剥离出来,独成一列特征,这一步由R语言自动完成,后续会看到。
数据标准化
数据标准化在前面已经做了,正常的做法应该是根据测试集的均值和标准差来对测试集和训练集进行标准化操作,但是为了方便,直接根据所有数据的均值和标准差来做了标准化。
模型拟合
fit.full = glm(suried~.,data = trainset,family = binomial)# 查看模型的概括性信息summary(fit.full)
模型的概括性信息
模型预测
# 返回概率testset$lr_y_predict_proba = predict(fit.full,newdata = testset[,-1],type = "response")# 返回类别testset$lr_y_predict = ifelse(testset$lr_y_predict_proba > 0.5,1,0)head(testset)
模型评价
模型评价指标和之前的一样,使用准确性Accuracy /召回率 Recal l/精确率 Precision / F1 Measure,以及ROC 曲线和AUC 值,具体的含义和计算公式可以查看《Python机器学习理论与实战 第二章 Logistic回归模型(下)》。
为了方便特地写了一个可以同时计算这几个指标的函数,需要的读者可以做个参考,以后只需调用这个函数即可计算出所有的结果。
模型性能评价函数
# 因为要画ROC曲线,所以需要载入ROCR包,没有的需要先安装一下#install.packages("ROCR")library(ROCR)report_fun(testset$lr_y_predict_proba,testset$lr_y_predict,testset$suried)[1] "Accuracy 0.792682926829268"[1] "Precision 0.776859504132231"[1] "Recall 0.696296296296296"[1] "F_measure 0.734375"predictactual 0 10 166 271 41 94[1] "AUC 0.846171560161197"
ROC曲线
大家可以和之前 Python 的结果做一个比较,其实差不多,只不过在划分测试集和训练集的时候随机种子不一样所以结果才会有一定差别。
领取专属 10元无门槛券
私享最新 技术干货