Mryqu's Notes


  • 首页

  • 搜索
close

模型评估笔记

时间: 2013-06-16   |   分类: DataScience     |   阅读: 239 字 ~2分钟
模型评估简介 模型评估是模型开发过程的不可或缺的一部分。它有助于发现表达数据的最佳模型和所选模型将来工作的性能如何。在数据挖掘中,使用训练集中的数据评估模型性能是不可接受的,因为这易于生成过于乐观和过拟合的模型。数据挖掘中有两种方法评估模型,验证(Hold-Out)和交叉验证(Cross-Validation)。为了避免过拟合,这两种方法都使用(模型没有遇到过的)测试集来评估模型性能。 验证(Hold-Out) 使用这种方法时,通常大的数据集会被_随机_分成三个子集: 训练集:用于构建预测模型。 验证集:用于评估训练阶段所得模型的性能。它为模型参数优化和选择最优模型提供了测试平台。不是所有模型算法都需要验证机。 测试集或之前未遇到的样本用于评估模型未来可能的性能。如果模型与训练集拟合的好于测试集,有可能是过拟合所致。 交叉验证(Cross-Validation) 当仅有有限数量的数据时,为了对模型性能进行无偏估计,我们可以使用_k_折交叉验证(k-foldcross-validation)。使用这种方法时,数据被分成_k_份数目相等的子集。我们构建_k_次模型,每次留一个子集做测试集,其他用作训练集。如果_k_等于样本大小,这也被称之为留一验证(leave-one-out)。 分类模型评估 混淆矩阵(Confusion Matrix) 混淆矩阵显示了分类模型相对数据的真实输出(目标值)的正确预测和不正确预测数目。矩阵为_N_x_N_,其中_N_为目标值(类)数目。这类模型的性能通常使用矩阵中的数据评估。下表为两个类别(阳性和阴性)的2x2混淆矩阵。 混淆矩阵目标 阳性阴性模型阳性TPFP阳性预测值 TP/(TP+FP)阴性FNTN阴性预测值 TN/(FN+TN) 灵敏度特异度准确度 =(TP+TN)/(TP+FP+FN+TN) TP/(TP+FN)TN/(FP+TN) 术语: 阳性 (P, positive) 阴性 (N, Negative) 真阳性 (TP, true positive):正确的肯定。又称:命中 (hit) 真阴性 (TN, true negative):正确的否定。又称:正确拒绝 (correctrejection) 伪阳性 (FP, false positive):错误的肯定,又称:假警报 (falsealarm)、第二型错误 伪阴性 (FN, false negative):错误的否定,又称:未命中(miss)、第一型错误 灵敏度(sensitivity)或真阳性率(TPR, true positive rate):又称:召回率(recall)、命中率 (hit rate)在阳性值中实际被预测正确所占的比例。TPR = TP / P = TP / (TP+FN) 伪阳性率(FPR, false positive rate):又称:错误命中率,假警报率 (false alarm rate)FPR = FP / N = FP / (FP + TN) = 1-SPC 特异度 (SPC, Specificity)或真阴性率(TNR, true negativerate):在阴性值中实现被预测正确所占的比例。SPC = TN / N = TN / (FP+TN) = 1-FPR 假发现率 (FDR, false discovery rate):FDR = FP / (FP + TP) = 1-TPR 准确度 (ACC, accuracy):预测正确的数占样本数的比例。ACC = (TP + TN) / (P + N) 阳性预测值 (PPV, positive predictive value)或精度(precision):阳性预测值被预测正确的比例。PPV = TP / (TP + FP) 阴性预测值 (NPV, negative predictive value):阴性预测值被预测正确的比例。NPV = TN / (TN + FN) F1评分:精度和灵敏度的调和平均数。F1 = 2 precision * recall / (precision+recall) =2TP/(2TP+FP+FN) Matthews相关系数 (MCC),即 Phi相关系数:(TPTN - FPFN)/ sqrt{(TP+FP)(TP+FN)(TN+FP)(TN+FN)} 示例:
阅读全文 »

PostgreSQL JDBC setFetchSize

