摘要: 本文是一份關於如何在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 以上是本文的所有內容,後續將持續更新,若是讀者有比較好的處理方法,請在下面留言給出。
本文爲雲棲社區原創內容,未經容許不得轉載。