1. nan 的處理
先講一個真事:
在 Kaggle 的一個競賽里面结借,是要求預(yù)測哪些大學(xué)的基金項目會得到批復(fù)而那些不會新娜。隨后一個參賽者通過其中某一列的 nan 與否特征的預(yù)測绑青,得到了金獎泼舱。事后證明躁绸,這個學(xué)校在填入資料的時候裕循,如果這項基金不會被批復(fù)臣嚣,那么他們就不會繼續(xù)填入更多信息。因此 nan 的填寫與否反而由于 data leakage 的原因成為了這個競賽里面最重要的特征剥哑。
但是呢硅则,nan 又沒有辦法直接喂給機器學(xué)習(xí)模型。因此我們可以針對所有的數(shù)據(jù)列株婴,做如下操作:
1. 選取所有的 數(shù)字列怎虫;
2. 如果該列的 nan 數(shù)目大于 1,則填充 fillna 為該列均值困介,或者任意制定數(shù)值大审;
3. 在整個 dataframe 后加入一列,記錄該列的 nan 的 True/False 情況座哩;
def fill_na(df, na_data={}):
????cols = df.select_dtypes(include='number')
????for col in cols: if df[col].isnull().sum() > 0:
????????df[col+'_na'] = df[col].isnull()
????????fillna = na_data[col] if col in na_data else df[col].median()
????????df[col].fillna(fillna, inplace=True)? ?
%time fill_na(df_cat)
2. sklearn 中 boostrapping 的優(yōu)化 —— 處理模型中數(shù)據(jù)太少的問題
其實之前已經(jīng)介紹到過 boostrapping徒扶,但是沒有詳細介紹。
左邊的橙色是數(shù)據(jù)庫根穷,我們在選取子集進行模型學(xué)習(xí)的時候姜骡,每次都可以選擇一個子集并重復(fù)采樣,這樣可以增加用于訓(xùn)練的數(shù)據(jù)屿良,這個就是 boostrapping圈澈。盡管看上去這樣的方式并不會增加數(shù)據(jù)的多樣性,但是神奇的是尘惧,反復(fù)的學(xué)習(xí)的確可以提高模型精度康栈,但是也會增加過擬合的風(fēng)險。
在 sklearn 里面喷橙,這個參數(shù)暫時是無法更改的啥么,但是我們可以用過修改內(nèi)置函數(shù)的方式來 hacking,增加訓(xùn)練數(shù)據(jù)的個數(shù)重慢。
from sklearn.ensemble import forest
def set_rf_samples(n):
""" Changes Scikit learn's random forests to give each tree a random sample of n random rows. """
forest._generate_sample_indices = (lambda rs, n_samples: forest.check_random_state(rs).randint(0, n_samples, n))
set_rf_samples(5000)
通過上述修改饥臂,我們可以將訓(xùn)練集的 boostraing 個數(shù)進行任意設(shè)置。
一起來動手試試吧似踱!