向kaggle大牛学习

驾驶员特征的提取

http://www.kaggle.com/c/axa-driver-telematics-analysis/data
这个已经没时间弄了,过了enter日期.只好先学习人家咱弄的啦

数据说明

每一个driver都有200次的trace,即从0时刻的位置,到最终的位置,每一个trace的数据大概500多个,且都将原点调整到了0,总共几千个driver
各个driver目录下的大多数trace都是其本人驾驶的,目标是找出Does a driver drive long trips? Short trips? Highway trips? Back roads? Do they accelerate hard from stops? Do they take turns at high speed? 这些特征,进而判断该driver目录下的文件是否属于该driver。
即最终结果是
driver_trip,prob
1_1,1
1_2,1
1_3,1
...

某大牛的程序代码

https://github.com/saihttam/kaggle-axa

代码分析

  • Trace.py 定义了Trace类,用来从每一个trace中提取特征
    大牛共享了代码,but只保留了小部分的特征。人家看出来这是gps数据,且每两个点之间的时间是等间隔的,因此可以提取每次trace的总时间,起点到终点的距离,最大速度,总的行驶距离。估计大牛隐掉的特征应该就是差分之后的加速度吧。
    计算距离的时候使用的是欧式距离,用到了from math import hypot即根据两个直角边算斜边的函数hypot((x1 - x0), (y1 - y0))
  • Driver.py定义了Driver类,管理它的所有trace成员,还有自身id等
  • RegressionDriver.py定义了RegressionDriver类,主要实现
def classify(self):
        """Perform classification"""
        clf = GradientBoostingRegressor(n_estimators=100, max_depth=4)
        clf.fit(self.__traindata, self.__trainlabels)
        self.__y = clf.predict(self.__testdata)

原理分析

结合RegressionDriver.py和StartRegressionSlow.py看,由于每一个训练集得有负样本,因此得选取几个负样本driver(也就是其他driver)的trace特征加入训练集
即训练集的构成是:
某driver的特征,label是一堆1,其他driver的特征 ,label是对应的一堆0,然后测试集同训练集的“某driver的特征”

代码技巧

  • 将负样本的数据放入字典:
REFERENCE_DATA = {}
def generatedata(drivers):   
    global REFERENCE_DATA
    for driver in drivers:
        REFERENCE_DATA[driver.identifier] = driver.generate_data_model
  • 随机选取referencenum=5个负样本driver的数据,使用sample函数sample(xrange(len(folders)), referencenum))folders下面是各个driver的数据
  • with临时打开文件进行读写
with open(filename, "r") as trainfile:
            trainfile.readline()  # skip header
啦啦啦
with open(os.path.join(outdir, "pyRegression_{0}.csv".format(submission_id)), 'w') as writefile:
        writefile.write("driver_trip,prob\n")
        for item in results:
            writefile.write("%s\n" % item)
  • 数时间start = datetime.now(), print 'Done, elapsed time: %s' % str(datetime.now() - start)
  • os模块的灵活运用
    folders = [os.path.join(foldername, f) for f in os.listdir(foldername) if os.path.isdir(os.path.join(foldername, f))]
  • 代码加速:
from joblib import Parallel, delayed
results = Parallel(n_jobs=10)(delayed(perform_analysis)(folder) for folder in folders)
普通不并行的话是:
results = [perform_analysis(folder) for folder in folders]
posted @ 2015-03-11 19:56  marquis  阅读(469)  评论(0编辑  收藏  举报