@Macux
2015-12-08T05:48:03.000000Z
字数 5919
阅读 2393
Teradata
- 调试完作业3(东莞用户渠道偏好属性)的取数脚本,无任何报错;(100%)
- 用Python写作业3(东莞用户渠道偏好属性)的分析脚本;(100%)
- LOAD“东莞客户影响力模型”的数据;(100%)
- 跑“东莞客户影响力模型”,输出影响力TOP100的用户;(待定,看数据库情况。)
- 由于没看过模型脚本,一开始完全不知道哪个地方是控制迭代次数的,脚本中也没有相应的注释;
- 和黄浩讨论过后,“for(0..1000)”是控制迭代次数的语句。
- 问题解决!
- 调试脚本和写脚本一样,是一件很好玩但需要耐心的事;
- 和同事一起努力做一件事,会让事情变得更简单,让效率变得更高。
- 写实习生考核PPT;(100%)
- 写好作业3(东莞用户渠道偏好属性)的取数脚本,并优化;(100%)
- 通过修改阀值,来调整模型的Precisio值和Recall值的大小,让模型更“合适”。用Python实现;(100%)
- 理清分类模型的工作原理:
- 分类算法对数据进行预测,实际是预测样本属于正例和反例的概率;
- 算法是如何确定当样本属于正例的概率(阀值)达到多大时,就属于正例:
- 让Precision和Recall同时达到相对最大时的概率,为模型判断样本为正例的阀值。
- 根据具体场景修改阀值,来调整模型的Precision和Recall:
- 比如当场景对Precision要求很高时,例如产品营销场景,可以通过调高阀值来提高Precision。
- 这样做,会让Recall的值变小,但考虑到用户总量,即使Recall的值小一点,也没有关系。
- 问题解决!
- 构建模型,除了要从技术上让模型很好地拟合数据,也要从业务上让模型符合不同场景的需求。
- 以前在建模的时候,只通过模型输出的“Precision”和“Recall”来判断模型的好坏,
并没有思考它们的内在含义,更没有想过在不同的场景,对它们的重视程度是不同的。
- 用Python优化了“判断字段(列)和记录(行)是否倾斜”的函数,加入“输出发生倾斜的字段名和自动删除倾斜字段和倾斜记录”的功能;(100%)
- 学习如何导数;(100%)
- 作业3:“分析东莞用户渠道偏好属性”:
- 脑图(100%)
- 宽表(90%)
- 取数脚本(90%)
- 低效主要表现在:
(1)、只知道发生数据倾斜的字段索引,但不知道字段名;
(2)、查找和删除必须分两次进行的,相当于要经过两次循环;- 用Python重写后,解决上述问题!
- 通过查资料和用自己的号码验证,得知“1”代表web渠道,“2”代表“wap渠道”。
- 问题解决!
- 一开始打算用发票打印日志表来描述用户通过实体营业厅办理业务的行为,后来发现两个问题:
- 这张表没有“用户号码”字段,无法与用户基础信息表关联;
- 大部分用户都不打印发票,不适合作为描述用户通过实体营业厅办理业务的行为的字段;
- 问题待解决!
- 以前做数据挖掘,数据都是现成的和结构化的,从未体会到“数据理解”和“数据准备”的重要性。
- 在做“东莞用户渠道偏好属性”的作业时,认识到“如何合适地用数据去描述用户行为”,十分重要。
- 完成导师安排的作业2:利用第二周的取数结果,探索佛山离网用户特征;(100%)
- 写作业2的数据分析报告;(100%)
- 通过完成作业2,增强自己在“数据预处理”方面的能力;(90%)
- 参见实习生培训,学习如何更实用地优化Teradata SQL脚本;(100%)
- 在第一次建模的过程中,没有注意去除无意义的零值数据,导致数据集倾斜,建模失败。
- 和导师讨论后了解到,数据集中的大部分零值,在业务上是无意义的。
- 设一个阀值,将零值过多的记录或者将整个字段删除。
- 问题解决!
- 在第一次写作业2的分析报告时,没有考虑到看报告的人,其实并不care你的实现过程(代码),他们更关注的可能是这些内容:
- 你为什么要选这个算法做分析?
- 算法的输出结果要怎么理解?
- 算法的输出结果转换成业务知识又是什么?
- 重新写分析报告时,把重点放在了分析思路和模型解释上,并用直观的图表来表达,把枯燥的实现代码作为附录放在报告的末尾;
- 问题解决!
- R中有一个专门做数据离散化的包“discretization”,但具体什么情况要用哪个算法,还很模糊。
- R或Python中是否还有其他更好的算法来做数据离散化?
- 在整个数据挖掘工作中,数据预处理是耗时最多的环节。
- 在这个阶段,除了要依赖算法来做处理之外,还应从业务角度对数据进行理解,让数据既符合建模要求,也符合业务要求;
- 撰写数据分析报告,要更多地从看报告的人的角度来写,思考他们对哪些内容可能更感兴趣,用哪种方式来呈现这些内容更好。
- 优化第二周的取数脚本,提高取数效率;(100%)
- 细读《Teradata SQL》的重要章节,并总结;(90%)
- 做导师安排的作业2:利用第二周的取数结果,分析佛山离网用户特征;(75%)
- 通过完成作业2,增强自己在“数据预处理”方面的能力;(75%)
- 利用“基于稳健马氏距离的方法”和“LOF”方法来做数据异常值检测,效果较好,也更稳定!
- 问题解决!
- 使用更多的标准化处理方法是“standardize()”,但也不是绝对。实际运用中,可以用一小部分样本进行测试。(有时不做标准化处理,反而建模效果更好!)
- 问题解决!
- 在取数的过程中,尽量让查询少访问原始表。方法是多建临时表,让第一次从原始表中查询的临时表,包括该阶段中要用到的所有数据;
- 在建临时表时,不要用"Unique Primary Index"这么强的限制条件做去重,在查询中很容易出现错误,改用group by更好;
- 学习《数据质量和缺失值处理》PPT;(100%)
- 总结变量探索的基本步骤,重点学习缺失值处理;(100%)
- 细读《Teradata SQL》中的关键章节(“临时表”、“CASE”、“OLAP”); (100%)
- 做导师安排的“取数作业”;(100%)
- 看了许多变量缺失值处理的资料,方法众多,除了有相对简单的“单一插补法”,比如均值填补、回归填补等。还有相对复杂的“多重插补法”,比如LDA插补、随机森林插补等。目前困扰我的是,不知道什么情况下使用哪一种更优,是否有一些标准能够帮助判断呢?
- 通过跟导师交流讨论,了解到对缺失值的插补在实际做数据分析的过程中很少会用到,要么用相关性较高的变量替代,要么直接删除。
- 问题解决!
- 在尝试添加主索引和次索引无果后,选择执行explain语句。根据explain结果得知,数据表中有四亿多行记录,收集统计信息将有利于提高查询效率。
- 执行'collect statistics'后,问题解决!
- 在引用临时表中的字段时,全部使用重命名后的字段名,而不是使用基础表中的字段名。
- 问题解决!
- 要学好teradata 数据库,除了要认真阅读《Teradata SQL》教程外,还需要多实践,在实践中暴露自己的不足,在实践中探索编写高效SQL语句的技巧;
- 理清“取数”思路十分重要。拿到取数任务后,首先要理清取数思路,清楚地知道该取数任务需要分为哪几个阶段,在每个阶段需要建立哪些临时表,每张临时表需要定义哪些字段,需要给哪些字段索引,需要添加哪种类型的索引。
- 优化SQL应贯穿整个取数过程。在一开始取数的时候,没有注意到即使是比较简单的查询,也会由于原始表的记录和字段非常多,而导致查询失败(No more spool space)。遇到这类问题,可以先向teradata的优化器求助。
- 学习《Teradata PPT》,了解公司的基本信息; (100%)
- 学完《Teradata SQL》资料; (100%)
- 细读《Teradata 索引》章节; (100%)
- 学习《SQL性能优化经验分享 PPT》; (100%)
- 学习《决策树 PPT》; (100%)
- 学习《Logistic Regression PPT》; (100%)
初步理解:
'ACCESS LOCK'是为了防止其他人在你操作有关数据表期间修改它们,所以预先锁定数据表。
select * from VTNEW_SUBS_THISYEAR t inner join VTDUR_MON b on t.Subs_ID = b.Subs_ID;
select * from VTDUR_MON where Subs_id in (select Subs_id from VTNEW_SUBS_THISYEAR);
- 在Teradata SQL Assistant 中尝试了一下,用逻辑表达式进行查询比用join效率更高。
- 问题解决!
# 执行EXPLAIN 语句
explain select extract(year from salesdate) as yr,extract(month from salesdate) as mon,sum(sales)
from daily_sales
where itemid = 10 and yr in ('1997','1998')
group by 1,2
order by 1,2;
# 创建聚合索引:
create join index monthly_sales as select itemid as item,extract(year from salesdate) as yr,extract(month from salesdate) as mon,sum(sales) as sumsales
from daily_sales
group by 1,2,3;
# 再次执行EXPLAIN 语句
explain select extract(year from salesdate) as yr,extract(month from salesdate) as mon,sum(sales)
from daily_sales
where itemid = 10 and yr in ('1997','1998')
group by 1,2
order by 1,2;
- 有聚合索引,相当于在内部建立一张非规范表,把要汇总的结果先执行好。
- 这样在真正要查询汇总时,不必去访问基础表,提高了查询效率。
- 问题解决!
- 对于具体如何使用EXPLAIN的输出结果,还不清晰。
- 和导师沟通后了解到,explain主要告知用户,在通过收集哪些字段的统计信息后,可以提高查询效率。
- 问题解决!
DIAGNOSTIC HELPSTATS ON FOR SESSION;
Explain SELECT * FROM syscrmadm.lab_employee;
- 多和同事交流。虚心请教比自己一个人埋头苦干的效率要高;
- 一定要总结。学习资料很多,做好总结才能在日后需要的时候快速查找;
- 不断提升自己的技能。在Teradata实习是一个很好的提升自己的机会,所以除了充分利用好工作时间,还要利用休息时间不断地提示自己技能的薄弱环节。