sklearn的快速使用之二(特徵工程)


from sklearn.datasets import load_iris
iris = load_iris()
features  = iris.data
target = iris.target
print (features)
print (target)


# 無量綱化
'''
把不同數值規格的數據轉換爲同一個規格, 比如0附近。
標準化( z-score standardization ) ( 用於列向量)
對於服從正態分佈或假定服從正態分佈的特徵轉換爲標準正態分佈
'''

from sklearn.preprocessing import StandardScaler
standard_feature = StandardScaler().fit_transform(features)
print (standard_feature)


'''
區間縮放
使用最大值和最小值進行區間縮放, 可以把數據縮放到[0,1]區間:
'''
from sklearn.preprocessing import MinMaxScaler
MaxMin_feature = MinMaxScaler().fit_transform(features)
print (MaxMin_feature)

'''
對於定量特徵二值化(用於列向量)
定性: 高和不高
定量: 180cm, 160cm
如果定量數據本質上只關心定性信息時, 可以通過設置閾值對定量信息二值化。 在這個過程中會損失掉我們不關心的定量信息只留下我們關心的定性信息。
'''
## 閾值姑且設置爲3  大於3的設置爲1  小於3的設置爲0
from sklearn.preprocessing import Binarizer
bin_feature = Binarizer(threshold=3).fit_transform(features)
print (bin_feature)

'''
對於定性特徵進行啞編碼。
對於定性文字標記的特徵, 並且特徵之間沒有大小關係,在建模之前需要對其進行啞編碼。
由於每一個定性標籤之間並沒有大小關係,所以不能直接轉化爲數字。 需要把每一個標籤
拆分成單獨的特徵,進行0,1 編碼。
如下例子:
一條特徵,四個樣本,4行數據 分別爲['A', 'B', 'C', 'D'], 通過啞編碼後可以展開爲4x4的矩陣。 
每一個類別展開爲單獨的特徵,代碼如下。 可通過sklearn裏面preprocess庫,OneHotEncoder配合LabelEncoder實現。
'''
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import LabelEncoder
import numpy as np
features = np.array(list('ABCD'))
le = LabelEncoder()
features_label = le.fit_transform(features)
print (features_label)
enc = OneHotEncoder()
one_hot = enc.fit_transform(features_label.reshape(4, 1)).toarray()
print(one_hot)


'''
缺失值處理(用於列向量)
數據預處理時候對於缺失值是比較常見的。 最簡單粗暴的方法莫過於
直接把帶有缺失值的樣本去掉。 但是某些情況下, 幾乎每條數據都
帶有缺失值, 這樣的話就需要對缺失值進行填充。
sklearn.preprocess.Inputer類中提供了簡單的缺失值填充方法。
'''
from numpy import vstack, array, nan
from sklearn.preprocessing import Imputer
features = Imputer(strategy='mean').fit_transform(vstack((array([nan, nan, nan, nan]), iris.data)))
print (features)


'''
數據變換
多項式變換(對行向量處理)
當特徵比較少的時候, 可以對很少的特徵進行多項式變化,
產生更多的特徵。 多項式變換,簡單來說就是把現有的特
徵排列組合相乘。 
如果是degree爲2的變換則是, 把現有的特徵中, 抽取
兩個相乘,並且獲得所有組合的結果。
'''

from sklearn.preprocessing import PolynomialFeatures
poly_feature = PolynomialFeatures(degree=2).fit_transform(features)
print (len(poly_feature[0]))


'''
自定義變換
使用自定義函數對於原始數據進行變換。 preprocessing種的FunctionTransformer可以實現:
'''

from numpy import log1p
from sklearn.preprocessing import FunctionTransformer
log1p_feature = FunctionTransformer(log1p).fit_transform(features)
print (log1p_feature)

'''
數據預處理sklearn.preprocessing 的方法總結。
類 功能 說明
StandardScaler 無量綱化 標準化,基於特徵矩陣的列,將特徵值轉換至服從標準正態分佈
MinMaxScaler 無量綱化 區間縮放,基於最大最小值,將特徵值轉換到[0, 1]區間上
Normalizer 歸一化 基於特徵矩陣的行,將樣本向量轉換爲“單位向量”
Binarizer 二值化 基於給定閾值,將定量特徵按閾值劃分
OneHotEncoder 啞編碼 將定性數據編碼爲定量數據
Imputer 缺失值計算 計算缺失值,缺失值可填充爲均值等
PolynomialFeatures 多項式數據轉換 多項式數據轉換
FunctionTransformer 自定義單元數據轉換 使用單變元的函數來轉換數據

'''


