笔记 9 机器学习实战
- 问题 -> 数据 -> 特征 -> 算法 -> 参数 -> 评价
 
The combination of some data and an aching desire for an answer does not ensure that a reasonable answer can be extracted from a given body of data. John Tukey
- 数据质量优先于模型
 - 不要自动特征选择
 - 算法的可扩展性与计算性能要考虑
 - 数据过拟合问题 数据总是由信号与噪音组成 但会被算法无差别对待
 - 数据要与问题相关 低相关度的组合可能产生高相关度
 
9.1 研究设计
- 定义错误率
 - 将数据分割为训练集 预测集 验证集
 - 在训练集上使用交叉检验选择特征与预测算法
 - 在预测集或验证集上使用一次数据
 - 预测效果起码要优于瞎猜
 - 避免使用小样本
 - 比例为 60% 训练集 20% 预测集 20% 验证集 或 60% 训练集 40% 预测集 或小样本交叉检验
 - 注意数据结构 时序分析要对数据分段采样
 
9.2 错误率
- 真阳性 真的是对的 TP
 - 假阳性 真的是错的 FP Type I
 - 真阴性 假的是错的 TN
 - 假阴性 假的是对的 FN Type II
 - 灵敏度 TP/(TP+FP)
 - 特异性 TN/(TN+FN)
 - 均方差 MSE \(\frac{1}{n} \sum_{i=1}^n (Prediction_i - Truth_i)^2\)
 - 均方误 RMSE \(\sqrt{\frac{1}{n} \sum_{i=1}^n(Prediction_i - Truth_i)^2}\)
 - 中位差 Median absolute deviation
 - 准确性 (TP+TN)/(TP+FP+TN+FP)
 - 一致性 kappa值
 
9.3 ROC 曲线
- 分类问题寻找判别阈值 满足一定TP下最小FP的模型
 - FP v.s.TP 作图
 - AUC 曲线下面积表示选择标准 一般超过80%
 - 对角线是随机猜的结果
 
9.4 交叉检验
- 训练集上的操作
 - 训练集上再分为训练集与测试集
 - 在测试集上评价 重复并平均化测试集错误
 - 用来进行变量 模型 参数选择
 - 随机 分组 留一
 - 分组多方差大 分组少有偏差
 - 有放回的为bootstrap 不建议用
 
9.5 caret 包
- 数据清洗 预处理
 - 数据分割 
createDataPartition数据比例 重采样 产生时间片段 - 训练检验整合函数 
trainpredict - 模型对比
 - 算法整合为选项 线性判别 回归 朴素贝叶斯 支持向量机 分类与回归树 随机森林 Boosting 等
 
9.6 数据分割
train <- createDataPartition(y=spam$type,p=0.75, list=FALSE)数据三一分 得到indexfolds <- createFolds(y=spam$type,k=10,list=TRUE,returnTrain=TRUE)数据分10份 返回每一份列表folds <- createResample(y=spam$type,times=10,list=TRUE)数据bootstrap重采样 返回每一份列表folds <- createTimeSlices(y=tme,initialWindow=20,horizon=10)时序数据重采样 产生20为窗口时序片段的训练集与预测集
9.7 训练选项
args(train.default)通过method控制算法metric控制算法评价trainControl控制训练方法trainControl中method选择模型选择方法 如bootstrap 交叉检验 留一法number控制次数repeats控制重采样次数seed控制可重复性 总体设置一个 具体每一次用列表设置控制具体过程 特别是并行模型
9.8 预测变量作图
featurePlotggplot2
9.9 数据预处理
train中的preProcess=c("center","scale")标准化spatialSign该转化可提高计算效率 有偏preProcess(training[,-58],method=c("BoxCox"))正态化转化method="knnImpute"用最小邻近法填补缺失值nearZeroVar去除零方差变量findCorrelation去除相关变量findLinearCombos去除线性组合变量classDist测定分类变量的距离 生成新变量- 测试集也要预处理
 
9.10 协变量生成
- 原始数据提取特征
 - 提取特征后生成新变量
 - 因子变量要转为虚拟变量
 - 样条基变量 
splines包中的bs - 数据压缩 
preProcess中method设置为pcapcaComp指定主成分个数 
9.11 线性回归&多元线性回归
- \(ED_i = b_0 + b_1 WT_i + e_i\) 基本模型
 - 参见前面回归部分
 
9.12 树
- 迭代分割变量
 - 在最大化预测时分割
 - 评估分支的同质性
 - 多个树的预测更好
 - 优点 容易解释应用 可用在神经网络上
 - 缺点 不容易交叉验证 不确定性不宜估计 结果可能变化 -算法
 - 先在一个组里用所有的变量计算
 - 寻找最容易分离结果的变量
 - 把数据按照该变量节点分为两组
 - 在每一个组中寻找最好的分离变量
 - 迭代直到过程结束
 - 节点纯度用 Gini 系数或 交叉墒来衡量
 rattle包的fancyRpartPlot出图漂亮- 可用来处理非线性模型与变量选择
 
9.13 Bagging
- 重采样 重新计算预测值
 - 平均或投票给出结果
 - 减少方差 偏差类似 适用于非线性过程
 - bagged trees
 - 重采样
 - 重建树
 - 结果重评价
 - 更稳健 效果不如RF
 - Bagged loess 可用来处理细节
 
9.14 radom forest
- bootstrap采样
 - 每一个节点bootstrap选取变量
 - 多棵树投票
 - 准确度高 速度慢 不好解释 容易过拟合
 
9.15 boosting
- 弱预测变量加权后构建强预测变量
 - 从一组预测变量开始
 - 添加有惩罚项的预测变量来训练模型
 - 以降低训练集误差为目的
 - 通用方法
 
9.16 其他预测算法
- 参考统计学习导论笔记
 
9.17 模型联合
- 通过平均与投票结合模型
 - 联合分类器提高准确率
 caretEnsemble包- 案例 广义加性模型
 
library(ISLR); data(Wage); library(ggplot2); library(caret);
Wage <- subset(Wage,select=-c(logwage))
# Create a building data set and validation set
inBuild <- createDataPartition(y=Wage$wage,p=0.7, list=FALSE)
validation <- Wage[-inBuild,]; buildData <- Wage[inBuild,]
inTrain <- createDataPartition(y=buildData$wage,p=0.7, list=FALSE)
training <- buildData[inTrain,]; testing <- buildData[-inTrain,]
mod1 <- train(wage ~.,method="glm",data=training)
mod2 <- train(wage ~.,method="rf",data=training,trControl = trainControl(method="cv"),number=3)
pred1 <- predict(mod1,testing); pred2 <- predict(mod2,testing)
qplot(pred1,pred2,colour=wage,data=testing)
predDF <- data.frame(pred1,pred2,wage=testing$wage)
combModFit <- train(wage ~.,method="gam",data=predDF)
combPred <- predict(combModFit,predDF)
sqrt(sum((pred1-testing$wage)^2))
sqrt(sum((pred2-testing$wage)^2))
sqrt(sum((combPred-testing$wage)^2))
9.18 无监督预测
- 先聚类 后预测
 clue包cl_predict函数- 推荐系统
 
9.19 预测
- 时序数据 包含趋势 季节变化 循环
 - 效应分解 
decompose window窗口ma平滑ets指数平滑forecast预测- 空间数据同样有这种问题 临近依赖 地域效应
 quantmod包 或quandl包处理金融数据- 外推要谨慎