特征
Features
前言叨B叨
都到第五章了, 可能有些同學開始覺得有些煩躁了, 怎么還不上真二八經的代碼? 事實上理解這些基本概念才是關鍵. 代碼真沒幾句話, 因為最復雜的部分已經由先人封裝好了, 我們只需要敲一兩句話, 再配幾個參數就妥妥的了.
今天主要講數據中特征值的處理, 上一章提到過, 特征值的處理對最后預測結果的準確性有著決定性的關系. 所以這張大家務必仔細理解.
1. 特征工程(Feature engineering)
當使用監督學習解決問題時,我們將特征輸入到機器學習算法中,該算法學習如何根據這些特征預測正確的輸出。這是一個簡單的想法,但是在實際的應用程序中,它需要大量的嘗試和錯誤處理來找出哪些特性對建模最有用。特征工程是利用我們對問題的認識和分析來選擇特征或創建新的特性,以此使機器學習算法更精確地工作。當您構建有監督的學習系統時,特性工程將消耗您的大部分時間。做好特征工程會大大改善模型的質量。
在訓練機器學習算法時,為了獲得最好的結果,我們要使算法盡可能簡單地建模。這意味著我們希望輸入的特征與輸出值緊密相關。事實上,無用的特征可能會損害我們系統的準確性。讓我們看一個例子。這里有張表格列出每個房子的大小,以及這些房子里盆栽植物的數量。房子的面積很可能有助于確定房子的價值。我們知道,基于我們對房地產市場的了解。因此,這將是一個很好的特征,我們要把它包括在我們的模型中。但是我估計如果不是蘭花或是搖錢樹之類的盆栽植物,數量多少也不會影響房子的最終價值。
盆栽植物只是裝飾,它們便宜,而且很容易添加和去除。很少有人會根據房子里盆栽植物的數量來決定是否購買。在這種情況下,這個特征似乎會在模型中引入隨機噪聲,而不是告訴我們關于我們試圖預測的實際值的任何東西,我們應該從我們的模型中刪除這個特性。這就是特征工程的一個例子。
接下來讓我們來看一些特征工程的不同策略。
到目前為止,我們已經討論了從模型中添加和刪除特性以提高精度的方法。
- 從我們的模型中包含或排除哪些特性是特征工程最簡單的形式。
- 我們還可以將多個特性組合成一個特性。
顯示每個房子的英尺和英寸的高度。高度可能是衡量房子價值的一個非常有用的度量標準,但是用不同單位去描述同一個特征會使模型更復雜。如果嗎這兩個值同時輸入模型,那么該算法必須計算出這兩組數字是相關的,是單個測量的一部分。如果我們預先處理我們的數據,只用一個單位的單個測量代替每一個高度測量就更好了。
工程策略的另一個特點是分級。分級是你做數值的測量和轉換成一個類。讓我們看一個例子。這里有一張表,我們的最后一個特征工程策略是one-hot編碼方式(one-hot encoding)。
在我們的住房數據集中,一個分類數據的例子是社區的名字。我們不能直接將社區的名字輸入到我們的模型中,因為它是一串文本而不是數字。相反,我們需要一種方法來將每個社區表示為一個數字。最簡單的解決方案是給每個社區分配一個數字。但這并不適用于某些機器學習算法。
問題在于機器學習算法會認為這些數字的順序是有意義的。它會假設大一些的數字比小一些的數字更重要。但是社區ID 2并不是社區ID 1的兩倍。這些數字的順序實際上毫無意義。這里的解決方案是使用一個不同的表示,稱為one-hot 編碼方式。
然后,我們將每一個設置為1或0,這取決于房子是否在那個社區。這被稱為one-hot 編碼。one-hot 編碼對用機器學習模型容易理解的簡單數值數據代替分類數據很有用。
2. 為房價預測選擇最合適的特征
讓我們看看這個房價預測項目的中的數據集,然后將我們所學到的關于特征工程的知識用起來。
讓我們打開view_data.py。運行起來后讓我們查看一下數據集中的每個特征,看看它是否需要修理修理,或者我們是否可以直接使用它。
首先看建造年份(year_built)。這項特征將告訴算法的每個房子的年齡,這似乎是一個重要的因素。這個特性是數字的,所以我們可以不用任何處理。接下來的幾個特點也是數字,包括房子的儲藏室數量,臥室的數目,全浴室的數目,半浴室,以及實用面積和總面積。
所以我們可以跳過它們。接下來我們有車庫類型(garage_type)。看起來有三種可能的車庫類型值: 沒有車庫, 獨立車庫, 非獨立車庫。車庫類型貌似有助于我們的房價模型,但要使用這些數據,我們需要預先用one-hot編碼方法處理它一下。
也就是說將單個特性更改為三個獨立的特性。沒有車庫,有獨立的車庫,還有附屬車庫。對于每一個房子,只有其中一個將被設置為true。接下來的兩個特點,車庫和車庫的尺寸大小和平方英尺平方英尺,我們應該能直接使用,無需任何額外的處理。好吧,讓我們滾動。接下來,我們有幾個true/false字段,有壁爐,有游泳池,有集中供暖,還有中央空調。true/false值在我們的模型中很好用。它們將被自動處理為1或0,所以不需要額外的處理工作。
接下來我們把每個房子的地址分成五個不同的字段。有門牌號碼,街道名稱,單元編號,郵政編碼。在我們的模型中門牌號不會有任何用處。不太可能有人買房子是因為門牌號。更高的街道數并不意味著房子更有價值,它只是一個隨機數。所以讓我們從我們的模型中刪除這個字段。單元數也一樣。房子的位置對價值有很大的影響,所以我們需要在我們的模型要包含一些信息。
但是,有些字段提供重復的信息,說的是同一個意思。例如,如果我們知道一個房子的郵政編碼,我們已經知道它在哪個城市,所以我們可能不需要在我們的模型中同時包含城市和郵政編碼。街道名稱是一個可以拿掉的特征。一條街道就是一個很小的區域,有時在某一條街上可能會增加房屋的價值,但在我們的模型中包括街道名稱會使我們的模型復雜得多,因為在我們應用一個one-hot編碼之后,我們將為數據集中的每一條街道提供一個新的特性。因此,讓我們先把這個城市留在我們的模型中,然后對它應用one-hot編碼。
現在我們不包含任何其他地址字段。這就是為什么特性工程是需要大量的嘗試和排錯。如果我們在模型中只包含城市名稱,并不能得到好的結果,我們可能想再次使用街道名或其他地址字段再試一次。除非我們兩種方法都試過,否則無法提前知道哪種方法會更好.
最后一點是房子的售價。這就是我們試圖用我們的模型預測的y值或目標值。現在我們已經單獨研究了每個字段,對于在模型中哪些特征需要修剪我們現在有了個基本概念。這將使我們的代碼更容易編寫。
3. 特征值用得越少越好:維度災難(curse of dimensionality)
在構建機器學習模型時,盡可能地包含模型中的許多特征似乎是個好主意。數據越多越好,對嗎?事實證明,然鵝并不總是這樣。當我們在數據集中討論更多數據時,我們可以指兩種不同的東西。首先,我們可以討論數據集中更多的數據行。對于我們的住房數據集,擁有更多的房屋記錄是件好事。但我們也可以在數據中擁有更多的特性或列。有更多的功能是有幫助的,直到某一個閾值。終撞到了一堵墻--更多的特征反而降低了準確性。
我們仍然有和以前一樣的100個數據點,但是現在我們添加了另一個特征,或者維度,這100個數據點只覆蓋了圖中可能的總面積的一小部分。為了更好地覆蓋這個圖表中所有可能的區域,我們現在需要的數據是我們的一維房價預測的10倍。換句話說,當我們在機器學習系統中添加更多的特性時,我們需要一個指數級的數據行來覆蓋增加的空間。當我們開始獲取成百上千的特征時,數據量和訓練系統所需的時間可能是令人望而卻步的。
因此,在構建機器學習系統時,不能為了增加特征數量而增加特征。你的目標是加入對預測有用的特征,排除對預測無效或者破壞的特征。
結語
本章至此, 后面還有三章. 待我慢慢道來.
如有錯誤請高手指正.
你的 關注-收藏-轉發 是我繼續分享的動力!