Если StandardScaler и MinMaxScaler не дают желаемого эффекта, тогда еще одна вещь, которую нужно проверить, - это искаженные данные:
# Check the skew of all numerical features
numeric_feats = all_data.dtypes[all_data.dtypes != "object"].index
skewed_feats = all_data[numeric_feats].apply(lambda x: skew(x.dropna())).sort_values(ascending=False)
print("\nSkew in numerical features: \n")
skewness = pd.DataFrame({'Skew' :skewed_feats})
skewness.head(10)
Чем меньше, тем лучше. Если вы получили высокие баллы, вы можете использовать преобразование (log, boxcox, et c), чтобы сделать распределение данных более нормальным по форме.
коррекция перекоса:
skewness = skewness[abs(skewness) > 0.75]
print("There are {} skewed numerical features to Box Cox transform".format(skewness.shape[0]))
from scipy.special import boxcox1p
skewed_features = skewness.index
lam_f = 0.15
for feat in skewed_features:
#all_data[feat] += 1
all_data[feat] = boxcox1p(all_data[feat], lam_f)
Что еще можно попробовать:
либо удалите листовки, либо попробуйте RobustScaler () PowerTransformer ()
Ссылка: https://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html