'''
特徵選擇
數據預處理完成以後,特徵比較多時,就需要對特徵進行選擇。 使有意義的特徵輸入模型進行訓練。 特徵選擇通常來說從兩個方面入手:
特徵是否發散:特徵如果不發散, 方差很小接近於0, 就意味着這個特徵在所有樣本中的分佈是沒有差異的, 說明這個特徵對於樣品區分沒有貢獻。
特徵與目標相關項: 對於分類問題, 特徵與分類目標相關性越大說明特徵對於分類問題作用也就越大。
特徵選擇的方法:
Filter: 過濾法, 通過給定的方差閾值對特徵進行分類, 只保留方差過閾值的特徵。
Wrapper: 包裝發, 根基後續模型的學習效果, 目標函數, 每次選取若干或者排除若干特徵。 來尋找最優特徵。
Embedded: 嵌入法, Filter與Wrapper 的結合。 先使用某些機器學習算法和模型訓練,得到各個特徵的權值洗漱,
根據係數大小選擇特徵。例如使用RandomForest.
在sklearn中可以使用feature_selection庫來進行特徵選擇。

VarianceThreshold: 刪除特徵值的方差達不到最低標準的特徵
SelectKBest: 返回k個最佳特徵
SelectPercentile: 返回表現最佳的前r%個特徵
'''

'''
Filter法
方差選擇法
方差選擇法需要計算各特徵的方差,然後根據給定的方差閾值選擇特徵。
'''
from sklearn.feature_selection import VarianceThreshold
selected_feature = VarianceThreshold(threshold=0.8).fit_transform(features)
print (selected_feature)

'''
卡方檢驗就是統計樣本的實際觀測值與理論推斷值之間的偏離程度,
實際觀測值與理論推斷值之間的偏離程度就決定卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趨於符合,若兩個值完全相等時,卡方值就爲0,表明理論值完全符合。
注意:卡方檢驗針對分類變量。
'''
from sklearn.feature_selection import chi2
from sklearn.feature_selection import SelectKBest

selected_feature = SelectKBest(chi2, k=3).fit_transform(features[0:130], target[0:130])
print (selected_feature)


'''
 Wrapper
遞歸特徵消除法
遞歸特徵消元法需要給定一個預測模型(基模型),
然後使用最初的特徵進行模型訓練得到每一個特徵的權值, 
然後丟棄權值最小的的特徵,重新訓練模型。
如此往復直到得到所需要的數量時停止。
sklearn.feature_selection中的RFE類實現。
代碼例子中,選取邏輯迴歸模型作爲基模型。

'''
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
selected_feature = RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(features[0:100], target[0:100])
print (selected_feature)

'''
Embedded
基於懲罰項的特徵選擇法
使用帶懲罰項的基模型, 除了篩選特徵,同時進行降維。 
使用feature_selection庫的SelectFromModel類結合L1懲罰項的邏輯迴歸模型實現:
'''
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
selected_feature = SelectFromModel(estimator=LogisticRegression(penalty="l1", C=0.1)).fit_transform(features[0:100], target[0:100])
print (selected_feature)


'''
基於樹模型的特徵選擇
通過樹模型的GBDT作爲基模型進行特徵選擇, 使用SelectFromModel結合GBDT模型實現:

'''

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
selected_feature = SelectFromModel(estimator=GradientBoostingClassifier()).fit_transform(features[0:100], target[0:100])
print (selected_feature)

'''
PCA算法中所要保留的主成分個數n,也即保留下來的特徵個數n
mle  自動判斷降維數
'''
from sklearn.decomposition import PCA
pca = PCA(n_components='mle')
selected_feeature = pca.fit_transform(features)
orig = pca.inverse_transform(selected_feeature)
print(pca.explained_variance_ratio_)
print (selected_feeature)

test = [[5.84333333,3.054,3.75866667,1.19866667]]
print (pca.transform(test))


from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
selected_feeature = LDA(n_components=n).fit_transform(features, target)
print(selected_feeature)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章