咱們在進行機器學習的時候,採用的數據樣本每每是矢量(特徵矢量),而咱們的原始數據並非以矢量的形式呈現給咱們的,這是便須要將數據映射到特徵html
直接映射便ok(雖然機器學習是根據浮點值進行的訓練,可是不須要將整數6轉換爲6.0,這個過程是默認的)服務器
好多時候,有的特徵是字符串,好比此前訓練的加利福尼亞房產數據集中的街區名稱,機器學習是沒法根據字符串來學習規律的,因此須要轉換。可是存在一個問題,若是字符特徵是''一環'' ''二環'' ''三環''...(表明某個城市的地理位置),那麼對其進行數值轉換的時候,是不能夠編碼爲形如1,2,3,4...這樣的數據的,由於其存在數據大小的問題,學習模型會把他們的大小關係做爲特徵而學習,因此咱們須要引入獨熱編碼,(具體解釋見連接,解釋的很好)機器學習
當獲得特徵以後,仍是要進行篩選的,由於有的特徵沒有參考價值,就像咱們的在作合成特徵的時候,正常的特徵數據是人均幾間房間,而有的人是幾十間,這明顯沒有參考價值
良好特徵的幾點原則學習
將「神奇」的值與實際數據混爲一談:有些特徵中會出現一些"神奇的數據",固然這些數據並非不多的特徵,而是超出範圍的異常值,好比特徵應該是介於0——1之間的,可是由於這個數據是空缺的,而採用的默認數值-1,那麼這樣的數值就是"神奇",解決辦法是,將該特徵轉換爲兩個特徵:測試
清理數據,顧名思義,就是將數據清理(整理一下).....好像是廢話。
在上一步後,咱們如今獲得的數據已經所有是數值化的特徵了,(這裏確定有可是的),可是,這樣的數據直接拿過來訓練效果仍是會很糟糕,由於其中存在許許多多的壞數據,就是一些值不是那麼正常的數據,像以前說的那種數值特別大的就屬於這一種,固然除了數值異常的還有許許多多種的壞數據,下面就來看一看有哪些方法對付這些妖豔賤貨編碼
縮放是指將浮點特徵值從天然範圍(例如 100 到 900)轉換爲標準範圍(例如 0 到 1 或 -1 到 +1)。若是某個特徵集只包含一個特徵,則縮放能夠提供的實際好處微乎其微或根本沒有。不過,若是特徵集包含多個特徵,則縮放特徵能夠帶來如下優點:spa
_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
在數據集中,latitude
是一個浮點值(由於是按照一片區域統計的,因此緯度肯的增加確定是線性的了)。不過,在咱們的模型中將 latitude
表示爲浮點特徵(將其看爲一個浮點數,以它的數值大小爲特徵)沒有意義。這是由於緯度和房屋價值之間不存在線性關係(並非那種緯度高房價就高)。例如,緯度 35 處的房屋並不比緯度 34 處的房屋貴 35/34(或更便宜)。可是,緯度或許能很好地預測房屋價值(在訓練以前,咱們也不知道能不能呢,可是從以前的散點圖能夠看出來,房價和位置的分佈好像是有關係的,因此咱們把緯度也做爲特徵),由於不是呈線性的關係了,因此把它做爲分類特徵會更好。(若是沒法理解的話,就好好想一想模型會怎麼處理數值數據和分類數據),因此接下來咱們將其分箱處理,以下圖。
咱們如今擁有 11 個不一樣的布爾值特徵(LatitudeBin1
、LatitudeBin2
、…、LatitudeBin11
),而不是一個浮點特徵。擁有 11 個不一樣的特徵有點不方便,所以咱們將它們統一成一個 11 元素矢量。這樣作以後,咱們能夠將緯度 37.4 表示爲:
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
分箱以後,咱們的模型如今能夠爲每一個緯度學習徹底不一樣的權重。(是否是以爲有點像獨熱編碼,沒錯,就是的)
爲了簡單起見,咱們在緯度樣本中使用整數做爲分箱邊界。若是咱們須要更精細的解決方案,咱們能夠每隔 1/10 個緯度拆分一次分箱邊界。添加更多箱可以讓模型從緯度 37.4 處學習和維度 37.5 處不同的行爲,但前提是每 1/10 個緯度均有充足的樣本可供學習。另外一種方法是按分位數分箱,這種方法能夠確保每一個桶內的樣本數量是相等的。按分位數分箱徹底無需擔憂離羣值。
截至目前,咱們假定用於訓練和測試的全部數據都是值得信賴的。在現實生活中,數據集中的不少樣本是不可靠的,緣由有如下一種或多種:
一旦檢測到存在這些問題,一般須要將相應樣本從數據集中移除,從而「修正」不良樣本。要檢測遺漏值或重複樣本,能夠編寫一個簡單的程序。檢測不良特徵值或標籤可能會比較棘手。
除了檢測各個不良樣本以外,還必須檢測集合中的不良數據。直方圖是一種用於可視化集合中數據的很好機制。此外,收集以下統計信息也會有所幫助:
考慮生成離散特徵的最多見值列表,靠常識來判斷是否合理,是否適合本身觀察數據
遵循如下規則:
像處理任何任務關鍵型代碼同樣謹慎處理您的數據。良好的機器學習依賴於良好的數據。