python數據特征預處理


一、屬性規約

在進行數據預處理的過程中,如果數據的某一列都是一樣的或者屬性是一樣的,那么這一列對我們的預測沒有幫助,應該將這一列去掉,pandas中如果某一列屬性值相同,但是此列中有缺失值(NaN),pandas會默認其有兩個屬性,我們在進行此操作的過程中應該首先去掉缺失值,然后檢查唯一性。代碼如下;

orig_columns = loans_2007.columns
drop_columns = []
for col in orig_columns:
    col_series = loans_2007[col].dropna().unique()
    if len(col_series) == 1:
        drop_columns.append(col)
loans_2007 = loans_2007.drop(drop_columns, axis=1)

二、缺失值

用下面的代碼進行缺失值查看數據中每一列的缺失值情況,對於缺失值比較多的列,可以直接刪除,對於缺失值比較少的列可以刪除其樣本,或者填充其他值代替。

null_counts = loans.isnull().sum()

缺失值處理方法:

參考:https://www.zhihu.com/question/26639110

beh_tgt_mergeA.dropna(how='all')  #dropna默認丟棄任何含有缺失值的行,傳入how='all'則之丟棄全為NaN的行或列
beh_tgt_mergeA.dropna(how='all',axis=1)  #丟棄列
beh_tgt_mergeA.dropna(thresh=3)  #另一個參數是thresh,該參數的類型為整數,thresh=3,會在一行中至少有 3 個非 NA 值時將其保留。
beh_tgt_mergeA.dropna(axis=1,thresh=3)  #保留至少存在3個非NaN的列

    df.dropna(subset=['C'])     # 只有當NaN出現在特定列(這里:“C”)時,才會刪除行。  

檢測數據集中是否有缺失值

# 第一種
np.isnan(appdata).any()

# 第二種
app_train.isnull().sum()

# 第三種
cols = avg_buro.columns
for col in cols:
    if avg_buro[col].isnull().sum() != 0:
        print(col)
print('No Missing')
  1. np.random.seed(1234)
  2. d1 = pd.Series(2*np.random.normal(size = 100)+3)
  3. d2 = np.random.f(2,4,size = 100)
  4. d3 = np.random.randint(1,100,size = 100)
  5. d1.count() #非空元素計算
  6. d1.min() #最小值
  7. d1.max() #最大值
  8. d1.idxmin() #最小值的位置,類似於R中的which.min函數
  9. d1.idxmax() #最大值的位置,類似於R中的which.max函數
  10. d1.quantile(0.1) #10%分位數
  11. d1.sum() #求和
  12. d1.mean() #均值
  13. d1.median() #中位數
  14. d1.mode() #眾數
  15. d1.var() #方差
  16. d1.std() #標准差
  17. d1.mad() #平均絕對偏差
  18. d1.skew() #偏度
  19. d1.kurt() #峰度
  20. d1.describe() #一次性輸出多個描述性統計指標

缺失值填充的幾種方法:

# 均值填充
selectdata1['beta'] = selectdata1['beta'].fillna(selectdata1['beta'].mean())
# 眾數填充
selectdata1['beta'] = selectdata1['beta'].fillna(selectdata1['beta'].mode())
# 前一個數填充
selectdata1['beta'] = selectdata1['beta'].fillna(method='pad') 
#后一個數填充
selectdata1['beta']=selectdata1['beta'].fillna(method='bfill')
#插值填充
selectdata1['beta']=selectdata1['beta'].interpolate()

對於一批數據來說,如果缺失值在40%~60%之間的話,可以將是否缺失作為一個特征;如果缺失超過70%,其實可以將這個特征刪除,缺失值在20%~30%的,對於數值型數據,可以將填充眾數,對於類別型數據,可以填充最多的類別。

data['EMI_Loan_Submitted_Missing'] = data['EMI_Loan_Submitted'].apply(lambda x: 1 if pd.isnull(x) else 0)

  

三、字符轉化

print(loans.dtypes.value_counts())
object_columns_df = loans.select_dtypes(include=["object"]) #選擇字符型的屬性

用上面的代碼看每一列的屬性,sklearn不能處理字符型的,只能接受數值型的。對於字符型的可以進行如下處理:

mapping_dict = {
    "emp_length": {
        "10+ years": 10,
        "9 years": 9,
        "8 years": 8,
        "7 years": 7,
        "6 years": 6,
        "5 years": 5,
        "4 years": 4,
        "3 years": 3,
        "2 years": 2,
        "1 year": 1,
        "< 1 year": 0,
        "n/a": 0
    }
}
loans = loans.replace(mapping_dict)
loans = loans.drop(["last_credit_pull_d", "earliest_cr_line", "addr_state", "title"], axis=1)
loans["int_rate"] = loans["int_rate"].str.rstrip("%").astype("float")

 對於能枚舉的可以做一個字典,然后對數據做一個replace,對於有“%”的列,可以直接去掉百分號就好了。

 四、樣本不均衡問題

1、數據增強

2、加權重項

(1)(lr = LogisticRegression(class_weight="balanced"))

(2)自己設置,傳到class_weight中如下:

penalty = {
    0: 5,
    1: 1
}
lr = LogisticRegression(class_weight=penalty)

3、多個模型融合

 五、刪除指定行

filtered1_beh_tgt_mergeA[(filtered1_beh_tgt_mergeA['var1639'].isin([121505.0,121504.0]))]
test = list(filtered1_beh_tgt_mergeA.var1639)
test.remove(121505.0)
test.remove(121504.0)
filtered1_beh_tgt_mergeA = filtered1_beh_tgt_mergeA[filtered1_beh_tgt_mergeA.var1639.isin(test)]

  


免責聲明!

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



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