我目前正在使用Scikit-Learn的LogisticRegression来构建模型。我用过
from sklearn import preprocessing
scaler=preprocessing.StandardScaler().fit(build)
build_scaled = scaler.transform(build)
在训练模型之前缩放所有输入变量。一切正常并产生一个不错的模型,但我的理解是LogisticRegression.coeff_产生的系数基于缩放变量。是否存在可用于调整它们以产生可应用于非缩放数据的系数的那些系数的转换?
我正在考虑在生产系统中实施模型,并尝试确定是否所有变量都需要在生产中以某种方式进行预处理,以便对模型进行评分。
注意:模型可能必须在生产环境中重新编码,并且环境不使用python。
答案 0 :(得分:4)
您必须除以应用的缩放比例来规范化要素,还要乘以应用于目标的缩放比例。
假设
每个特征变量x_i由scale_x_i缩放(除)
目标变量由scale_y
然后
orig_coef_i = coef_i_found_on_scaled_data / scale_x_i * scale_y
以下是使用pandas和sklearn LinearRegression
的示例from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
import numpy as np
import pandas as pd
boston = load_boston()
# Looking at the description of the data tells us the target variable name
# print boston.DESCR
data = pd.DataFrame(
data = np.c_[boston.data, boston.target],
columns = list(boston.feature_names) + ['MVAL'],
)
data.head()
X = boston.data
y = boston.target
lr = LinearRegression()
lr.fit(X,y)
orig_coefs = lr.coef_
coefs1 = pd.DataFrame(
data={
'feature': boston.feature_names,
'orig_coef' : orig_coefs,
}
)
coefs1
这向我们展示了没有应用缩放的线性回归的系数。
# | feature| orig_coef
# 0| CRIM | -0.107171
# 1| ZN | 0.046395
# 2| INDUS | 0.020860
# etc
我们现在规范化所有变量
# Now we normalise the data
scalerX = StandardScaler().fit(X)
scalery = StandardScaler().fit(y.reshape(-1,1)) # Have to reshape to avoid warnings
normed_X = scalerX.transform(X)
normed_y = scalery.transform(y.reshape(-1,1)) # Have to reshape to avoid warnings
normed_y = normed_y.ravel() # Turn y back into a vector again
# Check it's worked
# print np.mean(X, axis=0), np.mean(y, axis=0) # Should be 0s
# print np.std(X, axis=0), np.std(y, axis=0) # Should be 1s
我们可以对这个规范化数据再次进行回归...
# Now we redo our regression
lr = LinearRegression()
lr.fit(normed_X, normed_y)
coefs2 = pd.DataFrame(
data={
'feature' : boston.feature_names,
'orig_coef' : orig_coefs,
'norm_coef' : lr.coef_,
'scaleX' : scalerX.scale_,
'scaley' : scalery.scale_[0],
},
columns=['feature', 'orig_coef', 'norm_coef', 'scaleX', 'scaley']
)
coefs2
...并应用缩放以恢复原始系数
# We can recreate our original coefficients by dividing by the
# scale of the feature (scaleX) and multiplying by the scale
# of the target (scaleY)
coefs2['rescaled_coef'] = coefs2.norm_coef / coefs2.scaleX * coefs2.scaley
coefs2
当我们这样做时,我们看到我们已经重新创建了原始系数。
# | feature| orig_coef| norm_coef| scaleX| scaley| rescaled_coef
# 0| CRIM | -0.107171| -0.100175| 8.588284| 9.188012| -0.107171
# 1| ZN | 0.046395| 0.117651| 23.299396| 9.188012| 0.046395
# 2| INDUS | 0.020860| 0.015560| 6.853571| 9.188012| 0.020860
# 3| CHAS | 2.688561| 0.074249| 0.253743| 9.188012| 2.688561
对于某些机器学习方法,必须对目标变量y以及特征变量x进行归一化。如果你已经这样做了,你需要将这个“乘以y的比例”步骤以及“除以X_i的比例”来得到原始的回归系数。
希望有所帮助
答案 1 :(得分:2)
简短回答,获取LogisticRegression系数并截取未缩放数据(假设二进制分类,lr是训练有素的LogisticRegression对象):
你必须将你的系数数组元素除以(自v0.17)scaler.scale_数组:coefficients = np.true_divide(lr.coeff_, scaler.scale_)
您必须使用scaler.mean_数组从截距中减去结果系数(除法结果)数组的内积:intercept = lr.intercept_ - np.dot(coefficients, scaler.mean_)
如果您认为通过从中减去其均值(存储在scaler.mean_数组中)然后将其除以其标准偏差(存储在缩放器中),可以看出为什么需要执行上述操作。 .scale_ array)。
答案 2 :(得分:0)
您可以通过两个步骤使用pipeline:缩放和回归。它将原始数据作为输入并产生所需的回归。
或者,如果您明确要获取系数,则可以手动将LogisticRegression系数与scaler参数(scaler.mean_和scaler.std_)组合在一起。
为此,请注意standardcaler以这种方式规范化数据:v_norm =(v - M(v))/ sigma(v)。这里M(v)是原始变量v的平均值,sigma(v)是它的标准偏差,分别存储在scaler.mean_和scaler.std_数组中。
然后LogisticRegression采用这个规范化的变量并将它们乘以LogisticRegression.coef_并添加拦截_。