dtype为category每个元素类型、Series按位置取数、argparse初探、17th solution review小结

1. 对于一个dtype类型是category的Series,其中每一个元素的类型可能是str、int等等,category相当于是对这些类型的高层封装。所以对于一个dtype为category的Series a,a.apply(str),只是改变了其中每一个元素的类型,并没有改变a的dtype,所以再进行a.apply(str) + '_'就会出现运算错误,所以a要实现字符串运算,需要a.astype(str) + '_'。但是如果本身Series的dtype是一个int64,这时候用Series.apply(str),因为把每一个元素都转换成了str,所以最后的dtype也随之而改变成object。

2. 关于Series的取某个数,感觉设计原则就是在没有歧义的情况下尽可能地简洁。比如a是一个Series,a[5],这个的含义是取index label是5的那个元素,并不是位置,但是如果index是abcde,a[3]这个时候就是取的位置,a[-1]也是取的位置。一般来说,都是自然数字索引,a[3]就是取3的那个索引,所以a[-1]这种就会报错,因为没有-1的索引,那如何按照位置来取数呢?Series仍然有iloc方法,比如a.iloc[-1],a[:-1]这种取片段,就又是按照位置,因为没有歧义,可以分辨。

3. 研究了下命令行交互程序的写法,以前同事用的是OptionParser这个module,后来我发文档发现这个module已经废弃了,从2.7开始用的module是argparse,整体上我感觉和OptionParser是类似的,都是生成一个对象,然后添加参数,最后解析出来。开始我照着文档的例子弄了一下,其实文档的例子还比较复杂了,我一般只需要读取一个input的dir,一个output的dir,就是两个参数,实际上添加起来非常简单,我自己试出来的
parser = argparse.ArgumentParser()
parser.add_argument('-i')
parser.add_argument('-o')
args = parser.parser.parse_args()
args是一个叫Namespace的对象,要取其中的属性用
args.i args.o
这样在命令行中就可以python prog.py -i '../output/xxx.csv' -o '../output/yyy.csv'
进行交互
这个模块根据以后交互得更复杂还有很多地方需要学习

4. 我观察了17th solution的特征工程,大体上可以归纳成几类:

  • 差分类变量,一阶差分,二阶差分,有可能很有用
  • 个人表现和平均表现的比值,比如个人点击和平均点击的比值;个人购买金额和平均购买金额的比值
  • 同一用户多条记录,可以取第一条,可以取最近一条,某种特定条件的记录(比如最大贷款额所在的记录)
  • 基于一些抽象的假设去衍生,可能这种猜想是一种简单抽象,实际上并非如此,但这种抽象也许就是模型的基础
  • 某些ratio,可能没什么业务含义,但是存在一种正相关或者负相关,比值可能也能体现一些东西
  • 其他,比如贷款和点击的序列,转化成类别性变量
总的来说特征工程有一些死的东西,我们称之为套路,还有一些要靠灵性

5. 从17th solution中得到的其他启示:
  • 一个函数就是创造类似的一个到多个特征
  • 一个函数同时接收train&test
  • 这种结构比较灵活,中间可以扣掉几个函数也不影响
  • 而反观我的特征工程很乱,比较散,训练集和测试集的逻辑是分开书写的,他这种结构优于我的结构
  • 除了他这个代码中体现出来的,有可能他的代码也是重构过后的,就特征部分,应该还尝试了很多其他的特征
  • 从训练的代码中也可以看出他也尝试了其他一些办法(比如先分类再回归)



留言

熱門文章