特徵工程入門與實踐 筆記 sklearn

2021-09-29 16:39:56 字數 4095 閱讀 9331

目錄

一、特徵理解

1、定類資料

2、定序資料

3、定距資料

4、定比資料

二、清洗資料

1、識別缺失值

(1)刪除缺失值的行

(2)填充缺失值(醫學類資料禁用,因為要求真實)

2、標準化、歸一化

三、特徵構建

1、定類特徵的填充

2、定量特徵的填充

3、定類特徵的編碼

4、定序特徵的編碼

5、連續值分箱

6、擴充套件數值特徵之多項式擬合

7、文字的特徵構建

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

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

(1)皮爾遜相關係數

(2)假設校驗

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

五、特徵轉換

1、主成分分析 pca

2、線性判別分析lda

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

df['grade'].value_counts().sort_values(ascending=false).head(20).plot(kind='bar')
df是python中的dataframe,類似於資料庫表的結構,之後都是基於python和pandas的語法不再複述 

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

df['grade'].value_counts().plot(kind='pie')
數值資料,不僅能排序,而且還能加減,例如氣溫,可以計算兩地區夏季平均溫度的差,可以通過直方圖hist、箱線圖box

df['grade'].hist()

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

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

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

先檢視df.head()

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

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

df['要**的列名'].value_counts(normalize = true)
df.isnull().sum(),檢視缺失值

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

df['列名'] = df['列名'].map(lambda x:x if x != 0 else none) # 0 替換為 none
處理方法如下:

df.dropna()

然後要再看下空準率和平均值,資料分布不變是最好

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 )

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

z分數標準化:standardscaler

min-max標準化:minmaxscaler

歸一化:normalizer

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

df['列名'].fillna( df['列名'].value_counts().index[0] , inplace = true)
可參考上面的均值(mean)填充,或使用imputer工具類

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

df['ajcc階段'] = df['ajcc階段'].replace(ordering)

x['年齡'] = pd.cut( x['年齡'] , bins = 3) //標籤是區間段名:(67.4, 77.3]

df['年齡'] = pd.cut( df['年齡'] , bins = 10 , labels=false) //標籤是排序的數值

polynomialfeatures 建立新特徵,是原始特徵的多項式組合

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

(1)詞袋法 feature_extraction

(2)詞向量 countvectorizer 

(3)詞頻逆文件頻率 tf-idf

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]

from sklearn.feature_selection import selectkbest,f_classif
f_classif 可以用負數,但不是所有類都支援

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

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

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

引入包裝器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()]
將多個相關特徵的資料集投影到相關特徵較少的座標系上,pca利用協方差矩陣的特徵值分解實現

from sklearn.decomposition import pca

pca = pca(n_components=3)

pca.fit(x)

和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,一般後兩個會一同使用

特徵工程 特徵工程入門與實踐(一)

特徵工程 將資料轉換為能更好地表示潛在問題的特徵,從而提高機器學習效能。大體上,機器學習分為兩類 評估分類問題,可以採用交叉驗證法 from sklearn.linear model import logisticregression from sklearn.model selection imp...

讀書筆記 《特徵工程入門與實踐》

歸一化和標準化 本書認為資料可以分為四大等級,分為是 定類 定序 定距 定比,其中定類和定序都是定性的資料,定距和定比是定量的資料。定類是離散的 無序的,舉例 人名 油漆名稱 動物物種 猴子 馬 牛等 定序是有序類別 可以比較的,舉例 考試等級 great good not bad bad等或 0 ...

特徵工程入門與實踐 3 特徵增強

第3章 特徵增強 清洗資料 主要內容 識別資料中的缺失值 刪除有害資料 輸入 填充 缺失值 對資料進行歸一化 標準化 構建新特徵 手動或自動選擇 移除 特徵 使用數學矩陣計算將資料集轉換到不同的維度。3.1 識別資料中的缺失值 檢視資料集中是否有資料點是空的,用pandas dataframe內建的...