特徵工程&&清洗數據

特徵工程


將原始數據映射到特徵


咱們在進行機器學習的時候,採用的數據樣本每每是矢量(特徵矢量),而咱們的原始數據並非以矢量的形式呈現給咱們的,這是便須要將數據映射到特徵html

整數和浮點數映射

直接映射便ok(雖然機器學習是根據浮點值進行的訓練,可是不須要將整數6轉換爲6.0,這個過程是默認的)服務器

字符串映射

好多時候,有的特徵是字符串,好比此前訓練的加利福尼亞房產數據集中的街區名稱,機器學習是沒法根據字符串來學習規律的,因此須要轉換。可是存在一個問題,若是字符特徵是''一環'' ''二環'' ''三環''...(表明某個城市的地理位置),那麼對其進行數值轉換的時候,是不能夠編碼爲形如1,2,3,4...這樣的數據的,由於其存在數據大小的問題,學習模型會把他們的大小關係做爲特徵而學習,因此咱們須要引入獨熱編碼,(具體解釋見連接,解釋的很好)機器學習

尋找良好特徵(的特色)


當獲得特徵以後,仍是要進行篩選的,由於有的特徵沒有參考價值,就像咱們的在作合成特徵的時候,正常的特徵數據是人均幾間房間,而有的人是幾十間,這明顯沒有參考價值
良好特徵的幾點原則學習

  • 避免不多使用的離散特徵值:若是隻是出現了一兩次的特徵幾乎是沒有意義的
  • 最好具備清晰明確的含義:特徵的含義不只僅是讓機器學習的模型學習的,人也要知道其具體的含義,否則不利於分析數據(最好將數值很大的秒轉換爲天數,或者年,讓人看起來直觀一些)
  • 將「神奇」的值與實際數據混爲一談:有些特徵中會出現一些"神奇的數據",固然這些數據並非不多的特徵,而是超出範圍的異常值,好比特徵應該是介於0——1之間的,可是由於這個數據是空缺的,而採用的默認數值-1,那麼這樣的數值就是"神奇",解決辦法是,將該特徵轉換爲兩個特徵:測試

    • 一個特徵只存儲質正常範圍的值,不含神奇值。
    • 一個特徵存儲布爾值,表示的信息爲是否爲空
  • 考慮上游不穩定性:由經驗可知,特徵的定義不該隨時間發生變化,表明城市名稱的話,那麼特徵值始終都該是城市的名稱,可是有的時候,上游模型將特徵值處理完畢後,返還給下游模型的卻變成了數值,這樣是很差的,由於這種表示在將來運行其餘模型時可能輕易發生變化,那麼特徵就亂套了

清理數據(整理數據)


清理數據,顧名思義,就是將數據清理(整理一下).....好像是廢話。
在上一步後,咱們如今獲得的數據已經所有是數值化的特徵了,(這裏確定有可是的),可是,這樣的數據直接拿過來訓練效果仍是會很糟糕,由於其中存在許許多多的壞數據,就是一些值不是那麼正常的數據,像以前說的那種數值特別大的就屬於這一種,固然除了數值異常的還有許許多多種的壞數據,下面就來看一看有哪些方法對付這些妖豔賤貨編碼

縮放特徵值

縮放是指將浮點特徵值從天然範圍(例如 100 到 900)轉換爲標準範圍(例如 0 到 1 或 -1 到 +1)。若是某個特徵集只包含一個特徵,則縮放能夠提供的實際好處微乎其微或根本沒有。不過,若是特徵集包含多個特徵,則縮放特徵能夠帶來如下優點:spa

  • 幫助梯度降低法更快速地收斂(各個特徵數值小,這樣算的跨的步子大呀)。
  • 幫助避免「NaN 陷阱」。當某個值在訓練期間超出浮點精確率限制時,數值會變成NaN,而且模型中的全部其餘數值最終也會因數學運算而變成 NaN。( NaN)
_NaN_,是Not a Number的縮寫,在IEEE浮點數算術標準(IEEE 754)中定義,表示一些特殊數值(無窮與非數值(_NaN_)),爲許多CPU與浮點運算器所採用。
  • 幫助模型爲每一個特徵肯定合適的權重。若是沒有進行特徵縮放,則模型會對範圍較大的特徵投入過多精力。(由於若是其餘的特徵範圍過大,模型在訓練的時候會認爲此種模型的權值大,進而影響模型的判斷)

由上可知,咱們並不須要對每一個浮點特徵進行徹底相同的縮放。即便特徵 A 的範圍是 -1 到 +1,同時特徵 B 的範圍是 -3 到 +3,也不會產生什麼惡劣的影響。不過,若是特徵 B 的範圍是 5000 到 100000,您的模型會出現糟糕的響應。code

