這是實(shí)現(xiàn)將數(shù)據(jù)正態(tài)分布化,然后整體One-Hot化的代碼
class skew_dummies(BaseEstimator, TransformerMixin):
def __init__(self,skew=0.5):
self.skew = skew # 設(shè)置偏度閾值
def fit(self,X,y=None):
return self
def transform(self,X):
# pandas select_dtypes方法挑選出目標(biāo)類型的列
# 這里挑出所有數(shù)值類型的數(shù)據(jù),select_dtypes返回的是一個(gè)DataFrame
X_numeric=X.select_dtypes(exclude=["object"])
# 使用apply方法在lambda運(yùn)算時(shí)傳入的x都是series,計(jì)算出每個(gè)特征下的偏度,返回的結(jié)果是一個(gè)Series
skewness = X_numeric.apply(lambda x: skew(x))
# abs(skewness) >= self.skew是根據(jù)Series支持boolean索引的原理.然后用index拿到skewness的索引(因?yàn)閟kewness是Series,索引實(shí)際上就是列標(biāo)簽)
skewness_features = skewness[abs(skewness) >= self.skew].index
# 進(jìn)行正態(tài)分布化
X[skewness_features] = np.log1p(X[skewness_features])
# 對整個(gè)X數(shù)據(jù)集進(jìn)行One Hot編碼
X = pd.get_dummies(X)
return X