摘要: 本文是一份关于如何在Kaggle排行榜上取得出色成绩的提示,包含经纬度数据的处理。
在很长的一段时间里,咱们表现出缺少创造力,所作出的工做被认为是山寨、借鉴,这一点是不能否认,但随着自身的积累,厚积薄发,完成了从借鉴到创造的突破。创造力是咱们工做的基本要素之一,这点在各行各业都显得很重要,在机器学习领域也无所例外。git
建立特征也须要创造力,所以本文在这里列出了我平常生活中的一些想法,但愿对其它人有些启发,以致于可以在此基础上利用创造力在Kaggle排行榜上取得很好的成绩。算法
这篇文章的灵感来自于 Beluga在Kaggle上分享的文章,本文部份内容是直接摘自该文章中,所以,读者也能够看看这篇文章。如下是分享的正文:网络
若是训练/测试都来自同一时间线,那么就能够很是巧妙地使用特性。虽然这只是一个kaggle的案例,但能够利用这个优点。例如:在出租车出行持续时间挑战赛中,从训练数据中随机抽取测试数据。在这种状况下,可使用不一样类别变量的平均目标变量做为特征。在这种状况下, Beluga 实际上使用了不一样工做日的平均目标变量。而后,将相同的平均值映射为一个变量,并将其映射到测试数据中。dom
这部份内容是在Jeremy Howard的神经网络课程中学到的内容,它基于一个很是简单的想法。若是咱们很是自信和不公正的,Logloss会受到不少惩罚。所以,在必须预测几率的分类问题状况下,将几率剪切在0.05-0.95之间会好得多,这样就对本身的预测变得不是十分肯定。机器学习
下面一小段代码能够帮助咱们节省无数的上传时间:函数
df.to_csv('submission.csv.gz', index=False, compression='gzip')
在Beluga写的文章中,我最喜欢的一部份内容之一就是他如何使用经纬度(Lat / Lon)数据,这里建立了如下特征:学习
A.两个经纬度之间的Haversine距离:测试
def haversine_array(lat1, lng1, lat2, lng2): lat1, lng1, lat2, lng2 = map(np.radians, (lat1, lng1, lat2, lng2)) AVG_EARTH_RADIUS = 6371 # in km lat = lat2 - lat1 lng = lng2 - lng1 d = np.sin(lat * 0.5) ** 2 + np.cos(lat1) * np.cos(lat2) * np.sin(lng * 0.5) ** 2 h = 2 * AVG_EARTH_RADIUS * np.arcsin(np.sqrt(d)) return h
B.两个经纬度之间的曼哈顿距离:ui
def dummy_manhattan_distance(lat1, lng1, lat2, lng2): a = haversine_array(lat1, lng1, lat1, lng2) b = haversine_array(lat1, lng1, lat2, lng1) return a + b
C.两个经纬度之间的方位:编码
def bearing_array(lat1, lng1, lat2, lng2): AVG_EARTH_RADIUS = 6371 # in km lng_delta_rad = np.radians(lng2 - lng1) lat1, lng1, lat2, lng2 = map(np.radians, (lat1, lng1, lat2, lng2)) y = np.sin(lng_delta_rad) * np.cos(lat2) x = np.cos(lat1) * np.sin(lat2) - np.sin(lat1) * np.cos(lat2) * np.cos(lng_delta_rad) return np.degrees(np.arctan2(y, x))
D.取放点之间的中心纬度和经度:
train.loc[:, 'center_latitude'] = (train['pickup_latitude'].values + train['dropoff_latitude'].values) / 2 train.loc[:, 'center_longitude'] = (train['pickup_longitude'].values + train['dropoff_longitude'].values) / 2
在Beluga写的文章中,他使用经纬度数据的第二种方式是为取放点的经纬度建立集群,它的工做方式是经过设计在数据中建立了一些行政区。
from sklearn.cluster import MiniBatchKMeans coords = np.vstack((train[['pickup_latitude', 'pickup_longitude']].values, train[['dropoff_latitude', 'dropoff_longitude']].values, test[['pickup_latitude', 'pickup_longitude']].values, test[['dropoff_latitude', 'dropoff_longitude']].values)) sample_ind = np.random.permutation(len(coords))[:500000] kmeans = MiniBatchKMeans(n_clusters=100, batch_size=10000).fit(coords[sample_ind]) train.loc[:, 'pickup_cluster'] = kmeans.predict(train[['pickup_latitude', 'pickup_longitude']]) train.loc[:, 'dropoff_cluster'] = kmeans.predict(train[['dropoff_latitude', 'dropoff_longitude']]) test.loc[:, 'pickup_cluster'] = kmeans.predict(test[['pickup_latitude', 'pickup_longitude']]) test.loc[:, 'dropoff_cluster'] = kmeans.predict(test[['dropoff_latitude', 'dropoff_longitude']])
而后,他使用这些集群建立了一些特征,例如好比计算某一天外出和入境的次数。
在Beluga写的文章中,还使用了PCA方法来转换经度和纬度坐标。在这种状况下,它不是进行降维,而是进行了坐标的变换,2D—>2D变换,它实际上作了以下操做。
pca = PCA().fit(coords) train['pickup_pca0'] = pca.transform(train[['pickup_latitude', 'pickup_longitude']])[:, 0] train['pickup_pca1'] = pca.transform(train[['pickup_latitude', 'pickup_longitude']])[:, 1] train['dropoff_pca0'] = pca.transform(train[['dropoff_latitude', 'dropoff_longitude']])[:, 0] train['dropoff_pca1'] = pca.transform(train[['dropoff_latitude', 'dropoff_longitude']])[:, 1] test['pickup_pca0'] = pca.transform(test[['pickup_latitude', 'pickup_longitude']])[:, 0] test['pickup_pca1'] = pca.transform(test[['pickup_latitude', 'pickup_longitude']])[:, 1] test['dropoff_pca0'] = pca.transform(test[['dropoff_latitude', 'dropoff_longitude']])[:, 0] test['dropoff_pca1'] = pca.transform(test[['dropoff_latitude', 'dropoff_longitude']])[:, 1]
此外,还能够考虑建立一个像“时尚”这样的特征,能够经过添加属于男装时尚、女装时尚、青少年时尚类别的项目来建立这个变量。
另外,也能够建立一个像“稀有”这样的特征,它是根据咱们拥有的数据标记一些稀有物品而后计算购物车中稀有物品的数量而建立的,这些特征多是有效的或无效的。根据个人观察,它们一般可以提供不少价值。
这些特征很是不直观,不该在机器学习模型须要解释的地方建立。
例如:
假设有6个特征A、B、C、D、E、F:
而且数据行是:
A:一、B:一、C:一、D:0、E:一、F:0
可能决定使用散列函数,以便这6个特征对应于3个桶并建立使用此特征的数据哈希矢量。
处理完后,数据可能以下所示:
Bucket1:二、Bucket2:二、Bucket3:0
A:一、B:一、C:一、D:0、E:一、F:0 之因此发生这种状况是由于A和B掉落在桶1中、C和E落在桶2中、D和F落在桶3中。这里只是总结了上述的观察结果,你也能够用你想要的任何数学函数替换掉上述的加法操做。
以后,将使用Bucket一、Bucket二、Bucket3做为机器学习的变量。
A:一、B:一、C:一、D:0、E:一、F:0 以上是本文的所有内容,后续将持续更新,若是读者有比较好的处理方法,请在下面留言给出。
本文为云栖社区原创内容,未经容许不得转载。