机器学习如何应对数据量不足的情况

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baidu_33289052/article/details/79694089

首选,尝试一下常用的线性分类器,比如SVM、LR这些,看训练误差和测试误差的差异,这个时候可能出现多种情况:
  1. 如果训练误差远小于测试误差,说明分类器已经过拟合了,考虑如何避免过拟合。
  2. 如果训练误差和测试误差差不多,但是测试误差太大,说明模型复杂度很可能不够。
  3. 如果训练误差和测试误差差不多,而且测试误差已经足够小,结束。
针对(1),这个时候产生了严重的过拟合,这意味着样本数目不够,一般我们没法补充样本。那么就要考虑如何采用提高泛化能力,如果数据没有很特别的性质(稀疏、低秩等),我们可以考虑添加一些常用正则化项,比如L2-norm,还可以使用一些常用的降维方法(其实也就是常用的假设),比如PCA(假设方差小的数据分布方向是噪声产生的)、LDA。再比如,数据中存在大量的污染,一些废的feature其实对label影响不大,那么我们可以考虑去除一些feature,降低参数空间,从而提高泛化性,简单的方法是给训练参数w加稀疏正则项,比如常用的L1-norm(要是觉得不够系数还可以用capped L1-norm、Lp-norm、SCAD、MCP这些更加稀疏的正则化项),来过滤掉不重要的feature。总而言之,要依赖于数据的特点(除了上面提到的特性,也许还存在正负样本不平衡等性质),设计出减小过拟合程度的方案。
针对(2),可以采用更加复杂的模型,比如带隐变量的模型,比较典型的就是Neural Network,当然这不是唯一的选择,还有决策树以及ensemble类的方法GBDT、Random Forest等。
针对不同情况选择合适的模型之后,观察现在的训练误差和测试误差。回到第(1),(2),(3)步,继续考察新方案。针对具体的业务问题,关键在于迭代得更新方案(不断优化泛化性能),发现数据的新的特性,最终设计出合适于具体业务的模型。

文章某些内容转自:
作者:li Eta
链接:https://www.zhihu.com/question/35649122/answer/63928216
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。












展开阅读全文

mscomm控件接受数据量不足的问题

03-26

上个帖子问了半天,原来是发送端的问题rn这里有了新的问题rn现在在单片机和pc上的串口调试工具之间可以正确的发送和接收.rn但是我自己写的vb程序,mscomm,接收的时候只能接受1/8的数据.正确的接收应该是rn11 80 01 11 80 02 11 80 03...(每三个数是一组,而每组的最后两个字节数代表一个字 ,起始为8001,每组递增1),调试工具接收正确.而我自己的程序接收的是11 80 03 11 80 0b 11 80 13 11 80 1b....(起始为8003,每组递增8)rn降低波特率也没有用.增加单片机发送之间的延时才能解决.是不是因为pc处理串口缓冲的数据速度跟不上接受的速度?如果是那样,为什么别人的调试工具就可以呢?程序对速度有一定要求,不便简单的加延时.rnrthshold=1 inputlen=1.程序清单如下:rnrnDim BufferByte() As ByternDim CommandFlag As IntegerrnrnrnrnPrivate Sub Command1_Click()rn CommandFlag = 1rn MSComm1.Output = "1"rn rnEnd SubrnrnPrivate Sub Command2_Click()rnCommandFlag = 0rnMSComm1.Output = "0"rnrnEnd SubrnrnPrivate Sub Command3_Click()rnText1.Text = ""rnrnEnd SubrnrnPrivate Sub Form_Load()rn i = 0rn CommandFlag = 2rn MSComm1.PortOpen = TruernEnd SubrnrnPublic Sub MSComm1_OnComm() '接收数据触发OnComm()事件rnDim ErroArray(30000) As ByternReDim BufferByte(3)rnDim buffer As VariantrnStatic i As Integerrnrn Select Case MSComm1.CommEvent '在CommEvent中接收数据rn Case comEvReceivern buffer = MSComm1.Inputrn BufferByte = bufferrn ErroArray(i) = BufferByte(0)rn rn MSComm1.InBufferCount = 0rn Text1.Text = Text1.Text + " " + CStr(Hex(ErroArray(i)))rn i = i + 1rn rn rn rn End Selectrn rn rnEnd Subrnrnrn 论坛

没有更多推荐了,返回首页