1. 程式人生 > >特徵工程預處理大全(更新)

特徵工程預處理大全(更新)

快速檢視整體資訊1. .info()是DataFrame才可用的API,快捷檢視多種資訊:總行數和列數、每列元素型別和non-NaN的個數,總記憶體。DataFrame.info(verbose=None, memory_usage=True, null_counts=True)
  • verbose:True or False,字面意思是冗長的,也就說如何DataFrame有很多列,是否顯示所有列的資訊,如果為否,那麼會省略一部分;
  • memory_usage:True or False,預設為True,是否檢視DataFrame的記憶體使用情況;
  • null_counts:True or False,預設為True,是否統計NaN值的個數。
2. .ndim, .shape, .size檢視維數,形狀,元素個數。3. .head(), .tail()預設分別檢視頭5行和後5行。4. .describe()快速檢視每一列的統計資訊,預設排除所有NaN元素。DataFrame.describe( include= [np.number])
  • include:'all'或者[np.number 或 np.object]。numberic只對元素屬性為數值的列做數值統計,object只對元素屬性為object的列做類字串統計。
5. .columns()檢視列名6. .isnull.sum(),.notnull.sum()檢視缺失值總數7. (df.shape[0]-df.count())/df.shape[0]
檢視每個特徵的缺失率 (df.shape[1]-df.T.count())/df.shape[1]檢視每個個體所缺失的特徵個數8. 使用missingno庫import missingno as msnomissingValueColumns = merged.columns[merged.isnull().any()].tolist()1.bar圖缺失值視覺化分析msno.bar(merged[missingValueColumns],figsize(20,8),color="#34495e",fontsize=12,labels=True)2.matrix密集圖檢視資料完整性msno.matrix(merged[missingValueColumns],width_ratios=(10,1),figsize=(20,8),color=(0,0, 0),fontsize=12,sparkline=True,labels=True)
3.heatmap圖檢視相關性 msno.heatmap(merged[missingValueColumns],figsize=(20,20))4.dendrogram樹狀圖檢視相關性msno.dendrogram(collisions)9. 使用pandas_profiling庫import pandas_profilingpandas_profiling.ProfileReport(df)處理缺失值1. .dropna()# parameter axis=1 deletes the columns2. .fillna()1.數字,method='ffill'(向前複製),method='ffill'(向後複製)2.df['height'].fillna(df.groupby('gender')['height'].transform('mean'), inplace=True)按照其他屬性的統計值進行填充3.df['weight'].fillna(df['weight'].median(), inplace=True)中位數(median),平均值(mean),眾數(mode),填充4.df['age'].interpolate(inplace=True)插值填充3. 預測值填充將缺失的資料當成label,沒缺失的作為訓練集,缺失的作為測試集,通過某種機器學習演算法進行預測,填補缺失值。4. 聚類填充資料分析1. EDA分析plot,plot,plot(重要的事說三遍)2. 異常檢測演算法(LOF,OCSVM,IFOREST,DBSCAN等)資料清洗1. 刪除重複(看情況而定)data.duplicated() 和 data.drop_duplicates(),前者標記出哪些是重複的(true),後者直接將重複刪除;也可以根據單變數剔除重複,data.drop_duplicates(['Area'])2. 替換異常值例如用 describe() 進行一個描述分析:檢視他們最大值,最小值等來分析是否存在明顯的異常;通過data[條件] 將這些異常的資料篩選出來進行分析,將異常值進行替換:1.data['Age'].replace([158, 6], np.nan)2.data['Package'].replace(-9, 0)3. 資料對映以Areas為例,Areas取四個地區:A/B/C/D,這四個地區在分析的時候並沒有什麼意義,但A/B/C為城市,D為農村,這個很有意義,所以我要根據areas建立新變數CType:U-城市、R-農村。areas_to_ctype={'A':'U', 'B':'U', 'C':'U', 'D':'R', }data['CType']=data['Areas'].map(areas_to_ctype)4. 數字變數型別化以年齡為例:cutPoint=[0,30, 40, 50,80]groupLabel=[0,1,2,3]data['ageGroup'] =pd.cut(data['Age'],cutPoint, labels=groupLabel)按分位數劃分:qcut(data, n)data['ageGroup'] =pd.qcut(data['Age'],2)5. 建立啞變數get.dummies( data[‘SHabit’] ) data =pd.merge(data, pd.get_dummies(data['SHabit'], prefix='SHabit'),right_index=True, left_index=True)具體編碼形式還有:1. LabelEncoder()from sklearn.preprocessing import OneHotEncoder, LabelEncoderle = LabelEncoder()data_df['street_address'] = le.fit_transform(data_df['street_address'])2. OneHotEncoder()ohe = OneHotEncoder(n_values='auto', categorical_features='all', dtype=np.float64, sparse=True, handle_unknown='error')one_hot_matrix = ohe.fit_transform(data_df['street_address'])3. MeanEncoder()4. corgi庫(CountEncoder,MeanEncoder,OneHotEncoders)。。。6. 文字處理1.去除空白如:dat['Area'] = ['A ', 'C', ' A', 'D', ' B','D ', ' D', 'B ', 'C', ' A']strip()這個函式可以解決單個字串的問題,但Series是不可以直接用strip()的;data['Areas'].map(str.strip)2. 分列data['ID'] = ['1:0', '2:0', '3:1', '4:0', '5:0', '6:0'](分號前面的是ID,分號後面的代表性別,0為男性,1為女性。) 如果是單個字串,split()可以直接使用,但對於Pandas的資料結構,則要寫迴圈:IDGender = pd.DataFrame((x.split(':') for x in data.ID), columns=['ID_new','Gender'])pd.merge(IDGender, data_noDup_rep_dum, right_index=True,left_index=True)如若之前做了資料清洗,需要換成原資料的索引只需在上面句程式機加上index=data_noDup_rep_dum.index3.把多選題的文字建立成啞變數data['SHabit'] = ['1,2', '1,3', '2,3', '2', '2,3', '1,4', '1,2']想要的就是四個選項變成的四個問題:1 2 3 4,當一個人多選了1和2,那麼就在問題1下面和問題2下面賦值為1,其他賦值為0。get_dummies並不能滿足需求,str.contains() 可以在SHabit列中查詢某個元素,當含有這個元素時,賦值為True,否則為False:data['SHabit_1'] = data['SHabit'].str.contains('1') 用同樣的方法生成SHabit_2、SHabit_3、SHabit_4。。。。