1. 程式人生 > >Sklearn常用特徵提取和處理方法

Sklearn常用特徵提取和處理方法

1、將分類變數轉換為數值編號,才可以被處理

import pandas as pd import numpy as np from sklearn import preprocessing

用LabelEncoder對不同的犯罪型別編號 leCrime = preprocessing.LabelEncoder() crime = leCrime.fit_transform(train.Category)

2、將分類特徵因子化

為什麼要因子化: 對於型別因變數。如果僅僅採用數值編碼,那最大的問題就是在這種處理方式中,各種類別的特徵都被看成是有序的,這顯然是非常不符合實際場景的,所以因子化

方法有兩種:

1) pandas 的 get_dummies()方法 ,

days = pd.get_dummies(train.DayOfWeek) district = pd.get_dummies(train.PdDistrict) dummies_Cabin = pd.get_dummies(data_train[‘Cabin’], prefix= ‘Cabin’)

2) sklearn.preprocessing.OneHotEncoder方法

enc = OneHotEncoder() enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1],[1, 0, 2]]) print “enc.n_values_ is:”,enc.n_values_

print enc.transform([[0, 1, 1]]).toarray()

3)筆記

1、在實際建模前,所有的分類特徵,都需要進行因子化
2、pd.get_dummies()是 pandas庫提供的快捷方式,但不儲存轉換資訊。OneHotEncoder是比較完備的轉換器

3.不需要對特徵進行歸一化的情況

基於樹的方法不需要進行特徵的歸一化。例如隨機森林,bagging與boosting等方法。如果是基於引數的模型或者基於距離的模型,因為需要對引數或者距離進行計算,都需要進行歸一化。

4.PCA之前需要做標準化

collist=features.columns.tolist() scaler = preprocessing.StandardScaler() scaler.fit(features) features[collist]=scaler.transform(features)

new_PCA=PCA(n_components=60) new_PCA.fit(features) print(new_PCA.explained_variance_ratio_)

5、機器學習中的標準化/歸一化

資料的標準化(normalization)是將資料按比例縮放,使之落入一個小的特定區間。

標準化處理的好處:

1 加快梯度下降的求解速度,即提升模型的收斂速度

對於gradient descent演算法來說,learning rate的大小對其收斂速度至關重要。如果feature的scale不同,理論上不同的feature就需要設定不同的learning rate,但是gradient descent只有一個learning rate,這就導致不同feature的收斂效果不同,從而影響總體的收斂效果。所以在求解模型之前歸一化不同feature的scale,可以有效提高gradient descent的收斂速度。 因此在機器學習中使用梯度下降法求最優解時,歸一化也很有必要,否則模型很難收斂甚至有時不能收斂。

2 有可能提高模型的精度

一些分類器需要計算樣本之間的距離,如果一個特徵的值域範圍非常大,那麼距離計算就會主要取決於這個特徵,有時就會偏離實際情況。 如果feature的scale相差很大,則會出現scale越大的feature,對模型的影響越大。 也需要注意的是,各維分別做歸一化會丟失各維方差這一資訊,但各維之間的相關係數可以保留

標準化處理的常用方法:

1、線性標準化(歸一化)(min-max normalization)

這裡寫圖片描述 這種歸一化適合數值比較集中的情況,缺陷就是如果max和min不穩定,很容易使得歸一化結果不穩定,使得後續的效果不穩定,實際使用中可以用經驗常量來代替max和min。

# 使用scikit-learn函式
from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
feature_scaled = min_max_scaler.fit_transform(feature)

# 使用numpy自定義函式
def min_max_norm(x):
    x = np.array(x)
    x_norm = (x-np.min(x))/(np.max(x)-np.min(x))
    return x_norm

標準差標準化(z-score standardization)

這裡寫圖片描述 經過處理的資料符合標準正態分佈,均值為0,標準差為1。

# 使用scikit-learn函式
from sklearn import preprocessing
standar_scaler = preprocessing.StandardScaler()
feature_scaled = standar_scaler.fit_transform(feature)
# 使用numpy自定義函式
def min_max_norm(x):
    x = np.array(x)
    x_norm = (x-np.mean(x))/np.std(x)
    return x_norm

非線性歸一化

經常用在資料分化較大的場景,有些數值大,有些很小。通過一些數學函式,將原始值進行對映。該方法包括log、指數、反正切等。需要根據資料分佈的情況,決定非線性函式的曲線。

log函式:x = lg(x)/lg(max);反正切函式:x = atan(x)*2/pi

6.分類訓練集和測試集時,需要分層進行抽取

from sklearn.cross_validation import StratifiedShuffleSplit sss = StratifiedShuffleSplit(labels, train_size=0.5) for train_index, test_index in sss: features_train,features_test=features.iloc[train_index],features.iloc[test_index] labels_train,labels_test=labels[train_index],labels[test_index] features_test.index=range(len(features_test)) features_train.index=range(len(features_train)) labels_train.index=range(len(labels_train)) labels_test.index=range(len(labels_test)) features.index=range(len(features)) labels.index=range(len(labels))