一份關於kaggle特徵構建技巧和心得

摘要: 本文是一份關於如何在Kaggle排行榜上取得出色成績的提示,包含經緯度數據的處理。

在很長的一段時間裏,咱們表現出缺少創造力,所作出的工做被認爲是山寨、借鑑,這一點是不能否認,但隨着自身的積累,厚積薄發,完成了從借鑑到創造的突破。創造力是咱們工做的基本要素之一,這點在各行各業都顯得很重要,在機器學習領域也無所例外。git

建立特徵也須要創造力,所以本文在這裏列出了我平常生活中的一些想法,但願對其它人有些啓發,以致於可以在此基礎上利用創造力在Kaggle排行榜上取得很好的成績。算法

這篇文章的靈感來自於 Beluga在Kaggle上分享的文章,本文部份內容是直接摘自該文章中,所以,讀者也能夠看看這篇文章。如下是分享的正文:網絡

1.當不須要時,不要嘗試預測將來:

若是訓練/測試都來自同一時間線,那麼就能夠很是巧妙地使用特性。雖然這只是一個kaggle的案例,但能夠利用這個優點。例如:在出租車出行持續時間挑戰賽中,從訓練數據中隨機抽取測試數據。在這種狀況下,可使用不一樣類別變量的平均目標變量做爲特徵。在這種狀況下, Beluga 實際上使用了不一樣工做日的平均目標變量。而後,將相同的平均值映射爲一個變量,並將其映射到測試數據中。dom

2. logloss裁剪技術:

這部份內容是在Jeremy Howard的神經網絡課程中學到的內容,它基於一個很是簡單的想法。若是咱們很是自信和不公正的,Logloss會受到不少懲罰。所以,在必須預測機率的分類問題狀況下,將機率剪切在0.05-0.95之間會好得多,這樣就對本身的預測變得不是十分肯定。機器學習

3.以gzip格式提交到kaggle:

 下面一小段代碼能夠幫助咱們節省無數的上傳時間:函數

df.to_csv('submission.csv.gz', index=False, compression='gzip')

4.如何最好地使用緯度和經度特徵——第1部分:

在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

5.如何最好地使用經緯度特徵——第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']])

而後,他使用這些集羣建立了一些特徵,例如好比計算某一天外出和入境的次數。

6.如何最好地使用緯度和經度特徵——第3部分

在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]

7.不要忘記能夠用特徵作的正常事情:

  • 按Max-Min縮放;
  • 使用標準誤差進行標準化;
  • 基於特徵/目標的日誌:使用基於特徵或基於目標特徵的日誌;
  • 熱編碼;

8.建立直觀的附加特徵:

  • A)日期時間特徵:基於時間的特徵,如「晚上」、「中午」、「夜晚」、「上月購買行爲」,「上週購買行爲」等;
  • B)思想特徵:假設有購物車數據,而且想要對行程進行分類(參閱Walmart Recruiting:Kaggle的行程類型分類);

此外,還能夠考慮建立一個像「時尚」這樣的特徵,能夠經過添加屬於男裝時尚、女裝時尚、青少年時尚類別的項目來建立這個變量。
       另外,也能夠建立一個像「稀有」這樣的特徵,它是根據咱們擁有的數據標記一些稀有物品而後計算購物車中稀有物品的數量而建立的,這些特徵多是有效的或無效的。根據個人觀察,它們一般可以提供不少價值。

9.作的不那麼正常的事情:

這些特徵很是不直觀,不該在機器學習模型須要解釋的地方建立。

  • A)交互特徵:若是有特徵A和B,並建立特徵A * B、A + B、A / B、AB,這會使得特徵空間爆炸。若是你有10個特徵,而且要建立兩個可變交互特徵,這將爲模型添加 180個特徵。而且,絕大多數時候,都會有超過10個的特徵。
  • B)使用散列的存儲桶特徵:假設你有數千的特徵,並按順序排好,但考慮到算法的訓練時間,並不想使用全部的數千千個特徵。通常是使用一些哈希算法來實現這一點,最後完成文本分類任務。

例如:
       假設有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 以上是本文的所有內容,後續將持續更新,若是讀者有比較好的處理方法,請在下面留言給出。



本文做者:【方向】

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索