1. 程式人生 > >《Python 機器學習》筆記(四)

《Python 機器學習》筆記(四)

構造 split logs pos 不支持 虛擬 訓練樣本 字符 cal

數據預處理——構建好的訓練數據集

機器學習算法最終學習結果的優劣取決於兩個主要因素:數據的質量和數據中蘊含的有用信息的數量。

缺失數據的處理

在實際應用過程中,樣本由於各種原因缺少一個或多個值得情況並不少見。其原因主要有:數據采集過程中出現了錯誤,常用得度量方法不適用於某些特征,或者在調查過程中某些數據未被填寫等等。通常我們見到得缺失值是數據表中得空值,或者是類似於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 機器學習》筆記(四)