資料預處理的一般方法及python實現
這是一個大資料的時代。我們在很多時候都要處理各種各樣的資料。但是並非所有資料都是拿來即可使用,都是要先經過一番處理後才能進行下一步操作。在我們爬到資料或者要處理一份資料檔案時,首先要對資料進行清洗和除噪。本文就總結一下,一般資料預處理過程中可能要用到的方法。
1.查詢資料的缺失值
在拿到第一份原始資料的時候,首先要檢查資料的完整性。因為在建立模型進行迴歸分類分析的時候,通常需要一份完整的資料檔案。除非特定的例如XGBM的演算法,可以在有缺失值的基礎上得出運算結果。
以下,是對資料的缺失值的查詢,並計算出相應的比例。
def missing_values_table(df): # Total # of missing values mis_val = df.isnull().sum() # Proportion of missing values mis_val_percent = 100 * mis_val / len(df) # Create a table containing the results mis_val_table = pd.concat([mis_val, mis_val_percent], axis=1) # Set column names mis_val_table_ren_columns = mis_val_table.rename( columns = {0 : 'Number of Missing Values', 1 : 'Percentage of Total Values (%)'}) # Sort the table by percentage of missing values (descending order) mis_val_table_ren_columns = mis_val_table_ren_columns[ mis_val_table_ren_columns.iloc[:,1] != 0].sort_values( 'Percentage of Total Values (%)', ascending = False).round(3) # Print summary information print ("The dataframe has " + str(df.shape[1]) + " columns.\n" "There are " + str(mis_val_table_ren_columns.shape[0]) + " columns having missing values.") # Results output return mis_val_table_ren_columns mis_train = missing_values_table(pro_train) print(mis_train)
2. 缺失值的處理
對於確實值的處理,我們有兩種方式。第一是直接將缺失值所在的行或者列刪除,第二則是用其他資料的平均值,眾數,或者上下值來填充這個資料表格中的缺失值。
一:直接刪除有缺失值的
使用dropna()函式,可以刪除所有又缺失值的行
Train=train.dropna()
或者,可以在後面新增feature,選擇你要刪除哪些feature的缺失項。這是因為有些特徵對於結果的影響非常的重要,哪怕有很大的缺失率(達到60%-70%),也依然要將其保留,然後用其他值去填充進去。
pro_train.dropna(subset=['CNT_FAM_MEMBERS','AMT_ANNUITY','AMT_GOODS_PRICE', 'EXT_SOURCE_2','OBS_30_CNT_SOCIAL_CIRCLE', 'DEF_60_CNT_SOCIAL_CIRCLE','OBS_60_CNT_SOCIAL_CIRCLE', 'DEF_30_CNT_SOCIAL_CIRCLE','NAME_TYPE_SUITE'], inplace = True) mis_train = missing_values_table(pro_train)
二.使用平均值或者其他值來填充缺失項
用均值填:
data['volumn'] = data['volumn'].fillna(data['volumn'].mean()))
用前後值填:
data['volumn'] = data['volumn'].fillna(method='pad') data['volumn'] = data['volumn'].fillna(method='bfill')
3. 用一列資料來篩選另一列的資料
例如,要用一列滬交所的股票程式碼,把一串資料中(包括所有滬深兩市和可轉債)的資料中篩選出來。
index = df1[‘symbol’].isin(df2['code']) outfile = df1[index]
4. 聚合分類groupby的使用
做資料分析的時候,經常要把一類相同型別的資料整合起來做分析。以股市為例,我們可能會要整合tickdata,也可能以股票的程式碼為標的來進行整合。然後再對聚合後的資料來進行篩選(以聚合好的資料為參考物件,比如聚合好求均值,去除均值小於某一個數值的所有項)。
以下是我自己想出來用dataframe解決此類問題的一種方式,應該會有更簡單的解決方法,歡迎留言談論。
grouped2=train['volumepercent'].groupby(train['symbol']) symbolmean=grouped2.sum() select=pd.DataFrame(symbolmean) a=select[(select["volumepercent"]>y1) & (select["volumepercent"]<y2) ].index.tolist()
另一方面,可能會用到連續求兩次聚合的情況,例如第一次取平均,第二次取中位數。
以下也是我個人的解決方法,因為直接處理dataframe 的結構有點問題,所以我是處理好第一步以後,存了個新檔案再讀取做第二步的處理。
grsz=outfilesz.groupby([outfilesz['symbol'], outfilesz['start']]) sz=grsz.mean() sz.to_csv('dealsz.csv') new2=pd.read_csv('dealsz.csv') grrsz=new2.groupby(new2['start']) medsz=grrsz.median() medsz.to_csv('sz_medianvalue.csv')
5. 選取或者刪除某些特定的行
刪除帶有特定字元的行:
Outfile=ourfile[~ outfile[‘symbol’].str.contains(‘SS’)]
~是不包含的意思。
簡單篩選:
c=train.loc[train["Churn"] == "Yes"]
6. 和並列
Final=pd.contact([a,b,c,d],axis=1)
這是把列合併起來。
7. 將非數字資訊轉化為數字資訊
有許多影響因素是不是數字因素,是文字因素。比如調查網路使用狀況的時候,可能會有移動聯通電信之類的分別,要將其轉化為1,2,3等數字來觀察其相關性及一系列問題。
對於兩種feature和兩種以上feature有些許不同,一個採用標籤編碼,一個採用單熱編碼。
# Categorical features encoding # Label encoding for columns with 2 or fewer classes LE = LabelEncoder() for f in pro_train: if pro_train[f].dtype == 'object': if len(list(pro_train[f].unique())) <= 2: LE.fit(pro_train[f]) pro_train[f] = LE.transform(pro_train[f]) pro_test[f] = LE.transform(pro_test[f]) # One-hot encoding for the rest categorical features (classes >=3) pro_train = pd.get_dummies(pro_train) pro_test = pd.get_dummies(pro_test) print('Shape of training set : {}'.format(pro_train.shape)) print('Shape of testing set: {}' .format(pro_test.shape))
8. 計算不同feature之間的相關性
如果要做迴歸分類,要選取有相關性聯絡的feature來做模型,例如尼泊爾海嘯之類的因素要捨棄。但同時互相之間相關性較強的feature,在建立同一個模型的時候也要只留下一個即可。
correlations = app_train.corr()['MonthlyCharges'].sort_values()
可以將相關性做個排序。
也可以用隨機森林來篩選出相關性最高的feature,精確度很高,但若是資料量大的話,這速度會非常的慢。之後會總結一下隨機森林的相關知識和程式碼。
資料清洗是一個很麻煩的工作,本文只是一小部分處理情況,之後可能還會來做類似的整理。