標籤:es2017 優劣 back tle 隨機森林 nan gpo 定義 sci
資料預先處理——構建好的訓練資料集
機器學習演算法最終學習結果的優劣取決於兩個主要因素:資料的品質和資料中蘊含的有用資訊的數量。
缺失資料的處理
在實際應用過程中,樣本由於各種原因缺少一個或多個值得情況並不少見。其原因主要有:資料擷取過程中出現了錯誤,常用得度量方法不適用於某些特徵,或者在調查過程中某些資料未被填寫等等。通常我們見到得缺失值是資料表中得空值,或者是類似於NaN的預留位置。
如果我們忽略這些缺失值,將導致大部分的計算工具無法對未經處理資料進行處理,或者得到某些不可預知的結果。因此,在做更深入的分析之前,必須對這些缺失值進行處理。
將存在缺失值的特徵或樣本刪除
處理缺失資料最簡單的方法就是:將包含確定資料的特徵(列)或者樣本(行)從資料集中刪除。可通過dropna方法來刪除資料集中包含缺失值的行(這裡dropna()函數是存在於dataframe資料結構中)
類似地,我們可以將axis參數設為1,以刪除資料集中至少包含一個NaN值的列
dropna方法還支援其他參數,以應對各種缺失值的情況:
#only drop rows where all columns are NaN
df,dropna(how=’all’)
#drop rows that have not at least 4 non-NaN values
df.dropna(thresh=4)
#only drop rows where NaN appear in specific columns (here:’C’)
df.dropna(subset=[‘C’])
刪除缺失資料看起來像是一種非常方便的方法,但也有一定的確定,如:我們可能會刪除過多的樣本,導致分析結果的可靠性不高。另一方面,如果刪除了過多的特徵列,有可能會面臨丟失有價值資訊的風險,而這些資訊是分類器用來區分類別所必須的。
缺失資料填充
通常情況下,刪除樣本或者刪除資料集中的震哥哥特徵列是不可行的,因為這樣可能會丟失過多有價值的資料。在此情況下,我們可以使用不同的插值技術,通過資料集中其他訓練樣本的資料來估計缺失值。最常用的插值技術之一就是均值插補,即使用相應的特徵均值來替換缺失值。我們可使用scikit-learn中的Impute類方便地實現此方法
imr=Imputer(missing_value=’NaN’,strategy=’mean’,axis=0)
如果把參數axis=0改成axis=1,則用每行地均值來進行相應的替換。參數strategy的可選項還有median或者most_frequent,後者代表使用對應行或列中出現頻次最高的值來替換缺失值,常用於填充類別特徵值。
處理類別資料
到目前為止,我們僅學習了處理數值型資料的方法,然而,在真實資料集中,經常會出現一個或多個類別資料的特徵列。我們在討論類別資料時,又可以進一步將他們劃分為標稱特徵和有序特徵。可以將有序特徵理解為類別的值是有序的或者是可以排序的。相反,標稱資料則不具備排序的特性。
有序特徵的映射
為了確保學習演算法可以正確地使用有序特徵,我們需要將類別字串轉換為整數。但是,沒有一個適當的方法可以自動將尺寸特徵轉換為正確的順序。由此,需要我們手工定義相應的映射。
size_mapping={‘XL’:3,’L’:2,’M’:1}
df[‘size’]=df[‘size’].map(size_mapping)#構建了映射
類標的編碼
許多機器學習庫要求類標以整數值的方式進行編碼。雖然scikit-learn中大多數分類預估器都會在內部將類標轉換為整數,但通過將類標轉換為整數序列能夠從技術角度避免某些問題的產生,在實踐中這被認為是一個很好的做法。為了對類標進行編碼,可以採用與前面討論的有序特徵映射相類似的方式。要清楚一點,類標並不是有序的,而且對於特定的字串類標,賦予哪個整數值給它對我們來說並不重要。因此,我們可以簡單地以枚舉的方式從0開始設定類標。
標稱特徵上的one-hot編碼
我們曾使用字典映射的方法將有序的尺寸特徵轉換為整數。由於scikit-learn的預估器將類標作為無序資料進行處理,可以使用scikit-learn中的LabelEncoder類將字串類標轉換為整數。同樣,也可以用此方法處理資料集中標稱資料格式的color列.
one-hot技術即建立一個新的虛擬特徵,虛擬特徵的每一類各代表標稱資料的一個值。例如顏色用r,g,b三色標識。
當我們初始化onehotEncoder對象時,需要通過categorical_features參數來選定我們要轉換的特徵所在的位置。預設情況下,當我們調用onehotEncoder的transform方法時,它會返回一個疏鬆陣列。出於可視化的考慮,我們可以通過toarray方法將其轉換為一個常規的Numpy數組。疏鬆陣列是儲存大型資料集中的一個有效方法,被許多scikit-learn函數所支援,特別是在資料包含很多零值時非常有用。為了略過toarry的使用步驟,我們也可以通過在初始化階段使用onehotEncoder(…,sparse=False)來返回一個常規的Numpy數組。
另外,我們可以通過pandas中的get_dummies方法,更加方便地實現onehot編碼技術中的虛擬特徵。當應用於DataFrame資料時,get_dummies方法只對字串列進行轉換,而其它的列保持不變
將資料集劃分為訓練資料集和測試資料集
交叉驗證(cross validation)
from sklearn.cross_validation import train_test_split
將特徵的值縮放到相同的區間
特徵縮放是資料預先處理過程中至關重要的一步,但卻極易被人們忽略。
決策樹和隨機森林是機器學習演算法中為數不多的不需要進行特徵縮放的演算法,然而,對大多數機器學習和最佳化演算法而言,將特徵的值縮放到相同的區間可以使其效能更佳。
目前,將不同的特徵縮放到相同區間有兩個常用的方法:歸一化和標準化
歸一化:
from sklearn.preprocessing import MinMaxScaler
標準化:
from sklearn.preprocessing import StandardScaler
選擇有意義的特徵
如果一個模型在訓練資料集上的表現比在測試資料集上好很多,這意味著模型過擬合於訓練資料。
而常用的降低泛化誤差的方案有:
(1)收集更多的訓練資料
(2)通過正則化引入罰項
(3)選擇一個參數相對較少的簡單模型
(4)降低資料的維度
序列特徵選取演算法
另外一種降低模型複雜度從而解決過擬合問題的方法是通過特徵選取進行降維,該方法對未經正則化處理的模型特別有效。
降維技術主要分為兩個大類:特徵選取和特徵提取。通過特徵選取,我們可以選出原始特徵的一個子集。而在特徵提取中,通過對現有的特徵資訊進行推演,構造出一個新的特徵子空間。在本節,我們將著眼於一些經典的特徵選取演算法。
序列特徵選取演算法系一種貪婪搜尋法,用於將原始的d維特徵空間壓縮到一個k維特徵子空間,k<d。使用特徵選取演算法處於以下考慮:能夠剔除不相關特徵或雜訊,自動選出與問題最相關的特徵子集,從而提高計算效率或是降低模型的泛化誤差。這在模型不支援正則化時尤為有效。一個經典的序列特徵選取演算法是序列後向選擇演算法(SBS),其目的是在分類效能衰減最小的約束下,降低原始特徵空間上的資料維度,以提高計算效率。在某些情況下,SBS甚至可以在模型面臨過擬合問題時提高模型的預測能力。
《Python 機器學習》筆記(四)