时间: 2013-06-14   |   分类: db+nosql     |   阅读: 6 字 ~1分钟
今天看到我们的Hiberante配置没有设hibernate.jdbc.fetch_size。 Fetch Size是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数。例如一次查询1万条记录,对于Oracle的JDBC驱动来说,是不会1次性把1万条取出来的,而只会取出FetchSize条数,当纪录集遍历完了这些记录以后,再去数据库取Fetch Size条数据。因此大大节省了无谓的内存消耗。当然FetchSize设的越大,读数据库的次数越少,速度越快;FetchSize越小,读数据库的次数越多,速度越慢。这有点像平时我们写程序写硬盘文件一样,设立一个缓冲,每次写入缓冲,等缓冲满了以后,一次写入硬盘,道理相同。 看了一下Postgres,它的JDBC驱动却是一次将查询的所有结果都返回。相反使用游标、设置fetchsize倒是麻烦不少。 http://jdbc.postgresql.org/documentation/head/query.html

Hibernate3 HQL: ClassCastException解决办法

时间: 2013-06-11   |   分类: Service+JavaEE     |   阅读: 312 字 ~2分钟
下面的示例代码跑在Hibernate 3.6.8,会抛出异常java.lang.ClassCastException:[Ljava.lang.Object 无法转换成实体对象。通过调试可知返回的仍然是标量字段对象数组,而不是实体对象。 public class DemoEntity { public static final String DEMO_ENTITY_ID = "demoEntityID"; public static final String USER_ID = "userID"; public static final String OFFICE_ID = "officeID"; private Integer demoEntityID; private String userID; private Integer officeID; private String subjectTxt; public List findDemoEntitys(int startID, int limit, boolean includeStartIdInResults) { try { StringBuilder querySb = new StringBuilder(); querySb.append("select demo.").append(DemoEntity.DEMO_ENTITY_ID); querySb.append(", demo.").append(DemoEntity.USER_ID); querySb.append(", demo.").append(DemoEntity.OFFICE_ID); querySb.append(" from DemoEntity demo where demo.").append(DemoEntity.DEMO_ENTITY_ID); if (includeStartIdInResults) { querySb.
阅读全文 »

Hibernate3.X升级到4.X实践

时间: 2013-06-07   |   分类: Service+JavaEE     |   阅读: 87 字 ~1分钟
Jar调查 |jar文件|Hibernate 4.2.2|当前的Hibernate|操作 |— |antlr.jar|required, 2.7.7|3.2.0|无需改变。 |dom4j.jar|required, 1.6.1|1.6.1|无需改变。 |hibernate-commons-annotations.jar|required, 4.0.2|3.3.1|替换。 |hibernate-corel.jar|required, 4.2.2|3.2.6|替换。 |hibernate-jpa-2.0-api.jar|required, 1.0.1||增加。 |javassist.jar|required, 3.15.0|3.15.0|无需改变。 |jboss-logging.jar|required, 3.1.0||增加。 |jboss-transaction-api_1.1_specl.jar|required, 1.0.1||一开始增加,后来去掉了。 |hibernate-annotations.jar|null|3.3.1|去掉。从Hibernate3.6.0开始hibernate-annotations被合并到hibernate-core。 |hibernate-entitymanager.jar|jpa, 4.2.2|3.2.2|替换。 修改HibernateUtil 将AnnotationConfiguration替换成Configuration; 在使用ServiceRegistry; Configuration config = new Configuration().configure(); ServiceRegistry serviceRegistry = newServiceRegistryBuilder() .applySettings(config.getProperties()).buildServiceRegistry(); sessionFactory = config.buildSessionFactory(serviceRegistry); Hibernate4不支持Ant HibernateToolTask。 使用Hibernate3和HibernateToolTask创建hibernate.cfg.xml 使用Hibernate4编译。 https://community.jboss.org/thread/177200 修改Web容器下的jar文件 替换hibernate3.jar为hibernate-core.jar 替换hibernate-commons-annotations.jar 删除ejb3-persistence.jar 删除hibernate-annotations.jar 复制hibernate-entitymanager.jar 复制hibernate-jpa-2.0-api.jar 复制jboss-logging.jar 复制jboss-transaction-api_1.1_spec.jar (最终没有复制) 通过删除jboss-transaction-api_1.1_spec.jar解决TransactionManager冲突 org.springframework.jndi.TypeMismatchNamingException: Objectof type [class com.atomikos.icatch.jta.J2eeTransactionManager]available at JNDI location [java:comp/env/TransactionManager] isnot assignable to [javax.transaction.TransactionManager] 通过删除ejb3-persistence.jar解决javax.persistence冲突 java.lang.NoSuchMethodError:javax.persistence.OneToMany.orphanRemoval() ejb3-persistence.
阅读全文 »

多维数据遍历

时间: 2013-05-31   |   分类: Java     |   阅读: 363 字 ~2分钟
在联机分析处理(OLAP)系统中,需要对存储在数据库或数据仓库中的数据提供分析。由于数据维数不定,无法采用多重for循环进行数据遍历。我在开发过程中一般使用扁平化下标对多维数据进行遍历,今天尝试了一下递归方式,效率更高一些,但是对栈的消耗也更多一些。下面的代码示例使用两种不同的方式对多维数据进行遍历: 递归 采用扁平化下标 示例代码 package com.yqu.collection; import java.util.ArrayList; import java.util.List; public class MultipleDimensionTraveling <T>{ private List<List<T>> mdList; public MultipleDimensionTraveling(){ mdList = new ArrayList<List<T>>(); } public MultipleDimensionTraveling(List<List<T>> mdList){ this.mdList = mdList; } public void addDimension(List<T> dim){ mdList.add(dim); } public void travelByRecursion(){ if(!mdList.isEmpty()) travelByRecursion(0, new ArrayList<T>(mdList.size())); } private void travelByRecursion(int dimIdx, List<T> crossing){ for(int i=0;i<mdList.get(dimIdx).size();i++){ if(crossing.size()<mdList.size()) crossing.add(dimIdx, mdList.get(dimIdx).get(i)); else crossing.set(dimIdx, mdList.get(dimIdx).get(i)); if(dimIdx==mdList.size()-1){ System.out.println(crossing.toString()); } else { travelByRecursion(dimIdx+1, crossing); } } } public void travelByFlatIndice(){ if(!
阅读全文 »

Servlet

时间: 2013-05-29   |   分类: Service+JavaEE     |   阅读: 38 字 ~1分钟
现在用的VFabric tc Server 2.8.0基于Apache的Tomcat7.0.3版本,支持Servlet3.0和JSP 2.2规范。 Java Servlet3.1规范这周可以下载了,目前正在学习当中。将Servlet的不同版本的资料汇总一下,利人利己。 JSR 340:Java Servlet 3.1 Specification JSR 315:Java Servlet 3.0 Specification JSR 154:Java Servlet 2.4 Specification JSR 53:Java Servlet 2.3 and JavaServer Pages 1.2 Specification Servlet API 2.2 的新特性 Servlet 3.0 新特性详解

Hibernate缓存

时间: 2013-05-25   |   分类: Service+JavaEE     |   阅读: 375 字 ~2分钟
Hibernate缓存 Hibernate带有三种不同缓存机制:一级缓存、二级缓存和查询缓存。 SessionFactory和Session SessionFactory(在JEE中叫做EntityManager)的用途是创建会话,初始化JDBC链接并(使用例如C3P0之类的可插拔provider)进行池化。SessionFactory是非可变的,通过hibernate.cfg.cml文件或Springbean配置中提供的匹配信息、缓存信息等配置进行创建。会话是最低级的工作单元,对应一个数据库事物。当会话创建后并对Hibernate实体机型一些操作,比如设置实体的一个属性,Hibernate不会立即更新底层数据库表。相反Hibernate记录实体的状态(是否为脏数据),并在会话最终刷新更新到数据库。这就是Hibernate所谓的一级缓存。 一级缓存 一级缓存是Hibernate记录正在进行的会话加载和接触的实体有可能的脏数据状态。正在进行的会话代表工作单元,始终使用,无法关闭。一级缓存的用途是隐藏对数据库许多SQL查询或更新,并在会话最终批量一起执行。当想起一级缓存的时候就应该想到会话。 二级缓存 二级缓存是进程范围内的缓存,与一个SessionFactory绑定。二级缓存可被相同(通常一个应用程序仅一个)SessionFactory的所有会话共享。默认二级缓存没有使能。二级缓存不存储任何实体实例,而是存储“脱水”状态,即字符串或整形数组代表实体的属性,一个实体id指向“脱水”的实体。概念上可以认为它是一个映射,id作为键,数组作为值。或像下面用于缓存region的这些东西: public class Person { private Person parent; private Set<Person> children; public void setParent(Person p) { parent = p; } public void setChildren(Set<Person> set) { children = set; } public Set<Person> getChildren() { return children; } public Person getParent() { return parent; } } Hibernate映射配置如下: <class name="org.javalobby.tnt.hibernate.Person"> <cache usage="read-write"/> <id name="id" column="id" type="long"> <generator class="identity"/> </id> <property name="firstName" type="string"/> <property name="middleInitial" type="string"/> <property name="lastName" type="string"/> <many-to-one name="parent" column="parent_id" class="Person"/> <set name="children"> <key column="parent_id"/> <one-to-many class="Person"/> </set> </class> Hibernate概念上为此类持有如下记录:
阅读全文 »

JavaSE 新增特性

时间: 2013-05-22   |   分类: Java     |   阅读: 33 字 ~1分钟
参考 Wiki:Java version history JDK各版本很cool的特性 JDK6中httpserver实例 IBM developerWorks:JDK 7 新特性 - 总览 Try-with-resources in Java 7 Java 7 的新特性一览表 编程没有银弹:探讨 Java 8 新增特性的优缺点 IBM developerWorks:Java 8 新特性概述 Java 8 的新特性和改进总览 Java 8 正式发布,新特性全搜罗

使用GemFire做Mybatis/Hibernate二级缓存

时间: 2013-05-22   |   分类: Cache     |   阅读: 493 字 ~3分钟
使用GemFire做Mybatis二级缓存 MyBatis支持第三方二级缓存实现,目前支持Ehcache、Hazelcast和OSCache。 GemFire不在支持的范围,但是可以通过实现org.apache.ibatis.cache.Cache接口来使用。 MyBatis的Cache配置及实现 设置MyBatis的Cache全局使用开关:默认是true,如果它配成false,其余各个MapperXML文件配成支持cache也没用。 <settings> <setting name="cacheEnabled" value="true"/> </settings> 各个Mapper XML文件,默认是不采用cache。在配置文件加一行就可以支持cache: <cache /> 实现GemfireCache package com.yqu.mybatis.caches.gemfire; import com.gemstone.gemfire.cache.AttributesFactory; import com.gemstone.gemfire.cache.CacheFactory; import com.gemstone.gemfire.cache.Region; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.apache.ibatis.cache.Cache; import org.apache.ibatis.cache.CacheException; public final class GemfireCache implements Cache { private static Region<object> mybatis_region = null; private Region<object> region = null; private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); private String id; public void setId(String id) { this.id = id; } public void setRegion(Region<object> region) { this.
阅读全文 »

Java缓存规范JCache API(JSR107)

时间: 2013-05-22   |   分类: Service+JavaEE   Cache     |   阅读: 12 字 ~1分钟
今天看了一下Java缓存规范JCacheAPI(JSR107),它对Java对象缓存进行标准化,方便高效开发,让程序员摆脱实现缓存有效期、互斥、假脱机(spooling)和缓存一致性等负担。该规范提供了API、RI(参考实现)和TCK(技术兼容性套件)。 从设计的角度看,基本组成部分有一个CacheManager,用来持有、控制缓存集合。缓存里存放键值对条目。 整个规范包括了如下内容: 支持原子操作的缓存读写 缓存事件监听器 统计 事务 注解 JSR107从2001年开始,中间搁置了一段时间,后来Terracotta(产品:EhCache)和Oracle(产品:Coherence)在2010年加强了对JSR-107的投入,原本有望放入JAVAEE7(JSR342)中,可惜在期限内完不成,直到2012年底才推出了草案。 我更关注数据网格(JSR347),那个是JSR107的超集,关注缓存的逐出、复制和分布化,以及事务。可惜连草案也还没影呢。 http://jcp.org/en/jsr/detail?id=107 http://jcp.org/en/jsr/detail?id=347
59 60 61 62 63 64 65 66 67

Programmer & Architect

662 日志
27 分类
1472 标签
RSS 订阅
GitHub Twitter FB Page
© 2009 - 2023 Mryqu's Notes
Powered by - Hugo v0.120.4
Theme by - NexT
0%