Python 使用多列规范化单行?

Python 使用多列规范化单行?,python,pandas,machine-learning,statistics,Python,Pandas,Machine Learning,Statistics,我正在为分类编写一个分类算法,并通过MinMaxScaler运行所有连续变量,使它们的值在0-1之间。在培训和测试期间,我能够利用数据成功地做到这一点 我面临的问题是我何时预测。我加载的不是一个完整的数据帧,而是一行我想要预测的特性。在分类标准化或因式分解之前用于训练的特征示例如下: lst = [50000,1, 1, 1,37,0,0,0,0,0,0,64400,57069,57608,19394, 19619,20024,2500,1815,657,1000,1000,800

我正在为分类编写一个分类算法,并通过MinMaxScaler运行所有连续变量,使它们的值在0-1之间。在培训和测试期间,我能够利用数据成功地做到这一点

我面临的问题是我何时预测。我加载的不是一个完整的数据帧,而是一行我想要预测的特性。在分类标准化或因式分解之前用于训练的特征示例如下:

lst = [50000,1, 1, 1,37,0,0,0,0,0,0,64400,57069,57608,19394,
       19619,20024,2500,1815,657,1000,1000,800]
然后我将其转换为一个系列,然后转换为一个数据帧,并使用以下代码转置:

 ud_df = pd.Series(lst)
 ud_df = ud_df.to_frame()
 ud_df = ud_df.T
 ud_df.columns= ['LIMIT_BAL', 'SEX', 'EDUCATION', 'MARRIAGE', 'AGE', 
'PAY_0', 'PAY_2', 'PAY_3', 'PAY_4', 'PAY_5', 'PAY_6', 'BILL_AMT1', 
'BILL_AMT2', 'BILL_AMT3',
'BILL_AMT4', 'BILL_AMT5', 'BILL_AMT6', 'PAY_AMT1', 'PAY_AMT2', 'PAY_AMT3', 
'PAY_AMT4', 'PAY_AMT5', 'PAY_AMT6']
然后,我将分类数据类型和数字数据类型分开。为了这个例子,让我们假设数据帧ud_df包含所有连续值

我希望运行与在培训和测试集上相同的MinMaxScaler规范化:

scaler = preprocessing.MinMaxScaler().fit(ud_df)
var1 = scaler.transform(ud_df)
var1
运行此操作时,我会将所有0作为输出:

array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
    0., 0., 0.]])
有没有其他方法可以像我的训练和测试集那样将整行标准化为0到1的范围?从概念上讲,如果我没记错的话,规范化所涉及的数学取决于我有30k行的整个列的最大值,因此可以找到特定列的最大值


任何帮助都会很好

代码的问题在于,您正在为新的dataframe使用一个新的MinMaxScaler实例,但是您需要使用已应用于培训数据集的同一个scaler实例。其他任何事情都没有意义,因为您基于已在训练数据集中使用的缩放来训练模型。如果你使用另一个定标器,那么经过训练的模型不适用于你的新数据,如果新的数据在与你的训练数据相同的范围内,那么就不要考虑定标器对数据集没有作用的情况。 上面使用的scaler只有一条记录。这是行不通的。更具体地说,scaler还可能抛出一个错误,它不会抛出该错误,但返回0。如果传入一个值,则该值同时是最小值和最大值,因此值min/max-min实际上是0/0,因为值==max==min->不起作用。如果有两个值,则较小的值将缩放为0,较大的值将缩放为1, 较小\u值-较小\u值/较大\u值-较小\u值->0和 较大值-较小值/较大值-较小值->1。只有当有三个不同的值时,才能得到一个介于0,1之间的值

from sklearn import preprocessing
import pandas

train_set = pandas.DataFrame({'c':[1, 2, 3], 'b':[3, 2, 3]})

s = preprocessing.MinMaxScaler().fit(train_set)
s.transform(train_set)

manual_input = pandas.DataFrame({'c':[2], 'b':[2]})

# wrong
s2 = preprocessing.MinMaxScaler().fit(manual_input)
print(s2.transform(manual_input))

# right
print(s.transform(manual_input))
输出:

[[0. 0.]] # wrong scaler instance
[[0.  0.5]] # right scaler instance

手动_输入中的值在0和1以上的范围内进行缩放,您如何处理这些值取决于您的逻辑。可能您希望将所有值设置为0到0以下,1到1以上,否则您的模型可能会出现无法预料的情况。从长远来看,您应该将这些值包括在您的模型训练中,或者如果永远不会考虑这些值,则应将其作为异常值进行过滤。

您不是在对测试数据进行预测吗?您无法对一行进行标准化,因为您试图对所有列中的一行进行标准化,这是错误的。在拆分为测试集和训练集之前,我已对整个数据进行了标准化。我创建了一个定义,用户可以在其中为用于测试和培训的列输入特定值。然后我想对用户输入数据的概率进行预测。唯一的问题是,用户输入的数据与用于训练和测试的数据不在0-1范围内。我觉得如果功能完全不同,这将导致我的模型性能非常差。如果有帮助的话,我将使用XGBoost作为分类器。这是一个问题。您使用测试集的目的是什么?用户输入不足以使您使用最小-最大缩放。另一种方法是,从训练测试中计算每列的最小-最大值,使用这些值,编写一个简单的归一化函数。我使用我的测试集来评估模型的性能,使用我的模型从未见过或训练过的数据。此外,每一列的边界都大不相同,所以我认为这些连续特性需要标准化。您能否进一步解释公式和/或如何执行注释的最后一行?您需要使用最小-最大定标器的相同实例,或者至少使用与您已应用于培训和测试集的定标器相同的初始定标器,以便正确缩放手动创建的记录。我想我理解这一点。在更改代码以反映您所解释的操作时,我遇到了此错误:“操作数无法与形状1,19 21,1,19一起广播”是另一种转到开头以查找每列的最大值和最小值的方法,然后,使用相应列的最大值和最小值对具有连续变量的行执行您提供的计算?问题已解决。我亲自进去,从CSV读取数据后立即将其标准化,并应用simi
预测数据的lar公式。如果未在数据帧的列上指定其他值,则进行缩放。如果不限制列,则所有具有数值的列将按其各自的列进行缩放。