要縮放數字數據,一種顯而易見的方法是將 [最小值,最大值] 以線性方式映射到較小的範圍,例如 [-1,+1]。
另外一種熱門的縮放策略是計算每一個值的 Z 得分。Z 得分與距離均值的標準誤差數相關。換而言之:
scaledvalue=(value−mean)/stddev.
例如,給定如下條件:
*   均值 = 100
*   標準誤差 = 20
*   原始值 = 130
則:
  scaled_value = (130 - 100) / 20
  scaled_value = 1.5
使用 Z 得分進行縮放意味着,大多數縮放後的值將介於 -3 和 +3 之間,而少許值將略高於或低於該範圍。

處理極端離羣值

仍是舉加利福尼亞州住房數據集中的人均住房數的例子,有的極端值達到了50
對於這些極端值其實很好處理,無非幾個辦法htm

  • 對數縮放
  • 特徵值限制到 某個上限或者下限

分箱

分箱實際上是一個形象化的說法,就是把數據分開來,裝在一個個箱子裏,這樣一個箱子裏的數據就是一家人了。
那有什麼用呢?下面就舉個栗子!blog

緯度_房價.png

在數據集中,latitude 是一個浮點值(由於是按照一片區域統計的,因此緯度肯的增加確定是線性的了)。不過,在咱們的模型中將 latitude 表示爲浮點特徵(將其看爲一個浮點數,以它的數值大小爲特徵)沒有意義。這是由於緯度和房屋價值之間不存在線性關係(並非那種緯度高房價就高)。例如,緯度 35 處的房屋並不比緯度 34 處的房屋貴 35/34(或更便宜)。可是,緯度或許能很好地預測房屋價值(在訓練以前,咱們也不知道能不能呢,可是從以前的散點圖能夠看出來,房價和位置的分佈好像是有關係的,因此咱們把緯度也做爲特徵),由於不是呈線性的關係了,因此把它做爲分類特徵會更好。(若是沒法理解的話,就好好想一想模型會怎麼處理數值數據和分類數據),因此接下來咱們將其分箱處理,以下圖。

緯度_房價_分箱.png

咱們如今擁有 11 個不一樣的布爾值特徵(LatitudeBin1LatitudeBin2、…、LatitudeBin11),而不是一個浮點特徵。擁有 11 個不一樣的特徵有點不方便,所以咱們將它們統一成一個 11 元素矢量。這樣作以後,咱們能夠將緯度 37.4 表示爲:

[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]

分箱以後,咱們的模型如今能夠爲每一個緯度學習徹底不一樣的權重。(是否是以爲有點像獨熱編碼,沒錯,就是的)

爲了簡單起見,咱們在緯度樣本中使用整數做爲分箱邊界。若是咱們須要更精細的解決方案,咱們能夠每隔 1/10 個緯度拆分一次分箱邊界。添加更多箱可以讓模型從緯度 37.4 處學習和維度 37.5 處不同的行爲,但前提是每 1/10 個緯度均有充足的樣本可供學習。

另外一種方法是按分位數分箱,這種方法能夠確保每一個桶內的樣本數量是相等的。按分位數分箱徹底無需擔憂離羣值。

清查

截至目前,咱們假定用於訓練和測試的全部數據都是值得信賴的。在現實生活中,數據集中的不少樣本是不可靠的,緣由有如下一種或多種:

  • 遺漏值。 例如,有人忘記爲某個房屋的年齡輸入值。(值會爲-1,因此要分爲兩個特徵,忘了的看上面)
  • 重複樣本。 例如,服務器錯誤地將同一條記錄上傳了兩次。
  • 不良標籤。 例如,有人錯誤地將一顆橡樹的圖片標記爲楓樹。
  • 不良特徵值。 例如,有人輸入了多餘的位數,或者溫度計被遺落在太陽底下。

一旦檢測到存在這些問題,一般須要將相應樣本從數據集中移除,從而「修正」不良樣本。要檢測遺漏值或重複樣本,能夠編寫一個簡單的程序。檢測不良特徵值或標籤可能會比較棘手。

除了檢測各個不良樣本以外,還必須檢測集合中的不良數據。直方圖是一種用於可視化集合中數據的很好機制。此外,收集以下統計信息也會有所幫助:

  • 最大值和最小值
  • 均值和中間值
  • 標準誤差

考慮生成離散特徵的最多見值列表,靠常識來判斷是否合理,是否適合本身觀察數據

瞭解數據

遵循如下規則:

  • 記住您預期的數據狀態。
  • 確認數據是否知足這些預期(或者您能夠解釋爲什麼數據不知足預期)。
  • 仔細檢查訓練數據是否與其餘來源(例如信息中心)的數據一致。

像處理任何任務關鍵型代碼同樣謹慎處理您的數據。良好的機器學習依賴於良好的數據。

相關文章
相關標籤/搜索