iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 12
0

Ref.: Representation

一直想不到最好的翻譯,Google一下找到資料科學協會說的:

機器學習分成三個主要部分:表現 (Representation)、最佳化 (Optimization)、評估 (Evaluation)。
這部分就是在說資料的表現,也正好是另一系列文章在講的,這邊只有一小小部分而已。

Feature engineering

表現什麼呢?主要是因為我們原始資料大部分都需要再經過一些處理,才能變成Feature vector,而它則都是由float-point組成,透過處理weight才能有比較好的表現。Feature engineering就是這轉換過程。

# data ==> vector ['age', 'city', 'gender']
{ age: 12, street_name: 'Charleston Road', gender: 1 } ==> [12.0, 1.0, 2.0]
{ age: 21, street_name: 'North Shoreline Boulevard', gender: 0 } ==> [21.0, 2.0, 1.0]

數值資料 12 轉換成feature vector element很直覺,12 ==> 12.0,但非數值資料呢?假設我們的city包含 ['Charleston Road', 'North Shoreline Boulevard', 'Shorebird Way', 'Rengstorff Avenue'],這邊用全部可能的vocabulary轉換成數值,其他的(不在vocabulary內的,)都設定成另一個數字(OOV (out-of-vocabulary) bucket.),如下面的轉換:

  • Charleston Road --> 0
  • North Shoreline Boulevard --> 1
  • Shorebird Way --> 2
  • Rengstorff Avenue --> 3
  • everything else (OOV) --> 4
    如此一來就有五類,但weight * street_name 有意義嗎?還是需要每個street_name都有一個weight?但是房子如果是在街角,有兩個street_name怎麼辦?

one-hot encoding

假設房子在North Shoreline Boulevard & Rengstorff Avenue街角,就可以用這下面的表示方式:

vector = ['Charleston Road', 'North Shoreline Boulevard', 'Shorebird Way', 'Rengstorff Avenue']
       = [0,               , 1                          , 1              , 0]

OK,這邊有個問題就是稀疏矩陣,有幾千條街,可是只靠在一條街上(大部分的房子都這樣):
[0, 0,....., 1, 0,..., 0, 0]這樣。就可以參考稀疏矩陣表示法

Qualities of Good Features

這邊講了幾個準則:

  1. Avoid rarely used discrete feature values:
    同個Feature value出現五次以上最好,可以看到同個feature value而其他參數不一樣時,對model的影響。可以想像unique_id 只會出現一次,就是個不好的feature.
  2. Prefer clear and obvious meanings:
    一些打錯字的、單位跟一般不一樣的data濾掉,兩百歲正常嗎年齡用毫秒計算正常嗎
  3. Don't mix "magic" values with actual data:
    過濾一些奇怪的設定值,可以多開一個feature代表。金額-1代表未上架?多開一個是否上架is_launched吧。
  4. Account for upstream instability:
    不要用一些不穩定的值,city: 'taipei'很穩定, city: 0每個程式對city 0的定義很難一致。

Cleaning Data

這邊介紹一些清理資料的方法,讓餵進去model的資料比較不會發散、比較有意義。

  1. Scaling feature values:
    能的話盡量把feature value限縮在一定的範圍內(e.g., -1~1, -3~3),一方便可以處理NaN,另一方面也不用處理太大的數值,同時還能很快收斂model。

    Z-score可以把大部分的值mapping到 -3~3 之間

  2. 處理跑出去的outliers:
    可以看到histogram柱狀圖跟取log後的結果,太後面有很多的outliers data。
    https://ithelp.ithome.com.tw/upload/images/20181012/20103835AnzLN4KUJh.jpg
    這時候可以用min(x, 5)來取代,把太多的都歸到5,又不會失去data,又可以讓outlier有家可歸。
    https://ithelp.ithome.com.tw/upload/images/20181012/2010383582fLhwwA8m.jpg
  3. Binning:
    這很好理解,就是把資料區塊化,再看看原始資料在哪一區。
    https://ithelp.ithome.com.tw/upload/images/20181012/20103835VxDgtYXfIE.jpg
  4. Scrubbing:
    過濾一些不可以信任的data,像是: 忘了輸入(omitted value)、重複輸入(duplicate examples)、標錯(bad labels)、打錯(bad feature values)。
    除此之外,多注意一下min/max, mean and median, 還有標準差,都隊要過濾哪些data有幫助。

Know your data

注意你的資料該長怎樣?資料是不是符合預期?不符合預期有沒有合理解釋?train data跟一些統計數據 or dashboard 有沒有一樣?
在Machine learning的過程就是有大部分的時間做出好的資料,否則garbage in garbage out,出來的Model你也不會滿意。

Good ML relies on good data.


上一篇
[Day 11] Validation
下一篇
[Day 13] Feature Crosses特徵組合
系列文
跟著Google學ML19

尚未有邦友留言

立即登入留言