#python #scipy #normalization
Вопрос:
Я запускал Yeo Johnson Transform и следовал примеру, приведенному на веб-сайте Scipy. Scipy link Я также сравнил его с реализацией Sklearn. вот код: я
import seaborn as sns
from sklearn.preprocessing import PowerTransformer
from scipy import stats
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure( figsize=(10,10))
ax1 = fig.add_subplot(421)
x = stats.loggamma.rvs(5, size=500) 5
prob = stats.probplot(x, dist=stats.norm, plot=ax1)
ax1.set_xlabel('')
ax1.set_title('Probplot')
ax2 = fig.add_subplot(422)
sns.distplot(x, color="skyblue")
ax2.set_title('Distribution of Data')
ax3 = fig.add_subplot(423)
xt_scipy, lmbda = stats.yeojohnson(x)
prob = stats.probplot(xt_scipy, dist=stats.norm, plot=ax3)
ax3.set_xlabel('')
ax3.set_title('Probplot:Yeo-Johnson:Scipy')
ax4 = fig.add_subplot(424)
sns.distplot(xt_scipy, color="skyblue")
ax4.set_title('Distribution of Transformed Data')
ax5 = fig.add_subplot(425)
pt = PowerTransformer(method = 'yeo-johnson',standardize = True)
xt_sklearn = pt.fit_transform(x.reshape(-1,1))
prob = stats.probplot(xt_sklearn.flatten(), dist=stats.norm, plot=ax5)
ax5.set_xlabel('')
ax5.set_title('Probplot:Yeo-Johnson:Sklearn')
ax6 = fig.add_subplot(426)
sns.distplot(xt_sklearn, color="skyblue")
ax6.set_title('Distribution of Transformed Data')
plt.tight_layout(h_pad=0.9, w_pad=0.9)
plt.show()
Глядя на прилагаемый рисунок, видно , что оба метода, по-видимому, нормализуют данные, как и ожидалось, что видно из квантилей.
Но графики распределения преобразованных данных для обеих библиотек, хотя и имеют одинаковую форму , имеют разный диапазон значений.
Почему преобразованные значения отличаются друг от друга? какой из них соответствует истинной формуле Йо Джонсона?
sedy
Ответ №1:
Это была моя ошибка. Я не понимал, что Sklearn по умолчанию выполняет стандартную шкалу после преобразования мощности. Вот модификация кода, которая создает результаты сопоставления.
import seaborn as sns
import sklearn.preprocessing
from sklearn.preprocessing import PowerTransformer, StandardScaler
from scipy import stats
import matplotlib.pyplot as plt
import numpy as np
ss = StandardScaler()
fig = plt.figure( figsize=(10,10))
ax1 = fig.add_subplot(441)
x = stats.loggamma.rvs(5, size=500) 5
prob = stats.probplot(x, dist=stats.norm, plot=ax1)
ax1.set_xlabel('')
ax1.set_title('Probplot')
ax2 = fig.add_subplot(442)
sns.distplot(x, color="skyblue")
ax2.set_title('Distribution of Data')
ax5 = fig.add_subplot(445)
xt_scipy, lmbda = stats.yeojohnson(x)
prob = stats.probplot(xt_scipy, dist=stats.norm, plot=ax5)
ax5.set_xlabel('')
ax5.set_title('Probplot:Yeo-Johnson:Scipy')
ax6 = fig.add_subplot(446)
sns.distplot(xt_scipy, color="skyblue")
ax6.set_title('Distribution of Transformed Data')
ax7 = fig.add_subplot(447)
xt_scipy_ss, lmbda = stats.yeojohnson(x)
xt_scipy_ss = ss.fit_transform(xt_scipy_ss.reshape(-1, 1))
prob = stats.probplot(xt_scipy_ss.flatten(), dist=stats.norm, plot=ax7)
ax7.set_xlabel('')
ax7.set_title('Probplot:Yeo-Johnson Stand Scal:Scipy')
ax8 = fig.add_subplot(448)
sns.distplot(xt_scipy_ss, color="skyblue")
ax8.set_title('Distribution of Transformed Data')
ax9 = fig.add_subplot(449)
pt = PowerTransformer(method = 'yeo-johnson',standardize = False)
xt_sklearn = pt.fit_transform(x.reshape(-1,1))
prob = stats.probplot(xt_sklearn.flatten(), dist=stats.norm, plot=ax9)
ax9.set_xlabel('')
ax9.set_title('Probplot:Yeo-Johnson:Sklearn')
ax10 = fig.add_subplot(4,4,10)
sns.distplot(xt_sklearn, color="skyblue")
ax10.set_title('Distribution of Transformed Data')
ax11 = fig.add_subplot(4,4,11)
pt = PowerTransformer(method='yeo-johnson', standardize=True)
xt_sklearn_ss = pt.fit_transform(x.reshape(-1, 1))
prob = stats.probplot(xt_sklearn_ss.flatten(), dist=stats.norm, plot=ax11)
ax11.set_xlabel('')
ax11.set_title('Probplot:Yeo-Johnson:Sklearn with Stand Scal')
ax12 = fig.add_subplot(4, 4, 12)
sns.distplot(xt_sklearn_ss, color="skyblue")
ax12.set_title('Distribution of Transformed Data')
plt.tight_layout(h_pad=0.9, w_pad=0.9)
plt.show()