特徵工程入門與實踐_筆記_sklearn_python

目錄

 

一、特徵理解

1、定類數據

2、定序數據

3、定距數據

4、定比數據

二、清洗數據

1、識別缺失值

(1)刪除缺失值的行

(2)填充缺失值(醫學類數據禁用,因爲要求真實)

2、標準化、歸一化

三、特徵構建

1、定類特徵的填充

2、定量特徵的填充

3、定類特徵的編碼

4、定序特徵的編碼

5、連續值分箱

6、擴展數值特徵之多項式擬合

7、文本的特徵構建

四、特徵選擇(減少壞屬性) 

1、基於統計的特徵的選擇

(1)皮爾遜相關係數

(2)假設校驗

2、基於模型的特徵的選擇 SelectFromModel

五、特徵轉換

1、主成分分析 PCA

2、線性判別分析LDA


 

一、特徵理解

1、定類數據

只能按名稱分類,例如:血型的A、B、O、AB,不可以進行數學加減操作,可通過條形圖bar、餅圖pie分析

df['Grade'].value_counts().sort_values(ascending=False).head(20).plot(kind='bar')

df是python中的dataframe,類似於數據庫表的結構,之後都是基於python和pandas的語法不再複述 

2、定序數據

同樣是類別,但是可以自然排序。例如考試成績的ABCD,餐廳評分1-5,可通過條形圖、餅圖分析

df['Grade'].value_counts().plot(kind='pie')

3、定距數據

數值數據,不僅能排序,而且還能加減,例如氣溫,可以計算兩地區夏季平均溫度的差,可以通過直方圖hist、箱線圖box

df['Grade'].hist()
df['Grade'].value_counts().plot(kind='box')

4、定比數據

數值數據,不僅能排序、加減,還能乘除,例如100元錢是50元錢的2倍,舊金山各崗位工資中最高工資除以最低工資的13倍

可以通過直方圖hist、箱線圖box

 

二、清洗數據

先查看df.head()

再查看空準率(如果分類任務,那麼就是各類別佔比,模型要準確度高於這個纔行,否則盲猜主類準確率都是空準率)

(如果是迴歸任務,可以看下平均值,並可以計算下平均值對應的R方或平均誤差,作爲後續對比參考)

df['要預測的列名'].value_counts(normalize = True)

 

1、識別缺失值

df.isnull().sum(),查看缺失值

df.describe(),有些數據最小值是0,但是違背常識,比如BMI指數

df['列名'] = df['列名'].map(lambda x:x if x != 0 else None) # 0 替換爲 None

處理方法如下:

(1)刪除缺失值的行

df.dropna()

然後要再看下空準率和平均值,數據分佈不變是最好

(2)填充缺失值(醫學類數據禁用,因爲要求真實)

df['某列'].fillna( df['某列'].mean() , inplace=True)

或使用

training_mean = X_train.mean()
X_train = X_train.fillna( training_mean )
X_test  = X_test.fillna( training_mean )

如上更誠實表達了泛化能力,因爲從訓練集特徵中學習並應用到未知隱藏數據上 

2、標準化、歸一化

z分數標準化:StandardScaler

min-max標準化:MinMaxScaler

歸一化:Normalizer

 

三、特徵構建

1、定類特徵的填充

針對Nan的列,填充類別頻數最高的那個類別,

df['列名'].fillna( df['列名'].value_counts().index[0] , inplace = True)

2、定量特徵的填充

可參考上面的均值(mean)填充,或使用Imputer工具類

3、定類特徵的編碼

X = pd.get_dummies(X)
X = pd.get_dummies(X , columns = ['列名','列名2'])

4、定序特徵的編碼

ordering = {'IV':45,'IIIA':32,'IIB':25,'IA':12,'IIIB':35,'IB':15,'IIA':22,'I':16}
df['AJCC階段'] = df['AJCC階段'].replace(ordering)

5、連續值分箱

X['年齡'] = pd.cut( X['年齡'] , bins = 3) //標籤是區間段名:(67.4, 77.3]
df['年齡'] = pd.cut( df['年齡'] , bins = 10 , labels=False) //標籤是排序的數值

6、擴展數值特徵之多項式擬合

PolynomialFeatures 創建新特徵,是原始特徵的多項式組合

原特徵是a、b , 新特徵是  a、b、a平方、b平方、a*b、1

7、文本的特徵構建

(1)詞袋法 feature_extraction

(2)詞向量 CountVectorizer 

(3)詞頻逆文檔頻率 TF-IDF

 

四、特徵選擇(減少壞屬性) 

1、基於統計的特徵的選擇

(1)皮爾遜相關係數

df.corr() 特徵兩兩之間,會有一個[-1,1]的數值,0代表沒有線性相關,-1或1代表線性關係很強

df.corr()['目標列'] 查看特徵與目標值間的相關性,一般取係數的絕對值>0.2 或0.1的特徵

columns_names = df.cloumns[df.corr()['預測列'].abs() > 0.2]
columns_names = columns_names.drop('預測列')
X = X[columns_names]

(2)假設校驗

from sklearn.feature_selection import SelectKBest,f_classif

f_classif 可以用負數,但不是所有類都支持

chi2 卡方也很常用,只支持正數

假設“特徵與響應變量沒有關係”,p值越低,那麼這個特徵與響應變量關係越大,p介於0-1,常見閾值0.05

(p不是越小越好,不能互相比較)

2、基於模型的特徵的選擇 SelectFromModel

引入包裝器SelectFromModel 類似於 SelectKBest,也是用來選取重要特徵,但不用入參k(保留特徵數),入參是閾值

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LassoCV

clf = LassoCV()
sfm = SelectFromModel(clf, threshold=0.25)
sfm.fit(X, y)

上面的模型也可以換成決策樹,那麼就是使用的決策樹的內部指標tree.feature_importan ces_來評估重要性

下面代碼查看,最終選了哪些特徵

pd.DataFrame(X.columns.tolist())[sfm.get_support()]

 

 

五、特徵轉換

1、主成分分析 PCA

將多個相關特徵的數據集投影到相關特徵較少的座標系上,PCA利用協方差矩陣的特徵值分解實現

from sklearn.decomposition import PCA
pca = PCA(n_components=3)
pca.fit(X)

2、線性判別分析LDA

和PCA一樣,LDA目標也是提取一個新的座標系,區別是LDA不會專注於數據的方差,而是優化低維空間,獲得最佳類別可分性,有助於避免機器學習流水線的過擬合。

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda = LinearDiscriminantAnalysis(n_components=2)
X_r2 = lda.fit(X, y).transform(X)

sklearn api

流水線順序:標準化 > PCA > LDA,一般後兩個會一同使用

 

 

 

 

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