这是实现将数据正态分布化,然后整体One-Hot化的代码
class skew_dummies(BaseEstimator, TransformerMixin):
def __init__(self,skew=0.5):
self.skew = skew # 设置偏度阈值
def fit(self,X,y=None):
return self
def transform(self,X):
# pandas select_dtypes方法挑选出目标类型的列
# 这里挑出所有数值类型的数据,select_dtypes返回的是一个DataFrame
X_numeric=X.select_dtypes(exclude=["object"])
# 使用apply方法在lambda运算时传入的x都是series,计算出每个特征下的偏度,返回的结果是一个Series
skewness = X_numeric.apply(lambda x: skew(x))
# abs(skewness) >= self.skew是根据Series支持boolean索引的原理.然后用index拿到skewness的索引(因为skewness是Series,索引实际上就是列标签)
skewness_features = skewness[abs(skewness) >= self.skew].index
# 进行正态分布化
X[skewness_features] = np.log1p(X[skewness_features])
# 对整个X数据集进行One Hot编码
X = pd.get_dummies(X)
return X