1 数据分析预处理摘录
可以对数据使用下面的预处理,以便提高分类和预测过程的准确性、有效性和可规模性。
数据清理:是旨在消除或减少数据噪音(例如,使用平滑技术)和处理遗漏值(例如,用该属性最常出现的值,或根据统计,用最可能的值替换遗漏值)的数据预处理。尽管大部分分类算法都有处理噪音和遗漏值的机制,但该步骤有助于减少学习时的混乱。
相关性分析:数据中许多属性可能与分类和预测任务不相关。例如,记录银行贷款星期几签署的数据可能与应用的成功不相关。此外,其它属性可能是冗余的。因此,可以进行相关分析,删除学习过程中不相关或冗余属性。在机器学习,这一过程称为特征选择。包含这些属性将减慢和误导学习步骤。理想地,用在相关分析上的时间,加上从“压缩的”结果子集上学习的时间,应当少于由原来的数据集合上学习所花的时间。因此,这种分析可以帮助提高分类的有效性和可规模性。
数据变换:数据可以泛化到较高层概念。概念分层可以用于此目的。对于连续值属性,这一步非常有用。例如,属性income的数值值可以泛化为离散的区间,如low, medium和high。类似地,标称值,如street,可以泛化到高层概念,如city。由于泛化压缩了原来的训练数据,学习时的输入/输出操作将减少。 数据也可以规范化,特别是在学习阶段使用神经网络或涉及距离度量的方法时。规范化涉及将属性的所有值按比例缩放,使得它们落入较小的指定区间,如-1.0 到 1.0,或 0.0 到 1.0。例如,在使用距离度量的方法中,这可以防止具有较大初始域的属性(如income)相对于具有较小初始域的属性(如二进位属性)权重过大。
2 贝叶斯
定义http://zh.wikipedia.org/wiki/%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%AE%9A%E7%90%86
比较形象的例子
http://www.cnblogs.com/leoo2sk/archive/2010/09/17/1829190.html
这里可以感受到数学的力量、算法的力量,高精尖的技术
http://www.myfirm.cn/News/skill/20071218091204341.html
监督与非监督的区别
http://www.cnblogs.com/CloudCraft/archive/2012/06/15/2551073.html
http://blog.csdn.net/sulliy/article/details/6629201
ROC
http://blog.csdn.net/chjjunking/article/details/5933105
http://baike.baidu.com/view/42249.htm
3 weka
把weka集成到java代码中,复用其挖掘算法
http://www.360doc.com/content/09/0603/16/23378_3766416.shtml
http://hi.baidu.com/xiaokou/blog/item/bbdfc91744a3080fc93d6d98.html
直接下载从svn下载weka源码,导入工程,即可进行weka开发。
4 数据之夜方案:
1 云梯数据获取,定义训练集和测试集。
2 数据预处理
3 使用weka建立基于贝叶斯的模型
4 用模型对测试集进行预测。产出报告,业务价值
weka代码
Classifier m_Classifier = new NaiveBayes(); // 读取训练数据 String trainFilepath = "E:\\Program Files\\weka-3-5-8\\data\\wekadata2.csv"; DataSource trainSource = new DataSource(trainFilepath); Instances trainDate = trainSource.getDataSet(); Instances cpInstances = new Instances(trainDate); for (int i = 0; i < 4; i++) { trainDate.deleteAttributeAt(0); } Discretize discretize = new Discretize("1"); discretize.setBins(2); discretize.setUseEqualFrequency(true); discretize.setInputFormat(trainDate); trainDate = weka.filters.Filter.useFilter(trainDate, discretize); discretize.setBins(10); discretize.setAttributeIndices("2,3,4,6,7,8,9,10"); discretize.setInputFormat(trainDate); trainDate = weka.filters.Filter.useFilter(trainDate, discretize); trainDate.setClassIndex(0); // 训练分类器 m_Classifier.buildClassifier(trainDate); // 读取测试数据 // String testFilepath = trainFilepath; // DataSource testSource = new DataSource(testFilepath); // Instances testDate = testSource.getDataSet(); // testDate.setClassIndex(0); Instances testDate = trainDate; AtomicInteger hit = new AtomicInteger(); AtomicInteger lost = new AtomicInteger(); // 测试一下分类器的效果 for (int i = 0; i < testDate.numInstances(); i++) { Instance instance = testDate.instance(i); // System.out.println(instance.classAttribute().type()); double predicted = m_Classifier.classifyInstance(instance); if (instance.classValue() != predicted) { for (int j = 0; j < cpInstances.instance(i).numAttributes(); j++) { System.out.println(cpInstances.instance(i).attribute(j) .toString() + ":" + cpInstances.instance(i).value(j)); } System.out.println("actual:" + instance.classValue() + "-----predict:" + predicted); lost.incrementAndGet(); } else { hit.incrementAndGet(); } // System.out.println(instance.classValue()); } System.out.println("hit num:" + hit.get()); System.out.println("lost num:" + lost.get()); System.out.println("hit rate:" +( hit.get()*100) / (hit.get() + lost.get()));