数据挖掘概念与技术读书笔记

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()));

	
 

猜你喜欢

转载自hill007299.iteye.com/blog/1620388