python進行機器學習(一)之數據預處理


一、加載數據
  houseprice=pd.read_csv('../input/train.csv') #加載后放入dataframe里
  all_data=pd.read_csv('a.csv', header=0,parse_dates=['time'],usecols=['time','LotArea','price']) #可以選擇加載哪幾列

 
houseprice.head() #顯示前5行數據

houseprice.info() #查看各字段的信息
      houseprice.shape     #查看數據集行列分布,幾行幾列

  houseprice.describe() #查看數據的大體情況
 

二、分析缺失數據
  
houseprice.isnull() #元素級別的判斷,把對應的所有元素的位置都列出來,元素為空或者NA就顯示True,否則就是False


   houseprice.isnull().any()             #列級別的判斷,只要該列有為空或者NA的元素,就為True,否則False

   missing=houseprice.columns[houseprice.isnull().any()].tolist()     #將為空或者NA的列找出來

  houseprice[missing].isnull().sum()                #將列中為空或者NA的個數統計出來

  
  # 將某一列中缺失元素的值,用value值進行填充。處理缺失數據時,比如該列都是字符串,不是數值,可以將出現次數最多的字符串填充缺失值。   def cat_imputation(column, value):   houseprice.loc[houseprice[column].isnull(),column] = value

  houseprice[['LotFrontage','Alley']][houseprice['Alley'].isnull()==True] #從LotFrontage 和Alley 列中進行選擇行,選擇Alley中數據為空的行。主要用來看兩個列的關聯程度,是不是大多同時為空。
  
  houseprice['Fireplaces'][houseprice['FireplaceQu'].isnull()==True].describe() #對篩選出來的數據做一個描述,比如一共多少行,均值、方差、最小值、最大值等等。
  

三、統計分析
 
 houseprice['MSSubClass'].value_counts() #統計某一列中各個元素值出現的次數

print("Skewness: %f" % houseprice['MSSubClass'].skew()) #列出數據的偏斜度

  print("Kurtosis: %f" % houseprice['MSSubClass'].kurt())  
#列出數據的峰度

  houseprice['LotFrontage'].corr(houseprice['LotArea']) #計算兩個列的相關度
  
  houseprice['SqrtLotArea']=np.sqrt(houseprice['LotArea']) #將列的數值求根,並賦予一個新列

  houseprice[['MSSubClass', 'LotFrontage']].groupby(['MSSubClass'], as_index=False).mean() #跟MSSubClass進行分組,並求分組后的平均值


 
        
四、數據處理 

1)刪除相關

  del houseprice['SqrtLotArea'] #刪除列

    houseprice['LotFrontage'].dropna()   #去掉為空值或者NA的元素

  houseprice.drop(['Alley'],axis=1) #去掉Alley列,不管空值與否

  df.drop(df.columns[[0,1]],axis=1,inplace=True) #刪除第1,2列,inplace=True表示直接就在內存中替換了,不用二次賦值生效。


 houseprice.dropna(axis=0) #刪除帶有空值的行

       houseprice.dropna(axis=1)        #刪除帶有空值的列

2)缺失值填充處理

  houseprice['LotFrontage']=houseprice['LotFrontage'].fillna(0)   #將該列中的空值或者NA填充為0
  all_data.product_type[all_data.product_type.isnull()]=all_data.product_type.dropna().mode().values #如果該列是字符串的,就將該列中出現次數最多的字符串賦予空值,mode()函數就是取出現次數最多的元素
  houseprice['LotFrontage'].fillna(method='pad')   #使用前一個數值替代空值或者NA,就是NA前面最近的非空數值替換
  houseprice['LotFrontage'].fillna(method='bfill',limit=1) #使用后一個數值替代空值或者NA,limit=1就是限制如果幾個連續的空值,只能最近的一個空值可以被填充。
  houseprice['LotFrontage'].fillna(houseprice['LotFrontage'].mean())   #使用平均值進行填充
  houseprice['LotFrontage'].interpolate()     # 使用插值來估計NaN 如果index是數字,可以設置參數method='value' ,如果是時間,可以設置method='time'
  houseprice= houseprice.fillna(houseprice.mean()) #將缺失值全部用該列的平均值代替,這個時候一般已經提前將字符串特征轉換成了數值。

注:在kaggle中有人這樣處理缺失數據,如果數據的缺失達到15%,且並沒有發現該變量有多大作用,就刪除該變量!

 3)字符串替換
  houseprice['MSZoning']=houseprice['MSZoning'].map({'RL':1,'RM':2,'RR':3,}).astype(int) #將MSZoning中的字符串變成對應的數字表示
 
4)數據連接
  merge_data=pd.concat([new_train,df_test]) #講訓練數據與測試數據連接起來,以便一起進行數據清洗
      all_data = pd.concat((train.loc[:,'MSSubClass':'SaleCondition'], test.loc[:,'MSSubClass':'SaleCondition'])) #另一種合並方式,按列名字進行合並。
  
  res = pd.merge(df1, df2,on=['time']) #將df1,df2按照time字段進行合並,兩個df中都含有time字段

5)數據保存
  
merge_data.to_csv('merge_data.csv',index=False) #index=False,寫入的時候不寫入列的索引序號

6)數據轉換
  
houseprice["Alley"] = np.log1p(houseprice["Alley"]) #采用log(1+x)方式對原數據進行處理,改變原數據的偏斜度,使數據更加符合正態曲線分布。
  
    numeric_feats =houseprice.dtypes[houseprice.dtypes != "object"].index #把內容為數值的特征列找出來

   #下面幾行代碼將偏斜度大於0.75的數值列做一個log轉換,使之盡量符合正態分布,因為很多模型的假設數據是服從正態分布的
  skewed_feats = train[numeric_feats].apply(lambda x: skew(x.dropna())) #compute skewness   skewed_feats = skewed_feats[skewed_feats > 0.75]   skewed_feats = skewed_feats.index   all_data[skewed_feats] = np.log1p(all_data[skewed_feats])
  
   houseprice= pd.get_dummies(houseprice) #另外一種形式數據轉換,將字符串特征列中的內容分別提出來作為新的特征出現,這樣就省去了將字符串內容轉化為數值特征內容的步驟了。

 
6)數據標准化
 
我們都知道大多數的梯度方法(幾乎所有的機器學習算法都基於此)對於數據的縮放很敏感。因此,在運行算法之前,我們應該進行標准化,或所謂的規格化。標准化包括替換所有特征的名義值,讓它們每一個的值在0和1之間。而對於規格化,它包括數據的預處理,使得每個特征的值有0和1的離差。Scikit-Learn庫已經為其提供了相應的函數。

from sklearn import preprocessing

# normalize the data attributes

normalized_X = preprocessing.normalize(X)

# standardize the data attributes

standardized_X = preprocessing.scale(X)

 
 
        
 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM