目錄
一、特徵理解
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)
流水線順序:標準化 > PCA > LDA,一般後兩個會一同使用