背景
实验室想要评估某种形式的凝胶电泳是否适合作为某种物质质量的分类方法。加载了几个凝胶,每个凝胶都带有一个干净的物质样品和一个含有杂质的样品。此外,还加载了分子标记作为参考。下图说明了设置(图片不显示实际实验,我取自维基百科进行说明):

为每个凝胶和每个泳道测量了两个参数:
- 分子量(即化合物在电泳过程中漂移的“高度” )
- 相对数量。将每个泳道的总量归一化为 1,并测量每个条带的密度,从而得出每个条带的相对数量。
然后产生相对数量与分子量的散点图,看起来像这样(这是人工数据):

这张图可以这样解读:“好”(蓝点)和“不纯”(红点)物质都有两条带,一条在分子量 120 左右,一条在 165 左右。“不纯”的条带” 分子量在 120 左右的物质比“好”物质的密度要小得多,并且可以很好地区分。
目标
目标是确定两个确定“好”物质的框(见下图)。然后这些框将用于将来将物质分类为“好”和“不纯”。如果一种物质的泳道在方框内,则将其分类为“良好”,否则分类为“不纯”。
这些决策规则应该很容易适用于实验室中的某个人。这就是为什么它应该是盒子而不是弯曲的决策边界。
假阴性(即当样本真的“好”时将其归类为“不纯”)被认为比假阳性更糟糕。也就是说,重点应该放在敏感性上,而不是特异性上。

问题
我不是机器学习方面的专家。但是,我知道有很多机器学习算法/技术可能会有所帮助:最近邻(例如in )、分类树(例如or )、支持向量机()、逻辑回归、boosting 和 bagging 方法还有很多。knnRrpartctreeksvm
许多这些算法的一个问题是它们不提供简单的规则集或线性边界。此外,样本量约为70。
我的问题是:
- 有没有人知道如何在这里进行?
- 将数据集拆分为训练集和测试集是否有意义?
- 训练集的数据比例应该是多少(我认为大约是 60/40 分割)。
- 一般来说,这种分析的工作流程是什么?类似于:拆分数据集-> 训练集上的拟合算法-> 预测测试集的结果?
- 如何避免过拟合(即盒子太小)?
- 在这种情况下,评估预测性能的好统计数据是什么?曲线下面积?准确吗?阳性预测值?马修斯相关系数?
假设我熟悉R和caret包。非常感谢您的时间和帮助。
示例数据
这是一个示例数据集。
structure(list(mol.wt = c(125.145401455869, 118.210252208676,
165.048583787746, 126.003687476776, 170.149347112565, 127.761533014759,
155.523172614798, 120.094514977175, 161.234986765321, 168.471542655269,
156.522990530521, 154.377948321209, 165.365756398877, 167.965538771316,
116.132241687833, 115.143539160903, 156.696830822196, 162.578494491556,
136.830624758899, 123.886594633942, 124.247484227948, 126.257226352824,
160.684010454816, 166.618872115047, 126.599387146887, 165.690375912529,
159.786861142652, 114.520735974329, 125.753594471656, 157.551537154148,
157.320636890647, 171.5759136115, 158.580005438661, 125.647463565197,
130.404710783509, 127.128218318572, 162.144126888907, 161.804616951055,
167.917268243627, 168.582197247178), rel.qtd = c(57.68339235957,
54.0514508510085, 25.0703901938793, 37.6933881305906, 36.6853653723001,
53.6650555524679, 52.268438087776, 52.8621831466857, 43.1242291166037,
46.6771236380788, 38.0328239221277, 40.0454611708371, 44.6406366176158,
40.8238699987682, 51.9464749018547, 54.0302533272953, 37.9792331383524,
48.3853988095525, 38.2093977349102, 42.2636098418388, 42.9876895407144,
40.8018728193786, 40.1097096927465, 38.7432550253867, 39.2633283608111,
43.4673723102812, 53.3740718733815, 49.1067921475768, 52.3002598744634,
44.9847844953241, 44.3014423068017, 44.0191971364465, 47.0805245356855,
55.0124134796556, 57.9938440244052, 62.8314454977068, 45.8093815891894,
43.2300677500964, 39.4801550161538, 51.6253515591173), quality = structure(c(2L,
2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 1L), .Label = c("bad", "good"), class = "factor")), .Names = c("mol.wt",
"rel.qtd", "quality"), row.names = c(10L, 14L, 47L, 16L, 57L,
54L, 45L, 12L, 43L, 67L, 25L, 21L, 1L, 55L, 20L, 22L, 37L, 15L,
8L, 38L, 46L, 64L, 51L, 65L, 52L, 61L, 63L, 32L, 50L, 27L, 19L,
69L, 23L, 42L, 6L, 48L, 11L, 13L, 5L, 71L), class = "data.frame")